Phase 2 — Model
Goal: write configs/models/<provider>/<slug>.yaml.
Always read configs/models/_template.model.yaml first — it carries the authoritative, inline-documented field set (v3 schema). The fields below are a guide, not a substitute for the live template.
The one field people get wrong: protocols
Declare the backend's wire protocol under the plural key protocols (a scalar or a list; first element = primary):
model:
protocols: [openai] # or [anthropic], or [openai, anthropic] for a gatewayopenai— backend speaks OpenAI Chat Completions (/v1/chat/completions)anthropic— backend speaks Anthropic Messages (/v1/messages)- A multi-protocol gateway lists every protocol it accepts; a harness whose protocol is in the list routes via same-protocol passthrough instead of conversion.
Why the plural matters (verified in source):resolve_manifest.normalize_model_protocols reads only protocols; a missing key silently defaults to ["openai"]. Several shipped files use the singular protocol: — that works only because they're all openai and the default happens to match. scripts/run.sh's preflight additionally reads singular protocol as the primary, so a non-openai backend declared with just protocol: anthropic gets treated as anthropic by the shell but as openai by the manifest resolver — a split-brain that mis-routes. Always write protocols (plural). Never rely on the singular form.
Required fields
model: