放弃使用system_prompt控制use_report,采用中间件形式在调用工具前控制

This commit is contained in:
zcr
2026-04-01 16:27:37 +08:00
parent 3f34bb005c
commit 108fa0fb8c
2 changed files with 49 additions and 26 deletions

65
src/server/deep_agent/agents/main_agent.py Normal file → Executable file
View File

@@ -1,19 +1,25 @@
from deepagents import create_deep_agent
import logging
from typing import Callable
from deepagents import create_deep_agent, SubAgentMiddleware
from deepagents.backends import FilesystemBackend
from langchain.agents.middleware import SummarizationMiddleware, ToolRetryMiddleware
from langchain.agents.middleware import SummarizationMiddleware, ToolRetryMiddleware, wrap_model_call, ModelRequest, ModelResponse, wrap_tool_call
from langchain_core.messages import ToolMessage
from langgraph.checkpoint.mongodb import MongoDBSaver
from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer
from langgraph.prebuilt.tool_node import ToolCallRequest
from langgraph.store.memory import InMemoryStore
from langgraph.types import Command
from pymongo import MongoClient
from src.core.config import MONGO_URI
# from src.server.deep_agent.agents.painter import build_painter_subagent
from src.server.deep_agent.agents.researcher import build_researcher_subagent
from src.server.deep_agent.agents.user_profile import user_profile_subagent
from src.server.deep_agent.init_llm import build_main_llm
from src.server.deep_agent.init_prompt import build_system_prompt
from src.server.deep_agent.tools.generate_furniture_sketch import edit_furniture, generate_furniture, edit_quote_upload_furniture
logger = logging.getLogger(__name__)
client = MongoClient(MONGO_URI)
checkpointer = MongoDBSaver(
client=client["furniture_agent_db"],
@@ -23,22 +29,48 @@ checkpointer = MongoDBSaver(
)
class CanvasMiddleware:
def before_agent(self, state, agent_input, **kwargs):
canvas = state.get("canvas", {})
@wrap_tool_call
async def report_control(
request: ToolCallRequest,
handler: Callable[[ToolCallRequest], ToolMessage | Command],
) -> ToolMessage | Command:
tool_name = request.tool_call.get('name')
args = request.tool_call.get('args', {}) or {}
info = f"""
当前画布状态:
- image_path: {canvas.get("image_path")}
- 是否已有图片: {bool(canvas.get("image_path"))}
"""
print(f"Executing tool: {tool_name}")
# print(f"Arguments: {args}") # 可以注释掉,生产环境日志太多
agent_input["messages"].append({
"role": "system",
"content": info
})
if tool_name == "task":
# 更安全的判断方式(兼容不同字段名)
subagent_name = (
args.get("subagent")
or args.get("subagent_type")
or args.get("name")
or ""
).lower()
return state, agent_input
# use_report按钮检测
if "research_subagent" in subagent_name:
use_report = request.runtime.config['configurable']['use_report']
if not use_report:
error_msg = "Reporting is currently not enabled. If you want to use the reporting function, please enable trending report first."
logger.info("⚠️ 已拦截 research_subagent 调用")
return ToolMessage(
content=error_msg,
tool_call_id=request.tool_call.get("id")
)
else:
logger.info("✅ use_report=True允许调用 research_subagent")
try:
result = await handler(request)
logger.info(f"Tool {tool_name} completed successfully")
return result
except Exception as e:
logger.info(f"Tool {tool_name} failed: {e}")
return ToolMessage(
content=f"执行失败: {str(e)}",
tool_call_id=request.tool_call.get("id")
)
def build_main_agent(use_report, workspace_dir, enable_thinking):
@@ -61,6 +93,7 @@ def build_main_agent(use_report, workspace_dir, enable_thinking):
virtual_mode=True, # 重要:關掉虛擬模式 → 真的寫硬碟
),
middleware=[
report_control,
SummarizationMiddleware(
model=build_main_llm(enable_thinking=enable_thinking),
trigger=("tokens", 3000),

10
src/server/deep_agent/init_prompt.py Normal file → Executable file
View File

@@ -80,8 +80,6 @@
def build_system_prompt(use_report):
system_prompt = f"""
你是主调度 AgentSupervisor负责理解用户意图并选择合适的子Agent。
当前参数:
use_report = {use_report}
系统中存在两个相关子Agent
1. user_profile_subagent
负责收集和维护用户画像信息,包括但不限于:
@@ -141,14 +139,6 @@ def build_system_prompt(use_report):
如果用户画像信息已经完整:
→ 调用 research-subagent 生成报告。
------------------------
【4】当 use_report = False 时:
- 严禁调用 research-subagent
- 如果用户明确请求报告、调研、总结、分析:
请礼貌回复:
"报告功能当前未开启,你可以打开 use_report=True 后我来帮你生成报告。"
- 其他普通问题可以正常回答或调用其他子Agent。
------------------------
【5】用户画像优先级规则
只要用户输入包含以下情况:
- 表达设计需求