应用尚未公证,首次启动需在系统设置→隐私与安全性中手动放行;需在菜单栏点 Install 注册插件并信任 hooks,否则 Codex 不会执行;需要带插件 hooks 的 Codex(桌面版或 CLI,测试于 0.154)和系统 python3;指纹库是闭集,未收录的模型会映射到最相近的模型。

curl -fsSL https://raw.githubusercontent.com/kiyoakii/is-gpt-nerfed/main/install-app.sh | shmacOS 15 或更新版本;README 未说明 GPU 或显存要求,检测本身在本地 Mac 上运行,不依赖独立显卡。
检测 Codex 是否偷偷把你选的模型换成更弱版本,本地运行不花 token
检测 OpenAI Codex 模型是否被悄悄降级(缩水)的工具,通过对比输出质量判断服务是否变差。
核心能力
- 读取 Codex 每轮记录,标记模型、推理强度、上下文窗口的静默变化
- 定时 fork 会话让模型生成约 300 个随机数,用 ModelTrace 指纹库比对
- 给出 Match、Suspicious、Downgrade 等判定并推送 macOS 通知
- 菜单栏面板列出 48 小时内会话及最近判定,可手动 Probe 或 Retry
- 支持 halt_on_mismatch 在判定降级后阻断工具调用
容易踩的坑
- v0.5.30.5.3最新正式版2026-09-29 · 2026-09-29 05:55 UTC
- 0.5.2 picked the wrong codex: any
codexon PATH won over the one inside the ChatGPT app, so a Mac with an older Homebrew or npm CLI ran every probe through it. The server refuses such a client the desktop's model ("The 'gpt-6-astra' model requires a newer version of Codex"), it cannot read the sessions the desktop now saves in its paginated format ("paginated_threads is not supported yet"), and it does not list the plugin's hooks, so the panel said to run install.sh. When several codex binaries exist, the newest one now runs the probes (issues #10, #11). - ChatGPT 26.924 moved the desktop app's codex from
Contents/Resources/codextoContents/Resources/codex-cli/bin/codex, so on a Mac without a codex CLI 0.5.2 found no codex at all. Both locations are known now. nerfed doctorshows the codex version, the other codex binaries it found, and warns when the one in use is older than the Codex that saved your latest session. Probe reports say which codex version ran them.- The fresh-session probe no longer insists on the OpenAI provider: it gets whatever a new session of yours gets, so a relay set up in config.toml (for example by cc-switch) is checked as well.
- The hook status is checked again as soon as a different codex binary is in use, instead of showing the old answer for up to 15 minutes.
- 0.5.2 picked the wrong codex: any
- v0.5.20.5.22026-09-25 · 2026-09-25 09:25 UTC
查看更新说明
- The fingerprint bank now knows gpt-6-sol, gpt-6-luna and claude-opus-5-5 (ModelTrace's 2026-09-23 bank). Sessions on those models get a verdict instead of "Unlisted" (issues #9).
- The app runs on macOS 15 and newer; it used to require macOS 26. The one Liquid Glass control falls back to a plain capsule on older systems, and the installer says so instead of leaving a bundle macOS refuses to open, pointing at the plugin, which never needed the app (issue #7).
- A probe no longer fails with "thread metadata lacks model" when Codex reports a session without one: the model, reasoning effort and directory come from the session's own record, and the probe says which of them it had to fill in (issue #8).
- Hooks are recognised whatever marketplace they were installed from; only the plugin's own name has to match, so a fork or a renamed marketplace no longer reads as "Codex does not list the plugin's hooks" (issue #8).
- Codex's own complaints about loading the hooks are shown by
nerfed hooks status,nerfed doctorand the panel, instead of being visible only inside Codex's hooks screen. Hooks Codex has switched off are reported as such. - The SessionEnd hook asks for 3 seconds instead of 5, which is what Codex allows: it used to clamp the value and report a hook loading problem for it.
- v0.5.10.5.12026-09-18 · 2026-09-18 12:18 UTC
查看更新说明
- The 0.5.0 app crashed at launch on every Mac except the one that built it: the localization looked its resource bundle up through SwiftPM's generated accessor, which only checks the .app root and the build machine's absolute path. The bundle is now located explicitly (Contents/Resources first) and a missing bundle falls back to English instead of trapping. Reported and fixed by JoyboyBrian (#2, #4).
nerfedlinked into ~/.local/bin by install.sh failed with "No such file or directory": the wrapper resolved the repository from the symlink's own path. It follows the symlink first now. Reported and fixed by JoyboyBrian (#3, #5).- The 30-minute schedule missed sessions: the hooks only ran it at the end of a turn, so a session that went quiet
before its due time (or whose last turn ended in an error, which fires no Stop hook) was never probed, and the
panel showed it as "due" forever. The app now runs
nerfed tickwhen the snapshot shows a thread that is due and active, and the tick launches the same background probe the Stop hook would. Threads quiet for more than 15 minutes are left alone.
- v0.5.00.5.02026-09-17 · 2026-09-17 17:36 UTC
查看更新说明
- The app speaks Simplified Chinese: the panel, settings, evidence lines, progress and error messages follow the system's preferred languages, with English as the fallback. Model IDs, reasoning-effort values and your own session titles stay as they are; stored records, CLI output and notifications are unchanged. A Chinese README (README.zh-CN.md) came with it. Contributed by sudoHG (#1).
nerfed selftestcrashed on its own synthetic analysis; an analysis without candidates is now Invalid instead of an error.- The hooks' fallback path points at the plugin's source (the checkout or the app bundle) instead of a Codex cache directory, so hooks keep working after a version bump makes Codex delete the old cache.
- v0.4.40.4.42026-09-16 · 2026-09-16 03:58 UTC
查看更新说明
- A failed attempt no longer sends a notification; it is logged and the row offers Retry. Codex's transient "thread history projection is behind durable rollout" store error counts as transient: one retry after a pause.
- config.json keeps only the settings you changed, so new defaults apply after an update.
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
English · 简体中文
You pick a model in Codex. This tells you whether that model is actually the one answering. If it isn't, you get this:
What it checks
Everything runs on your Mac. Nothing is uploaded.
Codex records, for every turn, which model and reasoning effort it asked for. The plugin reads those records after
each turn and flags what changed without you changing it: a model swap, a lower reasoning effort, a hidden internal
model such as gpt-reserve, a smaller context window. A move to a newer or larger model is reported as well, since
a rollout can go either way. This costs no tokens.
On a schedule, the plugin also forks your session three times, ephemerally, through the same app-server call the desktop uses for a side chat, with the session's own model and reasoning effort. Each fork is asked for about 300 "random" numbers. A language model picks random numbers with a bias that is characteristic of the model. ModelTrace's calibrated bank turns the three answers into a fingerprint (100 % accuracy with three answers in cross-validation), and the verdict compares that fingerprint with the model you selected:
| verdict | meaning |
|---|---|
| Match | the model you selected answered |
| Suspicious | the fingerprint leans elsewhere, but not confidently; it stands until the next probe |
| Downgrade / Upgrade / Rerouted | a confident mismatch: top candidate at 80 % or more, your model at 20 % or less, at least two answers |
| Downgraded | Codex's own records show a silent switch; no fingerprint needed |
| Upgraded | Codex's own records show a move to a newer or larger model |
| Unlisted | your model is not in the fingerprint bank yet |
| Invalid | no usable answer (tool use, refusal, network); not a verdict, the row keeps its last one and offers Retry |
A mismatch reaches you as a macOS notification, a message in the session, and a red face in the menu bar. A match is not announced.
Install
macOS 15 or newer. One line in Terminal installs the latest release and opens it:
curl -fsSL https://raw.githubusercontent.com/kiyoakii/is-gpt-nerfed/main/install-app.sh | sh
You can also download the disk image from Releases and drag IsGPTNerfed to Applications. The app is not notarized yet, so macOS blocks that first launch until you allow it under System Settings → Privacy & Security.
Click the face in the menu bar and press Install. That registers the bundled plugin with Codex and trusts its hooks. When a newer release is out, the footer says so and a notification arrives once; click it and the app downloads the new build, checks its checksum, replaces itself and relaunches.
Without the app, on any macOS:
git clone https://github.com/kiyoakii/is-gpt-nerfed ~/is-gpt-nerfed && cd ~/is-gpt-nerfed && ./install.sh
Say yes when it asks to trust the hooks. Codex runs no hook you have not trusted, and it does not tell you.
Requires a Codex with plugin hooks (desktop app or CLI; tested on 0.154) and the system python3. ./uninstall.sh
removes everything.
Using it
The macOS interface supports English and Simplified Chinese, following the system's preferred languages with English as the fallback. This includes app-generated evidence, progress messages and diagnostics shown by the app. User session titles, model IDs, reasoning-effort values and unrecognized external diagnostics keep their original text. Stored records, CLI output, notifications and ModelTrace's calibrated probe prompts are unchanged.
Every session you work in is probed in the background after 30 minutes of activity: the hooks run the schedule
after each turn, and the menu bar app catches a session that goes quiet right after its due time. To probe a
session right away, say $is-gpt-nerfed in it.
The menu bar panel lists the sessions of the last 48 hours with their last verdict. Click a session for its report (fingerprint, earlier probes, evidence) and right-click for actions. Each session has Probe and Retry, and the Fresh session row probes a brand-new session to show what a new session gets right now.
From a terminal: nerfed probe now (pick a session), nerfed report, nerfed explain <probe>, nerfed log --since 2h.
Settings are in the app, or nerfed config set <key> <value>:
| key | default | |
|---|---|---|
frequency | 30m | per session: every N minutes of activity (30m) or every N turns (turns:8) |
fresh_frequency | manual | probe a brand-new session every N minutes, whatever you are doing |
mode | auto | auto probes in the background, nudge only reminds you |
halt_on_mismatch | false | block tools after a mismatch until you say resume |
notify_on_ok, announce_ok | false | also report Match |
hide_titles | false | screenshot mode: neutral session names, no account |
check_updates | true | ask GitHub for a newer release every 10 minutes |
Accounts
Sessions are shared between Codex accounts, and a downgrade may be tied to the account rather than the session. Every probe is therefore tagged with the signed-in account (a hash, never the id). After you switch accounts, older verdicts show as "another account" and those sessions are probed again.
Limits
- "The model you selected" is the model Codex asked for. If the server swaps the weights and keeps the name, only the fingerprint or a smaller context window can show it.
- The bank is closed-set: a model outside it is mapped to its nearest look-alike.
- A probe costs three short answers on your account. A fork that has not answered within five minutes is replaced once, so a slow model does not drop out of the sample.
- A model or effort change made through Codex's own settings is shown as a question ("was that you?"), because the plugin cannot tell whether you or Codex changed it.
- The probes run in a private app-server process that identifies itself as the client it checks for (the desktop app, or the CLI), because the service may route by client. Anything else that differs between the desktop's own connection and the probe's is invisible to it.
Privacy
The plugin reads ~/.codex (session records, the models cache, and auth.json only for an account hash and a masked
e-mail) and writes to ~/.codex/is-gpt-nerfed (probes, verdicts, log.jsonl). The forks are ordinary Codex
inference under your account. The only network request of its own is one to GitHub every ten minutes for the latest
release tag, while the app is open; switch it off in Settings and it makes none.
Credits
ModelTrace (xqy2006, MIT) for the fingerprint bank, scorer, prompts and the fork-and-verify sequence; hlwy-ai-checker for the random-number idea; simple-term-menu (MIT) for the session picker.
MIT license. Internals, build and contribution notes: docs/DEVELOPMENT.md.