AI Second Opinion
One document goes to several AI models at once, and one report comes back. Sending your document to the AI vendors behind the channels you turn on is the whole point; the tool itself has no server and collects nothing, and on its own it only checks GitHub for a new version, at most once a day (what goes where).
What a real run found
Section titled “What a real run found”A run of version 1.113.0 on 2026-10-17, on the author's machine and accounts: seven CLI agents, not the published default panel (that one is below). They were asked where this tool should be listed and what would block a listing, with our own table of channels and their rules attached. From that run's REPORT.md, which stays on the author's machine:
| Model (how it ran) | Time | Links cited | Live | Dead |
|---|---|---|---|---|
| GPT-6.1 Sol (Codex CLI) | 16 min | 50 | 40 | 0 |
| Qwen 3.8 Max (Qwen Code CLI) † | 26 min | 14 | 7 | 0 |
| Grok 4.7 (Grok Build CLI) | 7 min | 21 | 17 | 0 |
| Gemini 3.8 Flash (Antigravity CLI) | 5 min | 29 | 21 | 0 |
| Muse Spark 1.3 (opencode, Go plan) † | 1 min | 22 | 16 | 2 |
| MiMo v2.6 Pro (mimo CLI) † | 8 min | 1 | 1 | 0 |
| MiMo v2.6 Flash (opencode) | 12 min | 0 | — | — |
† A route the published version leaves off. Live: the link opened when the tool checked it; dead: it returned 404; the rest had moved, blocked the check or could not be checked. A live link does not show that the model read it.
- A rule our own table had missed. It said we meet the entry rules of the awesome-claude-code list. Five of the seven (GPT-6.1 Sol, Qwen, Grok, Gemini, MiMo Pro) pointed to a rule further down its CONTRIBUTING.md: «if your project requires any form of signup or payment, this is a blocker for reviewing it - I can only recommend such a resource on the basis of community adoption signals».
- A disagreement, kept in view. Build an MCP server now? MiMo Flash, the one voice that cited no links: «Build it — as a thin wrapper, started now…». The other six: not now.
- What was cited is not what was read. Gemini cited 29 links; the tool saw it open 2 of them. Muse Spark's two dead links are one real GitHub Docs page, cited twice with part of the path replaced by «...».
The seven worked in parallel: 74 minutes of model time took 26 min 31 s, 15 seconds more than the slowest voice. On your OpenRouter key the published default panel pays for at most two voices: Muse Spark when you have no Meta key ($0.002 in our first run, each web search extra) and, on a machine without opencode, MiMo v2.6 Flash ($0.0003 for our first two-line question); the rest runs on your subscriptions or free (details below), and --dry-run shows the plan before anything is spent. What the console shows during a run is in What one run looks like.
A panel pays off twice:
- Different knowledge. Each model was trained on its own data and runs in its own harness: the vendor's CLI agent or an API, its own web search, its own way of reading pages. So when you ask "how should I design this" or "review this code", each one answers with its own recommendations, and together they cover more than any one of them.
- An independent check. The models never see each other's answers. When they agree, that means something; when they disagree, it means more. One AI agreeing with you proves nothing.
Every review answer ends with an UNASKED section. That is where the model puts a wrong assumption, a risk, a better alternative or the thing worth checking next — only what it would defend as significant, and if there is nothing, it says so. The most valuable finding often comes from there.
Send the same document to several independent AI models at once: GPT, Gemini, Grok, Kimi, Qwen, DeepSeek, GLM, MiMo, Muse Spark, NVIDIA Nemotron, and Claude if you switch it on. You get back:
- what each model found and what it recommends;
- its UNASKED section — what matters that you did not ask about;
- where the models contradict each other;
- a mechanical check for the AI hallucinations a script can catch: dead links, links the model cited without opening them, and quiet refusals.
Any AI agent can install it, not only Claude Code. Any agent with terminal access will do — for example Codex CLI, Cursor, Gemini CLI, opencode, Kimi Code or Qwen Code: this is plain Python with no dependencies. Give the agent the repository link and ask it to install the tool (a ready-made request is under «Install»). The repository carries AGENTS.md, the instructions for AI agents on how to install the tool and run a review, so from then on the agent runs the panel itself. The sequence an agent runs — install.ps1, doctor.py and a free --dry-run — was checked on 2026-10-05 from a plain terminal, without Claude Code.
In Claude Code the plugin reacts to "second opinion" by itself. For any other agent install.ps1/install.sh already installs the skill to every known location (~/.claude, ~/.agents, ~/.codex, ~/.config/opencode, ~/.gemini) so the same phrase works there too; if it doesn't, add one line to its standing instructions: "When I ask for a second opinion, run AI Second Opinion following ~/.claude/skills/model-orchestration/SKILL.md (fallback: ~/.agents/..., ~/.config/opencode/..., or absolute python "$HOME/.claude/skills/model-orchestration/orchestrate.py" --ask "...")".
Pure Python, zero dependencies, MIT license.
Русская версия · How it works, in technical detail · Install · When something breaks · For AI agents
Getting started: accounts and keys
Section titled “Getting started: accounts and keys”To start you need one OpenRouter key and a couple of free programs. Everything else adds voices but is optional: the tool runs whatever you have and tells you plainly what it skipped.
| Step | What to do | What it gives you | What it costs (as of 2026-10-05) |
|---|---|---|---|
| 1. OpenRouter — the main one | Sign up at openrouter.ai, add credit and create a key (Keys → Create Key). Put it in the OPENROUTER_API_KEY variable in your own terminal, not in a chat with an AI (how — INSTALL.md) |
The paid voices: the two Muse Spark Contributor voices (1.2 and 1.3) where opencode has no OpenCode Go plan (Spark 1.2 runs on a Meta key instead when you have one) and, where opencode is missing, MiMo v2.6 Flash in the cheap panel; Kimi K3, Qwen, DeepSeek V4 Pro and GLM 5.3 in the standard one; MiMo v2.6 Pro and Gemini 3.8 Flash (orgemini38flash) only when you name them; a fallback route to Nemotron |
Pay per token on the key; prices are in the tables below. OpenRouter takes a 5.5% fee when you buy credits. Free models: 50 requests a day, or 1000 a day once you have bought at least $10 of credits |
| 2. opencode CLI | npm install -g @opencode/cli (v2; had the old opencode-ai? npm uninstall -g opencode-ai first) |
A free voice: MiMo v2.6 Flash (Xiaomi). opencode's free GLM 5.3 Flash and DeepSeek V4.1 Flash share its daily allowance and start only when named (see below). Nemotron left opencode in 1.116.1, and Step 5 Preview (on your NVIDIA key, step 2b) runs here only when you name it since 1.118.0. No free Muse Spark since 2026-10-17 (see below). With an OpenCode Go plan, since 1.120.0: both Muse Spark Contributor voices, 1.2 and 1.3, on the plan, after one setting in the OpenCode Console (below, «Spark on an OpenCode Go plan») | Free, no key and no account: that is how it works for us (checked on 2026-10-18). OpenCode warns that its free models are available "for a limited time", and they do come and go |
| 2b. NVIDIA key — optional, since 1.114.0 | Sign in at build.nvidia.com and create an API key. Put it in the NVIDIA_NIM_API_KEY variable in your own terminal (how — INSTALL.md) |
Two free voices on NVIDIA's own endpoint: DeepSeek V4.1 Flash (since 1.118.0, in place of Step 5 Preview) and Nemotron 3 Ultra; GLM 5.3 Flash on the same key answers when DeepSeek does not | Free at the point of use (NVIDIA's free endpoints allow about 40 requests a minute). Its queue is slow at times: 57–110 s before the first byte on 2026-10-23 |
3. Antigravity CLI (agy) |
Install it, sign in with a Google account and run patch_agy_permissions.py once. Without that step the answers come back empty (INSTALL.md) |
Gemini 3.8 Flash; Gemini 4 Argon on the standard panel | Free on a personal Google account, with weekly limits. Google AI Pro ($19.99/month) and Ultra ($99.99 or $199.99/month) raise them |
| 4. Grok Build CLI | Install it and run grok login (INSTALL.md) |
Grok 4.6 with live web search | An xAI account. xAI says Grok Build is now available to everyone; SuperGrok ($30/month) and SuperGrok Plus ($100/month) raise the limits. Whether the CLI works on a free account we have not checked |
| 5. Codex CLI — for the standard panel | Install it and sign in with a ChatGPT account (INSTALL.md) | GPT-6.1 Sol | A ChatGPT plan: Plus $20/month, Pro $200/month. OpenAI says Codex is also in Free and Go ($8/month); whether GPT-6.1 Sol is available there we have not checked. Limits are counted in 5-hour and weekly windows |
| optional | Claude Code with a subscription (INSTALL.md) | Claude Opus 4.6. Off by default | Claude Pro $20/month, Max from $100/month. Claude Code is in every paid plan |
| optional | A Meta key, MODEL_API_KEY (INSTALL.md) |
Muse Spark 1.2 Contributor straight from Meta: with this key, where opencode has no Go plan, the cheap panel's Spark 1.2 voice runs here instead of through OpenRouter (without the Go plan Spark 1.3 takes OpenRouter, key or no key) | Per key: $0.10 / $0.20 per 1M tokens (Contributor tier) |
There is no free Kimi any more. NVIDIA retired its free Kimi K3 on 2026-10-15: the endpoint answers HTTP 410 «end of life». Versions 1.106–1.111 asked for a step «2b» (the Kimi Code CLI and an NVIDIA_NIM_API_KEY); since 1.112.0 the Kimi Code CLI is unused, the nvkimik3 channel ships switched off, and the cheap panel has no Kimi voice. The NVIDIA key is used again since 1.114.0: by DeepSeek V4.1 Flash (Step 5 Preview until 1.117.2) and Nemotron 3 Ultra (step 2b above). Kimi K3 answers in the standard panel through OpenRouter (kimik3, paid). «only kimik3» starts that channel alone; «only kimi» does too on the standard panel, while on the default cheap panel it stops and asks you to name kimik3: a family word never moves you from free to paid in silence.
There is no free Muse Spark any more. On 2026-10-17 opencode stopped serving its free Muse Spark 1.3 (opencode/muse-spark-1.3-contributor-free): the call answers «provider.no-route: Model unavailable» and the model is gone from opencode models. Since 1.113.3 its channel ocspark13free ships switched off, and the cheap panel's Spark voice is paid; since 1.113.8 it is Muse Spark 1.2 Contributor: spark12cont on a Meta key, otherwise orspark12cont on your OpenRouter key, $0.10 / $0.20 per 1M tokens either way (the price of the Spark 1.3 Contributor it replaces, which took $0.002 in our first run); the plan marks the OpenRouter route PAID. Since 1.120.0 Spark 1.3 Contributor is the panel's second Spark voice (ocspark13go on the Go plan, otherwise orspark13cont); spark13cont, the same model on a Meta key, still starts only when you name it. Instead it opencode gave three more free voices, run live on 2026-10-18: Nemotron 3 Ultra (retired in 1.116.1 — its model left opencode on 2026-10-29), GLM 5.3 Flash and DeepSeek V4.1 Flash; since 1.113.7 GLM and DeepSeek wait in reserve, because they share MiMo Flash's daily allowance (see the cheap panel below). Free models come and go without notice (NVIDIA's free Kimi K3 ended two days earlier); when one disappears, the run names it and says what to do, and opencode models is the live list.
To check what was found: python doctor.py. It prints which keys and programs it found, and never prints a key itself: only present / absent and the length.
🔴 Do not paste a key into a chat with an AI assistant. Set it yourself in the terminal; why is explained under «Install».
How to ask
Section titled “How to ask”In Claude Code with the plugin (and in any agent you gave the line from the top of this page) just say it in plain words:
| You say | What runs (version 1.120.1) |
|---|---|
| "second opinion" (for example, "give me a second opinion on this file") | The cheap panel, the default: 7 models |
| "second opinion, CLI only" | Only the CLI agents of the cheap panel: 5 models — MiMo v2.6 Flash, Gemini 3.8 Flash, Grok 4.6 and, since 1.120.0, Muse Spark 1.2 and 1.3 Contributor through opencode on the OpenCode Go plan (the NVIDIA voices are API calls). Not one paid request on your OpenRouter key. Without the Go plan the two Spark voices still start here and end at once, spending nothing (the plan says so before the run); leave them out with --skip ocspark12go ocspark13go |
| "standard panel" or "all models" | 13 models: the cheap panel plus GPT-6.1 Sol, Gemini 4 Argon, Kimi K3 (through OpenRouter, paid), Qwen 3.8 Max, DeepSeek V4 Pro and GLM 5.3. No Muse Wonder: since 1.113.0 it starts only when named; no MiMo v2.6 Pro: since 1.113.8 it too starts only when named |
| "CLI only, standard panel" | 7 models: the five CLI agents plus Codex (GPT-6.1 Sol) and Gemini 4 Argon |
| "ask only codex", "only codex cli", "only grok" | The one named channel ("codex cli" since 1.120.1: before, "cli" also added every CLI agent) |
| "only opencode", «только opencode» | The opencode voices that are on: in the kit MiMo v2.6 Flash (free); opencode's GLM 5.3 Flash and DeepSeek V4.1 Flash only when named, and since 1.118.0 Step 5 Preview too. "without opencode" runs everything else. Before 1.113.5 the word named only the free Spark that is gone since 2026-10-17. On a day opencode's free allowance was refused, MiMo v2.6 Flash is left out ([skip]): a group word never counts as naming a channel (the cheap panel below) |
| "only ocglm53flashfree", "only ocmimo26flashfree" | That one free voice, also on a day its allowance was refused (otherwise the plan shows [skip] for it, see the cheap panel below) |
| "only mimo flash", «только мимо флеш»; "only glm 5.3 flash", «только глм 5.3 флеш» | MiMo v2.6 Flash: the same voice as in the cheap panel (opencode's free copy where opencode runs). GLM 5.3 Flash: ocglm53flashfree (free, through opencode). Since 1.120.1: before, «мимо флеш» started the paid mimo CLI copy, "mimo flash" was refused and "glm 5.3 flash" started the paid GLM 5.3 |
| "only wonder", "muse wonder", «вондер»; "add wonder" | One Muse Wonder, on your Muse Code subscription where the Muse Code CLI is installed. Without it the run stops before paying and names the paid ones: "only wonder10" (Meta key) or "only orwonder" (OpenRouter) runs that one |
| "only kimi" | The run stops and says why: since 1.112.0 the cheap panel has no free Kimi, and the only Kimi it could start is kimik3 (OpenRouter, paid). "only kimik3" runs it; on the standard panel "only kimi" runs it too |
| "only gemini 4 cli", «только gemini 4 аргон» | Gemini 4 Argon alone (it is on the standard panel, not the cheap one). "only agy31pro" still starts Gemini 3.1 Pro, off since 1.115.0 (below, «By name only») |
| "add mimo 2.6 pro", "only mimo 2.6 pro", "only mimo pro", «добавь мимо 2.6 про», «только мимо про» | MiMo v2.6 Pro through OpenRouter (ormimopro, paid, ≈ $0.06 a run), with the cheap panel or alone. Since 1.119.3: before, "mimo 2.6 pro" started the retired Gemini 3.1 Pro (it answered to the bare word "pro") and no MiMo Pro. The bare words "pro" and "flash" name nothing. "mimo pro" and «мимо про» name it since 1.120.1 (before: the older MiMo v2.5 Pro and the free MiMo Flash) |
| "don't use openrouter" | Everything except the OpenRouter channels |
From a terminal the same is done with flags: --panel cheap (the default), --panel standard, --route "only CLI", --only codex, --skip openrouter. You can see the plan before anything is spent, for free: python routing.py or --dry-run.
Panels: line-up as of 1.120.0, prices as dated below
Section titled “Panels: line-up as of 1.120.0, prices as dated below”How to read the tables:
- Transport. A CLI agent is the vendor's program on your computer (opencode, agy, grok, kimi, codex, claude). It runs on your subscription or for free and needs no OpenRouter key (a provider you add to opencode yourself bills you per call). OpenRouter is an API request on your key, paid per token.
- Effort is how hard the model thinks. Where a model takes a level, the tool sets the highest it accepts; the rows say where a free model takes none and where agy decides itself.
- Price per 1M tokens is from the OpenRouter catalogue on 2026-10-05, input / output; a row that names another date was priced then.
- Per run is the median of our runs from 1 September to 5 October 2026; n is the number of runs, each counted once. Yours will be higher or lower: it depends on the size of the document and the number of web searches. The tool prints the exact amount at the end of every run.
The cheap panel — the default: 7 models
Section titled “The cheap panel — the default: 7 models”| Model | Channel | Transport | Effort | Payment | Price per 1M (in / out) | Per run |
|---|---|---|---|---|---|---|
| Muse Spark 1.2 Contributor (Meta) | ocspark12go on an OpenCode Go plan; else spark12cont with a Meta key; else orspark12cont |
opencode CLI agent on the Go plan; Meta's API; OpenRouter | xhigh (the ceiling) | Go plan; per key | $0.10 / $0.20 (Standard fallback $1.25 / $4.25; OpenRouter's prices of 2026-11-13) | ≈ $0.002 (n=1, 2026-10-18, Spark 1.3 Contributor at the same price: a 5,000-character brief, no web search) |
| Muse Spark 1.3 Contributor (Meta) — new in 1.120.0 | ocspark13go on an OpenCode Go plan; else orspark13cont |
opencode CLI agent on the Go plan; OpenRouter | xhigh (the ceiling) | Go plan; per key | $0.10 / $0.20 (Standard fallback $1.25 / $4.25; OpenRouter's prices of 2026-11-13) | ≈ $0.002 (n=1, 2026-10-18: a 5,000-character brief, no web search) |
| MiMo v2.6 Flash (Xiaomi) | ocmimo26flashfree; ormimo26flash only where opencode is missing |
opencode CLI agent; OpenRouter without opencode | the default: the free version takes no levels; a reasoning budget of 85,000 tokens on OpenRouter | free; PAID on OpenRouter | — ; $0.14 / $0.28 (OpenRouter's prices of 2026-10-23) | $0; ≈ $0.0003 on OpenRouter (n=1, 2026-10-24, a two-line question) |
| Nemotron 3 Ultra (NVIDIA) | nvnemotron3ultra with an NVIDIA key (the opencode copy retired in 1.116.1: its model left opencode) |
NVIDIA's free API | high on NVIDIA | free | — | $0 |
| DeepSeek V4.1 Flash (DeepSeek) — new in 1.118.0, in place of Step 5 Preview | nvdeepseekv41flash |
NVIDIA's free API | max (accepted; its effect on depth not measured) | free, needs an NVIDIA key | — | $0 |
| Gemini 3.8 Flash (Google) | agy38flash |
Antigravity CLI agent (agy) |
not set: agy decides | Google account: free, with weekly limits | — | $0 beyond the plan |
| Grok 4.6 (xAI) | grokbuild |
Grok Build CLI agent | xhigh (the ceiling) | xAI account or plan | — | $0 beyond the plan |
If you lack the main transport, a fallback route to the same model takes over:
- Muse Spark has no free route since 2026-10-17. Since 1.120.0 the panel runs two Spark voices, 1.2 and 1.3 Contributor, and each takes the first route your machine has: the OpenCode Go plan (
ocspark12go,ocspark13go: ready only whereopencode modelslists them, i.e. where opencode is signed in to the plan), then, for Spark 1.2 only, a Meta key (spark12cont), then OpenRouter (orspark12cont,orspark13cont). Every route costs $0.10 / $0.20 per 1M tokens; the plan marks the OpenRouter ones PAID. If the Contributor model fails, the Meta and OpenRouter routes retry on the Standard Muse Spark of the same version at $1.25 / $4.25 (12.5× the input price, 21× the output); each OpenRouter route's spend guard stops a review at $1.00. The Go routes have no backup (below).--skip ocspark12go ocspark13godoes not drop Spark from the cheap panel: it moves both voices to the next route (Meta key or OpenRouter, paid);--skip sparkdrops every Spark voice (measured on the 1.120.0 build). Up to 1.119.3 the panel had one Spark voice andocspark12gowas off.spark13cont(Spark 1.3 on a Meta key) starts only when you name it. - Nemotron 3 Ultra runs on NVIDIA's free API (
nvnemotron3ultra, since 1.114.0) whenNVIDIA_NIM_API_KEYis set; the opencode copy (ocnemotron3ultrafree) retired in 1.116.1 after its model left opencode. With no NVIDIA key the cheap panel listsnvnemotron3ultraand it ends at once, naming the missing key and spending nothing.ornemotron3ultra(OpenRouter: a free model, only its web searches are paid, ≈ $0.07 a run, n=6) takes its place on the standard panel only, and as an--askextra on an OpenRouter key. - MiMo v2.6 Flash has no free route but opencode's (nor have GLM 5.3 Flash and DeepSeek V4.1 Flash, below). Without opencode, since 1.114.0, its PAID copy
ormimo26flashcarries the voice (OpenRouterxiaomi/mimo-v2.6-flash, $0.14 / $0.28 per 1M; our first call took 1.9 s and $0.0003); the plan marks it PAID. It never starts on a machine that has opencode: not when you skipocmimo26flashfreeor opencode, not with "only openrouter", not on a day opencode's free allowance is spent (below); name it to pay for it there:--only ormimo26flash. On an OpenCode Go plan the paid Go copy (ocmimo26flashgo, same model, subscription, no quota_group so it survivesprovider.quota) answers the same brief once after the round instead since 1.116.0; nothing runs after it. Until 1.113.9 a machine without opencode lost this voice (it failed with «binary not found»). - DeepSeek V4.1 Flash (new in 1.118.0, in place of Step 5 Preview) is free on NVIDIA's endpoint and needs
NVIDIA_NIM_API_KEY. It is an API call (nvdeepseekv41flash) with the page-fetch tool and no web search. Without the key the plan says so («NVIDIA_NIM_API_KEY is not set. This channel will fail; set it or exclude the channel with --skip nvdeepseekv41flash.») and the voice ends at once, spending nothing. The model reasons at length and NVIDIA's free endpoint streams slowly, so the voice has 61 minutes: in our first real review (2026-10-31, a 67 KB diff) it was still reasoning when its earlier 20-minute limit ran out (114,348 characters of reasoning, no answer). If it ends without an answer (under 2,000 bytes of text; a timeout counts), GLM 5.3 Flash on the same key (nvglm53flash, 20 minutes) answers the same brief once. In 1.119.0 that fallback can run inside the round when DeepSeek fails inside the first 25 minutes of its start — see the free-voice in-round paragraph below. A timeout past 25 minutes, or a silent stream death, ends the voice with no retry and no fallback. The words "deepseek" and "glm" name the whole family on every transport: a route that excludes glm also turns DeepSeek's fallback off, and--only glmon the cheap panel stops and names the paidorglm53. Step 5 Preview (ocstep5previewnvwith opencode,nvstep5previewwithout) is off since 1.118.0: it ran out of its 20 minutes in two of our rounds and returned 50 bytes in a third; it starts when you name it. - MiMo v2.6 Pro (
ormimopro, OpenRouter, $0.435 / $0.87 per 1M, ≈ $0.06 a run, n=9) is off since 1.113.8: it was almost all of this panel's cost and its slowest voice. It starts when you name it (--only ormimopro); to keep it in every cheap panel, switch it on in your settings file:{ "channels": { "ormimopro": { "enabled": true } } }.mimov26pro, the same model through the mimo CLI, is off too. - Gemini 3.8 Flash. Without
agythis voice ends at once («binary not found (agy)») and, since 1.120.0, nothing paid takes its seat:orgemini38flash(OpenRouter, $0.825 / $4.125 per 1M on 2026-11-13, effort high — this model's ceiling) starts only when you name it (--only orgemini38flash). Up to 1.119.3 it took agy's place by itself. - Kimi K3. Not in the cheap panel since 1.112.0: NVIDIA retired its free Kimi K3 on 2026-10-15 (HTTP 410, «end of life»), so
nvkimik3ships switched off. Kimi answers in the standard panel through OpenRouter (kimik3); «only kimik3» starts it alone (on the cheap panel «only kimi» stops and asks for that name).
Three of opencode's free models share one daily allowance. MiMo v2.6 Flash, GLM 5.3 Flash and DeepSeek V4.1 Flash behave as one daily allowance of requests per network address (measured on 2026-10-18/19; opencode's FAQ dropped its daily request figure for free models on 2026-10-21, and the vendor can change the allowance): every request of every free voice spends it, and so does every run from any machine on your network. Nemotron 3 Ultra was measured outside it. So the cheap panel starts one of them, MiMo v2.6 Flash. If a free voice ends without an answer, its paid Go copy (the same model on the OpenCode Go plan, no quota_group, so it survives provider.quota) answers the same brief once after the round, and nothing runs after it. After provider.quota (the allowance is used up) no fallback starts, since GLM would be refused too, the refused call is not retried, and the refusal is written to ~/.claude/model-orchestration.quota-state.json on your machine; the run says whether that worked. Until 00:00 UTC every run whose plan holds MiMo, --ask and python routing.py included, prints [skip] ocmimo26flashfree with the time left and does not start it, and no other channel falls back into the group: on such a day the cheap panel runs 6 models instead of 7, the standard one 12, "CLI only" 4 (on a machine with every key and CLI; python routing.py prints yours). A refusal from a part of a run that began before 00:00 UTC (the round, its retry or its fallback) is not kept, since the allowance has reset by then. Name a channel to run it anyway, by its channel name, an alias, its model id or a --set pin (--only ocmimo26flashfree, "only ocglm53flashfree"); a group word such as "only opencode" does not count. An answer from the group clears the date, unless the same run was refused too or the refusal was written after that run began (by a run going on at the same time). opencode's DeepSeek V4.1 Flash (ocdeepseekv41flashfree) starts only when named; the cheap panel's DeepSeek V4.1 Flash runs on the NVIDIA key (nvdeepseekv41flash), outside this allowance. Up to 1.113.6 the panel started all three, and on 2026-10-18 they had used the allowance up by 08:25Z; it stayed refused until 00:00 UTC.
In 1.119.0 the fallback for a free voice runs inside the round, not after it (operator's rule 2026-10-31). Within the first 25 minutes of the primary's start, a known refusal (provider.quota, provider.free-limit) or a non-recoverable error dispatches the fallback at once; a known transient (429, 5xx) retries the primary once with a short delay (60 s / 30 s). Silence (clean exit, no error, no answer) and failure past 25 minutes both end the voice with no retry and no fallback — the operator's rule verbatim «silence or past 25 min: no fallback». Paid and subscription voices keep the after-the-round fallback, unchanged. The chat panel (new in 1.119.0, off by default) is exempt from the in-round rule. Env overrides for CI and probe worlds: ORCH_FREE_INROUND_WINDOW, ORCH_FREE_INROUND_RETRY_429, ORCH_FREE_INROUND_RETRY_5XX. To see which classifier branch fired, grep in-round: in run.log or read the free_inround field in diagnostics.json. Since 1.119.2 one step comes before that rule: a free API voice whose request gets no response headers within 300 s sends the same request once more inside the call. The pages it has already read stay in it, and a copy that gets no headers either costs at most 300 s more. Paid channels never re-send (a request with no headers may still be queued and billed). If the copy fails too, the rule above applies.
In total: on your OpenRouter key only the two paid Muse Spark voices, where opencode has no Go plan (Spark 1.2 runs on your Meta key instead when you have one): $0.002 in our first run of one of them (each OpenRouter web search they make costs extra), and, on a machine without opencode, the paid MiMo v2.6 Flash (≈ $0.006 for a review of about 25,000 tokens in and 8,000 out at its price; $0.0003 for our first two-line question), plus your subscriptions. Until 1.113.7 the panel cost about $0.06 a run and took about 15 minutes; MiMo v2.6 Pro, off since 1.113.8, was almost all of the cost and the slowest voice (median 14 minutes). The run time of the 1.118.0 line-up has not been measured yet; after 1.119.0 DeepSeek V4.1 Flash takes at most 61 minutes alone (silence or past-window stall) or 25 + 20 minutes if a known in-window refusal routes to GLM — the old 1.118.0 after-round AUTO-RETRY no longer runs for free voices.
If you do not want MiMo Flash (or any other channel)
Section titled “If you do not want MiMo Flash (or any other channel)”To stop a channel from starting, put this in ~/.claude/model-orchestration.local.json (your own settings file; updates never touch it):
{ "channels": { "ocmimo26flashfree": { "enabled": false } } }Any other channel switches off the same way. If the file already exists, add the channel to its channels section. python routing.py shows who will run, spending nothing.
Spark on an OpenCode Go plan — one setting first. Since 1.120.0 both Spark voices run on your OpenCode Go plan by themselves when opencode is signed in to it (opencode models lists opencode-go/muse-spark-1.2-contributor and opencode-go/muse-spark-1.3-contributor); up to 1.119.3 you switched ocspark12go on here yourself. A Go workspace refuses both models until its owner or an admin turns one switch on: in the OpenCode Console open Settings › Privacy (https://opencode.ai/console/<workspace id>/settings/privacy; the page is shown to owners and admins of a workspace with an active Go subscription) and turn on «Allow paid endpoints that train on request data» (opencode.ai/docs/go, read 2026-11-13: off by default, needed by both Muse Spark Contributor models). Until then each call fails with «This Go model trains on request data. Allow paid endpoints that train on request data in your workspace's Privacy settings to use it.», and the run names the action in REPORT.md's channel table and in HANDOFF.md, opposite the Spark that failed. The Go routes have no backup: a backup that starts paying on its own is not one we ship. If a plan run gives no answer (switch off, limit reached, plan unpaid, timeout), its record says why and the other voices' answers stand. To send both voices through OpenRouter (Spark 1.2 through your Meta key when you have one) instead, skip the Go copies for one run (--skip ocspark12go ocspark13go) or switch them off in your settings file:
{ "channels": { "ocspark12go": { "enabled": false }, "ocspark13go": { "enabled": false } } }On the plan, Spark costs $0.10 / $0.20 per 1M tokens out of the plan's limits (opencode.ai/docs/go, 2026-10-08); a live run on a 35,000-character brief used ≈ $0.01. If «Use balance» is on in the opencode console, the plan does not refuse past its limit; it bills your Zen balance instead.
If an answer is «word salad». A model sometimes returns its own control tokens mixed with fragments of words in several languages instead of text: NVIDIA's free Kimi K3 did so from 6 October until it was retired, and users of other programs reported the same. The run marks such an answer CORRUPTED OUTPUT: REPORT.md says «🔴 CORRUPTED», HANDOFF.md tells you not to open it, and it does not count as an answer.
The standard panel — 13 models: the cheap one + 6
Section titled “The standard panel — 13 models: the cheap one + 6”| Model | Channel | Transport | Effort | Payment | Price per 1M (in / out) | Per run |
|---|---|---|---|---|---|---|
| GPT-6.1 Sol (OpenAI) | codex |
Codex CLI agent | xhigh | ChatGPT plan | — | $0 beyond the plan |
| Kimi K3 (Moonshot) — the only Kimi since 1.112.0 (NVIDIA retired its free one on 2026-10-15) | kimik3 |
OpenRouter | max | per key | $0.67 / $14.00 | ≈ $1.38 (n=3) |
| Qwen 3.8 Max (Alibaba) | qwen38max |
OpenRouter | xhigh (the ceiling) | per key | $2.00 / $6.00 | ≈ $0.59 (n=3), see below |
| DeepSeek V4 Pro | ordeepseekv4pro |
OpenRouter | xhigh (the ceiling) | per key | $0.209 / $0.418 | ≈ $0.18 (n=3) |
| GLM 5.3 (Z.ai) | orglm53 |
OpenRouter | max | per key | $0.05 / $7.00 | ≈ $0.19 (n=3) |
| Gemini 4 Argon (Google) — new in 1.115.0 | agy4argon |
agy CLI agent | high (the ceiling: agy offers low, medium, high) | your Google subscription: its own weekly limit on Google AI Pro | — | one review: 22% of that week's limit (n=1) |
Gemini 4 Argon costs no money by itself: agy runs it on your Google subscription. On a Google AI Pro plan it has its own weekly limit, apart from the Gemini quota (agy's /usage lists it separately; agy says a higher Argon quota comes inside the larger Gemini quota on Ultra plans). One review of ours (a release brief with seven attachments: 17.5 minutes, 276 tool calls) used 22% of that week (n=1), so about four standard runs fill it. What agy does next is its own «Use AI Credits» setting (agy, then /config): when it is on, agy goes on and spends AI credits (/credits shows the balance); with it off we have not measured what happens. Where the account does not offer Argon, agy refuses at the start, as it does for Gemini 3.1 Pro here (exit 1 in seconds, nothing spent); without the agy CLI the plan still lists agy4argon and it fails at dispatch with «binary not found», while Gemini 3.8 Flash falls back to its OpenRouter copy; Argon has no other transport in the kit. --skip agy4argon leaves it out of one run, {"channels": {"agy4argon": {"enabled": false}}} in your settings file out of every run.
Nemotron 3 Ultra moved to the cheap panel in 1.113.3, free through opencode, and since 1.114.0 it runs first on NVIDIA's free API when you have an NVIDIA key; its OpenRouter route, ornemotron3ultra, runs here only where both are missing. The opencode copy retired in 1.116.1 (its model left opencode).
Muse Wonder left this panel in 1.113.0: it starts only when named (below, «By name only»).
ℹ️ Qwen 3.8 Max: until v1.108.0 this line said that 0 of our 8 runs had answered. That was our counting error: the 8 included copies of the same run, and the harness graded real answers as failures because OpenRouter serves the name qwen/qwen3.8-max as its dated snapshot qwen/qwen3.8-max-0902. Counted once per run, all 3 of our runs since 1 September ended with a full answer (22–63 KB). Since v1.108.0 such a snapshot is a note in the report, not a failure.
In total: about $2.5 a run on your OpenRouter key plus subscriptions; Kimi K3 through OpenRouter (≈ $1.38) is the largest part. How long Kimi takes on OpenRouter we have not measured (3 runs). Of the other models added here, GLM 5.3 and Qwen 3.8 Max take longest, medians 16 and 15 minutes (GLM's longest run: 44 minutes). Most paid channels have a spending ceiling per run ($2–5); a channel that reaches it stops.
By name only
Section titled “By name only”| Model | Channel | Transport | Effort | Payment |
|---|---|---|---|---|
| Muse Wonder 1.0 (Meta) — new in 1.110.0, Muse Code in 1.111.0, by name only since 1.113.0 | mcwonder10cont where the Muse Code CLI is installed; wonder10 and orwonder only by their own names |
Muse Code subscription / Meta Model API (MODEL_API_KEY) / OpenRouter |
xhigh on the subscription (its ceiling), max on the API | your plan; per key $4.00 / $20.00 per 1M (in / out) |
| Gemini 3.1 Pro (Google) — off since 1.115.0 | agy31pro |
agy CLI agent | — | agy 1.4.7 no longer offered gemini-3.1-pro on our Google AI Pro account on 2026-10-24 («not recognized as a known model»; agy models lists what yours has). Naming it still starts it; where the model is gone agy refuses at the start |
| Step 5 Preview (StepFun) — off since 1.118.0 | ocstep5previewnv with opencode; nvstep5preview without |
opencode CLI agent on NVIDIA's free endpoint; NVIDIA's free API | max | free, needs an NVIDIA key. In the cheap panel from 1.114.0 to 1.117.2 |
| Claude Opus 4.6 [1M] (Anthropic) | cclopus46 |
Claude Code CLI agent | max | a Claude plan (Pro $20/month). Off by default; when on, it runs with permission prompts bypassed (SECURITY.md) |
Muse Wonder is Meta's most capable model (preview) and the most expensive voice here per token: 40× the input and 100× the output price of Spark Contributor. Since 1.113.0 no panel runs it: it starts only when you name it — "only wonder", "add wonder", "muse wonder", "wonder 1.0", «вондер», or a channel's own name. A broader word never does: not "standard panel", "all models", "only muse", "only openrouter", "CLI only". The model's word starts ONE Wonder, mcwonder10cont: the Contributor variant only Muse Code subscriptions offer (Meta may use that content for training), at xhigh (the plan's measured ceiling), counted against your plan and never against a key (setup: INSTALL.md, «Muse Code CLI»). Where the Muse Code CLI is not installed, the run stops before paying anything and names the paid Wonders it could start; name one to pay for it: wonder10, the Meta Model API on MODEL_API_KEY (Standard mode only: what you send is not used for training), with no per-run ceiling, because Meta runs the whole search loop inside one request (a two-line check cost $0.016; no reviews counted yet), or orwonder on OpenRouter, which stops at $5 a run. Until 1.112.6 the standard panel ran Wonder in every round: on the subscription where Muse Code was installed, otherwise the paid wonder10 or orwonder. To seat it there again, on your subscription only, put {"channels": {"mcwonder10cont": {"explicit_only": false}}} in ~/.claude/model-orchestration.local.json.
Web search
Section titled “Web search”On the OpenRouter channels each web search is billed apart from the tokens, so it is paid even on a free model. A channel that names the Exa engine pays $0.007 a request (Exa includes up to 10 results; ours ask for 5); a channel that names none gets the model provider's own search where OpenRouter offers one (OpenAI, Anthropic, Google, Perplexity and SpaceXAI models, in OpenRouter's words), at that provider's price, and Exa otherwise (OpenRouter's web-search page, 2026-10-23). The CLI agents search by themselves, within their plan.
python routing.py always prints the live channel list. The tables above are a snapshot: the line-up of 1.118.0, prices of 2026-10-05 unless a row gives its own date, and the registry changes most weeks.
Where the prices come from (2026-10-05):
- the OpenRouter catalogue
openrouter.ai/api/v1/models, read at 09:15 UTC; - free-model limits:
openrouter.ai/docs/api_reference/limits; - web search:
openrouter.ai/docs/features/web-search; - the fee:
openrouter.ai/pricing; - MiMo prices match Xiaomi's own price list:
mimo.mi.com/docs/en-US/price/pay-as-you-go; - NVIDIA's Kimi K3 (
build.nvidia.com/moonshotai/kimi-k3) is gone: on 2026-10-15 from 08:00 UTC its endpoint answers HTTP 410 «end of life» (measured that day); - plans:
help.openai.com/en/articles/11369540,openai.com/index/introducing-chatgpt-go,antigravity.google,gemini.google/subscriptions,x.ai/pricing,x.ai/news/grok-build-for-everyone,opencode.ai/docs/zen,claude.com/pricing,dev.meta.ai/docs/pricing-rate-limits.
The premium panel — a separate script, not a --panel value
Section titled “The premium panel — a separate script, not a --panel value”True-batch and Flex lanes for the heaviest models at their discounted prices. Batch jobs work
nothing like the synchronous channels above, so this deliberately ships as its own script
rather than more channels: premium/premium_panel.py, with its own gates — a call-plan file on
disk before anything is paid, a secrets scan on every lane with no override, a per-lane
discount check (refuses when the discount is gone unless you say --allow-nodiscount), a PII
scan on the broker lane, and a pre-submit cost ceiling (a batch cannot be aborted mid-flight,
so the ceiling is enforced before submit or not at all).
python premium/premium_panel.py --mode dry --plan PLAN.md --brief BRIEF.md --rundir runs/premium--mode dry builds everything and bills nothing. Then smoke (a tiny public-fact brief through
the same code path), submit, poll, collect. --panel premium on the main tool prints a
pointer here.
| lane | model | transport | key required | role |
|---|---|---|---|---|
solpro |
GPT-5.6 Sol Pro | OpenRouter batch (broker) | OPENROUTER_API_KEY |
vote |
gpt55 |
GPT-5.5 | OpenAI batch | OPENAI_API_KEY |
vote |
gemini31 |
Gemini 3.1 Pro | Google batch | GEMINI_API_KEY |
vote |
flash |
Gemini 3.7 Flash | Google batch | GEMINI_API_KEY |
canary — reported in its own section, never counted into convergence |
live54 |
GPT-5.4 + web search | OpenAI Flex, synchronous | OPENAI_API_KEY |
vote — the one live-web seat |
With only an OPENROUTER_API_KEY, only the broker lane is reachable: run --only solpro. A
missing key refuses loudly per lane, and --mode collect aggregates what exists — the report
shows the hole rather than papering over it.
Prices resolve from premium/models_snapshot.json (capture dates inside; a price past its
validity date refuses rather than inventing a number). Maturity, stated honestly: each lane's
transport was measured against its vendor individually; the assembled panel has not
yet run a paid round. Smoke first.
Targeting specific channels
Section titled “Targeting specific channels”--only codex agy4argon grokbuild # just the ones named--skip ornemotron3ultra # everyone except this oneThe live channel list is always python routing.py; the tables on this page are a snapshot
dated in the «Panels» heading — channels and their count change most weeks.
The problem this solves
Section titled “The problem this solves”You ask an AI to review your strategy memo. It tells you the memo is strong, adds three supportive points, and cites four sources.
That answer is nearly worthless, for three reasons most people never check:
- It is built to agree with you. You wrote the memo, you asked the question, and the model optimises for a helpful-feeling reply. Ask the same model to attack the memo and it will find problems it just told you did not exist.
- One model knows only what it knows. Its ceiling is the data it was trained on and the tools of its harness. Whatever it was weak at yesterday, it is weak at today, and nothing in the answer hints which parts are unreliable or what it simply does not know. Another model, trained differently, will suggest what never occurred to the first.
- The sources may not exist. Models generate citations that look right — real domain, plausible path, correct-sounding document number — for pages that were never opened and sometimes never existed. In one measured run here, a model produced 11 source links; 3 of them were dead, and its conclusions were still correct. That combination is the dangerous one, because it survives a casual read.
What this does instead
Section titled “What this does instead”- Different knowledge, different recommendations. Models from different vendors were trained on different data and run in different harnesses. Ask "how should I build this" or "what is wrong with this code" and each proposes its own answer, so you get several options rather than one repeated three times. Every answer also carries an UNASKED section: what matters that you did not ask about.
- A panel of independent models, same document, at the same time. They do not see each other's answers, so agreement means something and disagreement means more.
- It shows you the disagreement. That is the actual product. Two models calling a claim fine and one calling it fatal is the most useful thing you will read all week.
- It checks the receipts. Every source link each model cites is opened and reported as live / moved / dead. Where the channel supports it, the tool also checks whether the model actually opened the page it cited, or just listed it.
- It catches a model that quietly refused. A model that declines a task still formats its reply correctly, so it passes every naive "did it finish?" check. This catches that.
- The harness never sends a password or key. A brief or attachment that holds one is refused outright, no override. A CLI agent opens files on your disk by itself, so what it may read is set by its own rules (SECURITY.md).
Personal data — ID numbers, SSNs, emails, phone numbers, dates of birth — is found, counted
and reported in one line, and then SENT;
--warn-piilists each by kind and line, and--strict-piiturns it into a hard stop. Names and street addresses are not detected at all, at any setting.PRIVACY.mdhas the reasoning and the measurement behind both.
Who this is for
Section titled “Who this is for”| You are | You use it to |
|---|---|
| Founder / CEO | Pressure-test a strategy memo, a board deck, an investor update or a pricing decision before anyone external sees it. Several models, several sets of objections, before your board finds them. |
| Product manager | Review a spec or PRD for holes, check competitive claims you are about to publish, stress-test a launch plan's assumptions. |
| C-level / operations | Verify claims in a vendor proposal or a consultant's report. Check that a regulation you are relying on is still current and says what someone told you it says. |
| Legal / compliance | Verify that every citation in a research memo resolves to a real document that actually says what the memo claims. This is source-verification work, done properly and at speed. See the note below. |
| AI / ML engineer | Compare model behaviour on the same prompt across vendors. See which models ground their answers in real sources and which ones fabricate citations. Evaluate before you ship. |
| Anyone writing something that matters | Get the objections in private, before they arrive in public. |
A note for legal teams
Section titled “A note for legal teams”This is a research verification tool, not an advice tool, and the distinction is built into
the software rather than written on it. It ships with a mode (--system legal-research) that
frames the work as what it is: checking sources for a document a licensed professional will
review. Nothing in the output is legal advice, and the models are explicitly instructed not to
opine on any named individual's situation or decide what anyone should file.
That framing is also what makes it work. Asked to "review this filing strategy", the models refuse on policy. Asked to "verify these six claims against their cited sources", the same models answer all six with correct citations. The reframing is accurate, not a workaround — checking a document number against the register genuinely is research.
What one run looks like
Section titled “What one run looks like”You write your question in a plain text file and run one command. Below is the real output of a run on 2026-10-05, shortened, from before NVIDIA retired Kimi K3 and opencode its free Muse Spark (so the cheap panel then had six models, nvkimik3 and ocspark13free among them): it checked five claims about OpenRouter and NVIDIA, one of which we made false on purpose.
[agy38flash] OK 275.2s model=Gemini 3.8 Flash [gemini-3.8-flash][grokbuild] OK 251.0s model=Grok 4.7 [grok-4.7][nvkimik3] OK 666.6s model=Kimi K3 (via Kimi Code CLI + NVIDIA free endpoint) [nvidia/moonshotai/kimi-k3][ocmimo26flashfree] PROBLEM 0.8s model=MiMo v2.6 Flash Free (via opencode) [opencode/mimo-v2.6-flash-free] FAIL: EXIT 1: {"type":"error", ... "error":{"type":"provider.quota", ...[ocspark13free] PROBLEM 1.1s model=Muse Spark 1.3 Contributor Free (via opencode) [opencode/muse-spark-1.3-contributor-free] FAIL: EXIT 1: {"type":"error", ... "error":{"type":"provider.quota", ...[ormimopro] OK 185.0s model=MiMo v2.6 Pro (OpenRouter) [xiaomi/mimo-v2.6-pro]4/6 channels returned a verified review.cost reported BY THE VENDORS for this round: $0.0697 across 1 channel(s) (ormimopro $0.0697)Citation existence check (no vendor cost; fetches the cited pages directly): [agy38flash] 6 cited, 6 probed LIVE=6 [grokbuild] 12 cited, 12 probed LIVE=10 MOVED=1 UNKNOWN=1 [nvkimik3] 9 cited, 9 probed LIVE=6 MOVED=3Every line names the model, not just the channel: "the channel answered" is not a fact you can act on; "Kimi K3 answered through NVIDIA's free server" is. The two free opencode models hit the free service's quota this time (provider.quota), and the run said so plainly instead of passing an empty answer off as a review. The tool checks the links itself by opening every cited page: one that moved is marked MOVED, one that would not open is UNKNOWN.
Plus one file per model with its full report, a HANDOFF.md summary to read first, and a diagnostics file if anything went wrong.
REPORT.md has a «Tokens per model» table: how many characters and roughly how many tokens (≈, by the «bytes ÷ 4» rule) we sent each model and how much it wrote back, and beside them the vendor's own meter (billed in, out tok), or unknown where the vendor reports no such number. For a CLI agent the vendor's count is usually 10-50 times what we sent: the agent reads files and pages on its own and re-sends the whole conversation at every step. For the opencode channels the tool takes tokens and cost from opencode's own session store, because its output stream sometimes drops the per-step totals.
The one habit worth stealing
Section titled “The one habit worth stealing”Put a claim you know is false into every document you send for review.
It costs nothing. A model that "confirms" your planted falsehood has just told you exactly what all its other confirmations are worth. In the three-channel rounds this test was built on, all three models caught both planted claims — which is the only reason to believe the things they did confirm. (Scope stated on purpose: that measurement is from a three-channel round. Later, larger panels kept refuting the planted claim — 4 of 4 in the 1.46.0 review and 12 of 12 readable answers in the thirteen-channel round behind 1.44.0, per CHANGELOG.md — but a number is worth only the run it came from.)
What it costs, honestly
Section titled “What it costs, honestly”In short, from our runs of September–October 2026:
- the cheap panel — on your OpenRouter key only the two Muse Spark voices are paid, where opencode has no Go plan (Spark 1.2 runs on a Meta key instead when you have one; $0.002 in our first run of one of them, each web search extra), and MiMo v2.6 Flash on a machine without opencode ($0.0003 for our first two-line question), plus subscriptions;
- the standard one — about $2.5: Kimi K3 now always answers there through OpenRouter (≈ $1.38 of it);
- CLI only — $0 on the key, subscriptions only.
The per-model breakdown is in the tables above. The accounts, none of which this tool provides, are listed under «Getting started». Optional: the GEMINI_API_KEY, XAI_API_KEY and MIMO_API_KEY keys reach Gemini, Grok and MiMo through the vendors' own APIs, not always in the version a panel runs (Grok 4.20 and MiMo v2.5 Pro there; python routing.py prints each channel's model); those channels are off by default, details in INSTALL.md.
You do not need them all, and you should not start with them all. Missing a key or a CLI is a normal condition, not an error — the tool runs whatever is available and tells you plainly what it skipped. Start with one.
🔴 Do not count the channels from this file. The number is whatever channels.json enables and
it has changed most weeks. python routing.py prints the live list and spends nothing. (Every
prose copy of that list in this repository has been wrong within days of being written — including,
at one point, two different numbers four lines apart in this very file.)
Some channels are cheap because of their data terms, not despite them. As published,
ocspark12go, spark12cont and orspark12cont run the same Muse Spark 1.2 Contributor tier — on the OpenCode Go plan,
directly and through OpenRouter respectively — ocspark13go and orspark13cont its 1.3 Contributor tier, and ornemotron3ultra, ocmimo26flashfree and ocnemotron3ultrafree run free tiers; on every one of them the vendor may use prompts and completions for training or to improve its model. That is
the trade being made, it is stated in PRIVACY.md with each vendor named, and the
tool prints each channel's data policy in the plan before it spends anything — that line, not
this paragraph, is the current list. If a brief should not be trained on, drop those channels for
that run: --skip ocspark12go ocspark13go spark12cont orspark12cont orspark13cont ornemotron3ultra ocmimo26flashfree ocnemotron3ultrafree. (The free Spark through opencode,
ocspark13free, was on this list until opencode dropped it on 2026-10-17; it ships switched off.)
Nothing else in this file will tell you when to avoid a channel, and that is deliberate. An earlier version carried a loud warning here and in the registry, and it was obeyed twice in ways that were worse than the risk: once a run silently substituted a different model — destroying the comparison the panel exists to produce — and once it dropped a reviewer nobody had decided to drop. The facts belong in front of the person spending the money; the choice does not belong to a sentence in a config file.
Do not share one API key across a team. It bills to whoever owns it, nobody can be attributed, and revoking it cuts everyone off at once. One key per person — which is the whole reason this is a repository you clone rather than a service you log into.
Install
Section titled “Install”The fastest way: hand this repository to your AI assistant
Section titled “The fastest way: hand this repository to your AI assistant”Paste this into Claude Code (or any coding assistant with shell access), replacing the URL:
Set up this tool for me: https://github.com/igorsaevets/ai-second-opinionRead its INSTALL.md and follow it. I will set my own API keys myself —do not ask me to paste a key into this chat, and do not run the keycommands for me. When you are done, run doctor.py and show me the output.Those last two sentences are not politeness, they are the security model. An assistant that sets
the key for you must first receive the key, and the conversation is written to disk, replayed
into later context, and often archived. A key that has appeared in a chat transcript is leaked
and must be rotated, not deleted. The tool is built around this: it never prints a key,
doctor.py reports only presence and length, and orchestrate.py refuses to send a payload
containing anything secret-shaped even if you ask it to.
INSTALL.md contains an explicit instruction block addressed to the assistant itself, so a
competent one will decline to touch your keys without being told twice.
Or do it yourself
Section titled “Or do it yourself”Three ways, in order of how much you want to think about it. Full detail in INSTALL.md.
1 — Plugin (easiest). In Claude Code:
/plugin marketplace add igorsaevets/ai-second-opinion/plugin install model-orchestration@review-channels2 — Installer script. Download the repo, then:
.\install.ps1 # Windows./install.sh # macOS / Linux3 — Just copy the files. No git, no plugin system, no installer. Copy one folder:
plugins/model-orchestration/skills/model-orchestration/into
Windows: %USERPROFILE%\.claude\skills\model-orchestration\macOS / Linux: ~/.claude/skills/model-orchestration/That is the entire installation. It is plain Python with no dependencies to install — nothing is compiled, nothing runs in the background, and nothing is downloaded until you ask for an update.
Already have it? Updating is one command
Section titled “Already have it? Updating is one command”python ~/.claude/skills/model-orchestration/update_check.py --applyRun it from the copy you have: it finds the newest release on GitHub, downloads and verifies it,
backs up the old folder, carries your settings across, prints what changed between the two versions
and runs the checks (--dry-run shows all of that without changing anything). A plugin install is
updated through Claude Code by the same command. You will not have to remember it, either: once a
day the kit checks for a release — at session start and after a real round — and prints that
command when there is one. The same machinery is what install.ps1 / install.sh call when an
install already exists, so "install again" and "update" are the same safe operation.
If you are an AI assistant asked to update an existing install: run
update_check.py --applyfrom the installed folder (or, given a downloaded copy, itsupgrade.py). Do not copy files over the old folder by hand, and do not reinstall from scratch. Before 1.7.0 there was no way to do this correctly — no installed copy carried a version number, and the user's own settings lived in a file that every update path overwrote. If the install you are updating has noVERSIONfile, it predates the fix andupgrade.pywill migrate it. Runpython doctor.pyafterwards and report its version line.
Your own settings live outside the skill folder, in
~/.claude/model-orchestration.local.json, precisely so that no update can touch them:
{ "channels": { "goog36flash": { "enabled": true } } }Every run prints that file's path and each value it changed, so it can never quietly explain a channel that is not doing what you expect.
From 1.8.0 that file may change anything — repoint a model, add a whole channel or your own
tier ("_new": true marks an addition, so a misspelt name fails loudly instead of quietly becoming
a second channel). 1.7.0 refused those, and it was wrong to: your settings file and the shipped
registry have the same write permissions, so refusing a field in one only pushed the change into
the other — and the other was the file nothing announced before a run. Both are reported now, with
transport changes marked. The one restriction left is about provenance, not about you: if you
move the file with MODEL_ORCH_LOCAL, only the "how hard does it work" knobs are accepted from it,
because a repository you cloned can set an environment variable and cannot set your home directory.
Then, once per machine:
python ~/.claude/skills/model-orchestration/doctor.pyIt checks everything, reports what is missing in plain language, and prints your exact run command with the real path already filled in.
When something goes wrong
Section titled “When something goes wrong”Every run writes two files next to its results:
run.log— everything that happened, written as it happens, so it survives a crash.diagnostics.json— a structured report: what is installed, what each model did, what failed, and for each problem a plain-language cause and a suggested fix.
Both are automatically stripped of keys, tokens and personal-data shapes, and your home folder
is written as ~ (since 1.113.9), so you can paste them straight into a chat with an AI assistant and ask
it to fix the problem. Before you attach them to a public bug report, glance at the paths of the files
you passed (the brief, --out, attachments): they are kept, because a fix needs them.
That is the intended workflow when you are stuck: hand diagnostics.json to your AI assistant and
ask it to diagnose the cause. See TROUBLESHOOTING.md.
Adding a model
Section titled “Adding a model”Every model this tool knows about lives in a single channels.json registry: adding a channel is
an edit to that file, not new code, and your own additions go in the local settings file described
above, where no update can touch them. What changed recently is in CHANGELOG.md;
the live channel list is python routing.py.
(An earlier version of this section was a roadmap. Its main items shipped — OpenRouter is now the biggest group in the table above, and every run reports its own cost — while the section went on promising them as future work for weeks. A list of plans in a README rots faster than anything else in it, so this is now one line: the registry is the roadmap.)
What this is not
Section titled “What this is not”- Not ChatGPT, not Perplexity, not a single-model tool. Those give you one answer from one model — fast and useful, but with one set of blind spots you cannot see. This gives you several answers from models that do not see each other, plus a mechanical audit of their work. The disagreement between independent reviewers is the product.
- Not a fact database. It reads the live web through the models' own search tools. It can be wrong, which is exactly why it shows you several answers instead of one.
- Not a replacement for an expert. It is very good at finding what an expert should look at.
- Not "deep research" mode. Those are separate, separately-billed products at several vendors and are not reachable from a normal subscription. This runs every model at its maximum depth with a source-discipline instruction — the same shape, but with multiple independent answers and an audit of every citation, which no deep-research product gives you.
- Not a benchmark or eval harness. Benchmarks measure models against known answers. This puts models to work on your question, where no answer key exists — and lets their disagreement tell you what a benchmark never could.
- Not automatic. You still read the disagreement and decide. The tool's job is to make sure you are deciding with the objections in front of you.
Frequently asked questions
Section titled “Frequently asked questions”Why not just ask ChatGPT / Claude / Gemini directly?
A single model has a single set of blind spots, and nothing in its answer tells you which parts
are weak. A panel of independent models — each blind to the others' answers — surfaces
disagreements that one model alone will never show you. Two models saying a claim is fine and
one calling it fatal is the most useful signal you will find.
How is this different from Perplexity or AI search?
Perplexity gives you one synthesised answer with sources. This gives you several independent
answers, shows you where they contradict each other, and then mechanically checks whether the
sources each model cited actually exist and, where the channel reports it, were actually opened. The disagreement and the audit
are what you are paying for.
Can I use this from Cursor / Windsurf / another coding tool?
Yes. It is plain Python with no dependencies. Any tool with shell access can run it. There is
also a one-command Claude Code plugin install — see Install.
Does this work with OpenRouter models?
Yes. OpenRouter is the biggest single-account group: one API key unlocks Kimi, Qwen, Gemini,
MiMo, Grok, GLM, DeepSeek, Muse Spark and NVIDIA Nemotron. Start with that and add direct
vendor access later for the models that benefit from it.
Is this expensive?
No. On the cheap panel only the two Muse Spark voices are paid on your OpenRouter key, where opencode has no Go plan (Spark 1.2 runs on a Meta key instead when you have one; $0.002 in our first run of one of them, each web search extra), and MiMo v2.6 Flash on a machine without opencode ($0.0003 for our first two-line question), plus subscriptions you most likely already have. Say "CLI only" and there is not one paid request on the key. The standard panel costs about $2.5 a run: since 1.112.0 Kimi K3 always answers there through OpenRouter. The $2.5 is the median of our runs in September–October 2026, the $0.002 a single run; the tool prints the exact amount of your run at its end. See what it costs.
Found a bug? Want a feature? Want to work together?
Section titled “Found a bug? Want a feature? Want to work together?”| What you want to do | Where it goes |
|---|---|
| Report a bug | Open an issue and attach diagnostics.json — keys, tokens and your home folder are scrubbed by construction; glance at the paths of the files you passed before posting |
| Ask for a feature, or suggest an improvement | Open an issue |
| Ask a question, or show what you built with it | Discussions |
| Report a security problem | Report a vulnerability privately — please do not open a public issue first. See SECURITY.md |
| Collaboration, consulting, or anything commercial | LinkedIn · Facebook · GitHub |
Maintained by Igor Saevets (@igorsaevets), Los Angeles.
There is deliberately no contact email in this repository. A public address in a public repo is harvested within days, and the address on the commits here is GitHub's no-reply relay, which has no mail exchanger at all — mail sent to it is not delivered anywhere, quietly. A channel that silently swallows a bug report is worse than no channel, so the links above are the real ones.
Licence
Section titled “Licence”MIT — see LICENSE. Use it commercially, fork it, ship it inside your own product.
Every rule enforced by this tool exists because something failed on a real run. The measurements quoted above are from actual runs, not estimates. Details and dates are in TECHNICAL.md.