|
|
@@ -44,6 +44,17 @@
|
|
|
|
|
|
`POST /session/{id}/greeting` 必须幂等:若该 session `round=1` 已存在 `role='ai'` 消息,直接返回已有内容,不重复落库、不重复调 LLM。这让前端重试 100% 安全。
|
|
|
|
|
|
+### 2.4 重试原则:全部 user-triggered,失败即回到可点状态
|
|
|
+
|
|
|
+设计里**不引入任何自动重试机制**(无 setTimeout、无指数退避、无 onError 自动重连)。所有失败的处理一律遵循:
|
|
|
+
|
|
|
+- **不自动重发请求**
|
|
|
+- 失败后 UI 回到"失败前状态 + 一个明确可点击的重试入口",用户再次点击才触发请求
|
|
|
+- 对 session 创建:失败入口 = Ready 页"开始对话"按钮本身
|
|
|
+- 对 greeting / 对话中 AI / 学生消息:失败入口 = 消息上的 error-card"重新生成"/"重试"按钮
|
|
|
+
|
|
|
+之所以 greeting 失败是"把 loading 消息直接改成 error-card"而不是"完全移除 loading,什么都不显示",是为了让重试入口有明确的点击目标 —— 完全清空会让用户无法感知失败位置。从交互语义上,error-card 可视为 typing-bubble 的等价替代态,**仍符合"回到失败前状态"** 的原则。
|
|
|
+
|
|
|
---
|
|
|
|
|
|
## 3. API 契约变化
|