Models
Every agent and smith runs on a model id —
its model field. Model ids are namespaced provider.model
(openai.gpt-6.1-sol, anthropic.claude-opus-5-5, google.gemini-3.8-flash); the
provider is the prefix. Any model string that provider serves works once a key
for it resolves, except a classifier id (see Classifier
models). The catalog below is the curated set
the console offers in the per-agent picker — flagship first, one provider per
group.
Catalog
Every model a provider serves us, current top models first. Cost is not a filter: the premium tiers are here like any other. What isn't listed is what we can't run — models behind an access programme (Claude Mythos, OpenAI's Daybreak) and previews.
| Provider | Model id | |
|---|---|---|
| OpenAI | openai.gpt-6-astra | GPT-6 Astra — most capable |
| OpenAI | openai.gpt-6.1-sol | GPT-6.1 Sol — flagship |
| OpenAI | openai.gpt-6-luna | GPT-6 Luna — fast, low-cost |
| OpenAI | openai.gpt-5.6-sol | GPT-5.6 Sol — previous flagship |
| OpenAI | openai.gpt-5.6-terra | GPT-5.6 Terra — balanced |
| OpenAI | openai.gpt-5.5-pro | GPT-5.5 Pro — most compute per answer |
| OpenAI | openai.gpt-5.4-pro | GPT-5.4 Pro — previous pro tier |
| Anthropic | anthropic.claude-fable-5-1 | Claude Fable 5.1 — frontier |
| Anthropic | anthropic.claude-fable-5 | Claude Fable 5 — previous frontier |
| Anthropic | anthropic.claude-opus-5-5 | Claude Opus 5.5 — flagship |
| Anthropic | anthropic.claude-opus-5 | Claude Opus 5 — previous flagship |
| Anthropic | anthropic.claude-sonnet-5-5 | Claude Sonnet 5.5 — balanced |
| Anthropic | anthropic.claude-sonnet-5 | Claude Sonnet 5 — previous balanced |
| Anthropic | anthropic.claude-haiku-4-5 | Claude Haiku 4.5 — fastest |
google.gemini-3.8-flash | Gemini 3.8 Flash — flagship | |
google.gemini-3.7-flash | Gemini 3.7 Flash — previous flagship | |
google.gemini-3.5-flash-lite | Gemini 3.5 Flash-Lite — high-volume | |
google.gemini-2.5-pro | Gemini 2.5 Pro — complex tasks | |
| Mistral | mistral.mistral-large-4 | Mistral Large 4 — flagship, preview |
Mistral models run on your own Mistral key (BYOK); Large 4 is in public preview and needs a paid Mistral tier.
An agent or smith with no model ("default") runs on
anthropic.claude-sonnet-5. Set any namespaced id your provider serves via the
API, listed or not. Use the
flagship a tier needs; don't pay for one it doesn't — gpt-6-astra,
gpt-5.5-pro and claude-fable-5-1 cost several times the flagship they sit
above.
Classifier models
Classifier models answer typed questions through
POST /v1/decisions. There are two:
- GPT-6 Luna (
openai.gpt-6-luna), on OpenAI's Decisions API. It takes text and images, and also runs conversations. - Jev (
typesafe-ai.jev-latest), TypeSafe's classifier. It takes text, and does not run conversations.
A classifier-only id as an agent's, a smith's, or a request's model is refused
with 422 model_kind_mismatch, and a conversation-only model on /v1/decisions
is refused the same way.
GET /v1/tenant/models lists TypeSafe under providers so you can add its key,
and lists no classifier-only model under data. GET /v1/models lists none
either.
Extraction models
Extraction models return typed values through
POST /v1/extract. There is one:
- Clairic (
cloudflare.clairic), Cloudflare's extraction model. It takes text and images, and does not run conversations.
An extraction-only id as an agent's, a smith's, or a request's model is refused
with 422 model_kind_mismatch, as is any other kind of model on /v1/extract.
Clairic runs on your project's Cloudflare key only; GET /v1/tenant/models lists
Cloudflare under providers and lists no extraction model under data.
Reasoning effort
Reasoning depth is a per-request dial in the standard OpenAI place:
reasoning_effort on POST /v1/chat/completions, reasoning: { "effort": … }
on POST /v1/responses — one of none, minimal, low, medium, high,
xhigh. Any other value is 400 invalid_reasoning_effort; omit the field and
the provider's default applies.
The tier is honored whatever provider backs the turn's model, mapped server-side to each provider's native control:
| Provider | What the tier becomes |
|---|---|
| OpenAI | reasoning_effort, passed as-is. |
| Anthropic | Adaptive thinking at the matching effort tier (minimal maps to low; xhigh to the highest tier the model supports); none turns thinking off. Claude models without adaptive thinking get a thinking budget sized to the tier. |
The matching Gemini thinking level (xhigh caps at high). |
A tier the upstream model itself doesn't support (OpenAI gates none and
xhigh to specific models) is the provider's call — its rejection surfaces as
the request's error rather than being silently degraded. One such rule:
Anthropic rejects thinking combined with a forced tool_choice on Claude
models without adaptive thinking ("Thinking may not be enabled when
tool_choice forces tool use") — send "none", or drop one of the two fields.
Keys: hosted or bring-your-own
A model runs on a key for its provider, resolved most-specific first:
- Smith — the smith's own key for that provider (
PUT /v1/smiths/{id}/model_keys/{provider}), so an end-user's inference bills their own provider account. See End-user keys. - BYOK — the tenant's own key for that provider (
PUT /v1/tenant/model_keys/{provider}), so the inference bills your own provider account. - Ingram-hosted — the platform key, used when no BYOK key is set (unless hosted keys are disabled). TypeSafe has none: Jev runs on your own key only.
Hosted Claude runs on Amazon Bedrock, which doesn't serve Claude Fable 5.1, Fable 5 or Sonnet 5.5: those run on your own Anthropic key only.
Either of your own keys (1 or 2) means the provider bills you directly and your wallet is charged the platform fee alone, never the tokens — see Your own keys.
If none resolves, a run on that model fails with 422 model_key_missing.
A key that is present wins outright: a present-but-invalid smith key surfaces the provider's auth error on the run — it does not silently fall through to the tenant key (which would bill the tenant, the thing end-user keys exist to avoid). Only an absent key falls through. A smith or tenant BYOK Anthropic key always runs against Anthropic directly, never rerouted.
Setting a smith key needs the smith to exist first — provision it idempotently by external id, then set the key on the returned id (both server-side, both safe to repeat). See End-user keys for the two-step flow.
Prompt caching
Claude models cache automatically. On every request — including each step of a
multi-step agent turn — the API places Anthropic cache_control breakpoints on
the stable prompt prefix: tool definitions, system instructions, and the
conversation so far. Nothing to configure, and it applies to hosted and BYOK
Anthropic keys alike. Keep your instructions and tool set byte-stable and put
per-request content (timestamps, injected context) in the user turn, and the
prefix is written once and read cheaply on every subsequent step and follow-up
turn inside the cache window (5 minutes, refreshed on use).
The cache slices are visible on every run's usage: cache_read_tokens (the
prefix served from cache, billed at the provider's discounted cache-read rate)
and cache_write_tokens (the slice written this step, billed at the provider's
cache-write premium). See Metering for how they price into
cost. They also aggregate into the usage breakdown — the
cache hit rate (cache_read_tokens / input_tokens) per day, model, or end-user,
and a per-model view in the console — so you can spot a design change that
broke caching.
OpenAI and Gemini models cache server-side on the provider's side; reads show
up in cache_read_tokens the same way.
List what you can run
GET /v1/tenant/models returns the catalog plus, per model, whether a key
resolves (available) and whose (source: "byok", "hosted", or null):
# Authorization: tenant token with runs:read (server-side only)
curl https://api.cloud.ingram.tech/v1/tenant/models \
-H "Authorization: Bearer $IC_TOKEN" \
-H "IC-Api-Version: 2026-05-01"
# → { "data": [ { "id": "anthropic.claude-opus-5-5", "provider": "anthropic",
# "label": "Claude Opus 5.5", "available": true,
# "source": "hosted" }, … ],
# "providers": [ { "id": "openai", "label": "OpenAI",
# "base_url": true, "hosted": true }, … ] }
A provider with base_url: true (OpenAI) accepts a custom endpoint on its BYOK
key, so any OpenAI-compatible backend can stand in.
An OpenAI client reads the same catalog from GET /v1/models in OpenAI's own
list shape — filtered to models a key resolves for, so a picker built from it
only offers models that run. See Listing
models.
Set or remove a BYOK key (tenant-admin token only; the key is never echoed):
# Authorization: tenant-admin token (server-side only)
curl -X PUT https://api.cloud.ingram.tech/v1/tenant/model_keys/openai \
-H "Authorization: Bearer $IC_ADMIN_TOKEN" \
-H "IC-Api-Version: 2026-05-01" \
-H "Content-Type: application/json" \
-d '{ "api_key": "sk-…" }'
# → { "provider": "openai", "configured": true, "base_url": null, "workspace_id": null }
An Anthropic key scoped to several workspaces (Console default: "Same as
linked account") is refused by Anthropic unless each request names the
workspace it bills to. Pass it as workspace_id and every request carries it as
anthropic-workspace-id; a key scoped to one workspace needs none.
# Authorization: tenant-admin token (server-side only)
curl -X PUT https://api.cloud.ingram.tech/v1/tenant/model_keys/anthropic \
-H "Authorization: Bearer $IC_ADMIN_TOKEN" \
-H "IC-Api-Version: 2026-05-01" \
-H "Content-Type: application/json" \
-d '{ "api_key": "sk-ant-…", "workspace_id": "wrkspc_…" }'
# → { "provider": "anthropic", "configured": true, "base_url": null, "workspace_id": "wrkspc_…" }
A Cloudflare key carries its account id in the same field: workspace_id is
required there (422 workspace_id_required without it) and refused on any
provider but Anthropic and Cloudflare (422 workspace_id_unsupported).
In the console
Settings → Models lists the providers and which hold a key, and is where you add or remove BYOK keys; the Anthropic row takes the workspace id, the Cloudflare row the account id, and the TypeSafe row holds the key Jev runs on. The per-agent model picker (on an agent or smith) lists this catalog grouped by provider and flags any model whose provider has no key configured — still selectable, but runs on it fail until a key is set.