Stop Hook Auto-Continue Pattern
Nikola Balic (@nibzard)· emerging
问题
即使任务并未真正完成,Agent也会结束本轮操作并将控制权交还给用户。常见场景如下:
- 代码编译成功,但测试失败
- 已完成变更,但质量检查未通过
- 功能已实现,但集成测试出现故障
- 迁移已执行,但验证步骤未完成
若不进行干预,用户必须手动检查并重新向Agent发送prompt,这会产生交互摩擦。
方案
使用**停止钩子(stop hooks)**在每个agent轮次后以编程方式校验成功条件。若未满足条件,则自动继续agent的执行,直至任务真正完成。
停止钩子(stop hook):agent完成一轮运行后触发的脚本。它可检查当前状态,进而决定是将控制权交还给用户,还是让agent持续运行。
define_stop_hook() {
# 在每个agent轮次完成后运行
test_result = run_tests()
if test_result.failed:
agent.continue_with_prompt(
"测试失败,错误信息:{test_result.errors}。请修复这些问题。"
)
else:
agent.stop() # 将控制权交还给用户
}
结合**危险模式(dangerous mode)**使用:在容器化/沙箱环境中,这一机制可实现完全自主运行,直至任务成功完成。
如何使用
基础实现:
- 定义成功标准(测试通过、构建成功、代码检查无问题等)
- 创建用于检查这些标准的停止钩子(stop hook)
- 若标准未满足,注入反馈并继续Agent执行
- 若标准满足,将控制权交还给用户
Claude Code SDK 示例:
// 停止钩子配置
{
"hooks": {
"on_stop": {
"command": "./scripts/check_success.sh",
"auto_continue_on_failure": true
}
}
}
高阶用户模式(来自会话记录):
“你可以定义这样的停止钩子:如果测试不通过,就继续执行。本质上是让模型持续运行,直到任务完成为止。”
程序化SDK的进阶用法: 结合容器中的危险模式实现自主运行:
- Agent 做出变更
- 停止钩子检查测试结果
- 若测试失败,Agent 自主继续执行
- 循环直至测试通过或触发超时
- 效果:“从非确定性流程中获得确定性结果”
权衡
优点:
- 真正完成任务:未实际达成目标绝不停止
- 减少人工干预:无需手动重新触发prompt
- 系统化质量保障:采用编码化的成功判定标准,而非依赖人工判断
- 自主运行:与SDK结合可实现完全无人值守的任务执行
- 避免提前结束:Agent无法过早宣称任务完成
缺点:
- 成本失控风险:若判定标准无法达成,Agent可能陷入无限循环
- 依赖优质判定标准:不完善的成功检查会引发无限循环
- 容器开销:在沙箱环境中运行最为安全
- 调试难度大:难以检查执行过程中的中间状态
- 超时管理要求高:需要合理的限制机制来防止无限执行
安全注意事项:
- 借助超时机制限定执行时长
- 在循环过程中监控token使用量
- 先在安全环境中测试hooks
- 从简单的判定标准入手,再逐步过渡到复杂检查
- 记录所有auto-continue决策,便于调试
参考文献
关键词:
核心围绕Claude Code的功能特性与应用场景展开,提及可自定义停止钩子让模型在测试未通过时持续运行,还指出结合SDK程序化调用后,能通过脚手架从非确定性的随机模型中得到确定性输出。
直译:
- 鲍里斯·切尔尼:“你可以定义一个停止钩子,比如如果测试不通过,就让模型继续运行。本质上你可以让模型一直运行直到任务完成。”
- 鲍里斯·切尔尼:“当你将它与SDK以及这类程序化用法结合时,效果简直惊人。这是一个随机系统,具有非确定性,但借助脚手架你就能获得确定性的结果。”
- 【播客来源】《AI & I播客:像开发者那样使用Claude Code》 (链接:https://every.to/podcast/transcript-how-to-use-claude-code-like-the-people-who-built-it)
来源摘要
正在获取来源并生成中文摘要…
来源: https://every.to/podcast/transcript-how-to-use-claude-code-like-the-people-who-built-it