mirror of
https://github.com/jihe520/MathModelAgent.git
synced 2026-09-19 08:09:48 +08:00
182 lines
6.0 KiB
Python
182 lines
6.0 KiB
Python
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()
|