Variants#

Variants are named payload presets for a model, allowing you to quickly switch between different LLM parameters — like reasoning effort — without changing the model itself.
Built-in Variants#
ECA ships with built-in variants for some known models via the variantsByModel config which has a good default. For authenticated GitHub Copilot, ECA uses only the model's advertised reasoning capabilities from Copilot's /models endpoint and does not guess variants when that metadata is unavailable.
Note
Built-in variants match on the model id, so the Anthropic variants below also apply to the same Claude models served through Bedrock (e.g. us.anthropic.claude-opus-4-7). For Bedrock, ECA translates the Anthropic-shaped thinking/output_config payload into Converse's reasoning_config/output_config.
Applies to models matching sonnet-4-6, opus-4-5, opus-4-6 (any separator: -, ., _).
| Variant | Payload |
|---|---|
low |
{"output_config": {"effort": "low"}, "thinking": {"type": "adaptive"}} |
medium |
{"output_config": {"effort": "medium"}, "thinking": {"type": "adaptive"}} |
high |
{"output_config": {"effort": "high"}, "thinking": {"type": "adaptive"}} |
max |
{"output_config": {"effort": "max"}, "thinking": {"type": "adaptive"}} |
Applies to models matching opus-4-7, opus-4-8, opus-5, opus-5-5, sonnet-5, fable-5, fable-5-1, mythos-5, mythos-5-1 (any separator: -, ., _).
| Variant | Payload |
|---|---|
default |
{"thinking": {"type": "adaptive", "display": "summarized"}} |
low |
{"output_config": {"effort": "low"}, "thinking": {"type": "adaptive", "display": "summarized"}} |
medium |
{"output_config": {"effort": "medium"}, "thinking": {"type": "adaptive", "display": "summarized"}} |
high |
{"output_config": {"effort": "high"}, "thinking": {"type": "adaptive", "display": "summarized"}} |
xhigh |
{"output_config": {"effort": "xhigh"}, "thinking": {"type": "adaptive", "display": "summarized"}} |
max |
{"output_config": {"effort": "max"}, "thinking": {"type": "adaptive", "display": "summarized"}} |
Applies to the same Claude models when served through providers using the openai-chat API (e.g. OpenRouter). The top-level verbosity param is mapped by OpenRouter to Anthropic's output_config.effort upstream. Excluded for github-copilot provider (variants come from Copilot's /models discovery).
For sonnet-4-6, opus-4-5, opus-4-6 (thinking is opt-in via the unified reasoning param):
| Variant | Payload |
|---|---|
low |
{"verbosity": "low", "reasoning": {"enabled": true}} |
medium |
{"verbosity": "medium", "reasoning": {"enabled": true}} |
high |
{"verbosity": "high", "reasoning": {"enabled": true}} |
max |
{"verbosity": "max", "reasoning": {"enabled": true}} |
For opus-4-7, opus-4-8, opus-5, opus-5-5, sonnet-5, fable-5, fable-5-1, mythos-5, mythos-5-1 (thinking always on, verbosity is the only effort lever):
| Variant | Payload |
|---|---|
low |
{"verbosity": "low"} |
medium |
{"verbosity": "medium"} |
high |
{"verbosity": "high"} |
xhigh |
{"verbosity": "xhigh"} |
max |
{"verbosity": "max"} |
Applies to models matching gpt-5-3-codex, gpt-5-2, gpt-5-4, gpt-5-5. Excluded for github-copilot provider.
| Variant | Payload |
|---|---|
none |
{"reasoning": {"effort": "none"}} |
low |
{"reasoning": {"effort": "low", "summary": "auto"}} |
medium |
{"reasoning": {"effort": "medium", "summary": "auto"}} |
high |
{"reasoning": {"effort": "high", "summary": "auto"}} |
xhigh |
{"reasoning": {"effort": "xhigh", "summary": "auto"}} |
Applies to models matching gpt-5.6 (e.g. gpt-5.6-luna, gpt-5.6-terra, gpt-5.6-sol; any separator: -, ., _). Excluded for github-copilot provider.
| Variant | Payload |
|---|---|
none |
{"reasoning": {"effort": "none"}} |
low |
{"reasoning": {"effort": "low", "summary": "auto"}} |
medium |
{"reasoning": {"effort": "medium", "summary": "auto"}} |
high |
{"reasoning": {"effort": "high", "summary": "auto"}} |
xhigh |
{"reasoning": {"effort": "xhigh", "summary": "auto"}} |
max |
{"reasoning": {"effort": "max", "summary": "auto"}} |
Applies to models matching gpt-6 (e.g. gpt-6-astra; any separator: -, ., _), but not gpt-6.x point releases. Excluded for github-copilot provider. There is no none variant: GPT-6 Astra rejects that effort level. For Fast mode, add a custom variant with "service_tier": "fast" alongside the effort.
| Variant | Payload |
|---|---|
low |
{"reasoning": {"effort": "low", "summary": "auto"}} |
medium |
{"reasoning": {"effort": "medium", "summary": "auto"}} |
high |
{"reasoning": {"effort": "high", "summary": "auto"}} |
xhigh |
{"reasoning": {"effort": "xhigh", "summary": "auto"}} |
max |
{"reasoning": {"effort": "max", "summary": "auto"}} |
The three GPT tables above are for providers using the openai-responses API. The same models served through providers using the openai-chat API (e.g. a LiteLLM or Azure gateway) get the same variant names, but /chat/completions takes a top-level reasoning_effort string instead of the reasoning object:
| Variant | Payload |
|---|---|
none |
{"reasoning_effort": "none"} (not for gpt-6) |
low |
{"reasoning_effort": "low"} |
medium |
{"reasoning_effort": "medium"} |
high |
{"reasoning_effort": "high"} |
xhigh |
{"reasoning_effort": "xhigh"} |
max |
{"reasoning_effort": "max"} (gpt-5.6 and gpt-6 only) |
Warning
OpenAI does not support function tools together with reasoning on /chat/completions for gpt-5.6 and gpt-6 models (Function tools with reasoning_effort are not supported ... use /v1/responses or set reasoning_effort to 'none'), and gpt-6-astra rejects none. Since ECA sends its tools on every request, use "api": "openai-responses" for these models when your gateway supports /responses (LiteLLM does).
Applies to models matching deepseek-v4-pro and deepseek-v4-flash. Only for providers using the openai-chat API.
| Variant | Payload |
|---|---|
none |
{"thinking": {"type": "disabled"}} |
high |
{"reasoning_effort": "high"} |
max |
{"reasoning_effort": "max"}} |
Discovered Variants#
Some providers (GitHub Copilot, OpenAI OAuth, and gateways like OpenRouter or Synthetic) tell ECA which reasoning effort levels a model supports, and ECA builds the variants for you. Nothing to configure: just pick an effort from the model's variant list.
Discovered variants are only used when nothing else defines variants for the model. Your custom variants always win.
Custom Variants#
You can define your own variants per model under providers.<provider>.models.<model>.variants. Custom variants are merged with built-in ones — if names clash, your definition wins.
{
"providers": {
"anthropic": {
"models": {
"claude-sonnet-4-6": {
"variants": {
"creative": {"temperature": 1, "top_p": 0.95}
}
}
}
}
}
}
{
"providers": {
"anthropic": {
"models": {
"claude-sonnet-4-6": {
"variants": {
"creative": {"temperature": 1, "top_p": 0.95}
}
}
}
}
}
}
To disable a specific built-in variant, set it to {}:
{
"providers": {
"openai": {
"models": {
"gpt-5.2": {
"variants": {
// removes the "none" and "xhigh" built-in variants
"none": {},
"xhigh": {}
}
}
}
}
}
}
Agent Default Variant#
Set a default variant for an agent:
{
"agent": {
"code": {
"variant": "medium"
}
}
}
---
mode: subagent
description: Review code changes
model: openai/gpt-5.4
variant: high
---
Review the changes for correctness and regressions.
Unavailable variants are ignored. An explicit chat or spawn_agent variant overrides the agent default. See Agents for the complete agent specification.