fix: (pre-commit) 添加子智能体切换要求

This commit is contained in:
Wenjie Zhang 2026-01-30 13:34:11 +08:00
parent 8cbebf4cca
commit 820b6581e7
3 changed files with 42 additions and 22 deletions

View File

@ -31,6 +31,9 @@ class RuntimeConfigMiddleware(AgentMiddleware):
tools_context_name: str = "tools",
knowledges_context_name: str = "knowledges",
mcps_context_name: str = "mcps",
enable_model_override: bool = True,
enable_system_prompt_override: bool = True,
enable_tools_override: bool = True,
):
"""初始化中间件
@ -41,6 +44,9 @@ class RuntimeConfigMiddleware(AgentMiddleware):
tools_context_name: 上下文中的工具列表字段名称默认 "tools"
knowledges_context_name: 上下文中的知识库列表字段名称默认 "knowledges"
mcps_context_name: 上下文中的 MCP 服务器列表字段名称默认 "mcps"
enable_model_override: 是否允许覆盖模型配置默认 True
enable_system_prompt_override: 是否允许覆盖系统提示词默认 True
enable_tools_override: 是否允许覆盖工具列表默认 True
"""
super().__init__()
self.kb_tools = get_kb_based_tools()
@ -52,6 +58,10 @@ class RuntimeConfigMiddleware(AgentMiddleware):
self.tools_context_name = tools_context_name
self.knowledges_context_name = knowledges_context_name
self.mcps_context_name = mcps_context_name
# 存储覆盖配置
self.enable_model_override = enable_model_override
self.enable_system_prompt_override = enable_system_prompt_override
self.enable_tools_override = enable_tools_override
logger.debug(
f"Initialized RuntimeConfigMiddleware with custom field names: model={model_context_name}, "
f"system_prompt={system_prompt_context_name}, tools={tools_context_name}, "
@ -62,28 +72,36 @@ class RuntimeConfigMiddleware(AgentMiddleware):
self, request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse]
) -> ModelResponse:
runtime_context = request.runtime.context
overrides: dict[str, Any] = {}
model = load_chat_model(getattr(runtime_context, self.model_context_name, None))
enabled_tools = await self.get_tools_from_context(runtime_context)
existing_tools = list(request.tools or [])
# 1. 模型覆盖(可选)
if self.enable_model_override:
model = load_chat_model(getattr(runtime_context, self.model_context_name, None))
overrides["model"] = model
# 合并之前中间件设置的 tools避免覆盖
merged_tools = []
for t_bind in existing_tools:
if t_bind in enabled_tools or t_bind not in self.tools:
merged_tools.append(t_bind)
# 2. 工具覆盖(可选)
if self.enable_tools_override:
enabled_tools = await self.get_tools_from_context(runtime_context)
existing_tools = list(request.tools or [])
merged_tools = []
for t_bind in existing_tools:
if t_bind in enabled_tools or t_bind not in self.tools:
merged_tools.append(t_bind)
overrides["tools"] = merged_tools
# 动态生成 system message添加当前时间
cur_datetime = f"当前时间:{shanghai_now().strftime('%Y-%m-%d %H:%M:%S')} UTC"
system_prompt = getattr(runtime_context, self.system_prompt_context_name, "") or ""
new_content = list(request.system_message.content_blocks) + [
{"type": "text", "text": f"{cur_datetime}\n\n{system_prompt}"}
]
new_system_message = SystemMessage(content=new_content)
# 3. 系统提示词覆盖(可选)
if self.enable_system_prompt_override:
cur_datetime = f"当前时间:{shanghai_now().strftime('%Y-%m-%d %H:%M:%S')} UTC"
system_prompt = getattr(runtime_context, self.system_prompt_context_name, "") or ""
new_content = list(request.system_message.content_blocks) + [
{"type": "text", "text": f"{cur_datetime}\n\n{system_prompt}"}
]
new_system_message = SystemMessage(content=new_content)
overrides["system_message"] = new_system_message
logger.debug(f"RuntimeConfigMiddleware: model={model}, tools={[t.name for t in merged_tools]}. ")
if overrides:
request = request.override(**overrides)
request = request.override(model=model, tools=merged_tools, system_message=new_system_message)
return await handler(request)
async def get_tools_from_context(self, context) -> list:

View File

@ -112,11 +112,16 @@ class DeepAgent(BaseAgent):
subagents=[critique_sub_agent, research_sub_agent],
default_middleware=[
TodoListMiddleware(), # 子智能体也有 todo 列表
FilesystemMiddleware(), # 当前的两个文件系统是隔离的
FilesystemMiddleware(),
RuntimeConfigMiddleware(
model_context_name="subagents_model",
enable_model_override=True,
enable_system_prompt_override=False,
enable_tools_override=False,
),
SummarizationMiddleware(
model=sub_model,
trigger=("tokens", 110000),
keep=("messages", 10),
trim_tokens_to_summarize=None,
),
PatchToolCallsMiddleware(),
@ -126,7 +131,6 @@ class DeepAgent(BaseAgent):
SummarizationMiddleware(
model=model,
trigger=("tokens", 110000),
keep=("messages", 10),
trim_tokens_to_summarize=None,
),
PatchToolCallsMiddleware(),

View File

@ -81,8 +81,6 @@ const shortDescription = computed(() => {
}
.task-description {
padding: 12px;
background: var(--gray-100);
border-radius: 8px;
font-size: 13px;
color: var(--gray-800);