Indicia Code.

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.

ClassCandidates, in orderReasoning effort
indicia/sterkgpt-6-astra (ChatGPT), gpt-6.1-sol (ChatGPT), claude-opus-5-5 (Claude), Web/grok-chat-expert (Grok)high
indicia/snelgpt-6-luna (ChatGPT), claude-sonnet-5-5 (Claude), Web/grok-chat-fast (Grok)medium
indicia/claudeclaude-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:

ProviderLevels the model takesSo
ChatGPTlow to max, as the ChatGPT model list says per modelnone and minimal become low. ultra becomes max: it is a Codex CLI mode that the API rejects.
Claude 4.7 and laterlow to max, with adaptive thinkingnone and minimal become low, ultra becomes max.
Claude Opus 4.6, Sonnet 4.6low, medium, high, maxAs above, and xhigh becomes high.
Older Claude modelsA thinking budget inside max_completion_tokens2048 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.
GrokNoneGrok 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.

ProviderDirect models
ChatGPTEvery model the ChatGPT model list offers, such as gpt-6.1-sol, gpt-6-astra, gpt-6-sol and gpt-6-luna
ClaudeEvery model the Claude pool offers, such as claude-opus-5-5, claude-sonnet-5-5, claude-haiku-5-5 and claude-fable-5-1
Grok models are only available through the classes.

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, 413 or 422.
  • 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

HeaderValue
x-indicia-providerThe provider that answered: codex, claude or grok
x-indicia-modelThe 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.

On this page