Supported providers
| Provider | Status | Notes |
|---|---|---|
| Anthropic Claude | Recommended | Most battle-tested. Required for extended thinking. Haiku / Sonnet / Opus all supported. |
| OpenAI | Supported | Also powers gpt-image-2 / gpt-image-1 image generation. |
| Google Gemini | Supported | Often the cheapest option. Default backend for AI image generation. Required for conversational image editing. |
Bring your own keys
Set whichever you have in.env:
/status/planner on boot to figure out which providers have keys, then surfaces them in the model picker. Providers without keys are hidden.
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 pick a different model per role without rewriting code:| Tier | When the planner uses it |
|---|---|
FAST | Intent detection — figuring out whether a user message is a real edit, a question, or small talk. Cheap models win here. |
BALANCED | Normal edits — rewriting copy, updating block props, simple structural changes. The workhorse tier. |
REASONING | Complex / ambiguous edits — multi-step plans, restructures, “rewrite the whole page in this tone.” Auto-selected by CHAT_AUTO_REASONING. |
CODEX | Agent mode (URL migration, repo integration). Long-running coding tasks. |
Defaults
.env — the planner reads env on every request, so changes take effect without a restart.
Tiered routing in action
When a user types in the Content Studio:- Intent router runs on the
FASTtier — usually finishes in under 500 ms. Decides: is this a chat-only message (“what does Hero do?”), a real edit, or ambiguous? - Full planner runs on
BALANCEDfor routine edits. The router and planner can race in parallel (CHAT_PARALLEL_PLANNER=1) so the planner gets a head-start. - Reasoning planner is auto-enabled for complex prompts by
CHAT_AUTO_REASONING=1. Signals: multi-step asks, conditional language (“if there’s already a CTA, …”), structural verbs (“restructure,” “rewrite tone of”), long prompts.
Extended thinking (Anthropic only)
WhenCHAT_AUTO_REASONING=1 is on (default), the planner enables Anthropic’s extended thinking for ambiguous prompts. SSE events stream the thinking tokens back to the editor:
thinking_start— model begins reasoningthinking_token— incremental text deltasthinking_end— reasoning complete
o1 / o3 reasoning models do their own internal thinking but don’t stream tokens — Avocado treats them as opaque reasoning calls. Gemini 2.5 Pro reasoning works similarly.
Image generation routing
Image generation is decoupled from the planner. Two env vars control it:| Setting | Result |
|---|---|
VARIATION_DEFAULT_IMAGE_SOURCE=unsplash | Stock photos by default; AI generation only on explicit mention |
VARIATION_DEFAULT_IMAGE_SOURCE=ai + IMAGE_GEN_PROVIDER=gemini | AI by default, Gemini backend |
Explicit keyword in chat ("generate via openai", "unsplash") | Overrides any default |
Switching providers from the editor
Every chat message includes aplanner field. The Content Studio’s model selector (top-right of the chat panel) lets you pick provider + tier per message. The choice persists across messages in a session, but the orchestrator re-reads it on every request so you can A/B mid-conversation.
If you want to lock providers down on a deployment — e.g. demo mode running on your shared key — set PLANNER_PROVIDER_LOCK=anthropic (or openai / gemini) on the orchestrator. The editor’s selector then becomes informational only.
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