☰
oh-my-pi Autoresearch 断点续跑机制:resume-message 提示词解析与自动续跑实现
2026/10/17 4:20:13 网站建设 项目流程

oh-my-pi Autoresearch 断点续跑机制:resume-message 提示词解析与自动续跑实现

【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi

导读

本文围绕 oh-my-pi coding-agent 内置的 Autoresearch(自主实验研究)模式中一段关键的提示词文件packages/coding-agent/src/autoresearch/resume-message.md,深入讲解它在断点续跑流程中的角色:当一次run_experiment完成后、Agent 进入下一轮迭代之前,系统如何通过这段消息让 Agent 重新对齐实验目标、检查待处理的运行记录(pending run)、并继续最有希望的方向,直到被用户打断或达到迭代上限。读完本文,你将掌握 oh-my-pi Autoresearch 模式的整体运行协议、resume-message.md与prompt.md、prompt-setup.md、command-resume.md之间的分工,以及底层agent_end事件与api.sendMessage如何驱动"自动续跑"这一关键能力。

一、resume-message.md:一段 9 行的"续跑指令"

先看原文档全文(位于 resume-message.md):

Continue the autoresearch loop now. - Re-read your notes and the recent-runs context above before deciding the next direction. - Inspect recent git history for context. - A previous benchmark run completed but was never logged. Finish `log_experiment` before starting a new run. (仅在存在 pending run 时渲染) - Continue from the most promising unfinished direction. - Keep iterating until interrupted or until the configured iteration cap is reached. - Preserve correctness and do not game the benchmark.

这段模板虽然只有寥寥数行,却是整个"自主实验循环"的续跑锚点,它承担四类语义:

  1. 身份声明:"Continue the autoresearch loop now."——告诉模型当前轮次不是普通对话,而是实验循环的延续;
  2. 上下文对齐:要求 Agent 重读笔记(notes)和"上文中的 recent-runs context",再决定下一步方向;
  3. 待办优先级:通过 Handlebars 条件块{{#if has_pending_run}},在存在未记录(unlogged)的已完成运行结果时,强制要求先执行log_experiment,禁止在未记账的情况下启动新实验;
  4. 行为约束:从"最有希望的未完成方向继续"、持续迭代直到被打断或达到迭代上限,并且"保持正确性、不要刷分(do not game the benchmark)"。

值得注意的是最后一条 Guardrail 与 prompt.md 中"NEVER game the benchmark"的规则完全一致,说明这段续跑消息是 Autoresearch 模式治理规则的延续,而非独立的新规则。

二、续跑消息在系统里的实际装配位置

2.1 模板导入与渲染

在 autoresearch/index.ts 中,模板以纯文本资源形式导入:

import resumeMessageTemplate from "./resume-message.md" with { type: "text" };

当需要续跑时,通过prompt.render渲染模板,传入has_pending_run布尔值以决定是否输出"先完成 log_experiment"的约束行:

api.sendMessage( { customType: "autoresearch-resume", content: prompt.render(resumeMessageTemplate, { has_pending_run: Boolean(pendingRun), }), display: false, attribution: "agent", }, { deliverAs: "nextTurn", triggerTurn: true }, );

从代码结构看,customType: "autoresearch-resume"、display: false、deliverAs: "nextTurn"、triggerTurn: true这几个参数共同决定了这条消息的特殊性:它是一条由系统注入、不对用户展示、自动触发下一轮 Agent 执行的内部消息——这正是"自动续跑"的实现细节。

2.2 触发时机:agent_end 事件

resume 消息并非随时注入,而是严格绑定在 agent_end 事件处理器 中。其逻辑可归纳为:

  1. Agent 每轮结束(agent_end)时,先清理runtime.runningExperiment并刷新仪表盘;
  2. 若 Autoresearch 模式未开启,直接返回;若用户已排队新消息(ctx.hasPendingMessages()),则放弃自动续跑(autoResumeArmed = false),等待用户输入;
  3. 加载当前分支的活跃会话,检查是否存在"已完成但未记录"的 pending run;
  4. 满足"存在 pending run 且本轮尚未处理过该 run"或autoResumeArmed为真的条件时,渲染 resume-message 模板并通过sendMessage注入下一轮。

也就是说,autoResumeArmed是"手动续跑"路径的关键开关,而 pending run 检查则是"自动续跑"路径的关键开关。两者汇合后,Agent 在新的一轮开始时收到的就是 resume-message 的内容。

2.3 与命令式续跑 command-resume.md 的区别

除了事件驱动自动续跑,Autoresearch 还提供了一条用户手动续跑路径:在 TUI 中输入/autoresearch命令。当检测到当前autoresearch/*分支已有活跃会话时,/autoresearch会渲染 command-resume.md 模板并作为用户消息发送:

Resume autoresearch on the active session. {{branch_status_line}} - Use the active session context above as the source of truth for goal, scope, constraints, and run history. - Inspect recent git history for context. - Continue the most promising unfinished direction. - Keep iterating until interrupted or until the configured iteration cap is reached.

对比可见:两条续跑路径的约束行几乎一致(重读上下文、查看 git 历史、继续最有希望的方向、持续迭代到上限),区别在于 command-resume 多出分支状态行(Created and checked out dedicated git branch .../Using dedicated git branch ...),且以用户消息形式呈现、可以携带用户补充的resume_context。二者的行为在 index.ts 的现有会话分支中由api.sendUserMessage(prompt.render(commandResumeTemplate, ...))完成装配。

三、resume 消息背后的完整实验循环协议

要真正理解续跑消息,需要先理解它所属的 Autoresearch 模式的四阶段协议。

3.1 Phase 1:Harness 搭建(prompt-setup.md)

首次开启 Autoresearch 且没有会话时,系统注入 prompt-setup.md。这一阶段只允许搭建基准测试框架(harness),不允许做任何优化。必须产出:

  • 在工作目录编写./autoresearch.sh,作为唯一权威的基准入口;
  • 成功时退出码为 0,失败时非 0;
  • 输出主指标行METRIC <name>=<value>,次指标以更多METRIC行输出;
  • 每次运行必须确定性复现同一负载(无实时网络、无时间依赖、必要时固定随机种子)。

Phase 1 的硬性规则包括:禁止提前调用run_experiment、log_experiment、update_notes(在init_experiment之前它们会报 "no active autoresearch session");编译通过不算基准测试,harness 必须真实执行负载并输出METRIC;禁止手工创建autoresearch.md、.autoresearch/等会话状态文件,因为会话状态由系统统一跟踪(removeLegacyArtifacts会在clear时清理这些遗留产物,见 index.ts)。

3.2 Phase 2:迭代循环(prompt.md)

init_experiment调用成功后进入 Phase 2,系统注入 prompt.md。该阶段会列出四个实验工具及其语义:

工具职责
init_experiment开启或重配会话;传new_segment: true可在当前会话内开启新基线(segment);首次调用会快照工作树为基线并自动提交 harness
run_experiment固定执行bash autoresearch.sh,自动捕获输出并解析METRIC name=value/ASI key=value行回传
log_experiment记录运行结果:keep自动提交改动;discard/crash/checks_failed回滚工作树;可用flag_runs标记可疑历史运行
update_notes持久化会话剧本(body整体替换)或向 ideas 待办追加(append_idea),笔记每轮注入系统提示词

操作协议为:先理解目标与瓶颈 → 必要时用init_experiment(不 bump segment)或update_notes更新目标/范围 → 先建立基线 → 然后反复"改代码 →run_experiment→ 诚实地log_experiment",每轮只做一个连贯的实验。决策规则:指标变好 →keep;变差或持平 →discard;运行失败 →crash;校验失败 →checks_failed。主指标是唯一的决策依据,ASI 字段可自由用于记录hypothesis、rollback_reason、next_action_hint等学习信息。

3.3 resume 消息在协议中的位置

对比 prompt.md 与 resume-message.md 可以发现,两者在"继续迭代、保持正确性、禁止刷分"的约束上完全同源。区别在于:prompt.md 是每轮系统提示词的一部分(由before_agent_start事件注入),而 resume-message.md 是上一轮结束与下一轮开始之间的事件消息。当一轮实验结束、log_experiment已记账、用户无新消息时,续跑消息保证循环不会停滞——Agent 会自动开启下一轮迭代,这正是"Autoresearch(自主研究)"的含义所在。

四、续跑逻辑的源码级佐证

4.1 守卫条件与去重机制

在 agent_end 处理器 中,自动续跑被两个状态变量双重保护:

const shouldResumePendingRun = pendingRun !== null && runtime.lastAutoResumePendingRunNumber !== pendingRun.runNumber; if (!shouldResumePendingRun && !runtime.autoResumeArmed) { return; } runtime.autoResumeArmed = false; runtime.lastAutoResumePendingRunNumber = pendingRun?.runNumber ?? null;
  • autoResumeArmed:run_experiment成功结束后被置为true(见 run-experiment.ts),代表"本轮实验完成、可以自动进入下一轮";log_experiment之后同样置真(见 log-experiment.ts);
  • lastAutoResumePendingRunNumber:防止同一 pending run 被反复触发续跑消息,避免循环卡死。

从源码结构看,这种"armed 标志 + run 编号去重"的组合确保了 resume 消息每轮至多注入一次,且严格发生在"实验完成之后、新迭代开始之前"。

4.2 pending run 的判定

pendingRunSummaryFromRow(index.ts)定义了一条运行记录何时算作 pending:status为 null(尚未log_experiment)、completedAt非空、退出码为 0 且未超时即视为通过。这正是 resume 消息中"previous benchmark run completed but was never logged"一句的底层判定依据。若存在 pending run,续跑消息会要求先执行log_experiment,因为run_experiment本身也会在启动新实验前abandonPendingRuns(见 run-experiment.ts),未记账的运行会被标记为放弃,从而丢失一次实验结果。

4.3 分支切换与模式恢复

rehydrate 与before_agent_start中还有一层分支保护:Autoresearch 模式只在活跃会话记录的 git 分支上生效。若用户在轮次之间手动切出了autoresearch/*分支,before_agent_start会静默关闭 Autoresearch、摘除四个实验工具并停止注入系统提示词;切回分支后,会话与运行历史被保留(SQLite 持久化于 storage.ts),可无缝恢复。这也解释了为什么 resume 消息中要求"Inspect recent git history for context"——git 历史本身就是实验迭代的账本。

五、续跑前 Agent 实际该做什么

结合 resume-message 的指令与 prompt.md 的会话快照语义,一轮续跑开始时的标准动作序列是:

  1. 重读注入的笔记与 recent-runs 上下文:当前 segment 编号、本 segment 运行次数、基线指标、最优已保留指标、最近三次运行的状态/指标/ASI 摘要、未加理由的越界改动(unjustified deviations)等(这些数据由before_agent_start中的recentResults计算并渲染进 prompt.md);
  2. 检查 pending run:若has_pending_run为真,必须先调用log_experiment记账(keep/discard/crash/checks_failed四选一),再开启新实验;
  3. 审视 git 历史:确认基线提交与已保留的 keep 提交,了解当前工作树相对基线的差异;
  4. 决定下一方向:从最有希望的未完成方向继续,每轮只做一个连贯实验;
  5. 循环终止条件:用户打断,或达到max_iterations上限——log_experiment记账后若本 segment 运行数达到上限,会自动关闭 Autoresearch 模式并摘除工具(见 log-experiment.ts)。

六、相关实现文件索引

若希望深入阅读,以下是 Autoresearch 模式的核心实现清单:

  • resume-message.md:自动续跑注入的消息模板(本文主题);
  • command-resume.md:/autoresearch命令手动续跑模板;
  • prompt-setup.md:Phase 1 harness 搭建提示词;
  • prompt.md:Phase 2 迭代循环提示词;
  • index.ts:扩展入口,含agent_end/before_agent_start事件、/autoresearch命令、快捷键与续跑装配;
  • tools/init-experiment.ts:会话初始化与基线快照;
  • tools/run-experiment.ts:基准执行、输出捕获与 METRIC/ASI 解析;
  • tools/log-experiment.ts:结果记账、提交/回滚、范围越界审计与置信度计算;
  • tools/update-notes.ts:持久化笔记与想法待办;
  • helpers.ts:METRIC/ASI行解析、范围匹配等工具函数;
  • git.ts:autoresearch/*分支保障与脏路径解析;
  • storage.ts:SQLite 会话/运行记录持久化。

结语

resume-message.md表面上是 9 行提示词,实际是 oh-my-pi Autoresearch 循环闭环中"实验结束 → 新迭代开始"这一衔接点的规则载体。它通过agent_end事件、pending run 状态与autoResumeArmed标志的三重配合,让 Agent 在无人工干预时也能沿着"记账 → 回顾 → 选择方向 → 再实验"的路径持续迭代,同时以"保持正确性、禁止刷分"的护栏约束自主行为。理解这段消息,等于理解了整个自主实验循环的状态机设计。

【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询