From 108fa0fb8cab7f9186b382fc9c99b1689887a0b2 Mon Sep 17 00:00:00 2001 From: zcr Date: Wed, 1 Apr 2026 16:27:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=BE=E5=BC=83=E4=BD=BF=E7=94=A8system=5Fpr?= =?UTF-8?q?ompt=E6=8E=A7=E5=88=B6use=5Freport,=E9=87=87=E7=94=A8=E4=B8=AD?= =?UTF-8?q?=E9=97=B4=E4=BB=B6=E5=BD=A2=E5=BC=8F=E5=9C=A8=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=89=8D=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/deep_agent/agents/main_agent.py | 65 ++++++++++++++++------ src/server/deep_agent/init_prompt.py | 10 ---- 2 files changed, 49 insertions(+), 26 deletions(-) mode change 100644 => 100755 src/server/deep_agent/agents/main_agent.py mode change 100644 => 100755 src/server/deep_agent/init_prompt.py diff --git a/src/server/deep_agent/agents/main_agent.py b/src/server/deep_agent/agents/main_agent.py old mode 100644 new mode 100755 index ad4e209..e178466 --- a/src/server/deep_agent/agents/main_agent.py +++ b/src/server/deep_agent/agents/main_agent.py @@ -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), diff --git a/src/server/deep_agent/init_prompt.py b/src/server/deep_agent/init_prompt.py old mode 100644 new mode 100755 index 79b32d3..9207b4c --- a/src/server/deep_agent/init_prompt.py +++ b/src/server/deep_agent/init_prompt.py @@ -80,8 +80,6 @@ def build_system_prompt(use_report): system_prompt = f""" 你是主调度 Agent(Supervisor),负责理解用户意图并选择合适的子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】用户画像优先级规则 只要用户输入包含以下情况: - 表达设计需求