Ingram Cloud

Documentation

Models

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.

ProviderModel id
OpenAIopenai.gpt-6-astraGPT-6 Astra — most capable
OpenAIopenai.gpt-6.1-solGPT-6.1 Sol — flagship
OpenAIopenai.gpt-6-lunaGPT-6 Luna — fast, low-cost
OpenAIopenai.gpt-5.6-solGPT-5.6 Sol — previous flagship
OpenAIopenai.gpt-5.6-terraGPT-5.6 Terra — balanced
OpenAIopenai.gpt-5.5-proGPT-5.5 Pro — most compute per answer
OpenAIopenai.gpt-5.4-proGPT-5.4 Pro — previous pro tier
Anthropicanthropic.claude-fable-5-1Claude Fable 5.1 — frontier
Anthropicanthropic.claude-fable-5Claude Fable 5 — previous frontier
Anthropicanthropic.claude-opus-5-5Claude Opus 5.5 — flagship
Anthropicanthropic.claude-opus-5Claude Opus 5 — previous flagship
Anthropicanthropic.claude-sonnet-5-5Claude Sonnet 5.5 — balanced
Anthropicanthropic.claude-sonnet-5Claude Sonnet 5 — previous balanced
Anthropicanthropic.claude-haiku-4-5Claude Haiku 4.5 — fastest
Googlegoogle.gemini-3.8-flashGemini 3.8 Flash — flagship
Googlegoogle.gemini-3.7-flashGemini 3.7 Flash — previous flagship
Googlegoogle.gemini-3.5-flash-liteGemini 3.5 Flash-Lite — high-volume
Googlegoogle.gemini-2.5-proGemini 2.5 Pro — complex tasks
Mistralmistral.mistral-large-4Mistral 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:

ProviderWhat the tier becomes
OpenAIreasoning_effort, passed as-is.
AnthropicAdaptive 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.
GoogleThe 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:

  1. 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.
  2. BYOK — the tenant's own key for that provider (PUT /v1/tenant/model_keys/{provider}), so the inference bills your own provider account.
  3. 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.