Spaces:
Build error
Build error
from __future__ import annotations | |
import asyncio | |
from colorama import Fore | |
from typing import TYPE_CHECKING, List | |
from . import decision_maker_registry | |
from .base import BaseDecisionMaker | |
from agentverse.logging import typewriter_log, logger | |
if TYPE_CHECKING: | |
from agentverse.agents import BaseAgent, SolverAgent, CriticAgent | |
from agentverse.message import Message, CriticMessage, SolverMessage | |
class ConcurrentDecisionMaker(BaseDecisionMaker): | |
""" | |
Discuss in a concurrent manner. | |
""" | |
name: str = "concurrent" | |
max_inner_turns: int = 3 | |
async def astep( | |
self, | |
agents: List[BaseAgent], | |
task_description: str, | |
previous_plan: str = "No solution yet.", | |
advice: str = "No advice yet.", | |
*args, | |
**kwargs, | |
) -> List[SolverMessage]: | |
# Here we assume that the first agent is the solver. | |
# The rest of the agents are the reviewers. | |
last_reviews = [] | |
for i in range(self.max_inner_turns): | |
reviews: List[CriticMessage] = await asyncio.gather( | |
*[ | |
agent.astep(previous_plan, advice, task_description) | |
for agent in agents[1:] | |
] | |
) | |
logger.info("", "Reviews:", Fore.YELLOW) | |
logger.info( | |
"", | |
"\n".join( | |
[f"[{review.sender}]: {review.content}" for review in reviews] | |
), | |
Fore.YELLOW, | |
) | |
nonempty_reviews = [] | |
for review in reviews: | |
if not review.is_agree and review.content != "": | |
nonempty_reviews.append(review) | |
self.broadcast_messages(agents[1:], nonempty_reviews) | |
if len(nonempty_reviews) == 0: | |
break | |
last_reviews = nonempty_reviews | |
agents[0].add_message_to_memory(last_reviews) | |
result = agents[0].step(previous_plan, advice, task_description) | |
# agents[0].add_message_to_memory([result]) | |
self.broadcast_messages(agents, [result]) | |
return [result] | |
def broadcast_messages(self, agents, messages) -> None: | |
for agent in agents: | |
agent.add_message_to_memory(messages) | |
def p2p_messages(self, agents, messages) -> None: | |
agents[0].add_message_to_memory(messages) | |
for message in messages: | |
for agent in agents[1:]: | |
if agent.name == message.sender: | |
agent.add_message_to_memory(messages) | |
break | |
def reset(self): | |
pass | |