# Brain (/docs/agents/voice-agents/brain)

> For the complete documentation index, see [llms.txt](https://docs.tandemcx.ai/llms.txt). Any page on this site can be fetched as Markdown by appending `.md` to its URL.

The **Brain** card holds the settings that decide how the agent thinks: which **Language
Model** it runs on, whether **Reasoning** is on, and how **Conversation history** is kept once
a conversation outgrows the model's context window. A model is required; the rest default to
off. The card is on the **Conversation** step of the agent editor.

What the agent remembers about a caller **between** calls is separate, and lives on the
**Returning Callers** card one step earlier, under **Routing & Memory**. Those settings are
documented here too, from [Memory](#memory) down, because they decide what the agent knows
when it starts thinking.

## Language model

Every model here can hold a conversation, follow a system prompt, and call tools. They differ
in speed, cost, and how well they handle complicated instructions.

| Model | Provider | Reasoning | Setup |
| --- | --- | --- | --- |
| Claude Haiku 4.5 | Anthropic | Yes | Included |
| Claude Haiku 5.5 | Anthropic | Yes | Included |
| Nova Micro | Amazon | No | Included |
| Nova Lite | Amazon | No | Included |
| Nova 2 Lite | Amazon | No | Included |
| Gemini 3.8 Flash | Google | Yes | Connect your own account |
| Gemini 3.5 Flash-Lite | Google | Yes | Connect your own account |
| GPT-5.1 | OpenAI | Yes | Connect your own account |

<Callout type="info">
    Latency matters more than capability on a phone call. A model that answers in half a second
    usually produces a better conversation than a more capable one that pauses for two seconds,
    because callers hear the pause as hesitation. Start with the default. Move up if the agent
    demonstrably can't handle the task, and down if a smaller model handles it just as well on your
    own test calls.
</Callout>

### Which models you can actually pick

The table above is the full curated list — Tandem supports these models and no others, so
there's no model id to type in. The dropdown shows a subset of that list, grouped by provider,
and the **Setup** column is what decides whether a given model is in your subset:

- **Included** — available to every organization with no setup. If one is retired upstream it
  drops off the list.
- **Connect your own account** — appears only after your organization connects its own account
  for that provider as an integration. Tandem doesn't supply keys for these; you bring your own.

Which models fall in which group changes as the catalog grows, so read it off the table rather
than assuming it follows the provider.

If you open an agent whose saved model is no longer available, the field flags it and you'll
need to choose another before saving. The agent keeps running on its saved configuration
until you do.

A model that Tandem replaced with a newer one from the same provider is handled
differently. The agent opens with the replacement already selected, runs on it for every
call, and saves it the next time you save. Gemini 2.5 Flash and Gemini 2.5 Pro were both
replaced by Gemini 3.8 Flash.

Changing an agent's model is safe: the prompt, tools, dispositions, and everything else carry
over. Re-test on a real call afterwards, though, since models follow the same prompt somewhat
differently.

## Reasoning

**Reasoning** (also called extended thinking) lets the model work through a problem before it
answers. The toggle only appears for models that support it.

The reasoning itself is never spoken to the caller — they hear only the final answer. What
they _do_ notice is the extra time it takes, which is why this is off by default.

Turn it on when the agent has to hold several constraints at once: multi-step eligibility
rules, arithmetic over data it just fetched, decisions that depend on three or four things
the caller said. Leave it off for straightforward question-and-answer or intake, where it
just adds delay.

### Thinking budget (tokens)

With reasoning on, you can optionally cap how much thinking the model does. Higher budgets
allow deeper reasoning and take longer.

- Minimum **1024** tokens.
- Leave it empty to use the model's default.
- Pair it with a **Thinking cue** on the [Voice & Speech
  card](/docs/agents/voice-agents/voice-and-speech) so the extra time isn't silent.

### Gemini models

Gemini 3 models take a thinking level (low, medium, or high) instead of a token count, so the
budget you enter picks the level:

| Thinking budget | Level  |
| --------------- | ------ |
| Empty           | Medium |
| 1024 to 4095    | Low    |
| 4096 to 16383   | Medium |
| 16384 or more   | High   |

Gemini 3 models always do some thinking. With **Reasoning** off, the agent runs at the lowest
level the model allows: low on Gemini 3.8 Flash, minimal on Gemini 3.5 Flash-Lite. The
reasoning is still never spoken; turning it off only keeps it short.

### Claude Haiku 5.5

Claude Haiku 5.5 also takes an effort level (low, medium, or high) instead of a token count.
The budget you enter picks the level using the same table as the Gemini models above. With
**Reasoning** off, Claude Haiku 5.5 does no thinking at all.

## Memory

Everything from here to [Reconnect after a dropped call](#reconnect-after-a-dropped-call) is
on the **Returning Callers** card, on the **Routing & Memory** step, not on **Brain**. The
whole card is **Voice only**: every setting on it keys on the caller's phone number, and a
chat visitor has none.

**Memory** decides how much the agent recalls about a caller on their _next_ call. It's keyed
to the caller, so a returning caller doesn't start from zero. The default is **None**.

| Depth          | What the agent knows on the next call                              |
| -------------- | ------------------------------------------------------------------ |
| **None**       | Nothing. Every call starts fresh. (Default)                        |
| **Warm**       | That this caller has contacted you before, and roughly about what. |
| **Light**      | A short summary of previous calls.                                 |
| **Continuity** | The summary plus open items, so it doesn't re-ask what it knows.   |

Pick by what the agent does:

- **None** for anonymous, one-shot interactions — a directory, a survey, an after-hours
  message line. Also the right choice when you'd rather not retain anything about callers.
- **Warm** when recognition is the whole benefit: "Good to hear from you again."
- **Light** for support lines where knowing the last issue saves the caller re-explaining it.
- **Continuity** for multi-call processes — a claim, an application, a repair — where the
  point is picking up where you left off.

<Callout type="warn">
    Memory means the agent retains information about your callers between calls. Choose the
    shallowest depth that does the job, and check it against your own retention and privacy
    obligations before enabling it on a line that handles sensitive matters.
</Callout>

Memory is built from summaries of earlier calls, so it's approximate by nature. Don't rely on
it for anything that must be exact — look those facts up with a
[tool](/docs/agents/voice-agents/tools) instead.

### Returning caller greeting

With any memory depth other than **None**, a **Returning caller greeting** control appears. It
decides what a caller the agent recognizes hears in place of the **Greeting** you set on the
[Persona card](/docs/agents/voice-agents/persona). Three settings:

| Setting                     | What a returning caller hears                                                  |
| --------------------------- | ------------------------------------------------------------------------------ |
| **Same greeting** (default) | The same greeting a first-time caller hears.                                   |
| **Write my own**            | A second greeting you write, spoken verbatim. No added delay.                  |
| **Smart rewrite**           | The agent re-words your greeting to welcome them back. Delays the first audio. |

First-time callers always hear the Persona greeting exactly as written, whichever setting you
pick.

**Write my own** reveals a text box for the returning-caller greeting. Save is refused if you
leave it empty, with `Write a greeting for returning callers, or choose a different
returning-greeting option` — an empty box would save and then behave as **Same greeting**.

Choose by what the greeting has to do:

- **Same greeting** when the first line is a fixed disclosure, a recording notice, or a legal
  script that has to be spoken word for word to everyone.
- **Write my own** when returning callers should hear something different but still exact —
  including when the opening is a disclosure you are willing to word differently for them, but
  not willing to let a model rewrite. This is the only setting that gives you a second fixed
  line, and it costs nothing at call time.
- **Smart rewrite** when you want warmth without authoring a second greeting, and a slightly
  slower open is acceptable. The agent paraphrases your Persona greeting through the model
  before the caller hears anything, so it needs a **Greeting** set to have something to work
  from.

### Share memory across agents

Also shown once memory is on, under **Advanced**: **Share memory across agents**. It's off
by default, which keeps a caller's history private to the agent that recorded it.

Turn it on when several agents serve the same caller and should each know what the others
learned — a main line, a Spanish line, and a callback agent all handling the same account.
The setting is per agent and it has to be on at both ends: an agent only reads history from
other agents that are also sharing.

Leave it off when agents cover unrelated subjects, or when one of them handles matters the
others have no business knowing about.

### Reconnect after a dropped call

**Reconnect after a dropped call** is separate from memory depth and works even at **None**,
because a dropped call is one conversation rather than two. Three settings:

| Setting                                  | What a caller who rings back gets                                                        |
| ---------------------------------------- | ---------------------------------------------------------------------------------------- |
| **Off** (default)                        | A normal greeting. The dropped conversation isn't referenced.                            |
| **Offer to continue**                    | The agent offers to pick up where they left off, knowing the topic.                      |
| **Offer to continue, with full context** | The same offer, and the agent resumes with the whole conversation from the dropped call. |

Either non-off setting applies only when the caller rings back **within 10 minutes**. After
that, the call starts fresh.

Set it to one of the continue options for anything a caller would have to re-explain: an
intake, a claim, a multi-step booking. Leave it **Off** for short transactional lines, where
starting over costs the caller nothing.

## Knowledge

Attaching a knowledge base gives the agent a searchable set of your own facts to answer from,
which is almost always better than pasting reference material into the prompt. That's
configured on the **Knowledge** card — see [Knowledge
Base](/docs/agents/knowledge-base/overview).

## Conversation history

**Conversation history** controls how the agent keeps track of what's been said once a call
or chat runs long enough to fill the model's context window. It's in the **Conversation
History** panel, which the slider button in the **Brain** card's header opens — don't confuse
it with [Timeouts &
Limits](/docs/agents/voice-agents/conversation), which covers idle behavior, call limits, and
retry tuning. This section governs **both channels** — an agent that serves voice and chat
gets the same history behavior on each, because both run through the same underlying agent.

Two strategies:

| Strategy                     | What it does                                                                                       |
| ---------------------------- | -------------------------------------------------------------------------------------------------- |
| **Sliding window** (default) | Once history exceeds **Window size**, the oldest messages are dropped to make room.                |
| **Summarizing**              | Once history grows large enough, older turns are replaced with a summary instead of being dropped. |

There is deliberately no option to turn history management off. Without one of these two
strategies, history grows until it overflows the model's context window mid-call or
mid-chat, and the conversation dies.

**Sliding window** is the simpler and cheaper of the two, but dropping is silent: on a long
call, the caller's opening statement — why they called, an account number, a consent they
gave — can fall out of the window without either side noticing. **Window size** sets how many
messages are kept before the oldest start dropping; leave it unset to use the SDK's own
default of 40 messages.

**Summarizing** avoids that loss by folding older turns into a shorter summary instead of
discarding them, at the cost of added latency on the turn where summarization fires — the
model has to produce the summary before it can answer. Two fields tune it, both optional:

- **Summary ratio** — the fraction of history replaced by a summary each time summarization
  runs. Between 0.1 and 0.8. Unset uses the SDK's own default of 0.3.
- **Preserve recent messages** — how many of the most recent messages are always kept
  verbatim, never folded into a summary. Between 2 and 100. Unset uses the SDK's own default
  of 10.

There's no field for which model produces the summary — it's fixed by the platform. Letting
that be configurable would mean running a full-size inference on the caller's critical path
at the exact moment the context window overflows, which is the wrong tradeoff for either
channel. Its retry behavior is fixed for the same reason, and is **not** what the model-retry
fields on the Timeouts & Limits card set: those tune the model that answers the caller, and the
summarizer keeps the platform's own short backoff so a failure while it runs cannot outlast
the turn it fires inside.

Two more fields apply **regardless of which strategy you pick**:

- **Pin first** — messages at the very start of the call or chat that are never dropped or
  summarized away, no matter how long the conversation runs. This is the field that actually
  protects the caller's opening turns. Between 1 and 20 messages.
- **Proactive compression threshold** — instead of waiting for history to overflow before
  acting, compress once this fraction of the context window is already in use. Between 0.3
  and 1. Leave it unset to compress reactively only (the default), which is cheaper on most
  turns but risks a latency spike on the turn where the overflow finally happens.

## Limits and defaults

| Setting                             | Value                                                                                     |
| ----------------------------------- | ----------------------------------------------------------------------------------------- |
| **Language Model**                  | Required                                                                                  |
| **Reasoning**                       | Off by default; only shown for capable models                                             |
| **Thinking budget**                 | Optional; whole number, minimum 1024 tokens                                               |
| **Memory**                          | `None` by default                                                                         |
| **Returning caller greeting**       | `Same greeting` by default; requires memory other than None; `Write my own` requires text |
| **Share memory across agents**      | Off by default; requires memory other than None; must be on at both ends                  |
| **Reconnect after a dropped call**  | Off by default; independent of memory depth; 10-minute window                             |
| **Conversation strategy**           | `Sliding window` by default                                                               |
| **Window size**                     | 10–400 messages; sliding window only; SDK default 40                                      |
| **Summary ratio**                   | 0.1–0.8; summarizing only; SDK default 0.3                                                |
| **Preserve recent messages**        | 2–100 messages; summarizing only; SDK default 10                                          |
| **Pin first**                       | 1–20 messages; applies to both strategies                                                 |
| **Proactive compression threshold** | 0.3–1; applies to both strategies; reactive-only if unset                                 |

## Troubleshooting

**The agent is slow to respond.** In order of likelihood: **Reasoning** is on, the thinking
budget is high, or the model is a larger one than the task needs. Turn reasoning off and
re-test before changing anything else.

**The agent loses track of complicated rules.** Try **Reasoning** on. If that doesn't fix it,
the prompt is probably the problem — see
[Persona](/docs/agents/voice-agents/persona) on numbered steps.

**A model I want isn't in the dropdown.** Check its **Setup** column in the table above — if it
reads _Connect your own account_, your organization has to connect its own integration for that
provider first. If the model isn't in the table at all, it isn't supported; the list is curated,
so there's no way to add one yourself.

**The field says the saved model is no longer available.** The model was retired upstream.
Pick a replacement and save.

**The agent doesn't recognize a returning caller.** Confirm **Memory** isn't **None**, and
remember that the first call with memory enabled is the one that _creates_ the memory —
recognition starts on the second.

**Returning callers hear the ordinary greeting.** **Returning caller greeting** is on
**Same greeting**, which is the default, or the memory depth is **None**, which hides the
control entirely. Set a depth first, then pick **Write my own** or **Smart rewrite**.

**Save is refused asking for a returning-caller greeting.** **Write my own** is selected with
an empty box. Write the greeting, or switch to **Same greeting** or **Smart rewrite**.

**Smart rewrite doesn't change anything.** It paraphrases the **Greeting** on the Persona card,
so it has nothing to work from if that field is empty. Set a greeting, or use **Write my own**,
which does not depend on one.

**The agent recalls something inaccurately.** Memory is a summary, not a record. Facts that
must be exact belong in a [tool](/docs/agents/voice-agents/tools) lookup or a
[knowledge base](/docs/agents/knowledge-base/overview).

**The agent forgets something the caller said earlier in a long call.** With the default
**Sliding window** strategy, the oldest messages drop once **Window size** is exceeded.
Switch to **Summarizing** to keep older turns as a summary instead of losing them, or raise
**Pin first** to protect the caller's opening turns specifically.

**Turns are slower on long calls or chats.** If **Conversation strategy** is set to
**Summarizing**, latency goes up on whichever turn triggers a summarization pass — that's
expected. If a **Proactive compression threshold** is set, compression can also fire earlier,
on more turns, in exchange for avoiding a latency spike at the point of overflow; leave it
unset to compress reactively only.

## Next steps

<Cards>
    <Card
        title="Tools"
        href="/docs/agents/voice-agents/tools"
        description="Let the agent look things up and take action."
    />
    <Card
        title="Knowledge Base"
        href="/docs/agents/knowledge-base/overview"
        description="Give the agent facts to answer from."
    />
    <Card
        title="Safety"
        href="/docs/agents/voice-agents/safety"
        description="Content protections and tool-usage rules."
    />
</Cards>
