> ## Documentation Index
> Fetch the complete documentation index at: https://docs.famulor.io/llms.txt
> Use this file to discover all available pages before exploring further.

# System prompt vs. flow builder

> Two ways to define assistant behavior — and when to use which

An assistant can be driven in two ways: a **single system prompt** or a **visual flow**. Both use the same voice engine; the difference is how much structure you impose on the conversation.

## What makes up an assistant

Every assistant combines the same pieces, however you configure its behavior:

| Piece               | What it controls                                                                                                                                                  |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Behavior**        | A system prompt or a flow — see below                                                                                                                             |
| **Engine mode**     | [Pipeline, realtime, or half-cascade](/assistants/engine-modes) — how it hears and speaks                                                                         |
| **Model and voice** | The [language model, speech recognition, and voice](/assistants/models-and-voices) it uses                                                                        |
| **Tools**           | [Built-in actions](/assistants/built-in-tools) like transfers, SMS, or ending the call, plus [Agent Tools](/assistants/agent-tools) you build or install yourself |
| **Channels**        | Where it's reachable — phone numbers, [WhatsApp](/channels/whatsapp), the [web widget](/web-widget), and more                                                     |

Once configured, assign the assistant to a phone number for inbound calls or to a [campaign](/campaigns/overview) for outbound.

## Single system prompt

The simplest setup: one prompt describes the assistant's role, knowledge, and rules; one **first message** defines the greeting. The LLM handles the entire conversation freely within those instructions.

**Best for:**

* FAQ and reception assistants ("answer questions, take messages")
* Assistants whose job doesn't branch into distinct phases
* Fast prototyping — you can rewrite a prompt in seconds

**Configuration:**

* **Agent type** — choose **Single prompt** or **Conversational flow** when creating the assistant or later under **Settings → General**.
* **System prompt** — role, tone, rules, and facts. Use **Choose template** on the canvas (Prompt mode) or when creating the assistant. Applying a template copies into the prompt (and optional first message); it does not keep a live link to the template. See [Prompt writing](/assistants/prompt-writing) for how to structure and tighten the prompt itself.
* **First message** — the opening line, spoken when the call connects.
* **Greeting mode** — `agent speaks first` (typical inbound) or `user speaks first` (the assistant waits; useful for outbound where the callee says "Hello?").
* **Allow interruption** — optionally let callers interrupt the opening greeting. This is separate from conversation-level interruption settings.
* **Audio greeting** — optionally upload or record an audio file (mp3/wav/ogg/m4a, ≤ 5 MB) that plays at call start instead of the synthesized voice. The first-message text remains available for text channels and voicemail. Manage it from the Greeting card or through `POST`/`DELETE /api/v1/assistants/{id}/greeting-audio`.
* **Assistant picture** — optionally upload a PNG/JPEG/WebP image (≤ 1 MB) shown in the product UI instead of the default orb. Hover the avatar in the assistant header to upload or replace it, or use `POST`/`DELETE /api/v1/assistants/{id}/avatar`.

<Tip>
  Keep the first message short — 5–10 seconds is plenty. Since it's spoken exactly as written, spell out numbers and punctuation the way they should sound (an ellipsis adds a natural pause). If you use a recorded audio greeting, have it professionally recorded and clone the same voice for the rest of the call, so the handoff from the recording to synthesized speech feels seamless.
</Tip>

## Use-case templates

The Create assistant gallery includes both prompt templates and complete flow blueprints. Flow blueprints show an expected outcome, compatible surfaces, and any setup you must finish after creation. Applying one copies its prompt, greeting, graph, and variables into the new assistant; the copy remains yours to edit and is not changed when the catalog template is updated. See [Start from a use-case template](/flow-builder/overview#start-from-a-use-case-template) for details.

An **Avatar-ready** label describes the intended web experience, not a special flow node. Configure the web widget and virtual avatar after creation. The assistant picture is only the static portrait shown in the product and is separate from the speaking avatar used during a web session.

## Flow builder

The [flow builder](/flow-builder/overview) turns the call into a graph: multiple specialized agents, condition branches, HTTP tools, data-collection steps, transfers, and explicit endings. The engine hands the conversation from node to node.

In the editor, switch to **Flow** (or create with Conversational flow). The **base system prompt** is edited under Settings → General → **Advanced prompt** (and collapsed on the canvas). Agent-node instructions are **appended** to that base — they do not replace it.

**Best for:**

* Calls with distinct phases (qualify → collect data → book → confirm)
* Reliable data capture (names, emails, phone numbers with built-in validation)
* Calls that must branch ("existing customer?" → different paths)
* Transfers with rules (warm transfer to sales only after qualification)

## Which should you choose?

| Situation                           | Recommendation                                                                                            |
| ----------------------------------- | --------------------------------------------------------------------------------------------------------- |
| "Answer questions about X"          | System prompt                                                                                             |
| "Collect a callback number, always" | Flow (a `collect` node validates it)                                                                      |
| "Route support vs. sales"           | Flow (a `condition` node branches)                                                                        |
| "Call an API mid-conversation"      | Either — flows give you `tool` nodes; prompt-only assistants can use [MCP tools](/api/tools-and-webhooks) |
| First prototype                     | System prompt, then graduate to a flow                                                                    |

<Note>
  A flow's `agent` nodes can leave instructions empty — the assistant's system prompt (Advanced prompt) is used as the base. When an agent node has its own text, that text is **appended** to the system prompt, not substituted. Start with a prompt and add flow structure without duplicating the whole persona.
</Note>

## Settings that apply either way

### Response behavior by channel

The assistant automatically adapts response length, tone, and formatting to the delivery channel: spoken calls stay natural and concise, live chat stays scannable, collaboration channels lead with actions, and email stays structured. No setup is required.

To refine one channel, open **Settings → Channels**, choose the channel, then expand **Advanced** and switch from **Automatic** to **Manual**. Manual instructions are added to the automatic profile; they never replace safety, language, tool-use, or delivery rules. Web Widget and WhatsApp expose their voice and text modes separately. Leaving Manual empty keeps Automatic active.

Regardless of mode, every assistant has: engine mode ([pipeline / realtime / half-cascade](/assistants/engine-modes)), model and voice selection, [knowledge base](/assistants/knowledge-base), [conversation-quality settings](/assistants/conversation-quality), recording and consent options, maximum call duration, idle timeout, optional tags, and a webhook URL for call results.

**iOS / Android Call Screen Handling** (Settings → Conversation, or the Pre-Call node in the flow builder) lets the assistant answer screening services (“Who’s calling?”) with a name, company, and reason, then wait for a person before giving the normal greeting.

## Version history

Every save snapshots the assistant's previous configuration. Open the **History** icon in the editor header to see the full list, newest first.

* **Rename a version** — give it a short, memorable label instead of the default "Version N".
* **Open a version** — read a plain-language summary of what it contains: prompt, models, voice, tools, channels, and more.
* **Restore a version** — the current configuration is snapshotted first, so restoring is itself undoable.

The same actions are available as REST and MCP:

| REST                                                        | MCP tool                    | Scope              |
| ----------------------------------------------------------- | --------------------------- | ------------------ |
| `GET /api/v1/assistants/{id}/versions`                      | `list_assistant_versions`   | `assistants:read`  |
| `GET /api/v1/assistants/{id}/versions/{versionId}`          | `get_assistant_version`     | `assistants:read`  |
| `PATCH /api/v1/assistants/{id}/versions/{versionId}`        | `rename_assistant_version`  | `assistants:write` |
| `POST /api/v1/assistants/{id}/versions/{versionId}/restore` | `restore_assistant_version` | `assistants:write` |
| `DELETE /api/v1/assistants/{id}/versions/{versionId}`       | `delete_assistant_version`  | `assistants:write` |

## Public demo link

Turn on **Public demo link** in the assistant editor to get a shareable URL anyone can open and talk to the assistant immediately — no login required. Calls placed through it bill your workspace's credit balance exactly like test calls, so keep an eye on usage if you share it widely.

Turning the toggle off stops the link from working. Turning it back on brings back the exact same link rather than issuing a new one, so a link you've already shared keeps working after a disable/re-enable.

<Note>
  The public demo link works on your workspace's white-label domain when one is configured. There's no REST or MCP equivalent — the dashboard toggle is the only way to turn it on or off.
</Note>
