Skip to main content
An LLM is optional. canonic’s answer path is fully deterministic and never calls one. It’s only used to draft semantics/knowledge during setup and reconciliation. The llm: block in canonic.yaml supports four providers, all behind the same interface.
Local runtimes (Ollama, vLLM, LM Studio, llama.cpp, TGI) or any hosted OpenAI-compatible endpoint. base_url is required, and a key is optional (local servers typically need none):

One interface, any provider

All four are reached through litellm behind one interface, with no per-provider branching anywhere else in canonic. tasks: optionally overrides the model per task (draft, reconcile):

Air-gapped mode

Under runtime.air_gapped: true, only a local endpoint (loopback, or an allowlisted host via runtime.allow_cidrs) is accepted. openai, anthropic, and github_copilot all call a fixed public endpoint and are rejected outright in that mode.