from app.core.agents import WriterAgent, CoderAgent, CoordinatorAgent, ModelerAgent from app.schemas.request import Problem from app.schemas.response import SystemMessage from app.tools.openalex_scholar import OpenAlexScholar from app.utils.log_util import logger from app.utils.common_utils import create_work_dir, get_config_template from app.models.user_output import UserOutput from app.config.setting import settings from app.tools.interpreter_factory import create_interpreter from app.services.redis_manager import redis_manager from app.tools.notebook_serializer import NotebookSerializer from app.core.flows import Flows from app.core.llm.llm_factory import LLMFactory class WorkFlow: def __init__(self): pass def execute(self) -> str: # RichPrinter.workflow_start() # RichPrinter.workflow_end() pass class MathModelWorkFlow(WorkFlow): task_id: str # work_dir: str # worklow work dir ques_count: int = 0 # 问题数量 questions: dict[str, str | int] = {} # 问题 async def execute(self, problem: Problem): self.task_id = problem.task_id self.work_dir = create_work_dir(self.task_id) llm_factory = LLMFactory(self.task_id) coordinator_llm, modeler_llm, coder_llm, writer_llm = llm_factory.get_all_llms() coordinator_agent = CoordinatorAgent(self.task_id, coordinator_llm) await redis_manager.publish_message( self.task_id, SystemMessage(content="识别用户意图和拆解问题ing..."), ) try: coordinator_response = await coordinator_agent.run(problem.ques_all) self.questions = coordinator_response.questions self.ques_count = coordinator_response.ques_count except Exception as e: # 非数学建模问题 logger.error(f"CoordinatorAgent 执行失败: {e}") raise e await redis_manager.publish_message( self.task_id, SystemMessage(content="识别用户意图和拆解问题完成,任务转交给建模手"), ) await redis_manager.publish_message( self.task_id, SystemMessage(content="建模手开始建模ing..."), ) modeler_agent = ModelerAgent(self.task_id, modeler_llm) modeler_response = await modeler_agent.run(coordinator_response) user_output = UserOutput(work_dir=self.work_dir, ques_count=self.ques_count) await redis_manager.publish_message( self.task_id, SystemMessage(content="正在创建代码沙盒环境"), ) notebook_serializer = NotebookSerializer(work_dir=self.work_dir) code_interpreter = await create_interpreter( kind="local", task_id=self.task_id, work_dir=self.work_dir, notebook_serializer=notebook_serializer, timeout=3000, ) scholar = OpenAlexScholar(task_id=self.task_id, email=settings.OPENALEX_EMAIL) await redis_manager.publish_message( self.task_id, SystemMessage(content="创建完成"), ) await redis_manager.publish_message( self.task_id, SystemMessage(content="初始化代码手"), ) # modeler_agent coder_agent = CoderAgent( task_id=problem.task_id, model=coder_llm, work_dir=self.work_dir, max_chat_turns=settings.MAX_CHAT_TURNS, max_retries=settings.MAX_RETRIES, code_interpreter=code_interpreter, ) writer_agent = WriterAgent( task_id=problem.task_id, model=writer_llm, comp_template=problem.comp_template, format_output=problem.format_output, scholar=scholar, ) flows = Flows(self.questions) ################################################ solution steps solution_flows = flows.get_solution_flows(self.questions, modeler_response) config_template = get_config_template(problem.comp_template) for key, value in solution_flows.items(): await redis_manager.publish_message( self.task_id, SystemMessage(content=f"代码手开始求解{key}"), ) coder_response = await coder_agent.run( prompt=value["coder_prompt"], subtask_title=key ) await redis_manager.publish_message( self.task_id, SystemMessage(content=f"代码手求解成功{key}", type="success"), ) writer_prompt = flows.get_writer_prompt( key, coder_response.code_response, code_interpreter, config_template ) await redis_manager.publish_message( self.task_id, SystemMessage(content=f"论文手开始写{key}部分"), ) ## TODO: 图片引用错误 writer_response = await writer_agent.run( writer_prompt, available_images=coder_response.created_images, sub_title=key, ) await redis_manager.publish_message( self.task_id, SystemMessage(content=f"论文手完成{key}部分"), ) user_output.set_res(key, writer_response) # 关闭沙盒 await code_interpreter.cleanup() logger.info(user_output.get_res()) ################################################ write steps write_flows = flows.get_write_flows( user_output, config_template, problem.ques_all ) for key, value in write_flows.items(): await redis_manager.publish_message( self.task_id, SystemMessage(content=f"论文手开始写{key}部分"), ) writer_response = await writer_agent.run(prompt=value, sub_title=key) user_output.set_res(key, writer_response) logger.info(user_output.get_res()) user_output.save_result()