Skip to content

Provider backends

The [model] section of seal.toml picks an LLM provider and a model. Each backend has its own auth shape, model selector format, and quirks documented below.

Providerprovider valueAuthModel selector
Anthropic"anthropic"OAuth (CLAUDE_CODE_OAUTH_TOKEN) or API key (ANTHROPIC_API_KEY)claude-*
OpenAI"openai"OAuth (seal login openai) or API key (OPENAI_API_KEY)gpt-*, o*
OpenRouter"openrouter"API key (OPENROUTER_API_KEY)<vendor>/<model>
[model]
provider = "anthropic"
name = "claude-sonnet-4-6"

Two paths. Pick whichever fits the credentials you already have — OAuth via a Claude subscription is the least-friction option for most users:

  • OAuth (Claude subscription) — from a machine that has Claude Code installed, run claude setup-token to print a long-lived sk-ant-oat... token, then export it as CLAUDE_CODE_OAUTH_TOKEN. Seal picks up the env var on launch. The token follows the same auth path Claude Code uses, so it works against the same subscription tier. Full instructions: code.claude.com/docs/en/authentication#generate-a-long-lived-token.
  • API key — set ANTHROPIC_API_KEY=sk-ant-api... in the environment. Standard for self-hosted or pay-per-token use against the Anthropic API.

Precedence when more than one is set: CLAUDE_CODE_OAUTH_TOKEN (Anthropic OAuth, the sk-ant-oat... shape) wins, then ANTHROPIC_API_KEY (works for both sk-ant-api... keys and sk-ant-oat... tokens), then the macOS keychain Claude-Code-credentials entry (if Claude Code is signed in), then ~/.claude/.credentials.json.

The name field accepts any model the Anthropic models API returns. Common picks:

  • claude-opus-4-7 — the long-running flagship, best for hard reasoning.
  • claude-sonnet-4-6 — the everyday default, balanced quality/cost.
  • claude-haiku-4-5 — fast and cheap, good for small focused tasks.

max_tokens and context_length auto-detect from the model’s advertised metadata if omitted. Set either field explicitly to override the detected value for the session.

Anthropic’s extended-thinking mode is enabled by default — the [model] thinking defaults to "adaptive", which lets the model decide when to think. Set thinking = "manual" + thinking_budget = <tokens> for a fixed budget, or thinking = "disabled" to turn it off entirely.

The effort knob picks the thinking-effort level (low / medium / high / xhigh / max). Opus 4.7 defaults to xhigh; older / non-supporting models default to high. max is Opus-4.6+ only — other models 400 on it.

Anthropic’s prompt cache is on by default with the 5-minute ephemeral TTL. No manifest knob — the daemon attaches cache_control to the right segments automatically. The 1-hour beta tier is opt-in via a per-request beta header; reach out if your usage warrants it.

[model]
provider = "openai"
name = "gpt-5.5"

Two paths. Pick whichever fits the credentials you already have:

  • OAuth (ChatGPT / Codex subscription) — run seal login openai. This opens the OpenAI device-code flow: a browser link + one-time code that links seal to your ChatGPT or Codex subscription. The resulting token is saved to ~/.seal/chatgpt-auth.json and picked up automatically by the daemon. No env var needed — once you’ve logged in, any project with provider = "openai" uses the subscription. Codex users don’t need to log in again: seal also reads ~/.codex/auth.json if it exists.
  • API key — set OPENAI_API_KEY=sk-... in the environment. OpenAI keys are dashboard-issued from platform.openai.com/api-keys. Standard for pay-per-token use.

Precedence when more than one is set: ~/.seal/chatgpt-auth.json (tokens from seal login openai OAuth flow), then ~/.codex/auth.json (Codex’s own tokens), then OPENAI_API_KEY environment variable (explicit per-project key).

The daemon auto-refreshes seal-managed OAuth tokens before they expire. Codex tokens are read-only — if your Codex token expires, re-run seal login openai to create a fresh seal-managed token.

The name field accepts any model the OpenAI models API returns. Common picks:

  • gpt-5.5 — flagship, best reasoning and agentic performance.
  • gpt-5.4 — strong general-purpose GPT-5 model.
  • gpt-5.4-mini — fast, cost-effective for smaller tasks.

For known GPT models, Seal resolves max_tokens and context_length from its bundled model catalog. For unknown names, Seal tries provider metadata and then falls back to safe defaults if OpenAI does not return token-limit fields. Set either field explicitly in seal.toml to override auto-resolution.

OpenAI o-series models use native reasoning (reasoning_effort). Set thinking = "adaptive" (the default) to let the model decide; the effort knob controls the reasoning depth (low / medium / high / xhigh / max). thinking = "disabled" skips reasoning entirely.

GPT-5 models also support reasoning — thinking = "adaptive" with reasoning_effort works across the line.

[model]
provider = "openrouter"
name = "anthropic/claude-sonnet-4-6"

Set OPENROUTER_API_KEY=sk-or-... in the environment. OpenRouter’s keys are dashboard-issued; the format is sk-or-v1-<random>.

OpenRouter fronts a heterogeneous set of providers under a unified API. The name field uses the <vendor>/<model> shape: anthropic/claude-sonnet-4-6, openai/gpt-5, google/gemini-2.5-pro, etc. See openrouter.ai/models for the full list.

max_tokens and context_length auto-detect per model from OpenRouter’s metadata API; explicit values in seal.toml override auto-resolution.

  • OpenRouter sometimes routes the same name to different actual providers depending on availability — usually fine for development, occasionally surfaces as latency or token-count drift between sessions.
  • Streaming and tool-call schemas are normalized by OpenRouter; you don’t usually notice provider-side differences. If you do, route directly via that provider’s native backend (Anthropic above; others as they ship).

Some OpenRouter features (rate-limit hints, model fallback) need request-level HTTP headers. [model] headers merges any key/value pairs into every LLM request:

[model]
provider = "openrouter"
name = "anthropic/claude-sonnet-4-6"
[model.headers]
"HTTP-Referer" = "https://my-app.example.com"
"X-Title" = "my-app"

For most users on launch day:

  • Already have a Claude subscription → Anthropic + OAuth.
  • Already have an OpenAI key → OpenAI direct. First-class GPT and o-series support.
  • Pay-as-you-go on a single provider → that provider’s native backend (Anthropic and OpenAI ship with launch; more providers post-launch).
  • Want one key to access many providers → OpenRouter. Slightly higher overhead, but one bill.

The choice doesn’t lock you in — seal.toml is per-project, so different projects can target different providers.