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】用户画像优先级规则 只要用户输入包含以下情况: - 表达设计需求