ysh1112 / codex-model-watch
git clone https://github.com/ysh1112/codex-model-watch.git
最近被codex的模型降智搞得很痛苦,所以做了这个用来监控,现在分享给大家,可以看看自己模型是否被替换掉(如果需要可以看任何AI的模型是否被替换掉,稍微改改登录凭证即可,包括中转站)。最后,这个还可以看到你是否被灰度到了最新模型上面。
—
stars, 24h
—
stars, 7 days
+241
stars, 30 days · #1,083
241
★ total
42
forks · 3 open issues
Star history starts 2026-10-20; the chart appears after the second daily snapshot.
LanguageHTML
LicenseMIT
Created2026-09-20 (1mo ago)
Last push12d ago
Watchers0
OwnerUser
Links
README excerpt
# codex-model-watch 本地监控 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 会被派什么? | **主动探针** | 发一条最小请求,读服务端实际派出的模型,即时验证是否被偷换 | | 历史上偷换过多少次? | 探针历史 | 每次探针的「请求 → 实际」记录与偷换率 | ## 原理(重要,请先读) 工具有两条独立的数据通道: ### 1. 本地会话日志(零侵入、零额度消耗、全历史) Codex 会把每一轮会话事件写入本地文件: [code] 每个 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 内部存在, > 但不会被完整落盘。 ### 2. 主动探针(偷换的即时验证) 用你本地的 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 均可。 [code] 然后浏览器会自动打开 `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),重复启动是增量解析,不会重复计数。 ## 探针怎么用 1. 先用 Codex 正常登录一次(保证 `~/.codex/auth.json` 存在且未过期); 2. 打开面板,在「偷换探针」区输入要验证的请求模型(例如 `gpt-6-astra`); 3. 点「立即探测」,几秒后显示:**请求 X → 实际派出 Y**,一致或被偷换一目了然; 4. 探针历史会沉淀成偷换率曲线,配合定时任务(如每 2 小时一次)即可长期观察偷换窗口。 ## 深度金丝雀(2026-10 新增:识破"自报造假"型软换) **为什么需要它**:2026-10 起,服务端在软换模型时**自报字段仍写请求的模型名**—— 「立即探测」读到的"实际派出"可能是假的(自报造假)。此时只有**行为特征**不会说谎: 真旗舰模型思考数秒才吐首字、推理量大;被换成的轻量模型秒回、几乎不推理。 **用法**:面板输入模型名,点「🔍 深度金丝雀」。它会发一道固定的多步推理题 (effort=high,每次约几百~几千 token),然后给出判定: | 判定 | 含义 | |---|---| | `ok` | 首字慢 + 推理深(大概率真货) | | `suspect(快而浅)` | 秒回 + 浅答(被换成轻量模型) | | `suspect(旧壳:…)` | 自报旧身份/cutoff≤2024/小上下文(被换成 o3 类旧旗舰壳——注意这类壳思考慢、答题也对,只有身份指纹能识破) | | `+答错` | 附带答案校验失败(辅助信号) | 实测区分度(2026-10):同一时刻,个人官方号的 `gpt-6-astra` 金丝雀首字 **7.2 秒**、 答案正确;被换通道的 astra 首字 **1.2 秒**、行为指纹 99% 贴合轻量模型。 **监控中转站/号池**(可选):启动时带 `--api-base https://你的中转站 --api-key sk-xxx`, 金丝雀即改打中转站的 `/v1/chat/completions`,可对号池、聚合网关做同样的真伪抽检。 ## 隐私 - 所有解析、统计、存储都发生在本机;数据库在本机;网页只监听 `127.0.0.1`; - 唯一的外发请求是**你手动触发的探针**(发给你自己的 Codex 后