Skip to content

Commit 339484f

Browse files
committed
feat(deep_agent): 重构深度分析智能体并优化MCP配置
重构深度分析智能体的提示词和上下文处理逻辑,将提示词集中管理并优化结构 修改MCP服务器配置,使用本地npx命令替代远程HTTP服务 更新文档中的环境变量名称和配置说明 在Makefile中添加.env文件检查
1 parent 11603ef commit 339484f

File tree

10 files changed

+220
-182
lines changed

10 files changed

+220
-182
lines changed

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@ docker compose exec api uv run python test/your_script.py # 放在 test 文件
4646

4747
**其他**
4848

49+
- 使用 YUXI_SUPER_ADMIN_NAME / YUXI_SUPER_ADMIN_PASSWORD 调试接口
4950
- 如果需要新建说明文档(仅开发者可见,非必要不创建),则保存在 `docs/vibe` 文件夹下面
5051
- 代码更新后要检查文档部分是否有需要更新的地方,文档的目录定义在 `docs/.vitepress/config.mts` 中。文档应该更新最新版(`docs/latest`

CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@ docker compose exec api uv run python test/your_script.py # 放在 test 文件
4646

4747
**其他**
4848

49+
- 使用 YUXI_SUPER_ADMIN_NAME / YUXI_SUPER_ADMIN_PASSWORD 调试接口
4950
- 如果需要新建说明文档(仅开发者可见,非必要不创建),则保存在 `docs/vibe` 文件夹下面
5051
- 代码更新后要检查文档部分是否有需要更新的地方,文档的目录定义在 `docs/.vitepress/config.mts` 中。文档应该更新最新版(`docs/latest`

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
PYTEST_ARGS ?=
55

66
start:
7+
@if [ ! -f .env ]; then \
8+
echo "Error: .env file not found. Please create it from .env.template"; \
9+
exit 1; \
10+
fi
711
docker compose up -d
812

913
stop:

docs/latest/advanced/agents-config.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ MCP_SERVERS = {
131131

132132
```python
133133
MCP_SERVERS = {
134-
"mcp_server_chart": {
134+
"mcp-server-chart": {
135135
"command": "npx",
136136
"args": ["-y", "@antv/mcp-server-chart"],
137137
"transport": "stdio"

src/agents/common/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ class BaseAgent:
2323
name = "base_agent"
2424
description = "base_agent"
2525
capabilities: list[str] = [] # 智能体能力列表,如 ["file_upload", "web_search"] 等
26+
context_schema: type[BaseContext] = BaseContext # 智能体上下文 schema
2627

2728
def __init__(self, **kwargs):
2829
self.graph = None # will be covered by get_graph
2930
self.checkpointer = None
30-
self.context_schema = BaseContext
3131
self.workdir = Path(sys_config.save_dir) / "agents" / self.module_name
3232
self.workdir.mkdir(parents=True, exist_ok=True)
3333
self._metadata_cache = None # Cache for metadata to avoid repeated file reads

src/agents/common/mcp.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
from typing import Any, cast
66
import traceback
77

8-
from langchain_mcp_adapters.client import ( # type: ignore[import-untyped]
9-
MultiServerMCPClient,
10-
)
8+
from langchain_mcp_adapters.client import MultiServerMCPClient
9+
1110

1211
from src.utils import logger
1312

@@ -21,7 +20,7 @@
2120
"transport": "streamable_http",
2221
},
2322
# "zhipu-web-search-sse": {
24-
# "url": f"https://open.bigmodel.cn/api/mcp/web_search/sse?Authorization={os.getenv('ZHIPU_API_KEY')}",
23+
# "url": f"https://open.bigmodel.cn/api/mcp/web_search/sse?Authorization={os.getenv('ZHIPUAI_API_KEY')}",
2524
# "transport": "streamable_http",
2625
# },
2726
# 这些 stdio 的 MCP server 需要在本地启动,启动的时候需要安装对应的包,需要时间
@@ -42,10 +41,9 @@ async def get_mcp_client(
4241
server_configs: dict[str, Any] | None = None,
4342
) -> MultiServerMCPClient | None:
4443
"""Initializes an MCP client with the given server configurations."""
45-
configs = server_configs or MCP_SERVERS
4644
try:
47-
client = MultiServerMCPClient(configs) # pyright: ignore[reportArgumentType]
48-
logger.info(f"Initialized MCP client with servers: {list(configs.keys())}")
45+
client = MultiServerMCPClient(server_configs) # pyright: ignore[reportArgumentType]
46+
logger.info(f"Initialized MCP client with servers: {list(server_configs.keys())}")
4947
return client
5048
except Exception as e:
5149
logger.error("Failed to initialize MCP client: {}", e)
@@ -63,7 +61,7 @@ async def get_mcp_tools(server_name: str, additional_servers: dict[str, dict] =
6361
mcp_servers = MCP_SERVERS | (additional_servers or {})
6462

6563
try:
66-
assert server_name in mcp_servers, f"Server {server_name} not found in MCP_SERVERS"
64+
assert server_name in mcp_servers, f"Server {server_name} not found in ({list(mcp_servers.keys())})"
6765
client = await get_mcp_client({server_name: mcp_servers[server_name]})
6866
if client is None:
6967
return []
@@ -76,7 +74,7 @@ async def get_mcp_tools(server_name: str, additional_servers: dict[str, dict] =
7674
logger.info(f"Loaded {len(tools)} tools from MCP server '{server_name}'")
7775
return tools
7876
except AssertionError as e:
79-
logger.warning(f"Failed to load tools from MCP server '{server_name}': {e}")
77+
logger.warning(f"[assert] Failed to load tools from MCP server '{server_name}': {e}")
8078
return []
8179
except Exception as e:
8280
logger.error(f"Failed to load tools from MCP server '{server_name}': {e}, traceback: {traceback.format_exc()}")

src/agents/deep_agent/context.py

Lines changed: 83 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,96 @@
11
"""Deep Agent Context - 基于BaseContext的深度分析上下文配置"""
22

3-
from dataclasses import field
3+
from dataclasses import dataclass, field
44

55
from src.agents.common.context import BaseContext
66

7-
DEEP_PROMPT = """你是一个能够处理复杂、多步骤任务的深度分析代理。
87

9-
你拥有以下资源:
10-
- 用于分解复杂任务的规划工具
11-
- 用于存储上下文和长期记忆的文件系统
12-
- 用于委派专业工作的子代理
13-
- 知识图谱查询与分析工具
8+
DEEP_PROMPT = """你是一位专家级研究员。你的工作是进行彻底的研究,然后撰写一份精美的报告。
149
15-
你的工作方式:
16-
1. 仔细分析用户的请求
17-
2. 如果任务复杂,则制定计划
18-
3. 使用合适的工具和子代理
19-
4. 提供全面且有充分推理的回应
20-
5. 存储重要信息以备将来参考
10+
你应该做的第一件事是把原始的用户问题写入 `question.txt`,以便你有一个记录。
2111
22-
在分析中注重深度、准确性和全面性。"""
12+
使用 research-agent 进行深入研究。它会用详细的答案回应你的问题/主题。
2313
14+
当你认为有足够的信息来撰写最终报告时,就把它写入 `final_report.md`
2415
16+
你可以调用 critique-agent 来获取对最终报告的评论。之后(如果需要)你可以做更多的研究并编辑 `final_report.md`
17+
你可以根据需要重复这个过程,直到你对结果满意为止。
18+
19+
一次只编辑一个文件(如果你并行调用这个工具,可能会有冲突)。
20+
21+
以下是撰写最终报告的说明:
22+
23+
<report_instructions>
24+
25+
关键:确保答案的语言与人类信息的语言相同!如果你制定了一个待办事项计划,你应该在计划中注明报告应该使用什么语言。
26+
注意:报告应该使用的语言是问题所在的语言,而不是问题所涉及的国家/地区的语言。
27+
28+
请根据整体研究简报创建一个详细的答案,该答案应:
29+
1. 组织良好,有恰当的标题(# 用于标题,## 用于章节,### 用于子章节)
30+
2. 包含研究中的具体事实和见解
31+
3. 使用 [标题](URL) 格式引用相关来源
32+
4. 提供平衡、透彻的分析。尽可能全面,并包含与整体研究问题相关的所有信息。使用你进行深入研究,并期望得到详细、全面的答案
33+
5. 在末尾包含一个“来源”部分,列出所有引用的链接
34+
35+
你可以用多种不同的方式来组织你的报告。以下是一些例子:
36+
37+
要回答一个要求你比较两件事物的问题,你可以这样组织你的报告:
38+
1/ 引言
39+
2/ 主题A概述
40+
3/ 主题B概述
41+
4/ A与B的比较
42+
5/ 结论
43+
44+
要回答一个要求你返回一个事物列表的问题,你可能只需要一个部分,即整个列表。
45+
1/ 事物列表或表格
46+
或者,你可以选择将列表中的每一项都作为报告中的一个独立部分。当被要求提供列表时,你不需要引言或结论。
47+
1/ 项目1
48+
2/ 项目2
49+
3/ 项目3
50+
51+
要回答一个要求你总结一个主题、给出一份报告或概述的问题,你可以这样组织你的报告:
52+
1/ 主题概述
53+
2/ 概念1
54+
3/ 概念2
55+
4/ 概念3
56+
5/ 结论
57+
58+
如果你认为你可以用一个部分来回答问题,你也可以这样做!
59+
1/ 答案
60+
61+
请记住:章节是一个非常灵活和松散的概念。你可以按照你认为最好的方式来组织你的报告,包括上面没有列出的方式!
62+
确保你的各个部分是连贯的,并且对读者来说是有意义的。
63+
64+
对于报告的每个部分,请执行以下操作:
65+
- 使用简单、清晰的语言
66+
- 对报告的每个部分使用 ## 作为章节标题(Markdown 格式)
67+
- 绝不要将自己称为报告的作者。这应该是一份专业的报告,不含任何自我指涉的语言。
68+
- 不要在报告中说你正在做什么。只需撰写报告,不要添加任何你自己的评论。
69+
- 每个部分的长度应足以用你收集到的信息。预计各部分会长且详尽。你正在撰写一份深入的研究报告,用户会期望得到透彻的答案。
70+
- 在适当的时候使用项目符号来列出信息,但默认情况下,请以段落形式撰写。
71+
72+
请记住:
73+
简报和研究可能是英文的,但在撰写最终答案时,你需要将这些信息翻译成正确的语言。
74+
确保最终答案报告的语言与消息历史中的人类信息语言相同。
75+
76+
用清晰的 markdown 格式化报告,结构合理,并在适当的地方包含来源引用。
77+
78+
<引用规则>
79+
- 在你的文本中为每个唯一的 URL 分配一个引文编号
80+
- 以 ### 来源 结尾,列出每个来源及其对应的编号
81+
- 重要提示:无论你选择哪些来源,最终列表中的来源编号都应连续无间断(1,2,3,4...)
82+
- 每个来源都应该是列表中的一个独立行项目,这样在 markdown 中它会被渲染成一个列表。
83+
- 示例格式:
84+
[1] 来源标题: URL
85+
[2] 来源标题: URL
86+
- 引用非常重要。请确保包含这些内容,并特别注意确保其正确性。用户通常会使用这些引文来查找更多信息。
87+
</引用规则>
88+
</report_instructions>
89+
90+
你可以使用一些工具。
91+
"""
92+
93+
@dataclass
2594
class DeepContext(BaseContext):
2695
"""
2796
Deep Agent 的上下文配置,继承自 BaseContext

0 commit comments

Comments
 (0)