Skip to content

Models

Each harness keeps a model list and a default model. Agent steps pick from that list, type any other id, or use the default.

When a step runs, the model is:

  1. the step’s Model, if set;
  2. otherwise the harness’s default model;
  3. otherwise none.

If a model is chosen, the harness’s Model arguments (--model {{model}} for most CLIs) are added to the command. If there’s no model, no model flag is passed and the CLI uses whatever it’s configured to use. API harnesses fall back to claude-opus-5 (Claude API) when neither is set; the OpenAI-compatible harness sends whatever is set.

The resolved model is shown on the step in the run view, the run graph and the step’s log (Claude Code · opus).

In the pipeline editor, Harness & model → Model shows:

  • a Default chip, labelled with the harness’s default model (e.g. Default: sonnet). Choosing it clears the step’s model, so the step follows the harness default if you change it later;
  • one chip per model in the harness list;
  • a text box: Or type a custom model id. Anything typed there is used as-is, even if it isn’t in the list;
  • a refresh chip (Pull the latest models) for harnesses with a model list source. It fetches and saves the harness’s list.

Lists longer than 12 models collapse to the first 12 plus a +N more chip (Show fewer to collapse again), and the text box becomes Search all models or type a custom id with autocomplete over the full list. The selected model always stays visible.

Changing a step’s harness clears its model.

In the harness editor, Models is a chip input:

  • type an id and press Enter, , or Tab to add it; pasting a comma- or space-separated list adds them all;
  • Backspace in the empty input removes the last model;
  • click ★ on a chip to make it the default; click × to remove it. Removing the default makes the first remaining model the default.

The first six models (default highlighted) are shown on the harness card.

Harnesses with a model list source have a Models button on their card and a Fetch latest button in the editor.

Button What it does
Models (card) Fetches the list and saves it to the harness immediately. Toasts Name: N models (M new).
Fetch latest (editor) Fetches the list into the editor. Nothing is saved until you click Save.

Either way, the new list replaces the old one. The default model is kept if it’s still in the list, otherwise the first model becomes the default.

Sources per harness:

Harness Source
Claude Code Anthropic Models API (needs ANTHROPIC_API_KEY); aliases without digits such as opus, sonnet, haiku are kept
OpenAI Codex CLI codex debug models
Gemini CLI GET https://generativelanguage.googleapis.com/v1beta/openai/models with GEMINI_API_KEY
Cursor Agent cursor-agent models
OpenCode opencode models
Pi pi --list-models (its provider model table becomes provider/model ids)
Claude API Anthropic Models API
OpenAI-compatible API GET {base URL}/models
GitHub Copilot CLI, Aider, Amp, Goose none — edit the list by hand
Simulator fixed: fast, realistic, flaky

A command source must exit 0 within 30 seconds. Its output can be JSON ({"models": […]}, {"data": […]} or an array of strings or objects with slug, id or name) or text with one model per line. Headers ending in :, # comments, bullets and trailing labels like - Fast model or (current) are handled. JSON entries with "visibility": "hide" are skipped, and entries are sorted by priority when present. A models/ prefix is removed.

Errors you may see:

  • Set ANTHROPIC_API_KEY (or add it to the harness env) to fetch models from the Anthropic API — Claude Code’s list comes from the API, which needs a key in the app’s environment. Detection and model fetching don’t see Settings → Environment variables.
  • <command> <args> failed: … — the list command exited non-zero.
  • <Name> returned no models — the source answered with an empty list.
  • <Name> has no model list source configured.

You can set a model list source on any CLI harness in its editor (Model list source: None, Command, Anthropic API, OpenAI API).