Agents and models
Which agents autofeat runs, and how to pin a model.
Agents run inside the executor. You name them in .autofeat/config.yml on the default branch. A directive cannot pick an agent that policy does not allow.
Recognised agents
| Name | Role |
|---|---|
opencode | Default agent. The only agent that takes a provider + model pair. |
claude | Subscription login on the hosted runner, or api_key. |
codex | Subscription login on the hosted runner, or api_key. |
kimi | Subscription login on the hosted runner, or api_key. Not in the default allow list. |
grok-build | Subscription login on the hosted runner, or api_key. |
agents.allowed defaults to [opencode, claude, codex, grok-build]. Add kimi there before you select it. agents.default must be one of agents.allowed. The default is opencode.
agents.billing maps a name to subscription or api_key. A name you omit is api_key. Keys must be in agents.allowed. Hosted subscription logins for claude, codex, kimi, and grok-build belong to the operator. See Budgets and billing.
agents.models
Each entry is an object. Both fields are optional.
| Field | Meaning |
|---|---|
model | The agent CLI's own model id, for example sonnet. |
provider | A provider name. Requires model. Only opencode accepts this pair. |
An empty entry means no --model flag: the agent CLI default applies. opencode with no entry falls back to models.default.
Names in agents.models must be in agents.allowed. Config load errors on any other name.
agents:
default: opencode
allowed: [opencode, claude, codex, grok-build, kimi]
billing:
claude: subscription
codex: subscription
kimi: subscription
grok-build: subscription
opencode: api_key
models:
claude: { model: sonnet }
opencode: { provider: openrouter, model: deepseek-v4-pro }opencode's pair must be models.default or an entry in models.allowed. If you omit models.allowed, the only permitted pair is models.default.
models
models.default is a provider and a model. Defaults: openrouter and deepseek-v4-pro.
models.allowed is a list of the same shape. Omit it and config load sets it to [models.default]. An explicit empty list is invalid, because models.default must be in the list.
API-key USD estimates exist only for the priced ids in Budgets and billing. An unknown id on the api_key path is refused before the run starts.
Methods
methods maps an action to one method. Omit it (methods: {}) and each action uses its default.
| Action | Default method | Methods policy accepts |
|---|---|---|
plan | single | single, orchestrate |
implement | orchestrate | single, orchestrate |
test | single | single, orchestrate |
review | delegate | delegate |
gate | native | native |
merge | native | native |
halt | native | native |
native review is refused. The enum also contains flow. Policy refuses flow. Do not set it.
policy.mode: review_only (the default) permits review, gate, merge, and halt. It forbids plan, implement, and test. policy.mode: full permits write actions. entry_action must be in the permitted set. The default entry is review.
orchestrate.max_workers defaults to 4 (at least 1). It caps workers for the orchestrate method.
policy.reviewer can pin who reviews: provider, model, must_differ_from (producer model ids the reviewer must not share), and severity_threshold (info, low, medium, high, critical; default high). policy.reviewer.model must not appear in must_differ_from.