本地监控 Codex 的模型使用、5h/7d 额度水位与容量拒单,并用探针即时验证「请求 A 却被悄悄换成 B」的模型偷换。纯 Python 标准库,数据不出本机。
中文 | English
一个纯本地、零依赖的小工具:监控你 Codex 的模型使用、额度水位、容量拒单,并能主动探测「模型偷换」—— 你请求的是 A,服务端实际派出的却是 B。
OpenAI 在容量紧张时会启用 safety buffering 机制:你请求高端模型(例如 gpt-6-astra),
服务端可能悄悄把请求改派到更快/更小的模型(例如 gpt-5.6-luna),界面不会有任何提示。
被偷换的输出质量会明显下降,而你完全不知道原因。
本工具把这个现象变成看得见的数据。
| 问题 | 数据来源 | 说明 |
|---|---|---|
| 我都在用哪些模型?用了多少? | 本地会话日志 | 每一轮实际生效的模型、轮次、token 用量、时长、项目分布 |
| 我的额度还剩多少? | 本地会话日志 | Codex 上报的 5 小时 / 7 天窗口用量百分比(含重置时间) |
| 我被容量拒单了多少次? | 本地会话日志 | Selected model is at capacity 这类错误的次数与明细 |
| 现在请求 X 会被派什么? | 主动探针 | 发一条最小请求,读服务端实际派出的模型,即时验证是否被偷换 |
| 历史上偷换过多少次? | 探针历史 | 每次探针的「请求 → 实际」记录与偷换率 |
工具有两条独立的数据通道:
Codex 会把每一轮会话事件写入本地文件:
~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl
每个 JSONL 行是一个事件,本工具增量解析其中四类:
| 事件 | 提供什么 |
|---|---|
turn_context |
该轮实际生效的模型(payload.model)、推理力度、所属项目(cwd) |
token_usage_record |
该轮 token 用量(输入/输出/缓存命中) |
event_msg/task_complete |
轮时长、首字延迟、错误信息(容量拒单就在这里) |
event_msg/token_count |
rate_limits 字段里的 5h/7d 窗口额度用量百分比 |
已知限制(实测结论):当服务端偷换模型时,Codex 会把偷换后的模型一致化地写进本地日志 ——「请求字段」和「实际字段」都会变成偷换后的模型。因此历史日志无法还原偷换事件, 这是探针存在的根本原因。日志里的
safety_buffering事件类型在 Codex 内部存在, 但不会被完整落盘。
用你本地的 Codex 登录态(~/.codex/auth.json),向
chatgpt.com/backend-api/codex/responses 发一条最小请求(“hi”,low 推理力度),
读取 SSE 流里 response.created 事件返回的模型名:
- 请求
X,返回X→ 一致 - 请求
X,返回别的 → 被偷换,同时记录响应头x-codex-safety-buffering-enabled
每次探针只消耗极少量额度(一条 "hi"),面板上点一下即可,也可以自己挂 cron 定时跑。
要求:Python 3.8+(仅标准库,无需 pip install 任何东西)。Windows / macOS / Linux 均可。
git clone https://github.com/<you>/codex-model-watch.git
cd codex-model-watch
# 用真实数据启动(自动扫描本地会话日志并打开浏览器)
python codex_model_watch.py
# 没有登录态 / 只想看看界面长什么样
python codex_model_watch.py --demo然后浏览器会自动打开 http://127.0.0.1:8787。
| 参数 | 说明 |
|---|---|
--port 8787 |
本地网页端口 |
--max-age-days 30 |
只解析最近 N 天的日志,0 = 全部(首次扫描建议先限定天数,历史越大越慢) |
--codex-home PATH |
Codex 主目录(默认 ~/.codex) |
--demo |
内置演示数据,不读取真实日志 |
--scan-only |
只扫描解析并打印模型分布摘要,不启动网页 |
--no-open |
不自动打开浏览器 |
数据库存在 ~/.codex-model-watch/state.db(SQLite),重复启动是增量解析,不会重复计数。
- 先用 Codex 正常登录一次(保证
~/.codex/auth.json存在且未过期); - 打开面板,在「偷换探针」区输入要验证的请求模型(例如
gpt-6-astra); - 点「立即探测」,几秒后显示:请求 X → 实际派出 Y,一致或被偷换一目了然;
- 探针历史会沉淀成偷换率曲线,配合定时任务(如每 2 小时一次)即可长期观察偷换窗口。
- 所有解析、统计、存储都发生在本机;数据库在本机;网页只监听
127.0.0.1; - 唯一的外发请求是你手动触发的探针(发给你自己的 Codex 后端);
- 仓库代码里没有任何凭据、遥测或上报。
- 历史偷换无法从本地日志还原(见上文「已知限制」),探针只能验证当下;
- rollout 是 Codex 的内部格式,随版本演进可能变化(本工具在 Codex CLI 0.153–0.155 上实测通过);
- 探针的结论只代表「探测那一刻」的状态,容量紧张时段偷换是动态开关的。

