Skip to content

[Bug] 工具调用超时后标记为 unknown 导致无法重试 - Tool timeout blocks retry #835

Description

@Clawiee

🐛 Bug: 工具调用超时后标记为 unknown 导致无法重试

Tags: bug, tool-execution, ux


Description

当工具调用(如 generate_image_openai)调用外部 API 发生读取超时时,系统会将其结果标记为 unknown 以防止重复扣费。但这个设计导致了一个严重问题:一旦结果被标记为 unknown,用户将无法重试,整个任务被迫中断

Steps to Reproduce

  1. 使用 generate_image_openai 工具生成图片
  2. OpenAI API 响应超时(ReadTimeout)
  3. 系统日志显示:[GenerateImage] Unclassified provider boundary error for openai: ReadTimeout
  4. 工具结果被标记为 unknown
  5. 用户尝试重试,收到错误:A prior tool outcome is unknown and requires confirmation.
  6. 任务无法继续

Expected Behavior

用户在确认超时的请求没有产生副作用(如未扣费)后,应该能够:

  1. 手动确认并重试该工具调用
  2. 或系统提供"重新尝试"按钮让用户选择

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: 用户反馈

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions