# EasyFlow Chat Protocol Specification v1.1 * **Protocol Name:** `easyflow-chat` * **Version:** `1.1` * **Status:** Draft / Recommended * **Transport:** Server-Sent Events (SSE) * **Encoding:** UTF-8 ## 1. 设计背景与目标 本协议用于描述 **EasyFlow 对话系统中的服务端事件流通信规范**,支持: * AI 对话的 **流式输出** * 模型 **思考过程(Thinking)** * **工具调用(Tool Calling)** * **系统 / 业务错误** * **工作流 / Agent 状态** * **对话中的用户交互(表单、确认等)** * **中断与恢复(Suspend / Resume)** 设计目标: * 前后端解耦 * 协议长期可扩展 * 不绑定具体模型厂商 * 易于与 Workflow / Agent / Chain 架构集成 ## 2. 传输层规范(Transport) * 使用 HTTP + SSE(支持未来扩展为其他协议,比如 WebSocket 等) * Response Header: ```http Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive ``` * 通信方向:**Server → Client** * 所有业务数据通过 `data` 字段传输,格式为 **JSON 字符串** ## 3. SSE Event 级别规范 ### 3.1 Event Name(固定) | event | 含义 | | - |-------| | message | 正常业务事件 | | error | 错误事件 | | done | 流结束事件 | > ⚠️ **禁止在 event name 中承载业务语义** ## 4. 统一 Envelope 结构(核心) ### 4.1 基本结构 ```json { "protocol": "easyflow-chat", "version": "1.1", "domain": "llm | tool | system | business | workflow | interaction | debug", "type": "string", "conversation_id": "string", "message_id": "string", "index": 0, "payload": {}, "meta": {} } ``` ### 4.2 字段说明 | 字段 | 类型 | 必填 | 说明 | | -- |---------| -- |------------------------| | protocol | string | ✔ | 固定值 `easyflow-chat` | | version | string | ✔ | 协议版本 | | domain | string | ✔ | 事件所属领域 | | type | string | ✔ | 领域内事件类型 | | conversation_id | string | ✔ | 会话唯一标识 | | message_id | string | ✖ | assistant 消息 ID | | index | number | ✖ | 流式输出序号 | | payload | object | ✔ | 事件数据 | | meta | object | ✖ | 元信息(token、耗时等) | ## 5. Domain 定义 | Domain | 说明 | | -- | -- | | llm | 模型语义输出 | | tool | 工具调用与结果 | | system | 系统级事件 | | business | 业务规则 | | workflow | 工作流 / Agent 状态 | | interaction | 用户交互(表单等) | | debug | 调试信息 | ## 6. llm Domain ### 6.1 thinking 表示模型的思考过程。 #### 流式输出(delta) ```json { "domain": "llm", "type": "thinking", "payload": { "delta": "分析用户需求" } } ``` #### 完整输出(可选) ```json { "domain": "llm", "type": "message", "payload": { "content": "这是一个完整的回答" } } ``` ### 6.2 message #### 流式输出(delta) ```json { "domain": "llm", "type": "message", "index": 12, "payload": { "delta": "这是一个" } } ``` #### 完整输出(可选) ```json { "domain": "llm", "type": "message", "payload": { "content": "这是一个完整的回答" } } ``` ## 7. tool Domain ### 7.1 tool_call ```json { "domain": "tool", "type": "tool_call", "payload": { "tool_call_id": "call_1", "name": "search", "arguments": { "query": "SSE 协议设计" } } } ``` ### 7.2 tool_result ```json { "domain": "tool", "type": "tool_result", "payload": { "tool_call_id": "call_1", "status": "success | error", "result": {} } } ``` ## 8. system Domain ### 8.1 error ```json { "domain": "system", "type": "error", "payload": { "code": "MODEL_CONFIG_INVALID", "message": "模型配置错误", "retryable": false, "detail": {} } } ``` ### 8.2 status ```json { "domain": "system", "type": "status", "payload": { "state": "initializing | running | suspended | resumed" } } ``` ## 9. business Domain ```json { "domain": "business", "type": "error", "payload": { "code": "QUOTA_EXCEEDED", "message": "配额不足" } } ``` ## 10. workflow Domain ```json { "domain": "workflow", "type": "status", "payload": { "node_id": "node_1", "state": "start | suspend | resume | end", "reason": "interaction" } } ``` ## 11. interaction Domain(对话内交互) ### 11.1 form_request 表示请求用户填写表单,对话进入挂起状态。 ```json { "domain": "interaction", "type": "form_request", "payload": { "form_id": "user_info_form", "title": "补充信息", "description": "请填写以下信息以继续", "schema": { "type": "object", "required": ["age", "email"], "properties": { "age": { "type": "number", "title": "年龄" }, "email": { "type": "string", "title": "邮箱", "format": "email" } } }, "ui": { "submit_text": "继续", "cancel_text": "取消" } } } ``` > 表单 schema **符合 JSON Schema 标准** ### 11.2 form_cancel ```json { "domain": "interaction", "type": "form_cancel", "payload": { "form_id": "user_info_form" } } ``` ## 12. 表单提交与恢复(非 SSE) 表单提交通过 **普通 HTTP / WebSocket 请求**: ```json { "conversation_id": "conv_1", "form_id": "user_info_form", "values": { "age": 30, "email": "a@b.com" } } ``` 成功后服务端恢复 SSE 流。 ## 13. done 事件(流结束) ```json { "domain": "system", "type": "done", "meta": { "prompt_tokens": 1234, "completion_tokens": 456, "latency_ms": 2300 } } ``` ## 14. 错误处理规则 * 收到 `event: error` 后客户端应终止流 * 错误语义由: ``` domain + type + payload.code ``` 共同决定 ## 15. 状态机视角(推荐) ```text RUNNING ↓ LLM_OUTPUT ↓ INTERACTION_REQUESTED ↓ SUSPENDED ↓ FORM_SUBMITTED ↓ RESUMED ↓ RUNNING ↓ DONE ``` ## 16. 扩展与兼容规则 1. 可新增 domain 2. 可新增 type 3. 不允许删除已有字段 4. payload 可自由扩展 5. 1.x 版本保持向后兼容 ## 17. 设计原则 > * SSE 只负责事件流 > * domain 定义责任边界 > * type 定义语义动作 > * payload 定义数据结构 > * 前端不依赖 event name 判断业务,不依赖协议本身,支持其他协议的扩展