Skip to content

fix: 补齐工具调用的 Run Deadline、Timeout 与取消清理 - #165

Merged
rojim666 merged 1 commit into
rojim666:mainfrom
z2Ace0107:codex/issue-69-pr04-tool-timeout-cancellation
Sep 18, 2026
Merged

rojim666 merged 1 commit into
rojim666:mainfrom
z2Ace0107:codex/issue-69-pr04-tool-timeout-cancellation

Conversation

@z2Ace0107

Copy link
Copy Markdown
Contributor

Summary

关联 Issue #69。本 PR 完成 Python Agent Loop 工具调用的 Run Remaining、工具 timeout、截止时间取消、进程清理和 retry/backoff 预算边界。PR-04 是 Issue #69 的分阶段实现,只使用 Relates to #69,不在本 PR 合并时关闭父 Issue。

Behavior

  • 串行与只读并发工具调用共享同一个 Run 剩余墙钟预算;工具自身 timeout 与 Run Remaining 取更严格边界。
  • 调用开始前、并发 semaphore 排队、每次 retry 和 backoff 前检查 deadline;预算耗尽后不启动工具本体或下一次 retry。
  • 可取消工具在 Run deadline 到达后执行有界取消清理;无法确认底层操作已停止时标记 ToolExecutionState.UNKNOWN,使用 deadline_exceeded 失败分类,并禁止自动重试。
  • 合作式异步工具在清理窗口内完成取消后不会留下活动工具 task;无法合作或无法强制终止的底层操作可能在主流程返回后完成,结果仍为 UNKNOWN,不会发布迟到事件或自动重试。该边界请维护者结合 Issue [Agent Core] 任务设置了 10 秒却可能跑几分钟:为 Agent 增加真正的截止时间 #69 的不可强杀非目标确认。
  • Bash 在 Windows 先以 suspended 状态创建并绑定 Job Object,再恢复进程;清理时使用 Job Object 与 taskkill /T /F,在 POSIX 使用独立进程组;即使父进程已经返回,也继续尝试清理仍可能持有输出管道的后代进程。
  • 保持既有工具事件顺序和调度元数据,并补充 timeout/deadline 的测试说明与运行示例。

Validation

  • 目标 Python 测试:126 passed。该结果是在测试进程内临时注入缺失 Sztubuddy 模块兼容别名后取得,未写入仓库。
  • 直接运行测试未能完成 collection:ModuleNotFoundError: sztu_code.core.prompts.Sztubuddy。这是 origin/main 基线资源缺失,不是本 PR 引入;本 PR 不修改该无关基线问题。
  • 目标源文件 Ruff check:通过。
  • 目标源文件严格 mypy:通过。
  • compileall:通过。
  • git -c core.whitespace=cr-at-eol diff --check:通过。仓库已有 mixed/CRLF 行尾,未执行全仓库行尾重排。
  • 未运行 TypeScript typecheck、全量 TypeScript 测试和 build;本 PR 未修改 TypeScript、协议或构建配置。

Risk

  • 合作式工具会在有界清理窗口内完成取消;正在运行且无法确认停止的工具结果可能为 unknown,调用方应按失败处理,不重复执行可能产生副作用的操作。
  • Bash 进程树清理依赖平台进程管理能力,并设置有界清理等待;Windows Job API 不可用时降级到 taskkill /T /F;若平台无法确认清理完成,结果仍保持 unknown。
  • 当前基线的 Sztubuddy 导入缺失会阻断 Python 测试 collection,需维护者单独修复或恢复资源后再观察完整 CI。
  • 回滚方式:回滚本 PR 提交即可恢复现有固定工具 timeout 与 retry/backoff 行为。

UI evidence

N/A:本 PR 不涉及 TUI 或桌面端视觉变化。

Checklist

  • 变更范围与关联 Issue 一致,没有混入无关重构。
  • 没有提交凭据、日志、缓存、私有源码或本地评测产物。
  • 已添加与风险匹配的单元和集成测试。
  • 未修改协议,无需重新生成 wire protocol 文档。
  • Python 运行说明已同步。
  • 已在 PR 文案中披露合作式取消与不可强杀操作的清理边界,并请求维护者确认。
  • commit 时添加 Signed-off-by(DCO)。

@rojim666
rojim666 marked this pull request as ready for review September 18, 2026 09:37
@rojim666
rojim666 self-requested a review as a code owner September 18, 2026 09:37
Copilot AI lite review requested due to automatic review settings September 18, 2026 09:37
@rojim666
rojim666 merged commit d68e3d1 into rojim666:main Sep 18, 2026
0 of 2 checks passed

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants