<!-- Markdown mirror. Canonical: https://empryo.com/docs/recipes/task-router -->

# Use multiple models

> Choose models and reasoning effort for research, coding, reviews and multi-agent workflows. Set defaults for each job or give specialists their own models.

Choose which model handles each kind of work: research, implementation, review, advice or workflow coordination. Set reasoning effort where supported. Delegation still happens automatically; these assignments do not require you to choose a helper for every task.

For named specialists, define [custom agents](/docs/tools/agents). For a planner, executor, parallel reviewers and an arbiter, use a [multi-agent workflow](/docs/agents/workflows). Individual agent and judge steps can specify their own model and effort.

## Ask the agent to set it up

You can describe what you want: *"put the summaries and the tab names on the cheapest model that can do them."*

The agent looks up models with their published prices (in US dollars per million tokens, for input, output, and cached tokens where available) and updates the router for you:

```text
haiku · 200k ctx · in $1 / out $5 / cache-r $0.1 / cache-w $1.25
```

Prices come from the provider's own list or from [models.dev](https://models.dev). If a model has no published price, the agent says so instead of guessing. These are list prices: they do not include your discounts, taxes, or subscriptions where tokens are not billed. The agent changes one slot at a time and leaves the rest of your setup alone.

## Set it up in the terminal app

```
/router
```

Pick a model for each job in the list.

## Set it up in the desktop app

Click **Routing** in the chat or the toolbar to open the routing panel. It stays open when you switch tabs, and each tab keeps its own setup.

- **Main agent** is the model that answers your messages.
- **Dispatch** covers the helper agents that research and edit for the main agent, including the switches for the cleanup pass and code review.
- If a model supports reasoning effort, you can set it next to the model.
- **Save to this tab** saves the models, effort levels, switches, and the limit on parallel agents for this tab. Finish or stop the current reply first.
- **Apply to all tabs…** copies this setup to your other open tabs, after asking you. It does not change your defaults or future tabs. Busy tabs are skipped, and you can retry them afterwards.

Backup models and other shared settings are in **Settings → Agent behavior**.

Up to 16 helper agents can run at once by default. Choose **Unlimited** to remove that limit (`maxConcurrentAgents: 0` in the config). Your provider's rate limits and your machine's memory still apply.

## Or edit the config

In `~/.empryo/config.json`:

```json
{
  "taskRouter": {
    "spark":      "anthropic/claude-haiku-4-5",
    "ember":      "anthropic/claude-sonnet-4-5",
    "explore":    "anthropic/claude-haiku-4-5",
    "webSearch":  "anthropic/claude-haiku-4-5",
    "desloppify": "anthropic/claude-haiku-4-5",
    "verify":     "anthropic/claude-haiku-4-5",
    "goalReview": "anthropic/claude-sonnet-4-5",
    "review":     "anthropic/claude-sonnet-4-5",
    "compact":    "google/gemini-2.5-flash",
    "semantic":   "anthropic/claude-haiku-4-5",
    "default":    null
  }
}
```

## Configuration reference

These are configuration keys, not a fixed roster of agents. The `spark` and `ember` keys name the internal research and editing defaults; you do not select those names to dispatch work.

| Slot | Used for | Good choice |
|------|----------|-------------|
| `spark` | Helper agents that read and research your code | Fast and cheap (Haiku, Flash) |
| `ember` | Helper agents that edit files | A strong coding model (Sonnet, Opus) |
| `explore` | The single `explore` agent. Uses `spark` if unset. | Fast and cheap |
| `webSearch` | Web search | Fast and cheap |
| `desloppify` | The cleanup pass after edits | Fast and cheap |
| `verify` | The check after edits | Mid-range |
| `goalReview` | The reviewer in the [goal loop](/docs/agents/goal-loop) | Mid-range or strong |
| `review` | `/review`. Uses `goalReview` if unset. | Mid-range or strong |
| `compact` | Summarizing old context when the conversation gets long | Fast and cheap (Flash works well) |
| `semantic` | One-line summaries of your code for the Genome, Empryo's code index | Fast and cheap |
| `advisor` | A second opinion on the current task | A model with a different perspective |
| `duck` | A separate conversation without repository access | Your preferred conversational model |
| `council` | Seats in a multi-model discussion | Models with complementary strengths |
| `orchestrate` | Designs and coordinates workflows | A strong planning model |
| `node` | Agent steps in a workflow | Match the work being assigned |
| `judge` | Review steps in a workflow | A strong independent reviewer |
| `routine` | Scheduled runs | Match the scheduled task |
| `namer` | Tab names | A fast model |
| `marionette` | Finds relevant code before a turn | A fast research model |
| `default` | Any job without its own slot, and the model a new tab opens on | |

When `default` is set, a new tab opens on it rather than on the model of the tab you came from, on the desktop and on the phone. Saving a default model (`/model` with a saved scope, Settings, or the `settings` tool) moves `default` to the same model, so the two never disagree. Picking a model for one tab leaves `default` alone.

Some jobs inherit another job first, such as review and workflow judges. See the [helper fallback table](/docs/tools/side-agents#where-the-models-come-from). General jobs fall back to `default`, then the model you are chatting with.

Leaving `spark` empty can be the cheaper choice. It then uses the same model as your chat, which lets it reuse the provider's prompt cache. A cheaper model has to start without that cache, which can cost more than it saves. Compare your costs in `/usage` before and after you change it.

If a slot names a model that cannot be found, Empryo uses the chat model instead of failing.

## Example setups

**Balanced**

A strong model for code, cheap models for everything else.
```json
"spark": "anthropic/claude-haiku-4-5",
"ember": "anthropic/claude-sonnet-4-5",
"compact": "google/gemini-2.5-flash"
```

**Budget**

Haiku for research and code. Good enough for many everyday tasks.
```json
"spark": "anthropic/claude-haiku-4-5",
"ember": "anthropic/claude-haiku-4-5",
"compact": "google/gemini-2.5-flash"
```

**Same model for both jobs**

Sonnet for both code and research.
```json
"spark": "anthropic/claude-sonnet-4-5",
"ember": "anthropic/claude-sonnet-4-5",
"compact": "google/gemini-2.5-flash"
```

**One gateway**

The same models through LLM Gateway, with a single key.
```json
"spark": "llmgateway/claude-haiku-4-5",
"ember": "llmgateway/claude-sonnet-4-5"
```

## Why this saves money

Much of an agent's work is reading: opening files, searching, and following references. That work rarely needs your strongest model. Sending it to a cheaper model keeps your strong model for the part that matters most, writing the code.
