Harnesses and models

Select Codex, Claude, or OpenCode and provide the correct model identifier.

The harness selects the coding-agent runtime. The model selects an allowed model for that harness. Both fields are required when creating a chat and are inherited on later turns.

Codex

{
  "harness": "codex",
  "model": "gpt-5.5",
  "provider_api_key": "sk-proj-..."
}

Codex accepts a bare OpenAI model identifier and requires an OpenAI key. Currently accepted families include:

gpt-5
gpt-5-codex
gpt-5-mini
gpt-5-nano
gpt-5-pro
gpt-5.1
gpt-5.1-codex
gpt-5.1-codex-max
gpt-5.1-codex-mini
gpt-5.2
gpt-5.2-codex
gpt-5.2-pro
gpt-5.3-codex
gpt-5.4
gpt-5.4-mini
gpt-5.4-nano
gpt-5.4-pro
gpt-5.5
gpt-5.5-pro
gpt-5.6-luna
gpt-5.6-sol
gpt-5.6-terra

Claude

The harness value is claude, not claude-code:

{
  "harness": "claude",
  "model": "claude-opus-4-8",
  "provider_api_key": "sk-ant-..."
}

Claude accepts a bare Anthropic model identifier and requires an Anthropic key:

claude-fable-5
claude-haiku-4-5
claude-opus-4-1
claude-opus-4-5
claude-opus-4-6
claude-opus-4-7
claude-opus-4-8
claude-sonnet-4-5
claude-sonnet-4-6
claude-sonnet-5

OpenCode

OpenCode uses a provider/model identifier:

{
  "harness": "opencode",
  "model": "openai/gpt-5.6-sol",
  "provider_api_key": "sk-proj-..."
}

Supported prefixes are:

PrefixProvider key
openai/OpenAI
anthropic/Anthropic
opencode/OpenCode Zen

OpenAI and Anthropic identifiers use the model catalogs shown above with their prefix added. Examples include anthropic/claude-sonnet-4-5 and openai/gpt-5.5.

OpenCode Zen includes models such as opencode/kimi-k2.6, opencode/minimax-m2.7, and opencode/gemini-3.5-flash.

Free Zen models

Models in the Zen catalog whose identifier ends in -free can run without a provider_api_key. The current free identifiers include:

opencode/deepseek-v4-flash-free
opencode/laguna-s-2.1-free
opencode/mimo-v2.5-free
opencode/nemotron-3-ultra-free
opencode/north-mini-code-free

Other Zen models require an OpenCode Zen key.

Validation

Epho validates the harness/model pair before creating a chat. Unknown harnesses, missing provider prefixes, and unsupported models return 422. The validation message includes the model identifiers currently accepted by that harness.