Skip to content

Commit 80d0355

Browse files
committed
refactor(deep_agent): 不使用默认的 create_deep_agent 而是仅使用其中间件重构深度智能体创建逻辑
重构深度智能体的创建逻辑,使用更灵活的create_agent替代create_deep_agent 添加多个中间件包括摘要、文件系统和子代理处理 优化研究代理的描述并更新提示词指导 修复聊天路由中extra_metadata的合并逻辑
1 parent e62ec33 commit 80d0355

File tree

3 files changed

+60
-9
lines changed

3 files changed

+60
-9
lines changed

server/routers/chat_router.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ async def save_partial_message(conv_mgr, thread_id, full_msg=None, error_message
234234
# 保存部分生成的AI消息
235235
msg_dict = full_msg.model_dump() if hasattr(full_msg, "model_dump") else {}
236236
content = full_msg.content if hasattr(full_msg, "content") else str(full_msg)
237-
extra_metadata = msg_dict | {"error_type": error_type}
237+
extra_metadata = msg_dict | extra_metadata
238238
else:
239239
content = ""
240240

src/agents/deep_agent/graph.py

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
"""Deep Agent - 基于create_deep_agent的深度分析智能体"""
22

3-
from deepagents import create_deep_agent
4-
from langchain.agents.middleware import ModelRequest, dynamic_prompt
3+
from langchain.agents.middleware import ModelRequest, dynamic_prompt, SummarizationMiddleware
4+
5+
from langchain.agents import create_agent
6+
from langchain.agents.middleware import TodoListMiddleware
7+
from langchain_anthropic.middleware import AnthropicPromptCachingMiddleware
8+
9+
from deepagents.middleware.filesystem import FilesystemMiddleware
10+
from deepagents.middleware.patch_tool_calls import PatchToolCallsMiddleware
11+
from deepagents.middleware.subagents import SubAgentMiddleware
512

613
from src.agents.common import BaseAgent, load_chat_model
714
from src.agents.common.middlewares import context_based_model, inject_attachment_context
@@ -15,8 +22,7 @@
1522
research_sub_agent = {
1623
"name": "research-agent",
1724
"description": (
18-
"用于研究更深入的问题。一次只给这个研究员一个主题。不要向这个研究员传递多个子问题。"
19-
"相反,你应该将一个大主题分解成必要的组成部分,然后并行调用多个研究代理,每个子问题一个。"
25+
"利用搜索工具,用于研究更深入的问题。"
2026
),
2127
"system_prompt": (
2228
"你是一位专注的研究员。你的工作是根据用户的问题进行研究。"
@@ -81,15 +87,57 @@ async def get_graph(self, **kwargs):
8187
# 获取上下文配置
8288
context = self.context_schema.from_file(module_name=self.module_name)
8389

90+
model = load_chat_model(context.model)
91+
tools = await self.get_tools()
92+
93+
if (
94+
model.profile is not None
95+
and isinstance(model.profile, dict)
96+
and "max_input_tokens" in model.profile
97+
and isinstance(model.profile["max_input_tokens"], int)
98+
): # 此处参考 model.dev 中的 max_input_tokens
99+
trigger = ("fraction", 0.85)
100+
keep = ("fraction", 0.10)
101+
else:
102+
trigger = ("tokens", 110000)
103+
keep = ("messages", 10)
104+
84105
# 使用 create_deep_agent 创建深度智能体
85-
graph = create_deep_agent(
86-
model=load_chat_model(context.model),
87-
tools=await self.get_tools(),
88-
subagents=[critique_sub_agent, research_sub_agent],
106+
graph = create_agent(
107+
model=model,
108+
tools=tools,
89109
middleware=[
90110
context_based_model, # 动态模型选择
91111
context_aware_prompt, # 动态系统提示词
92112
inject_attachment_context, # 附件上下文注入
113+
TodoListMiddleware(),
114+
FilesystemMiddleware(),
115+
SubAgentMiddleware(
116+
default_model=load_chat_model(context.model),
117+
default_tools=tools,
118+
subagents=[critique_sub_agent, research_sub_agent],
119+
default_middleware=[
120+
TodoListMiddleware(),
121+
FilesystemMiddleware(),
122+
SummarizationMiddleware(
123+
model=model,
124+
trigger=trigger,
125+
keep=keep,
126+
trim_tokens_to_summarize=None,
127+
),
128+
AnthropicPromptCachingMiddleware(unsupported_model_behavior="ignore"),
129+
PatchToolCallsMiddleware(),
130+
],
131+
general_purpose_agent=True,
132+
),
133+
SummarizationMiddleware(
134+
model=model,
135+
trigger=trigger,
136+
keep=keep,
137+
trim_tokens_to_summarize=None,
138+
),
139+
AnthropicPromptCachingMiddleware(unsupported_model_behavior="ignore"),
140+
PatchToolCallsMiddleware(),
93141
],
94142
checkpointer=await self._get_checkpointer(),
95143
)

src/agents/deep_agent/prompts.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
你应该做的第一件事是把原始的用户问题写入 `question.txt`,以便你有一个记录。
44
55
使用 research-agent 进行深入研究。它会用详细的答案回应你的问题/主题。
6+
一次只给这个研究员一个主题。不要向这个研究员传递多个子问题。
7+
如有必要,你应该将一个大主题分解成必要的组成部分,然后并行调用多个研究代理,每个子问题一个。
68
79
当你认为有足够的信息来撰写最终报告时,就把它写入 `final_report.md`
810
@@ -24,6 +26,7 @@
2426
3. 使用 [标题](URL) 格式引用相关来源
2527
4. 提供平衡、透彻的分析。尽可能全面,并包含与整体研究问题相关的所有信息。使用你进行深入研究,并期望得到详细、全面的答案
2628
5. 在末尾包含一个“来源”部分,列出所有引用的链接
29+
6. 如果有确定内容的图片 url,你应该在报告中包含它(根据 caption 判断是否相关)。
2730
2831
你可以用多种不同的方式来组织你的报告。以下是一些例子:
2932

0 commit comments

Comments
 (0)