feat 1.增加 建议词 机制 2.对话生图实现
This commit is contained in:
@@ -10,14 +10,15 @@ from pymongo import MongoClient
|
||||
|
||||
from src.core.config import settings, MONGO_URI
|
||||
from src.server.agent.state import AgentState
|
||||
from src.server.agent.agents import designer_node, researcher_node, visualizer_node
|
||||
from src.server.agent.agents import designer_node, researcher_node, visualizer_node, suggester_node
|
||||
from langgraph.checkpoint.mongodb import MongoDBSaver
|
||||
|
||||
|
||||
# --- Supervisor (路由逻辑) ---
|
||||
# 定义路由的输出结构,强制 LLM 选择一个
|
||||
class RouteResponse(BaseModel):
|
||||
next: Literal["Designer", "Researcher", "Visualizer", "FINISH"]
|
||||
# 将 FINISH 替换或增加 Suggester
|
||||
next: Literal["Designer", "Researcher", "Visualizer", "Suggester"]
|
||||
|
||||
|
||||
creds = service_account.Credentials.from_service_account_file(
|
||||
@@ -34,30 +35,23 @@ llm_supervisor = ChatGoogleGenerativeAI(
|
||||
def supervisor_node(state: AgentState):
|
||||
messages = state["messages"]
|
||||
if not messages:
|
||||
return {"next": "FINISH"}
|
||||
return {"next": "Suggester"}
|
||||
|
||||
last_message = messages[-1]
|
||||
|
||||
# --- 改进的拦截逻辑 ---
|
||||
# 如果最后一条消息是 AI 产生的(且没有调用工具),说明专家已经回复完了用户
|
||||
# 此时我们才拦截并结束,否则会导致专家没机会说话
|
||||
# --- 拦截逻辑修改 ---
|
||||
# 如果专家已经回复完了(AIMessage 且无工具调用),则交给 Suggester 生成按钮
|
||||
if isinstance(last_message, AIMessage) and not last_message.tool_calls:
|
||||
return {"next": "FINISH"}
|
||||
return {"next": "Suggester"}
|
||||
|
||||
# 如果最后一条是 HumanMessage,说明用户刚说完,Supervisor 必须派发任务
|
||||
system_prompt = """
|
||||
你是家具设计团队的主管(Supervisor)。
|
||||
请根据用户的意图,选择最合适的专家:
|
||||
- Designer: 设计建议、参数细化、闲聊、问候。
|
||||
- Visualizer: 绘图、看草图。
|
||||
- Researcher: 市场报告、趋势。
|
||||
|
||||
只需输出专家名称。
|
||||
system_prompt = """你是家具设计主管。分配任务给专家:
|
||||
- Designer: 设计建议、参数细化。
|
||||
- Visualizer: 绘图需求。
|
||||
- Researcher: 市场报告。
|
||||
"""
|
||||
|
||||
chain = llm_supervisor.with_structured_output(RouteResponse)
|
||||
decision = chain.invoke([{"role": "system", "content": system_prompt}] + messages)
|
||||
|
||||
return {"next": decision.next}
|
||||
|
||||
|
||||
@@ -68,10 +62,11 @@ workflow.add_node("Supervisor", supervisor_node)
|
||||
workflow.add_node("Designer", designer_node)
|
||||
workflow.add_node("Researcher", researcher_node)
|
||||
workflow.add_node("Visualizer", visualizer_node)
|
||||
workflow.add_node("Suggester", suggester_node) # 新增节点
|
||||
|
||||
workflow.add_edge(START, "Supervisor")
|
||||
|
||||
# 这里的逻辑是关键:Supervisor 决定去向
|
||||
# 修改条件边映射
|
||||
workflow.add_conditional_edges(
|
||||
"Supervisor",
|
||||
lambda state: state["next"],
|
||||
@@ -79,16 +74,18 @@ workflow.add_conditional_edges(
|
||||
"Designer": "Designer",
|
||||
"Researcher": "Researcher",
|
||||
"Visualizer": "Visualizer",
|
||||
"FINISH": END
|
||||
"Suggester": "Suggester" # 原本的 FINISH 现在指向 Suggester
|
||||
}
|
||||
)
|
||||
|
||||
# 重点修改:专家执行完后,必须回到 Supervisor 进行状态检查
|
||||
# 如果 Supervisor 发现专家刚说完话,它会触发上面的逻辑返回 FINISH
|
||||
# 专家执行完依然回到 Supervisor
|
||||
workflow.add_edge("Designer", "Supervisor")
|
||||
workflow.add_edge("Researcher", "Supervisor")
|
||||
workflow.add_edge("Visualizer", "Supervisor")
|
||||
|
||||
# 重点:Suggester 是整个流程的终点
|
||||
workflow.add_edge("Suggester", END)
|
||||
|
||||
client = MongoClient(MONGO_URI)
|
||||
checkpointer = MongoDBSaver(
|
||||
client=client["furniture_agent_db"],
|
||||
|
||||
Reference in New Issue
Block a user