📈 GH Trending Explorer 🎲 Surprise me

← all repos

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 后