You set one model, something else is answering. This is rarely a bug — it is usually a fallback chain doing its job silently, a second config file winning, or an auxiliary slot you didn't know existed. It matters because the wrong model can be far more expensive than the one you chose.
Do not rely on the tool's status line or its own claim about itself. Models are unreliable narrators of their own identity, and a status line usually shows configured intent rather than what was really called.
The authoritative answer is the model field in the API response, not anything the model says about itself in chat. Asking an agent 'which model are you?' produces a guess shaped by its training data, which is exactly the wrong tool for this job.
If your provider has a usage or activity dashboard, that is the second most reliable source: it shows which model ids were actually billed.
Read the model id straight from the response
curl -s "$BASE_URL/v1/chat/completions" \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"model":"YOUR_CONFIGURED_ID","messages":[{"role":"user","content":"hi"}],"max_tokens":5}' \
| python3 -c "import sys,json;d=json.load(sys.stdin);print('served by:', d.get('model'))"
# If 'served by' differs from what you asked for, the endpoint remapped it.| Cause | Tell | Fix |
|---|---|---|
| A fallback chain fired | Correct model at first, switches after an error or under load. | Find the fallback list in config and make every entry acceptable to you — including on cost. |
| Auxiliary model slots | Main answers look right, but spend is higher than expected. | Summarizing, titling, and compression often have their own model settings that default to something expensive. Pin them to a cheap model. |
| Config precedence | Works in one directory, not another. | A project-level config overrides the global one. Check for a committed config in the repo. |
| Endpoint-side aliasing | You asked for an alias like 'latest' or a bare family name. | Use a fully qualified id from the endpoint's own model list instead of an alias. |
The durable fix is to remove ambiguity rather than to correct one setting:
If you run agents regularly, a small script that reads your config and fails loudly when any slot resolves to an unexpected model pays for itself the first time it catches a silent fallback. This is a deterministic check — no AI required to verify what your own config says.
If the served id differs from the id you requested and it is not your config, the endpoint is substituting server-side — and you cannot fix that from your end. What you want instead is a published model list and a response that names what actually ran. AgentRouter documents its ids openly (gpt-5.6-sol, claude-opus-4-8, claude-opus-5 on the default group) so you can pin one exactly and verify with the curl above that the same id comes back.
Pin an exact model id →Referral link — we may earn a reward if you sign up, at no extra cost to you. This is the same advice we would give with no link at all. Check their current pricing and model list on their own site; we deliberately do not restate numbers that change.
The Setup Doctor walks through your tool, symptom, and setup and points at the likely cause — no account needed.