AGC 工具错误诊断丢失 clientTurnId,余额不足与参数错误被统一标为可重试 #554

Closed
opened 2026-09-30 15:53:45 +08:00 by lhk229 · 1 comment
Member

问题

内置工具错误持久化时固定传入 clientTurnId=None,并将预算相关三类之外的错误几乎全部标为 retryable=true。并发排障失去回合关联;余额不足、非法参数等在条件不变时不会恢复的错误也呈现为可重试。

跨项目证据

  • RescueGirl 的 42 份 agc-tools 错误全部缺 clientTurnId、全部 retryable=true,包括 timeoutSeconds 超限、重复路径、受保护路径、500 项限制。
  • 心情花园四季记-r2/.agent/runtime/errors/error-1790743232098516700-11.json:npm install 被验证工具 allowlist 拒绝,仍为 retryable=true;对应 canonical 第 30–31 行具有调用身份。
  • 策划项目 d359afb3-r22 的 error-1790673149984864400-1.json、error-1790673152554337500-2.json:明确「泥点余额不足」,但仍为 tool-error/retryable=true/clientTurnId=null。tool-calls.jsonl:34、35 可关联原回合。

没有证据表明这些样本因 retryable 字段触发自动重试风暴;本项是确定的诊断与恢复分类缺陷,不虚构重复扣费。

当前代码

agent/direct_tool_bridge.rs:3103 至第 3134 行:只有三个预算/互斥相关 code 单独分类;第 3119 行传 None,第 3123–3128 行计算宽泛 retryable,metadata 仅保存 tool。

agent/direct_turn_error.rs:736 附近已有余额等分类,可核对并复用现有语义,避免新增另一套不一致规则。

验收

  • 有 Direct 回合身份的内置调用,错误记录能精确关联原 clientTurnId 与调用;不能把迟到结果归到新活动回合。
  • 外部独立调用没有 Direct 身份时保持未知,不伪造 turnId。
  • 确定性参数拒绝、余额不足、权限/身份错误与真正瞬态失败使用可解释的分类和恢复语义。
  • 不凭文字宽泛匹配就原样重放付费操作;保留结果未知与终态失败边界。
  • 覆盖并发回合、迟到回包、余额不足与非法参数的持久化回归。

核查范围

2026-09-30 对九份项目导出做只读审计,代码基线 3540c5660fd294b70e054810b5384a2855908df5。本 Issue 仅登记问题,尚未实施修复。未重放项目付费操作,不提交原始会话、凭据或本地私密绝对路径。已排除 #529、#525、#518;偶发 Provider/网络错误不作为新增缺陷。

## 问题 内置工具错误持久化时固定传入 clientTurnId=None,并将预算相关三类之外的错误几乎全部标为 retryable=true。并发排障失去回合关联;余额不足、非法参数等在条件不变时不会恢复的错误也呈现为可重试。 ## 跨项目证据 - RescueGirl 的 42 份 agc-tools 错误全部缺 clientTurnId、全部 retryable=true,包括 timeoutSeconds 超限、重复路径、受保护路径、500 项限制。 - `心情花园四季记-r2/.agent/runtime/errors/error-1790743232098516700-11.json`:npm install 被验证工具 allowlist 拒绝,仍为 retryable=true;对应 canonical 第 30–31 行具有调用身份。 - `策划项目 d359afb3-r22` 的 `error-1790673149984864400-1.json`、`error-1790673152554337500-2.json`:明确「泥点余额不足」,但仍为 tool-error/retryable=true/clientTurnId=null。`tool-calls.jsonl:34、35` 可关联原回合。 没有证据表明这些样本因 retryable 字段触发自动重试风暴;本项是确定的诊断与恢复分类缺陷,不虚构重复扣费。 ## 当前代码 [`agent/direct_tool_bridge.rs:3103`](https://git.genarrative.world/git/GenarrativeAI/Genarrative/src/commit/3540c5660fd294b70e054810b5384a2855908df5/apps/ai-game-creator-shell/src-tauri/src/agent/direct_tool_bridge.rs#L3103) 至第 3134 行:只有三个预算/互斥相关 code 单独分类;第 3119 行传 None,第 3123–3128 行计算宽泛 retryable,metadata 仅保存 tool。 [`agent/direct_turn_error.rs:736`](https://git.genarrative.world/git/GenarrativeAI/Genarrative/src/commit/3540c5660fd294b70e054810b5384a2855908df5/apps/ai-game-creator-shell/src-tauri/src/agent/direct_turn_error.rs#L736) 附近已有余额等分类,可核对并复用现有语义,避免新增另一套不一致规则。 ## 验收 - [ ] 有 Direct 回合身份的内置调用,错误记录能精确关联原 clientTurnId 与调用;不能把迟到结果归到新活动回合。 - [ ] 外部独立调用没有 Direct 身份时保持未知,不伪造 turnId。 - [ ] 确定性参数拒绝、余额不足、权限/身份错误与真正瞬态失败使用可解释的分类和恢复语义。 - [ ] 不凭文字宽泛匹配就原样重放付费操作;保留结果未知与终态失败边界。 - [ ] 覆盖并发回合、迟到回包、余额不足与非法参数的持久化回归。 ## 核查范围 2026-09-30 对九份项目导出做只读审计,代码基线 `3540c5660fd294b70e054810b5384a2855908df5`。本 Issue 仅登记问题,尚未实施修复。未重放项目付费操作,不提交原始会话、凭据或本地私密绝对路径。已排除 #529、#525、#518;偶发 Provider/网络错误不作为新增缺陷。
lhk229 added the
Priority
Medium
3
Kind/Bug
labels 2026-09-30 15:53:45 +08:00
k88936 self-assigned this 2026-09-30 16:07:24 +08:00
Member

2. 谁在用 retryable

  • 落盘:sidecar .agent/runtime/errors/<eventId>.json + AppData 应用日志身份行 retryable=true|false(runtime_error.rs:184)。
  • 上传:报告包只带应用日志(main.rs:1730-1755 的 read_diagnostic_logs 读 diagnostics/application.log 等三个文件)。项目内 sidecar 不进报告包。
  • 界面文案:只有一条通道真的用到了它——direct_runtime/mod.rs:2026-2029 把同一个值拼进 direct-codex-failure:v2 … retryable=… summary=…,前端 agent-runtime/model.ts:904-965 用正则解析这段文案,retryable === 'true' 时在失败句尾追加「(可直接重试)」。
  • 行为决策:没有。没有任何代码回读这个字段来重试:AgentRuntimeErrorEvent 虽然派生了 Deserialize,但全仓无人反序列化;read_agent_runtime_error_detail 已删除;scripts/ 和 tools/ 也不读 .agent/runtime/errors。真正的重试判断各自独立实现(runtime_protocol/provider_retry.rs、project_snapshot/transport.rs:32、project/write_lock.rs:518)。

emm 换成更具体的报错呢??(比如请充值) 或者在每个tool那返回面向llm的报错信息???

> ## 2\. 谁在用 retryable > > - **落盘**:sidecar `.agent/runtime/errors/<eventId>.json` \+ AppData 应用日志身份行 `retryable=true|false`(`runtime_error.rs:184`)。 > - **上传**:报告包只带应用日志(`main.rs:1730-1755` 的 `read_diagnostic_logs` 读 `diagnostics/application.log` 等三个文件)。项目内 sidecar **不进报告包**。 > - **界面文案**:只有一条通道真的用到了它——`direct_runtime/mod.rs:2026-2029` 把同一个值拼进 `direct-codex-failure:v2 … retryable=… summary=…`,前端 `agent-runtime/model.ts:904-965` 用正则解析这段文案,`retryable === 'true'` 时在失败句尾追加「(可直接重试)」。 > - **行为决策:没有**。没有任何代码回读这个字段来重试:`AgentRuntimeErrorEvent` 虽然派生了 `Deserialize`,但全仓无人反序列化;`read_agent_runtime_error_detail` 已删除;`scripts/` 和 `tools/` 也不读 `.agent/runtime/errors`。真正的重试判断各自独立实现(`runtime_protocol/provider_retry.rs`、`project_snapshot/transport.rs:32`、`project/write_lock.rs:518`)。 emm 换成更具体的报错呢??(比如请充值) 或者在每个tool那返回面向llm的报错信息???
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: GenarrativeAI/Genarrative#554