放弃使用system_prompt控制use_report,采用中间件形式在调用工具前控制
This commit is contained in:
65
src/server/deep_agent/agents/main_agent.py
Normal file → Executable file
65
src/server/deep_agent/agents/main_agent.py
Normal file → Executable 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
10
src/server/deep_agent/init_prompt.py
Normal file → Executable file
@@ -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】用户画像优先级规则
|
||||
只要用户输入包含以下情况:
|
||||
- 表达设计需求
|
||||
|
||||
Reference in New Issue
Block a user