From abee1fcc9b9df7049b8250a940b848f2b538e129 Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Thu, 26 Mar 2026 11:43:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E4=BD=93=E7=9A=84=E6=8F=90=E7=A4=BA=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yuxi/agents/buildin/chatbot/graph.py | 94 +++++++++---------- .../yuxi/agents/buildin/chatbot/prompt.py | 3 + .../yuxi/agents/buildin/deep_agent/graph.py | 33 ++----- 3 files changed, 53 insertions(+), 77 deletions(-) diff --git a/backend/package/yuxi/agents/buildin/chatbot/graph.py b/backend/package/yuxi/agents/buildin/chatbot/graph.py index 0be7a4f1..381a786d 100644 --- a/backend/package/yuxi/agents/buildin/chatbot/graph.py +++ b/backend/package/yuxi/agents/buildin/chatbot/graph.py @@ -19,12 +19,49 @@ from yuxi.services.subagent_service import get_subagents_from_names from .prompt import PROMPT -def _create_fs_backend(rt): - """创建文件存储后端(支持沙盒执行) +async def _build_middlewares(context): + """构建中间件列表""" + all_mcp_tools = ( + await get_tools_from_all_servers() + ) # 因为异步加载,无法放在 RuntimeConfigMiddleware 的 __init__ 中 - 由 composite backend 从 runtime 中自动解析 thread_id 并路由到沙盒后端。 - """ - return create_agent_composite_backend(rt) + + # summary middleware + # 主 Agent 上下文优化:90k tokens 触发压缩(128k context window 的 70%) + summary_middleware = SummaryOffloadMiddleware( + model=load_chat_model(fully_specified_name=context.model), + trigger=("tokens", getattr(context, "summary_threshold", 100) * 1024), + trim_tokens_to_summarize=4000, + summary_offload_threshold=500, + max_retention_ratio=0.5, + ) + + # subagents + subagents = await get_subagents_from_names(context.subagents) + subagents_middleware = SubAgentMiddleware( + default_model=load_chat_model(fully_specified_name=context.subagents_model), + subagents=subagents, + general_purpose_agent=True, + default_middleware=[ + FilesystemMiddleware(backend=create_agent_composite_backend), # 文件系统后端 + PatchToolCallsMiddleware(), + summary_middleware, + ], + ) + # all middlewares + middlewares = [ + save_attachments_to_fs, # 附件注入提示词 + FilesystemMiddleware(backend=create_agent_composite_backend), # 文件系统后端 + KnowledgeBaseMiddleware(), # 知识库工具 + RuntimeConfigMiddleware(extra_tools=all_mcp_tools), # 运行时配置应用(模型/工具/MCP/提示词) + SkillsMiddleware(), # Skills 中间件(提示词注入、依赖展开、动态激活) + subagents_middleware, + summary_middleware, + ModelRetryMiddleware(), # 模型重试中间件 + PatchToolCallsMiddleware(), + ] + + return middlewares class ChatbotAgent(BaseAgent): @@ -43,61 +80,18 @@ class ChatbotAgent(BaseAgent): def __init__(self, **kwargs): super().__init__(**kwargs) - async def _build_middlewares(self, context): - """构建中间件列表""" - all_mcp_tools = ( - await get_tools_from_all_servers() - ) # 因为异步加载,无法放在 RuntimeConfigMiddleware 的 __init__ 中 - - # subagents - subagents = await get_subagents_from_names(context.subagents) - subagents_middleware = SubAgentMiddleware( - default_model=load_chat_model(context.subagents_model), - subagents=subagents, - general_purpose_agent=True, - default_middleware=[ - FilesystemMiddleware(backend=_create_fs_backend), # 文件系统后端 - PatchToolCallsMiddleware(), - ], - ) - - # summary middleware - # 主 Agent 上下文优化:90k tokens 触发压缩(128k context window 的 70%) - summary_middleware = SummaryOffloadMiddleware( - model=load_chat_model(fully_specified_name=context.model), - trigger=("tokens", getattr(context, "summary_threshold", 100) * 1024), - trim_tokens_to_summarize=4000, - summary_offload_threshold=500, - max_retention_ratio=0.5, - ) - - # all middlewares - middlewares = [ - save_attachments_to_fs, # 附件注入提示词 - FilesystemMiddleware(backend=_create_fs_backend), # 文件系统后端 - KnowledgeBaseMiddleware(), # 知识库工具 - RuntimeConfigMiddleware(extra_tools=all_mcp_tools), # 运行时配置应用(模型/工具/MCP/提示词) - SkillsMiddleware(), # Skills 中间件(提示词注入、依赖展开、动态激活) - subagents_middleware, - summary_middleware, - ModelRetryMiddleware(), # 模型重试中间件 - PatchToolCallsMiddleware(), - ] - - return middlewares async def get_graph(self, context=None, **kwargs): context = context or self.context_schema() # 获取上下文配置 - system_prompt = PROMPT.strip() + "\n\n" + (context.system_prompt or "") + system_prompt = f"{PROMPT.strip()}\n\n{context.system_prompt or ''}" # 使用 create_agent 创建智能体 - # 注意:tools 参数由 RuntimeConfigMiddleware 在 wrap_model_call 中动态设置 graph = create_agent( model=load_chat_model(fully_specified_name=context.model), system_prompt=system_prompt.strip(), - middleware=await self._build_middlewares(context), + middleware=await _build_middlewares(context), checkpointer=await self._get_checkpointer(), ) diff --git a/backend/package/yuxi/agents/buildin/chatbot/prompt.py b/backend/package/yuxi/agents/buildin/chatbot/prompt.py index 3a05051a..59a45cdd 100644 --- a/backend/package/yuxi/agents/buildin/chatbot/prompt.py +++ b/backend/package/yuxi/agents/buildin/chatbot/prompt.py @@ -8,4 +8,7 @@ PROMPT = """ - /home/gem/user-data/outputs/:用于存放最终输出结果 - /home/gem/user-data/uploads/:用于存放用户上传的文件 +如果启用了知识库,除了使用知识库工具之外, +当需要精准获取信息的时候,还可以直接访问知识库文件系统 (路径为 /home/gem/kbs/)来获取信息。 +源文件可能无法解析,可以在 /home/gem/kbs//parsed/ 中找到解析后的 markdown 文件。 """ diff --git a/backend/package/yuxi/agents/buildin/deep_agent/graph.py b/backend/package/yuxi/agents/buildin/deep_agent/graph.py index ea70b3a5..6bcceeda 100644 --- a/backend/package/yuxi/agents/buildin/deep_agent/graph.py +++ b/backend/package/yuxi/agents/buildin/deep_agent/graph.py @@ -1,5 +1,3 @@ -"""Deep Agent - 基于create_deep_agent的深度分析智能体""" - from deepagents.middleware.filesystem import FilesystemMiddleware from deepagents.middleware.patch_tool_calls import PatchToolCallsMiddleware from deepagents.middleware.subagents import SubAgentMiddleware @@ -23,18 +21,12 @@ from yuxi.services.mcp_service import get_tools_from_all_servers from yuxi.services.subagent_service import get_subagents_from_names from yuxi.utils import logger -from .context import DeepContext - - -def _create_fs_backend(rt): - """创建文件存储后端""" - return create_agent_composite_backend(rt) +from .prompt import DEEP_PROMPT class DeepAgent(BaseAgent): name = "深度分析" description = "具备规划、深度分析和子智能体协作能力的智能体,可以处理复杂的多步骤任务" - context_schema = DeepContext capabilities = ["file_upload", "files", "todo"] # 支持文件上传功能 metadata = {"examples": ["调研一下多模态 GraphRAG 的相关论文"]} @@ -60,6 +52,7 @@ class DeepAgent(BaseAgent): async def get_graph(self, context=None, **kwargs): context = context or self.context_schema() # 获取上下文配置 + system_prompt = f"{DEEP_PROMPT.strip()}\n\n{context.system_prompt or ''}" model = load_chat_model(context.model) sub_model = load_chat_model(context.subagents_model) @@ -79,28 +72,14 @@ class DeepAgent(BaseAgent): max_retention_ratio=0.5, ) - # 子 Agent 独立的上下文优化:更激进的压缩策略 - sub_summary_middleware = SummaryOffloadMiddleware( - model=sub_model, - trigger=("tokens", 50000), - trim_tokens_to_summarize=2000, - summary_offload_threshold=300, - max_retention_ratio=0.4, - ) - subagents_middleware = SubAgentMiddleware( default_model=sub_model, default_tools=search_tools, subagents=user_subagents, default_middleware=[ - RuntimeConfigMiddleware( - model_context_name="subagents_model", - enable_model_override=True, - enable_system_prompt_override=False, - enable_tools_override=False, - ), + FilesystemMiddleware(backend=create_agent_composite_backend), # 文件系统后端 PatchToolCallsMiddleware(), - sub_summary_middleware, + summary_middleware, # 子 Agent 搜索工具限制:tavily_search 最多 8 次 ToolCallLimitMiddleware( tool_name="tavily_search", @@ -114,9 +93,9 @@ class DeepAgent(BaseAgent): # 使用 create_deep_agent 创建深度智能体 graph = create_agent( model=model, - system_prompt=context.system_prompt, + system_prompt=system_prompt, middleware=[ - FilesystemMiddleware(backend=_create_fs_backend), # 文件系统后端 + FilesystemMiddleware(backend=create_agent_composite_backend), # 文件系统后端 RuntimeConfigMiddleware(extra_tools=all_mcp_tools), SkillsMiddleware(), # Skills 中间件(提示词注入、依赖展开、动态激活) save_attachments_to_fs, # 附件注入提示词