A conversation flow agent runs a graph instead of one big prompt. Each node is a step: say something, run a function, transfer, press digits, send an SMS, branch on variables or hang up. Transitions (edges) decide which node comes next. A global prompt applies to every node.
Flows suit calls with a strict order (intake forms, qualification scripts, bookings, compliance wording) and calls where a wrong turn is expensive. For open conversations, a single prompt agent is simpler.
Create a flow agent#
- Go to Agents, create an agent and choose Conversation flow. You can start from a template, or choose Reuse an existing flow to share one flow between agents. The agent gets
response_engine: { type: "conversation-flow", conversation_flow_id }. - The flow builder opens full screen. Click Conversation in the node list to add a node. When a flow has no start node, the first node you add becomes the start node.
- Write the node's instruction, add transitions, and connect them to the next nodes.
- Fill in Global settings: model, global prompt, welcome behaviour, functions, knowledge base.
- Click Test to chat with the flow or call it from the browser, then Publish.
Through the API, create the flow with POST /create-conversation-flow, then create an agent that points at it.
The builder#
| Area | What it holds |
|---|---|
| Left rail | Agent (the builder) and Simulation (test cases) |
| Left column | Node tab: the node list and Note. Subflows tab: components |
| Canvas | Nodes, transitions, the Begin tag, notes and the canvas toolbar. See Canvas |
| Right column | Global settings tab and Node settings tab |
| Header | Agent name, save status, Test, Publish |
Changes save automatically. The header shows when a save is in progress or fails.
Node types#
| Node list label | type |
Purpose | Page |
|---|---|---|---|
| Conversation | conversation |
Talk with the caller | Conversation node |
| Subagent | subagent |
Conversation node with its own tools | Subagent node |
| Function | function |
Run one flow function | Function node |
| Call Transfer | transfer_call |
Transfer the call, with a failure edge | Call transfer node |
| Press Digit | press_digit |
Navigate a phone menu | Press digit node |
| Logic Split | branch |
Branch on variables, no speech | Logic split node |
| Agent Transfer | agent_swap |
Continue the call on another agent | Agent transfer node |
| In-Call SMS | sms |
Text the caller, with sent and failed edges | SMS node |
| Extract Variable | extract_dynamic_variables |
Extract values into variables | Extract variables node |
| Code | code |
Run JavaScript | Code node |
| MCP | mcp |
Call one MCP tool | MCP node |
| Ending | end |
Say a last line and hang up | End node |
| Component | component |
Run a reusable subflow | Components |
| Bridge Transfer, Cancel Transfer | bridge_transfer, cancel_transfer |
Transfer-agent flows only | Transfer agent nodes |
A seventeenth type, component_exit, only exists inside components.
How a flow runs#
Start#
The call starts at start_node_id (or the first node when it is unset). If the agent speaks first and the start node has a static sentence, that sentence is the greeting.
Talk in a conversation node#
The LLM replies using the global prompt plus the current node's instruction under "Current Task". The node's prompt transitions are offered to the same LLM call as transition_to_<node_id> tools.
Move on#
After each caller turn the engine checks, in order: the always edge, equation transitions top to bottom, then prompt transitions and global nodes (decided by the LLM), then the else edge. If nothing matches, the flow stays in the node.
Run automatic nodes#
Function, code, MCP, logic split, extract, SMS, press digit, transfer and agent transfer nodes do their work as soon as they are entered, then evaluate their transitions straight away. Up to 25 automatic hops can chain in one turn.
End#
An end node, an end_call, a transfer or the caller hanging up ends the call.
Every node change is recorded as a node_transition item in transcript_with_tool_calls with former_node_id, new_node_id and a transition_type (normal, global, global_go_back or interrupt_go_back).
Flow fields#
| Field | Type | Default | Description |
|---|---|---|---|
global_prompt |
string | "" |
Applies to every node |
model_choice |
object | {type: "cascading", model: "gpt-5.6-terra", high_priority: false} |
See Global settings |
model_temperature |
number 0 to 1 | 0 |
|
tool_call_strict_mode |
boolean | Strict tool schemas | |
start_speaker |
"agent" or "user" |
"agent" |
Who speaks first |
begin_after_user_silence_ms |
integer or null | User-first agents speak after this much silence | |
start_node_id |
string or null | null |
Start node |
nodes |
array of nodes | [] |
|
tools |
array of tools with tool_id |
[] |
Functions for function and subagent nodes |
knowledge_base_ids |
string array | [] |
|
kb_config |
{top_k, filter_score} |
Retrieval settings | |
kb_instruction |
string, up to 500 | Steers knowledge base queries | |
default_dynamic_variables |
object | {} |
|
mcps |
array | MCP servers for MCP tools and nodes | |
flex_mode |
boolean | See Flex mode | |
components |
array | Local components | |
notes |
array | Canvas sticky notes | |
begin_tag_display_position |
{x, y} |
{x: 0, y: 0} |
Where the Begin tag sits |
Billing#
LLM time is billed per node: the time spent in each node is priced at that node's model (a node can override the flow model), and shows as separate llm_node_<id>_<model> lines on the call's cost.