> This page is for Voice AI Platform.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.hams.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.hams.ai/_mcp/server.

# Agent builder

> The kinds of AI agent you can build, and how to choose between them.

An AI agent is what talks to your customer. You give it instructions, a voice, the tools it may
use and the knowledge it may draw on, then put it on a phone number, a chat widget or an outbound
batch.

Every agent is built in the platform, from **Agent List**.

![The Agent List page, listing agents with their type, voice and last edited time.](/_fern-img/e5d328f6ee8cc80466d11173e1fa976bc48d13521c762e558b3cbcb73e553917.webp)

## Creating an agent

**Create Agent** asks two questions.

### 1. Agent type

The type decides how the conversation is steered by a single instruction, by a flow you draw, or
by a team of agents that hand off to each other. **It cannot be changed after the agent is
created**, so it is worth a minute of thought.

![The Select Agent Type step, offering Single Prompt, Conversation Flow, Multi-Prompt and Custom LLM.](/_fern-img/0887d8a47ec2af5d045553f9c72b161558db941a456e8d2621735b136530ca41.webp)

| Type                        | Use it for                                                 |
| --------------------------- | ---------------------------------------------------------- |
| **Single Prompt Agent**     | Short calls and straightforward tasks                      |
| **Conversation Flow Agent** | Tasks with complex transitions                             |
| **Multi-Prompt Agent**      | Lengthy calls and complex tasks                            |
| **Custom LLM**              | Attaching your own model endpoint. Requires a subscription |

> **Note**
>
> A Multi-Prompt agent is listed as a **Squad** in Agent List, and its builder
> is called the squad canvas. The two names mean the same thing.

### 2. Template

Then choose **Start from Blank**, or a template that arrives with its prompt and settings already
writte for: FAQs, Product inquiry, Survey, Cart Checkout, Patient Reminder, Dentist Appointment
Rescheduling.

![The Choose a Template step, offering Start from Blank and six ready-made templates.](/_fern-img/f90858a2245bd6e9af5c9ea4d3f10a787e45bc06fea021bb68f85ff3f3687e89.webp)

A template is only a starting point. Everything it sets can be edited afterwards, so picking one
costs nothing.

## The three ways to steer a conversation

### Single Prompt

The agent has one prompt, one model, and a set of tools it may call. Everything it knows about how
to behave is in that prompt, and the model chooses what to say at every turn.

![The agent detail page for a Single Prompt agent.](/_fern-img/48376f0ecb6ca2871fa78a24c99eb44d48bf97050f3a1a3baf15b394a00684d9.webp)

This is the fastest kind to build and the most forgiving of the unexpected: a caller who asks three
questions at once, or answers something you did not ask, is handled the way a person would handle
it. The trade-off is that you steer it only by writing, so a conversation that must happen in a
fixed order is hard to guarantee.

Reach for it when the conversation is open-ended answering questions, q ualifying a lead, triaging
a support call.

### Conversation Flow

The agent is a graph you draw. Each step is a node, and the connections between them decide when
the conversation moves on.

![The conversation flow builder showing a hospital receptionist flow.](/_fern-img/25ec43c190a52cf7e5a13aaaced566ce7571e689a7b805609109613f5971da16.webp)

| Node                  | What it does                                                           |
| --------------------- | ---------------------------------------------------------------------- |
| **Conversation**      | Talks to the caller, from a prompt or a fixed sentence                 |
| **Function**          | Calls a tool, optionally waiting for the result                        |
| **Call Transfer**     | Hands the call to an extension                                         |
| **Logic Split**       | Branches on values you have collected                                  |
| **Extract Variables** | Pulls named values out of what the caller said, for later nodes to use |
| **Press Digit**       | Sends keypad tones down the line                                       |
| **End Call**          | Ends the conversation                                                  |

Conversation nodes move on through **transitions** you describe in plain language *"Once the user
has provided their full name, department and preferred date and time"*. A Logic Split moves on by
comparing values instead: the first branch whose conditions hold is taken, and **Else** catches the
rest. Describing a condition in words leaves the judgement to the model; a Logic Split does not.

Three global settings shape the whole flow:

| Setting                     | What it does                                                                                                          |
| --------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Global Prompt**           | Applies at every node the agent's role and tone, written once                                                         |
| **Conversation Discipline** | **Rigid** holds the agent strictly to the current node's task. **Flexible** lets it move as the conversation warrants |
| **Global Tools**            | Tools the agent can call from any conversation node                                                                   |

Reach for it when the steps matter verifying identity before disclosing anything, taking a
booking, following a compliance script.

### Multi-Prompt (Squad)

A squad is several agents working as one. Each member is an agent you already built, added with
**Add Assistant**, and members are joined by **handoff tools** named transfers the model chooses
in the same way it would choose any other tool.

![The squad builder showing a welcome agent handing off to booking, rescheduling and cancellation agents.](/_fern-img/f5a3bc0b50f01875144a2fb35167fe0d53c267f2d4d47f2787f7417abe071bba.webp)

A member is a live reference to the agent, not a copy of it, so editing a member agent changes every
squad that uses it. An agent can appear only once in the same squad.

Each handoff controls how much of the conversation the receiving member sees everything, only the
dialogue, only the agent's own replies, the last few messages, or nothing at all and whether the
new member carries on talking or greets the caller.

**Squad Overrides** set voice, model, language and the rest for every member at once, so a squad
sounds like one agent even though several are behind it.

Reach for it when one agent would need to hold several unrelated jobs: booking, rescheduling and
cancellation, each with its own instructions and tools.

## Choosing

| If the conversation…                                              | Build it as       |
| ----------------------------------------------------------------- | ----------------- |
| Goes wherever the caller takes it                                 | Single Prompt     |
| Has to happen in a fixed order, or must branch on real values     | Conversation Flow |
| Covers several unrelated subjects, each needing its own expertise | Multi-Prompt      |

> **Note**
>
> Start with a Single Prompt agent. It is quick to build and quick to test, and
> it will show you where the conversation actually needs structure. Moving to a
> flow later means rewriting the agent but you will be rewriting it knowing what
> the calls look like.

## Voice or chat

Every agent runs on one channel, shown in Agent List as **(Voice)** or **(Chat)** in front of its
type. All three types work on either channel, but a single agent does not do both, so an integration
that needs both needs one of each.

The channel is fixed when you create the agent, and it decides which settings exist at all. A chat
agent has no voice, so everything about speech and telephony simply is not there.

| Applies to                                                                       | Voice | Chat |
| -------------------------------------------------------------------------------- | ----- | ---- |
| Model                                                                            | yes   | yes  |
| Speech-to-text engine, voice, language                                           | yes   | no   |
| Speech Settings, Call Setting, User Turns                                        | yes   | no   |
| Call Transfer and Press Digit nodes                                              | yes   | no   |
| Tools, knowledge, classification, post-call analyses, alerts, webhooks, security | yes   | yes  |

Everything that shapes what the agent *says* is shared. What differs is everything that exists only
because there is a phone line.

## Configuring an agent

Whichever type you choose, the agent's settings are grouped into the same panels.

| Panel                    | What it holds                                                                                     |
| ------------------------ | ------------------------------------------------------------------------------------------------- |
| **Tools**                | The actions the agent can take, added from the tools library                                      |
| **Pre-call Lookup**      | Data fetched about the caller before the conversation starts                                      |
| **Advanced Settings**    | Temperature, penalties, seed, max completion tokens, service tier                                 |
| **Speech Settings**      | How the voice sounds stability, style, speed and pronunciation                                    |
| **Call Setting**         | How the call begins, ring and duration limits, background audio, voicemail detection, turn-taking |
| **Classification**       | The fields extracted from every conversation                                                      |
| **Post-call Analyses**   | What is scored once the conversation ends                                                         |
| **Alerts**               | Notification when matching calls hit a threshold in a time window                                 |
| **Webhook**              | A URL for this agent's events, with a signing secret and the events to send                       |
| **Security**             | Data storage, PII redaction, guardrails, secure URLs, dynamic variables                           |
| **User Turns**           | Detection of incomplete or long caller turns                                                      |
| **Predefined Functions** | End Call and Call Rating                                                                          |

A flow agent keeps the same panels under **Global Settings**, alongside its per-node settings. A
squad keeps them under **Squad Overrides**, where they apply to every member at once.

[Agent settings](/platform/agents/settings) covers each panel in full, what the values mean, and
which ones are worth changing.

Above the panels sit the choices that apply to the whole agent: the **model** that answers, the
**speech-to-text** engine that hears the caller, the **voice** it replies in and the **language** it
speaks. Below those, the **First Message** decides whether the agent speaks first and what it opens
with, and the **Agent Prompt** is everything else it knows. Use `{{ }}` to put a variable into
either.

Every agent has an **Agent ID**, shown under its name and copied with one click. That is what your
integration refers to, see [AI agents](/platform/ai-agents).

Two controls sit in the header of every agent: **Test**, which starts a conversation against the
current configuration without publishing it, and **View Simulation**.