06 / 对话可靠性
React Native AI 聊天:流式回复、断线重试与扣次
把一次 AI 对话建模为带稳定编号和保存结果的服务端操作。客户端展示流式片段,用量按事先定义的完成规则结算。断线后先查询原操作,再决定是否重新生成;重复点击或恢复界面不应让同一个结果重复扣次。
消息显示状态与服务端操作状态分开
页面可能正在加载、展示片段或离线,服务端却仍在继续生成。界面要解释未知状态,而非把所有网络错误都当作生成失败。
| 操作状态 | 界面表达 | 按完整结果扣次时的用量规则 |
|---|---|---|
| 已接受 / 已预占 | 等待回复,说明取消行为。 | 预占额度,尚未最终扣除。 |
| 流式生成中 | 片段明确标记为未完成。 | 保持预占,片段不等于完整交付。 |
| 已完成并保存 | 可再次打开的完整答案。 | 按原操作编号只结算一次。 |
| 失败 | 失败说明与明确重试入口。 | 按约定规则释放预占。 |
| 断线后未知 | 正在核对原请求。 | 先核对,不能仅凭客户端状态退款或再扣一次。 |
断线恢复应该做什么
- 客户端保留待回复消息对应的操作编号。
- 重新连接时向服务端查询原操作。
- 若已完成,读取保存答案和既有用量回执。
- 若仍在运行,按支持的传输方式恢复或查询,不新建第二个操作。
- 明确失败后,再提供约定的重试;区分新尝试与重复投递。
SSE、fetch 流或其他方式取决于原生运行环境、所选库和生命周期要求,需要在目标构建上分别验证两个平台。桌面浏览器流式示例不能证明移动端断线恢复正常。
停止显示不一定停止模型成本
Stop 按钮究竟是隐藏回复、请求取消还是结束操作,需要明确。取消到达提供方之前可能已经产生 token;模型账单与用户的 App 次数是两种不同计费单位。
对部分结果、取消和断线后完成分别定义用户规则。如果只对完整保存答案扣次,取消或部分回复就不能暗中变为已完成扣次。取消与完成竞态应在服务端收敛,不能对同一预占同时释放和结算。
上下文绑定正确报告和用户
服务端先验证报告访问权限,再把指定报告版本、有边界的聊天历史和允许使用的当前偏好快照送入上下文。模型凭证留在服务端。除非另有明确必要性与说明,日志避免保存报告正文、健康信息或原始聊天文本。
用户纠正偏好后,下次操作使用新值,不能顺手改写已交付报告。具体纠正和删除边界见可编辑记忆指南。
可放进上线范围的失败验收清单
- 连续点两次发送:只产生预期的一次操作和一次结算。
- 流式回复中断线:重新进入先查询原操作。
- 杀掉并重启 App:能找回已完成答案。
- 提供方在完成前失败:余额符合约定规则。
- 取消与完成同时发生:最终结算只有一种结果。
- 生成期间登录失效:其他用户不能读取之前的答案。
- 两台设备争用最后一次额度:服务端原子预占生效。
AppBento 失败重试示例展示 6 → 6 → 5 的模拟余额。它不是生产恢复系统;实际集成需要确认上述哪些场景必须在客户环境通过。
参考资料与适用范围
以上流程与验收条件是 AppBento 的设计建议。以下官方资料用于核对平台边界;它们不代表对 AppBento 的认可,也不证明本网页演示通过了原生验收。