新增画布对话助手

This commit is contained in:
zcr
2026-04-01 15:41:27 +08:00
parent 0890241cb1
commit 3f34bb005c
5 changed files with 228 additions and 0 deletions

121
src/routers/canvas_assistant.py Executable file
View File

@@ -0,0 +1,121 @@
import json
import logging
from typing import AsyncGenerator
import uuid
from fastapi import APIRouter
from starlette.responses import StreamingResponse
from src.schemas.canvas_assistant import TriggerRequest
from src.server.canvas_assistant.graph import graph
router = APIRouter(prefix="/canvas", tags=["Furniture Canvas assistant"])
logger = logging.getLogger(__name__)
async def stream_fiphant(req: TriggerRequest) -> AsyncGenerator[str, None]:
thread_id = f"canvas_{str(uuid.uuid4())}"
config = {"configurable": {"thread_id": thread_id}}
input_state = {
"messages": [],
"trigger": req.tool_name if req.action == "tool_trigger" else None,
"language": req.language,
"is_first_enter": req.action == "enter_canvas"
}
yield f"data: {json.dumps({'thread_id': thread_id, 'status': 'start'}, ensure_ascii=False)}\n\n"
async for event in graph.astream(input_state, config, stream_mode="messages", version="v2"):
if event["type"] == "messages":
msg, metadata = event["data"]
payload_out = {
"node": metadata.get("langgraph_node", "unknown"),
"is_delta": True,
"content": msg.content,
"type": "text"
}
yield f"data: {json.dumps(payload_out, ensure_ascii=False)}\n\n"
yield f"data: {json.dumps({'status': 'end'}, ensure_ascii=False)}\n\n"
@router.post("/assistant")
async def canvas_assistant(req: TriggerRequest):
"""
### 接口说明
触发 Fiphant 设计助手返回消息。
支持两种场景:
- 用户进入画布时,自动返回欢迎引导语
- 用户点击画布中的工具按钮时,返回对应工具的使用说明
### 参数说明:
- **action**: 操作类型(必填)
- `enter_canvas`: 用户进入画布时调用(返回欢迎语)
- `tool_trigger`: 用户点击工具按钮时调用(返回工具说明)
- **tool_name**: 工具名称(当 action 为 tool_trigger 时必填)
支持以下值:
- `to_real_style`
- `surface_edit_canvas`
- `surface_edit_ai`
- `color_palette`
- `scene_composition`
- `3d_model`
- `to_3d_view`
- **language**: 返回语言(非必填,默认 zh
- `zh`: 中文
- `en`: 英文
### 请求体示例:
**1. 进入画布时调用**
```json
{
"action": "enter_canvas",
"language": "zh"
}
```
2. 点击工具时调用(推荐)
```JSON
{
"action": "tool_trigger",
"tool_name": "3d_model",
"language": "zh"
}
```
3. 点击工具 - 英文版
```JSON
{
"action": "tool_trigger",
"tool_name": "scene_composition",
"language": "en"
}
```
输出说明:
返回 Server-Sent Events (SSE) 流式响应,文字会逐句出现,提升用户体验。
流式输出示例(实际返回内容):
消息开始结束:
```json
{
"thread_id": "canvas_be76cb75-18ef-4e84-8e30-5d36aef5b83a",
"status": "start"
}
{
"status": "end"
}
```
正文消息:
```json
{
"node": "assistant",
"is_delta": true,
"content": "Hi我是你的设计助手 Fiphant 👋 我来帮你快速上手这个画布。我给你准备了两个起点——你可以用 To Real Style 直接把草图变成效果图,也可以先用 Surface Edit 换个材质或贴上印花。有了产品图之后,我们再一起配色、配场景、看 3D 效果,最后导出三视图就完成了。我建议先从 To Real Style 开始,看看整体感觉 ✨",
"type": "text"
}
```
"""
return StreamingResponse(stream_fiphant(req), media_type="text/event-stream")