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.
Supported providers
Section titled “Supported providers”| Provider | provider value | Auth | Model 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> |
Anthropic
Section titled “Anthropic”[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-tokento print a long-livedsk-ant-oat...token, then export it asCLAUDE_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.
Models
Section titled “Models”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.
Thinking
Section titled “Thinking”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.
Prompt caching
Section titled “Prompt caching”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.
OpenAI
Section titled “OpenAI”[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.jsonand picked up automatically by the daemon. No env var needed — once you’ve logged in, any project withprovider = "openai"uses the subscription. Codex users don’t need to log in again: seal also reads~/.codex/auth.jsonif 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.
Models
Section titled “Models”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.
Reasoning
Section titled “Reasoning”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.
OpenRouter
Section titled “OpenRouter”[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>.
Models
Section titled “Models”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.
Quirks
Section titled “Quirks”- OpenRouter sometimes routes the same
nameto 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).
Extra HTTP headers
Section titled “Extra HTTP headers”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"Picking a provider
Section titled “Picking a provider”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.
See also
Section titled “See also”- Manifest reference:
[model]— every key under the section. - Getting started — first-prompt walkthrough.