feat 增加推荐对话可控参数
This commit is contained in:
@@ -25,6 +25,8 @@ async def chat_stream(request: ChatRequest):
|
|||||||
* `message`: 用户的设计意图(如:'我想设计一个极简风格的橡木办公桌')。
|
* `message`: 用户的设计意图(如:'我想设计一个极简风格的橡木办公桌')。
|
||||||
* `thread_id`: (可选) 现有项目的唯一标识。若不传,系统将自动分配并返回。
|
* `thread_id`: (可选) 现有项目的唯一标识。若不传,系统将自动分配并返回。
|
||||||
* `checkpoint_id`: (可选) 历史快照 ID。
|
* `checkpoint_id`: (可选) 历史快照 ID。
|
||||||
|
* `config_params`: (可选) 对话配置参数
|
||||||
|
* `require_suggestion`: (可选) 是否需要建议按钮
|
||||||
|
|
||||||
#### 3. 响应流说明 (Data Format)
|
#### 3. 响应流说明 (Data Format)
|
||||||
响应以 `data: ` 开头的 JSON 字符串流形式发送:
|
响应以 `data: ` 开头的 JSON 字符串流形式发送:
|
||||||
@@ -122,7 +124,10 @@ async def chat_stream(request: ChatRequest):
|
|||||||
# )
|
# )
|
||||||
# new_messages.append(force_instruction)
|
# new_messages.append(force_instruction)
|
||||||
|
|
||||||
input_data = {"messages": new_messages}
|
input_data = {
|
||||||
|
"messages": new_messages,
|
||||||
|
"require_suggestion": request.need_suggestion # 初始由前端决定
|
||||||
|
}
|
||||||
|
|
||||||
async for event in app.astream(
|
async for event in app.astream(
|
||||||
input_data,
|
input_data,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class ChatRequest(BaseModel):
|
|||||||
thread_id: Optional[str] = Field(None, description="会话线程ID,不传则开启新会话")
|
thread_id: Optional[str] = Field(None, description="会话线程ID,不传则开启新会话")
|
||||||
checkpoint_id: Optional[str] = Field(None, description="回溯点的ID,用于从历史点开启新对话")
|
checkpoint_id: Optional[str] = Field(None, description="回溯点的ID,用于从历史点开启新对话")
|
||||||
config_params: Optional[AgentConfig] = None
|
config_params: Optional[AgentConfig] = None
|
||||||
# force_sketch: bool = False # 新增:是否强制绘图
|
need_suggestion: bool = False
|
||||||
|
|
||||||
|
|
||||||
class HistoryItem(BaseModel):
|
class HistoryItem(BaseModel):
|
||||||
|
|||||||
@@ -42,9 +42,10 @@ async def designer_node(state: AgentState, config: RunnableConfig):
|
|||||||
system_text = get_agent_prompt("designer")
|
system_text = get_agent_prompt("designer")
|
||||||
|
|
||||||
system_prompt = SystemMessage(content=system_text)
|
system_prompt = SystemMessage(content=system_text)
|
||||||
|
should_suggest = len(state["messages"]) % 5 == 0
|
||||||
# 改为异步调用 ainvoke
|
# 改为异步调用 ainvoke
|
||||||
response = await model.ainvoke([system_prompt] + messages)
|
response = await model.ainvoke([system_prompt] + messages)
|
||||||
return {"messages": [response]}
|
return {"messages": [response], "require_suggestion": should_suggest}
|
||||||
|
|
||||||
|
|
||||||
# --- 2. Researcher Agent (情报专家) ---
|
# --- 2. Researcher Agent (情报专家) ---
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ from langgraph.checkpoint.mongodb import MongoDBSaver
|
|||||||
# 定义路由的输出结构,强制 LLM 选择一个
|
# 定义路由的输出结构,强制 LLM 选择一个
|
||||||
class RouteResponse(BaseModel):
|
class RouteResponse(BaseModel):
|
||||||
# 将 FINISH 替换或增加 Suggester
|
# 将 FINISH 替换或增加 Suggester
|
||||||
next: Literal["Designer", "Researcher", "Visualizer", "Suggester"]
|
next: Literal["Designer", "Researcher", "Visualizer", "Suggester", "FINISH"]
|
||||||
|
|
||||||
|
|
||||||
creds = service_account.Credentials.from_service_account_file(
|
creds = service_account.Credentials.from_service_account_file(
|
||||||
@@ -42,7 +42,13 @@ def supervisor_node(state: AgentState):
|
|||||||
# --- 拦截逻辑修改 ---
|
# --- 拦截逻辑修改 ---
|
||||||
# 如果专家已经回复完了(AIMessage 且无工具调用),则交给 Suggester 生成按钮
|
# 如果专家已经回复完了(AIMessage 且无工具调用),则交给 Suggester 生成按钮
|
||||||
if isinstance(last_message, AIMessage) and not last_message.tool_calls:
|
if isinstance(last_message, AIMessage) and not last_message.tool_calls:
|
||||||
return {"next": "Suggester"}
|
should_go_to_suggester = state.get("require_suggestion", False)
|
||||||
|
|
||||||
|
# 如果符合建议条件
|
||||||
|
if should_go_to_suggester:
|
||||||
|
return {"next": "Suggester"}
|
||||||
|
else:
|
||||||
|
return {"next": "FINISH"}
|
||||||
|
|
||||||
system_prompt = """你是家具设计主管。分配任务给专家:
|
system_prompt = """你是家具设计主管。分配任务给专家:
|
||||||
- Designer: 设计建议、参数细化。
|
- Designer: 设计建议、参数细化。
|
||||||
@@ -74,7 +80,8 @@ workflow.add_conditional_edges(
|
|||||||
"Designer": "Designer",
|
"Designer": "Designer",
|
||||||
"Researcher": "Researcher",
|
"Researcher": "Researcher",
|
||||||
"Visualizer": "Visualizer",
|
"Visualizer": "Visualizer",
|
||||||
"Suggester": "Suggester" # 原本的 FINISH 现在指向 Suggester
|
"Suggester": "Suggester", # 原本的 FINISH 现在指向 Suggester
|
||||||
|
"FINISH": END # 直接结束,不给建议
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -82,8 +89,7 @@ workflow.add_conditional_edges(
|
|||||||
workflow.add_edge("Designer", "Supervisor")
|
workflow.add_edge("Designer", "Supervisor")
|
||||||
workflow.add_edge("Researcher", "Supervisor")
|
workflow.add_edge("Researcher", "Supervisor")
|
||||||
workflow.add_edge("Visualizer", "Supervisor")
|
workflow.add_edge("Visualizer", "Supervisor")
|
||||||
|
# 重点:Suggester 可以是整个流程的终点
|
||||||
# 重点:Suggester 是整个流程的终点
|
|
||||||
workflow.add_edge("Suggester", END)
|
workflow.add_edge("Suggester", END)
|
||||||
|
|
||||||
client = MongoClient(MONGO_URI)
|
client = MongoClient(MONGO_URI)
|
||||||
|
|||||||
@@ -6,4 +6,5 @@ class AgentState(TypedDict):
|
|||||||
# messages 存储完整的对话历史,operator.add 表示新消息是追加而不是覆盖
|
# messages 存储完整的对话历史,operator.add 表示新消息是追加而不是覆盖
|
||||||
messages: Annotated[Sequence[BaseMessage], operator.add]
|
messages: Annotated[Sequence[BaseMessage], operator.add]
|
||||||
# next 存储 Supervisor 决定的下一步是谁
|
# next 存储 Supervisor 决定的下一步是谁
|
||||||
next: str
|
next: str
|
||||||
|
require_suggestion: bool # 是否需要建议按钮
|
||||||
Reference in New Issue
Block a user