plan_executor.py 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from re import S
  2. from typing import List
  3. from qwen_agent.planning.plan_dispatcher import PlanDispatcher
  4. from qwen_agent.planning.planner import PlanInfo, Planner
  5. from qwen_agent.messages.context_message import PlanResponseContextManager
  6. from qwen_agent.messages.context_message import ChatResponseChoice, ChatResponseStreamChoice, SystemSignal
  7. from qwen_agent.sub_agent.BaseSubAgent import BaseSubAgent
  8. from agent_config import ActionDict
  9. class PlanExecutor:
  10. def __init__(self, enable_critic=False, llm=None, stream=False, llm_dict=None, max_plan_critic_num=2):
  11. self.llm = llm
  12. self.stream = stream
  13. self.enable_critic = enable_critic
  14. self.max_plan_critic_num = max_plan_critic_num
  15. self.llm_dict = llm_dict
  16. async def run_agent(self, agent, messages: List[str],
  17. plan_context: PlanResponseContextManager) -> List[str]:
  18. rsp = agent.run(plan_context=plan_context, messages=messages)
  19. async for msg in rsp:
  20. if isinstance(msg, SystemSignal):
  21. yield msg
  22. return
  23. plan_context.add_message(agent.name, msg)
  24. # if msg.content:
  25. if (isinstance(msg, ChatResponseStreamChoice) and msg.delta) or \
  26. (isinstance(msg, ChatResponseChoice) and msg.content):
  27. yield plan_context.response_json()
  28. # set results
  29. exec_res = agent.exec_res
  30. if exec_res:
  31. if hasattr(agent, 'sql_code'):
  32. plan_context.executing_agent.sql_code = agent.sql_code
  33. plan_context.set_last_plan_execute(exec_res)
  34. yield plan_context.response_json()
  35. async def run(self, user_request, messages=None):
  36. if not messages:
  37. messages = []
  38. plan_context = PlanResponseContextManager()
  39. plan_context.init_chat(user_request, messages)
  40. # execute plan dispatcher
  41. dispatcher_llm_name = self.llm_dict.get('plan_dispatcher') or self.llm_dict['planner']
  42. plan_dispatcher = PlanDispatcher(
  43. llm_dict=self.llm_dict, llm_name=dispatcher_llm_name,
  44. llm=self.llm, stream=self.stream
  45. )
  46. plan_context.add_executing_agent_info(plan_dispatcher.name, plan_dispatcher.llm_name)
  47. async for rsp in self.run_agent(plan_dispatcher, messages, plan_context):
  48. yield rsp
  49. # execute planner
  50. planner: Planner = plan_dispatcher.planner
  51. plan_context.add_executing_agent_info(planner.name, planner.llm_name)
  52. async for rsp in self.run_agent(planner, messages, plan_context):
  53. yield rsp
  54. if not hasattr(planner, 'plans'):
  55. return
  56. # return
  57. plan_context.plan_msg = planner.exec_res
  58. plan_context.plans: List[PlanInfo] = planner.plans
  59. print("self.llmdict")
  60. print(self.llm_dict)
  61. for idx, plan in enumerate(plan_context.plans):
  62. # print(plan.model_dump_json())
  63. if plan.action_name not in ActionDict:
  64. continue
  65. llm_name = self.llm_dict[plan.action_name]
  66. agent: BaseSubAgent = ActionDict[plan.action_name](llm=self.llm, llm_name=llm_name, stream=self.stream,
  67. name=plan.action_name)
  68. if plan.action_name == 'generate_chart':
  69. plan_context.add_executing_agent_info(agent.name, llm_name, plan.instruction)
  70. elif plan.action_name in ['LandSupplySqlAgent', 'LandUseSqlAgent', 'LandApprovalSqlAgent', 'SpatialAnalysisAgent','LandFindSqlAgent', 'LandSiteSelectionSqlAgent', 'GisSurroundingFacilitiesQueryAgent', 'KfqEvalSqlAgent']:
  71. plan_context.add_executing_agent_info(agent.name, llm_name, plan.instruction, add_to_context=True,
  72. add_to_final=True)
  73. else:
  74. plan_context.add_executing_agent_info(agent.name, llm_name, plan.instruction, add_to_context=True)
  75. if agent.name == 'summary_agent':
  76. print("summary")
  77. async for rsp in self.run_agent(agent, messages, plan_context=plan_context):
  78. if isinstance(rsp, SystemSignal):
  79. plan_context.system_signal = rsp
  80. yield plan_context.model_dump_json(exclude_none=True)
  81. return
  82. yield rsp
  83. plan.executed = True