Flex Mode (flex_mode: true) runs your flow as one prompt instead of a node-by-node state machine. The worker compiles every node into a numbered step with its instruction and its "go to" rules, adds the needed functions, and runs the result as a single prompt agent. The LLM then moves between steps itself.
Use flex mode when callers jump around (answer three questions at once, go back to an earlier topic) and strict ordering matters less than a natural conversation. Keep Rigid Mode when the order must be enforced, when you rely on equations, code or MCP nodes, or when you need node-level settings.
Turn it on#
In Global settings, under Transition Flexibility, choose Flex Mode. Choose Rigid Mode to go back. Through the API, set flex_mode on the flow with PATCH /update-conversation-flow/:id.
How the flow is compiled#
The prompt is built from:
- The Global Prompt.
- A "Conversation steps" section telling the LLM to follow the steps in order from step 1, move on when a step's condition is met, and never mention steps to the caller.
- One
### Step N: <node name>block per node, starting with the start node.
Each step contains the node's instruction (a static sentence becomes Say: "...") and its edges written as rules:
- Prompt and Both edges:
- If <condition>: go to step "<name>". - Equation edges: the equations as text, for example
- If {{plan}} == premium: go to step "Premium". - Always and skip response edges:
- Then go to step "<name>". - Else edges:
- Otherwise go to step "<name>". - Global nodes:
- You may jump to this step at any time when: <condition>
What each node type becomes#
| Node | In flex mode |
|---|---|
| Conversation, subagent | Instruction text. Subagent tools become general functions |
| Function | "Call the tool <name>." The tool becomes a general function |
| Call transfer | Instruction, then "transfer the call". A transfer_<node id> function is added with the node's destination and options |
| Ending | Instruction, then "end the call with end_call". An end_call function is added |
| Press digit | A press_digit function is added |
| In-Call SMS | A send_sms function with the node's content is added |
| Extract Variable | "Make sure you know: ." No extraction runs |
| Logic split, code, MCP, agent transfer | Only their instruction text and edge rules are written. They do not execute |
| Component | Expanded into its own steps |
The compiled agent keeps the flow's model, temperature, start speaker, silence setting, knowledge bases, retrieval settings, default variables and MCP servers. If the agent speaks first and the start node has a static sentence, that sentence is the greeting.
What you lose#
- No node state: there are no
node_transitionevents and no per-node billing lines. - Node settings (model, voice speed, turn-taking, knowledge bases, finetune examples) are ignored.
- Equations are text for the LLM, not exact checks.
- Code, MCP, logic split and agent transfer nodes do not run.
- Transfer failure edges, SMS sent and failed edges and agent transfer failure edges are not followed as edges.
Tips#
- Name every node. Step names appear in the prompt, and "Collect details" reads better than "node_8f2c".
- Keep instructions self-contained. In flex mode the LLM sees all steps at once.
- Test both modes with the same simulated callers before switching a live agent. See Debug guide.