新增画布对话助手
This commit is contained in:
121
src/routers/canvas_assistant.py
Executable file
121
src/routers/canvas_assistant.py
Executable 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")
|
||||
Reference in New Issue
Block a user