Appearance
WebSocket 测试场景
WS-CONN: 连接管理
WS-CONN-01: 正常连接与断开
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 建立 WebSocket 连接 | 连接成功,开始收到消息 |
| 2 | 进行正常对话 | 消息正常收发 |
| 3 | 关闭 WebSocket | 连接正常关闭 |
| 4 | 重新建立连接 | 连接成功 |
WS-CONN-02: 断线重连消息同步
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 连接 WS 并发起补全 | 开始收到流式响应 |
| 2 | 在流式过程中断开连接 | — |
| 3 | 立即重新连接 | 收到断线期间缓存的消息 |
| 4 | 等待补全完成 | 收到 completion_done |
WS-CONN-03: 并发连接互斥
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 客户端 A 连接对话 X | 成功 |
| 2 | 客户端 B 连接对话 X | Close Code 4009 |
| 3 | 客户端 A 断开 | — |
| 4 | 客户端 B 重试连接对话 X | 成功 |
WS-CONN-04: 跨资源独立性
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 连接对话 A | 成功 |
| 2 | 同时连接对话 B | 成功(不同资源不互斥) |
WS-STREAM: 流式补全
WS-STREAM-01: 完整流式序列
验证服务端消息的正确时序:
request_completion 发送后预期收到:
1. completion_init
2. [llm_thinking_chunk...] (如果 reasoning 模式)
3. [llm_text_chunk...]
4. [llm_text_sentence...]
5. assistant_message_complete
6. completion_done| 检查项 | 预期 |
|---|---|
| completion_init 是首条消息 | 是 |
| text_chunk 拼接 = assistant_message_complete.content | 是 |
| text_sentence 不遗漏文字 | 是(所有句子拼接 = 完整文本) |
| finish_reason 合理 | stop / tool_calls / length |
WS-STREAM-02: 停止后的消息终止
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 请求补全 | 开始收到 chunk |
| 2 | 在流式过程中发送 stop_completion | — |
| 3 | 观察后续消息 | 收到 stop_completion 消息后不再有新 chunk |
| 4 | stop_completion 包含 partial_text | 是(已生成的部分) |
WS-STREAM-03: request_id 追踪
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 发送 append_message (request_id="req-1") | message_appended.request_id = "req-1" |
| 2 | 发送 request_completion (request_id="req-2") | 所有输出消息的 request_id = "req-2" |
WS-TOOL: 工具调用测试
WS-TOOL-01: 工具调用 chunk 累积
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 触发工具调用 | 收到 tool_call_chunk 序列 |
| 2 | 验证第一个 chunk | 包含 id 和 function.name |
| 3 | 验证后续 chunk | id=null,function.arguments 递增 |
| 4 | 拼接所有 arguments | 得到合法 JSON |
WS-TOOL-02: 确认超时
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 触发需确认的工具调用 | 收到 pending 状态 |
| 2 | 长时间不响应(如 5 分钟) | — |
| 3 | 之后发送 accept | 应正常处理 |
| 4 | 之后发送 request_completion | 应正常执行工具 |
WS-TOOL-03: 多工具混合确认
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 触发同时调用搜索+画布操作的消息 | — |
| 2 | 请求补全 | 搜索工具立即执行,画布操作为 pending |
| 3 | 收到搜索工具的 tool_call 结果 | 有结果 |
| 4 | assistant_message_complete | tool_calls 中两个工具状态不同 |
| 5 | 确认画布操作 | tool_confirmation_processed |
| 6 | request_completion | 画布操作执行 |
WS-TOOL-04: AskUser 工具交互
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 触发 AI 调用 AskUserFunction | — |
| 2 | 请求补全 | 收到 tool_call (confirmation_state=awaiting_input) |
| 3 | 收到 completion_done (finish_reason=tool_calls) | 补全暂停 |
| 4 | 发送 append_message (role=tool, tool_call_id=...) | message_appended |
| 5 | 发送 request_completion | AI 基于用户回答继续 |
WS-PROJECT: 项目 WebSocket
WS-PROJECT-01: 域隔离
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 连接项目 WS | 成功 |
| 2 | 发送 canvas 域消息 | 画布操作成功 |
| 3 | 发送 conversation 域消息 | 对话操作成功 |
| 4 | 画布域错误 | 不影响对话域 |
WS-PROJECT-02: 画布批量操作
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 批量创建 3 个节点 + 2 条边(使用 temp_id) | 成功 |
| 2 | 验证 temp_id_mapping | temp_id 正确映射为 UUID |
| 3 | 验证边的 source/target | 引用的 temp_id 正确替换 |
WS-PROJECT-03: 批量操作原子性
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 批量创建中包含一个无效节点 | — |
| 2 | 验证响应 | success=false |
| 3 | 查询画布节点 | 无新节点(全部回滚) |
WS-ERROR: 错误恢复
WS-ERROR-01: AI 服务超时后恢复
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 请求补全 | — |
| 2 | AI 服务超时 | 收到 error (llm_timeout) |
| 3 | 再次请求补全 | 正常工作 |
WS-ERROR-02: 错误后对话状态一致
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 请求补全 | — |
| 2 | 补全过程中发生错误 | 收到 error + completion_done |
| 3 | 通过 REST API 查看对话 | 对话状态正常,消息历史一致 |
| 4 | 重新请求补全 | 正常工作 |
WS-ERROR-03: 快速连续操作
| 步骤 | 操作 | 预期结果 |
|---|---|---|
| 1 | 快速连续发送 10 条消息 | 收到 10 个 message_appended 或 rate_limited |
| 2 | 快速连续请求 3 次补全 | 第一次执行,后续排队或报错 |
| 3 | 验证最终状态 | 消息历史完整,无数据丢失 |