Supported providers
At least one provider key is required for AI editing. With none, chat still answers from a built-in planner that handles simple, literal edits, and visual editing works in full.
Each request names its provider. A request that names none — from a script or an MCP client, say — plans on the first configured key in the order OpenAI, Anthropic, Gemini. Set
CHAT_PLANNER_FORCE_SONNET=1 to send those requests to Claude Sonnet instead whenever an Anthropic key is set.
Bring your own keys
Set whichever you have in.env:
/status/planner on boot to find out which providers have keys. Providers without keys are never offered.
Keys never leave your orchestrator. The editor and your site talk to the orchestrator over HTTP; the orchestrator is the only process that holds API credentials.
Model tiers
Every provider has four tiers. Each tier is a separate env var, so you can change the model behind a tier without changing code:
Agent mode does not use these tiers. It has its own two variables,
AGENT_ANTHROPIC_MODEL (default claude-sonnet-5-5) and AGENT_OPENAI_MODEL (default gpt-5.6-terra).
Defaults
.env. The orchestrator reads these variables once, when it starts, so restart it after changing one.
The model picker shows each tier by its default model’s name. It cannot see an override yet, so after you set
ANTHROPIC_MODEL_BALANCED it still reads “Sonnet 5.5”.Tiered routing in action
When a user types in the editor:- Intent router runs on the
FASTtier. It decides whether this is a chat-only message (“what does Hero do?”), a real edit, or ambiguous, and how complex the edit is. - Full planner runs on the tier you picked,
BALANCEDunless you changed it. The router and planner run in parallel (CHAT_PARALLEL_PLANNER=1, the default). When the router judges an edit simple, the planner drops to theFASTmodel for that turn. - Extended thinking switches on for complex prompts on Anthropic (
CHAT_AUTO_REASONING=1, the default). Signals: multi-step asks, conditional language (“if there’s already a CTA, …”), structural verbs (“restructure,” “rewrite tone of”), long prompts. The model stays the same; only thinking is added.
Extended thinking (Anthropic only)
WhenCHAT_AUTO_REASONING=1 is on (default), the planner enables Anthropic’s extended thinking for complex prompts. SSE events stream the thinking tokens back to the editor:
thinking_start— model begins reasoningthinking_token— incremental text deltasthinking_end— reasoning complete
Image generation routing
Image generation is decoupled from the planner. Two env vars control it:
If the configured provider has no API key, the orchestrator falls back to the other backend rather than failing.
Switching providers from the editor
Every chat message carries an optionalprovider (openai | anthropic | gemini) and modelKey (fast | balanced | reasoning | codex). The editor sends both on every message. You choose them in Settings → Model, and the choice is remembered in your browser.
The picker offers Claude models whenever the orchestrator has an Anthropic key. OpenAI and Gemini are still wired end to end, but they are not held to the same quality bar, so the picker lists them only on a deployment that has no Anthropic key.
There is no server-side way to override a provider the request names — the per-message
provider from the client wins. To constrain a deployment, supply only the API key for
the provider you want. A request that names a provider without a key falls back to one
that has one.See also
- How it works — the planner → ops → preview pipeline end-to-end
- Chat troubleshooting — debugging planner output
- Token usage tracking — measuring per-provider spend
- MCP server — drive the same planner from Claude Desktop / Cursor