ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

如何实现目标门禁:learn-claude-code s17 用独立评估器决定 Agent 每轮之后是否继续

如何实现目标门禁:learn-claude-code s17 用独立评估器决定 Agent 每轮之后是否继续 如何实现目标门禁learn-claude-code s17 用独立评估器决定 Agent 每轮之后是否继续【免费下载链接】learn-claude-codeBash is all you need - A nano claude code–like 「agent harness」, built from 0 to 1项目地址: https://gitcode.com/GitHub_Trending/an/learn-claude-code普通 Agent 循环的退出条件只有一个模型不再调用工具程序就返回。这够用于对话却不够用于修到所有测试通过完成全部验收项这类任务——模型可能只完成了一部分就认为做完了。learn-claude-code 仓库的 s17 章节给出了一个完整可运行的解决方案在循环真正的返回边界上挂一个会话级 Stop hook由一个不带任何工具的独立评估器模型读取对话记录判断完成条件是否成立没成立就把原因追加回对话让主模型自动再跑一轮。本文带你跑通 s17_goal_loop/code.py核对它的判断行为并说明这个目标门禁如何移植到你自己的 harness 中。门禁解决的问题与判定边界s17 的主循环里模型本轮没有发出tool_use只代表当前轮次想停不代表目标达成。接入门禁后的退出路径摘自 s17_goal_loop/README.mdif tool_results: messages.append({role: user, content: tool_results}) continue decision await self.goal.evaluate_after_turn(self.messages) if decision.action block: self.messages.append({ role: user, content: decision.reason, }) continue return SessionResult(texttext, statusdecision.action)要点没有活跃 Goal 时 hook 直接放行allow退出条件与 s01 完全一致评估器返回block时程序把原因写进同一份messages[]并continue主模型自动开始下一轮不需要用户再输入继续这里没有单独的续行队列评估器是GoalController的内部依赖是主循环之外的一次模型调用不是另一条退出路径。评估器本身没有工具它不能读文件也不能重新跑测试只能依据对话中已经出现的内容判断。它必须返回一个 JSON 对象文档示例{ ok: false, reason: The conversation does not contain pytests exit code yet., impossible: false }字段语义在 code.py 的_parse_json_object()中被强校验ok必须是布尔值reason必须是非空字符串impossible必须是布尔值且ok与impossible不能同时为 true否则抛出GoalError。准备运行环境依赖只列在根目录 requirements.txtanthropic0.25.0、python-dotenv1.0.0、pyyaml6.0。安装后按仓库自带模板 .env.example 准备.env其中ANTHROPIC_API_KEY和MODEL_ID是必填项缺失时make_live_session()会抛出MODEL_ID is required in the environment or .envpip install -r requirements.txt# .env值按你实际使用的 provider 填写 ANTHROPIC_API_KEY你的API密钥 MODEL_IDclaude-sonnet-4-6 # 可选给 Goal 评估器换一个更小的模型 GOAL_EVALUATOR_MODEL_ID模型ID # 可选Anthropic 兼容的第三方 provider # ANTHROPIC_BASE_URLhttps://api.example.com/anthropicMODEL_ID是干活的 worker 模型评估器模型的取值顺序在代码中是GOAL_EVALUATOR_MODEL_ID→ANTHROPIC_DEFAULT_HAIKU_MODEL→MODEL_ID即不配置时评估器和 worker 用同一个模型。ANTHROPIC_BASE_URL仅在你使用 Anthropic 兼容端点时才需要设置。两条运行路径交互模式与一次性命令行在仓库根目录启动交互会话python s17_goal_loop/code.py启动后显示s17: goal loop提示行输入q退出。随后输入/goal python -m pytest exits with code 0/goal 条件会保存完成条件并立即把这段条件作为本轮任务交给主模型你不需要再发一条开始执行。也可以跳过交互直接从命令行设置 Goal 并等待结果python s17_goal_loop/code.py /goal python -m pytest exits with code 0一次性模式下程序结束时会打印[goal] status: reason一行status 为achieved、failed、limit、error之一时交互式模式同样打印[goal] status: reason这是判断门禁结果的第一现场。限制自动轮数时用主循环的全局MAX_TURNS而不是给 Goal 藏一个固定预算MAX_TURNS20 python s17_goal_loop/code.py \ /goal fix the type errors until npm run typecheck exits 0MAX_TURNS不设置或为 0 时不限制轮数到达上限时状态为max_turnsReason 为 global max_turns reached; the goal remains activeGoal 不会被标记完成也不会被清除。完成条件怎么写三要素可检查README 明确说把代码弄好这类条件太模糊评估器不知道什么算好。可用的条件写清三件事结束状态最终要达到的结果验证方式用哪条命令或哪个输出证明限制条件过程中不能破坏什么。文档给出的示例/goal finish the authentication migration until pytest tests/auth exits 0, without modifying test files outside tests/auth这里有一个容易被忽视的约束链评估器只读对话worker 必须把验证结果说清楚对话里才算数。s17 的 worker system prompt 因此要求运行验证命令后把命令和结果明确写进对话让独立评估器能够检查Report concrete command results so an independent evaluator can judge completion。实现上有两层保障bash工具的返回格式是exit_code退出码加输出正文输出过长时截断保留末尾约 29950 字符但exit_code行始终保留所以测试退出码天然会进入对话评估器的 prompt 明确要求除非对话里出现结果否则不要假设某条命令成功一句测试通过了的口头宣称不足以通过门禁。送给评估器的对话文本由transcript_text()生成保留最近的完整消息上限 24000 字符若最新一条消息本身超长只保留它的开头和结尾避免一条工具结果占满整次评估请求。验证门禁判定结果交互模式下输入不带参数的/goal可随时查看门禁状态程序按 code.py 中GoalController.status()的格式输出Goal active: 完成条件 Elapsed: 已用秒数s Evaluations: 已评估次数 Tokens: 主 Agent 自设 Goal 以来消耗的 token 数 Last reason: 最近一次评估原因Goal 达成后/goal显示Goal achieved: 条件加Reason:行被判定无法完成时显示Goal failed: 条件。decision.action的全部取值及含义以代码为准action含义副作用allow无活跃 Goal直接放行退出条件同 s01block条件未满足原因追加进messages[]自动进入下一轮achievedoktrueGoal 清除会话返回failedimpossibletrueGoal 清除并记录失败error评估器调用/解析失败停止自动续轮Goal 保持活跃错误交给用户limit连续阻止次数超过上限控制权还给用户Goal 保持活跃defer后台任务仍在运行跳过本次评估等结果回到对话后再判block被连续触发时控制台上会看到形如[Goal still active]Condition:Evaluator:Continue working and surface the missing evidence.的消息被追加进对话——这是评估器给出的缺什么证据例如文档示例中的 The conversation has no complete test result. Run pytest tests/auth and report its exit code.。连续阻止上限默认 8DEFAULT_STOP_HOOK_BLOCK_CAP可用环境变量CLAUDE_CODE_STOP_HOOK_BLOCK_CAP覆盖。每收到一条新的用户查询begin_query()计数归零所以达到 8 次指的是同一次自动续行过程中连续 8 轮都未满足条件触发后状态为limitReason 说明 the Stop hook blocked 8 consecutive turns你可以补充信息后继续或清除 Goal。仓库的 tests/test_goal_loop.py 用假客户端固定了这些行为可作为核对实现的参照block后自动续轮直至achievedworker 的 bash 退出码会进入评估器输入后台任务运行时评估被defer、结果经submit_background_result()回到同一循环block_cap2时第三次触发返回limit且 Goal 仍活跃impossible记录为failed评估器抛错时 Goal 保持活跃。把门禁移植进你自己的 harnesss17 是建在 S04 内核上的独立机制示例保留五个基础工具bash、read_file、write_file、edit_file、glob和四类 hookUserPromptSubmit、PreToolUse、PostToolUse、Stop新增四个 Goal 部件部件职责GoalState保存条件、评估次数、开始时间、token 基线、最近原因PromptGoalEvaluator一次独立的无工具模型调用读对话返回判定 JSONGoalController设置/查看/清除 Goal实现 Stop hook 决策与goal_status事件记录AgentSession把 Stop hook 接到原来的返回边界移植时的最小接入点只有几行在 agent 循环里模型本轮没有工具调用、即将 return的位置调用evaluate_after_turn(self.messages)对block分支追加原因并continue其余分支按上表处理。需要一并带走的约束每个会话最多一个活跃 Goal/goal 新条件直接替换旧 Goal 并立即按新条件工作条件长度上限 4000 字符MAX_GOAL_LENGTH超长抛GoalError/goal clear清除当前 Goalstop、off、reset、none、cancel是等价别名每次状态变化都会向events列表追加一条goal_status事件宿主持久化这些事件后可用GoalController.restore()恢复仍活跃的 Goal——已完成、失败或已清除的 Goal 不会重新启动且恢复后轮数、耗时、token 基线从零开始。本课程的 CLI 入口不做会话持久化这一步留给宿主有后台任务Workflow、后台命令的宿主应在后台任务运行时让 hook 返回defer而不是评估任务完成通知通过submit_background_result()进入同一份messages[]后再触发评估。注意 defer 只是跳过评估通知消息本身没有任何机械特权评估器照常在对话里判断它包含的实际结果。worker 侧的运行边界也要清楚bash 命令带 120 秒超时DENY_LIST中的模式rm -rf /、sudo、shutdown、reboot、mkfs、dd if直接拒绝含rm、 /etc/、chmod 777的命令会触发交互式Allow? [y/N]确认文件类工具的路径越出工作目录会被Permission denied: path is outside the repository拒绝。这些是 s17 保留 S04 权限钩子的结果移植时可按需保留或替换。边界说明s17 与 s16 的分工s16 回答一批工作怎么跑哪些步骤并发、结果怎么验证、中断后怎么恢复s17 回答整件事是否完成——Workflow 可以成功结束而最终要求仍未满足Workflow 结果回到对话后由 Goal 评估器决定会话是结束还是再跑一轮。两个机制可以各自单独使用接到同一宿主时Workflow 的完成消息进入对话Goal Loop 负责收口。s17 本身是一个机制示例而非累积运行时它的工具池比 s15 更小这正是为了把目标门禁这一件事讲透。如果你的目标只是让 Agent 跑到可检查的条件为止按上面的路径准备.env、跑起交互会话并输入一条三要素齐全的/goal即可若要把门禁作为组件并入自己的宿主对照四个部件与goal_status事件契约移植并用 tests/test_goal_loop.py 中的场景逐条核对你自己的实现行为是否一致。【免费下载链接】learn-claude-codeBash is all you need - A nano claude code–like 「agent harness」, built from 0 to 1项目地址: https://gitcode.com/GitHub_Trending/an/learn-claude-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表