放弃使用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 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.mongodb import MongoDBSaver
|
||||||
from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer
|
from langgraph.checkpoint.serde.jsonplus import JsonPlusSerializer
|
||||||
|
from langgraph.prebuilt.tool_node import ToolCallRequest
|
||||||
from langgraph.store.memory import InMemoryStore
|
from langgraph.store.memory import InMemoryStore
|
||||||
|
from langgraph.types import Command
|
||||||
from pymongo import MongoClient
|
from pymongo import MongoClient
|
||||||
|
|
||||||
from src.core.config import MONGO_URI
|
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.researcher import build_researcher_subagent
|
||||||
from src.server.deep_agent.agents.user_profile import user_profile_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_llm import build_main_llm
|
||||||
from src.server.deep_agent.init_prompt import build_system_prompt
|
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
|
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)
|
client = MongoClient(MONGO_URI)
|
||||||
checkpointer = MongoDBSaver(
|
checkpointer = MongoDBSaver(
|
||||||
client=client["furniture_agent_db"],
|
client=client["furniture_agent_db"],
|
||||||
@@ -23,22 +29,48 @@ checkpointer = MongoDBSaver(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class CanvasMiddleware:
|
@wrap_tool_call
|
||||||
def before_agent(self, state, agent_input, **kwargs):
|
async def report_control(
|
||||||
canvas = state.get("canvas", {})
|
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"""
|
print(f"Executing tool: {tool_name}")
|
||||||
当前画布状态:
|
# print(f"Arguments: {args}") # 可以注释掉,生产环境日志太多
|
||||||
- image_path: {canvas.get("image_path")}
|
|
||||||
- 是否已有图片: {bool(canvas.get("image_path"))}
|
|
||||||
"""
|
|
||||||
|
|
||||||
agent_input["messages"].append({
|
if tool_name == "task":
|
||||||
"role": "system",
|
# 更安全的判断方式(兼容不同字段名)
|
||||||
"content": info
|
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):
|
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, # 重要:關掉虛擬模式 → 真的寫硬碟
|
virtual_mode=True, # 重要:關掉虛擬模式 → 真的寫硬碟
|
||||||
),
|
),
|
||||||
middleware=[
|
middleware=[
|
||||||
|
report_control,
|
||||||
SummarizationMiddleware(
|
SummarizationMiddleware(
|
||||||
model=build_main_llm(enable_thinking=enable_thinking),
|
model=build_main_llm(enable_thinking=enable_thinking),
|
||||||
trigger=("tokens", 3000),
|
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):
|
def build_system_prompt(use_report):
|
||||||
system_prompt = f"""
|
system_prompt = f"""
|
||||||
你是主调度 Agent(Supervisor),负责理解用户意图并选择合适的子Agent。
|
你是主调度 Agent(Supervisor),负责理解用户意图并选择合适的子Agent。
|
||||||
当前参数:
|
|
||||||
use_report = {use_report}
|
|
||||||
系统中存在两个相关子Agent:
|
系统中存在两个相关子Agent:
|
||||||
1. user_profile_subagent
|
1. user_profile_subagent
|
||||||
负责收集和维护用户画像信息,包括但不限于:
|
负责收集和维护用户画像信息,包括但不限于:
|
||||||
@@ -141,14 +139,6 @@ def build_system_prompt(use_report):
|
|||||||
如果用户画像信息已经完整:
|
如果用户画像信息已经完整:
|
||||||
→ 调用 research-subagent 生成报告。
|
→ 调用 research-subagent 生成报告。
|
||||||
------------------------
|
------------------------
|
||||||
【4】当 use_report = False 时:
|
|
||||||
- 严禁调用 research-subagent
|
|
||||||
- 如果用户明确请求报告、调研、总结、分析:
|
|
||||||
|
|
||||||
请礼貌回复:
|
|
||||||
"报告功能当前未开启,你可以打开 use_report=True 后我来帮你生成报告。"
|
|
||||||
- 其他普通问题可以正常回答或调用其他子Agent。
|
|
||||||
------------------------
|
|
||||||
【5】用户画像优先级规则
|
【5】用户画像优先级规则
|
||||||
只要用户输入包含以下情况:
|
只要用户输入包含以下情况:
|
||||||
- 表达设计需求
|
- 表达设计需求
|
||||||
|
|||||||
Reference in New Issue
Block a user