Skip to content

Configuration (env)

Copy .env.example.env. The only required variable is an LLM key.

VariableDefaultPurpose
LLM_PROFILEanthropicanthropic | openrouter | mixed — which provider profile (per-tier default models)
LLM_ROUTINGPer-role preset: fast (Groq worker) | volume (OpenRouter worker) — see Role routing
ANTHROPIC_API_KEYAPI key for the Anthropic profile
OPENROUTER_API_KEYAPI key for the OpenRouter profile (cheaper)
GROQ_API_KEYAPI key for the Groq worker (used by LLM_ROUTING=fast)
QA_TESTCASE_LANGEnglishLanguage for generated test cases, e.g. Ukrainian / uk
BROWSER_BACKENDliblib (in-process Playwright) | cli — how the browser is driven
BROWSER_CHANNELchrome to use real Chrome (helps with OAuth)
MAX_REPAIR2Max self-repair attempts per failing spec (keep-best)
LANGFUSE_BASE_URLLangfuse — cloud or self-hosted (optional)
LANGFUSE_PUBLIC_KEYLangfuse public key
LANGFUSE_SECRET_KEYLangfuse secret key
ANTHROPIC_API_KEY=sk-ant-...

By default each profile uses its own per-tier models. LLM_ROUTING optionally layers a cheap worker over any profile while keeping the strong reasoner — one flag picks where the mechanical steps (identify elements, generate code, repair) run:

LLM_ROUTINGWorkerNotes
unset (default)the profile’s own per-tier modelsno routing
fastGroq llama-3.3-70b-versatilelowest latency / cost (needs GROQ_API_KEY)
volumeOpenRouter deepseek/deepseek-chatmodel breadth (needs OPENROUTER_API_KEY)

In every preset the reasoner — designing test cases and the Pilot verdict — stays on Anthropic claude-opus-4-8 for judgment quality. Override any role with CAIRN_ROLE_WORKER / CAIRN_ROLE_REASONER=provider:model, or pass --routing <preset> on explore / design / automate to set it per run. Per-run, per-role cost (tokens + $) is printed in the run summary — see ADR 0011.