ChatGPT 桌面客户端原生 Stop 钩子:每轮结束检查当前 token 状态;在 Codex 任务接近长上下文区间时,自动续发一轮,请模型写好交接文档,再由用户手动或由客户端原生任务工具尽力创建新任务。
它不是浏览器扩展,不读取网页,不调用 OpenAI API,也不需要 API Key。
- 客户端准备结束一轮任务时触发
Stop。 - 插件从当前任务记录的最新
token_count读取真实输入 token 和上下文窗口。 - 每轮返回不消耗额外模型请求的
systemMessagewarning,其中包含当前用量、本轮缓存覆盖率、交接线和剩余额度。 - 达到阈值后才返回
decision: "block",客户端自动续发一条“写交接文档”的提示,并因此产生一轮额外模型请求。 stop_hook_active和会话标记共同保证同一任务只交接一次。
默认绝对阈值为 250,000 token,同时使用当前模型上下文窗口的 85% 作为保护线,实际取较小值。这样既为 GPT-5.6 超过 272,000 输入 token 的长上下文计价留余量,也能适配客户端较小的有效窗口。
默认策略是:未达到交接线时零额外模型请求;只在达到交接线时追加一轮交接请求。
OpenAI Hooks 将 systemMessage 定义为 UI 或事件流中的 warning,而不是助手回复正文。插件每轮都可以计算并返回下面这样的状态,但 ChatGPT/Codex 桌面客户端是否把成功 Stop 钩子的 warning 显示出来,取决于当前客户端的 UI 实现:
上下文 63.1K / 996.1K(6.3%)|缓存 本轮 93.2%(58.8K)|交接线 250.0K|距交接 186.9K|安全
因此,在 /hooks 中看到钩子成功调用一次、但对话结尾没有附加状态,是可能出现的正常客户端行为,不代表插件没有完成检查。插件不会为了让状态进入对话正文而在每轮返回 decision: "block",因为那会让每轮都多产生一次 API 请求和费用。
真正达到交接线时,插件才会返回 decision: "block"。这时客户端会额外请求模型写一次交接文档;这也是默认流程唯一主动增加的模型请求。
在 ChatGPT 客户端的 Codex 终端中执行:
codex plugin marketplace add zxfd/chatgpt-context-handoff
codex plugin add chatgpt-context-handoff@chatgpt-context-handoff然后重启 ChatGPT 客户端,在 Codex 中打开 /hooks,审查并信任该 Stop 钩子,再新建任务使用。
codex plugin marketplace upgrade chatgpt-context-handoff
codex plugin add chatgpt-context-handoff@chatgpt-context-handoff更新后重启 ChatGPT 客户端并新建任务。打开 /hooks 确认钩子已启用;如果客户端把新版本标记为待审查,请重新查看并信任。
把仓库中的 配置示例.json 复制为:
~/.codex/context-handoff.json
可配置字段:
| 字段 | 默认值 | 含义 |
|---|---|---|
thresholdTokens |
250000 |
输入 token 绝对阈值 |
maxContextPercent |
85 |
当前上下文窗口保护百分比 |
showTokenStatus |
true |
每轮结束返回 token 状态 warning;客户端不保证显示在回复正文 |
showCumulativeCache |
false |
在状态 warning 中追加会话累计缓存覆盖率 |
newTaskMode |
manual |
manual 或 auto |
handoffFile |
交接文档.md |
当前工作目录内的交接文件 |
也可用同名大写环境变量临时覆盖:
CONTEXT_HANDOFF_THRESHOLD_TOKENSCONTEXT_HANDOFF_MAX_CONTEXT_PERCENTCONTEXT_HANDOFF_SHOW_TOKEN_STATUSCONTEXT_HANDOFF_SHOW_CUMULATIVE_CACHECONTEXT_HANDOFF_NEW_TASK_MODECONTEXT_HANDOFF_FILE
auto 模式不会模拟点击。它只要求续发模型在客户端确实提供 create_thread 等原生工具时创建新任务;工具不可用时退回手动提示。
缓存覆盖率使用客户端实际记录的 cached_input_tokens / input_tokens。第三方 API 未回传缓存字段时显示“本轮不可用”,而不是 0%;覆盖率只说明缓存 token 占比,不代表该供应商的具体折扣。
npm test- OpenAI 将
transcript_path定义为便利接口而非稳定协议。插件解析失败时会安静放行,不影响正常任务。 systemMessage是 warning,不是助手回复;当前客户端可能只记录钩子调用而不在对话结尾渲染 warning。- 普通 Chat 模式是否提供 Codex 生命周期钩子取决于客户端功能;本插件只作用于桌面客户端中的 Codex 工作区。
- 客户端会要求用户单独信任命令钩子,这是安全设计,不应绕过。
- OpenAI Hooks 文档
- OpenAI ChatGPT 桌面客户端文档
- Ponytail 的原生插件和薄生命周期钩子结构
MIT License