Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions fern/products/call-flow-builder/pages/core/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ You can easily add, remove, and rearrange elements in the call flow using the vi

</llms-ignore>

<llms-only>

Sample topology: **Handle Call** → **Answer Call** → **Gather Input**. Pressing `1` plays a busy message and records voicemail; pressing `2` connects to AI Agent `Ally`; **Unknown** and **No Input** route to another voicemail recording. Both voicemail paths and the AI Agent end at **Hang Up Call**.

</llms-only>

Add or remove any element from the call flow by dragging it into the desired location,
and define links between them using the connection lines.

Expand Down Expand Up @@ -85,6 +91,11 @@ After creating the call flow, the Call Flow will show up in the list of call flo

</llms-ignore>

<llms-only>

In the Dashboard, open **Tools** > **Call Flow Builder**, select **Add New**, enter a name, and select **Save**.

</llms-only>

---

Expand All @@ -101,6 +112,11 @@ From here, click on the `Edit` option to open the Call Flow Builder page.

</llms-ignore>

<llms-only>

On the Call Flow list, open the flow's **More Options** menu and select **Edit**.

</llms-only>

#### Add a node
When you first open a new Call Flow, you will see a canvas with a single node:
Expand All @@ -124,6 +140,12 @@ You will see an arrow connecting the two nodes, indicating that they are connect

</llms-ignore>

<llms-only>

Drag a node from the left panel onto the canvas, then drag from an existing node's right-side output connector to the new node's left-side input connector.

</llms-only>

---

#### Configure nodes
Expand All @@ -139,6 +161,12 @@ For example, the [Play Audio or TTS](/docs/call-flow-builder/reference/play-audi

</llms-ignore>

<llms-only>

Select a node on the canvas to open its configuration panel and edit its settings.

</llms-only>

---

#### Delete a node
Expand All @@ -153,3 +181,9 @@ Additionally, you can delete a node if they have configuration options open by c
</Frame>

</llms-ignore>

<llms-only>

Delete a node with the trash icon on the node or **Delete node** in its open configuration panel.

</llms-only>
20 changes: 20 additions & 0 deletions fern/products/call-flow-builder/pages/core/variables.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,20 @@ but the other values are very useful and can be referenced throughout the whole

#### Variable Example

<llms-ignore>

<Frame caption="Pass the caller phone number using a variable.">
![Using a phone number as a variable in a Call Flow.](/assets/images/call-flow/to-variable.webp)
</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Forward to Phone**. Set **To** to the destination number and **From** to `%{call.to}` to present the SignalWire number that received the inbound call.

</llms-only>

---

### Request Variables
Expand Down Expand Up @@ -117,6 +127,16 @@ A second condition in the same node checks for a 419 area code and forwards the
Condition 1: `%{area_code}==321||%{area_code}==407`
Condition 2: `%{area_code}==419`

<llms-ignore>

<Frame caption="Use the `slice()` method to alter a variable.">
![Using slice to alter a variable.](/assets/images/call-flow/slice-variable.webp)
</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Set Variables** (`area_code = %{call.from.slice(2,5)}`) → **Conditions**. Condition 1 (`321` or `407`) forwards to `+15552223333`; Condition 2 (`419`) forwards to `+15553334444`; **Else** forwards to `+15557778888`.

</llms-only>
30 changes: 30 additions & 0 deletions fern/products/call-flow-builder/pages/core/version.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,20 @@ and to revert to a previous version if needed.
Once a Call Flow has been created, you can click on the `Version History` button located in the top left corner of the Call Flow Builder interface.
This will open a panel showing all the versions of the call flow, along with a timestamp of when the version was created.

<llms-ignore>

<Frame caption="Opening the version history of a Call Flow.">
![Opening the version history of a Call Flow.](/assets/images/call-flow/version_button.webp)
</Frame>

</llms-ignore>

<llms-only>

Select **Version History** in the top-left of the builder to open the version panel and its timestamped entries.

</llms-only>

---

## Deploy a new version
Expand All @@ -27,10 +37,20 @@ Once you are satisfied with the new version, you can click the `Deploy` button t
When a new version is saved, it will add a new entry to the version history. The name of the
version will be `+1` from the previous version. E.g. `Version 1.0`, `Version 2.0`, `Version 3.0`, etc.

<llms-ignore>

<Frame caption="Deploying a new version of a Call Flow.">
![Deploying a new version of a Call Flow.](/assets/images/call-flow/deploy_version.webp)
</Frame>

</llms-ignore>

<llms-only>

After editing the draft, select **Deploy** to make it live and add the next numbered entry to Version History.

</llms-only>


---

Expand All @@ -41,6 +61,16 @@ open the version history panel by clicking the `Version History` button.
Select the version to which you wish to revert.
Click the `Restore` button to confirm.

<llms-ignore>

<Frame caption="Reverting to a previous version of a Call Flow.">
![Reverting to a previous version of a Call Flow.](/assets/images/call-flow/revert_version.webp)
</Frame>

</llms-ignore>

<llms-only>

Open **Version History**, select the desired prior version, and select **Restore**.

</llms-only>
10 changes: 10 additions & 0 deletions fern/products/call-flow-builder/pages/nodes/ai_agent.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,18 @@ Learn more in the [SignalWire AI overview](/docs/platform/ai).

In this example, we will create a simple call flow that connects to an AI agent after the call is answered.

<llms-ignore>

<Frame caption="AI Agent node." ogImage>

![AI Agent node.](/assets/images/call-flow/nodes/ai_agent_node.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Answer Call** → **AI Agent**. Select the existing `AI Resource` from **AI Agent Name**.

</llms-only>
10 changes: 10 additions & 0 deletions fern/products/call-flow-builder/pages/nodes/answer_call.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,22 @@ This node is not strictly required, as all notes that progress the flow will als

</Note>

<llms-ignore>

<Frame caption="The Answer Call node." ogImage>

![The Answer Call node.](/assets/images/call-flow/nodes/answer.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Answer Call**.

</llms-only>

## Node Settings

**None**
10 changes: 10 additions & 0 deletions fern/products/call-flow-builder/pages/nodes/conditions.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,18 @@ In this example, we immediately hang up calls from specific numbers on our block
All other calls will connect to the main reception number.


<llms-ignore>

<Frame caption="Block or pass through calls based on caller number." ogImage>

![Block or pass through calls based on caller number.](/assets/images/call-flow/nodes/block-condition.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Answer Call** → **Conditions**. Condition 1 matches a blocked `%{call.from}` number and routes to **Hang Up Call**; Condition 2 matches the VIP number and routes to **Forward to Phone** at `sip:admin@example.com`; **Else** routes to `sip:reception@example.com`.

</llms-only>
11 changes: 10 additions & 1 deletion fern/products/call-flow-builder/pages/nodes/execute_swml.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,22 @@ This play field will be used for TTS (Text-to-Speech) in the current document
and will welcome the user with the `User` parameter and say the `Token` parameter.


<llms-ignore>

<Frame caption="Call Flow using the Execute SWML node." ogImage>

![Execute SWML node example that executes a remote SWML document.](/assets/images/call-flow/nodes/swml_node.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Answer Call** → **Execute SWML**. Configure the remote URL and parameters, then evaluate `%{return_value.return_value} === 1`; the **Else** output goes to **Play Audio or TTS** with “SWML Execute Failed.”

</llms-only>


### Execute SWML Node Settings

Expand Down Expand Up @@ -171,4 +181,3 @@ if __name__ == "__main__":

</Tab>
</Tabs>

30 changes: 30 additions & 0 deletions fern/products/call-flow-builder/pages/nodes/forward_to_phone.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,22 @@ phone number, ensuring that the person receiving the forwarded call will see the
If the forward is successful, the call connects directly. If the call fails for any reason (no answer, busy, declined, or error), the flow routes to **Hang Up Call**.
This approach is particularly useful for business scenarios where you want to maintain transparency about who is calling.

<llms-ignore>

<Frame caption="Forward call while preserving original caller ID" ogImage>

![A Call Flow that uses the Forward to Phone node to forward the call while preserving the original caller ID.](/assets/images/call-flow/nodes/forward-from-original-example.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Forward to Phone**, with **From** set to `%{call.from}`. **Success** completes the forward; **No Answer**, **Busy**, **Decline**, and **Error** converge on **Hang Up Call**.

</llms-only>


### Forward to SIP

Expand All @@ -115,12 +125,22 @@ For example:
If the endpoint is unavailable, the flow will follow one of the four failed routes depending on the SIP signaling that is received.
You can give individual actions for each signal, or route them all back into the same node.

<llms-ignore>

<Frame caption="Forward to SIP" ogImage>

![A Call Flow that uses the Forward to Phone node to forward the call to a sip endpoint.](/assets/images/call-flow/nodes/forward-sip.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Forward to Phone** with **To** set to `sip:alice@example.com`. Route **No Answer**, **Busy**, **Decline**, and **Error** to an unavailable-message **Play Audio or TTS** node; **Success** remains the completed-call path.

</llms-only>


---

Expand All @@ -130,8 +150,18 @@ You can combine SIP dialing and Phone number dialing in the same node.
The example below is set to `Sequential` dialing, so the sales endpoint will first ring for 20 seconds.
After that, the call will ring the support endpoint for 20 more seconds before finally dialing out to +15552223333.

<llms-ignore>

<Frame caption="Forward to multiple SIP endpoints and phone numbers sequentially using the Forward to Phone node.">

![Forward to multiple SIP endpoints and phone numbers sequentially using the Forward to Phone node.](/assets/images/call-flow/nodes/forward-mix.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → one **Forward to Phone** node configured for **Sequential** dialing: `sip:sales@example.com` for 20 seconds, `sip:support@example.com` for 20 seconds, then `+15552223333` for 45 seconds.

</llms-only>
28 changes: 28 additions & 0 deletions fern/products/call-flow-builder/pages/nodes/gather_input.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -94,25 +94,45 @@ For every input option you can configure, an output node connection will be crea
You can choose to accept both Speech and DTMF tones with your IVR.
The caller in this example can either press 1 or say “sales” to connect with the sales line.

<llms-ignore>

<Frame caption="Gather input as speech or DTMF and send call to the selected channel.">

![Gather Input node example that accepts both DTMF and speech input.](/assets/images/call-flow/nodes/simple-input.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Answer Call** → **Gather Input**. Option 1 (press `1` or say `sales`) routes to **Forward to Phone** at `sip:sales@example.com`; Option 2 (press `2` or say `support`) routes to `sip:support@example.com`. **Unknown** and **No Input** remain separate outputs.

</llms-only>

### Input with infinite loop prevention

If you plan to loop your “No Input” route, you probably want to disconnect a call if the Gather Input node attempts to loop the call more than 2 times.
You can do that with a combination of a [Set Variables](/docs/call-flow-builder/reference/set-variables) node
and a [Conditions](/docs/call-flow-builder/reference/conditions) node.
If a caller dials your number and sits on the line in silence, your Flow will disconnect the call after a couple of loops.

<llms-ignore>

<Frame caption="Call Flow that prevents an infinite loop with a count and condition check." ogImage>

![Call Flow that prevents an infinite loop with a count and condition check.](/assets/images/call-flow/nodes/input-loop-protection.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Answer Call** → **Gather Input**. Route **Unknown** through a “could you repeat that?” TTS and back to **Gather Input**. Route **No Input** directly to **Set Variables** (`count = %{count} + 1`), then **Conditions** (`%{count} > 2`). The true branch goes to **Hang Up Call**; **Else** loops through a “didn't hear a response” TTS and back to **Gather Input**.

</llms-only>

### Accept any speech option

The “Unknown” route from the Gather Input node can be useful if you want to accept any and all speech recognition from your caller.
Expand All @@ -121,10 +141,18 @@ A word or phrase is required in your Option 1 “Or Says” field so that your G
You can route that option to the same flow as the “Unknown” route so all speech options continue the same path.
The variable `%{prompt_value}` can then be used in any node and will contain all speech that was detected.

<llms-ignore>

<Frame caption="Call Flow that accepts any speech and repeats it back to the caller.">

![Call Flow that accepts any speech and repeats it back to the caller.](/assets/images/call-flow/nodes/unknown-speech-input.webp)

</Frame>

</llms-ignore>

<llms-only>

Flow topology: **Handle Call** → **Gather Input**. Route both **Option 1** and **Unknown** to **Play Audio or TTS** with `You just said %{prompt_value}`, then to **Hang Up Call**. Giving Option 1 an **Or says** value enables speech collection while the **Unknown** path accepts other speech.

</llms-only>
Loading
Loading