diff --git a/server/routers/chat_router.py b/server/routers/chat_router.py index 8115e539..78eef3f7 100644 --- a/server/routers/chat_router.py +++ b/server/routers/chat_router.py @@ -234,7 +234,7 @@ async def save_partial_message(conv_mgr, thread_id, full_msg=None, error_message # 保存部分生成的AI消息 msg_dict = full_msg.model_dump() if hasattr(full_msg, "model_dump") else {} content = full_msg.content if hasattr(full_msg, "content") else str(full_msg) - extra_metadata = msg_dict | {"error_type": error_type} + extra_metadata = msg_dict | extra_metadata else: content = "" diff --git a/src/agents/deep_agent/graph.py b/src/agents/deep_agent/graph.py index 57f3615d..97760209 100644 --- a/src/agents/deep_agent/graph.py +++ b/src/agents/deep_agent/graph.py @@ -1,7 +1,14 @@ """Deep Agent - 基于create_deep_agent的深度分析智能体""" -from deepagents import create_deep_agent -from langchain.agents.middleware import ModelRequest, dynamic_prompt +from langchain.agents.middleware import ModelRequest, dynamic_prompt, SummarizationMiddleware + +from langchain.agents import create_agent +from langchain.agents.middleware import TodoListMiddleware +from langchain_anthropic.middleware import AnthropicPromptCachingMiddleware + +from deepagents.middleware.filesystem import FilesystemMiddleware +from deepagents.middleware.patch_tool_calls import PatchToolCallsMiddleware +from deepagents.middleware.subagents import SubAgentMiddleware from src.agents.common import BaseAgent, load_chat_model from src.agents.common.middlewares import context_based_model, inject_attachment_context @@ -15,8 +22,7 @@ search_tools = [search] research_sub_agent = { "name": "research-agent", "description": ( - "用于研究更深入的问题。一次只给这个研究员一个主题。不要向这个研究员传递多个子问题。" - "相反,你应该将一个大主题分解成必要的组成部分,然后并行调用多个研究代理,每个子问题一个。" + "利用搜索工具,用于研究更深入的问题。" ), "system_prompt": ( "你是一位专注的研究员。你的工作是根据用户的问题进行研究。" @@ -81,15 +87,57 @@ class DeepAgent(BaseAgent): # 获取上下文配置 context = self.context_schema.from_file(module_name=self.module_name) + model = load_chat_model(context.model) + tools = await self.get_tools() + + if ( + model.profile is not None + and isinstance(model.profile, dict) + and "max_input_tokens" in model.profile + and isinstance(model.profile["max_input_tokens"], int) + ): # 此处参考 model.dev 中的 max_input_tokens + trigger = ("fraction", 0.85) + keep = ("fraction", 0.10) + else: + trigger = ("tokens", 110000) + keep = ("messages", 10) + # 使用 create_deep_agent 创建深度智能体 - graph = create_deep_agent( - model=load_chat_model(context.model), - tools=await self.get_tools(), - subagents=[critique_sub_agent, research_sub_agent], + graph = create_agent( + model=model, + tools=tools, middleware=[ context_based_model, # 动态模型选择 context_aware_prompt, # 动态系统提示词 inject_attachment_context, # 附件上下文注入 + TodoListMiddleware(), + FilesystemMiddleware(), + SubAgentMiddleware( + default_model=load_chat_model(context.model), + default_tools=tools, + subagents=[critique_sub_agent, research_sub_agent], + default_middleware=[ + TodoListMiddleware(), + FilesystemMiddleware(), + SummarizationMiddleware( + model=model, + trigger=trigger, + keep=keep, + trim_tokens_to_summarize=None, + ), + AnthropicPromptCachingMiddleware(unsupported_model_behavior="ignore"), + PatchToolCallsMiddleware(), + ], + general_purpose_agent=True, + ), + SummarizationMiddleware( + model=model, + trigger=trigger, + keep=keep, + trim_tokens_to_summarize=None, + ), + AnthropicPromptCachingMiddleware(unsupported_model_behavior="ignore"), + PatchToolCallsMiddleware(), ], checkpointer=await self._get_checkpointer(), ) diff --git a/src/agents/deep_agent/prompts.py b/src/agents/deep_agent/prompts.py index f98d8185..b2fa9de6 100644 --- a/src/agents/deep_agent/prompts.py +++ b/src/agents/deep_agent/prompts.py @@ -3,6 +3,8 @@ DEEP_PROMPT = """你是一位专家级研究员。你的工作是进行彻底的 你应该做的第一件事是把原始的用户问题写入 `question.txt`,以便你有一个记录。 使用 research-agent 进行深入研究。它会用详细的答案回应你的问题/主题。 +一次只给这个研究员一个主题。不要向这个研究员传递多个子问题。 +如有必要,你应该将一个大主题分解成必要的组成部分,然后并行调用多个研究代理,每个子问题一个。 当你认为有足够的信息来撰写最终报告时,就把它写入 `final_report.md` @@ -24,6 +26,7 @@ DEEP_PROMPT = """你是一位专家级研究员。你的工作是进行彻底的 3. 使用 [标题](URL) 格式引用相关来源 4. 提供平衡、透彻的分析。尽可能全面,并包含与整体研究问题相关的所有信息。使用你进行深入研究,并期望得到详细、全面的答案 5. 在末尾包含一个“来源”部分,列出所有引用的链接 +6. 如果有确定内容的图片 url,你应该在报告中包含它(根据 caption 判断是否相关)。 你可以用多种不同的方式来组织你的报告。以下是一些例子: