refactor(deep_agent): 不使用默认的 create_deep_agent 而是仅使用其中间件重构深度智能体创建逻辑

重构深度智能体的创建逻辑,使用更灵活的create_agent替代create_deep_agent
添加多个中间件包括摘要、文件系统和子代理处理
优化研究代理的描述并更新提示词指导
修复聊天路由中extra_metadata的合并逻辑
This commit is contained in:
Wenjie Zhang 2025-12-17 22:28:28 +08:00
parent e62ec33e4b
commit 80d03554b4
3 changed files with 60 additions and 9 deletions

View File

@ -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 = ""

View File

@ -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(),
)

View File

@ -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 判断是否相关
你可以用多种不同的方式来组织你的报告以下是一些例子