Spaces:
Build error
Build error
from __future__ import annotations | |
from typing import TYPE_CHECKING, Any, Dict, List, Tuple, Union, Optional | |
from agentverse.agents.base import BaseAgent | |
from agentverse.utils import AGENT_TYPES | |
from agentverse.environments.tasksolving_env.rules.decision_maker import ( | |
BaseDecisionMaker, | |
decision_maker_registry, | |
) | |
from agentverse.environments.tasksolving_env.rules.evaluator import ( | |
BaseEvaluator, | |
evaluator_registry, | |
) | |
from agentverse.environments.tasksolving_env.rules.executor import ( | |
BaseExecutor, | |
executor_registry, | |
) | |
from agentverse.environments.tasksolving_env.rules.role_assigner import ( | |
BaseRoleAssigner, | |
role_assigner_registry, | |
) | |
from agentverse.environments import BaseRule | |
if TYPE_CHECKING: | |
from agentverse.message import SolverMessage, ExecutorMessage | |
class TasksolvingRule(BaseRule): | |
role_assigner: BaseRoleAssigner | |
decision_maker: BaseDecisionMaker | |
executor: BaseExecutor | |
evaluator: BaseEvaluator | |
role_assign_only_once: bool = False | |
add_execution_result_to_critic: bool = False | |
add_execution_result_to_solver: bool = False | |
def __init__( | |
self, | |
role_assigner_config, | |
decision_maker_config, | |
executor_config, | |
evaluator_config, | |
*args, | |
**kwargs, | |
): | |
def build_components(config: Dict, registry): | |
component_type = config.pop("type") | |
component = registry.build(component_type, **config) | |
return component | |
role_assigner = build_components( | |
role_assigner_config, | |
role_assigner_registry, | |
) | |
decision_maker = build_components( | |
decision_maker_config, | |
decision_maker_registry, | |
) | |
executor = build_components(executor_config, executor_registry) | |
evaluator = build_components(evaluator_config, evaluator_registry) | |
super().__init__( | |
role_assigner=role_assigner, | |
decision_maker=decision_maker, | |
executor=executor, | |
evaluator=evaluator, | |
*args, | |
**kwargs, | |
) | |
def role_assign( | |
self, | |
task_description: str, | |
agents: List[BaseAgent], | |
cnt_turn: int, | |
advice: str = "", | |
) -> List[BaseAgent]: | |
"""Assign roles to agents""" | |
if self.role_assign_only_once and cnt_turn > 0: | |
agents = [agents[AGENT_TYPES.SOLVER]] + agents[AGENT_TYPES.CRITIC] | |
else: | |
agents = self.role_assigner.step( | |
role_assigner=agents[AGENT_TYPES.ROLE_ASSIGNMENT], | |
group_members=[agents[AGENT_TYPES.SOLVER]] + agents[AGENT_TYPES.CRITIC], | |
advice=advice, | |
task_description=task_description, | |
) | |
if self.role_assign_only_once and cnt_turn == 0: | |
agents[AGENT_TYPES.SOLVER] = agents[0] | |
agents[AGENT_TYPES.CRITIC] = agents[1:] | |
return agents | |
async def decision_making( | |
self, | |
task_description: str, | |
agents: List[BaseAgent], | |
previous_plan: str, | |
advice: str = "No advice yet.", | |
) -> List[SolverMessage]: | |
# TODO: plan should be string or a special type of object? | |
# dynamic | |
if "dynamic" in self.decision_maker.name: | |
plan = await self.decision_maker.astep( | |
agents=[agents[AGENT_TYPES.SOLVER], *agents[AGENT_TYPES.CRITIC]], | |
manager=agents[AGENT_TYPES.MANAGER], | |
task_description=task_description, | |
previous_plan=previous_plan, | |
advice=advice, | |
) | |
else: | |
plan = await self.decision_maker.astep( | |
agents=[agents[AGENT_TYPES.SOLVER], *agents[AGENT_TYPES.CRITIC]], | |
task_description=task_description, | |
previous_plan=previous_plan, | |
advice=advice, | |
) | |
return plan | |
async def execute( | |
self, | |
task_description: str, | |
agents: List[BaseAgent], | |
final_solution: List[SolverMessage], | |
) -> Any: | |
"""execution stage. | |
Use the executor to finish the task. | |
""" | |
results = await self.executor.astep( | |
agents[AGENT_TYPES.EXECUTION], task_description, final_solution | |
) | |
if self.add_execution_result_to_critic: | |
for agent in agents[AGENT_TYPES.CRITIC]: | |
agent.add_message_to_memory(results) | |
if self.add_execution_result_to_solver: | |
agents[AGENT_TYPES.SOLVER].add_message_to_memory(results) | |
return results | |
def evaluate( | |
self, | |
task_description: str, | |
agents: List[BaseAgent], | |
solution: List[SolverMessage], | |
result: List[ExecutorMessage], | |
) -> Tuple[List[int], str]: | |
"""evaluation stage.""" | |
# if self.human_eval: | |
# print("This round, LLM gave the following result:") | |
# print(result) | |
# comprehensiveness = input("Please evaluate the comprehensiveness>> ") | |
# detailedness = input("Please evaluate the detailedness>> ") | |
# feasibility = input("Please evaluate the feasibility>> ") | |
# novelty = input("Please evaluate the novelty>> ") | |
# advice = input("Please give some advice>>") | |
# try: | |
# comprehensiveness = int(comprehensiveness) | |
# detailedness = int(detailedness) | |
# feasibility = int(feasibility) | |
# novelty = int(novelty) | |
# except ValueError: | |
# logger.error("Bad response from human evaluator!") | |
# return ([comprehensiveness, detailedness, feasibility, novelty], advice) | |
# else: | |
evaluation = self.evaluator.step( | |
agent=agents[AGENT_TYPES.EVALUATION], | |
solution=solution, | |
result=result, | |
task_description=task_description, | |
all_role_description=[ | |
agents[AGENT_TYPES.SOLVER].role_description, | |
*[agent.role_description for agent in agents[AGENT_TYPES.CRITIC]], | |
], | |
) | |
return evaluation.score, evaluation.advice | |
def reset(self) -> None: | |
self.role_assigner.reset() | |
self.decision_maker.reset() | |
self.executor.reset() | |
self.evaluator.reset() | |