🐛 Bug: 工具调用超时后标记为 unknown 导致无法重试
Tags: bug, tool-execution, ux
Description
当工具调用(如 generate_image_openai)调用外部 API 发生读取超时时,系统会将其结果标记为 unknown 以防止重复扣费。但这个设计导致了一个严重问题:一旦结果被标记为 unknown,用户将无法重试,整个任务被迫中断。
Steps to Reproduce
- 使用
generate_image_openai 工具生成图片
- OpenAI API 响应超时(ReadTimeout)
- 系统日志显示:
[GenerateImage] Unclassified provider boundary error for openai: ReadTimeout
- 工具结果被标记为
unknown
- 用户尝试重试,收到错误:
A prior tool outcome is unknown and requires confirmation.
- 任务无法继续
Expected Behavior
用户在确认超时的请求没有产生副作用(如未扣费)后,应该能够:
- 手动确认并重试该工具调用
- 或系统提供"重新尝试"按钮让用户选择
Actual Behavior
- 超时后工具状态锁定为
unknown
- 无法通过任何 UI 操作解除锁定
- 任务流程完全卡死
- 用户被迫开启新对话重新开始
Root Cause Analysis
超时(ReadTimeout)意味着:
- ✅ 请求可能已发出
- ✅ OpenAI 侧可能已收到并开始处理
- ❓ OpenAI 侧是否已扣费 → 未知
- ❓ 图片是否已生成 → 未知
当前设计将所有"未知"状态都视为"可能已扣费",导致:
- 为了安全起见,阻止重试
- 但实际上用户可能根本没被扣费,只是响应丢失了
Suggested Solutions
方案 1:超时后允许用户主动确认重试(推荐)
当工具结果为 unknown 时,显示:
⚠️ 此工具调用结果未知(可能超时)
- [ ] 我确认此调用未成功,请重新尝试
- [ ] 此调用已成功,我不重试
用户勾选确认后解除锁定,允许重试。
方案 2:引入"幂等重试"机制
- 外部 API 支持 idempotency key
- 超时时允许用相同参数重新请求
- 后端自动检测并返回已有结果
方案 3:超时监控与自动退款
- 记录超时请求的上下文
- 定期核对外部 API 的实际扣费记录
- 自动退还超时但已扣费的订单
Environment
- Platform: Clawith
- Tool:
generate_image_openai
- API: OpenAI DALL-E / Image Generation
- Error:
ReadTimeout (120s)
Logs
[GenerateImage] Unclassified provider boundary error for openai: ReadTimeout
Impact
- 用户体验:对话流程被打断,需重新开始
- 业务风险:可能存在"未扣费但任务失败"的灰色地带
- 信任度:用户对系统可靠性产生质疑
Reporter: 用户反馈
🐛 Bug: 工具调用超时后标记为 unknown 导致无法重试
Tags:
bug,tool-execution,uxDescription
当工具调用(如
generate_image_openai)调用外部 API 发生读取超时时,系统会将其结果标记为unknown以防止重复扣费。但这个设计导致了一个严重问题:一旦结果被标记为 unknown,用户将无法重试,整个任务被迫中断。Steps to Reproduce
generate_image_openai工具生成图片[GenerateImage] Unclassified provider boundary error for openai: ReadTimeoutunknownA prior tool outcome is unknown and requires confirmation.Expected Behavior
用户在确认超时的请求没有产生副作用(如未扣费)后,应该能够:
Actual Behavior
unknownRoot Cause Analysis
超时(ReadTimeout)意味着:
当前设计将所有"未知"状态都视为"可能已扣费",导致:
Suggested Solutions
方案 1:超时后允许用户主动确认重试(推荐)
用户勾选确认后解除锁定,允许重试。
方案 2:引入"幂等重试"机制
方案 3:超时监控与自动退款
Environment
generate_image_openaiReadTimeout(120s)Logs
Impact
Reporter: 用户反馈