分阶段管理你的上下文
上下文编辑器模块允许你编辑自己的对话。根据工作的逻辑状态决定何时清理。随着上下文增长,注意力会下降:一旦某部分工作完成,就压缩已处理的内容。主机的自动压缩只是一个安全网。
工具:context_tag、context_list、context_edit、context_note。整理规则(来自失败的经验、修正、引用、状态项、主机行):使用 context_list 并设置 "rules": true。
阶段
阶段是你工作的一个逻辑块:一个阶段、一个子任务、一个修复。
- 在块开始时打开它:
{"tags":[{"op":"open","stage":"读取配置文件"}]}。块从打开它的响应开始;如果带有"index",则从context_list中该行开始。 - 当块完成且结果已知时关闭它:
{"tags":[{"op":"close"}]}。结果会列出该块的行号范围#a..#b、大小和媒体、清理候选、遥测信息和建议。它的索引是当前的:你可以立即根据它们进行编辑。 - 阶段是扁平的:打开一个阶段会先关闭当前打开的阶段。
- 要关闭一个你从未打开过的块:
{"tags":[{"op":"open","stage":"<名称>","index":<它的第一行>},{"op":"close"}]}。 context_list在打开阶段的第一个行上显示[stage ▶ 名称],在最近关闭的块周围显示[block ▶ 名称]..[block end]。
压缩块
关闭后,整体审查该块,并为其中已处理或多余的内容排队一个 context_edit:你已经使用过的工具输出、重复和过时的读取、死胡同、你已经查看过的媒体(如果任务允许,可提供描述:对工具结果使用 summarize,对图像、文档或粘贴在用户提示中的文本使用 describe,用户的打字内容保持原样;主机添加到该提示中的附件,例如来自 @path 的文件内容和提醒,会随之一起处理,因此如果需要请重新读取文件)。如果不需要压缩,则不排队任何内容。
在处理过的行位置写入一个阶段记录,例如作为 collapse 的摘要:
- 阶段的目标;
- 决策,包括理由、用户背后的逐字措辞以及为什么拒绝其他选项;
- 已验证的事实及其来源(路径、行号、版本、URL);
- 变更的制品(文件、提交、设置);
- 开放性问题。
在 context_list 中标记为 ~ 的对(Read、Grep、Glob)是可重现的:将它们缩减为一个指针(内容、位置、找到的内容;如果需要,稍后重新读取)。其他所有内容都需要一个仔细的摘要或保持不变:实时探测、子代理报告、网络内容。用户的消息,包括你对问题的回答(AskUserQuestion),在此会话中保持原样:context_edit 和 context_tag 拒绝覆盖它们的编辑;将范围分割在它们周围。
通常保留仍然有效的规则和技能以及你下一步需要的结论。[pin] 目标不能被编辑;固定标记由你设置和移除(模块只固定交接文档或种子摘要)。
编辑在轮到结束时应用:以一行状态结束,会话会自动恢复(context_edit 给出选项)。一个应用会重写一次提示缓存:将一组的编辑批处理为一次调用。"keep_cache": true 会在轮结束时保持缓存直到最早的编辑,如果该编辑在最近约 20 个位置内(Cache: 行)。你的 context_* 调用会离开对话;标签和笔记保留。
死胡同
当你放弃一个分支时,立即标记它:用一个笔记标记跨度 disposable,{"op":"add","kind":"disposable","index":<第一行>,"to":<最后一行>,"note":"死胡同:X 因为 Y 失败"}(范围包含每个工具调用及其结果;context_tag 在覆盖用户消息时会发出警告)。使用你的单个文本行或通过 ref/tool_use_id 的输出也可以。当你关闭阶段或从一个已标记块继续时,替换内容会被排队;一个范围变成一个 collapse。
优化标记
当你结束轮到用户且块已完成时,用以下单独一行结束你的回答:
[context-editor: optimize]
- 仅作为最后非空行单独存在;在文本中间、共享一行或在
/compact轮中则无效。 - 它会关闭打开的阶段(如果没有:则关闭自上一个关闭块以来的块;在该轮中由工具关闭的阶段保持为块)。该块随后等待;不进行任何压缩。
- 下一个提示会命名该块:如果工作进入下一阶段,则在该轮中压缩它,否则保留它。打开一个阶段会用索引报告它;接受
context_edit会结束等待并排队你的disposable替换。 - 自行遵循计划:为每个阶段打开一个阶段;进入下一个阶段时压缩上一个块,并以状态行结束轮;会话会恢复。工作中途,由工具关闭阶段。
遥测
context_list 使用 "count":0 仅给出头部(其描述列出了各行)。效果:… M 次压缩内容的重读:次数多意味着你压缩过多。大小是校准后的估算值(在已知之前为 approx.)。[context-editor: 建议] 行(随着上下文增长,或在用户大量读取后的下一个提示中)会提出一个批处理,包括收益、缓存成本和结论;它仅提供信息。根据工作状态决定,而不是数字。
候选
[review: big]大输出;[review: search]搜索结果(几轮后);[review: stale]对后来编辑过的文件的读取:其内容已过时,将其缩减为指针;[review: superseded]对后来读取显示内容已更改的文件的读取:也已过时;[review: duplicate]相同输出或读取范围的早期副本:删除或缩减它;[review: agent]你自己的标记(可选的ttl_turns)。审阅意在建议查看,而非编辑。[disposable: 笔记]:你自己的替换(参见死胡同)。
关闭报告按原因列出块的候选,计数其 ~ 对,并为过时和重复的读取提供现成的替换文本。
状态槽
将任务状态(目标、计划、已完成、下一步)保存在你标记为 state 的单个文本行中:{"tags":[{"op":"add","kind":"state","index":<行>}]}。通过 rewrite 更新该行,切勿通过在末尾追加新状态。或者将其保存为项目:使用 context_edit 及 {"op":"state","changes":[{"do":"add","kind":"plan","text":"…"}]}(set、mark 有害/过时、unmark、remove by id 例如 p3);应用会根据它们重建槽,并且当槽包含项目时,只有 state 操作可以更改它。标签会跟随重建的行。一个新的 state 标签会移动槽。每次更新都是一次应用:应与块的一组编辑一起进行,而不是单独进行。
笔记
context_note 以零令牌成本保留笔记(其描述给出了操作及其显示位置)。
- 立即标记稍后要丢弃或压缩的内容及其方式:
{"notes":[{"op":"add","ref":"last","text":"在修复验证后丢弃"}]}。 "remind_in_turns":2会在两轮后再次提醒一次笔记。通过内容链接行,而不是行号。
关于内容而非行号:索引在应用后会发生更改。阶段关闭会列出其块中的笔记。
压缩行和模块文本
以 Later, your context_edit(或 context_tag)开头的文本是你自己的替换:你在此处阅读了原始内容,然后压缩它以节省上下文。你进行了替换;它命名的来源(Read docs/x.md 的完整输出)表明了其内容的出处。在你认为其中任何内容是编造的之前,请打开存档。
… summarize 调用替换了你在此处阅读的 <来源> 的完整输出 …,… collapse 调用替换了这 N 行你阅读的内容(它们包含的内容)…(其调用的collapsed输入列出相同内容),同样还有rewrite、describe:你的文本跟随着冒号。在用户提示的describe之后,你自己的文本会跟随着他们的文本。较旧的版本显示[context-editor] 你阅读了…,然后替换了…。(original: <路径>, open with Read),(media: <路径>),media carried as files:存档。Read只读你需要的;它会在对话结束时回来。- 以
[context-editor或context-editor:开头的文本来自模块,而非用户或工具。context-editor: applied N edit(s): …:应用报告;进行替换的context_*调用已被移除,但你在其结果中引用的内容是真实的。一个以context-editor:开头的/compact行是模块的命令;… repair the resumed conversation …:模块删除了恢复时加载了两次的答案;之前的思考已消失。 id cN、来自你的笔记 nN 的提醒、[context-editor: 建议]、[context-editor: N 字符已裁剪]、你设置的恢复提示、/compact轮、交接文档:模块的服务文本。