Models
Model classes, direct models, failover and the models each endpoint takes.
Model classes
/v1/chat/completions takes a model class
or a direct model. A class is an ordered list of
candidates. The gateway sends the request to the first candidate that can
serve it.
| Class | Candidates, in order | Reasoning effort |
|---|---|---|
indicia/sterk | gpt-6-astra (ChatGPT), gpt-6.1-sol (ChatGPT), claude-opus-5-5 (Claude), Web/grok-chat-expert (Grok) | high |
indicia/snel | gpt-6-luna (ChatGPT), claude-sonnet-5-5 (Claude), Web/grok-chat-fast (Grok) | medium |
indicia/claude | claude-opus-5-5 (Claude), gpt-6-astra (ChatGPT) | Not set |
These are the defaults. GET /v1/models lists the
classes the gateway serves right now.
Reasoning effort
reasoning_effort in a chat completions
request sets how long the model reasons before it answers. Without it, the
request uses the class's effort from the table above. A direct model, or a
class without an effort, uses the provider's own default.
The levels, weakest first, are none, minimal, low, medium, high,
xhigh, max and ultra. The first five are OpenAI's; xhigh, max and
ultra are ChatGPT's. Every candidate gets the same effort. When a model
does not take that level, it gets the strongest level it takes that is not
above it, or its weakest level when every level it takes is above it:
| Provider | Levels the model takes | So |
|---|---|---|
| ChatGPT | low to max, as the ChatGPT model list says per model | none and minimal become low. ultra becomes max: it is a Codex CLI mode that the API rejects. |
| Claude 4.7 and later | low to max, with adaptive thinking | none and minimal become low, ultra becomes max. |
| Claude Opus 4.6, Sonnet 4.6 | low, medium, high, max | As above, and xhigh becomes high. |
| Older Claude models | A thinking budget inside max_completion_tokens | 2048 tokens for low, 8192 for medium, 16384 for high, 24576 for xhigh, max and ultra. No thinking for none, minimal, a forced tool_choice, or max_completion_tokens below 2048. |
| Grok | None | Grok ignores the effort. |
Higher effort usually means better answers on hard questions, more
reasoning_tokens, and a slower response. gpt-6-luna hardly reasons at
low, which is why indicia/snel uses medium.
Direct models
/v1/chat/completions also takes a provider model id. The request goes to
that model only, with no failover. Use a class when you want the request to
survive a busy pool. Use a direct model when you need one specific model.
| Provider | Direct models |
|---|---|
| ChatGPT | Every model the ChatGPT model list offers, such as gpt-6.1-sol, gpt-6-astra, gpt-6-sol and gpt-6-luna |
| Claude | Every model the Claude pool offers, such as claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5 and claude-fable-5-1 |
A direct model gets the same translation, limits, usage tracking and
x-indicia-* headers as a class. The model field in the response is the
id you sent. A direct model that cannot serve the request gets
503 providers_unavailable, for example a Claude model with
response_format. GET /v1/models lists the direct
models that work right now.
Failover
The gateway skips a candidate that cannot serve the request:
- Grok, when the request has
tools, images or PDFs. - Claude and Grok, when the request has
response_format. - A provider whose pool is not configured.
It moves on to the next candidate when the current one fails before the first byte reaches you:
- Every account in its pool is rate limited, or its pool is unreachable.
- It answers with a status other than
400,413or422. - It sends nothing for 30 seconds, or its stream breaks before the first event.
A 400, 413 or 422 from a provider ends the request with
upstream_rejected.
No failover after the first byte
Once the response has started, the request is committed to that candidate.
If a stream then stays silent for 30 seconds or breaks, the gateway closes
the connection without a final data: [DONE].
When every candidate fails, the answer is 429 pool_exhausted if any of them
was rate limited, otherwise 503 providers_unavailable.
Response headers
| Header | Value |
|---|---|
x-indicia-provider | The provider that answered: codex, claude or grok |
x-indicia-model | The candidate model that answered, such as gpt-6-luna |
Only /v1/chat/completions sets these headers. The model field in its
response body is always the id you sent: the class id, or the direct model id.
Models on other endpoints
/v1/messages and
/v1/messages/count_tokens take a Claude model
id, such as claude-opus-5-5 or claude-sonnet-5-5. The model must be one the
Claude pool offers, or the request gets 400. They also take a class id,
which means the class's first Claude candidate: indicia/claude and
indicia/sterk both mean claude-opus-5-5.
/v1/responses takes a ChatGPT model id, such as
gpt-6-astra or gpt-6-luna, and passes it on unchanged.