From dcaf662c18d0b075f33d2d1a4e1c4a87b535fe5d Mon Sep 17 00:00:00 2001 From: August Date: Thu, 10 Sep 2026 13:12:51 +0000 Subject: [PATCH 01/12] docs(voice): add route and control calls guide --- .../platform/pages/calling/voice/overview.mdx | 4 +- .../calling/voice/route-and-control-calls.mdx | 399 ++++++++++++++++++ 2 files changed, 401 insertions(+), 2 deletions(-) create mode 100644 fern/products/platform/pages/calling/voice/route-and-control-calls.mdx diff --git a/fern/products/platform/pages/calling/voice/overview.mdx b/fern/products/platform/pages/calling/voice/overview.mdx index 66eb307434..0ba443ad3c 100644 --- a/fern/products/platform/pages/calling/voice/overview.mdx +++ b/fern/products/platform/pages/calling/voice/overview.mdx @@ -18,8 +18,8 @@ Whether building a UCaaS solution, modernizing a legacy IVR, augmenting CX with Build one agent, call it over a phone number, and send it a text turn through the AI Chat API - - The fundamentals of your first calling app + + Write a call flow that answers, listens, and branches on what the caller says Get started with our Compatibility API diff --git a/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx b/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx new file mode 100644 index 0000000000..69b95961b2 --- /dev/null +++ b/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx @@ -0,0 +1,399 @@ +--- +title: Route and control calls +slug: /voice/route-and-control-calls +description: Write a call flow that answers, asks the caller a question, and branches on what they say, then run it from the Dashboard and read the result in the call log. +position: 1 +max-toc-depth: 3 +--- + +[addresses]: /docs/platform/addresses +[create-call]: /docs/apis/rest/calls/call-commands +[phone-numbers]: /docs/platform/phone-numbers +[resources]: /docs/platform/resources +[server-sdks]: /docs/server-sdks +[swml-prompt]: /docs/swml/reference/calling/prompt +[swml-switch]: /docs/swml/reference/calling/switch +[swml-transfer]: /docs/swml/reference/calling/transfer + +A call flow is a document that tells SignalWire what to do with a live call: answer it, play a +message, listen for a reply, and decide what happens next. In this guide you write one, call it from +the Dashboard, say something out loud, and hear the flow respond to what you said. + +The flow runs as SignalWire Markup Language (SWML). You can write that document by hand as JSON or +YAML, or have the Server SDK generate it from Python. Both paths produce the same document, and +SignalWire runs it the same way. + +Before you start, you need: + +- A [SignalWire account](https://signalwire.com/signup) +- For the Server SDK path, Python 3 and [ngrok](https://ngrok.com/download) installed locally + +No phone number and no API token are required. The Dashboard can call a flow directly. + +--- + + + +### Write a flow that answers and speaks + +Start with the smallest flow that does something audible. Choose one authoring path. + + + + + + This guide uses Python. The [Server SDK documentation][server-sdks] covers the TypeScript SDK as + well. + + +#### Install the Server SDK + +```bash +python3 -m pip install signalwire-sdk +``` + +#### Write the flow + +Create `route_calls.py`: + +```python title="route_calls.py" +from signalwire import SWMLService + +service = SWMLService(name="route-calls") + +service.add_verb("answer", {}) +service.add_verb("play", {"url": "say:Thanks for calling. Your flow is running."}) +service.add_verb("hangup", {}) + + +if __name__ == "__main__": + service.serve() +``` + +`SWMLService` builds a SWML document and serves it over HTTP. Each `add_verb` call appends one +instruction to the document's `main` section, and `serve()` starts a web server on port `3000` +that returns the document when SignalWire requests it. + +#### Give the flow a public URL + +In a second terminal, start ngrok: + +```bash +ngrok http 3000 +``` + +Copy the HTTPS forwarding URL, such as `https://abc123.ngrok-free.app`, and keep ngrok running. + +#### Start the flow with stable credentials + +The service protects its URL with Basic Auth. Set the credentials yourself so they survive a +restart, then start the flow in the first terminal: + +```bash +export SWML_BASIC_AUTH_USER="signalwire" +export SWML_BASIC_AUTH_PASSWORD="replace-with-a-long-random-password" +python3 route_calls.py +``` + +#### Verify the generated SWML + +From another terminal, request the document through the tunnel: + +```bash +curl --fail \ + --user "signalwire:replace-with-a-long-random-password" \ + "https://abc123.ngrok-free.app/" \ + | python3 -m json.tool +``` + +A working flow returns a JSON document with `"version": "1.0.0"` and a `sections.main` array +holding `answer`, `play`, and `hangup`. A `401` response means the credentials in the request don't +match the ones you exported before starting the flow. + +#### Create an External URL resource + +SignalWire needs a resource to call. Open the [SignalWire Dashboard](https://my.signalwire.com), +select **Script**, and then select **External URL**. Set the Primary Script URL to the tunnel URL +with the credentials embedded: + +```text +https://signalwire:replace-with-a-long-random-password@abc123.ngrok-free.app/ +``` + +Select **Create**. The resource appears in **Resources**. + + + + +#### Create a SWML Script resource + + + +Give the script a name and paste this document into the editor: + + + +```yaml +version: 1.0.0 +sections: + main: + - answer: {} + - play: + url: "say:Thanks for calling. Your flow is running." + - hangup: {} +``` + + +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { "answer": {} }, + { "play": { "url": "say:Thanks for calling. Your flow is running." } }, + { "hangup": {} } + ] + } +} +``` + + + +Save the script. It appears in **Resources**. + +Execution starts at the `main` section, which every document must have. Each section is an +ordered list of methods, and later in this guide you add more sections and jump between them. +`answer` picks up the call, `play` speaks the text after the `say:` prefix, and `hangup` ends the +call. + + + + +### Call the flow + +Open the resource in **Resources** and use the Dashboard's click-to-call control to dial it. +[NEEDS SOURCE: confirm the label and location of the click-to-call control on a resource in the +new Dashboard.] + +You hear "Thanks for calling. Your flow is running." and the call ends. + +If the call connects but stays silent, the flow never ran. On the Server SDK path, repeat the +`curl` request to confirm the tunnel still answers, then check that the External URL resource +carries the same URL and credentials. On the SWML path, reopen the script and check that the +document saved with a `main` section. + +To reach the same flow from a phone instead, assign one of your [phone numbers][phone-numbers] to +the resource under **Inbound Call Settings** and dial it. + +### Listen and branch on what the caller says + +Now make the flow ask a question and route on the answer. Three methods do the work: + +- [`prompt`][swml-prompt] plays a question and waits for input. Setting `speech_hints` switches it + from keypad digits to speech and lists the words you expect to hear. When the caller + speaks, `prompt` stores the recognized text in the `prompt_value` variable and the outcome in + `prompt_result`. +- [`switch`][swml-switch] compares a variable against a set of cases and runs the matching one. + The `default` case runs for anything else, including silence and unrecognized speech. +- [`transfer`][swml-transfer] jumps to another section of the document and does not return. + +Replace the flow with this version. The `sales` and `support` sections each speak a different +message, and `no_match` handles a caller who says nothing or something the flow doesn't expect. + + + + +Replace `route_calls.py`: + +```python title="route_calls.py" +from signalwire import SWMLService + +service = SWMLService(name="route-calls") + +service.add_verb("answer", {}) +service.add_verb( + "prompt", + { + "play": "say:Thanks for calling. Say sales or support.", + "speech_hints": ["sales", "support"], + }, +) +service.add_verb( + "switch", + { + "variable": "prompt_value", + "case": { + "sales": [{"transfer": {"dest": "sales"}}], + "support": [{"transfer": {"dest": "support"}}], + }, + "default": [{"transfer": {"dest": "no_match"}}], + }, +) + +service.add_verb_to_section("sales", "play", {"url": "say:You said sales."}) +service.add_verb_to_section("sales", "hangup", {}) + +service.add_verb_to_section("support", "play", {"url": "say:You said support."}) +service.add_verb_to_section("support", "hangup", {}) + +service.add_verb_to_section("no_match", "play", {"url": "say:Sorry, I didn't catch that. Goodbye."}) +service.add_verb_to_section("no_match", "hangup", {}) + + +if __name__ == "__main__": + service.serve() +``` + +`add_verb_to_section` creates the named section on first use and appends to it after that. The +SDK validates every verb against the SWML schema as you add it, so a misspelled parameter raises +an error at startup instead of failing on a live call. + +Restart the flow with the same credentials, then request the document again with `curl`. The +`sections` object now holds `main`, `sales`, `support`, and `no_match`. The External URL resource +already points at the tunnel, so there is nothing to change in the Dashboard. + + + + +Open the script in **Resources** and replace its contents: + + + +```yaml +version: 1.0.0 +sections: + main: + - answer: {} + - prompt: + play: "say:Thanks for calling. Say sales or support." + speech_hints: + - sales + - support + - switch: + variable: prompt_value + case: + sales: + - transfer: + dest: sales + support: + - transfer: + dest: support + default: + - transfer: + dest: no_match + sales: + - play: + url: "say:You said sales." + - hangup: {} + support: + - play: + url: "say:You said support." + - hangup: {} + no_match: + - play: + url: "say:Sorry, I didn't catch that. Goodbye." + - hangup: {} +``` + + +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { "answer": {} }, + { + "prompt": { + "play": "say:Thanks for calling. Say sales or support.", + "speech_hints": ["sales", "support"] + } + }, + { + "switch": { + "variable": "prompt_value", + "case": { + "sales": [{ "transfer": { "dest": "sales" } }], + "support": [{ "transfer": { "dest": "support" } }] + }, + "default": [{ "transfer": { "dest": "no_match" } }] + } + } + ], + "sales": [ + { "play": { "url": "say:You said sales." } }, + { "hangup": {} } + ], + "support": [ + { "play": { "url": "say:You said support." } }, + { "hangup": {} } + ], + "no_match": [ + { "play": { "url": "say:Sorry, I didn't catch that. Goodbye." } }, + { "hangup": {} } + ] + } +} +``` + + + +Save the script. The next call picks up the new document. + + + + +### Call it three times + +Call the resource again and say "sales". The flow answers "You said sales." Call once more and say +"support" to hear the other branch. On a third call, say nothing: after the input timeout the flow +says "Sorry, I didn't catch that" and hangs up. The default wait for input is five seconds. + +If every call lands in `no_match`, the recognized text didn't equal a case key. `switch` compares +the whole value exactly, so check the keys for capital letters and stray spaces. The next step +shows you what the flow heard. + +### Read the call log + +Open **Logs** > **Calling** in the Dashboard and select the most recent call to see its details. +[NEEDS SOURCE: confirm which details the new Dashboard's call log shows for a SWML call, in +particular whether it lists the executed steps and the recognized speech.] + +To receive the recognized speech on your own server, add a `status_url` to the `prompt` method. +SignalWire sends a `calling.call.collect` event to that URL when input arrives. The payload's +`params.result.type` is `speech`, `no_input`, or `no_match`, and for speech the recognized text is +included with its confidence score. The [`prompt` reference][swml-prompt] documents every field. + + + +## One flow, any channel + +The document you wrote doesn't know where the call came from. The Dashboard reached it through +click-to-call. A [phone number][phone-numbers] assigned to the same resource runs the identical +document, and so does a SIP address, a browser call to the resource's [address][addresses], or an +outbound call you place with the [REST API][create-call]. Direction and channel are routing +details on the [resource][resources]. The flow is the same program. + +## Next steps + + + + + Loop back to the question with `goto` and labels, call sections like functions with `execute`, + and see how `transfer` differs from both. + + + + Accept keypad digits alongside speech, record the call, and connect each branch to a real + phone number. + + + + Serve a different document per call, add routing callbacks, and secure the endpoint for + production. + + + + Buy a number, assign it to the flow, and dial it from your own phone. + + + From 033434ad43137d1d40fdcab988712681a4b52a0d Mon Sep 17 00:00:00 2001 From: August Date: Fri, 11 Sep 2026 15:17:08 +0000 Subject: [PATCH 02/12] docs(voice): source dashboard steps in route and control calls guide --- .../calling/voice/route-and-control-calls.mdx | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx b/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx index 69b95961b2..74280aaed8 100644 --- a/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx +++ b/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx @@ -171,12 +171,15 @@ call. ### Call the flow -Open the resource in **Resources** and use the Dashboard's click-to-call control to dial it. -[NEEDS SOURCE: confirm the label and location of the click-to-call control on a resource in the -new Dashboard.] +Open the resource in **Resources** and select **Click-to-Test**, under the resource's name. A new +tab opens, shows "Connecting", and places a browser call to the resource. Allow microphone access +if the browser asks. You hear "Thanks for calling. Your flow is running." and the call ends. +**Click-to-Test** appears only on resources that handle calls. If it is disabled, the resource has +no address to dial: open its **Addresses** and add an alias address. + If the call connects but stays silent, the flow never ran. On the Server SDK path, repeat the `curl` request to confirm the tunnel still answers, then check that the External URL resource carries the same URL and credentials. On the SWML path, reopen the script and check that the @@ -354,11 +357,14 @@ shows you what the flow heard. ### Read the call log -Open **Logs** > **Calling** in the Dashboard and select the most recent call to see its details. -[NEEDS SOURCE: confirm which details the new Dashboard's call log shows for a SWML call, in -particular whether it lists the executed steps and the recognized speech.] +Open **Logs** > **Voice** in the Dashboard and select the most recent call. The call's timeline +lists each step the flow ran in order: the call state changes, a **Play** entry for each message, +and a **Collect** entry for the `prompt`. Select an entry to see its details. A flow that fails +to load or contains an invalid method shows a **Script Warning** or **Error** entry with the +reason, so a broken document is visible here without a support ticket. -To receive the recognized speech on your own server, add a `status_url` to the `prompt` method. +The timeline records that input was collected, not what the caller said. To receive the +recognized speech itself, add a `status_url` to the `prompt` method. SignalWire sends a `calling.call.collect` event to that URL when input arrives. The payload's `params.result.type` is `speech`, `no_input`, or `no_match`, and for speech the recognized text is included with its confidence score. The [`prompt` reference][swml-prompt] documents every field. From 17ac85c64491283aa6d1a857bf4cfef92a479539 Mon Sep 17 00:00:00 2001 From: August Date: Wed, 16 Sep 2026 16:03:28 +0000 Subject: [PATCH 03/12] docs(voice): rewrite route and control calls as the call routing capability guide --- fern/llms.txt | 1 + .../pages/calling/voice/call-routing.mdx | 1195 +++++++++++++++++ .../platform/pages/calling/voice/overview.mdx | 4 +- .../calling/voice/route-and-control-calls.mdx | 405 ------ 4 files changed, 1198 insertions(+), 407 deletions(-) create mode 100644 fern/products/platform/pages/calling/voice/call-routing.mdx delete mode 100644 fern/products/platform/pages/calling/voice/route-and-control-calls.mdx diff --git a/fern/llms.txt b/fern/llms.txt index 663001674e..978f009c03 100644 --- a/fern/llms.txt +++ b/fern/llms.txt @@ -159,6 +159,7 @@ Feature pages are grouped by channel. SDK pages come first when available, follo ### Calling +- [Call routing](/docs/platform/voice/call-routing): Answer a call and speak from a flow you host or serve, then collect what the caller says, branch on it, handle silence, and read the result in the call log or your own code. - [Call recording](/docs/swml/guides/record-calls): Record an ongoing call with a hosted SWML script and access the recording in your Space. - [Call transfer](/docs/server-sdks/guides/call-transfer): Transfer a call to a phone number, SIP endpoint, or SWML document. - [Real-time transcription](/docs/server-sdks/reference/python/relay/call/live-transcribe): Start or stop live transcription on a call. diff --git a/fern/products/platform/pages/calling/voice/call-routing.mdx b/fern/products/platform/pages/calling/voice/call-routing.mdx new file mode 100644 index 0000000000..5bc689fcd7 --- /dev/null +++ b/fern/products/platform/pages/calling/voice/call-routing.mdx @@ -0,0 +1,1195 @@ +--- +title: Call routing +slug: /voice/call-routing +description: Answer a call and speak from a flow you host or serve, then collect what the caller says, branch on it, handle silence, and read the result in the call log or your own code. +position: 1 +max-toc-depth: 3 +--- + +[addresses]: /docs/platform/addresses +[api-credentials]: /docs/platform/your-signalwire-api-space +[browser-sdk]: /docs/browser-sdk +[cfb]: /docs/call-flow-builder +[cfb-forward]: /docs/call-flow-builder/reference/forward-to-phone +[cfb-gather]: /docs/call-flow-builder/reference/gather-input +[cfb-hangup]: /docs/call-flow-builder/reference/hangup-call +[cfb-play]: /docs/call-flow-builder/reference/play-audio-or-tts +[cfb-version]: /docs/call-flow-builder/guides/version +[control-flow]: /docs/swml/guides/goto-execute-transfer-disambiguation +[create-call]: /docs/apis/rest/calls/call-commands +[outbound]: /docs/platform/voice/outbound-calling +[phone-numbers]: /docs/platform/phone-numbers +[relay-client]: /docs/server-sdks/guides/relay-client +[relay-collect]: /docs/server-sdks/reference/python/relay/call/play-and-collect +[relay-connect]: /docs/server-sdks/reference/python/relay/call/connect +[relay-events]: /docs/server-sdks/reference/python/relay/events +[resources]: /docs/platform/resources +[rest-calling]: /docs/apis/rest/calls/call-commands +[server-sdks]: /docs/server-sdks +[swml]: /docs/swml +[swml-connect]: /docs/swml/reference/calling/connect +[swml-goto]: /docs/swml/reference/calling/goto +[swml-prompt]: /docs/swml/reference/calling/prompt +[swml-switch]: /docs/swml/reference/calling/switch +[swml-transfer]: /docs/swml/reference/calling/transfer +[trial-mode]: /docs/platform/trial-mode + +Route a call by deciding what happens after SignalWire answers it: greet the caller, ask a +question, and send the call down a branch based on the reply. The flow you write does not care +whether the call arrived on a phone number, a SIP address, or a browser. Start by answering a call +and speaking one line, then collect speech and branch on it, handle silence and unmatched replies, +and track what the flow heard. + +## Pick the right product for call routing + +| Function | SWML | Relay | REST Calling API | Browser SDK | Call Flow Builder | +|---|---|---|---|---|---| +| Answer the call and speak without running a server | | | | | | +| Collect speech or keypad digits and branch on the result | | | | | | +| Run the routing logic in your own process, step by step, while the call is live | | | | | | +| Command a call that is already in progress, by its call ID | | | | | | +| Build the flow visually, with no code | | | | | | + +- [SWML][swml] is a JSON or YAML document that SignalWire runs step by step. Generate it with the + [Server SDKs][server-sdks] or write it by hand, then host it in your Space or serve it from your + own server. +- [Relay][relay-client] is the WebSocket client in the Server SDKs. Your process receives the call + and issues each command as the call proceeds. +- The [REST Calling API][rest-calling] sends the same commands over HTTP to a call you already hold + the ID for. Results come back as webhooks. +- The [Browser SDK][browser-sdk] places and receives calls from a web page. It is the caller or the + callee, never the flow. +- [Call Flow Builder][cfb] is a visual editor in the Dashboard. You connect nodes and SignalWire + hosts the result as a Call Flow resource. + +## Prepare for call routing + +Have these values ready: + +- Your Space URL, such as `.signalwire.com`. +- For the Relay and REST Calling API paths, your Project ID and an API token from the Dashboard's + [API credentials][api-credentials] page, with the **Voice** permission enabled. A hosted SWML + script or a Call Flow needs no credentials. +- For SWML served from your own server, Python 3 or Node.js and [ngrok](https://ngrok.com/download). +- For the hand-off example, a phone number you can answer. + + +A [trial project][trial-mode] can hand a call to a number it has purchased or verified, and cannot +reach international numbers at all. Every other step in this guide works on a trial project. + + +This guide receives calls. To place them, start with [Outbound calling][outbound]. + +## Answer a call and speak + +The smallest flow that does something audible: answer, speak one line, hang up. You call it from +the Dashboard, so no phone number is involved yet. + + + +### Set your credentials + +Replace these placeholders in the samples. The hosted SWML and Call Flow Builder paths use none of +them. + +| Value | Replace with | +|---|---| +| `` | Your Space's subdomain in `.signalwire.com` | +| `` | Your Project ID | +| `` | Your API token | +| `` | The ID of a call in progress, for the REST Calling API samples | +| `` | A public HTTPS URL on your server that accepts POST requests | +| `` | A phone number you can answer, in E.164 format | +| `` | A number in your Space, or a verified caller ID | + +### Write the flow + + + + +The document below answers the call, speaks, and hangs up. The Server SDK classes build the same +document from code and serve it over HTTP; the YAML and JSON forms are what you paste into the +Dashboard. `SWMLService` is the non-AI base of the Server SDK's agent classes and validates every +verb against the SWML schema as you add it. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as call_routing.py and run: python call_routing.py +from signalwire import SWMLService + +service = SWMLService(name="call-routing") + +service.add_verb("answer", {}) +service.add_verb("play", {"url": "say:Thanks for calling Bayview Taxi. Your flow is running."}) +service.add_verb("hangup", {}) + +if __name__ == "__main__": + service.serve() +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as call-routing.mjs, +// then run: node call-routing.mjs +import { SWMLService } from "@signalwire/sdk"; + +const service = new SWMLService({ name: "call-routing" }); + +service.addVerb("answer", {}); +service.addVerb("play", { url: "say:Thanks for calling Bayview Taxi. Your flow is running." }); +service.addVerb("hangup", {}); + +await service.serve(); +``` + + +```yaml +version: 1.0.0 +sections: + main: + - answer: {} + - play: + url: "say:Thanks for calling Bayview Taxi. Your flow is running." + - hangup: {} +``` + + +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { "answer": {} }, + { "play": { "url": "say:Thanks for calling Bayview Taxi. Your flow is running." } }, + { "hangup": {} } + ] + } +} +``` + + + +Execution starts at the `main` section, which every document must have. Each section is an +ordered list of methods. `answer` picks up the call, `play` speaks the text after the `say:` +prefix, and `hangup` ends the call. + + + + +A Relay client stays connected to SignalWire and receives every call routed to its context. The +handler answers, speaks, and hangs up when playback completes. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as call_routing.py and run: python call_routing.py +from signalwire.relay import RelayClient + +client = RelayClient( + project="", + token="", + host=".signalwire.com", + contexts=["default"], +) + + +@client.on_call +async def handle_call(call): + await call.answer() + + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + await call.play( + [{"type": "tts", "params": {"text": "Thanks for calling Bayview Taxi. Your flow is running."}}], + on_completed=hang_up_after_playback, + ) + await call.wait_for_ended() + + +client.run() +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as call-routing.mjs, +// then run: node call-routing.mjs +import { RelayClient } from "@signalwire/sdk"; + +const client = new RelayClient({ + project: "", + token: "", + host: ".signalwire.com", + contexts: ["default"], +}); + +client.onCall(async (call) => { + await call.answer(); + await call.play([ + { type: "tts", text: "Thanks for calling Bayview Taxi. Your flow is running." }, + ], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + await call.waitForEnded(); +}); + +await client.run(); +``` + + + +`contexts` names the topic the client listens on. The Relay Application resource you create in the +next step uses the same name, so SignalWire knows which running client gets the call. `run()` +blocks until you stop the process, reconnecting if the connection drops. + + + + +Open **Tools** > **Call Flow Builder** in the Dashboard, select **Add New**, name the flow, and +select **Save**. Open the flow's **More Options** menu and select **Edit** to reach the canvas. + +Every flow starts from the **Handle Call** node. Connect these nodes in order: + +1. [**Answer Call**](/docs/call-flow-builder/reference/answer-call). +2. [**Play Audio or TTS**][cfb-play], with the text + "Thanks for calling Bayview Taxi. Your flow is running." in its Text to Speech setting. +3. [**Hangup Call**][cfb-hangup]. + +Select **Deploy** to make this version the live one. The [versioning guide][cfb-version] explains +how deployed and draft versions relate. + + + + +### Give the flow a resource + +SignalWire routes calls to [resources][resources]. This step makes your flow one, and it is the +only place in this guide where delivery differs by surface. Every later task changes the flow's +contents, not how it reaches the call. + + + + +Choose where the document lives. + +#### Host it in your Space + + + +Name the script, paste the YAML or JSON form of the document, and save it. It appears in +**Resources** as a SWML Script. Return here to replace its contents in each later task. + +#### Serve it from your server + +Start the flow from the Server SDK sample, with credentials you choose so the URL survives a +restart: + +```bash +export SWML_BASIC_AUTH_USER="signalwire" +export SWML_BASIC_AUTH_PASSWORD="replace-with-a-long-random-password" +python call_routing.py +``` + +In a second terminal, open a tunnel to port 3000 and keep it running: + +```bash +ngrok http 3000 +``` + +Confirm the document is reachable through the tunnel: + +```bash +curl --fail \ + --user "signalwire:replace-with-a-long-random-password" \ + "https://abc123.ngrok-free.app/" \ + | python -m json.tool +``` + +A working flow returns a JSON document with `"version": "1.0.0"` and a `sections.main` array. A +`401` response means the credentials in the request differ from the ones you exported before +starting the flow. + +Then create the resource. Open the [SignalWire Dashboard](https://my.signalwire.com), select +**Script**, and then **External URL**. Set the Primary Script URL to the tunnel URL with the +credentials embedded, and select **Create**: + +```text +https://signalwire:replace-with-a-long-random-password@abc123.ngrok-free.app/ +``` + +The resource appears in **Resources**. Later tasks change `call_routing.py` and restart it; the +resource keeps pointing at the tunnel. + + + + +Start the client and leave it running: + +```bash +python call_routing.py +``` + +In the Dashboard, open **Resources**, select **+ Add New**, and choose **Relay Application**. Set +**Name** to anything you like and **Topic** to `default`, the value in the client's `contexts`, +then save. Calls to this resource reach whichever connected client listens on that topic. + + + + +A deployed Call Flow is already a resource. Open **Resources** and find it under **Call Flows**. + + + + +### Call it and listen + +Open the resource in **Resources** and select **Click-to-Test**, under the resource's name. A new +tab opens, shows "Connecting", and places a browser call to the resource. Allow microphone access +if the browser asks. + +You hear "Thanks for calling Bayview Taxi. Your flow is running." and the call ends. + +If the call connects but stays silent, the flow never ran. For a served SWML document, repeat the +`curl` request to confirm the tunnel still answers, then check that the External URL resource +carries the same URL and credentials. For a hosted script, reopen it and confirm the document +saved with a `main` section. For Relay, check that the client process is still running and that +the resource's **Topic** matches its `contexts`. **Click-to-Test** appears only on resources that +handle calls; if it is disabled, the resource has no address, so open its **Addresses** and add an +alias. + + + +## Collect speech and branch on it + +The flow now asks a question and routes on the answer. In every surface the pattern is the same: +play a prompt, wait for input, compare the result, and continue down one path. Bayview Taxi asks +callers to say "booking" or "dispatch". Speech hints tell the recognizer which words to expect, +which makes short single-word replies reliable. + +### Collect speech and branch via SWML + +Three methods do the work. [`prompt`][swml-prompt] plays the question and waits. Setting any +speech parameter, such as `speech_hints`, switches it from keypad digits to speech; the recognized +text lands in the `prompt_value` variable and the outcome in `prompt_result`. +[`switch`][swml-switch] compares a variable against case keys and runs the matching list, or +`default` when nothing matches. [`transfer`][swml-transfer] jumps to another section and does not +return. + +Replace the flow with this version. The `booking` and `dispatch` sections each speak a different +line, and `no_match` catches everything else. + + + +```python {7-25} +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as call_routing.py and run: python call_routing.py +from signalwire import SWMLService + +service = SWMLService(name="call-routing") + +service.add_verb("answer", {}) +service.add_verb( + "prompt", + { + "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "speech_hints": ["booking", "dispatch"], + }, +) +service.add_verb( + "switch", + { + "variable": "prompt_value", + "case": { + "booking": [{"transfer": {"dest": "booking"}}], + "dispatch": [{"transfer": {"dest": "dispatch"}}], + }, + "default": [{"transfer": {"dest": "no_match"}}], + }, +) + +service.add_verb_to_section("booking", "play", {"url": "say:You said booking."}) +service.add_verb_to_section("booking", "hangup", {}) + +service.add_verb_to_section("dispatch", "play", {"url": "say:You said dispatch."}) +service.add_verb_to_section("dispatch", "hangup", {}) + +service.add_verb_to_section("no_match", "play", {"url": "say:Sorry, I didn't catch that. Goodbye."}) +service.add_verb_to_section("no_match", "hangup", {}) + +if __name__ == "__main__": + service.serve() +``` + + +```typescript {8-20} +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as call-routing.mjs, +// then run: node call-routing.mjs +import { SWMLService } from "@signalwire/sdk"; + +const service = new SWMLService({ name: "call-routing" }); + +service.addVerb("answer", {}); +service.addVerb("prompt", { + play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + speech_hints: ["booking", "dispatch"], +}); +service.addVerb("switch", { + variable: "prompt_value", + case: { + booking: [{ transfer: { dest: "booking" } }], + dispatch: [{ transfer: { dest: "dispatch" } }], + }, + default: [{ transfer: { dest: "no_match" } }], +}); + +service.addVerbToSection("booking", "play", { url: "say:You said booking." }); +service.addVerbToSection("booking", "hangup", {}); + +service.addVerbToSection("dispatch", "play", { url: "say:You said dispatch." }); +service.addVerbToSection("dispatch", "hangup", {}); + +service.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); +service.addVerbToSection("no_match", "hangup", {}); + +await service.serve(); +``` + + +```yaml {5-19} +version: 1.0.0 +sections: + main: + - answer: {} + - prompt: + play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch." + speech_hints: + - booking + - dispatch + - switch: + variable: prompt_value + case: + booking: + - transfer: + dest: booking + dispatch: + - transfer: + dest: dispatch + default: + - transfer: + dest: no_match + booking: + - play: + url: "say:You said booking." + - hangup: {} + dispatch: + - play: + url: "say:You said dispatch." + - hangup: {} + no_match: + - play: + url: "say:Sorry, I didn't catch that. Goodbye." + - hangup: {} +``` + + +```json {6-20} +{ + "version": "1.0.0", + "sections": { + "main": [ + { "answer": {} }, + { + "prompt": { + "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "speech_hints": ["booking", "dispatch"] + } + }, + { + "switch": { + "variable": "prompt_value", + "case": { + "booking": [{ "transfer": { "dest": "booking" } }], + "dispatch": [{ "transfer": { "dest": "dispatch" } }] + }, + "default": [{ "transfer": { "dest": "no_match" } }] + } + } + ], + "booking": [ + { "play": { "url": "say:You said booking." } }, + { "hangup": {} } + ], + "dispatch": [ + { "play": { "url": "say:You said dispatch." } }, + { "hangup": {} } + ], + "no_match": [ + { "play": { "url": "say:Sorry, I didn't catch that. Goodbye." } }, + { "hangup": {} } + ] + } +} +``` + + + +`add_verb_to_section` creates a section on first use and appends to it after that. `switch` +compares the whole value exactly, so a case key must match the recognized text character for +character. SWML also has a `cond` method that branches on a JavaScript expression, but the Server +SDKs cannot emit it yet, so this guide uses `switch` throughout. + +Restart the served flow, or paste the new document into the hosted script, then call the resource +three times: say "booking", say "dispatch", and say nothing. You hear a different line each time. +If every call ends in `no_match`, the recognized text did not equal a case key; the tracking +section below shows what the flow heard. + +### Collect speech and branch via Relay + +[`play_and_collect`][relay-collect] plays the prompt and resolves when input arrives, times out, +or fails. The result carries a `type` of `speech`, `digit`, `no_input`, or `no_match`, and for +speech the recognized `text` with a `confidence` score. Your code compares the text and continues. + +Over the REST Calling API the same collect command runs against a call you already hold the ID +for, so the request needs the call to exist first, for example a call your Relay client or a hosted +script answered. The result arrives at `status_url` as a `calling.call.collect` event instead of a +return value. + + + +```python {14-36} +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as call_routing.py and run: python call_routing.py +from signalwire.relay import RelayClient + +client = RelayClient( + project="", + token="", + host=".signalwire.com", + contexts=["default"], +) + + +@client.on_call +async def handle_call(call): + await call.answer() + + action = await call.play_and_collect( + media=[{"type": "tts", "params": {"text": "Thanks for calling Bayview Taxi. Say booking or dispatch."}}], + collect={"speech": {"hints": ["booking", "dispatch"], "language": "en-US"}}, + ) + event = await action.wait() + result = event.params.get("result", {}) + + heard = "" + if result.get("type") == "speech": + heard = result.get("params", {}).get("text", "").lower() + + if "booking" in heard: + reply = "You said booking." + elif "dispatch" in heard: + reply = "You said dispatch." + else: + reply = "Sorry, I didn't catch that. Goodbye." + + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + await call.play( + [{"type": "tts", "params": {"text": reply}}], + on_completed=hang_up_after_playback, + ) + await call.wait_for_ended() + + +client.run() +``` + + +```typescript {13-32} +// Install: npm install @signalwire/sdk@2.0.5 +// Save as call-routing.mts and run: npx tsx call-routing.mts +import { RelayClient } from "@signalwire/sdk"; + +const client = new RelayClient({ + project: "", + token: "", + host: ".signalwire.com", + contexts: ["default"], +}); + +client.onCall(async (call) => { + await call.answer(); + + const action = await call.playAndCollect( + [{ type: "tts", text: "Thanks for calling Bayview Taxi. Say booking or dispatch." }], + { speech: { hints: ["booking", "dispatch"], language: "en-US" } }, + ); + const event = await action.wait(); + const result = (event.params.result ?? {}) as { + type?: string; + params?: { text?: string }; + }; + + const heard = result.type === "speech" ? (result.params?.text ?? "").toLowerCase() : ""; + + let reply = "Sorry, I didn't catch that. Goodbye."; + if (heard.includes("booking")) reply = "You said booking."; + else if (heard.includes("dispatch")) reply = "You said dispatch."; + + await call.play([{ type: "tts", text: reply }], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + await call.waitForEnded(); +}); + +await client.run(); +``` + + +```bash +# Runs against a call that is already answered; play the question first with calling.play. +curl --request POST "https://.signalwire.com/api/calling/calls" \ + --user ":" \ + --header "Content-Type: application/json" \ + --data '{ + "id": "", + "command": "calling.collect", + "params": { + "control_id": "route-1", + "speech": { "hints": ["booking", "dispatch"], "language": "en-US" }, + "status_url": "" + } + }' +``` + + + +Because the comparison runs in your code, you can match loosely: `"booking" in heard` accepts +"booking please" as well as "booking". Restart the client and call the resource three times to hear +the three outcomes. If the client logs an authentication error at startup, the project, token, and +Space do not belong together. + +### Collect speech and branch via Call Flow Builder + +Replace the **Play Audio or TTS** node with a [**Gather Input**][cfb-gather] node. Set its Text to +Speech to "Thanks for calling Bayview Taxi. Say booking or dispatch.", choose speech input, and add +two input options, `booking` and `dispatch`. The node grows one output connector per option, plus +**Unknown** and **No Input**. + +Connect each option to its own **Play Audio or TTS** node with the matching line, and each of +those to a **Hangup Call** node. Leave **Unknown** and **No Input** for the next task. Select +**Deploy**, then call the resource three times. + +## Handle silence and unmatched speech + +A caller who says nothing, or says something the flow did not plan for, must still get an answer. +Each surface reports the two cases separately, so the flow can say something different for each. + +### Handle silence and unmatched speech via SWML + +After `prompt`, `prompt_result` is `match_speech`, `no_input`, or `no_match`. The `default` case +already routes both failure results to `no_match`; this change makes that section say which one +happened, using a JavaScript expression inside the spoken text. Only the `no_match` section +changes. + + + +```python {1-6} +service.add_verb_to_section( + "no_match", + "play", + {"url": "say:${prompt_result == 'no_input' ? \"I didn't hear anything.\" : \"I didn't understand that.\"} Goodbye."}, +) +service.add_verb_to_section("no_match", "hangup", {}) +``` + + +```typescript {1-4} +service.addVerbToSection("no_match", "play", { + url: "say:${prompt_result == 'no_input' ? \"I didn't hear anything.\" : \"I didn't understand that.\"} Goodbye.", +}); +service.addVerbToSection("no_match", "hangup", {}); +``` + + +```yaml {3} + no_match: + - play: + url: "say:${prompt_result == 'no_input' ? \"I didn't hear anything.\" : \"I didn't understand that.\"} Goodbye." + - hangup: {} +``` + + +```json {2} + "no_match": [ + { "play": { "url": "say:${prompt_result == 'no_input' ? \"I didn't hear anything.\" : \"I didn't understand that.\"} Goodbye." } }, + { "hangup": {} } + ] +``` + + + +The wait for input before `no_input` is five seconds by default; `prompt.initial_timeout` changes +it. + +### Handle silence and unmatched speech via Relay + +The collect result's `type` is `no_input` when the caller stayed silent and `no_match` when speech +arrived but matched nothing. Replace the reply selection in the Relay sample: + + + +```python {1-8} + if "booking" in heard: + reply = "You said booking." + elif "dispatch" in heard: + reply = "You said dispatch." + elif result.get("type") == "no_input": + reply = "I didn't hear anything. Goodbye." + else: + reply = "I didn't understand that. Goodbye." +``` + + +```typescript {1-4} + let reply = "I didn't understand that. Goodbye."; + if (heard.includes("booking")) reply = "You said booking."; + else if (heard.includes("dispatch")) reply = "You said dispatch."; + else if (result.type === "no_input") reply = "I didn't hear anything. Goodbye."; +``` + + + +### Handle silence and unmatched speech via Call Flow Builder + +Connect the **Gather Input** node's **No Input** connector to a **Play Audio or TTS** node that +says "I didn't hear anything. Goodbye.", and its **Unknown** connector to one that says "I didn't +understand that. Goodbye." Connect both to a **Hangup Call** node and select **Deploy**. + +## Track what the flow heard + +Three places show what happened on the call: the Dashboard's call log, a webhook you host, and the +Relay client's own event stream. + +### See the flow's steps in the Dashboard + +Open **Logs** > **Voice** in the Dashboard and select the most recent call. The call's timeline +lists each step the flow ran in order: the call state changes, a **Play** entry for each spoken +line, and a **Collect** entry for the prompt. Select an entry to see its details. A document that +fails to load or contains an invalid method shows a **Script Warning** or **Error** entry with the +reason, so a broken flow is visible here without a support ticket. + +The timeline records that input was collected, not what the caller said. For the recognized text +itself, use one of the two paths below. + +### Receive the result via SWML + +Add a `status_url` to the `prompt` method. SignalWire sends a `calling.call.collect` event to that +URL when input arrives. The same event reaches the `status_url` on a REST Calling API `calling.collect` +command. + + + +```yaml {4} + - prompt: + play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch." + speech_hints: [booking, dispatch] + status_url: "" +``` + + +```json {5} + { + "prompt": { + "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "speech_hints": ["booking", "dispatch"], + "status_url": "" + } + } +``` + + + +The POST body for a recognized reply looks like this. `params.result.type` is `no_input` or +`no_match` for the failure cases, with no `params.result.params`. + +```json +{ + "event_type": "calling.call.collect", + "event_channel": "signalwire_calling_...", + "timestamp": 1757971200.123, + "project_id": "", + "space_id": "...", + "params": { + "call_id": "", + "node_id": "...", + "control_id": "...", + "result": { + "type": "speech", + "params": { + "text": "dispatch", + "confidence": 0.94 + } + } + } +} +``` + +The [`prompt` reference][swml-prompt] documents every field. + +### Receive the result via Relay + +The Relay client already holds the result: it is the event that `action.wait()` returned. To log +every collect event as it happens, including partial ones, register a handler on the call before +starting the prompt. The [Relay events reference][relay-events] lists the payload fields. + + + +```python {1-4} + def log_collect(event): + print("collect:", event.params.get("result")) + + call.on("calling.call.collect", log_collect) +``` + + +```typescript {1-3} + call.on("calling.call.collect", (event) => { + console.log("collect:", event.params.result); + }); +``` + + + +### Compare the surfaces + +| Surface | Where the recognized text shows up | How silence and no match are reported | +|---|---|---| +| SWML | `prompt_value` inside the document; the `status_url` webhook | `prompt_result` is `no_input` or `no_match` | +| Relay | The `result` on the event `action.wait()` returns; `call.on` handlers | `result.type` is `no_input` or `no_match` | +| REST Calling API | The `status_url` webhook only | `params.result.type` is `no_input` or `no_match` | +| Call Flow Builder | Not exposed; the flow branches on the matched option | The **No Input** and **Unknown** connectors | + +The Dashboard's call log shows the Collect step and its outcome for every surface, but never the +text. + +## Reach the same flow from any channel + +The flow you wrote does not know where the call came from. The Dashboard reached it through +**Click-to-Test**. A [phone number][phone-numbers] assigned to the same resource runs the identical +flow, and so does a SIP address, a browser call to the resource's [address][addresses], or an +outbound call you place with the [REST Calling API][create-call] and point at the resource. +Direction and channel are routing details on the resource; the flow is the same program. That is +also why delivery was a single step above: once a resource exists, every task in this guide edits +the flow and leaves the routing alone. + +## Examples + +### Accept a keypad digit as well as speech + +Some callers are in a noisy place or on a handset with no microphone to speak of. Offer keys and +words at once, and treat "press 1" and "say booking" as the same answer. + +#### Accept a keypad digit as well as speech via SWML + +Setting one digit parameter alongside the speech parameters enables both inputs. Add `max_digits` +to the prompt and the digit keys to the switch. + + + +```yaml {3,5,9-11} + - prompt: + play: "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2." + max_digits: 1 + speech_hints: [booking, dispatch] + - switch: + variable: prompt_value + case: + booking: [{ transfer: { dest: booking } }] + "1": [{ transfer: { dest: booking } }] + dispatch: [{ transfer: { dest: dispatch } }] + "2": [{ transfer: { dest: dispatch } }] + default: [{ transfer: { dest: no_match } }] +``` + + +```json {4,12-13} + { + "prompt": { + "play": "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2.", + "max_digits": 1, + "speech_hints": ["booking", "dispatch"] + } + }, + { + "switch": { + "variable": "prompt_value", + "case": { + "booking": [{ "transfer": { "dest": "booking" } }], + "1": [{ "transfer": { "dest": "booking" } }], + "dispatch": [{ "transfer": { "dest": "dispatch" } }], + "2": [{ "transfer": { "dest": "dispatch" } }] + }, + "default": [{ "transfer": { "dest": "no_match" } }] + } + } +``` + + + +In the Server SDK samples, add `"max_digits": 1` to the prompt config and the `"1"` and `"2"` keys +to the `case` object. + +#### Accept a keypad digit as well as speech via Relay + +Pass both `digits` and `speech` in the collect config, then read `params.digits` when the result +type is `digit`. + + + +```python {3,9-10} + action = await call.play_and_collect( + media=[{"type": "tts", "params": {"text": "Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2."}}], + collect={"digits": {"max": 1}, "speech": {"hints": ["booking", "dispatch"], "language": "en-US"}}, + ) + event = await action.wait() + result = event.params.get("result", {}) + + heard = "" + if result.get("type") == "digit": + heard = {"1": "booking", "2": "dispatch"}.get(result.get("params", {}).get("digits", ""), "") + elif result.get("type") == "speech": + heard = result.get("params", {}).get("text", "").lower() +``` + + +```typescript {3,10-12} + const action = await call.playAndCollect( + [{ type: "tts", text: "Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2." }], + { digits: { max: 1 }, speech: { hints: ["booking", "dispatch"], language: "en-US" } }, + ); + const event = await action.wait(); + const result = (event.params.result ?? {}) as { + type?: string; + params?: { text?: string; digits?: string }; + }; + const byKey: Record = { "1": "booking", "2": "dispatch" }; + let heard = ""; + if (result.type === "digit") heard = byKey[result.params?.digits ?? ""] ?? ""; + else if (result.type === "speech") heard = (result.params?.text ?? "").toLowerCase(); +``` + + + +#### Accept a keypad digit as well as speech via Call Flow Builder + +The **Gather Input** node accepts keypad digits and speech together. Add `1` and `2` as further +input options and connect each to the same node as its spoken twin. + +### Hand the call to a phone + +Once the flow knows what the caller wants, connect them to a person. Bayview Taxi sends dispatch +callers to Ada's desk phone. The caller hears ringing, and the flow resumes only if the connection +fails or the other side hangs up first. + + +On a [trial project][trial-mode], `` must be a number the project has purchased +or verified. + + +#### Hand the call to a phone via SWML + +Replace the spoken line in the `dispatch` section with [`connect`][swml-connect]. + + + +```yaml {4-5} + dispatch: + - play: + url: "say:Connecting you to dispatch." + - connect: + to: "" + - hangup: {} +``` + + +```json {3} + "dispatch": [ + { "play": { "url": "say:Connecting you to dispatch." } }, + { "connect": { "to": "" } }, + { "hangup": {} } + ] +``` + + + +In the Server SDK samples, add `service.add_verb_to_section("dispatch", "connect", {"to": ""})` +between the play and hangup lines, or the `addVerbToSection` equivalent. + +#### Hand the call to a phone via Relay + +[`connect`][relay-connect] takes a list of device groups; each inner list rings at once and the +outer list rings in turn. Replace the dispatch reply with a bridge to one phone. + + + +```python {1-9} + if "dispatch" in heard: + await call.play([{"type": "tts", "params": {"text": "Connecting you to dispatch."}}]) + await call.connect([[{ + "type": "phone", + "params": {"to_number": "", "from_number": "", "timeout": 30}, + }]]) + await call.wait_for_ended() + return +``` + + +```typescript {1-9} + if (heard.includes("dispatch")) { + await call.play([{ type: "tts", text: "Connecting you to dispatch." }]); + await call.connect([[{ + type: "phone", + params: { to_number: "", from_number: "", timeout: 30 }, + }]]); + await call.waitForEnded(); + return; + } +``` + + + +#### Hand the call to a phone via Call Flow Builder + +Connect the `dispatch` option to a [**Forward to Phone**][cfb-forward] node with +`` as its number, then select **Deploy**. + +### Ask again when the caller says nothing + +One retry turns a dead end into a second chance. Ask the question again after silence, then give +up. + +#### Ask again when the caller says nothing via SWML + +[`goto`][swml-goto] jumps to a label within the same section, and its `when` condition and `max` +count keep the loop bounded. Place a label before the prompt and a conditional `goto` after it. + + + +```yaml {2,6-9} + main: + - answer: {} + - label: ask + - prompt: + play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch." + speech_hints: [booking, dispatch] + - goto: + label: ask + when: "prompt_result == 'no_input'" + max: 1 + - switch: + variable: prompt_value +``` + + +```json {3,10-16} + "main": [ + { "answer": {} }, + { "label": "ask" }, + { + "prompt": { + "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "speech_hints": ["booking", "dispatch"] + } + }, + { + "goto": { + "label": "ask", + "when": "prompt_result == 'no_input'", + "max": 1 + } + }, + { + "switch": { + "variable": "prompt_value" + } + } + ] +``` + + + +The Server SDKs can emit the `goto` step but not `label`, whose value is a bare string rather +than an object, so this variation is for a hosted or hand-written document. In code, use the Relay +loop below instead. The [control flow guide][control-flow] compares `goto` with `execute` and +`transfer`. + +#### Ask again when the caller says nothing via Relay + +Wrap the prompt in a loop that exits on the first reply. + + + +```python {1-10} + result = {} + for _attempt in range(2): + action = await call.play_and_collect( + media=[{"type": "tts", "params": {"text": "Thanks for calling Bayview Taxi. Say booking or dispatch."}}], + collect={"speech": {"hints": ["booking", "dispatch"], "language": "en-US"}}, + ) + event = await action.wait() + result = event.params.get("result", {}) + if result.get("type") != "no_input": + break +``` + + +```typescript {1-10} + let result: { type?: string; params?: { text?: string } } = {}; + for (let attempt = 0; attempt < 2; attempt++) { + const action = await call.playAndCollect( + [{ type: "tts", text: "Thanks for calling Bayview Taxi. Say booking or dispatch." }], + { speech: { hints: ["booking", "dispatch"], language: "en-US" } }, + ); + const event = await action.wait(); + result = (event.params.result ?? {}) as typeof result; + if (result.type !== "no_input") break; + } +``` + + + +## Next steps + + + + + Place the call yourself, then run this flow on the far end once the destination answers. + + + + A recorded, multi-department menu in hosted SWML that connects each branch to a real number. + + + + Serve a different document per call, add routing callbacks, and secure the endpoint for + production. + + + + Every node the visual editor offers, including request, recording, and AI agent nodes. + + + diff --git a/fern/products/platform/pages/calling/voice/overview.mdx b/fern/products/platform/pages/calling/voice/overview.mdx index 0a4e0460da..bc8f2574c0 100644 --- a/fern/products/platform/pages/calling/voice/overview.mdx +++ b/fern/products/platform/pages/calling/voice/overview.mdx @@ -18,8 +18,8 @@ Whether building a UCaaS solution, modernizing a legacy IVR, augmenting CX with Build one agent, call it over a phone number, and send it a text turn through the AI Chat API - - Write a call flow that answers, listens, and branches on what the caller says + + Answer a call, collect what the caller says, and branch on it with SWML, Relay, or Call Flow Builder Dial from your backend or the browser, and choose what runs when someone answers diff --git a/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx b/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx deleted file mode 100644 index 74280aaed8..0000000000 --- a/fern/products/platform/pages/calling/voice/route-and-control-calls.mdx +++ /dev/null @@ -1,405 +0,0 @@ ---- -title: Route and control calls -slug: /voice/route-and-control-calls -description: Write a call flow that answers, asks the caller a question, and branches on what they say, then run it from the Dashboard and read the result in the call log. -position: 1 -max-toc-depth: 3 ---- - -[addresses]: /docs/platform/addresses -[create-call]: /docs/apis/rest/calls/call-commands -[phone-numbers]: /docs/platform/phone-numbers -[resources]: /docs/platform/resources -[server-sdks]: /docs/server-sdks -[swml-prompt]: /docs/swml/reference/calling/prompt -[swml-switch]: /docs/swml/reference/calling/switch -[swml-transfer]: /docs/swml/reference/calling/transfer - -A call flow is a document that tells SignalWire what to do with a live call: answer it, play a -message, listen for a reply, and decide what happens next. In this guide you write one, call it from -the Dashboard, say something out loud, and hear the flow respond to what you said. - -The flow runs as SignalWire Markup Language (SWML). You can write that document by hand as JSON or -YAML, or have the Server SDK generate it from Python. Both paths produce the same document, and -SignalWire runs it the same way. - -Before you start, you need: - -- A [SignalWire account](https://signalwire.com/signup) -- For the Server SDK path, Python 3 and [ngrok](https://ngrok.com/download) installed locally - -No phone number and no API token are required. The Dashboard can call a flow directly. - ---- - - - -### Write a flow that answers and speaks - -Start with the smallest flow that does something audible. Choose one authoring path. - - - - - - This guide uses Python. The [Server SDK documentation][server-sdks] covers the TypeScript SDK as - well. - - -#### Install the Server SDK - -```bash -python3 -m pip install signalwire-sdk -``` - -#### Write the flow - -Create `route_calls.py`: - -```python title="route_calls.py" -from signalwire import SWMLService - -service = SWMLService(name="route-calls") - -service.add_verb("answer", {}) -service.add_verb("play", {"url": "say:Thanks for calling. Your flow is running."}) -service.add_verb("hangup", {}) - - -if __name__ == "__main__": - service.serve() -``` - -`SWMLService` builds a SWML document and serves it over HTTP. Each `add_verb` call appends one -instruction to the document's `main` section, and `serve()` starts a web server on port `3000` -that returns the document when SignalWire requests it. - -#### Give the flow a public URL - -In a second terminal, start ngrok: - -```bash -ngrok http 3000 -``` - -Copy the HTTPS forwarding URL, such as `https://abc123.ngrok-free.app`, and keep ngrok running. - -#### Start the flow with stable credentials - -The service protects its URL with Basic Auth. Set the credentials yourself so they survive a -restart, then start the flow in the first terminal: - -```bash -export SWML_BASIC_AUTH_USER="signalwire" -export SWML_BASIC_AUTH_PASSWORD="replace-with-a-long-random-password" -python3 route_calls.py -``` - -#### Verify the generated SWML - -From another terminal, request the document through the tunnel: - -```bash -curl --fail \ - --user "signalwire:replace-with-a-long-random-password" \ - "https://abc123.ngrok-free.app/" \ - | python3 -m json.tool -``` - -A working flow returns a JSON document with `"version": "1.0.0"` and a `sections.main` array -holding `answer`, `play`, and `hangup`. A `401` response means the credentials in the request don't -match the ones you exported before starting the flow. - -#### Create an External URL resource - -SignalWire needs a resource to call. Open the [SignalWire Dashboard](https://my.signalwire.com), -select **Script**, and then select **External URL**. Set the Primary Script URL to the tunnel URL -with the credentials embedded: - -```text -https://signalwire:replace-with-a-long-random-password@abc123.ngrok-free.app/ -``` - -Select **Create**. The resource appears in **Resources**. - - - - -#### Create a SWML Script resource - - - -Give the script a name and paste this document into the editor: - - - -```yaml -version: 1.0.0 -sections: - main: - - answer: {} - - play: - url: "say:Thanks for calling. Your flow is running." - - hangup: {} -``` - - -```json -{ - "version": "1.0.0", - "sections": { - "main": [ - { "answer": {} }, - { "play": { "url": "say:Thanks for calling. Your flow is running." } }, - { "hangup": {} } - ] - } -} -``` - - - -Save the script. It appears in **Resources**. - -Execution starts at the `main` section, which every document must have. Each section is an -ordered list of methods, and later in this guide you add more sections and jump between them. -`answer` picks up the call, `play` speaks the text after the `say:` prefix, and `hangup` ends the -call. - - - - -### Call the flow - -Open the resource in **Resources** and select **Click-to-Test**, under the resource's name. A new -tab opens, shows "Connecting", and places a browser call to the resource. Allow microphone access -if the browser asks. - -You hear "Thanks for calling. Your flow is running." and the call ends. - -**Click-to-Test** appears only on resources that handle calls. If it is disabled, the resource has -no address to dial: open its **Addresses** and add an alias address. - -If the call connects but stays silent, the flow never ran. On the Server SDK path, repeat the -`curl` request to confirm the tunnel still answers, then check that the External URL resource -carries the same URL and credentials. On the SWML path, reopen the script and check that the -document saved with a `main` section. - -To reach the same flow from a phone instead, assign one of your [phone numbers][phone-numbers] to -the resource under **Inbound Call Settings** and dial it. - -### Listen and branch on what the caller says - -Now make the flow ask a question and route on the answer. Three methods do the work: - -- [`prompt`][swml-prompt] plays a question and waits for input. Setting `speech_hints` switches it - from keypad digits to speech and lists the words you expect to hear. When the caller - speaks, `prompt` stores the recognized text in the `prompt_value` variable and the outcome in - `prompt_result`. -- [`switch`][swml-switch] compares a variable against a set of cases and runs the matching one. - The `default` case runs for anything else, including silence and unrecognized speech. -- [`transfer`][swml-transfer] jumps to another section of the document and does not return. - -Replace the flow with this version. The `sales` and `support` sections each speak a different -message, and `no_match` handles a caller who says nothing or something the flow doesn't expect. - - - - -Replace `route_calls.py`: - -```python title="route_calls.py" -from signalwire import SWMLService - -service = SWMLService(name="route-calls") - -service.add_verb("answer", {}) -service.add_verb( - "prompt", - { - "play": "say:Thanks for calling. Say sales or support.", - "speech_hints": ["sales", "support"], - }, -) -service.add_verb( - "switch", - { - "variable": "prompt_value", - "case": { - "sales": [{"transfer": {"dest": "sales"}}], - "support": [{"transfer": {"dest": "support"}}], - }, - "default": [{"transfer": {"dest": "no_match"}}], - }, -) - -service.add_verb_to_section("sales", "play", {"url": "say:You said sales."}) -service.add_verb_to_section("sales", "hangup", {}) - -service.add_verb_to_section("support", "play", {"url": "say:You said support."}) -service.add_verb_to_section("support", "hangup", {}) - -service.add_verb_to_section("no_match", "play", {"url": "say:Sorry, I didn't catch that. Goodbye."}) -service.add_verb_to_section("no_match", "hangup", {}) - - -if __name__ == "__main__": - service.serve() -``` - -`add_verb_to_section` creates the named section on first use and appends to it after that. The -SDK validates every verb against the SWML schema as you add it, so a misspelled parameter raises -an error at startup instead of failing on a live call. - -Restart the flow with the same credentials, then request the document again with `curl`. The -`sections` object now holds `main`, `sales`, `support`, and `no_match`. The External URL resource -already points at the tunnel, so there is nothing to change in the Dashboard. - - - - -Open the script in **Resources** and replace its contents: - - - -```yaml -version: 1.0.0 -sections: - main: - - answer: {} - - prompt: - play: "say:Thanks for calling. Say sales or support." - speech_hints: - - sales - - support - - switch: - variable: prompt_value - case: - sales: - - transfer: - dest: sales - support: - - transfer: - dest: support - default: - - transfer: - dest: no_match - sales: - - play: - url: "say:You said sales." - - hangup: {} - support: - - play: - url: "say:You said support." - - hangup: {} - no_match: - - play: - url: "say:Sorry, I didn't catch that. Goodbye." - - hangup: {} -``` - - -```json -{ - "version": "1.0.0", - "sections": { - "main": [ - { "answer": {} }, - { - "prompt": { - "play": "say:Thanks for calling. Say sales or support.", - "speech_hints": ["sales", "support"] - } - }, - { - "switch": { - "variable": "prompt_value", - "case": { - "sales": [{ "transfer": { "dest": "sales" } }], - "support": [{ "transfer": { "dest": "support" } }] - }, - "default": [{ "transfer": { "dest": "no_match" } }] - } - } - ], - "sales": [ - { "play": { "url": "say:You said sales." } }, - { "hangup": {} } - ], - "support": [ - { "play": { "url": "say:You said support." } }, - { "hangup": {} } - ], - "no_match": [ - { "play": { "url": "say:Sorry, I didn't catch that. Goodbye." } }, - { "hangup": {} } - ] - } -} -``` - - - -Save the script. The next call picks up the new document. - - - - -### Call it three times - -Call the resource again and say "sales". The flow answers "You said sales." Call once more and say -"support" to hear the other branch. On a third call, say nothing: after the input timeout the flow -says "Sorry, I didn't catch that" and hangs up. The default wait for input is five seconds. - -If every call lands in `no_match`, the recognized text didn't equal a case key. `switch` compares -the whole value exactly, so check the keys for capital letters and stray spaces. The next step -shows you what the flow heard. - -### Read the call log - -Open **Logs** > **Voice** in the Dashboard and select the most recent call. The call's timeline -lists each step the flow ran in order: the call state changes, a **Play** entry for each message, -and a **Collect** entry for the `prompt`. Select an entry to see its details. A flow that fails -to load or contains an invalid method shows a **Script Warning** or **Error** entry with the -reason, so a broken document is visible here without a support ticket. - -The timeline records that input was collected, not what the caller said. To receive the -recognized speech itself, add a `status_url` to the `prompt` method. -SignalWire sends a `calling.call.collect` event to that URL when input arrives. The payload's -`params.result.type` is `speech`, `no_input`, or `no_match`, and for speech the recognized text is -included with its confidence score. The [`prompt` reference][swml-prompt] documents every field. - - - -## One flow, any channel - -The document you wrote doesn't know where the call came from. The Dashboard reached it through -click-to-call. A [phone number][phone-numbers] assigned to the same resource runs the identical -document, and so does a SIP address, a browser call to the resource's [address][addresses], or an -outbound call you place with the [REST API][create-call]. Direction and channel are routing -details on the [resource][resources]. The flow is the same program. - -## Next steps - - - - - Loop back to the question with `goto` and labels, call sections like functions with `execute`, - and see how `transfer` differs from both. - - - - Accept keypad digits alongside speech, record the call, and connect each branch to a real - phone number. - - - - Serve a different document per call, add routing callbacks, and secure the endpoint for - production. - - - - Buy a number, assign it to the flow, and dial it from your own phone. - - - From 55259594eb888f1d5530401a5a5756062ca42bfa Mon Sep 17 00:00:00 2001 From: August Date: Fri, 9 Oct 2026 14:55:21 +0000 Subject: [PATCH 04/12] docs(voice): complete call routing examples and add collect lifecycle diagrams --- .../img/collect-relay-lifecycle-themed.svg | 99 +++ .../img/collect-webhook-lifecycle-themed.svg | 91 +++ .../pages/calling/voice/call-routing.mdx | 743 ++++++++++++++++-- 3 files changed, 854 insertions(+), 79 deletions(-) create mode 100644 fern/assets/images/img/collect-relay-lifecycle-themed.svg create mode 100644 fern/assets/images/img/collect-webhook-lifecycle-themed.svg diff --git a/fern/assets/images/img/collect-relay-lifecycle-themed.svg b/fern/assets/images/img/collect-relay-lifecycle-themed.svg new file mode 100644 index 0000000000..6971eb930f --- /dev/null +++ b/fern/assets/images/img/collect-relay-lifecycle-themed.svg @@ -0,0 +1,99 @@ + + Collect result delivered to your Relay client over the WebSocket + The caller dials the resource. SignalWire hands the call to your Relay client on the default topic. Your client answers and sends play_and_collect. SignalWire plays the prompt and the caller says dispatch. SignalWire sends your client a calling.call.collect event with result type speech and the text. wait() returns and your code picks the branch, then plays the reply and hangs up. + + + + + + + + + + + + + + Caller + + + + + + SignalWire + + + + + + Your Relay client + + + calls + the resource address + + + call arrives + on topic default + + + + answer + play_and_collect + + + + prompt plays + say booking or dispatch + + + speaks + "dispatch" + + + + calling.call.collect + type speech, text + + + + wait() returns + your code branches + + + play reply + then hangup + + + diff --git a/fern/assets/images/img/collect-webhook-lifecycle-themed.svg b/fern/assets/images/img/collect-webhook-lifecycle-themed.svg new file mode 100644 index 0000000000..5c636eb1fa --- /dev/null +++ b/fern/assets/images/img/collect-webhook-lifecycle-themed.svg @@ -0,0 +1,91 @@ + + Collect result delivered to your server as a webhook + SignalWire plays the prompt to the caller. The caller says dispatch. SignalWire stores dispatch in prompt_value and switch runs the dispatch branch. SignalWire posts a calling.call.collect event to your status_url with result type speech, the text, and a confidence score. Your server returns 200 OK. The dispatch branch plays to the caller. + + + + + + + + + + + + + + Caller + + + + + + SignalWire + + + + + + Your server + + + prompt plays + say booking or dispatch + + + + speaks + "dispatch" + + + + + prompt_value: dispatch + switch runs the dispatch branch + + + calling.call.collect + POST to status_url + speech, text, confidence + + + 200 OK + + + + branch plays + You said dispatch + + + diff --git a/fern/products/platform/pages/calling/voice/call-routing.mdx b/fern/products/platform/pages/calling/voice/call-routing.mdx index 5bc689fcd7..1615bd7cdb 100644 --- a/fern/products/platform/pages/calling/voice/call-routing.mdx +++ b/fern/products/platform/pages/calling/voice/call-routing.mdx @@ -388,7 +388,7 @@ line, and `no_match` catches everything else. -```python {7-25} +```python # Install: python -m pip install signalwire-sdk==3.4.1 # Save as call_routing.py and run: python call_routing.py from signalwire import SWMLService @@ -429,7 +429,7 @@ if __name__ == "__main__": ``` -```typescript {8-20} +```typescript // Install: npm install @signalwire/sdk@2.0.5 // This sample also runs as JavaScript: save as call-routing.mjs, // then run: node call-routing.mjs @@ -464,7 +464,7 @@ await service.serve(); ``` -```yaml {5-19} +```yaml version: 1.0.0 sections: main: @@ -501,7 +501,7 @@ sections: ``` -```json {6-20} +```json { "version": "1.0.0", "sections": { @@ -565,7 +565,7 @@ return value. -```python {14-36} +```python # Install: python -m pip install signalwire-sdk==3.4.1 # Save as call_routing.py and run: python call_routing.py from signalwire.relay import RelayClient @@ -615,7 +615,7 @@ client.run() ``` -```typescript {13-32} +```typescript // Install: npm install @signalwire/sdk@2.0.5 // Save as call-routing.mts and run: npx tsx call-routing.mts import { RelayClient } from "@signalwire/sdk"; @@ -849,6 +849,30 @@ The POST body for a recognized reply looks like this. `params.result.type` is `n The [`prompt` reference][swml-prompt] documents every field. + + +SignalWire plays the prompt to the caller. The caller says dispatch. SignalWire stores dispatch in prompt_value and switch runs the dispatch branch. SignalWire posts a calling.call.collect event to your status_url with result type speech, the text, and a confidence score. Your server returns 200 OK. The dispatch branch plays to the caller. + + + + + +```mermaid +sequenceDiagram + participant Caller + participant SW as SignalWire + participant Srv as Your server + + SW->>Caller: prompt plays: say booking or dispatch + Caller->>SW: says "dispatch" + Note over SW: prompt_value is dispatch, switch runs the dispatch branch + SW->>Srv: POST status_url: calling.call.collect, type speech, text, confidence + Srv-->>SW: 200 OK + SW->>Caller: dispatch branch plays +``` + + + ### Receive the result via Relay The Relay client already holds the result: it is the event that `action.wait()` returned. To log @@ -873,6 +897,32 @@ starting the prompt. The [Relay events reference][relay-events] lists the payloa + + +The caller dials the resource. SignalWire hands the call to your Relay client on the default topic. Your client answers and sends play_and_collect. SignalWire plays the prompt and the caller says dispatch. SignalWire sends your client a calling.call.collect event with result type speech and the text. wait() returns and your code picks the branch, then plays the reply and hangs up. + + + + + +```mermaid +sequenceDiagram + participant Caller + participant SW as SignalWire + participant App as Your Relay client + + Caller->>SW: calls the resource address + SW->>App: call arrives on topic default + App->>SW: answer, play_and_collect + SW->>Caller: prompt plays: say booking or dispatch + Caller->>SW: says "dispatch" + SW-->>App: calling.call.collect: type speech, text + Note over App: wait() returns, your code branches + App->>SW: play reply, then hangup +``` + + + ### Compare the surfaces | Surface | Where the recognized text shows up | How silence and no match are reported | @@ -904,28 +954,143 @@ words at once, and treat "press 1" and "say booking" as the same answer. #### Accept a keypad digit as well as speech via SWML -Setting one digit parameter alongside the speech parameters enables both inputs. Add `max_digits` -to the prompt and the digit keys to the switch. +Setting one digit parameter alongside the speech parameters enables both inputs. `max_digits` +joins the prompt, and the digit keys join the switch. + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as call_routing.py and run: python call_routing.py +from signalwire import SWMLService + +service = SWMLService(name="call-routing") + +service.add_verb("answer", {}) +service.add_verb( + "prompt", + { + "play": "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2.", + "max_digits": 1, + "speech_hints": ["booking", "dispatch"], + }, +) +service.add_verb( + "switch", + { + "variable": "prompt_value", + "case": { + "booking": [{"transfer": {"dest": "booking"}}], + "1": [{"transfer": {"dest": "booking"}}], + "dispatch": [{"transfer": {"dest": "dispatch"}}], + "2": [{"transfer": {"dest": "dispatch"}}], + }, + "default": [{"transfer": {"dest": "no_match"}}], + }, +) + +service.add_verb_to_section("booking", "play", {"url": "say:You said booking."}) +service.add_verb_to_section("booking", "hangup", {}) + +service.add_verb_to_section("dispatch", "play", {"url": "say:You said dispatch."}) +service.add_verb_to_section("dispatch", "hangup", {}) + +service.add_verb_to_section("no_match", "play", {"url": "say:Sorry, I didn't catch that. Goodbye."}) +service.add_verb_to_section("no_match", "hangup", {}) + +if __name__ == "__main__": + service.serve() +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as call-routing.mjs, +// then run: node call-routing.mjs +import { SWMLService } from "@signalwire/sdk"; + +const service = new SWMLService({ name: "call-routing" }); + +service.addVerb("answer", {}); +service.addVerb("prompt", { + play: "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2.", + max_digits: 1, + speech_hints: ["booking", "dispatch"], +}); +service.addVerb("switch", { + variable: "prompt_value", + case: { + booking: [{ transfer: { dest: "booking" } }], + "1": [{ transfer: { dest: "booking" } }], + dispatch: [{ transfer: { dest: "dispatch" } }], + "2": [{ transfer: { dest: "dispatch" } }], + }, + default: [{ transfer: { dest: "no_match" } }], +}); + +service.addVerbToSection("booking", "play", { url: "say:You said booking." }); +service.addVerbToSection("booking", "hangup", {}); + +service.addVerbToSection("dispatch", "play", { url: "say:You said dispatch." }); +service.addVerbToSection("dispatch", "hangup", {}); + +service.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); +service.addVerbToSection("no_match", "hangup", {}); + +await service.serve(); +``` + -```yaml {3,5,9-11} +```yaml +version: 1.0.0 +sections: + main: + - answer: {} - prompt: play: "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2." max_digits: 1 - speech_hints: [booking, dispatch] + speech_hints: + - booking + - dispatch - switch: variable: prompt_value case: - booking: [{ transfer: { dest: booking } }] - "1": [{ transfer: { dest: booking } }] - dispatch: [{ transfer: { dest: dispatch } }] - "2": [{ transfer: { dest: dispatch } }] - default: [{ transfer: { dest: no_match } }] + booking: + - transfer: + dest: booking + "1": + - transfer: + dest: booking + dispatch: + - transfer: + dest: dispatch + "2": + - transfer: + dest: dispatch + default: + - transfer: + dest: no_match + booking: + - play: + url: "say:You said booking." + - hangup: {} + dispatch: + - play: + url: "say:You said dispatch." + - hangup: {} + no_match: + - play: + url: "say:Sorry, I didn't catch that. Goodbye." + - hangup: {} ``` -```json {4,12-13} +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { "answer": {} }, { "prompt": { "play": "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2.", @@ -945,21 +1110,51 @@ to the prompt and the digit keys to the switch. "default": [{ "transfer": { "dest": "no_match" } }] } } + ], + "booking": [ + { "play": { "url": "say:You said booking." } }, + { "hangup": {} } + ], + "dispatch": [ + { "play": { "url": "say:You said dispatch." } }, + { "hangup": {} } + ], + "no_match": [ + { "play": { "url": "say:Sorry, I didn't catch that. Goodbye." } }, + { "hangup": {} } + ] + } +} ``` -In the Server SDK samples, add `"max_digits": 1` to the prompt config and the `"1"` and `"2"` keys -to the `case` object. - #### Accept a keypad digit as well as speech via Relay -Pass both `digits` and `speech` in the collect config, then read `params.digits` when the result -type is `digit`. +Pass both `digits` and `speech` in the collect config. A keypad reply comes back with type +`digit` and the pressed key in `params.digits`, so the code maps keys to the same words. -```python {3,9-10} +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as call_routing.py and run: python call_routing.py +from signalwire.relay import RelayClient + +client = RelayClient( + project="", + token="", + host=".signalwire.com", + contexts=["default"], +) + +BY_KEY = {"1": "booking", "2": "dispatch"} + + +@client.on_call +async def handle_call(call): + await call.answer() + action = await call.play_and_collect( media=[{"type": "tts", "params": {"text": "Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2."}}], collect={"digits": {"max": 1}, "speech": {"hints": ["booking", "dispatch"], "language": "en-US"}}, @@ -969,13 +1164,49 @@ type is `digit`. heard = "" if result.get("type") == "digit": - heard = {"1": "booking", "2": "dispatch"}.get(result.get("params", {}).get("digits", ""), "") + heard = BY_KEY.get(result.get("params", {}).get("digits", ""), "") elif result.get("type") == "speech": heard = result.get("params", {}).get("text", "").lower() + + if "booking" in heard: + reply = "You said booking." + elif "dispatch" in heard: + reply = "You said dispatch." + else: + reply = "Sorry, I didn't catch that. Goodbye." + + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + await call.play( + [{"type": "tts", "params": {"text": reply}}], + on_completed=hang_up_after_playback, + ) + await call.wait_for_ended() + + +client.run() ``` -```typescript {3,10-12} +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// Save as call-routing.mts and run: npx tsx call-routing.mts +import { RelayClient } from "@signalwire/sdk"; + +const client = new RelayClient({ + project: "", + token: "", + host: ".signalwire.com", + contexts: ["default"], +}); + +const byKey: Record = { "1": "booking", "2": "dispatch" }; + +client.onCall(async (call) => { + await call.answer(); + const action = await call.playAndCollect( [{ type: "tts", text: "Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2." }], { digits: { max: 1 }, speech: { hints: ["booking", "dispatch"], language: "en-US" } }, @@ -985,10 +1216,24 @@ type is `digit`. type?: string; params?: { text?: string; digits?: string }; }; - const byKey: Record = { "1": "booking", "2": "dispatch" }; + let heard = ""; if (result.type === "digit") heard = byKey[result.params?.digits ?? ""] ?? ""; else if (result.type === "speech") heard = (result.params?.text ?? "").toLowerCase(); + + let reply = "Sorry, I didn't catch that. Goodbye."; + if (heard.includes("booking")) reply = "You said booking."; + else if (heard.includes("dispatch")) reply = "You said dispatch."; + + await call.play([{ type: "tts", text: reply }], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + await call.waitForEnded(); +}); + +await client.run(); ``` @@ -1011,55 +1256,262 @@ or verified. #### Hand the call to a phone via SWML -Replace the spoken line in the `dispatch` section with [`connect`][swml-connect]. +The `dispatch` section announces the hand-off, then [`connect`][swml-connect] dials the +destination. The caller's own number is presented as caller ID unless you set `from`. - -```yaml {4-5} - dispatch: - - play: - url: "say:Connecting you to dispatch." - - connect: - to: "" - - hangup: {} -``` - - -```json {3} - "dispatch": [ - { "play": { "url": "say:Connecting you to dispatch." } }, - { "connect": { "to": "" } }, - { "hangup": {} } - ] -``` - - - -In the Server SDK samples, add `service.add_verb_to_section("dispatch", "connect", {"to": ""})` -between the play and hangup lines, or the `addVerbToSection` equivalent. - -#### Hand the call to a phone via Relay + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as call_routing.py and run: python call_routing.py +from signalwire import SWMLService -[`connect`][relay-connect] takes a list of device groups; each inner list rings at once and the -outer list rings in turn. Replace the dispatch reply with a bridge to one phone. +service = SWMLService(name="call-routing") - - -```python {1-9} - if "dispatch" in heard: - await call.play([{"type": "tts", "params": {"text": "Connecting you to dispatch."}}]) - await call.connect([[{ - "type": "phone", - "params": {"to_number": "", "from_number": "", "timeout": 30}, - }]]) +service.add_verb("answer", {}) +service.add_verb( + "prompt", + { + "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "speech_hints": ["booking", "dispatch"], + }, +) +service.add_verb( + "switch", + { + "variable": "prompt_value", + "case": { + "booking": [{"transfer": {"dest": "booking"}}], + "dispatch": [{"transfer": {"dest": "dispatch"}}], + }, + "default": [{"transfer": {"dest": "no_match"}}], + }, +) + +service.add_verb_to_section("booking", "play", {"url": "say:You said booking."}) +service.add_verb_to_section("booking", "hangup", {}) + +service.add_verb_to_section("dispatch", "play", {"url": "say:Connecting you to dispatch."}) +service.add_verb_to_section("dispatch", "connect", {"to": ""}) +service.add_verb_to_section("dispatch", "hangup", {}) + +service.add_verb_to_section("no_match", "play", {"url": "say:Sorry, I didn't catch that. Goodbye."}) +service.add_verb_to_section("no_match", "hangup", {}) + +if __name__ == "__main__": + service.serve() +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as call-routing.mjs, +// then run: node call-routing.mjs +import { SWMLService } from "@signalwire/sdk"; + +const service = new SWMLService({ name: "call-routing" }); + +service.addVerb("answer", {}); +service.addVerb("prompt", { + play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + speech_hints: ["booking", "dispatch"], +}); +service.addVerb("switch", { + variable: "prompt_value", + case: { + booking: [{ transfer: { dest: "booking" } }], + dispatch: [{ transfer: { dest: "dispatch" } }], + }, + default: [{ transfer: { dest: "no_match" } }], +}); + +service.addVerbToSection("booking", "play", { url: "say:You said booking." }); +service.addVerbToSection("booking", "hangup", {}); + +service.addVerbToSection("dispatch", "play", { url: "say:Connecting you to dispatch." }); +service.addVerbToSection("dispatch", "connect", { to: "" }); +service.addVerbToSection("dispatch", "hangup", {}); + +service.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); +service.addVerbToSection("no_match", "hangup", {}); + +await service.serve(); +``` + + +```yaml +version: 1.0.0 +sections: + main: + - answer: {} + - prompt: + play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch." + speech_hints: + - booking + - dispatch + - switch: + variable: prompt_value + case: + booking: + - transfer: + dest: booking + dispatch: + - transfer: + dest: dispatch + default: + - transfer: + dest: no_match + booking: + - play: + url: "say:You said booking." + - hangup: {} + dispatch: + - play: + url: "say:Connecting you to dispatch." + - connect: + to: "" + - hangup: {} + no_match: + - play: + url: "say:Sorry, I didn't catch that. Goodbye." + - hangup: {} +``` + + +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { "answer": {} }, + { + "prompt": { + "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "speech_hints": ["booking", "dispatch"] + } + }, + { + "switch": { + "variable": "prompt_value", + "case": { + "booking": [{ "transfer": { "dest": "booking" } }], + "dispatch": [{ "transfer": { "dest": "dispatch" } }] + }, + "default": [{ "transfer": { "dest": "no_match" } }] + } + } + ], + "booking": [ + { "play": { "url": "say:You said booking." } }, + { "hangup": {} } + ], + "dispatch": [ + { "play": { "url": "say:Connecting you to dispatch." } }, + { "connect": { "to": "" } }, + { "hangup": {} } + ], + "no_match": [ + { "play": { "url": "say:Sorry, I didn't catch that. Goodbye." } }, + { "hangup": {} } + ] + } +} +``` + + + +#### Hand the call to a phone via Relay + +[`connect`][relay-connect] takes a list of device groups; each inner list rings at once and the +outer list rings in turn. The dispatch branch bridges to one phone and then waits for the call to +end. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as call_routing.py and run: python call_routing.py +from signalwire.relay import RelayClient + +client = RelayClient( + project="", + token="", + host=".signalwire.com", + contexts=["default"], +) + + +@client.on_call +async def handle_call(call): + await call.answer() + + action = await call.play_and_collect( + media=[{"type": "tts", "params": {"text": "Thanks for calling Bayview Taxi. Say booking or dispatch."}}], + collect={"speech": {"hints": ["booking", "dispatch"], "language": "en-US"}}, + ) + event = await action.wait() + result = event.params.get("result", {}) + + heard = "" + if result.get("type") == "speech": + heard = result.get("params", {}).get("text", "").lower() + + if "dispatch" in heard: + announce = await call.play([{"type": "tts", "params": {"text": "Connecting you to dispatch."}}]) + await announce.wait() + await call.connect([[{ + "type": "phone", + "params": {"to_number": "", "from_number": "", "timeout": 30}, + }]]) await call.wait_for_ended() return + + reply = "You said booking." if "booking" in heard else "Sorry, I didn't catch that. Goodbye." + + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + await call.play( + [{"type": "tts", "params": {"text": reply}}], + on_completed=hang_up_after_playback, + ) + await call.wait_for_ended() + + +client.run() ``` -```typescript {1-9} +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// Save as call-routing.mts and run: npx tsx call-routing.mts +import { RelayClient } from "@signalwire/sdk"; + +const client = new RelayClient({ + project: "", + token: "", + host: ".signalwire.com", + contexts: ["default"], +}); + +client.onCall(async (call) => { + await call.answer(); + + const action = await call.playAndCollect( + [{ type: "tts", text: "Thanks for calling Bayview Taxi. Say booking or dispatch." }], + { speech: { hints: ["booking", "dispatch"], language: "en-US" } }, + ); + const event = await action.wait(); + const result = (event.params.result ?? {}) as { + type?: string; + params?: { text?: string }; + }; + const heard = result.type === "speech" ? (result.params?.text ?? "").toLowerCase() : ""; + if (heard.includes("dispatch")) { - await call.play([{ type: "tts", text: "Connecting you to dispatch." }]); + const announce = await call.play([{ type: "tts", text: "Connecting you to dispatch." }]); + await announce.wait(); await call.connect([[{ type: "phone", params: { to_number: "", from_number: "", timeout: 30 }, @@ -1067,6 +1519,17 @@ outer list rings in turn. Replace the dispatch reply with a bridge to one phone. await call.waitForEnded(); return; } + + const reply = heard.includes("booking") ? "You said booking." : "Sorry, I didn't catch that. Goodbye."; + await call.play([{ type: "tts", text: reply }], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + await call.waitForEnded(); +}); + +await client.run(); ``` @@ -1084,27 +1547,59 @@ up. #### Ask again when the caller says nothing via SWML [`goto`][swml-goto] jumps to a label within the same section, and its `when` condition and `max` -count keep the loop bounded. Place a label before the prompt and a conditional `goto` after it. +count keep the loop bounded. A `label` before the prompt and a conditional `goto` after it repeat +the question once. The Server SDKs can emit the `goto` step but not `label`, whose value is a bare +string rather than an object, so this variation is for a hosted or hand-written document. The +[control flow guide][control-flow] compares `goto` with `execute` and `transfer`. -```yaml {2,6-9} +```yaml +version: 1.0.0 +sections: main: - answer: {} - label: ask - prompt: play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch." - speech_hints: [booking, dispatch] + speech_hints: + - booking + - dispatch - goto: label: ask when: "prompt_result == 'no_input'" max: 1 - switch: variable: prompt_value + case: + booking: + - transfer: + dest: booking + dispatch: + - transfer: + dest: dispatch + default: + - transfer: + dest: no_match + booking: + - play: + url: "say:You said booking." + - hangup: {} + dispatch: + - play: + url: "say:You said dispatch." + - hangup: {} + no_match: + - play: + url: "say:Sorry, I didn't catch that. Goodbye." + - hangup: {} ``` -```json {3,10-16} +```json +{ + "version": "1.0.0", + "sections": { "main": [ { "answer": {} }, { "label": "ask" }, @@ -1123,26 +1618,57 @@ count keep the loop bounded. Place a label before the prompt and a conditional ` }, { "switch": { - "variable": "prompt_value" + "variable": "prompt_value", + "case": { + "booking": [{ "transfer": { "dest": "booking" } }], + "dispatch": [{ "transfer": { "dest": "dispatch" } }] + }, + "default": [{ "transfer": { "dest": "no_match" } }] } } + ], + "booking": [ + { "play": { "url": "say:You said booking." } }, + { "hangup": {} } + ], + "dispatch": [ + { "play": { "url": "say:You said dispatch." } }, + { "hangup": {} } + ], + "no_match": [ + { "play": { "url": "say:Sorry, I didn't catch that. Goodbye." } }, + { "hangup": {} } ] + } +} ``` -The Server SDKs can emit the `goto` step but not `label`, whose value is a bare string rather -than an object, so this variation is for a hosted or hand-written document. In code, use the Relay -loop below instead. The [control flow guide][control-flow] compares `goto` with `execute` and -`transfer`. - #### Ask again when the caller says nothing via Relay -Wrap the prompt in a loop that exits on the first reply. +A loop around the prompt exits on the first reply of any kind and gives up after two silent +attempts. -```python {1-10} +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as call_routing.py and run: python call_routing.py +from signalwire.relay import RelayClient + +client = RelayClient( + project="", + token="", + host=".signalwire.com", + contexts=["default"], +) + + +@client.on_call +async def handle_call(call): + await call.answer() + result = {} for _attempt in range(2): action = await call.play_and_collect( @@ -1153,20 +1679,79 @@ Wrap the prompt in a loop that exits on the first reply. result = event.params.get("result", {}) if result.get("type") != "no_input": break + + heard = "" + if result.get("type") == "speech": + heard = result.get("params", {}).get("text", "").lower() + + if "booking" in heard: + reply = "You said booking." + elif "dispatch" in heard: + reply = "You said dispatch." + elif result.get("type") == "no_input": + reply = "I didn't hear anything. Goodbye." + else: + reply = "I didn't understand that. Goodbye." + + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + await call.play( + [{"type": "tts", "params": {"text": reply}}], + on_completed=hang_up_after_playback, + ) + await call.wait_for_ended() + + +client.run() ``` -```typescript {1-10} - let result: { type?: string; params?: { text?: string } } = {}; +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// Save as call-routing.mts and run: npx tsx call-routing.mts +import { RelayClient } from "@signalwire/sdk"; + +const client = new RelayClient({ + project: "", + token: "", + host: ".signalwire.com", + contexts: ["default"], +}); + +type CollectResult = { type?: string; params?: { text?: string } }; + +client.onCall(async (call) => { + await call.answer(); + + let result: CollectResult = {}; for (let attempt = 0; attempt < 2; attempt++) { const action = await call.playAndCollect( [{ type: "tts", text: "Thanks for calling Bayview Taxi. Say booking or dispatch." }], { speech: { hints: ["booking", "dispatch"], language: "en-US" } }, ); const event = await action.wait(); - result = (event.params.result ?? {}) as typeof result; + result = (event.params.result ?? {}) as CollectResult; if (result.type !== "no_input") break; } + + const heard = result.type === "speech" ? (result.params?.text ?? "").toLowerCase() : ""; + + let reply = "I didn't understand that. Goodbye."; + if (heard.includes("booking")) reply = "You said booking."; + else if (heard.includes("dispatch")) reply = "You said dispatch."; + else if (result.type === "no_input") reply = "I didn't hear anything. Goodbye."; + + await call.play([{ type: "tts", text: reply }], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + await call.waitForEnded(); +}); + +await client.run(); ``` From 6331c991283b53438a0c11e3fd96c82d1cbd9cb2 Mon Sep 17 00:00:00 2001 From: August Date: Fri, 9 Oct 2026 15:56:33 +0000 Subject: [PATCH 05/12] merge --- .claude/rules/mdx-capability-guides.md | 57 +- .claude/rules/mdx-style.md | 3 +- CLAUDE.md | 2 +- CONTRIBUTING.md | 1 + README.md | 5 +- fern/apis/compatibility/openapi.yaml | 55 +- fern/apis/signalwire-rest/openapi.yaml | 300 ++- .../campaign-registry/sms/TCR-wizard-1.webp | Bin 53654 -> 0 bytes .../campaign-registry/sms/TCR-wizard-2.webp | Bin 33858 -> 0 bytes .../sms/TCR-wizard-new-campaign.webp | Bin 48024 -> 0 bytes .../sms/TCR-wizard-phone-assignment.webp | Bin 26772 -> 0 bytes .../campaign-registry/sms/brand-details.webp | Bin 39744 -> 0 bytes .../campaign-registry/sms/brands.webp | Bin 46160 -> 0 bytes .../sms/campaign-details.webp | Bin 68952 -> 0 bytes .../sms/campaign-numbers.webp | Bin 58490 -> 0 bytes .../campaign-registry/sms/campaigns.webp | Bin 53576 -> 0 bytes .../sms/existing-campaign-details.webp | Bin 34426 -> 0 bytes .../images/img/ai-chat-rest-flow-themed.svg | 110 + .../img/inbound-call-lifecycle-themed.svg | 85 + fern/assets/images/tools/swsh/swsh-warp.webp | Bin 76976 -> 0 bytes fern/assets/images/tools/swsh/swsh.webp | Bin 11240 -> 0 bytes .../tools/wirestarter/swsh-to-setup.webp | Bin 433294 -> 0 bytes .../tools/wirestarter/wirestarter-space.webp | Bin 57550 -> 0 bytes fern/components/voice-widget/engine.tsx | 6 + fern/components/voice-widget/index.tsx | 11 +- fern/docs.yml | 864 +------- fern/fern.config.json | 2 +- fern/llms.txt | 20 +- .../build-voice-video/call-controls.mdx | 2 +- .../build-voice-video/device-management.mdx | 2 +- .../build-voice-video/inbound-calls.mdx | 4 +- .../v4/guides/build-voice-video/overview.mdx | 6 +- .../build-voice-video/screen-sharing.mdx | 2 +- .../guides/getting-started/authentication.mdx | 2 +- .../pages/nodes/ai_agent.mdx | 2 +- fern/products/home/pages/welcome.mdx | 12 +- .../platform/changelog/2026-09-05.mdx | 2 +- .../platform/changelog/2026-09-21.mdx | 7 + .../platform/changelog/2026-09-28.mdx | 12 + .../products/platform/pages/ai/chat.mdx.draft | 330 --- .../pages/ai/get-started/quickstart.mdx | 7 +- .../ai/get-started/tool-calling/index.mdx | 3 +- .../pages/ai/guides/Integrations/vapi.mdx | 4 +- .../platform/pages/ai/guides/chat.mdx | 713 +++++++ fern/products/platform/pages/ai/overview.mdx | 14 +- .../pages/calling/voice/SIP/index.mdx | 4 +- .../voice/SIP/sip-credentials/index.mdx | 2 +- .../pages/calling/voice/TTS/index.mdx | 9 +- .../pages/calling/voice/TTS/minimax.mdx | 2 + .../platform/pages/calling/voice/TTS/rime.mdx | 2 +- .../pages/calling/voice/TTS/speechify.mdx | 2 + .../pages/calling/voice/call-streaming.mdx | 1605 ++++++++++++++ .../pages/calling/voice/machine-detection.mdx | 843 ++++++++ .../calling/voice/make-and-receive-calls.mdx | 1350 ++++++++++++ .../pages/calling/voice/outbound-calling.mdx | 1871 ----------------- .../platform/pages/calling/voice/overview.mdx | 25 +- .../pages/calling/voice/record-calls.mdx | 1158 ++++++++++ .../pages/calling/whatsapp/receive-calls.mdx | 2 - .../platform/pages/getting-started.mdx | 21 +- .../registration/index.mdx | 183 +- .../pages/platform/call-fabric/addresses.mdx | 251 ++- .../pages/platform/call-fabric/resources.mdx | 38 +- .../platform/call-fabric/subscribers.mdx | 14 +- .../platform/pages/platform/core/glossary.mdx | 61 +- .../pages/platform/core/rate-limits.mdx | 1 + .../index.mdx | 4 +- .../pages/platform/phone-numbers/overview.mdx | 2 +- .../pages/platform/setup/auto-top-up.mdx | 64 + .../pages/platform/setup/trial-mode.mdx | 5 + .../platform/pages/tools/overview.mdx | 30 - .../platform/pages/tools/swsh/index.mdx | 438 ---- .../pages/tools/wirestarter/index.mdx | 231 -- fern/products/platform/platform.yml | 38 +- .../guides/build-ai-agents/call-recording.mdx | 507 ----- .../pages/guides/build-ai-agents/overview.mdx | 4 +- .../guides/build-ai-agents/voice-language.mdx | 2 - .../pages/reference/python/core/overview.mdx | 2 +- .../reference/python/relay/call/connect.mdx | 3 + .../reference/python/relay/client/dial.mdx | 3 + .../reference/typescript/core/overview.mdx | 2 +- .../typescript/relay/call/connect.mdx | 3 + .../typescript/relay/client/dial.mdx | 3 + .../reference/typescript/relay/overview.mdx | 4 +- .../guides/recipes/creating-ivr-with-swml.mdx | 4 +- .../pages/guides/recipes/forwarding-calls.mdx | 9 +- .../recipes/making-and-receiving-calls.mdx | 184 -- .../pages/guides/recipes/recording-calls.mdx | 72 - .../methods/calling/ai/ai_params/index.mdx | 2 +- .../methods/calling/ai/languages/index.mdx | 16 + .../methods/calling/connect/index.mdx | 120 +- .../reference/methods/calling/enter_queue.mdx | 17 +- .../reference/methods/calling/record_call.mdx | 81 +- fern/redirects.yml | 883 ++++++++ .../common/call-fabric/resource-addresses.md | 56 - .../common/call-fabric/resource-contexts.md | 6 +- .../common/call-fabric/resources-fyi-card.mdx | 2 +- .../dashboard/_assign-resource-to-number.mdx | 16 + .../common/dashboard/_resource-admonition.mdx | 2 +- fern/styles.css | 6 + package.json | 2 +- specs/compatibility-api/tokens/main.tsp | 10 +- .../compatibility-api/tokens/models/core.tsp | 11 +- .../tokens/models/responses.tsp | 5 + .../calling-api/calls/models/examples.tsp | 1 + .../calling-api/calls/models/requests.tsp | 4 +- .../fabric-api/_shared/enums.tsp | 1 + .../fabric-api/resources/models/core.tsp | 22 + .../fabric-api/resources/models/responses.tsp | 11 + .../relay-rest/recordings/models/core.tsp | 19 +- .../swml/calling/Methods/ai/ai_languages.tsp | 77 +- specs/swml/calling/Methods/connect/main.tsp | 21 +- .../swml/calling/Methods/enter_queue/main.tsp | 14 +- .../@typespec/json-schema/SWMLObject.json | 131 +- yarn.lock | 8 +- 114 files changed, 8036 insertions(+), 5211 deletions(-) delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-1.webp delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-2.webp delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-new-campaign.webp delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-phone-assignment.webp delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/brand-details.webp delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/brands.webp delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/campaign-details.webp delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/campaign-numbers.webp delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/campaigns.webp delete mode 100644 fern/assets/images/dashboard/campaign-registry/sms/existing-campaign-details.webp create mode 100644 fern/assets/images/img/ai-chat-rest-flow-themed.svg create mode 100644 fern/assets/images/img/inbound-call-lifecycle-themed.svg delete mode 100644 fern/assets/images/tools/swsh/swsh-warp.webp delete mode 100644 fern/assets/images/tools/swsh/swsh.webp delete mode 100644 fern/assets/images/tools/wirestarter/swsh-to-setup.webp delete mode 100644 fern/assets/images/tools/wirestarter/wirestarter-space.webp create mode 100644 fern/products/platform/changelog/2026-09-21.mdx create mode 100644 fern/products/platform/changelog/2026-09-28.mdx delete mode 100644 fern/products/platform/pages/ai/chat.mdx.draft create mode 100644 fern/products/platform/pages/ai/guides/chat.mdx create mode 100644 fern/products/platform/pages/calling/voice/call-streaming.mdx create mode 100644 fern/products/platform/pages/calling/voice/machine-detection.mdx create mode 100644 fern/products/platform/pages/calling/voice/make-and-receive-calls.mdx delete mode 100644 fern/products/platform/pages/calling/voice/outbound-calling.mdx create mode 100644 fern/products/platform/pages/calling/voice/record-calls.mdx create mode 100644 fern/products/platform/pages/platform/setup/auto-top-up.mdx delete mode 100644 fern/products/platform/pages/tools/overview.mdx delete mode 100644 fern/products/platform/pages/tools/swsh/index.mdx delete mode 100644 fern/products/platform/pages/tools/wirestarter/index.mdx delete mode 100644 fern/products/server-sdks/pages/guides/build-ai-agents/call-recording.mdx delete mode 100644 fern/products/swml/pages/guides/recipes/making-and-receiving-calls.mdx delete mode 100644 fern/products/swml/pages/guides/recipes/recording-calls.mdx create mode 100644 fern/redirects.yml delete mode 100644 fern/snippets/common/call-fabric/resource-addresses.md create mode 100644 fern/snippets/common/dashboard/_assign-resource-to-number.mdx diff --git a/.claude/rules/mdx-capability-guides.md b/.claude/rules/mdx-capability-guides.md index fa28bd8014..a70324170a 100644 --- a/.claude/rules/mdx-capability-guides.md +++ b/.claude/rules/mdx-capability-guides.md @@ -5,14 +5,21 @@ paths: # Capability guides — one capability, every surface -Applies to a how-to that teaches one platform capability across more than one surface (SWML, Relay, the REST Calling API, the Browser SDK, Call Flow Builder). Exemplars: `fern/products/platform/pages/calling/voice/outbound-calling.mdx` (first-run walkthrough, complete samples) and `fern/products/platform/pages/calling/record-calls.mdx` (task sections, merged Relay and REST blocks). A single-surface how-to or an integration guide (the Vapi page) follows `mdx-style` alone. Voice, grounding, and `## Next steps` come from `mdx-style`; this rule fixes the skeleton and the sample conventions so guides match each other. +Applies to a how-to that teaches one platform capability across more than one surface (SWML, Relay, the REST Calling API, the Browser SDK, Call Flow Builder). Exemplars: `fern/products/platform/pages/calling/voice/record-calls.mdx` (task-first layout: capability matrix, task sections, merged Relay and REST blocks) and `fern/products/platform/pages/calling/voice/make-and-receive-calls.mdx` (approach-first layout: one section per approach, first-run walkthroughs, complete samples). A single-surface how-to or an integration guide (the Vapi page) follows `mdx-style` alone. Voice, grounding, and `## Next steps` come from `mdx-style`; this rule fixes the skeleton and the sample conventions so guides match each other. ## Skeleton Every guide answers the same questions in the same order: which product, how to start, how to do the thing, how to know it worked, where to go next. +Pick one of two layouts: + +- **Task-first** (the default). Use it when the surfaces differ in what they can do, or when a reader can mix them for one task (start a recording over SWML, stop it over REST). The body is task sections, each with one `###` per surface. +- **Approach-first**. Use it when every approach can do every task in the guide, but the approaches don't mix: each needs its own code and its own kind of Resource, so a reader follows one of them start to finish (placing and answering calls with SWML, Relay, or the Browser SDK). The body is one `##` per approach, each with its own tasks beneath it. A task-first layout here would interleave three unrelated code paths under every heading and invite readers to switch between them. + +Task-first: + ```text -frontmatter: title = capability as a noun phrase ("Call streaming"); slug //; +frontmatter: title = the task, verb first ("Record calls", "Stream call audio"); slug //; description = one sentence naming the first-run outcome, then each extension in page order [reference-style link definitions] intro, 2–3 sentences, no heading: what the reader does, then "Start by , then ." @@ -24,29 +31,50 @@ intro, 2–3 sentences, no heading: what the reader does, then "Start by ### (optional — "Choose a destination", "Run a WebSocket server") ### ("Place the call", "Start the stream") + SDK examples first + Python — + TypeScript — + + the direct HTTP alternative, when a reference example fits; + otherwise a `cURL — ` block inside the CodeBlocks ### ("Answer the call", "Answer and speak") — the verification step ## one per task the guide must cover ### via one per surface that supports it -## Examples +## Examples (optional) ### #### via ## Next steps ``` -- **Pick the right product.** The first job of the page is to show which surface can do what, so the reader chooses before reading further. See "Capability matrix" below. +Approach-first: + +```text +frontmatter, link definitions, intro as above +## Choose an approach one paragraph saying the approaches don't mix, then one bullet per approach +## Prepare for one placeholder table for every approach +## How works (optional — the model every approach shares, such as how a call reaches your code) +## via one per approach, in SDK-first order: SWML, then WebSocket (Relay), then the browser + ### via the same tasks, in the same order, under every approach + … first-run tasks are walkthroughs ending in a verification step +## Next steps +``` + +- **Pick the right product** (task-first). The first job of the page is to show which surface can do what, so the reader chooses before reading further. See "Capability matrix" below. +- **Choose an approach** (approach-first). Say plainly that the approaches are separate ways to build the app and that the sections don't build on each other, then give one bullet per approach: its canonical name linked to its reference, what it is, and when to choose it. No matrix: when every approach can do every task, it would be a grid of check marks that doesn't help the reader choose. - **Prepare.** "Have these values ready:" then bullets: Space URL, Project ID and API token with the **Voice** permission, a purchased number or verified caller ID, a destination the reader can answer, then topic-specific items. Hard constraints follow as titled ``s (trial and international limits, `wss://` only, TCPA). Add one pointer sentence when a reader might want a sibling guide instead. - **How it works.** Put it before the first run only when the reader can't interpret the result without the model (machine detection's outcome table). Otherwise conceptual depth goes after the first run, as its own `##` ("Handle the audio stream"). - **First run.** A `` walkthrough is for a reader starting from zero: a first call, a first stream. A guide that picks up mid-stream (recording assumes you can already place a call) skips `` and opens with its first task section. The walkthrough targets the smallest thing the reader can confirm alone, usually calling their own phone: one code block per surface, no options, no error handling. -- **Verification step** closes the ``: what the reader hears or sees on success, then the likeliest failure and what it means. A guide without `` puts the same check at the end of its first task section. Never skip it. -- **Task sections** are the body of the guide. Name each `##` after what the reader wants ("Record the whole call"), never after the API surface that provides it ("The record_call verb"). One `###` per surface beneath it, surface named in the heading. Options get their own `##` after the task that introduces them ("Recording options: format, stereo, and direction"). +- **Verification step** closes the ``: what the reader hears or sees on success, then the likeliest failure and what it means. When several failures are common, list them by symptom. A guide without `` puts the same check at the end of its first task section. Never skip it. +- **Task sections** are the body of a task-first guide. Name each `##` after what the reader wants ("Record the whole call"), never after the API surface that provides it ("The record_call verb"). One `###` per surface beneath it, surface named in the heading. Options get their own `##` after the task that introduces them ("Recording options: format, stereo, and direction"). - **Track and control** is a task section like any other: REST gets `status_url`/`status_events` and a JSON callback payload; Relay gets `call.on(…)` handlers. One lifecycle diagram per surface family, themed SVG in `` with an `` mermaid `sequenceDiagram` twin (`mdx-diagrams`). Add `### Compare the surfaces` when defaults or parameter names differ by surface. +- **Approach sections** are the body of an approach-first guide. Each `##` covers one approach end to end, and each `###` beneath it is a task named with its surface (`### Place a call via SWML`, `### Answer a call in a browser`), so every heading still stands alone in search. Keep the tasks in the same order under every approach. Setup shared by every approach (credentials, placeholders, the mental model) goes once above the approach sections, never repeated inside them. - **Examples** hold the variations you could delete and still have a guide. If removing a section would leave a hole in the main path, it is a task section and belongs above `## Examples`. Each example is `### `: one-sentence goal, a titled `` when compliance applies, then a `####` per surface. - **Next steps** is required here as on every guide (`mdx-style`). Cards deepen this capability only. ## Capability matrix -One table under `## Pick the right product`: `| Function | SWML | Relay | REST Calling API | Browser SDK | Call Flow Builder |`, keeping every column where the capability plausibly lives and adding an API-area column (`Recordings API`) when a REST resource is part of the story. Rows are things the reader wants to do ("Get the recording's URL back in your own code, without a webhook"), not feature names. Three cell states: +Task-first guides only. One table under `## Pick the right product`: `| Function | SWML | WebSocket (Relay) | REST | Browser SDK | Call Flow Builder |`, keeping every column where the capability plausibly lives. The REST column covers both commands sent to a live call and REST resources such as the Recordings API, so a REST resource never gets its own column. Rows are things the reader wants to do ("Get the recording's URL back in your own code, without a webhook"), not feature names. Three cell states: - `` shipped - `` not available @@ -56,22 +84,23 @@ Follow the table with one bullet per column: the surface's canonical name linked ## Surface names -Canonical names come from the glossary (`/docs/platform/glossary`); the ones this rule uses are `SWML`, `Relay`, `REST Calling API`, `Server SDKs`, `Browser SDK`, `Call Flow Builder`. Never "Realtime SDK", "Agents SDK", "the WebSocket API", or "CFB". How specific to be depends on where the name sits: +Canonical names come from the glossary (`/docs/platform/glossary`); the ones this rule uses are `SWML`, `Relay`, `REST Calling API`, `Server SDKs`, `Browser SDK`, `Call Flow Builder`. Prose uses these names. Matrix columns, headings, and tab titles name the two transports `WebSocket (Relay)` and `REST`. Never "Realtime SDK", "Agents SDK", "the WebSocket API", or "CFB". How specific to be depends on where the name sits: -- **Headings** name the surface in full: `### Stop recording the call via Relay`, `### Place the call via the REST Calling API`. Two shapes: ` via ` when the surface is a transport; ` from ` when it is a caller context ("Hold an AI chat conversation from a browser"). Every heading stands alone in a search result with no page title above it, so it carries the keywords: "Recording options: format, stereo, and direction", not "Recording options". +- **Headings** name the surface: `### Stop recording the call via WebSocket (Relay)`, `### Place the call via REST`, `### Record the whole call via SWML`. Two shapes: ` via ` when the surface is a transport; ` from ` when it is a caller context ("Hold an AI chat conversation from a browser"). Every heading stands alone in a search result with no page title above it, so it carries the keywords: "Recording options: format, stereo, and direction", not "Recording options". - **Tab titles** are short: `REST`, `WebSocket (Relay)`. -- **Code block titles** are ` — `: `Python — Relay client`, `TypeScript — Relay client`, `cURL — REST Calling API`, `Python — Agents`, `TypeScript — Agents`, `Python — REST client`, `TypeScript — REST client`, `JavaScript — Browser SDK`, `YAML`, `JSON`. +- **Code block titles** are ` — `: `Python — Relay client`, `TypeScript — Relay client`, `cURL — Calling API`, `Python — SWML builder`, `TypeScript — SWML builder`, `Python — REST client`, `TypeScript — REST client`, `JavaScript — Browser SDK`, `YAML`, `JSON`. ## Surfaces: headings by default, tabs only inside Steps - A task shows each surface under its own `###`, never in tabs. Headings appear in the table of contents, in search, and in the Markdown export; tab panes hide from all three. - Inside ``, `###` is already the step heading, so a step that differs by surface uses `` with `` and ``. That is the only place tabs belong. Guides under one overview share a single `groupId` so the reader's choice follows them between pages; the voice guides use `outbound-api`. -- **Relay and the REST Calling API are the same commands over two transports.** When only the transport differs (pausing a recording, stopping a stream), one `### via Relay` heading holds a single `` of `Python — Relay client`, `TypeScript — Relay client`, and `cURL — REST Calling API`. Split them into separate headings only when the flow genuinely differs: placing a call over HTTP with inline SWML is not the same flow as dialing over a live socket. -- **SWML is one surface, authored several ways and delivered several ways.** Under `### via SWML`, show the document once, in the forms a reader authors it, in one ``: `Python — Agents` and `TypeScript — Agents` (`AgentBase`) first, then `YAML`, then `JSON`. Don't encourage hand-writing SWML where the SDK covers the verb. How the document reaches the call (served from your server, stored as a hosted script resource, passed inline in a REST `dial`) is a delivery choice: cover it once per guide, in the first-run section, and don't repeat it under every task. A REST `dial` that carries inline SWML is SWML delivery, not the REST Calling API surface. -- Where the reference already documents a REST request, use `EndpointRequestSnippet` and `EndpointResponseSnippet` with a link to the reference page instead of hand-writing the request; describe only the fields the task needs. A first-run REST step that dials still ends with the "returns a call `id` and status `queued` … save the `id`" paragraph and ``. +- **Relay and the REST Calling API are the same commands over two transports.** When only the transport differs (pausing a recording, stopping a stream), one `### via WebSocket (Relay)` heading holds a single `` of `Python — Relay client` and `TypeScript — Relay client`, followed by the REST Calling API command as an `EndpointRequestSnippet` or, when no reference example fits, a `cURL — Calling API` block. Split them into separate headings only when the flow genuinely differs: placing a call over HTTP with inline SWML is not the same flow as dialing over a live socket. +- **SWML is one surface, authored several ways and delivered several ways.** Under `### via SWML`, show the document once, in the forms a reader authors it, in one ``: `Python — SWML builder` (`SWMLBuilder`) and `TypeScript — SWML builder` (`SwmlBuilder`) first, then `YAML`, then `JSON`. Use builder methods for supported verbs, including nested branches and confirmation instructions. Use `AgentBase` when the example needs its agent features. How the document reaches the call (served from your server, stored as a hosted script resource, passed inline in a REST `dial`) is a delivery choice: cover it once per guide, in the first-run section, and don't repeat it under every task. A REST `dial` that carries inline SWML is SWML delivery, not the REST surface. +- **Direct HTTP: a reference snippet when it fits, a cURL block when it doesn't.** When the API reference's example matches the request the task needs, place `EndpointRequestSnippet` after the SDK examples, with one sentence linking the reference page ("To call the REST API directly, use [Update phone number][…]"); pick a named example with `example="…"` when the default isn't the one. When no existing example matches (a `dial` with inline SWML, a phone number assigned to a Relay topic), write a `cURL — ` block as the last entry in the SDK `` and link the reference page after it. Never add an `@opExample` to the TypeSpec just to fit a guide. Add `EndpointResponseSnippet` when the reader needs the response, and describe only the fields the task needs. A first-run REST step that dials still ends with the "returns a call `id` and status `queued` … save the `id`" paragraph and ``. ## Sample conventions +- **SDK examples first.** For every API operation covered by a supported SDK, lead the explanation with the SDK method and make its example the first visible option. In a shared ``, order Python SDK, then TypeScript SDK, then the direct HTTP alternative (see "Direct HTTP" above). Apply this to setup, resource creation, authentication, call control, and follow-up tasks as well as the first call. In prose, say "the Server SDKs" and link to the landing page (`/docs/server-sdks`), before the underlying REST endpoint; never name a language or link a per-language reference page. Code block titles still name the language. If no supported SDK method exists for the documented version, explain the gap and use direct HTTP for that operation. A hosted-script-only step can show YAML and JSON directly because the reader pastes a document into the Dashboard. - **Complete programs.** Every sample under `` and `## Examples` runs as pasted: imports, client setup, the call, and the wait or disconnect. A block under a task section may show only the changed lines, with line highlights (`{6-8}`), when its paragraph names the sample it extends. - **Header comments** on every complete sample. Python: `# Install: python -m pip install signalwire-sdk==3.4.1` then `# Save as .py and run: python .py`. TypeScript with no type annotations: `// Install: npm install @signalwire/sdk@2.0.5` then `// This sample also runs as JavaScript: save as .mjs,` / `// then run: node .mjs`. TypeScript that uses types: `// Save as .mts and run: npx tsx .mts`. Browser: `// Install: npm install @signalwire/js@4.0.0-rc.2 rxjs@7.8.2` plus the HTML elements the script expects, as comments. - **Pinned versions** are literal and identical across every guide: `signalwire-sdk==3.4.1`, `@signalwire/sdk@2.0.5`, `@signalwire/js@4.0.0-rc.2 rxjs@7.8.2`. Bump them in every guide in one PR, never one page at a time. @@ -84,7 +113,7 @@ Canonical names come from the glossary (`/docs/platform/glossary`); the ones thi - A `` on the parent overview (`fern/products/platform/pages/calling/voice/overview.mdx` for voice), and a fix for any FAQ or stale link there that the guide now answers. - The `fern/llms.txt` bullet: add or repoint, description copied from the page's frontmatter. -- Redirects in `fern/docs.yml` only when the guide consolidates existing pages. +- Redirects in `fern/redirects.yml` only when the guide consolidates existing pages. - No changelog entry (documentation work). A nav yml entry only where the folder isn't folder-driven (`platform.yml` lists `pages/calling/` pages explicitly). ## Before opening the PR diff --git a/.claude/rules/mdx-style.md b/.claude/rules/mdx-style.md index e38055529d..2fa958c100 100644 --- a/.claude/rules/mdx-style.md +++ b/.claude/rules/mdx-style.md @@ -35,7 +35,7 @@ Tutorials and how-tos give the reader a way to confirm the result — a command - No "simply/easily/just" and no "please" in instructions. [G] - Em-dashes are a house device, not a default connector: one earns its place on a genuine break in thought or an appositive commas would muddle. Where a comma reads the same, write the comma. Never several per paragraph. [MS][SW] Aphorisms land at 2–3 per page, max. [SW] (judgment) - No emoji — not in headings, tab/card titles, or prose. Say good/bad in words. [SW] -- Terminology: canonical names are "Server SDKs" (never "Agents SDK") and "resource addresses" (never "Fabric addresses"). The published glossary at `/docs/platform/glossary` (`fern/products/platform/pages/platform/core/glossary.mdx`) is the source of truth for the full set of canonical names, aliases, and historical names — check it before naming a product or entity, and record a new decision there rather than here. Tokens are *created*/*issued* (never *minted*); expand every acronym at first use. [SW] +- Terminology: canonical names are "Server SDKs" (never "Agents SDK") and "Resource Addresses" (never "Fabric Addresses"). The published glossary at `/docs/platform/glossary` (`fern/products/platform/pages/platform/core/glossary.mdx`) is the source of truth for the full set of canonical names, aliases, and historical names — check it before naming a product or entity, and record a new decision there rather than here. Tokens are *created*/*issued* (never *minted*); expand every acronym at first use. [SW] ## Accessibility and inclusive language [G][MS] @@ -49,6 +49,7 @@ Tutorials and how-tos give the reader a way to confirm the result — a command - Customer-facing only: no internal implementation detail (backend endpoints, transports, engine-side params). Placeholder data only — no real names, emails, or domains. - Examples do real work: tool call → your server → system of record → response. No knowledge-trivia bots. - Examples run as written: real imports, every required parameter, and only placeholders the reader can obviously fill. Verify each against the spec or SDK source — and against an actual run when the page ships a whole flow. +- In tutorials and how-to guides, explain API usage through the supported SDK first. Show Python and TypeScript SDK examples first, then the direct HTTP alternative: an `EndpointRequestSnippet` when a reference example matches the request, otherwise a cURL block. Use SWML builders for supported instructions; put equivalent YAML and JSON after the SDK examples. Explain any SDK/version gap that requires a raw request or verb. See `mdx-capability-guides` for the example ordering template. - A cluster of guides shares one running example, so cross-links compound instead of restarting context. The AI guides use Bayview Taxi and its dispatcher Ada across `platform/pages/ai/overview.mdx` and `platform/pages/ai/guides/**`, and the calling guides under `platform/pages/calling/voice/` borrow the same cast whenever a scenario has a business voice; adopt a cluster's existing cast when you add a page to it, and introduce a new one only for a new cluster. [SW] - Don't cite other vendors' docs as authority; never disparage anyone's product. diff --git a/CLAUDE.md b/CLAUDE.md index 5d678b7ae3..002591d96f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -58,7 +58,7 @@ Assume no prior knowledge, and never expose internal implementation detail — b | Change | Run | |---|---| | MDX pages | `yarn fern-md-check` | -| Nav yml (`fern/docs.yml`, `fern/products/*/*.yml`) | `yarn fern-check` | +| Nav yml (`fern/docs.yml`, `fern/products/*/*.yml`) or redirects (`fern/redirects.yml`) | `yarn fern-check` | | TypeSpec under `specs/` | `yarn build:specs` | CI runs `fern-check` and `fern-md-check` on every PR. No check covers `#anchor` fragments — verify by hand any link you touch. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 87269d72dc..0af1a91be9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,6 +68,7 @@ and the strict MDX v3 syntax rules are all documented in the repo's authoring gu - [`.claude/rules/mdx-mechanics.md`](.claude/rules/mdx-mechanics.md) — frontmatter, structure, links, the LLM view, and MDX rules that break the build. - [`.claude/rules/mdx-components.md`](.claude/rules/mdx-components.md) — the component catalog (house set, custom components, what not to use). - [`.claude/rules/mdx-reference-pages.md`](.claude/rules/mdx-reference-pages.md) — reference-page patterns (`ParamField`, section names, examples). +- [`.claude/rules/mdx-capability-guides.md`](.claude/rules/mdx-capability-guides.md) — guide template and SDK-first examples, with cURL after the SDKs. - [`.claude/rules/docs-conventions.md`](.claude/rules/docs-conventions.md) — which docs are hand-authored vs. generated. These are the single source of truth (and double as the guardrails your AI editor loads automatically), so follow them rather than any summary here. diff --git a/README.md b/README.md index 9a763050bc..9207a568d9 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Get Started  ·  API Reference  ·  SWML  ·  - Agents SDK  ·  + Server SDKs  ·  Report an Issue

@@ -60,8 +60,7 @@ This is the source repository for [signalwire.com/docs](https://signalwire.com/d | | Product | Description | |---|---|---| -| | [Agents SDK](https://signalwire.com/docs/agents-sdk) | Build AI-powered voice agents | -| | [Server SDK](https://signalwire.com/docs/server-sdk) | Control communications in real time | +| | [Server SDKs](https://signalwire.com/docs/server-sdks) | Build AI agents, control calls, send messages, and more | | | [Browser SDK](https://signalwire.com/docs/browser-sdk) | Voice, video & chat in the browser | diff --git a/fern/apis/compatibility/openapi.yaml b/fern/apis/compatibility/openapi.yaml index 660ec70301..460c536ecd 100644 --- a/fern/apis/compatibility/openapi.yaml +++ b/fern/apis/compatibility/openapi.yaml @@ -4533,6 +4533,8 @@ paths: For the SignalWire REST API's project route, use [Create API token](/docs/apis/rest/project-tokens/create-token). + The response is the only place the token secret is returned. No later request, including [Update an API Token](/docs/compatibility-api/rest/tokens/update-token), can read it back. If you lose it, delete the token and create a new one. + #### Permissions The API token used to authenticate must have the following scope(s) enabled to make a successful request: _Management_. @@ -4546,7 +4548,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/TokenResponse' + $ref: '#/components/schemas/CreateTokenResponse' '400': description: The request was invalid or cannot be processed. Check the error details for more information. content: @@ -4580,6 +4582,10 @@ paths: description: |- Changes the name or enabled permission categories of an existing project API token. For the SignalWire REST API's project route, use [Update API token](/docs/apis/rest/project-tokens/update-token). + The response contains the token's `id`, `name`, and `permissions` only. The token secret is returned once, by [Generate a new API Token](/docs/compatibility-api/rest/tokens/create-token), and cannot be retrieved afterwards. + + Updating a token does not rotate or reissue its secret. The existing secret keeps working after the update. + #### Permissions The API token used to authenticate must have the following scope(s) enabled to make a successful request: _Management_. @@ -8565,6 +8571,43 @@ components: unevaluatedProperties: not: {} description: Request body for creating an API token. + CreateTokenResponse: + type: object + required: + - id + - name + - permissions + - token + properties: + id: + allOf: + - $ref: '#/components/schemas/uuid' + description: The unique identifier of the API Token. + examples: + - ea14556a-984f-11ee-b9d1-0242ac120002 + name: + type: string + minLength: 1 + description: The name of the API Token. + examples: + - John Doe's Token + permissions: + type: array + items: + type: string + description: The permissions enabled for this token. + examples: + - - calling + - fax + - messaging + token: + type: string + description: The API token secret, used as the password in HTTP Basic auth alongside the project ID. Returned only in this response and cannot be retrieved again; store it securely. + examples: + - swapi_0123456789ab0123456789ab0123456789ab + unevaluatedProperties: + not: {} + description: Response returned when a token is created. This is the only response that includes the token secret. CxmlScript: type: object required: @@ -11661,18 +11704,17 @@ components: - id - name - permissions - - token properties: id: allOf: - $ref: '#/components/schemas/uuid' - description: The unique identifier of the created API Token. + description: The unique identifier of the API Token. examples: - ea14556a-984f-11ee-b9d1-0242ac120002 name: type: string minLength: 1 - description: The name of the created API Token. + description: The name of the API Token. examples: - John Doe's Token permissions: @@ -11684,11 +11726,6 @@ components: - - calling - fax - messaging - token: - type: string - description: The API token that can be used along with the project ID for basic authentication. - examples: - - swapi_0123456789ab0123456789ab0123456789ab unevaluatedProperties: not: {} description: Response containing a single token. diff --git a/fern/apis/signalwire-rest/openapi.yaml b/fern/apis/signalwire-rest/openapi.yaml index b4f874d7c5..4bcaf767e4 100644 --- a/fern/apis/signalwire-rest/openapi.yaml +++ b/fern/apis/signalwire-rest/openapi.yaml @@ -874,6 +874,7 @@ paths: id: 3fa85f64-5717-4562-b3fc-2c963f66afa6 params: control_id: detect-control-1 + status_url: https://example.com/webhooks/detection detect: type: machine params: @@ -22155,7 +22156,9 @@ components: - 0.05 send_digits: type: string - description: 'DTMF digits to send after the call is answered. Allowed characters: `0-9`, `A-D`, `*`, `#`, `w` (wait), `,` (pause).' + maxLength: 98 + pattern: ^[0-9A-Da-d*#wW,]{1,98}$ + description: 'DTMF digits to send after the call is answered, at most 98 characters. Allowed characters: `0-9`, `A-D`, `*`, `#`, and the pauses `w` (0.5 seconds), `W` (1 second), and `,` (0.5 seconds). SignalWire waits 0.5 seconds after answer before sending the first digit.' examples: - 1234# region: @@ -22293,7 +22296,9 @@ components: - 0.05 send_digits: type: string - description: 'DTMF digits to send after the call is answered. Allowed characters: `0-9`, `A-D`, `*`, `#`, `w` (wait), `,` (pause).' + maxLength: 98 + pattern: ^[0-9A-Da-d*#wW,]{1,98}$ + description: 'DTMF digits to send after the call is answered, at most 98 characters. Allowed characters: `0-9`, `A-D`, `*`, `#`, and the pauses `w` (0.5 seconds), `W` (1 second), and `,` (0.5 seconds). SignalWire waits 0.5 seconds after answer before sending the first digit.' examples: - 1234# region: @@ -22442,7 +22447,9 @@ components: - 0.05 send_digits: type: string - description: 'DTMF digits to send after the call is answered. Allowed characters: `0-9`, `A-D`, `*`, `#`, `w` (wait), `,` (pause).' + maxLength: 98 + pattern: ^[0-9A-Da-d*#wW,]{1,98}$ + description: 'DTMF digits to send after the call is answered, at most 98 characters. Allowed characters: `0-9`, `A-D`, `*`, `#`, and the pauses `w` (0.5 seconds), `W` (1 second), and `,` (0.5 seconds). SignalWire waits 0.5 seconds after answer before sending the first digit.' examples: - 1234# region: @@ -26273,6 +26280,7 @@ components: - created_at - updated_at - duration_in_seconds + - error_code - price - price_unit - status @@ -26308,8 +26316,10 @@ components: examples: - 2 error_code: - type: string - description: Error code if the recording failed. + anyOf: + - type: string + - type: 'null' + description: Error code if the recording failed, and `null` otherwise. price: type: number format: double @@ -26323,14 +26333,19 @@ components: - USD status: type: string - description: Status of the recording. + description: |- + Status of the recording. One of `recording`, `paused`, `finished`, or `no_input`. + `no_input` means audio wasn't detected before the timeout. + The media is only downloadable once the status is `finished`. examples: - - completed + - finished url: type: string - description: URL of the recording file. + description: |- + Path to the recording, relative to your Space URL. The full URL returns the recording's JSON metadata. + Add a format suffix to download the recording: `.wav` or `.mp3`. examples: - - https://example.com/recording.mp3 + - /api/relay/rest/recordings/d3444402-7b43-4512-8735-9d5e1f387814 stereo: type: boolean description: Indicates whether the recording is stereo. @@ -35077,6 +35092,7 @@ components: - created_at - updated_at - duration_in_seconds + - error_code - price - price_unit - status @@ -35112,8 +35128,10 @@ components: examples: - 2 error_code: - type: string - description: Error code if the recording failed. + anyOf: + - type: string + - type: 'null' + description: Error code if the recording failed, and `null` otherwise. price: type: number format: double @@ -35127,14 +35145,19 @@ components: - USD status: type: string - description: Status of the recording. + description: |- + Status of the recording. One of `recording`, `paused`, `finished`, or `no_input`. + `no_input` means audio wasn't detected before the timeout. + The media is only downloadable once the status is `finished`. examples: - - completed + - finished url: type: string - description: URL of the recording file. + description: |- + Path to the recording, relative to your Space URL. The full URL returns the recording's JSON metadata. + Add a format suffix to download the recording: `.wav` or `.mp3`. examples: - - https://example.com/recording.mp3 + - /api/relay/rest/recordings/d3444402-7b43-4512-8735-9d5e1f387814 stereo: type: boolean description: Indicates whether the recording is stereo. @@ -35843,6 +35866,50 @@ components: message: webhook_url must be a valid URL attribute: webhook_url url: https://signalwire.com/docs/apis/error-codes + RemoteAIAgent: + type: object + required: + - id + - name + - primary_request_url + - fallback_request_url + - status_callback_url + properties: + id: + allOf: + - $ref: '#/components/schemas/uuid' + description: Unique ID of the Remote AI Agent. + examples: + - b2a4c6e8-1f3d-4a5b-9c7e-0d2f4a6b8c1e + name: + type: string + description: Name of the Remote AI Agent. + examples: + - Support Agent + primary_request_url: + type: string + format: uri + description: URL of the agent you host. SignalWire requests the SWML document for each call from this URL. + examples: + - https://agent.example.com/swml + fallback_request_url: + anyOf: + - type: string + format: uri + - type: 'null' + description: URL SignalWire requests the SWML document from if the primary URL cannot be reached or fails. + examples: + - https://agent.example.com/fallback + status_callback_url: + anyOf: + - type: string + format: uri + - type: 'null' + description: URL that receives a JSON event when a call to this agent completes, with details of the finished call. + examples: + - https://agent.example.com/status + unevaluatedProperties: + not: {} RequestUrlMethodType: type: string enum: @@ -35950,6 +36017,7 @@ components: ResourceResponse: oneOf: - $ref: '#/components/schemas/ResourceResponseAI' + - $ref: '#/components/schemas/ResourceResponseRemoteAIAgent' - $ref: '#/components/schemas/ResourceResponseCallFlow' - $ref: '#/components/schemas/ResourceResponseCXMLWebhook' - $ref: '#/components/schemas/ResourceResponseCXMLScript' @@ -36449,6 +36517,60 @@ components: unevaluatedProperties: not: {} title: Relay Application + ResourceResponseRemoteAIAgent: + type: object + required: + - id + - project_id + - display_name + - created_at + - updated_at + - type + - remote_ai_agent + properties: + id: + allOf: + - $ref: '#/components/schemas/uuid' + description: Unique ID of the Resource. + examples: + - 993ed018-9e79-4e50-b97b-984bd5534095 + project_id: + allOf: + - $ref: '#/components/schemas/uuid' + description: Unique ID of the Project. + examples: + - 1313fe58-5e14-4c11-bbe7-6fdfa11fe780 + display_name: + type: string + description: Display name of the Resource + examples: + - My Resource + created_at: + type: string + format: date-time + description: Date and time when the resource was created. + examples: + - '2024-05-06T12:20:00Z' + updated_at: + type: string + format: date-time + description: Date and time when the resource was updated. + examples: + - '2024-05-06T12:20:00Z' + type: + type: string + enum: + - remote_ai_agent + description: The type of Resource + examples: + - remote_ai_agent + remote_ai_agent: + allOf: + - $ref: '#/components/schemas/RemoteAIAgent' + description: An object containing the response data of the Remote AI Agent + unevaluatedProperties: + not: {} + title: Remote AI Agent ResourceResponseSWMLScript: type: object required: @@ -40063,17 +40185,17 @@ components: description: Webhook URL to send call status change notifications to. Authentication can also be set in the URL in the format of `username:password@url`. examples: - https://example.com/call-status - transfer_after_bridge: + execute_after_queue: type: string description: |- - SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends. + SWML to execute on this call after its bridge with the queued call ends. Only applies when + `to` starts with `queue:`. When omitted, the call hangs up when the bridge ends. Either way, + the script does not continue past `connect` for queue targets, so `result` never runs. Can be either: - A URL (http or https) that returns a SWML document - An inline SWML document (as a JSON string) - - **Note:** This parameter is REQUIRED when connecting to a queue (when `to` starts with "queue:") examples: - - https://example.com/after-bridge.swml + - https://example.com/after-queue.swml call_state_events: type: array items: @@ -40100,7 +40222,9 @@ components: type: array items: $ref: '#/components/schemas/SWML.Calling.ConnectDestination' - description: Array of destination objects to dial simultaneously. All destinations ring at the same time — the first to answer is bridged and the remaining calls are cancelled. + description: |- + Array of destination objects to dial simultaneously. All destinations ring at the same time — the first to answer is bridged and the remaining calls are cancelled. + Up to 20 destinations are dialed. Any destination after the 20th is skipped without an error. unevaluatedProperties: not: {} description: Dial multiple destinations simultaneously. All destinations in the array ring at the same time — the first to answer is bridged and the remaining calls are cancelled. @@ -40233,17 +40357,17 @@ components: description: Webhook URL to send call status change notifications to. Authentication can also be set in the URL in the format of `username:password@url`. examples: - https://example.com/call-status - transfer_after_bridge: + execute_after_queue: type: string description: |- - SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends. + SWML to execute on this call after its bridge with the queued call ends. Only applies when + `to` starts with `queue:`. When omitted, the call hangs up when the bridge ends. Either way, + the script does not continue past `connect` for queue targets, so `result` never runs. Can be either: - A URL (http or https) that returns a SWML document - An inline SWML document (as a JSON string) - - **Note:** This parameter is REQUIRED when connecting to a queue (when `to` starts with "queue:") examples: - - https://example.com/after-bridge.swml + - https://example.com/after-queue.swml call_state_events: type: array items: @@ -40270,7 +40394,9 @@ components: type: array items: $ref: '#/components/schemas/SWML.Calling.ConnectDestination' - description: Array of destination objects to dial in order. Each destination is tried sequentially — if the current destination does not answer, the next one in the array is attempted. + description: |- + Array of destination objects to dial in order. Each destination is tried sequentially — if the current destination does not answer, the next one in the array is attempted. + Up to 20 destinations are tried. Any destination after the 20th is skipped without an error. unevaluatedProperties: not: {} description: Dial destinations one at a time in sequence. If the first destination does not answer, the next destination in the array is tried, and so on. @@ -40403,17 +40529,17 @@ components: description: Webhook URL to send call status change notifications to. Authentication can also be set in the URL in the format of `username:password@url`. examples: - https://example.com/call-status - transfer_after_bridge: + execute_after_queue: type: string description: |- - SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends. + SWML to execute on this call after its bridge with the queued call ends. Only applies when + `to` starts with `queue:`. When omitted, the call hangs up when the bridge ends. Either way, + the script does not continue past `connect` for queue targets, so `result` never runs. Can be either: - A URL (http or https) that returns a SWML document - An inline SWML document (as a JSON string) - - **Note:** This parameter is REQUIRED when connecting to a queue (when `to` starts with "queue:") examples: - - https://example.com/after-bridge.swml + - https://example.com/after-queue.swml call_state_events: type: array items: @@ -40447,6 +40573,7 @@ components: The outer array is the **serial** dimension — each element is a group tried in order. Each inner array is the **parallel** dimension — all destinations in that group are dialed simultaneously. If no destination in the current group answers, the next group is attempted. + Up to 20 destinations are dialed in total, counted across all groups rather than per group. Any destination after the 20th is skipped without an error. unevaluatedProperties: not: {} description: Combine both serial and parallel strategies using a two-dimensional array. The outer array is the serial dimension — each element is a group tried one at a time, in order. Each inner array is the parallel dimension — all destinations in that group are dialed simultaneously. If no destination in the current group answers, the next group is attempted. @@ -40579,17 +40706,17 @@ components: description: Webhook URL to send call status change notifications to. Authentication can also be set in the URL in the format of `username:password@url`. examples: - https://example.com/call-status - transfer_after_bridge: + execute_after_queue: type: string description: |- - SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends. + SWML to execute on this call after its bridge with the queued call ends. Only applies when + `to` starts with `queue:`. When omitted, the call hangs up when the bridge ends. Either way, + the script does not continue past `connect` for queue targets, so `result` never runs. Can be either: - A URL (http or https) that returns a SWML document - An inline SWML document (as a JSON string) - - **Note:** This parameter is REQUIRED when connecting to a queue (when `to` starts with "queue:") examples: - - https://example.com/after-bridge.swml + - https://example.com/after-queue.swml call_state_events: type: array items: @@ -41180,7 +41307,8 @@ components: Place the current call in a named queue where it will wait to be connected to an available agent or resource. While waiting, callers will hear music or custom audio. When an agent connects to the queue (using the connect method), the caller and agent are bridged together. - After the bridge completes, execution continues with the SWML script specified in transfer_after_bridge. + After the bridge completes, execution continues with the SWML script specified in execute_after_queue, + or the call hangs up if none was given. title: enter_queue unevaluatedProperties: not: {} @@ -41189,17 +41317,19 @@ components: type: object required: - queue_name - - transfer_after_bridge properties: queue_name: type: string description: Name of the queue to enter. If a queue with this name does not exist, it will be automatically created. examples: - support-queue - transfer_after_bridge: + execute_after_queue: type: string description: |- - SWML to execute after the bridge completes. This defines what should happen after the call is connected to an agent and the bridge ends. + SWML to execute after the bridge with the agent ends. When omitted, the call hangs up when + the bridge ends. If the call leaves the queue without being bridged (`wait_time` expires or + the caller hangs up), this field is not used and the script continues with the next + instruction; check `queue_result`. Can be either: - A URL (http or https) that returns a SWML document - An inline SWML document (as a JSON string) @@ -41220,10 +41350,10 @@ components: wait_time: type: integer minimum: 1 - description: Maximum time in seconds to wait in the queue before timeout. Default `3600` + description: Maximum time in seconds to wait in the queue before timeout. Default `180` examples: - 1800 - default: 3600 + default: 180 unevaluatedProperties: not: {} title: EnterQueueObject object @@ -42501,41 +42631,6 @@ components: maximum: 2 description: 'Controls the randomness and expressiveness of the generated speech. Lower values produce a more consistent, predictable delivery; higher values introduce more variation. IMPORTANT: Only works with the Inworld TTS engine.' default: 1 - speed: - type: number - minimum: 0.5 - maximum: 2 - description: 'How quickly the voice speaks. Values below `1.0` slow the voice down; values above `1.0` speed it up. IMPORTANT: Only works with the MiniMax TTS engine.' - default: 1 - vol: - type: number - minimum: 0.1 - maximum: 1 - description: 'The speaking volume. Lower values are quieter. IMPORTANT: Only works with the MiniMax TTS engine.' - default: 1 - pitch: - type: integer - format: int32 - minimum: -12 - maximum: 12 - description: 'The pitch shift in semitones. Negative values lower the pitch; positive values raise it. IMPORTANT: Only works with the MiniMax TTS engine.' - default: 0 - emotion: - type: string - enum: - - happy - - sad - - angry - - fearful - - disgusted - - surprised - - neutral - description: |- - A fixed emotional tone for the generated speech. - To vary the emotion automatically during a conversation, use [`languages[].auto_emotion`](#languagesauto_emotion) instead. - IMPORTANT: Only works with the MiniMax TTS engine. - examples: - - happy unevaluatedProperties: not: {} title: LanguageParams @@ -42589,7 +42684,7 @@ components: Voice to use for the language. String format: `.`, with an optional `:` suffix for engines that offer a choice of model. Select engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `cartesia`, `deepgram`, `rime`, - `inworld`, `minimax`, `groq-tts`, `mistral`, `grok`, `smallest`, `fish`, or `speechify`. + `inworld`, `groq-tts`, `mistral`, `grok`, `smallest`, or `fish`. For example, `gcloud.fr-FR-Neural2-B` or `elevenlabs.rachel:eleven_flash_v2_5`. Always name the engine: a bare voice id resolves against a default engine that can change. examples: @@ -42607,8 +42702,7 @@ components: description: |- Lets the AI vary its emotion as it speaks. A global emotion, or specific emotions for certain topics, can be set within the prompt of the AI. - IMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia) and [`MiniMax`](/docs/platform/voice/tts/minimax) TTS engines. - For a fixed (non-automatic) MiniMax emotion, use [`params.emotion`](#paramsemotion) instead. + IMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia) TTS engine. examples: - true default: false @@ -42618,7 +42712,7 @@ components: Lets the AI vary its speaking speed during the conversation. The speed behavior can be defined in the prompt of the AI. IMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia), - [`ElevenLabs`](/docs/platform/voice/tts/elevenlabs), [`MiniMax`](/docs/platform/voice/tts/minimax), + [`ElevenLabs`](/docs/platform/voice/tts/elevenlabs), [`Rime`](/docs/platform/voice/tts/rime), [`Inworld`](/docs/platform/voice/tts/inworld), [`Smallest`](/docs/platform/voice/tts/smallest), and [`Fish`](/docs/platform/voice/tts/fish) TTS engines. examples: @@ -42904,7 +42998,7 @@ components: Voice to use for the language. String format: `.`, with an optional `:` suffix for engines that offer a choice of model. Select engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `cartesia`, `deepgram`, `rime`, - `inworld`, `minimax`, `groq-tts`, `mistral`, `grok`, `smallest`, `fish`, or `speechify`. + `inworld`, `groq-tts`, `mistral`, `grok`, `smallest`, or `fish`. For example, `gcloud.fr-FR-Neural2-B` or `elevenlabs.rachel:eleven_flash_v2_5`. Always name the engine: a bare voice id resolves against a default engine that can change. examples: @@ -49193,6 +49287,7 @@ components: - created_at - updated_at - duration_in_seconds + - error_code - price - price_unit - status @@ -49228,8 +49323,10 @@ components: examples: - 2 error_code: - type: string - description: Error code if the recording failed. + anyOf: + - type: string + - type: 'null' + description: Error code if the recording failed, and `null` otherwise. price: type: number format: double @@ -49243,14 +49340,19 @@ components: - USD status: type: string - description: Status of the recording. + description: |- + Status of the recording. One of `recording`, `paused`, `finished`, or `no_input`. + `no_input` means audio wasn't detected before the timeout. + The media is only downloadable once the status is `finished`. examples: - - completed + - finished url: type: string - description: URL of the recording file. + description: |- + Path to the recording, relative to your Space URL. The full URL returns the recording's JSON metadata. + Add a format suffix to download the recording: `.wav` or `.mp3`. examples: - - https://example.com/recording.mp3 + - /api/relay/rest/recordings/d3444402-7b43-4512-8735-9d5e1f387814 stereo: type: boolean description: Indicates whether the recording is stereo. @@ -56570,6 +56672,7 @@ components: - created_at - updated_at - duration_in_seconds + - error_code - price - price_unit - status @@ -56605,8 +56708,10 @@ components: examples: - 2 error_code: - type: string - description: Error code if the recording failed. + anyOf: + - type: string + - type: 'null' + description: Error code if the recording failed, and `null` otherwise. price: type: number format: double @@ -56620,14 +56725,19 @@ components: - USD status: type: string - description: Status of the recording. + description: |- + Status of the recording. One of `recording`, `paused`, `finished`, or `no_input`. + `no_input` means audio wasn't detected before the timeout. + The media is only downloadable once the status is `finished`. examples: - - completed + - finished url: type: string - description: URL of the recording file. + description: |- + Path to the recording, relative to your Space URL. The full URL returns the recording's JSON metadata. + Add a format suffix to download the recording: `.wav` or `.mp3`. examples: - - https://example.com/recording.mp3 + - /api/relay/rest/recordings/d3444402-7b43-4512-8735-9d5e1f387814 stereo: type: boolean description: Indicates whether the recording is stereo. diff --git a/fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-1.webp b/fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-1.webp deleted file mode 100644 index c2d5833cd667c3c4c99c435d0b6f1d464a92d8c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53654 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

BhzQGvsN+kd0 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 aY02q7O5gt?*X^HG@&6y96x{)m0saMq4$bEP diff --git a/fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-2.webp b/fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-2.webp deleted file mode 100644 index d43494653257fd4a55e22e5128dc0199742b2a9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33858 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 R|KI=E|Noy%lL!U&e*t!sg3SN` diff --git a/fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-phone-assignment.webp b/fern/assets/images/dashboard/campaign-registry/sms/TCR-wizard-phone-assignment.webp deleted file mode 100644 index 6d24e2c9a08da84044ef4d8a29d0cab311fb18f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26772 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 Xv{f_@GCb>G?c`nZ|9@1r6B7R)P@lJM diff --git a/fern/assets/images/dashboard/campaign-registry/sms/brand-details.webp b/fern/assets/images/dashboard/campaign-registry/sms/brand-details.webp deleted file mode 100644 index 1ead579e10efdf29813a970525a90f0fee5ee4df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39744 zcmdSARa9k5wk?XgL*nl4?(XjH?(XjHE{VHC;_eQKlRyHAySuHMyK3*MQ|H#Hd*0`Z zub{QrV$K+2^wE2d6(~!Ii*x1x0cnT{E2=AU64L&jBaMUP0aH^!*nslev1dw=5*HN` zsXXrl!be%yzZ-OXCc&ut>pb<1Ily;sXETfg_WLTfxxV5&K!7qV2?*TwP z;NgM>Y1Y3P0038SfdMZMK!A@`f<=X+ zzQo?gx4t)yr|ortOM+(nl~1O-fGt30Ks-R{;|P$@6YwPP>)qEI{gxzcG9Nlj33b+dle4hFRf2zHAy%Rk4-4fgZ`d^~~ zCZFY<7Wx1!0LKSI14cuD!0*Y`yTm8r?PoY(Ilu?N0?6MC_}htXz1NjmETKCvNdit zeDiJdV`QJ&oc3=QOf|B+MAwWha&?Z>qyh9!pWtYlalhUwWl zoY-5n-JI8TCl3{-%Pvv+cv1n_Szf1*l(K+MQ?qaU*QX7&{+j>uo0%Mqu3c2iM_c)R z(wI=NU~6$FXvgRb{!F_mo4Ed_c@-MIgC7iDhT=v)X<~UiDE_wM-1NPBl><&~yqB0d z4JErx{Y(ASf7saHb{-r2-IGiJ`;IFL&oS)7= zfN|ectha$$wTcN?+H5h>4_WZ=NJlKs8ryVYluNdMlq&!1ijPNdvwrc=?Z^L_--MXN zMu3DW7*p)+Y}Rz(2nMry5cMA-om9P2LKILR&GBQGZ;9FJ0iJK%XX`77;~uWOc*!XK zdk|vdEn2_wq3~Av{k~NvA>>UVe%Yq^Zm4J&7E*Ydc4xjJ1PAWYmqoU>2SC__Z;`kS zr?8&>q?LI3|0BD=gesjpq1IB~ij4%eB*k=vPZ4TiHn+q7u_XS(PX0?i69yG6XbcTH z9hHcviC0pQ#x=%mqls>gHZj_)NXf)wzjI8JV3fOowE+!;gl8x}50BS3)lx&D@~?U~ z57B-r4nTLeWfu8iM|w`}_3bhP)~GZzq1;A)QL|O_zD{8d1S^F%IcB^BrOGOUC{8ha zkC!$1d}Sscn(NAMW}+d~1T{WfNkh`v(ZYgdO3*4dytV{tb;!(gl>=s5-c0v8?P#GL&??gyg0~iyr))%d)=V-vkiqy<=jq`8MbjsAUH> zkdeSv@>DdMxC^_7jd=MNbJ&EFb}jeprkf6b;k|Yj_6nL{4_OjI{MCi)z(&girf;)< z2&g7!Tf$2bdSJ7^Ff#v;2c}jDFje1>`6^9@WEI9s6*$=-8(G~53fvc@ILgPuaN+q~ z)g;o;R`pi=Y46;SjsX5`&Q+{Tv22iEDORdY6M#k~th<3@_Dr31>iHBSP%MCujWQP@ zgH9QENnc+AEi-;@Ns{-#>$tN!q91ss)4u^dBj33>s}DUgTg6wbY$7nLcHr5w$WUa8 zo1CrQN=gqQlmJYJ4P8;fD1lgxi#lQ?(fm=I$5mt~Vud~UHyc)(r0iJCx#PM2C*uA~ zh5Y|+iX7Tw0<|9@EQDx0l8>Os5XLZ>uu_s6<_Tm|fm)m3gJp-<&0Rxd@Edjh7$93O z$gW1nE%tsBSGj5P`0+2`0qwC7IMWWP{ebKKw_sIcqh;(TlCW#rJt-Gg8EVkM_b^|9 zip)?_u+1|5?}~S2ge?p|#cKUy#ON5N@5iSs{eCSQX}{#v#1W--BTP!2LVZ~YVdp^I z+{rfcsZD(udI>eIJE*%;AWfi%_E!s5qTn+<>Z-2dh4Loe#0#8H7Q)UILE(LhcR+$> zjtC>JWWtfGV*lE8IBWZlJ^`;T>6HHcZK!In<;D0nDd@`MF47w={`Ds?A-lTkObst9 z)St~2>OF>oL?C>7QR*S*tfUE|TE%7w;1&(r!p#Gn4qNqD^8RN)0u$jFUB9e)fD=PM z?W=%3w9_}C0MQ8&RWG@1qMpv?YmM*iH2m{nb$HDr9G6s);vL&#y@>nBd16H2+(^YAqn0_+|=;=hu{k<8TChF z-C~WK!F%?FEnYl*>_@mYp?V+f-}nv`shFQT%jJbCXCX%hYFC-y$BOj=9&^p$hAeu- z7T%u>!X)(+@4+hk4Tn0*UjB#K=7=^|HEEatqg{8I6H{sCU>ek=$D%*>OSb=@Y?kRi znG_-bk`3jbq5R!82{wcN3-rphy5B5oMXnI4|HcoPo7%N7&oG7w5?jZOO$-eYZr#z< z^sY5|I>=}Pkj9>(z#xCm$?t_gVfY4zL)h@FjpnrJ_4T z%g)M+At89`Yea9SP@8Fpq?fId{>*E`_2pWY@ZjxL&;G6fab`}$SVZ&(KL|9QVSaR?nj@5duo?1;ihL0RXBJjlWbylIA!tp% z|AE8Mj|Denq5QU{&VQui4or)MYLWyE7q~=fsb!QLGy6|%SLnfOf^9(W z+~zO-wx@q4A$Ob*UxE|!(htQ+`i z^8mu|yMOXx@82b2!VtT+3l8WKqaJ^!9wtt~Cn1ooEmaP>PpPgogkhAhm%^->c=aNZ zv9yx$F9V6&QbL+BBE^cOVpO1LCemJ4lqH;d^TZJwC$8y6&@cU$vgvvMRE7?`F^&AECPIEuHT#O9G6eT*vRUCzfm*M<x^X=-k-0%dmKP##(mN+=)@5)Vp zU~;JY0g2_m>ED3WrS`v3$lr^1gCM=Sao!xdnm6Dt6q>PT{TB`kjCI}H%D13ejBpOUom_NLUc!cySSS4<&4HPZ4Mjz0i6X zQQJRJrmF5)Dp!SU2oz-?Pd_7xl!_lKfqi!t{T@FmFb~vhgS5Ilry$Rw)8*6meLfuAsj9hM=a{|Ma*L zt}vM8iX9>>L%kXu5tW$$%MgB4Ww9B+Y^2cTKk2vY+YI#5gdk_P`YSF3`P06!=0Fxg ze**M3choRj#|tFgGGzj%rm-i!U`_+gBO!-=t;_5)&yW2W&i*r}QN6Ojt(C@@?VbBvYd z#M_^l7I!oN!5XC8FTe(MS5_64EtLH4CM75hWB$;N z3-T{G1N&i8@|H(Lu%QEDM$nE48 zl{oex-S8hTv^%3We~WYdl8K@z;0&bFUVu!o8mNEFiseYQRIOP`d--^S;tux@9rjO3 z`M-^M!U(Jw1ES`lRL)=B_CGplNob%hNiZs|fdUMhmkgBfQrBxeO6~L%3x<>~6SL>( z?^9;MWIw@mzgC1fz8d-oky21l6vyp|+deFo5avcRgTKcVf`!x547_e7Y5w0|^KVsr zjK~A%n$}``oy}6}U&8etl=)AE^gkav{O>&GzkT<=WcdGe0PuSSfqSEjKRnFe+)nsM z%djw1%JY!_`YsWe)VooiofA?p=_liMYkTCsnxHrl+1S>9s>J_gWd6T?-Tx+7Km%T! zN89~sZm?~jE2fMTDOY%O8BvEoULqO?rk03|?=9>Hi(=TU8z1!FgUA1p?*FO8eussb zQ!usr2mc$RsrS9~4t!ZbrpmW#v$1{yws1)k=!#42_D1l*+;^^3v%)NYajrCtegD+5*1VeS?yhh9@aF0UiHz$N(Fs_#U&8~#M@kxx7>(O z#`u8l-H{6k5c@?^3HgoTc%FfB%OiOcz_;VXri0B5ab)uOzeL?sn!S1M1S>KmJp zPLX>gW>N1jo4LqH>2h_V7+0}sd8$sIJc#{p ze4pwyJsSl4QEa(C9g7^V5!q~X%L^tiCu*aQYmn_9j`Y8VGGRoR6#NUODm_$R_|&>- z7&VJ=hw>j_M7xr3W?q*`{LA|M+oDeXhn4u7Mf_ht6$1$96L6lJzZ<(Ftkf8O7bha! z831@n{*^Y-cF=$w0)3dcC=o;9mz>$9A|r3*`S=53TjO@}lbHqwF$P(X{lvE_5L;c1}bd)WmHb7QeT zo5&Su!QmJ~yk1E){bfzvG?pXa*{E#4pukip`xI4Hxvh>F20}b#XLD|EW7(I0t3c90 zd&RG%_E5R0$ij$vB#HoJAzY$!=ol1!&oX&`)&Gj7$9RL03PhlwChyE5mcr18Avycp zKi8!Sk$Y-Sxz1xW3%HULqHMaqsaA(taaF0uD`AUPKKRyeWiTu*8T%m?u_jp)N!?Uo z3n4}*5T?j-D4J2#tQvF&f4EIkM)yI4a|iwSy9K@f_6cNu($@gnONv#|n1{`j?KGFY}&vaWQY=oY0;sQ3GmhyQHJV9)0ZTbQEyrNBCYU^Mtg-7*A}V|(A1QhbLU zYl0~javhIKAZQAr1SSBT(?Pf}3*R>P7jwX48*Rkgr-0Tuvo{=9>Gs|6rTVlrZVZ>x zRG%v&w66BKr$#KcHl3*({|H6TdT=LTpY?^N3Wwk9WT{{~w~O!l8x75NQ_S&U{=}V} zj=EtG^7kX3#;;QYTr9nn>wCwI;fiU?!RRt*Zfy(6F{D|`jiTYl_0Q>d)+e2D0pD&{ z;rmlx;u5W2Qz`f`ap0rl*_#?*^;#JEH$cbxe|?kh#9V2L5^dV=?S65=3uQTOS>ys9 ztjBTyDM$T+xRl(or7~Lp1jOB3c~|Myb~$rMJ_XJ%HlGCZRyU6kS*SV&hSI})-o(|l zENTG<ST+te-9@ z*)CheGzTnw|Js*}-3kB3$1%GTP&j6C$XzMeZ9C2P2>x;O=8wiT!A~oLKo-az1k1a^ zwTD);i!B_Pvd11cjw{~Ty1;R*Mw?uzv|pkpOdnp08bw1C%2_?RXiQrrP5efzUJ3He z#^*i}`os!s>jHNnstu*r^AamYIhJ5>6JufNuzKsQpDm2c`0_MzgZTLOf57e*$m2L!|0Y$vyacVb4sJsyU9TP?k% zkXmmM3vI0b>1-AC!v?QPua5wI#abU za~c8_$aC3jCID`+%v$IwSa3Jy^H+dtfOR;b#c}+ruou~Gc%Ox<(Z}<3TW2PdVUqoR&sOGEb{Xabet?my3XZ!1t`6pC}f*~4@LBecQJ@{uS4mW zBmqNqDfO66$wW|-hq6KwW{fU_&857ctU%lqo#m`f=Idgz^$P9Rl4+M62~FwLV{iR6 z8_v!rvaMLqw6?(Vq8YcOmU3U?oD*-MhJyx2Jz!RwqQkzDxw(mIIJcyG1pa8n5i%8o zM!6V}8X9Y0+eNXi+h4hb$Z1F#Z#63zsv|{M-807vJ6na2!?|8yi;(}g83&Q=S>eD6 zI7i&Mhzw07I#0&0j1J)G3dgxGJ~E{mip3-AyN0BUs5u{#9J?RrAKT1CcDVVFq-}eu z)>(q2xyL7=#9jYf9n`X%sp%pC4|RpJ4_6Ka?}Dk%CSb0DNwhD;q}$Fb9OGkgxKAzi zT#)8SmXuAe&V1iHC3Z?29^{zZVicF$ci%cCWyBS77Ko{wITT<9mtnUN7=(#tYoIT( zcr;fcJJbx)Dpx)da>jitJ4D>V=k~c*s#*ibi1eve3mZQyS5G=qw5> z=;U|9ux4#nesOCu;NCo(c?vVg%0n>s!w1z5!`tli=e>fJ*ZR!&S*4EV+?76}TaY$T zfn5nBE34&prE62Lr86SFskb;i*U%seYXrCt2o(^rH&JjLLjubgkA$m(OAoxPbypzd ze^gK?k*qS@h6n&Lq^2N0gfaj`C~>-sgUlR&Lpn4>3iPN8=Az#lJ||DUGA$QL_>p}r zGBIdCcAJ&YKqnBWmz*0`nCfll>OcvIy!UWw%ZcBZ|cII z5P+CVB6uGe6)H9iGl!X4(`HwHDd=)nfzj=iH!;6Uuh0HfKTyk5{VT18dZj{4hEnQ% zEKw?ktj~4Zq%>v`w0(_&WfT2;RS-Do&d4D|fd*Z)mxi%fHH*&FW6EiV3D*qkAxP6F zL>;(&{DR?I0Lsm`S392m%s}GJjCBY>VANJB3{7Jz;b85#uft5e>FT)C{FCZ*J0npS>4=Y~t*Iqx@Jf_6k`#G~L0 zeCZBQlMQ-|O6o?&9sj<+8&Vj_<-Gi4LC{lA#&^&tfFl_yHw}9t3LQx*d!y38(j)q_ znRZf;iZX4b$D7?wGYgxIe2_+?fc}e{4Qc`9=HknA$YsX4{ivVAuvNb(QYZQ zYXmCf^@rQhH6xv^`8ftEwVJW+m;^;~NG4F4f=!f}Q(<$9-RQ)dvZE@nYpBqoQ14hV znUxCYz`k;}j9$W5c}%{K$S)XWz*fQ@${0$N-0Uor&7CO_tT8ljU?DRw-;YVOh+Xa$ZWS`m9Ge%c?>Sb;0#6u^1E<%V|*(q`Iz4K z?G1W_$r#(!zPdPlz^f+HX`}SvAE;6VAZv|%98Oe);gGNb!R@`6w1E~t9&jrCvYEvn z`%22>8ulYX??GkIs2R*;{?j1#p!B}_o`r^^d1E7AmQ!*_6ODWe3D_%)*vsf#3*9)~ zMNFv*J&8Au5Smb5msC;;b2kxQhL(G1d;KrqlP541)+@K?#I}fWcXBpn$`_^wDD`CG z`+X)?Xe`IgqV$yScX?cIOt?=R<(S8v%(FcV-qdHW+ix=s57y zbjcH$<1ah~F(Dx_T)7v*XGmVb9ywGe$*jP+HzrRW8G2EzXvzgam5pJ=dEIm(?gY>FAP@7fv`{;D$;S)Ok$Jx= zJ1#gGILCP&S1U63Y%s1lQXt#wX*?uAk))ON_d_=<`{ZB?Gc@muloHYtgRX)WRB)T# z^X=g#sVZMI#g;E>p9K!OBov*Nn9o^<9Z?jpB5f>CBb*=P7V67i8wd;K#Bec2P0F#7 z?Uzz?uyV{s!ZCyBk)ypvV)uX1l2v}RU88S}B+&#P6X>?lQC&G?>$aanz#v+(+=WnW zHOA5jG3T1ePsR$HJ{b;4CS8I^#Y`vFHUEfsFoc{dk9D-Vu@=>7-_`3|n z3x(low$3vsV%??X*7JCnQ+o!wpt96gl43ChwNuJ?8{6vx)Bw1 zc#m_){ze5cBh=%1E!R{TRsSI+BlaZrK=-jvLf@UAEsg&E6iLcvq|7>@_*wXyWQzJc z&GoH8E^{vJ*yN%`bkL=puG<6K24YT3hSNDGT!x*>(odbcIitGb)_Ntz@n{7)siY}v z6B{3&CX69}v~CwBtZy9^YwVTGsg6lVkTG_f>p?WLz(kW|BxQ7K!5hdjWt$1CqpHRq z+KSgGf_cJeQ^$cIZYZo<~8uSm7FGA&{lGJg|VxOL; z(o~7sX`cvty~#?>+%!_2ySg1gUnG8`lMG<6IrD&`*OL+(J0r4(?!_`OuRym zQm`N895J6xraBZMkI`l^{LX~sb^YvxB&IcdnjGGIQTF?`K^v0~=12|794R_1cpeVr+$JHQJF!JS`rLY? zbVmKqA-7n%k65MN-g|1yJzlgaCiG|*Pm}X^S`W&R+VKMik+GL3cphdD3Iuh$fnNyu zh+yA>?I0tuz2#||yO#mJI?Zs@h3~!rlVdAT(rQ^xsbLB9L~4~rdbD;OyV?p@bswYY zFYA!kg=Jf?iFy(~zKb-y95-&)lD5Wt$)4 zcxx=y1zcSmINnTljo{(DxDo+0>yFY_lM5&yiVt`j_vA4h5~Q1?7)q7Z42R@mlPVc> zrtUoBcKF$cApN5AirE+m8&^ZLrxARziUs5i#}npCIkI;Bu`e?)G%S*JmWqo*n0^mFOzOY(G&{jtVqWSK$lg|%3S|e`+^0lL=TO^` z@qrgpE=^xzo3uANKW;#Gr$DwR#ttUB>(Ftk&~IcfkKFw|iUvtnXPZ&XvlN!fuBo7; zjA497@mKAR7RL`D2ot^-0CEO2Jh$MH2dfqX$I6&Muc~s|ru!*&)r`RK`IqSE^5|_f zgblvg?z38u-RSM&D0_I?u~c6NLK*GL24&YwmFy9TU(XT}jB1!qU))ED6RCHHNsEQa zSL*$)1JDJYTbg+DB;x>~O>&NlCG&ys3k5UtWZoQAfv-ucRQb>5iw7RTk4MED)IMaQ zv&zFLX{s2UN3WkUu!WmkgL@u4^T&K!L}opqI6x~Jq;`U!3g`9Zz6$lckVyeH_xOdeJm0n zc$quoP&M+sbb{7>@_&v!fExiu@CIUJ_4#XfS32B&+!s8qF|{!K0Eyw9 zqXuN3BI2rI;8+e>8F~{I+z+9FpNw)L&bz*b0S-VR8PCap@g$2AN<`4Wbl>ZQ48!w| zfPv`ljc&0EFC6A%(7~NtSfRoj-Ac7)Sc;TvludHUtc>H&N>cPohSp)wLu)XZRJ$6s zX^RkqTxY2N7 zcqq<&wYt)tAwj*VpNo|};}FMlx9#TaPH^DHs2!YSS^oTDhxrmFvy@QG-(%JpJh~SN z^RP>hTqn=V&Iwt3?Pv{>ADG;P+uYCnB=p$}lu8^+&>@N8 z2;tY2vX<%gaJzc?h~?<0z5U&`vBII@qjy%7yarrV*rayXk70FQm4G~~hT%h{ND?2Q z?(AJfcKR;4QMF)6cN+V$pe&)(t(aGYtwISDU_j<@U5GXMXZ2^@j+taBucU`guk%h% z3n-EB8R=lr@lR%E`C@IvcVx4IK9Rh!Y7_7re83k3W(t#NuppuZzsE(OMKcyeQqqDi ze5D-k3k%G|!GkEeiHmTgYiI#!95GU=zza%wpJ9msk$%{hKRo3n+V>|?D+|3l7d7|G zh}AEWXs>Xo7dZE-`+gF(7K}e`r0rBUsyKwZZs_JSYo>D}xyR=T#7Rnswt;DN^E%@# zPZpb#%a0YwtT33;PG={&*dhBAaeU7AvfdVp2!0wTZsN`G)- znuR>!$Vo@I(x~T$-yn9fdZIw|H)2W@Ua78g%oZ}k-*w9mSR z2Ys|izukt7b(_FF!R6WJi00PVepDzMiR>Il{Q@rSA0ZqW$SJ+L0EJBJwU3P0CsHcH z_;UYi{Vj6Lq7Oijkc}^jl+MYg4n6up(>$`~T@y-gWRH=I;%#c`?{Y$IBqFe$hFUbY zaRB8J2dr?is>z8uJklYX?MyY;Qv0{I)19VtLiEW9Ux0$-oUk65KQWz0&I z8(Py3y!(5xz&Sglb-d5VXOsYbaM{+++5M{3OSF-O7Hz8a0Q!1g-2;?dsdZR#%#iL$ zjyk@JhVWO(z6{x8ub!15TO0XCJK5Yfhpr($I!oj!rRdhND@-79;$yG|HPk$A&^GY^ zAs-|6EQcLv#Ac0+;s{c4uhAXCADq!|C+M}#Pifd2A212M825bGW`YnusSoWf(gT)t z46-xB+LChndnl!LFi`bEV8NBVjBD3@mUQEHSWdc59-YNuF1H1y=E5nR)Iib$zXexe zjc)kR@7M5#fo^^>f9o-GhPRYAeVKLjbVArQ+qR2Czouh*Hj6}1z@MPZ*jl%v2Q)7Q zs!Z%}E^bu{El>$v3dOs8HZ3b`7=b84B59aF3&UTgog>%sR{%wq0$F)P#57rQ9b_MQ zg8NvtzDNF{?^OprCjzE_JL3O7Kw7M| znm4ykMjK(Uvs;TWE33UAfw}CqPpjq~oOOnbbLF2`(pu24rs>Az50dJGmQ<=@^fvc+ z6zw^L_aAbu^EU71-#q~o3Ojs`5Np<4{hp7FrTSH)Zds1^M0#@)?|a1plN#3*ma;1t zjUI)%j{_0amfqW_*gNv!=r3vWW;!a&58){y?DyJ2(e^#yrO@bcn5obH?zCGL5cjvo z10iPYPtaY8Kz-JY-j20zM2Qat52k~}9RRKZ!BdEvL<}OSS~iLx;i5Z;C>tBVJY_$i ze(qRdpB@$2_>rvdv5ZlNgS`_|`_|ig!wIL`WD(J3({c872$v1?gCe@&N@zyz*qz8k z2fi88?T(S6Wraqbzk(RQLxL4}vN*`!V} zW>QoztF25MFnnA*Lf4o0LB~=ktn%sM`pcJynp7b}%Zkj~NC+8-+8}BJVscPi+YJG5 zgkSHy@>NN12fWuiF9-bM$Q};tcrmw7NpD~R%JLpk+i<_4nd|n!4WwYs-I+j%(;J{9yO zg2*k zmR<}^{R^#WOt6g=ds5nFPb?)4NsKxmI1$P}=9LT0h8cyG0Oqrx2=iO!v=H4o6)3`S z6!SbEA)T>jiJ<4LBl-EkIV#~-=8$2;km{u!*<=+Ef5SY>7SYF9@%_6ros|Peq#VvN zI|2lG#oLxqbABdh^o8}U=UmfH0$RCNha z_{!l7A#j(xZD&bP^qyk~{Q&kI=(9rmeIisW_}tee>Owj&dfKhVn8H0hjGo%RlK;)M z-3wNblJ#(nZ`e=z$BZjmWz9KSl6RLG&iC^jyZI%j5GfOEDxD=#js&>?z-JTaQeLED z+7kR22W6=?!>erc>L+nlDr(-15VHPx#IF1*6~pO`Z@DFBo-0GPaS6{!*^Z3B=)wrN zgxHYugrF(cc_u`Fe96xFGtTr?IeT56ykCZkAi=S@1C6YuXPxs`;ghX}JHbcHpf#EF zEbA-8=s-%QV38c}WS7_LhRsW_T2sfOy*MU_`jtfkw&;59z5T#3@iv;%t(fxe?2F); zj$Gl(gP$65F?RSJ{E$B3DH%r${P33*!J)*>q1*n_mSG;89Lz1QBTlq8vQnUyG{+RA zbPwk`9I?uyy3ZopN~~KyIQ+dHy=uSVv264BkK@#TdK`GaT%0FVlI`x>sAwG|^BKOC z9h|qY{wOB5V#XLZMW*Fw?((R7$-l?Gh4(F6pw;0dBn*B~CM+U=o+>D`C|}Fmr>P4- z_K8nC8mTK>l!oS?{&}@N;J9rLy{Un~Hm3nN>zgOR@N4Xo1iqtZ`0DkRE`r_Xu(gO6 z(8wm4z9zSo$)FZv?bOguXfRcW_mg>I5kwX z@OxXG0UtU>taPjALf~MO@2zpE5AQo4`nTOx@LTZ3tPzEVf^N6;<6Mq=beYzmwBgat z>Y2KiEkJ7r;@2f9wL!G-#~0PQb6Vc>X=t>RR*e~XL$#D$aG?5j>zZH4o9v{?DKg)? zv}T-ME&C5*q>_9;e_&PiKdzn4eqS7~av(QEt8@}2teKdSICbZ@wDU6an^M$Al6rxF zkZx1qjLQIXSCLbz_Mt{SiONK6FDyYK0;Nvkaa1_=OcMps$XF2xckl3SU&by~A!vUtuW2EN1rrNIikWNC6hvhiI@n4Vc1i>U1=JceY`^cbAh1Z)E z6rok7-Je1b{1mX_bN_`HPvpxZCO0d)G$CnojE84ahef>2f#aHPo|ETR>K^@(b|*7llKAm7FI zp5?A#x{$3KG_a&PHZW!@v}2zKbv5e7JV=c*e~h&Ate?`7_HPpkt$2Tu}I+zks!F`T9$U(%H#f znKW-4bEOW4=L_Q#2W{X_FxvxDx+L!XV3yq!^2F@vwo7n+ua7n^Cn-U6uGi)39Jm~g zl7ksK4R5n=R^7tBbBMF1q^ByDw>8PIKVv<{Yz?78ZulFB(D zybimcKG!XbmBW~&J3B-C!Ht}q+I4;`p0}Zrb=X36{)92&KC|(%@v^J@py1`FJ~)ym zSu9i91(vabh{l1GY}!&~!`fZS$+fa7MBv%o1%>#jlrdA<#ysXAG!Rqj8zK|*1{aOX z?)*I0QVPA!kZ^XOhZpX$tQAT%i{eo2`$cr_m6;jQgbqrdIL&_V{3w$4q%2?247TG= zBxqqo;27nh6m`;}wW3^BYQh8s8!S85e!R`|4B3rOxFOcqSO<4C>Iy3Y&plygWM@_E zG2eBv7$5T$5AC``1(*VH{^XE@7fQKiAAWiIXwUMSN-S%4I^zYx7@5-5sQwa&0AiOf zNP2xzVxZg92ajlv<$N>n1N<&pbZT|LcU$PyQ`9<5W0^SqQx4#nKGqRbsXj*od9$mj z!MO!JYD(!k*5}A=fnvoFL0iHD&2xAdC%JZ3Vv72Et=ULI%SPXXRj5RK7vS?7JW7Hx z-Z=I_=sk2MyISa8v+2DEz(r}!r8U(tBe}%mXz5uW*fjVOrGH>zDpauY7Q3}Rbj44S zi;f<$eK4%aWHABhO6!1Nr1pCch+zq6C<=n@+1v4gMDihT%Zx@-Ne@flEcjp_B2J`U z2?XE9-R+(ZYt6(&`jy&vQ&@dijE?K_hMj57*WNSA4=gQL3yaopSHb-{u_qGKjJFyF zpMt6ptosmy5yY1FV^y5<6Aa%I&!o19sJ#11`+m#Brt2xUSE$t+Ue|iJj(wW>DhVEwAt9-@!v9XA{w;%Cd$8{;%>9*p&)Ts2?c6 zsFjUk;R&*Vt_K1`$B<(2`G+Ayi;i{2^k*jE_eowblwfV^;#_`ZHp9RJ{Xv*=u#Njh zrQQU|$XfI?mj?SY_sc2(^f(g*YQUxnlD8bH!mYt*h=+EN1`nWKWNvOizB+D5+sm6dGmL11W6|YWjTb z7+6+vggqmaW7fz`q#NV~Y;7CalaV`!7N>18EJ>{uC6L*QZh+v$iVeNXQe$iuI`U#197!q-uhXzd{=lv(&MVgiJoLIx|(xaEdgc0S$YW1*&{0 z-k>bg>1sA-;w0paH9A8M{j5McPX>9Yo*cxrSM3bv-odZ8jImSjS9woJ6bU&$`HX#^ zR}-w5xDpybXV*Ve~t`ae+sp(y%=w}+?DzSNddf?%R+7!__i{> zs8RRP@GJGM$EgOP8-{TQi<+Yk2fF{a<^07VS%@_v+~U?|hzm&A{*>WYD+OIMA?ngOmpnU)Z-s&T`&W+yd(x(kvRTa1$08dBiF8x$Jy#Lg+s3qfEC@P`5U%3M2 zCFD4N&)v2Re2b8L(+;bM4;>X()dClajy~|i9(9(|BD%Ae%g5d^@9`uL&$Tvqie$1v z{;Nt}@{C_g@#gQVK0!;a$JV%pGVSAS6W==VRVcpzU6)pvD`0;EU`-B5{PyIYFrutC z8g{F#!gbI5J%l>D=UrWkq$jW^k}7;Kinc*27&^55m)WpkM+OmURuDpj$Cp^Y=xnOp zMAVx0F?hoW^AmWhCUbxAVqn_GDAwi`OP=6iiO3M|d($pe`63l%irBcLAcP`y8jDd2 zwA!*-UR5E8C5o!*YtOcVfR#t11Th&h|7gT}bp#=PPEX_r4{MD0qCu zDztN;$<&q;qR7{KBix*l8H(PT<8dH;B}`j01D+;eTrF#rKPcDnkHb`^nA?fM^D^x& z6B-(y5^`;>?|6b?P#8_4@r3G=NNG^UcM<-6uSGE}-*qBmYhdg5Q8E;^KJH&F3rk!V zkM~HyJNvBTS4p{*#pD~F7O}1>fN?5BY_M$2q68klFo+^c(=R3`A?Yas-;>=du|UDO z=eR8edtUbRaJ+5kl(XFch1CaissY^yUvR6l4e^At`MF}PsoLI6R2Svwb-|r@TexL) zlEda6_Kf7~ssjC8V;^1V1pPExzyv_OLy^c!L15#%kirJ*uvcc_G&*En4w0-FJ$+=X zzVeo0kr_z%VM>f`gD-QJ_&RJnuh60*lAOxYFOXsQ)0_Ab)l&RNplNch**jD^WSQ)w z-UkDRv>^1;%;|_CFK~OlmppY|jRAXUHF~{A;|tFd3)&O0xin&2*sAu9iwf2c*7%3> z%I#s$U*V!@4=#KZ`(CceGGN-`v5_fd6rj?M$bhEnrzU7)}Jk*@MgwrVbowV;ZufhBuI?ztWB)oofY z%m+xRauFl$kng0Ul3^c(8X+<4hef>KRUKSFX^J!IDPXi^cxMKr z=qT0Cs_F}0APv&?!FYH$7vriGPJ=#R>w0V$E3tNxd`M(0I4_;hbGiW=50JE1d^or0 zQn~77Bo*;5!-f)~t?yFBFTKPnWXn7>)jEOo zO#wP>%q_hwUS);_KnUFsqdlzPI{GwnVCWKce{Id*Cv#@iH-_>KqLB}%dQmQZ?G~Xb zuyDcmz~$9I#e777CU8P6CxbuoVH%Qz8hPvIASIPqBrf?1|4>8OhU@1OsKT||CE9@I z#JoHyt(kx=8q&nQOALLv0b|AO5xN4o)V!VxjN+K)hVfMz@M1VA;o=g6z$MbX4xTQPqaoN!uDG^F z&qZC6!5>E$jccJ~-4cz<6sJ6n6tv`Lo{B6U*ZKKDpCLQZGgX&jfo|HMx6pXdi(82t z>O2j2*gv2gI-neJ*4!aqQm2Q)tZ$>B>%!sqZTNpKte}Ib6Dx?G`lCh?%Q>Mm!wBEy zf~)i9Go4k_HNpUlBLUqf6JKPEdote&;&dorrEW8!h^lv4;`*I!EtbW3+JAo{0M5m0(81f*~@0)9X45BaaH6+FXs!t?|bL_QWC32!Qm|PnT-oIl%6Zy)wN?-GE z&L8iNZ?I;+AkfP2^b*BTeEH$>q zh0ztR1|5jlyzl!Hz=LUFNM7rUqnu<-oR5mCgZ(I96|^RMuUTHi;@5~4Q}WHW)9FJk z&lMfdCfhe|DDcj(tO>9tjy3P7p(!L)ZaTTmB8kRiYfyj#mkhdv7(LtSATicD)ycb^iviYs^ z%_&Bt`&z=}M=XH#L)1cJKh=o0q|-`JN)*|@{j}8R4PSLPW$}pp#LSYgBgUbOV8lq- z&30W9=?edLFk`d!0Qz-|NbTqD1tW>3!~*v=MBR{#$^s@1dQ~N5wdvTC2AZSJ)DK6E z%6Ck-vfbb%DmyDTzTr`iBDJ%y@E+Kt%oVhAXV#H6tpRdB9Uf^PJLTSu)7LLT>F&#XGNpZ)Y|p{l)s;(TU)>m7*)PRp-+d!jCM)qEp4 z!EJ=Z-E^B+SZ30-dvO?Kif>U(TOBNVwQSpChYVDRcftrS+}u2Xvi{TsC+p{@G;kCJ z^@^Syg0I&aJa7>MzxbrzV4xbR3mdsAe+jRuRqnyU&YX4(P}g>(kh_M9(;Vf>!i)mS zjB2>$Tsc->N?fv+OQ5$x7_Bxz~P>tm!z(J#`?}IzvJQ66^;V1~U|@QUr1pgFDNwVd$-+yTeY^E#30S0!C-uMU4^uo8D> zqW(;a5hZ8GISi0%!&Jj(*`-pEfMEWX6dPf1$0pux{aDWGr4d;$0cYa&(dAFd67X9l z{rrwo%>=x6+XY3%Pp_l8dEe|C2lsyfkw9+0&{b20l3YT8F#%K+5x6%s~m)4S`0=VlG6s zV{(pCMT6Pc-%${Os%FIBnAH5hPsX}2m`x26O)DfE+t?u7#hFJrUj0^0n?=2$3>l(G zYl=|3%~M2P3LDl#y;sY6K&ZlzACC^`Pr&$HACmDHBD_**P<@7v={L%A^tq^gbjfH> za3z9~Ww?B5oZS2Oriy!Hxl_Xu0NsOvBVHG&L*OtK(qkki`-UOKX8h(m9#eePRk4B> zK?3&c)NMxouEi#NSQq=ekcXr^<~;BBAw1$dtkm_sYF=@SVJV z>ROSgdVObQ3|sM=1HdQ8IfBU=p`ET`$~c|kkA796n1TYPxD3G-63Q-D0K-ARhz#4_ z)V5|W0Fw^wR+o_(2>QiXZQ5sCb|;0=yXawbJS@6C5j@H?WWo*nYYBBzLKe*pP2$Vb zL)(g$>YeK~*nkfa3?#jo*NFWEr00<&y+)S{d^D|=+|JidLtR*C0JjrB&%P$~BU4KI zb4Zawemp{!Y`vTkfN~;i{LJW&!Fx+4u>O04mKW#8*=$r4Z%=$e*Enh`X^ze9jvHaN8^reqI2d6)g!0L~tTbbYB%gD7F zcJc&~;zNQ8&O_%~#x($d_o%DbC24W8JEDMGN;4pP^eoEHUPI(C3q?Db>@8>_A9SnB z6~bYB6MZHfEEUXGy;t<%=5t58e4%YRkxxm)bT znEc@EO#iz-J#AhfT%FFZu>jDnL%IQ^kTm{%c{nbwrSXsBU$u;E^RK-7<^czRm`?^l zTQ|P2=MH@rMr$7D-!=o&aVrVW8MNXqOc~9*G(HmI1%j17CtS zIE0xcvgc?+0;uXHgz&c*Y#fdB07Y|$@Yu;}^(A{hU~?2;Tojd-q9n2mmuh;f?|@H^ z%sdV#7Zq>dLlC)SL=L!vr>A=s#X;iTyM4GKU#DOn6B-+5kyOJowFm0H-$U5=Uud5E*9o8t%7OCWUTJ8BUQas&)nY^#qEXT z_FlQMb8ob2X(xjw6G81@KWd*t*JBaEta)jOa5S1z%d9^11FGOQUwh9?52aw*rD-K-*`z=qKdaFJ-H^@fYJW|)oRVjZQ);8r z)_{gpjkMMbeo>wPNwIY=CwnJk0ZhA4HZ*j>%Ofpu&({aa5frGFTd|fT#)qTfpVqK! zX|zig{;u2_hq2qsi2ln{7;T7{rB$W zz{O+q6+Yx&L0sXW`1#lfW_QS{u6mt)l4uv{868YOrmm{6t`akRTO$>;Uyp2vE?Yc3 zU?GavzhcbK%H@!puix(W777=nx_O@7IXXNIus1IUPDfj3XS4AeEpEb5X;+2rq@uz$_nIv-&l?qv zAhv`?%mQ(TFWl0h*x{wy@3vlAKJ2`Jcy47VIQm}W*?Ckua_n`fM<}R6n6^D9Rb=4a zk4fDJDMR-p(+DD+g?iPY55-X*uCME-G#^NWu#l=W3u`RLgd5>a!UY4Xd$6B_zT(zq zXmhB%_!ECEc3sitSFb4;>UNQa#k9!2R#ME-riyz&Y%_%-oA<3XXrcfEmSga?&q6n; zF5g$n-E$s7NWxqD^-H2*QLnb=`sB}`=QI!&jrf}PX^vO!)}IAJl${zxE8T9&JuYCC zBqHcLMG76Rw!Ip%2meXM(ToGb^aj~+n>N1FnD2|PIG|vL_WpZlW(ITg4o7D{Up**9 z3s-vvmO&4mHSuX>1HknAQ(Z|@@4h6VHq+>$L>PWN;co*Uebc%X zp`tv;O2>m!{)Qdghta_X#>2IX%P*Y!#tkz(+S>3}0Rge|w;gAj!p?iBiesP_a;JYD z<1meh+XC$RDJx1k09D~^{!6&oGki~nnG9% z7rgU>^JaC#)SLNf)usaK&45bVT)qR9C94x0HBZOuGEttvR1LeS2Sa&cpH&`Mr%rN2 zQ5~ywT{5<=Ku0S;YrW}t&N*yIg3U%Zp;u3i^tZeq|Ao(4j@@q5C{U=Y8%cK7nkw+v z57N)H{kTR8LZ8!-t7ttah&>`|rAh4PcdD35PD1L3KuY2t*!JIwCat7w;@#pS{-?^2nF;0B4wX5rd(AZCm$gwOI_K%#hX1Zjs*9X<|=*jgzdP{^+3$M8Vz zDbX1McqEVxjpBitZWBY#oo-iESr{$Gd#Ypdo-0oDI07EMi;z$tyn?|6Q~mO7K|E|S zw4%E(3Wb^qg&+U`001UA$^LvNCDW$Y#6kWfM;jb4D}WnXt?2(35X;E2v*W;v{z;tW zzzc8S$(?EWtWgZ+*+PL|c6d$7`KdQ6;gYN?O?0sV*02ULr;pv={YILgWSnouwH(D- zkP@RZnt7?>F%Hp-%q!>Ob01mN{phBc>ggZn!P*mD`0V4AqDlWSeFxBe2he>7(0vEc zeFHd_4BLJ+iR-46qo&|0iMax{=5%UI4QL8p7K5qpodMO|O!-xW?Q=+ht*{BR#r zLq1hYy_f?$efh5^CDMwBl|v@YJx?2J`(w17@Plp!V$+D_bpwY+Y(u=b5ecY;Yp4iI ztPi07+Cw&_f=hkJVGRd50sG^i$Ub7O?_VKvu7PC_eU|7eJ64D{>=;o~Ls?fcdB#D7 zp4;q%RXl~SAy@N@4H7UnsS2D)pPmTYgne=>DH8;j) zXCMZ$<)9E2zQH`v%_Y3MApGcns!s9ulJoJ3Jp z?J8lhoBGhL8@Mv&x8(zk?EnI>2h0LBd(77 znb&YRLv7m=NmhR-ySzXAKW!gnyo;dYuiUZ)` z^L&R8uw9(2T%9|v_v*|T+_8g8mn)BS`%?xW5DI9G9;+U|m6}e!H(4NxP=qaN6BG}& z^olAZGlPO7r#C;g#iqg6=)I$&!&hqSY_H|6OG|T?)Jb3aUa(ZHbGJI;OTdrV5k~8T zu=~9x$n8;8E=Y7@p}z>&?DyQ}>*9c;6|y)!7DoU@mHLfI&i3mgAv{?rE;5WDX}hA) zWSc+7OI<6B8L-TVy|5C+`^E8%Z21)C4+lpMR0Ai}Z{wqn*({Tc&g;zEmFqr}NpaQ& zVlR5NPzo0hljh#sV=bOdhVv#dN(3}M>p7EfU)2%kjzB~MCBB1QAB9&^JIVyv3c_k#_<-O-?ldhi7f-bzz3p?v z%Yr3{d%{%~twKKiBKIF^in_nezABtq(V)l^q@T6SP*MPjqe&64e0^H}l6m0r6VSV{XL9`G zfqc&|a?0qcqIZ%}BHfyc?gL$?1(Vk|PTvGlU(7M4lsdqxen-j_4yJ)W;J-Ao<@^za zx1ZE+jFM-VH9Ahl$A)LxK3F3Oi_QL^$mO}w?u5CUb*KX}G;PVRA1P4vIvz52wx)p) z(ZOK)ObhvfZBREfz4O!swx~|{=5sedj|s4ll#QNDf8;0z#jFy0aP^BNFlHgm0fAlNXP|J>(d?duE@Pqq+^laRh$Ps zR_8fqHRTY)9y?I|AKfEixs9Hu=%d3O<>N`Gj*pvxf<5k*KL`|$R$rT#52tkDr9aKG z>CjHGfIq#25VPE1t|jdU8tso<`%=!c50C2ZbBBqj_DOpRI8h-~n>d*JTh?E>WI4 z%jm&>$u?xYsW%4)`{9wV+tQBU%et4@%%z&B*J%c zab7BGh||BNPya%dPR;Vw4rLzs(>6Voc!ZDM1i%!q-(0q3qA-P)lRq`DK=TTqWK~yF zkTSA*r;NM#$yw7DpyLy#&IpodaP)PSCkDZu36S%ECM~?}&S{(~>wH>vFef?@*CKHt z>mrzEB>J%jantX-H`sI6d+_dbwoo2NZ)j%vgYA7g9SSYo!{>@7bO$QquwV!&ZHXDa zjTBVr92yrwdPG{0py4NPu)bJyuuf8TrP4U!WCx?d6orGz4!9HI#bg^7k3#AUYghsDB>32y;wzf^r=jkEaSi_^@yPok z=#R-9y>!9ER6%4lRc*;ejU5=9O`Y2ibTsI$@+LYhbzC;Tly&HA3eT$zRza)s)4lIB z3m=EdiNfzEom3?)(whdWgUxv2UKwtd)i-fVm!&Rk8!7@o&U#X^rz)!+S=-tL5h3{3 z$KF9g5i52eC%e+Tro7~a=P!b+*T{|OrcJVHF6{Jkp?BvCYSK@c<#-Ck*jJ z?}8Z1s&xQ)C4;=CAc45tzHo?V=vq z#V^HWJZ7aY@auiVee)wkux-Xc0Kb-u8m}i^50F3Oj8zezNvG+PJG%_<_c*zAMpuq+ zX7Umd_Wq{YbJC6)nLvn^Tq4F3e-}HoAyQ1!%=MTM9?rGW2v$d6kJ=&TmBOZz!?`#Dw`PG!Kjx60Qtvb z*>zqVyaK)Mv#jPi{^!kK$E={IaU*nz=a~+b`%+ih!!LwZnn#=O{wy)_np3(E zk!D>IWT!K0vfKyJD7A!@HV%VVAC5*UH*+u8p_%V!4qfbZMp1cZt2uWdj8Je}q=>6T zcMm>s!PPwC@~anHK2p%D`G0Z94-WKs#I)(sPRbgH8>V!1ICOjAJ4;RYxIs-j$N$3Q zk^3n35|4~__X%LKh2vdX1{7-K-((L>B^)k zmO9}sHchE-sp{(oSElM*9bR(Baj%{-+{aC~hQ+nzlp-&jnWp{_31uw)C;m!+nr1)+ zK!AoPy7x2q?=k;)kmN5N@4zb3@|MvYKNC0s>qzeaN1apOA4vg%Op=}7r2{8}TRIc> z`jV4g3UJtGWoDW8Dc5u3nT&PwjMz7mZ(ADj+|VW0*e9K_G`c{}P$x)z9#I{Y_lRaL zZ?Q+OdG{Q9@5|Yn9|k>)4B){`80{dY`Ffytcw*^Z?NiAJGIfh8WOxU}&yb%DCCUF1 z6mLP}jeQ_DV{0{-7|y>(Q3D#Hi_6Lm zjwn(sm1k}x0sGqeTgAqb(fvSh(hZUjf}NOdx?h$;fIYMiFm+2%+{nSwv}@q-y;6>` z@=YC&s7X%noA*Al?hF9Sh;v;Vrm9%U8i-B8*syHE3@biY`#`BAm!)yhpF=DU&=_-I zeGpQi#6d|-od=A24nO;UA1?>@zF!+=Fy25CpqDbip~KMh)t_8G&8qq$_g#s~*H8%U z=DdlCK6W`??M!s+UhYt7oE+V)qt;t`b7%3Ao$ll%;fMnh;D1WP0Ll+cO&y0|H+$ zvd??F7RB2IpkW;i)APsbJBdNsJ+55!YsxeVV1Q>O|Wk! zAP)p@bq~8spvl$ASg*4dkS6QSuaGRczQD>fbi#emg@1Ne*Jw>T56H{Ky5T2mMCOw=tZ# zoB#FDvhYvwzQTb1v}5od)=ju!U-5fVFm5u@#aPl748EL6*eQ{1$(UGLRv{FYc*R8g z$lL(Sh{3q6K-GmKgRy zsP80hudn8{7+pvH*wvA<@CN&;n#e!|_2Ee0KT32E%d^mo4RIpH+1_!b=>BAWPnqC%V3`<@r zOe{gcsG~0vvEW*Yb)o0}EdNIQo7p2(BBZE_Vn=j>z)xqLiF*J^Ss(@nK-zWWZ*#nN zu0snc%{&4z-8H{z`_+T|TgeM~ifmpEjE-K;|5Pk?dvb&_g52$?v+gfY)*#u|5CK49 zDWY_v6oesZ;{QMgvs&EEfg(Y66m11lhFcA~qcdTssmvMQ8L?Mn{h#W9- zJlN-rlI$+XZ}c#tjfh61A_dNoEV_Z%3qJV5gL@LKLrxDgvJ1OHnx%E6c!4bsOWJIB zHZjhbS0s(28p3x9`I`~nSRPqKt?;VJtZ=8wAS!M28IxdS_P;`CQP-!Z2Z*#!UH+idwv~BtsBb&sQ*h~xi}?z<2sy=GC)lvRW&uoD94m8&3KQ; z0@e{$-Xvd->CXxd9$3}ioF5j@>;&5kNB9=t=k@sb`{;$nDI5YRtu|@dXp?T1s-m?` z8B9PGx_?ycge61ePG`j))A+w=|EGKSR2IMYkJxYcR2IMgl>sT~k-#H8?XmjM9u7rR zq9pjw$rJs7Z*tCKQ%Iz!mnE%~m}wi(nNzKl(pq=UNGqWkd4JSFlUDV)Z&YN*(ey== zC-ZZU=R~r}b$3UD-u6pfR#U`%EuQun+(Y(I`-1H^gY|_6M>h-mF{^hSzG7MjHgzMZBbJK{((w=8Gj@Nl5^mKp>~D8BmI;4M-!u}6-==SZewLS zAv4czVQzHop6vvrYci_Vly!e0TwF)(W}7TA7s1MoI6uK^jQgLmkwxcIh}UmNfWwzn zpTWOT;T~cA&Vxy^ zDU-Q0vgC7^0c+tX<`w&ml&u${G~)OJ0ssI200001$gF!dZYWLv_I}IM+uSuvd~h}; zdw3<}349NxpZt^uL}9aBzdM?1V7ql^O&N;d;4QS)TKO8EvBVW z1>3jEWeEr`4u;Q1@tYk*n^Tl&tJDz7@ZJP89q!;}b5JSaHU?IuX~wwSE%u|i6~+dC zhK#nO1{biRx|2Ua!%iN+Y~=z}k}p`jCiA&#bWyP$p7(i>z4U)iUfi?&dej zs;djTy(R=h!u|@%*%XzdGX29J;gG_~O8*T!Je{oAsm9{9wjT?C+?)~J>D7x|%v#dm z5_lkX@v)O!p$RV~S7s5aLDSfGnnoPS2_piN4pG*B@~ak`pDhN+k0Q1^4$22wdi@W| z0{4Ha6^A^r1=SW0&CO2MH0kOsv??p;)Aw;-Pl;eN{p|wf`Cj%A#d_qFQd`pQ9(Ovb z$adTB-g5R*bOfYsAu*T4y$XqYKaUkT2^S@31{jEDFCmlCqTq6W*TYCzyjro_(G}B& zm`!^4sjaDydS}HRDehSHHpE#}llCh1(lyN@GLy~Jv34PXKG1yza>2MoU`e+0x%_cd zMTLQP++h#aKW|?0SpZ8`f`D|ec|dL%L!sUmjHB^;6e7b)a>QXWX5}gL&W|(y;)KoH zV(7&ZgcMpg^%=v70Qn%hIdrVE^7c$19@#mHmVk|!lDfX@N$=W_5zY1l+s^YD%S*C& z;7$v9{e=n#L5IJR%rGuPc(R4FENupoYd94+QCKZ-S;dkWIMgASdK!DoEIZ7PIr;XV z_-(RxT;lPAfbFzLAX_9NSV3=(V>N@_j^EZ%-mL0S@3VXTrSYHoi)HL_NYDeb-%@1wkv z&?W1A3lHWIn19J`W2rXE?9PG27u0CwsbI-+?%27ot-C8bm&8}+F9mCEvuGF9(U4XR zn+>Oz3ibt|3d~TuJlnN=7(L01BXe~K?@dapC!|4t6E1ja*2N?}|5)czLQZyvZ;-JT zJRTs8FD&F0GAUx}!ab;S2MX@74dfSO7K)aat$0Fq%WX&ctkuKc74)}agg8@*- z_VKtG|0Fq(kgG2I*l3Jwl@^2e=rMsnMbC;p`K`W*R~uab8k2&UIAu+KN5!F;18WvG z-XEK){xgKn#3lj$D?Y8nOS7*+cp8O5ap!8;r5eF*d~k1ioZ)3{O3nx|f2_ZEX;}_W zGUX2@Sy%twSF|%P<@#LJOih=x(`Oo+{X&ZuIc<7HFW*eRZ0GcYeQ8sBxMfcZT&6)_ z#}hVzAHWn(*gC3}8)16caCYCE#lpTf!&e8((+kBgA6yH`2_Yt!mTY#^ze zB^q+;mo>|a14#0BkKuSrI(qeEH5<2j!E6UbC_^Iw3*9qE#>B5e_}NtOkA-&K;qVb< zK`$<(4AUkQ!Rj4~9ilX_E8xi0@o zfd+NfkmYG55>U{9ts3bSYI+ao8&C=HIRCBV@Yq*pg$OQHGddzE zB$FfH+P&SKOOCkJ{d~Jd*$9b~yN7paF#LnRvzwJ2;c&$db-5C%ed`GkiFTrI=a~P* zCa}1Q@)FpNq#-s1#uG9|(!awi{%|LHV%so+W*DU{(Lbi?jXQ~&Jbf<*6H6zOSrWmL z$5xL(h(W+0fCW|GZrUKJ5y$c9+AkNDL2%ym`IeMv(l>4mO1?)q??~~lRaP(j{+=s% zrZ{yrUXynQr`r^IW}kVz2=hUe_GS;=g09ne|ILU}S#7Pza&wfKgs$0-104HTZRulh zjU*au_SjP~6so;Yn4LMi5p;#`{??C&ugU1RYG`hvRO~jLUs+XAHP>NF{xW#HBlrg* z$9$q4bUHEz9+1kMXOA+!@qoG>NKPI?=^P}pF*rBp5=e=oAcyOnrZm6W74exkh@wH+ zrWA#PHEA*^th-;FNoYh018!*;lS#y6_6Q?+w>XllXp}pNrG@|t?DwYv66BYc%l=u` zPRXNMgPvoHk=J%^KVeSW=~^#wunF=qe!L|wuepb>1<{Cp3239v6rsm#mDb6NRmNk_ zx1y+Hb&r6AeI+GpWWbkDa=_D`G7E3YrMN_$%jc65Fo%+Tvjx>Pz3A9Mbv5rcaKI#> zEV`@kXO>~v6ix~-VOGv#D1&u6v+|n(EdTe=;{X!B>uR30|EH4$NHNSCM-zz{;pc*V z(HE3{BqV8vbn!(7#9OnvpK};#P%sqN*VnWIQfTnq)~JJA+gdlxS)jvTPf&n=%wPH6 zVOZx&e}0MG5+b=}GZ0p*VsS|`n`sFfTQKg|Yz$pb*KBM%fvi6uMAIi71-RLIW#`f# zK{Uc9!MC95E)Z799WvV7pOAppvF8etkaUA6IWpP=w)+8eDYa?= zZLCg>{7bgjr`Y)@SQvS&<}PP#RmQ1gkPTbG=pXt|7%|$c!_AkyP7)&L@~!dX%F&z- zJ!~nfP73N6JJ;1KI2mb*uODStm<4?}Wlt9ZZcrBY2QIpH9i#%E!0S1R`5`@+4 z>36~I)bRP|?Kh9iF+M{vJlH%euXI-0HX)xgLyi;2@sq_U6ms_lUvRmKm2MR~yDZw% zYCffg0{0b0t8aO-q52vFYeg&6!*I@a%2DbKOwF*6ShDRGnoKFYEP-^pf0FEVb8?YJ z062`V)_+6KUd1+$?1R?Afh5HMx@R_`pfUumkrq)t>#ZuVV|G#htMian_IdNP>jNYj zFuk;=`sBx%s)HX8Z@G{7@LJzo*;K)Pk6Yv_74&?=hIaXu61(wCm=_rSQkhR&y(y;A za;&J?sJM6Uc!MKPdmyx1&Ff{8UmZuqLsMP=V9cNh8?1l46|p_sbqoj1DIkY2&k=K_ zyhQKB^ACBa%q^K{vYolrv_z7D8=K~WSE&#A(3dnLTAKS%LtReVK&c@KoS=4&SB|H(><-_+8W+U%s_tyOusxQEX3NbEC>8J;m&JBZD$dLObAA8aLjbePFk;|3+M z>que07kkvR7P!++7IxM7e8SaT)2wgYA0Tye>Ur<>bfA@xyflkfGOJh+tJwP9ogX#{ zN@ctve6TvA%*%?M<>Gj*u!pF!xTSP~EJtuyaNYUB4o?6800016X_pH$>3tz2vp^#a z{LZg?8Ql2bP~ZQTzU?Q`@8(u`x8J#4^Dhx|R(J;H39l+`2xuY;I@a!ux1HT=p~yyq zJ!dW?;vIo-WIZA2tHGinoD|-@l|1jb#(1|19-Tvp9I{AKA2%+l@W|#^{hi{PFP{ED z00000001bC_@SiQY&6KGMwg850s-$owy`ujmUDzNVEv3_Fh!f8!m-<-!|Fk1Q~T~9 zW8yU&3U6UABDlrYSMo|Cl*+usvI(l35@Jg z+jYc}S)SnqL3H7U;t0E|?v8yEu_2_Bw!auO%gUy zmxFimf`pQ~o6$u7CG&#-zfA} zRWT;XpVV!~>ULN1OCC<6E&!X`mn6Ny^&jv670-w-?Xx2;s5>&s>7jU{rBC9Ml74$t z(P)kjGa)W}H&^Os?)Iu?R7c|2W~+q1@@y^9f9;(J*Y5`-Hli%G(&Q2LMFS-@(OO7g zd&UzXm`F<#1RQR1dNwwVS1zv38UXYvQeifzM92XP#6u`l=HBt+1t6~m6tK9H%YH_? z5!W;{`#hcDwFf}&J$4JJwn8hF7Bf|Dw}|9bg5cUkqX_Es^vPbXd4 z%RsV0HpRpy0yi&`V`G%j@4L*5C&ma2C==UgPFArQfw|F{IR&K$UzA;^0})~!!;X&k z+Z_}%9RRRsNAhM@eJHaE<5IO-q%wzFf}G572(;Z?zy`b#&tN+YpT$wJrk903yf~On zfnfkc>;UP7IH$*7Ug0^44;|wmGGQ(}g*99~ep8}2)Q>>N7*Io_mSYuvm4IcD#t90H zwgY)46vuo}(rq>w=phkJM-vcTL0T_c(TwZ`AngtrqpTaCPNqMG@WlP1F!++ZP}doa z7jd6?G>%K!%#HX%-ggPfvzxANoj5C^Q-Kz;FVRSYG#+&b97(oa5ZZIx4FIN#xYn?$ zrQ~tU5@1U%whMSaaCbU3i)zKT3aJEL&zHp)Yc{*s?^XPxf{M|wJ7Xk1xF|AWSgV(= z0d+3t{#qksw3rKsIm|+}~)x;aNcLHq`U%oMLku zn(-QpGySvs#$I-d_|49Pw&FA^^H7By>mo23a>R-BE(@IpmNnDymut>Y$a=g5YbrvA zzHa%dF^?`m8l^wY>Jcy)8YjeC?YnxCn?*JB2@US)AbNgA%g-RrkpT^13--_vzU z>b+pPeF>RZNR#d*jZFZE%mk>^zRKisLUPZ#z9izjC9{?wRKEWf&%*t#&BQ$*!~M31 zl;9J9*>~}~Wp zFyTWZQEArH!9g9sd3r86nTmO4BwyLGkXbbe;(L1kdqjJr3gre{gw!%b#a;`YnQ(V! zzYMz@^y#+aJU}pq&j22lbIqPsHk%o@L@X3Q@q!jDNtm(7FeFAYki4qPu(X(3AEQ#6 zQugy8d;ujN+PM=bix-J<|D)`+soV2ySQ}?zK}iTvsv43J=82xTR0Hsb(1>-Io*sv9 zsCRvcem_FXko?Gg$sm<3*0C!#s;>jH5KYdeNB+`0NHJEH=~U(9Q>doI)^hs!854*d z5E01~dBt7&6_!3@w5lof01lQ2Syq71C|xO{T7@ z3{+a^dgFEMu;W@GXgxY0TMvO%bi2NY`!f37@u;gOc7KefEhap;>`WP!Hn@gm1Ra{O zNz#bl2)_ZZ8J&3O-s4m}q?7bVHJXithwomYb2@5`Exr;VFP*SXZSAVeu0~#$ZoC_R z3U%)YL^U6puVJ|XKm@Ct=OH3kDlU~W1FBf!g$j9F887mi1QaXnV@FB;7DM6Lu;q~* z=;y0}X+vPduO;+5-*i&qQ8m&41ZY*k!Qh)ShGWwbS-r_{(vDC=G#dCqOs`?SsKJ*0^L zo>mo_1?$1vr~#8(tVTQ^;`rC~ND#GIg|K&jjckio4l&n|DluMgJB&6j9Pe~gM%I3W zR((k9Vg0G*5Ljx}MTF_x%8+k4r~n9#)r59u5f4;dS|ZZ!s2G@X8m&P*l4#J`z^~1E zevyLQ`sBVJ;{`ouO!eA%9q13XBNc>ozkL<$|QuEtH}eI%`FBwdX*_A2qMQui1CO+}D=b-&hN5cW>(Ak)muxnK?De<*`^O!7g`Md9J)fnhmuEJDM&J6SrL;ju>+foLWd*!3einF z!xGfV{30aWK}!}L;&Qn?b_Awgb61Q25F>HpI337?_;4gFjLctJ&$T7mz1ha)n_GK! zJY=dDyoK$dC^+s@_`%k(CBx|WER*#y+wawybyl5n6pHMm!HZNBideZNJcV{4 zXVGGs3Mcpr<@Lq2g$G^&#{~cQra<^jP_bWf(T(L?fiiF2GvLCH7a$^INO+jH_J2BH@Vm-ql=WE#l{FtKaWC4}PQ2dfa%Y5~H3bX%CI~CmEnt zVIfdMaHt`eR2Zq0YLo2z#Z6nkjXpAfwPl1W%Ho)qW~S|^aiceezWay@U6BetXXdlEJ%WUX^j~J-}?Ng%+vLFF7>Fp*L<7wO!-lHu4{Er z%(WPlH3kp&D9Zc~MGF2gsKFOX`*gqtVN@h1x;cK0=H&TvmGaa1dJQMUbd zbo}*(g5yLV8(`>RFag_3m?Ox!Dyp%2L8MO1+i+JFvFoyX*~`=7i@7})w9?0Xv|@Kk zo!Ted$+78Y_Ga0pu!sOH^Ul)@&v0fgyVgh^6+JFNP5Ce}+j8JBX%7drRWLxXg)m)D z6gaVO^&n^-fHa5DG$uA!uaAA8y&M8f!AC$BSe>yr{+BvGpc1_rY;{8~WB?Ne_ESNrAemS)n^utc_ z1VMY#5SbJUFz=60tiAiK+lDC$%!*z}wd&4pNkHb{4jKd}@mB9h!U7cM)EwfVVCuW| zm=H;9Z+gTlU5r&1*IA@+$+}+3oosC9>{f>U)73*gq*Vy?8fI0kgeK`Ys zQA!P~dROHQc-PO0fm6QF60k%5uX*{>s3e$-T0IBJ?EHDoZ2yYxEEa|L$aVEM_#o#` zVw4SKbl|UW9`@S|;HVzHDru|8Fagp0v^j5@Hx4{zhlC9|aXV5lwySgGESnJY+(LC^ z*2zftXA<4Cn*u`I4GbRQ>XX&qV5usMEF3lWgMof2Yr3GCpFx`Zl1(3Rxo}W@Hc(bC zBq%?%TY|k^K#-Lnd0pW=qae5_HyNWR^mlvjFqlxSnVf|D*_biEi#C zXAM%IaDmJdsC2d|{iV-$UL&Ch`OWvWo?3+<6xfVr=dhJB6uQgh8fDps5X*Mk*Aoce zCW3QN5b_hl%|-TI^0OzWKhmzyX%(Tj>wCr1Ika2Q^3XXYHy??k_~Pvap1Z)CB3x?# z*4dq*8(KOl$ssy-M@-y92W1F7ZHX_0*A9O4w}S-=Mid-JtR3DSG~%&Ev9p^CC`Um~ z@dwp`JF^G(-yd4k09s)ewr0Y^FV-?>b24){PZ78m{OJ-N%SNMG`%qtFJlm>!uqQgs zSQr$8{WpP1Zjv0~tG3nKe&&0iGNQ>(0wL8BeDC*9mp*d}BiBFx0000000000000U^ zPZ&)qL#hSjc02tf=Vt|2gO%k$jdV)lCG6UN|5Bj90=_v7lVZ97I4PZ`Ec*uz2=;JU1`7aLTX>Qe2J9AHsN z$pFB4$`6L=&wpkv`jBUL?w&3=`9|06tO9I2qw!Zy4+8LKC9wTSgr_Q-0$1z8&LoN( z`7pngLbzQaocgh{*Y#sb!Sk#e?DnmXQQ{rJH(Z`ZJ z{_0DU3+ES#NZZ0O>zNO1ZgkYxTnoW$&p4HkyoEM@T)oHyAn75;cBNCW1vOt;hCf^} z>u1NT1!^SIIi{-~{qy^Nr0&-+&42`DL)B9oP&20op|@LsFbzL8V}|*h`gX5;W{BLY zu$RX)d(xn#nt-#=f9{Mwet$Hks+i$U5C%K;559#%+fcHOC1h_L0z=Np^=3~7ZvT9) z^@v_FY8IhaT8v&bMw!Vt91uamnNENnJV%rZ2C}3P1Fe)wj`)u z?zvWM*x+0nZ2;kZBl;2dqoHp2|Bbqh&1mP=-bb*3uQCLVfQCPEKC}tv(t-1!L=c|5 z7QEP2ybL~e%h(gPSQ+AjHrF|n5jaN`I?YU6yNHP@BTNo1*_we+F>J`5!6kHdMqBn8 zTp2E#(0NtpNd~m_j)#pL=L`bI6;~i%ba03~YC~2KpiIAVtvu~>sS^rp8yIgc7q;v( ztu!8BeD4u_-gi~t-&L0WL-_==^iwpljTXx6EC`Y8d(1O{Ww`(#_cvdE3 zEO|1io;n^%FR(b62u;a1Q!*4oX1@ zN}758rztng))=-98>hW_J2U%_J4gPP+KuuMnQn&|LFNnePG1%~GFx1-jqoX424Q zD#k6ScYn8gulT#K+TYIpEk2+I&n&UyhJ0}FXINRM$A;mw8YhN}jHA*&LRK;%Cl}Ve zVkOFKfq_=oLJjZs5o(R^Xh?qootHAW9z{(W!bjgl$>QYlD%4DVX}`4a_dANNGVzS0 zme9kn-Wzl>&x9x?Kc9U^zfRL{!4L6H`h~>Qlw8GCgD#ne)Er?z&=3#5&3G4wXxW2l z?vaMhRuuHUm`9sF`7p!CE?2X7JCehWc1e%#t1_zlk}A;+Y#FN-(c^0fQPu4xZ~UC> zPwR30_|bjoVChbAiU%4iwx=jaeY4H3&6-mp*@5xe3&M zv}DV1Heo8Jv>Dib&&5A7OLg{px(!QSl4k3-ayYY=!g%vKh9gH~YQw+)003EIudG+; zz@!1S?T^~yAALyICN_C{K(}98bKd;jw4t)+R31KZj8Ox4hbWTMy=IDT`nMFlna?LH zM2xC|B)T?toc4B#RJh`o0N)lDLpBhmSP+kfW!9MVxvmSNen8FYFWK=A*`M@W;iz-k zA3Flc?Ni+o{`nv{)J_-&Gr2FAq1m60o&R+pK0J~KH4)zJ&z(aN^^t3Ia-Sy8b`%6s zLhWu1bh@=~NaI0L$?3*Bn@Px}%$6`9uocgIt+Ef{xM%^sd{+~#dlD38#6 znV?@M$Zl{^l7C7{MiA zTfeB@Q$2W{WEAj>qowxnRgx`SK>=bEo$KKb#JB=9NQ*4t0V2)ZoPNy04NVK@FBjRp z2I8C9ZkHBYd5q#3CNCR0-g7<53;4}6cNnS77hn_qGB0TOwQD0*!QeV{;H5=y*FZDw zs4YFK+ov3xa7hM%fu*;|CtU0~oro87ylbE3AB`ses#`Ad@kd723Wuf*g+)7IC(Z{83XSw7U`|KIr?g*0ncz4Jv`jfp zRG`EeeseYAqYUqO_ws3F2RU&w`})tx`B@e>RK&8K9pQIi?XT#bs5~XF!FGdSQ((&{^0YRh3OzBV(0e z(!&?9tRQM6hmCa@G%hgoJO8T?E>eL|sV$cmen7U&(u-K)1sNKAxY5!FNBM*MPo?dvZG#RAbXd0ihvD0Ym zv(ULZfr+F#^TpvR8%ZbAn8E#6jvasx+YVP%qgmYwA%}?V7UgtoFBHQ65>>TSN@o432X1{= z5R(gN>C#ZFld1%V7#@fi0}=YH3(-#mqtwPs57WJlf`Xb>WHha}g#w<^uPz;uF-Yra zvx@x$)o5ETAARrc2E?gOZW{qb0(0;CWRo3cjF*Z#t(sQ4T8wWov<)A&wFq%6%zgB` z9S@+5Y=wbPK1Fmj&oHl<@v3mJoUcwjFBq(vKNlG^&5@72tCFR=_QxJ)Kg|{K*!rLf zXp1ezWl}Xf`4zstAXlBKO;^`SF}b4Xdekrk3mEt$2F&}`TL5aGsuUBNs(s;M#O1QV z9RTXhJP$y%1Yk3CDE*BR<@&TKsd<c-Qs`8Gnl7VKGf>E0u zUxT_s(Pb)+45oNh2;H#16n@NNAM+)qS%8R<5G1$?Xh~Urex364h6=iJtTU^zkuZNi zRm+Q$uxvT>sNI|YlL9{mN@e-WddJl_ z5u2{A7te3~4*e=pgs^i9%Kizcx=Q9Da$xiN$re{1kFae$fa>e_MoFtr`ja>$NUOwV}N)kY9?w3%91lYhfVv@4wp3C5iZ=I$%AGtw-2 zMiyKj`G=>ohzR|X4}JCedM0bcw~0bEY7IKZ9fonBvO3TJ03Es#)xqFcFvx)oHPR~D z(6m_;`)93XaYbe{>lBhhN z5A3}9e@0onF_=mqiqFH;vePIx!0VFj_@8Gb1tq7al94WQyI zPNQ55<;Jk2r)?kk|`#4^Hl_*?@Jd1;uh$^0xt`^^s0|X93Tne-S7P_vD5bukHXDjUm zwc4R6L-^eg;Qj55{ioFyfer7iLaa~5T70%H^Fi_`qYRn#`WbYfNm2LU0&t z%*F3N#k$FV@RgPKK)3dMhQCT$JyC-pUa=i2OLe?qhZJ~1d3SNKx1uHOTI>j>+lQ@e zplG48qK8&eNM^lotBQNxaXZmMhD-M}yGBfH1{_U_#|8w;ES@a}B&yg8D%DS(xGM4vjXGpJS!) zA~9H)#UT9|gEg1M5{8&Bc~FcOoGj6%b8iu6N2Tkz5YqF9RB>_8!O?RAmu`ZD6W7^%=kUG*=X@7{^)3U2k{L%l>1qx{zI2;ka$a+DrSSzYi3t%3u zZx&%MtP|WN1RO(vp&`R0c8Fa@6=x7}0Wm^C57mB4@a(Bcv2gI;V>iq3`rC=XZ*a81 z@P@(Fy>8`$_!o|H;-{DZ5-nUJ%KbvMLeuC#!f7O!GX_Qgo`!PqTHG&YE zb456)84*Yu0k#9cvN6I!Pk!7!QrkP>vKHn$Fsg!kcUlz=U}(;q%>o8yZh$ z9D*_`zSozx`|x!y1ta&h1I|xd+!}o4PM5XU$KSX_V|DV5aNe~pG#&Pe?wsiBP7$9A z-c@oBZnJ7Vv^x2U>3<}S@iP;*fB*t-I0P!UQj=gnv<&IDmi-$Ejq32KZX-0*Jo7&^bm!#nMo=Jvk@M&N<;Co<;^@=R$kOsV7@-OG3DX!oAo#JUiHSWi_?*wvNWA zT1MZx742S}2!fF;#FTpvdPfT5Fp%i=B)T_QBw5cC;AW1Uh%Z*3OMIuSO#at!i(ZHZ z`*oDWdHrR|2ivNrYCRz6ixNu{K}p-SGJ&~TCSc7nt~&T#HA+b4m++%Z!*-!**&e#T zU$>xa>!ZzDwy4c!q~S4YSh%;QLCt*jn^o#IQicASKYczP?4oUffJA*VM-Apib)OY_}ZStL( z6@S82^cT&tYwXBy%XSjZRAY%MbjvkK---Kz3%Hy|6+@|3?j((vC5ZS2Jc)fYIP^P! zaeLU+Y?MV5;O*THHm>0P7_9zxSPU?_P@cc^|KQE{q0)^BIl>USI zcPbs%#fz+rBOJ~D89o2RGzdYBN1D>&4Lv=QdzG;LcCEkBxebt(UxpiBcOvc4U`ctN zD`No+rBTAvPq}fD$DJJJz_r4C`Aba?#}l*NZFXu3=JKWi<>KRK1R5A4zb@Q>8Ke$T z_Pk*&gIUp$ATzkW8ZXa8-L>K#7=c5uuF|4GbIjR~?jps;?G6bSMBV!DMzBji+~6PA zOlmbhPt0Cm2i4aLw>{CNbH*K6{AioAr_f1ywhv;?v)g~6!9?QX++GqZ93R^=s63gZ zZlasona8o1|o;Y4y4hrt@dros2})eUx{r+{&Z# z1(2)4Yd!qqyog$~5R)&hl|oB~CF(!&yR2Vj0kdizL`v?AEm@oCE08pbnCYcYe7L)a4`vLAr(GbEPgUq_m+>D0@ zZ5-BY9`k~B0q=d7Ri%APiBPtA3yyyX4MI8Kd7})D+l@CXvCV{h7w-Nv$j4?2Gi7~e zBS45xcA{w+i9;ZAJ?KdyzwGmDS3kh(Z(51^E0xJ|5l42{D!CcUlzv=}!5D%YqfUzw`KAPhs{!vJ;6XX-5k##;^eLvt^W5jU0kOm)2tc4W@mY zqnvgN05JxY&3!$7l5A_9L0*1r>i;3{!plhl=mH;^yXZxQvB-AxMfzlVl$4`*5>})8 zsX6bZar++8zKnvq6|=~lax+wgj+&;JTGWIUf+)^02enyJA)-$ru`PS~OCXgg?o>f^ zny7w%c&-3bl9nqdA&s495(UTjGU}Mu>GK&If@W;^TXGb#7iUJX4*e#{tQ;r>Jb%59 z8BeH#LPPkqwM75I64BH`Vg)*9c`w$XtaBh=M}FG!k#5dhnYKT=JQN$n!90kkurwcb zbm#HgvOvHp;KMd-?!zn%Ji*bmF?b3r zPX!ftKT*=vcUDAdG=;x!1zR&!+I2?8YgBXnw>{pW2}ut#dA?Rej^T7=k=^sFTak06 zK-Z4IZn?%TX0U2bc9Pb*<%ElyHqlv~M=Km`rNoS(UKsxHT~nR4l^Ev>KvN4A z`-+%^0Pjk2wW(uaiD6?&Vn5yxYE?Z+fXa?10cKWM3E}tU?OaOJa0)HY26i#r+XJ13 zDjxVS{2~Z48~f4o3vu}{Tql#VXDZk$^{30z>l176C^+_!wX)WoLqhj!+y3`LxaCea zmKJ)t3~PidEXj61=>H}5(-gFcT6}H#ecGjJnKLoO>atlU^TkFw-^ju|qB-(l(1hst z_3gKvSpUD{9t^<2yk)Tq>)Uok1H&|&^xL2Vw1|G zyl+n>S)M~$ll?1As;iSWQ;?CS#v^`9(NS6=IBfjE6$|!5bdDeW>{ln|8FIXDyy%GwQ2UDR3k;?TeBJ?6%CMM&m$70&a9=Rg za=^~KT)K-(6Bbw@7OBC*5oa!TJe1v&*A#kB=4MNzrVR6u-9K2OxetC1F9ZSFGoani z_4Ue=eY+O{pB+<`bpF(bS6%!Vw7zB3Ob+puZBk_4$k%Ga`;%XaxMnnWsSpC3;tS6= z)OlvR4WWg=RF+n|*p#TrG5$%|X&N4vQ8wA(H#C+J5mgvPhJ}T!nU|Pz6uajO8zR!c z0Z%C1-F?B@FB#Uy8-(2FMLnHeF_R%IMV@NyNZ&Xtqu&^*$&QWYImY-LuSZoX%nIof z;xX0UiNXg-1$|N4>{fp0s5M(0YE(MDTHrGghhI8WAZ)I)=+^KBndc!!Y6h2vMLV;C ztqsz0hK>VxDSId&X)duoATVSVw;U$uNT;uOiZ;#;D`5$R)jeU<`A{_UC4N_#sXv%q zmVvfRZ=Co500B3G6n7?{APq>X?WRid3Wxvz00L&oS=!P8$w}$SGG_o4F+czS0004R z=ZH8s$C_6}>2>SM<0F2Sx9!}}3XK0v@i=!#6CE4G_oUtzFf~#59k<=suvo|>Ppy_R v7W3$Rb(r=(*pM!h+0Z5e#st4%fIR3HUMV9NPBt>-MgRZ+0000000000X`vl3 diff --git a/fern/assets/images/dashboard/campaign-registry/sms/brands.webp b/fern/assets/images/dashboard/campaign-registry/sms/brands.webp deleted file mode 100644 index 08057128803ab94da30a9ea74c2923be71a5f231..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46160 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 Mi~s-t000000A5@{9smFU diff --git a/fern/assets/images/dashboard/campaign-registry/sms/campaigns.webp b/fern/assets/images/dashboard/campaign-registry/sms/campaigns.webp deleted file mode 100644 index c360d55773133fc1c6473fc246ef310e12007779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53576 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 diff --git a/fern/assets/images/dashboard/campaign-registry/sms/existing-campaign-details.webp b/fern/assets/images/dashboard/campaign-registry/sms/existing-campaign-details.webp deleted file mode 100644 index 71a03c3a0b7cc8d4f53504854d4dab2ff19b8e3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34426 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 + An AI chat conversation over the REST API + Your server sends create_conversation with an id and config_url. SignalWire fetches your agent's SWML document from config_url and returns the agent's greeting as initial_message. On each turn, your server sends chat with the id and message. If the agent calls a tool, SignalWire posts the tool call to your web_hook_url and your server returns the result. SignalWire returns the agent's reply as response. Your server sends end_conversation, SignalWire returns status ended, then posts the summary to your post_prompt_url. + + + + + + + + + + + + Each turn + + + + + + + Your server + + + + + + SignalWire + + + + + + Your agent + + + create_conversation + id, config_url + + + fetch agent + + SWML document + + + initial_message + the agent's greeting + + + + chat + id, message + + + tool call, if any + to web_hook_url + + result + + + response + the agent's reply + + + + end_conversation + id + + + ended + status + + + summary + to post_prompt_url + + + diff --git a/fern/assets/images/img/inbound-call-lifecycle-themed.svg b/fern/assets/images/img/inbound-call-lifecycle-themed.svg new file mode 100644 index 0000000000..e0404cdb89 --- /dev/null +++ b/fern/assets/images/img/inbound-call-lifecycle-themed.svg @@ -0,0 +1,85 @@ + + Inbound call handled by a SWML Script + A caller dials your SignalWire number. SignalWire looks up the Resource assigned to the number, then sends your server the call details: from, to, direction, and call id. Your server returns a SWML document. SignalWire answers the caller and runs your SWML. When the call finishes, the SWML session ends. + + + + + + + + + + + + + Caller + + + + + SignalWire + + + + + Your server + + + dials + your number + + + + Looks up the number's Resource + + + call details + from, to, direction, call id + + SWML document + + + + answers + + + + Your SWML runs + Call finishes + + ended + SWML session ends + + diff --git a/fern/assets/images/tools/swsh/swsh-warp.webp b/fern/assets/images/tools/swsh/swsh-warp.webp deleted file mode 100644 index b3ce3f497fc409e54943c7ebc25c313fdcd2492b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76976 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ɤZBseNmjv0WMU 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 diff --git a/fern/assets/images/tools/swsh/swsh.webp b/fern/assets/images/tools/swsh/swsh.webp deleted file mode 100644 index 5423d5c191eb0878e2e30382d0df0b7cc718b683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11240 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 diff --git a/fern/assets/images/tools/wirestarter/swsh-to-setup.webp b/fern/assets/images/tools/wirestarter/swsh-to-setup.webp deleted file mode 100644 index 6b343caa76f794399163bb615ad16beb2ffaeda8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433294 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

M{aij{gSeS3L9x`?ne1b&E<- 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%0D9=pI(~(z6>O_P1@~Z=1g6-;3}6=}_^v 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

- + Build drag-and-drop calling applications without writing code. Manage your SignalWire space, phone numbers, and resources. - - Scaffold a new SignalWire project in seconds. - - - Interactive shell for testing SWML scripts and API calls. - diff --git a/fern/products/platform/changelog/2026-09-05.mdx b/fern/products/platform/changelog/2026-09-05.mdx index ec5b30d1de..e8d917dea9 100644 --- a/fern/products/platform/changelog/2026-09-05.mdx +++ b/fern/products/platform/changelog/2026-09-05.mdx @@ -8,6 +8,6 @@ AI agents that don't specify a voice now speak with ElevenLabs' "Mark", a higher included in the regular AI agent price. The default voice can change over time, so applications that need a specific voice should set one explicitly. -Set a voice in the [AI Agent SDK](/docs/server-sdks/guides/voice-language) or with +Set a voice in the [Server SDKs](/docs/server-sdks/guides/voice-language) or with [`voice` strings in SWML](/docs/swml/reference/calling/ai/languages#use-voice-strings), and [browse and audition available voices](/docs/platform/voice/tts). diff --git a/fern/products/platform/changelog/2026-09-21.mdx b/fern/products/platform/changelog/2026-09-21.mdx new file mode 100644 index 0000000000..123513d77b --- /dev/null +++ b/fern/products/platform/changelog/2026-09-21.mdx @@ -0,0 +1,7 @@ +--- +tags: ["voice"] +--- + +## Fixed: Dashboard SIP codec configuration had unclear Opus bitrate options + +The Dashboard SIP codec configuration had unclear Opus bitrate options. This is now fixed. diff --git a/fern/products/platform/changelog/2026-09-28.mdx b/fern/products/platform/changelog/2026-09-28.mdx new file mode 100644 index 0000000000..6ea5b2c907 --- /dev/null +++ b/fern/products/platform/changelog/2026-09-28.mdx @@ -0,0 +1,12 @@ +--- +tags: ["messaging", "voice"] +--- + +## Phone number release allowance changed to two early releases per month + +Non-trial accounts can release up to two phone numbers each month within 14 days of purchase. +Any additional number you release that month is subject to the standard 14-day hold after +purchase, with no exceptions, to help prevent fraud and abuse. + +Release a number from its page in the [Phone Numbers](/docs/platform/phone-numbers) section of +the Dashboard. diff --git a/fern/products/platform/pages/ai/chat.mdx.draft b/fern/products/platform/pages/ai/chat.mdx.draft deleted file mode 100644 index 26ab050a43..0000000000 --- a/fern/products/platform/pages/ai/chat.mdx.draft +++ /dev/null @@ -1,330 +0,0 @@ ---- -title: AI chat -sidebar-title: Chat -slug: /ai/chat -description: Build a chat application against a SignalWire AI agent, from your own server or from a browser, using the same agent and tools a voice call would use. -subtitle: Reach an AI agent over HTTP instead of a phone call -max-toc-depth: 3 ---- - -{/* - Draft page retained outside the published Fern configuration. Much of what follows is intended - for the AI overview page in a later PR. -*/} - -[api-scopes]: /docs/platform/your-signalwire-api-space -[chat-endpoint]: /docs/apis/rest/ai-chat/chat-methods -[error-codes]: /docs/apis/error-codes -[chat-gateway]: /docs/server-sdks/reference/python/agents/chat-gateway -[chat-client]: /docs/server-sdks/reference/python/agents/ai-chat-client -[swaig-webhook]: /docs/apis/rest/webhooks/ai-swaig-tool-webhook -[swaig-post-conversation]: /docs/swml/reference/calling/ai/params#paramsswaig_post_conversation -[post-prompt-webhook]: /docs/apis/rest/webhooks/ai-post-prompt-callback -[tool-calling]: /docs/platform/ai/tool-calling -[post-prompt]: /docs/swml/reference/calling/ai - -The agent that answers your phone number can answer a text message box instead. Same SWML, same -prompt, same tools — reached over HTTP, one request per turn, with no call to place and no audio to -carry. - -How you connect comes down to one question: **can the code holding your API token be read by a -stranger?** - -| | Direct | Through a gateway | -|---|---|---| -| Your code runs | on your server | in a browser, or any untrusted client | -| Holds the API token | yes | no — your gateway does | -| Talks to | `POST /api/ai/chat` | your own gateway URL | -| Protocol | JSON-RPC 2.0 | a small POST shape | - -A browser cannot use the direct path. Anything a page can read, a visitor can read, and an API token -in a page is a published API token. The gateway exists for that. - -## Before you start - -You need an agent. Chat reaches the same agent a phone call would, so if you have not built one yet, -[tool calling][tool-calling] builds Ada from an empty file, and everything it covers — the prompt, -the tools, the results they return — applies here unchanged. - -Two things beyond that: - -- **An API token with the `chat` scope.** The endpoint rejects a token without it. Scopes are set - per token in your Space — see [API scopes][api-scopes]. -- **A `config_url` reachable from the public internet.** This is the URL serving your agent's SWML. - SignalWire fetches it server-to-server, so `localhost` and private addresses do not work. This is - the most common first-day failure, and it fails late: the conversation is created, and then every - tool call goes nowhere. - -## How a conversation works - -**Your agent** is a document you serve — SWML describing the prompt, the tools, and the behavior. -`config_url` is where you serve it. - -**A conversation** is a series of turns, addressed by an `id` you choose. Ids are scoped to your -project, so you pick them and only you can reach them. - -**A turn** is one user message and the agent's reply, including any tool calls made along the way. -One request, one turn, one response. - -## From your server - -Six methods travel over one endpoint, selected by the `method` field of a JSON-RPC body. Your -project and token go in HTTP Basic auth and never in the body. - - - -The [AI chat endpoint reference][chat-endpoint] documents all six methods, their parameters, and the -error codes. In Python, the SDK covers the same ground with typed methods: - -```bash -pip install signalwire-sdk -``` - -```python title="chat_with_ada.py" -import asyncio - -from signalwire.ai_chat import AIChatClient - -CONFIG_URL = "https://bayview-taxi.example.com/swml" - - -async def main(): - # Credentials fall back to SIGNALWIRE_PROJECT_ID, SIGNALWIRE_API_TOKEN, - # and SIGNALWIRE_SPACE, so a configured environment needs no arguments. - async with AIChatClient(space="your-space") as client: - info = await client.create_conversation("chat-8f21", config_url=CONFIG_URL) - print("Ada:", info.initial_message) - - reply = await client.chat( - "chat-8f21", "How much is a van from 123 Gough Street to the airport?" - ) - print("Ada:", reply.text) - - if reply.user_event: - handle(reply.user_event) # Ada asked your app to do something - - await client.end("chat-8f21") - - -asyncio.run(main()) -``` - -Failures raise typed exceptions — `ConversationNotFoundError`, `ChatInProgressError`, -`RateLimitError`, `AuthenticationError`, `SummaryError` — so the HTTP-200 detail below is handled for -you. [`AIChatClient`][chat-client] documents every method and return type. - -## From a browser - -You run a **gateway**: [`ChatGateway`][chat-gateway], mounted inside a web application you already -host. It holds the API token, the project, and the `config_url`. The page holds a URL and a -publishable key. - -```mermaid -flowchart LR - Browser["Browser
gateway URL + publishable key"] - Gateway["Your app
ChatGateway"] - SW["SignalWire
POST /api/ai/chat"] - - Browser -->|"publishable key"| Gateway - Gateway -->|"project + API token"| SW - SW -->|"the agent's turn"| Gateway - Gateway -->|"JSON response"| Browser -``` - -A key lifted from your page reaches one agent and can do nothing else: it cannot name a different -`config_url`, and it cannot read arbitrary conversations. Revoking one is a server-side change — -construct the gateway with a new key and redeploy, and the old key stops working immediately. Your -page needs the new key to keep working, so serve it rather than hard-coding it if you expect to -rotate. - -```python title="gateway.py" -import os - -from fastapi import FastAPI -from signalwire.ai_chat import ChatGateway - -app = FastAPI() - -gateway = ChatGateway( - config_url="https://bayview-taxi.example.com/swml", # never leaves the server - key="pk_your_publishable_key", # safe in the page - secret=os.environ["SIGNALWIRE_CHAT_GATEWAY_SECRET"], - allowed_origins=["https://bayviewtaxi.example.com"], - conversation_timeout=1800, -) - -app.include_router(gateway.router(), prefix="/chat") -``` - -The browser gets four methods over one POST: `start` opens a conversation so the agent greets first, -`chat` sends a message, `log` replays the conversation, and `end` closes it. The key travels as a -bearer token. - -```js title="chat.js" -// The router mounts POST "/", so with prefix="/chat" the path is "/chat/". -const r = await fetch("/chat/", { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: "Bearer pk_your_publishable_key", - }, - body: JSON.stringify({ method: "start" }), -}); - -// Keep this. It IS the conversation. -const handle = r.headers.get("X-Chat-Handle"); -sessionStorage.setItem("chatHandle", handle); - -const { greeting, timeout } = await r.json(); -``` - -### The handle is the conversation - -There is no conversation id on this path. The gateway signs a **handle** carrying the id and an -expiry, returns it in the `X-Chat-Handle` response header, and you send it back on every later call. -You cannot forge one, and you cannot point one at somebody else's conversation. - -`sessionStorage` scopes it to a browser tab: reload and the conversation resumes, a second tab starts -its own, closing the tab ends it. - -```js title="chat.js" -const handle = sessionStorage.getItem("chatHandle"); - -const r = await fetch("/chat/", { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: "Bearer pk_your_publishable_key", - }, - body: JSON.stringify({ method: "log", handle }), -}); - -if (r.status === 403) { - sessionStorage.removeItem("chatHandle"); // expired; start a new conversation -} else { - const { messages, timeout, last_activity } = await r.json(); - redraw(messages); -} -``` - -**An expired handle is normal, not an error.** Handles have a finite lifetime, so every long-lived -conversation eventually reaches it. Treat a `403` on `log` as "start a new conversation" rather than -something to show the visitor. - -`log` returns user and assistant turns only. Your system prompt and the tool traffic never leave your -gateway, so a handle cannot be used to read your prompt. Each message carries `role` and `content`; -`timestamp` is included when the source message has one. The response also carries `timeout` and -`last_activity` — enough to warn a visitor -that their next message will start a new conversation. - -### What a leaked key costs you - -A publishable key is public by definition, so design for it being taken. A key without a valid -handle cannot read a conversation. A caller holding a handle can use `log` to read that -conversation's filtered user and assistant transcript. A leaked key can also start conversations -and send messages. `max_new_conversations` limits new conversations per rolling `window_seconds`, -while `max_turns` limits the turns in each conversation. - -The origin allowlist stops a key pasted into someone else's page, because a browser sends its origin -and the gateway refuses it. It does not stop `curl`, which omits the header. Treat it as leak -containment, not access control. - -[`ChatGateway`][chat-gateway] documents the caps, the defaults, and the settings that matter once you -run more than one replica. - -## What will bite you - -Both paths share these. - -### Check the HTTP status and response body - -For direct REST calls, check the HTTP status first. HTTP-level failures such as malformed JSON, -rejected credentials, and an unavailable or slow service use non-200 responses and are not JSON-RPC -envelopes. On `200`, parse the JSON-RPC envelope and check for an `error` member. For requests sent -through `ChatGateway`, use the JSON-RPC body to determine whether the chat operation succeeded. - -A direct REST turn that takes longer than 30 seconds returns the same 502 response as a service that -cannot be reached. The response does not distinguish those causes; retry with backoff. - -### An idle conversation ends - -A conversation left idle past its `conversation_timeout` (3600 seconds by default, settable per -conversation) ends. - -### The transcript includes your prompt - -`chat_log` can include your prompt and other non-dialogue entries. Filter to `user` and `assistant` -before displaying it. The gateway's `log` does this for you. - -## Webhooks you receive - -A chat conversation delivers the same webhooks a voice AI session does, with values that identify it -as chat: `conversation_type` is `chat`, and `call_id` carries the conversation id. - -**Tool calls** reach the `web_hook_url` on your SWAIG functions, exactly as they do on a call. -[Tool calling][tool-calling] covers the round trip and the reply shape, and the -[AI SWAIG tool webhook][swaig-webhook] documents the payload. - -Nothing about the reply changes for chat, including the object form of `response` that splits the -result the agent reads from the instruction steering what it says next. Setting -[`swaig_post_conversation`][swaig-post-conversation] adds the transcript to every tool webhook here -too, and carries the same caution: it puts the whole conversation in a body leaving your control. - -**A summary** reaches your [`post_prompt_url`][post-prompt] after the conversation ends, when your -SWML sets one. Not instantly — expect seconds. The -[AI post-prompt callback][post-prompt-webhook] documents the payload. One trap in it is worth -repeating: `call_log` has the same caveat as `chat_log`, in that it can include your system prompt -and other non-dialogue entries. Filter to `user` and `assistant` before showing it to anyone. - -## Confirm it works - -Run the server script above. A working setup prints two lines — Ada's greeting, then her answer to -the fare question: - -```text -Ada: Bayview Taxi, this is Ada. Where are you headed? -Ada: A van from 123 Gough Street to the airport is $58. Want me to book it? -``` - -The second line is the one that proves the whole path: it means SignalWire fetched your SWML, ran a -turn, and — if the answer carries a real fare rather than a vague one — called your tool and used -what your code returned. - -When it goes wrong, the failure is almost always one of these. Documented codes are listed under -[AI chat errors][error-codes]: - -- **`-32002` on the first call.** Your `config_url` could not be fetched. Open it from outside your - network; a `localhost` or private address fails here even though it works in a browser on your - machine. -- **HTTP `401` with `Unauthorized`.** Confirm that the project and token belong to the Space in the - request URL and that the token includes the `chat` scope. These causes share the same response. -- **Ada answers, but with an invented fare.** The conversation is working and the tool call is not. - The model answered from nothing, which means your SWAIG function was never called or returned an - error — check your own agent's logs, since the chat service reports nothing about your tool's - behavior. - -## Next steps - - - - - Every method, parameter, return field, and error code on the wire. - - - - The Python client for the direct path, with every method and return type. - - - - The browser-facing gateway, with every argument, default, and cap. - - - - Connect the agent to your systems, the same way a voice agent does. - - - - Shape how the agent converses before you change any code. - - - diff --git a/fern/products/platform/pages/ai/get-started/quickstart.mdx b/fern/products/platform/pages/ai/get-started/quickstart.mdx index 2229b004e7..897bb12fa3 100644 --- a/fern/products/platform/pages/ai/get-started/quickstart.mdx +++ b/fern/products/platform/pages/ai/get-started/quickstart.mdx @@ -231,13 +231,14 @@ Install the package if you chose the SWML authoring path: python3 -m pip install signalwire-sdk ``` -Export credentials from your SignalWire Space. Export the configuration URL from the authoring -path you chose if it is not already present in this terminal. +Export credentials from your SignalWire Space. `SIGNALWIRE_SPACE` is the Space name only, such as +`example` for `example.signalwire.com`. Export the configuration URL from the authoring path you +chose if it is not already present in this terminal. ```bash export SIGNALWIRE_PROJECT_ID="your-project-id" export SIGNALWIRE_API_TOKEN="your-api-token" -export SIGNALWIRE_SPACE="example.signalwire.com" +export SIGNALWIRE_SPACE="example" # Server SDK setup: export SIGNALWIRE_AGENT_CONFIG_URL="https://signalwire:replace-with-a-long-random-password@abc123.ngrok-free.app/" diff --git a/fern/products/platform/pages/ai/get-started/tool-calling/index.mdx b/fern/products/platform/pages/ai/get-started/tool-calling/index.mdx index 5322fd64a3..be71c89b11 100644 --- a/fern/products/platform/pages/ai/get-started/tool-calling/index.mdx +++ b/fern/products/platform/pages/ai/get-started/tool-calling/index.mdx @@ -18,6 +18,7 @@ position: 2 [sdk-datamap]: /docs/server-sdks/guides/data-map [swml-datamap]: /docs/swml/guides/data-map [result-actions]: /docs/server-sdks/guides/result-actions +[ai-chat]: /docs/platform/ai/chat [state-management]: /docs/server-sdks/guides/state-management [contexts-workflows]: /docs/server-sdks/guides/contexts-workflows [toggle-functions]: /docs/swml/guides/toggle-functions @@ -40,7 +41,7 @@ On SignalWire, tool calls travel over **SWAIG**, the SignalWire AI Gateway, and the tools you define are **SWAIG functions**. SWAIG functions belong to the agent definition, not to a communication channel. The same functions -can serve voice calls and text conversations. Channel-specific actions, such as transferring a call +can serve voice calls and [text conversations][ai-chat]. Channel-specific actions, such as transferring a call or playing audio, apply only when the active channel supports them. This guide follows one agent the whole way through: a dispatcher for a taxi company that quotes fares diff --git a/fern/products/platform/pages/ai/guides/Integrations/vapi.mdx b/fern/products/platform/pages/ai/guides/Integrations/vapi.mdx index 0a683ec333..35832a84ec 100644 --- a/fern/products/platform/pages/ai/guides/Integrations/vapi.mdx +++ b/fern/products/platform/pages/ai/guides/Integrations/vapi.mdx @@ -14,7 +14,7 @@ max-toc-depth: 3 [addresses-guide]: /docs/platform/addresses [swml-guide]: /docs/swml [swml-connect]: /docs/swml/reference/calling/connect -[outbound-calling]: /docs/platform/voice/outbound-calling +[outbound-calling]: /docs/platform/voice/make-and-receive-calls VAPI assistants need phone numbers, and SignalWire supplies them over SIP trunking in both directions. Callers dial your SignalWire number and reach the assistant, and the assistant places @@ -281,7 +281,7 @@ VAPI can resolve the domain name. Place outbound calls from SignalWire directly, including calls handled by a SignalWire AI agent diff --git a/fern/products/platform/pages/ai/guides/chat.mdx b/fern/products/platform/pages/ai/guides/chat.mdx new file mode 100644 index 0000000000..96f13ff641 --- /dev/null +++ b/fern/products/platform/pages/ai/guides/chat.mdx @@ -0,0 +1,713 @@ +--- +title: Chat with an AI agent +slug: ai/chat +description: Hold your first text conversation with an AI agent over HTTP, then chat from your server with the Server SDKs, from a web page through a gateway, or over text messages, move a conversation onto a phone call and back, and receive tool calls and summaries. +subtitle: Reach the same AI agent by text instead of a phone call +max-toc-depth: 3 +--- + +[chat-endpoint]: /docs/apis/rest/ai-chat/chat-methods +[chat-client]: /docs/server-sdks/reference/python/agents/ai-chat-client +[chat-gateway]: /docs/server-sdks/reference/python/agents/chat-gateway +[gateway-router]: /docs/server-sdks/reference/python/agents/chat-gateway/router +[client-create]: /docs/server-sdks/reference/python/agents/ai-chat-client/create-conversation +[client-chat]: /docs/server-sdks/reference/python/agents/ai-chat-client/chat +[client-log]: /docs/server-sdks/reference/python/agents/ai-chat-client/log +[client-end]: /docs/server-sdks/reference/python/agents/ai-chat-client/end +[client-summarize]: /docs/server-sdks/reference/python/agents/ai-chat-client/summarize +[client-delete]: /docs/server-sdks/reference/python/agents/ai-chat-client/delete +[swaig-webhook]: /docs/apis/rest/webhooks/ai-swaig-tool-webhook +[post-prompt-webhook]: /docs/apis/rest/webhooks/ai-post-prompt-callback +[inbound-message-webhook]: /docs/apis/rest/webhooks/inbound-message-webhook +[create-swml-script]: /docs/apis/rest/swml-scripts/create-swml-script +[create-swml-webhook]: /docs/apis/rest/swml-webhook/create-swml-webhook +[assign-phone-route]: /docs/apis/rest/phone-routes/assign-resource-phone-route +[ai-quickstart]: /docs/platform/ai/quickstart +[tool-calling]: /docs/platform/ai/tool-calling +[ai-reference]: /docs/swml/reference/calling/ai +[api-credentials]: /docs/platform/your-signalwire-api-space +[resources]: /docs/platform/resources +[phone-numbers]: /docs/platform/phone-numbers +[messaging-chat]: /docs/platform/chat +[webhooks]: /docs/platform/webhooks +[swml-reply]: /docs/swml/reference/messaging/reply +[handoff-router]: /docs/server-sdks/reference/python/agents/handoff-router +[browser-dial]: /docs/browser-sdk/v4/reference/signalwire +[dial-options]: /docs/browser-sdk/v4/reference/interfaces/dial-options +[rest-dial]: /docs/server-sdks/reference/python/rest/calling/dial +[call-commands]: /docs/apis/rest/calls/call-commands +[verify-signature]: /docs/platform/webhooks#verify-webhook-signature + +The [AI agent you built][ai-quickstart] for voice can also hold a text conversation. +Each HTTP request-response cycle represents one exchange between the user and the AI. +You send the user's message as an HTTP request, and the agent's reply comes back in the response. +An ongoing text conversation can be escalated to voice and back to text with no loss of conversation context. + +Start by sending two requests to an agent saved in your Space through HTTP, then hold conversations from your +server, from a web page, and over SMS text messages, move one onto a phone call and back, and receive +the agent's tool calls and summaries. + + +AI chat is the [`ai`][ai-reference] method, or a Server SDKs agent, reached over text instead of voice. +The [Chat API][messaging-chat] is a separate messaging product. + + +## Prepare for AI chat + +Have these values ready: + +- Your Space URL, such as `.signalwire.com`. +- Your Project ID and an API token from the Dashboard's [API credentials][api-credentials] page, + with the token's **Chat** permission enabled. +- An agent: a SWML document with an [`ai`][ai-reference] method, served at a URL SignalWire can + fetch from the public internet. The first run below saves one in your Space. +- For text messages, a messaging-capable [phone number][phone-numbers] in your Space. +- For tool calls, summaries, text messages, and the web page gateway, a publicly reachable HTTPS URL + for your application. +- To move a conversation onto a phone call, a voice-capable number in your Space. + + +Anything a page can read, a visitor can read. An API token in page code is a published API token, +so a web page reaches AI chat only through [`ChatGateway`](#hold-an-ai-chat-conversation-from-a-web-page) +on your server. + + +## Hold your first AI chat conversation + +Hold a short text conversation with an agent saved in your Space, using nothing but HTTP. + + + +### Set your credentials + +Replace these values in the code sample you choose: + +| Value | Replace with | +|---|---| +| `` | Your Space's subdomain in `.signalwire.com` | +| `` | Your Project ID | +| `` | An API token with the **Chat** permission | +| `` | The ID at the end of your agent's request URL, `https://.signalwire.com/relay-bins/` | +| `` | A publishable key you choose for your web page, such as `pk_bayview_web` | +| `` | A long random string your gateway signs conversation handles with | +| `` | The origin your chat page is served from, such as `https://bayviewtaxi.example.com` | +| `` | The public HTTPS URL of your application, such as `https://bayviewtaxi.example.com` | +| `` | A voice-capable number in your Space that the call comes from | +| `` | The rider's phone number, in E.164 format | +| `` | The HTTPS URL that receives your agent's tool calls | +| `` | The HTTPS URL that receives the conversation summary | + +### Save an agent as a hosted SWML script + +Save this document as a SWML Script [resource][resources] in your Space's Dashboard, or with the +[REST API][create-swml-script]. Its request URL, ending in `/relay-bins/`, is the +address AI chat fetches your agent from. The same resource also answers voice calls. + + + +```yaml title="YAML" +version: 1.0.0 +sections: + main: + - answer: {} + - ai: + prompt: + text: You are Ada, the dispatcher for Bayview Taxi. Answer questions about booking a ride. Keep replies to one or two sentences. +``` + +```json title="JSON" +{ + "version": "1.0.0", + "sections": { + "main": [ + { "answer": {} }, + { + "ai": { + "prompt": { + "text": "You are Ada, the dispatcher for Bayview Taxi. Answer questions about booking a ride. Keep replies to one or two sentences." + } + } + } + ] + } +} +``` + +```bash title="cURL — SWML Scripts API" +curl -X POST "https://.signalwire.com/api/fabric/resources/swml_scripts" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "bayview-ada", + "contents": "{\"version\": \"1.0.0\", \"sections\": {\"main\": [{\"answer\": {}}, {\"ai\": {\"prompt\": {\"text\": \"You are Ada, the dispatcher for Bayview Taxi. Answer questions about booking a ride. Keep replies to one or two sentences.\"}}}]}}" + }' +``` + + + +The REST response carries the request URL in `swml_script.request_url`. + +### Create the conversation + +`create_conversation` opens a conversation with your agent under an ID you choose, and returns the +agent's opening line. + + + +```bash title="cURL — AI Chat API" +curl -X POST "https://.signalwire.com/api/ai/chat" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "jsonrpc": "2.0", + "id": "req-1", + "method": "create_conversation", + "params": { + "id": "chat-demo-1", + "config_url": "https://.signalwire.com/relay-bins/" + } + }' +``` + +```json title="Response" +{ + "jsonrpc": "2.0", + "result": { + "status": "created", + "id": "chat-demo-1", + "initial_message": "Hello! Welcome to Bayview Taxi. How can I assist you with booking a ride today?" + }, + "id": "req-1" +} +``` + + + +### Send a message + +Every turn after that is a `chat` request with the same conversation ID. The agent's reply comes +back in the same response. + + + +```bash title="cURL — AI Chat API" +curl -X POST "https://.signalwire.com/api/ai/chat" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "jsonrpc": "2.0", + "id": "req-2", + "method": "chat", + "params": { + "id": "chat-demo-1", + "message": "I need a ride to the airport." + } + }' +``` + +```json title="Response" +{ + "jsonrpc": "2.0", + "result": { + "response": "Sure! Which airport are you heading to, and what time do you need the ride?" + }, + "id": "req-2" +} +``` + + + +### Read the reply + +A working turn returns the agent's reply in `result.response`, usually within a few seconds. Check +the HTTP status first. An HTTP `401 Unauthorized` means the credentials are wrong or the token lacks +the **Chat** permission, and an HTTP `400` means the request body wasn't valid JSON. + +Errors from AI chat itself arrive with HTTP `200` and an `error` object in place of `result`: + +- `-32001`, `Conversation not found`: the ID doesn't match a live conversation. Check its spelling, + or create the conversation again if it ended or sat idle past its timeout. +- `-32002`, `Configuration error`: SignalWire couldn't fetch your agent from `config_url`. Check the + agent ID at the end of the URL. + +The [AI chat REST API reference][chat-endpoint] lists the other error codes. + + + +## How an AI chat conversation works + +Your agent is the SWML document at `config_url`. A conversation is a series of turns under an ID you +choose, and IDs are scoped to your project. A turn is one user message and the agent's reply, +including any tool calls the agent makes along the way. + + + +Your server sends create_conversation with an id and config_url. SignalWire fetches your agent's SWML document from config_url and returns the agent's greeting as initial_message. On each turn, your server sends chat with the id and message; if the agent calls a tool, SignalWire posts the tool call to your web_hook_url and your server returns the result, then SignalWire returns the agent's reply as response. Your server sends end_conversation, SignalWire returns status ended, then posts the summary to your post_prompt_url. + + + + + +```mermaid +sequenceDiagram + participant App as Your server + participant SW as SignalWire + participant Agent as Your agent + + App->>SW: create_conversation: id, config_url + SW->>Agent: fetch agent + Agent-->>SW: SWML document + SW-->>App: initial_message: the agent's greeting + loop Each turn + App->>SW: chat: id, message + opt The agent calls a tool + SW->>App: tool call to web_hook_url + App-->>SW: result + end + SW-->>App: response: the agent's reply + end + App->>SW: end_conversation: id + SW-->>App: status: ended + SW->>App: summary to post_prompt_url +``` + + + +A conversation ID keeps only letters, digits, `_`, `-`, `.`, and `:`. Any other character is dropped +without an error, so `rider~2` is stored as `rider2`; use `.` when you compose IDs. A conversation +ends when you end or delete it, or after it sits idle past its `conversation_timeout`, 3600 seconds +unless you set one on the request that creates it. An ended conversation can't be reopened: a later `chat` +that passes `config_url` under the same ID starts a new conversation with no memory of the old one. + +## Hold an AI chat conversation + +The [AI chat REST API reference][chat-endpoint] documents every method, parameter, and error code. + +### Hold an AI chat conversation via the Server SDKs + +[`AIChatClient`][chat-client] sends the same methods from the Server SDKs and turns errors into +exceptions you can catch, such as `ConversationNotFoundError` when the conversation has ended or +never existed. They all subclass `AIChatError`, as listed in the +[`AIChatClient` reference](/docs/server-sdks/reference/python/agents/ai-chat-client#exceptions). + +```python title="Python — AIChatClient" +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as chat_client.py and run: python chat_client.py +import asyncio + +from signalwire.ai_chat import AIChatClient + +CONFIG_URL = "https://.signalwire.com/relay-bins/" + + +async def main(): + async with AIChatClient( + project="", token="", space="" + ) as client: + info = await client.create_conversation("chat-demo-2", config_url=CONFIG_URL) + print("Ada:", info.initial_message) + + reply = await client.chat("chat-demo-2", "I need a ride to the airport.") + print("Ada:", reply.text) + + log = await client.log("chat-demo-2") + for entry in log.messages: + if entry.get("role") in ("user", "assistant"): + print(f"{entry['role']}: {entry['content']}") + + await client.end("chat-demo-2") + + +asyncio.run(main()) +``` + +### Hold an AI chat conversation via REST + +Read the conversation back with `chat_log`, then end it with `end_conversation`. Ending starts +post-processing, such as the summary sent to your `post_prompt_url`. + + + +```bash title="cURL — AI Chat API" +curl -X POST "https://.signalwire.com/api/ai/chat" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "jsonrpc": "2.0", + "id": "req-3", + "method": "chat_log", + "params": { "id": "chat-demo-1" } + }' + +curl -X POST "https://.signalwire.com/api/ai/chat" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "jsonrpc": "2.0", + "id": "req-4", + "method": "end_conversation", + "params": { "id": "chat-demo-1" } + }' +``` + + + +`chat_log` returns every entry in `result.chat_log`. `end_conversation` returns the conversation's +`id` with `status: "ended"`, or `status: "not_found"` when no conversation has that ID. + +### Hold an AI chat conversation from a web page + +[`ChatGateway`][chat-gateway] runs inside your web application and forwards a page's messages to AI +chat. Your server holds the API token and the `config_url`. The page holds only the gateway's URL +and a publishable key, which can reach this one agent and nothing else, because the gateway injects +`config_url` itself and never accepts it from the page. + +```mermaid +flowchart LR + Browser["Web page
gateway URL + publishable key"] + Gateway["Your application
ChatGateway"] + SW["SignalWire
AI chat"] + + Browser -->|"publishable key"| Gateway + Gateway -->|"project + API token"| SW + SW -->|"the agent's reply"| Gateway + Gateway -->|"JSON response"| Browser +``` + +The server below serves the chat page and mounts the gateway at `/chat/`. Localhost is always +allowed, so it runs locally unconfigured; list your production origin in `allowed_origins`. + + + +```python title="Python — ChatGateway" +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as chat_gateway.py next to index.html and run: python chat_gateway.py +# Then open http://localhost:3000 +import uvicorn +from fastapi import FastAPI +from fastapi.responses import FileResponse +from signalwire.ai_chat import AIChatClient, ChatGateway + +gateway = ChatGateway( + config_url="https://.signalwire.com/relay-bins/", + key="", + secret="", + allowed_origins=[""], + client=AIChatClient( + project="", token="", space="" + ), +) + +app = FastAPI() +app.include_router(gateway.router(), prefix="/chat") + + +@app.get("/") +async def page(): + return FileResponse("index.html") + + +if __name__ == "__main__": + uvicorn.run(app, host="0.0.0.0", port=3000) +``` + +```html title="HTML — index.html" + + +Bayview Taxi +
+
+ +``` + +
+ +The gateway takes four methods on one endpoint, each a `POST` with the key as a bearer token. The +first `start` or `chat` returns a signed conversation handle in the `X-Chat-Handle` response header, +and every later request sends it back as `handle`. See the [gateway router reference][gateway-router]. + +| Method | Body | Returns | +|---|---|---| +| `start` | `{"method": "start"}` | `greeting`, `status`, and `timeout`, plus the `X-Chat-Handle` header | +| `chat` | `{"method": "chat", "handle", "message"}` | The AI chat JSON-RPC response | +| `log` | `{"method": "log", "handle"}` | `messages`, reduced to `user` and `assistant` entries, with `timeout` and `last_activity` | +| `end` | `{"method": "end", "handle"}` | `{"status": "ended"}` | + +A key copied from your page lets someone talk to your agent, and every turn is billed to your +project. The origin allowlist stops the key working in someone else's page, but not in a script, +which can leave out the `Origin` header. The gateway caps new conversations at 60 a minute and turns +at 200 per conversation by default; lower them with `max_new_conversations` and `max_turns`. + +### Hold an AI chat conversation over SMS text messages + +Answer text messages to your number with the agent. When a message arrives, SignalWire posts the +[inbound message webhook][inbound-message-webhook] to your server, which sends the text to AI chat and +returns a messaging SWML document whose [`reply`][swml-reply] carries the agent's answer. + +```python title="Python — AIChatClient" +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as chat_sms.py and run: python chat_sms.py +import uvicorn +from fastapi import FastAPI, Request +from signalwire.ai_chat import AIChatClient + +CONFIG_URL = "https://.signalwire.com/relay-bins/" + +client = AIChatClient(project="", token="", space="") +app = FastAPI() + + +@app.post("/sms") +async def sms(request: Request): + message = (await request.json())["message"] + if not message.get("body"): + return {"version": "1.0.0", "sections": {"main": [{"reply": "Please send your question as text."}]}} + conversation_id = "sms." + message["from"].lstrip("+") + reply = await client.chat(conversation_id, message["body"], config_url=CONFIG_URL) + return {"version": "1.0.0", "sections": {"main": [{"reply": reply.text}]}} + + +if __name__ == "__main__": + uvicorn.run(app, host="0.0.0.0", port=3000) +``` + +Then route your number's messages to this server. Create a SWML Webhook [resource][resources] whose +URL is your server's public `/sms` URL, then assign it to your number under **Inbound Message +Settings**, as the [webhooks][webhooks] page shows. Over the REST API, [create the SWML +webhook][create-swml-webhook] with `used_for` set to `messaging`, then [assign it to the +number][assign-phone-route] with `handler` set to `messaging`. + +Passing `config_url` on `chat` creates the conversation on the first message from a sender and +continues it after that, keyed on the sender's number. Anyone who can reach `/sms` can run turns +billed to your project, so in production [verify the webhook signature][verify-signature] on +each request before acting on it. + +### Move an AI chat conversation onto a phone call and back + +A rider chatting with Ada can take the conversation onto a phone call and back to text without +repeating themselves. The conversation stays open during the call. Your server reads it, places a +call whose agent starts with the chat so far, and when the call ends, writes what was said on the +call back into the conversation as a `system` message. Only two APIs are involved: AI chat, and the +[Calling API][call-commands] through the REST client's [`calling.dial`][rest-dial]. + +```python title="Python — AIChatClient and REST client" {28,32,34,41-42} +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as chat_call.py and run: python chat_call.py +# SignalWire must reach /post_prompt at . +import asyncio + +import uvicorn +from fastapi import FastAPI, Request +from signalwire.ai_chat import AIChatClient +from signalwire.rest import RestClient + +PUBLIC_URL = "" +PROMPT = ("You are Ada, the dispatcher for Bayview Taxi. Answer questions about booking a ride. " + "Keep replies to one or two sentences.") + +chat = AIChatClient(project="", token="", space="") +rest = RestClient(project="", token="", host=".signalwire.com") +app = FastAPI() + + +def dialogue(messages): + return "\n".join(f"{m['role']}: {m['content']}" for m in messages + if m.get("role") in ("user", "assistant") and m.get("content")) + + +@app.post("/call") +async def call(request: Request): + body = await request.json() + so_far = dialogue((await chat.log(body["conversation_id"])).messages) + swml = {"version": "1.0.0", "sections": {"main": [{"answer": {}}, {"ai": { + "prompt": {"text": f"{PROMPT}\n\nThe rider is moving from text chat to this call. So far:\n{so_far}"}, + "post_prompt": {"text": "Summarize the call in one sentence."}, + "post_prompt_url": f"{PUBLIC_URL}/post_prompt?conversation_id={body['conversation_id']}", + }}]}} + placed = await asyncio.to_thread(rest.calling.dial, from_="", to=body["phone"], swml=swml) + return {"call_id": placed["id"]} + + +@app.post("/post_prompt") +async def post_prompt(request: Request): + call_log = (await request.json()).get("call_log", []) + reply = await chat.chat(request.query_params["conversation_id"], role="system", + message="The rider just spoke with you on a phone call:\n" + dialogue(call_log)) + print("Ada:", reply.text) + return {} + + +if __name__ == "__main__": + uvicorn.run(app, host="0.0.0.0", port=3000) +``` + +Create a conversation as in the [first run](#hold-your-first-ai-chat-conversation), under the ID +`chat-demo-3`, and send it a message or two. Then ask your server to move it onto the rider's phone: + +```bash title="cURL" +curl -X POST "/call" \ + -H "Content-Type: application/json" \ + -d '{"conversation_id": "chat-demo-3", "phone": ""}' +``` + +The phone rings, and Ada already knows what was typed. Hang up, and a few seconds later the server +prints Ada's reply to the call; the next `chat` on `chat-demo-3` picks up from there. If the chat +doesn't know about the call, SignalWire couldn't reach `/post_prompt`. If the conversation +sits idle past its `conversation_timeout` during the call, it ends, and the call has nowhere to +write back to. + +`/call` places calls on your bill, so only your own backend should reach it. `/post_prompt` writes +into whichever conversation its query string names, so anyone who reaches it can slip a `system` +message into a conversation whose ID they know or guess. In production, +[verify the webhook signature][verify-signature] on each request before acting on it. + +A web page can move its conversation into a call in the browser instead, through +[`HandoffRouter`][handoff-router] mounted beside the gateway. The page places the call with the +Browser SDK's [`dial()`][browser-dial], passing the chat handle and a nonce in +[`userVariables`][dial-options]. Your application registers that nonce with `register` when +SignalWire fetches the call's configuration, and supplies the `capture_leg` and `end_call` callbacks +that record each leg and hang up the call. This path ends the text leg when the call starts, so +returning to text continues under a new ID, `.1`. + +## AI chat methods: create, chat, read, summarize, end, and delete + +| Method | What it does | Worth knowing | +|---|---|---| +| [`create_conversation`][client-create] | Creates a conversation | Returns `initial_message` when the agent speaks first. On an ID that is already live it returns `status: "exists"` and no greeting; pass `reinit: true` to start it over | +| [`chat`][client-chat] | Sends a message and returns the reply | With `config_url`, it creates the conversation if needed, but you never get `initial_message` | +| [`chat_log`][client-log] | Reads the conversation back | Changes nothing | +| [`summarize`][client-summarize] | Summarizes the conversation on demand | Takes an optional `summary_prompt` | +| [`end_conversation`][client-end] | Ends the conversation and starts post-processing | Triggers the summary to your `post_prompt_url` | +| [`delete`][client-delete] | Removes the conversation and its messages | Nothing is post-processed and no webhook fires | + +Messages take a `role` of `user` or `system`. A `system` message steers the agent without appearing +as something the user said. + +## Receive tool calls and summaries from an AI chat conversation + +A chat conversation sends the same webhooks as a voice AI session. Tool calls reach the +`web_hook_url` on your SWAIG functions, and the summary reaches your `post_prompt_url` a few seconds +after the conversation ends. [Tool calling][tool-calling] covers the round trip, and [webhooks][webhooks] +covers handling them in general. + +```json title="JSON" +{ + "version": "1.0.0", + "sections": { + "main": [ + { "answer": {} }, + { + "ai": { + "prompt": { + "text": "You are Ada, the dispatcher for Bayview Taxi. When the rider gives a pickup address and time, call book_ride. Keep replies to one or two sentences." + }, + "post_prompt": { "text": "Summarize the booking in one sentence." }, + "post_prompt_url": "", + "SWAIG": { + "functions": [ + { + "function": "book_ride", + "description": "Book a taxi ride", + "parameters": { + "type": "object", + "properties": { + "pickup": { "type": "string", "description": "Pickup address" }, + "time": { "type": "string", "description": "Pickup time" } + } + }, + "web_hook_url": "" + } + ] + } + } + } + ] + } +} +``` + +Both webhooks identify a chat, so one handler can serve voice and text. SignalWire also appends +`conversation_id` and `conversation_type` to the tool webhook's query string. + +| Field | [Tool webhook][swaig-webhook] | [Post-prompt callback][post-prompt-webhook] | +|---|---|---| +| `conversation_type` | `chat` | `chat` | +| `conversation_id` | Your conversation ID | Your conversation ID | +| `call_id` | Your conversation ID | A separate UUID | + +The summary arrives in `post_prompt_data.raw`. + + +`chat_log` and the post-prompt `call_log` include your prompt, `system` messages, and tool entries +alongside the dialogue. Filter to `user` and `assistant` before showing either to anyone. The +gateway's `log` already does. + + +## Next steps + + + + + Every method, parameter, return field, and error code. + + + + The Server SDKs chat client, with every method and return type. + + + + The web page gateway, with every argument, default, and cap. + + + + Connect the agent to your systems, the same way a voice agent does. + + + + Shape how the agent converses before you change any code. + + + + The SWML the agent is built from, shared with voice. + + + diff --git a/fern/products/platform/pages/ai/overview.mdx b/fern/products/platform/pages/ai/overview.mdx index 3a4bf64750..adc56c2115 100644 --- a/fern/products/platform/pages/ai/overview.mdx +++ b/fern/products/platform/pages/ai/overview.mdx @@ -16,6 +16,7 @@ import { SigmondWidget } from "@/components/index"; [chat-api]: /docs/apis/rest/ai-chat/chat-methods [chat-client]: /docs/server-sdks/reference/python/agents/ai-chat-client [chat-gateway]: /docs/server-sdks/reference/python/agents/chat-gateway +[ai-chat]: /docs/platform/ai/chat [call-transfer]: /docs/server-sdks/guides/call-transfer [compliance]: /docs/platform/compliance [content-redaction]: /docs/platform/ai/content-redaction @@ -129,7 +130,8 @@ functions, and tool results. Server applications can send text turns with [`AIChatClient`][chat-client]. Browser and mobile applications connect through [`ChatGateway`][chat-gateway], which keeps SignalWire credentials in -your trusted application rather than in the client. +your trusted application rather than in the client. [Chat with an AI agent][ai-chat] walks +through each path. Voice-specific settings, such as voices, speech hints, and end-pointing, do not apply to text. Business rules and tool implementations can remain channel-independent. A SWAIG request identifies @@ -139,7 +141,7 @@ its conversation as `voice` or `chat` when your application needs channel-specif Each authoring path produces an agent that runs on SignalWire and can connect to your systems. - + Build agents and tool handlers in application code. @@ -149,10 +151,6 @@ Each authoring path produces an agent that runs on SignalWire and can connect to Define agents directly in JSON or YAML. - - Configure agents and webhook-backed tools in your SignalWire Space. - - ## Extend your agent @@ -193,6 +191,10 @@ not only in the prompt. Structure the agent's role, conversational duties, tool guidance, and guardrails.
+ + Reach the same agent by text from your server, a web page, or a phone number. + + Collect live events and final reports to troubleshoot behavior and improve outcomes. diff --git a/fern/products/platform/pages/calling/voice/SIP/index.mdx b/fern/products/platform/pages/calling/voice/SIP/index.mdx index aab6bd3d3d..54c1658dcc 100644 --- a/fern/products/platform/pages/calling/voice/SIP/index.mdx +++ b/fern/products/platform/pages/calling/voice/SIP/index.mdx @@ -119,7 +119,7 @@ For app-specific setup steps, refer to your softphone's official documentation. ## SIP gateways -A SIP gateway is a [Resource](/docs/platform/resources) on SignalWire's Call Fabric platform that forwards calls to external SIP addresses. When you assign a phone number or other [Address](/docs/platform/addresses) to a SIP gateway, incoming calls are seamlessly routed to the configured destination with support for configurable encryption and codec settings. +A SIP gateway is a [Resource](/docs/platform/resources) that forwards calls to external SIP addresses. When you assign a phone number or other [Address](/docs/platform/addresses) to a SIP gateway, incoming calls are seamlessly routed to the configured destination with support for configurable encryption and codec settings. -SIP gateways are distinct from [SIP Credentials and Resource SIP Addresses](/docs/platform/voice/sip/sip-credentials): a SIP Credential registers your SIP devices to SignalWire, while a Resource SIP Address routes inbound calls to one of your Call Fabric resources. You can create and manage SIP gateways through the SignalWire Dashboard or programmatically via the [SIP Gateway REST API endpoint](/docs/apis/rest/sip-gateway/list-sip-gateways). +SIP gateways are distinct from [SIP Credentials and Resource SIP Addresses](/docs/platform/voice/sip/sip-credentials): a SIP Credential registers your SIP devices to SignalWire, while a Resource SIP Address routes inbound calls to one of your Resources. You can create and manage SIP gateways through the SignalWire Dashboard or programmatically via the [SIP Gateway REST API endpoint](/docs/apis/rest/sip-gateway/list-sip-gateways). diff --git a/fern/products/platform/pages/calling/voice/SIP/sip-credentials/index.mdx b/fern/products/platform/pages/calling/voice/SIP/sip-credentials/index.mdx index 078a5752f9..e4c0273309 100644 --- a/fern/products/platform/pages/calling/voice/SIP/sip-credentials/index.mdx +++ b/fern/products/platform/pages/calling/voice/SIP/sip-credentials/index.mdx @@ -77,5 +77,5 @@ resource that should handle the calls. See the For more on the resources you can route calls to, see the [SIP overview](/docs/platform/voice/sip) -and [Call Fabric Resources](/docs/platform/resources). +and [Resources](/docs/platform/resources). diff --git a/fern/products/platform/pages/calling/voice/TTS/index.mdx b/fern/products/platform/pages/calling/voice/TTS/index.mdx index bd62ab634f..f594ea598f 100644 --- a/fern/products/platform/pages/calling/voice/TTS/index.mdx +++ b/fern/products/platform/pages/calling/voice/TTS/index.mdx @@ -25,12 +25,10 @@ import { VoiceWidget } from "@/components/index"; [grok]: /docs/platform/voice/tts/grok [groq]: /docs/platform/voice/tts/groq-tts [inworld]: /docs/platform/voice/tts/inworld -[minimax]: /docs/platform/voice/tts/minimax [mistral]: /docs/platform/voice/tts/mistral [openai]: /docs/platform/voice/tts/openai [rime]: /docs/platform/voice/tts/rime [smallest]: /docs/platform/voice/tts/smallest -[speechify]: /docs/platform/voice/tts/speechify SignalWire integrates natively with leading third-party text-to-speech (TTS) providers. This guide describes supported engines, voices, and languages. @@ -48,7 +46,7 @@ Only voices from SignalWire's catalog resolve on the platform — voice IDs from account will not work. See [Custom and cloned voices](#custom-and-cloned-voices) for supported options. - +
@@ -74,14 +72,11 @@ English, Spanish, German, French, Dutch, Italian, and Japanese. offer a wide range of supported languages. - [Inworld][inworld] voices support English plus Arabic, Chinese (Mandarin), Dutch, French, German, Hebrew, Hindi, Italian, Japanese, Korean, Polish, Portuguese, Russian, and Spanish. -- [MiniMax][minimax] voices span more than 20 languages, including English, Spanish, Portuguese, -French, German, Italian, Chinese, Japanese, Korean, and many more, with automatic language detection. - [Fish Audio][fish] voices cover roughly 83 languages on the `s2.1-pro` model, with automatic language detection. - [Mistral][mistral] voices support English, French, Spanish, Portuguese, Italian, Dutch, German, Hindi, and Arabic. - [Smallest.ai][smallest] voices support English, Spanish, Hindi, and nine other Indian languages. -- [Speechify][speechify] voices are multilingual on the `simba-3.0` model. - [Groq][groq]-hosted Orpheus voices support English and Arabic (Saudi), one language per model. - All [ElevenLabs][elevenlabs], [OpenAI][openai], and [Grok][grok] voices are fully multilingual. @@ -130,12 +125,10 @@ For detailed instructions for each provider, consult the voice ID references lin | Grok | `grok.eve` | [Reference](/docs/platform/voice/tts/grok#usage) | | Groq | `groq-tts.autumn` | [Reference](/docs/platform/voice/tts/groq-tts#usage) | | Inworld | `inworld.Lauren:inworld-tts-1.5-mini` | [Reference](/docs/platform/voice/tts/inworld#voices) | -| MiniMax | `minimax.English_CalmWoman:speech-2.6-turbo` | [Reference](/docs/platform/voice/tts/minimax#voices) | | Mistral | `mistral.` | [Reference](/docs/platform/voice/tts/mistral#usage) | | OpenAI | `openai.alloy` | [Reference](/docs/platform/voice/tts/openai#usage) | | Rime | `rime.luna:coda` | [Reference](/docs/platform/voice/tts/rime#voices) | | Smallest.ai | `smallest.sophia:lightning_v3.1` | [Reference](/docs/platform/voice/tts/smallest#usage) | -| Speechify | `speechify.alicia:simba-3.0` | [Reference](/docs/platform/voice/tts/speechify#usage) | ## Custom and cloned voices diff --git a/fern/products/platform/pages/calling/voice/TTS/minimax.mdx b/fern/products/platform/pages/calling/voice/TTS/minimax.mdx index 1904eb8f98..0cd49d0292 100644 --- a/fern/products/platform/pages/calling/voice/TTS/minimax.mdx +++ b/fern/products/platform/pages/calling/voice/TTS/minimax.mdx @@ -4,6 +4,8 @@ subtitle: Text-to-speech slug: voice/tts/minimax description: Learn how to use MiniMax's expressive, multilingual TTS voices with SignalWire AI Voice applications. max-toc-depth: 3 +hidden: true +noindex: true --- diff --git a/fern/products/platform/pages/calling/voice/TTS/rime.mdx b/fern/products/platform/pages/calling/voice/TTS/rime.mdx index 015123e5ae..49482da94e 100644 --- a/fern/products/platform/pages/calling/voice/TTS/rime.mdx +++ b/fern/products/platform/pages/calling/voice/TTS/rime.mdx @@ -175,7 +175,7 @@ retrieve structured information from SignalWire's switch voices and contexts, programmatically modify its own source with the [Prompt Object Model](/docs/ai/pom/), -and transfer to other [Resources](/docs/platform/resources) on SignalWire's Call Fabric platform. +and transfer to other [Resources](/docs/platform/resources) on SignalWire. */} ### Buy and assign a phone number diff --git a/fern/products/platform/pages/calling/voice/TTS/speechify.mdx b/fern/products/platform/pages/calling/voice/TTS/speechify.mdx index 042a546857..f7b8d3dfeb 100644 --- a/fern/products/platform/pages/calling/voice/TTS/speechify.mdx +++ b/fern/products/platform/pages/calling/voice/TTS/speechify.mdx @@ -4,6 +4,8 @@ subtitle: Text-to-speech slug: voice/tts/speechify description: Learn how to use Speechify's Simba TTS voices with SignalWire AI Voice applications. max-toc-depth: 3 +hidden: true +noindex: true --- diff --git a/fern/products/platform/pages/calling/voice/call-streaming.mdx b/fern/products/platform/pages/calling/voice/call-streaming.mdx new file mode 100644 index 0000000000..8270e96e3e --- /dev/null +++ b/fern/products/platform/pages/calling/voice/call-streaming.mdx @@ -0,0 +1,1605 @@ +--- +title: Stream call audio +slug: voice/call-streaming +description: Stream a live call to your own WebSocket server with SWML, Relay, or REST, then save or process the audio as it arrives, and play audio back into the call on a bidirectional stream. +max-toc-depth: 2 +--- + +[make-and-receive-calls]: /docs/platform/voice/make-and-receive-calls +[prepare-calls]: /docs/platform/voice/make-and-receive-calls#prepare-for-your-first-call +[answer-swml]: /docs/platform/voice/make-and-receive-calls#answer-a-call-via-swml +[place-relay]: /docs/platform/voice/make-and-receive-calls#place-a-call-via-websocket-relay +[caller-id]: /docs/platform/voice/how-to-set-caller-id-or-cnam +[trial-mode]: /docs/platform/trial-mode +[webhooks]: /docs/platform/webhooks +[server-sdks]: /docs/server-sdks +[relay-guide]: /docs/server-sdks/guides/relay-client +[swml-intro]: /docs/swml +[call-commands]: /docs/apis/rest/calls/call-commands +[stream-status-callback]: /docs/apis/rest/webhooks/stream-status-callback +[swml-stream]: /docs/swml/reference/calling/stream +[swml-stop-stream]: /docs/swml/reference/calling/stop-stream +[swml-connect]: /docs/swml/reference/calling/connect +[swml-answer]: /docs/swml/reference/calling/answer +[sip-addresses]: /docs/platform/addresses#sip-addresses +[swml-join-conference]: /docs/swml/reference/calling/join-conference + +Call streaming sends the audio of a live call to a WebSocket server you run, so your app can +transcribe, analyze, record, or answer it in near real time. Start by streaming a call to your own +phone into a small server that prints what arrives, then save or process the audio, and talk back to +the caller on a bidirectional stream. + +## Choose an approach + +Each approach starts and stops streams in its own way. All of them stream to the same kind of +WebSocket server, so the server code on this page works with every approach. Follow the section for +your app's approach: + +- [SWML][swml-intro]: answer calls to your number with a document your server serves. Add `stream` + for a one-way stream, or `connect` the call to your server for a bidirectional stream. Optionally + send stream events to a webhook. +- [WebSocket (Relay)][relay-guide]: start and stop a stream from code that holds a connection to + the call. Stream events arrive in your code, so no webhook is needed. +- [REST](#stream-a-call-already-in-progress-via-rest): start and stop a one-way stream by call ID + from any process. + +## Prepare for streaming + +Start with working call setup from [Make and receive calls][make-and-receive-calls]. Have these +values ready: + +- Your Space URL, such as `.signalwire.com`. +- Your Project ID and an API token with the **Voice** permission. +- A phone number in your Space, and a phone you can call it from and answer. +- A machine that can run a small server, and a tunnel such as [ngrok](https://ngrok.com/) that + gives it a public URL. + + +SignalWire connects to your server over a secure WebSocket only, and rejects a plain `ws://` URL. +During development, run the server locally and put a TLS tunnel in front of it, as +[Run a WebSocket server](#run-a-websocket-server) shows. + + + +A [trial project][trial-mode] only places calls to and receives calls from numbers you've +purchased or verified, and can't call internationally. [Prepare for your first call][prepare-calls] +shows how to verify the phone you'll test with. + + +Replace these values in the samples you run: + +| Value | Replace with | +|---|---| +| `` | Your Space's subdomain in `.signalwire.com` | +| `` | Your Project ID | +| `` | Your API token with the Voice permission, used only in server code | +| `` | The public hostname of your server's tunnel | +| `` | Your server's stream URL, `wss:///stream` | +| `` | A password you choose for the SWML your server serves | +| `` | Your SignalWire phone number, or a [verified caller ID][caller-id], in E.164 format, when Relay places the call | +| `` | The phone you'll answer, in E.164 format, when Relay places the call | +| `` | The ID of a live call, when you start a stream over REST | + +## How call streaming works + +When a stream starts, SignalWire opens a WebSocket connection to your server and sends it the +call's audio as the call happens, in 20 ms frames. What happens to the audio next is up to your +server. It can: + +- [Save it to a file](#save-call-audio-to-a-file), as a recording you control. +- [Forward it to another service](#buffer-audio-for-processing), such as a speech-to-text or + sentiment API, and act on what comes back. +- [Send audio back into the call](#send-audio-back-on-a-bidirectional-stream), such as a recorded + prompt or the output of a voice agent. + +Sending audio back needs a bidirectional stream. A one-way stream gives your server a copy of the +call's audio while the call carries on as normal, and anything your server sends is ignored. A +bidirectional stream connects the call to your server as if the server were the other party: the +caller hears what your server sends, and the call stays connected to your server until your server +closes the connection or the call ends. + +SignalWire sends the same messages whichever approach starts the stream, so one server works with +all of them. A call can run several one-way streams at once, each with its +own `control_id`. + +## Run a WebSocket server + +Every stream in this guide connects to a server you run, at the `/stream` path. Start with one that +prints what arrives, so you can see a stream working before you write any processing code. + + + + + +This server prints the call's ID and the stream's format when the stream starts, then a line for +each second of audio it receives on each track. + + + +```python +# Install: python -m pip install fastapi "uvicorn[standard]" +# Save as stream_server.py and run: python stream_server.py +import json + +import uvicorn +from fastapi import FastAPI, WebSocket + +app = FastAPI() +FRAMES_PER_SECOND = 50 # each media message carries 20 ms of audio + + +@app.websocket("/stream") +async def stream(websocket: WebSocket): + await websocket.accept() + frames = {} + async for message in websocket.iter_text(): + event = json.loads(message) + if event["event"] == "start": + start = event["start"] + media_format = start["mediaFormat"] + print(f"Stream started for call {start['callSid']}: tracks {start['tracks']}, " + f"{media_format['encoding']} at {media_format['sampleRate']} Hz") + elif event["event"] == "media": + track = event["media"]["track"] + frames[track] = frames.get(track, 0) + 1 + if frames[track] % FRAMES_PER_SECOND == 0: + print(f"{track}: {frames[track] // FRAMES_PER_SECOND} s of audio") + elif event["event"] == "stop": + print("Stream stopped") + + +uvicorn.run(app, host="0.0.0.0", port=8080) +``` + + +```javascript +// Install: npm install ws +// Save as stream-server.mjs and run: node stream-server.mjs +import { WebSocketServer } from "ws"; + +const FRAMES_PER_SECOND = 50; // each media message carries 20 ms of audio + +const streams = new WebSocketServer({ port: 8080, path: "/stream" }); +console.log("Listening on port 8080"); + +streams.on("connection", (socket) => { + const frames = new Map(); + + socket.on("message", (data) => { + const event = JSON.parse(data.toString()); + if (event.event === "start") { + const { callSid, tracks, mediaFormat } = event.start; + console.log(`Stream started for call ${callSid}: tracks ${tracks}, ` + + `${mediaFormat.encoding} at ${mediaFormat.sampleRate} Hz`); + } else if (event.event === "media") { + const track = event.media.track; + const count = (frames.get(track) ?? 0) + 1; + frames.set(track, count); + if (count % FRAMES_PER_SECOND === 0) { + console.log(`${track}: ${count / FRAMES_PER_SECOND} s of audio`); + } + } else if (event.event === "stop") { + console.log("Stream stopped"); + } + }); +}); +``` + + + + + + + +In a second terminal, put a tunnel in front of port `8080`: + +```bash +ngrok http 8080 +``` + +ngrok prints an `https://` **Forwarding** URL. Its hostname is your ``, and your +`` is `wss:///stream`. Keep the server and the tunnel +running while you test; a new tunnel usually means a new hostname. + + + + + +### Run an echo server for bidirectional streams + +A bidirectional stream needs a server that sends audio back. This one returns each `media` payload +unchanged, so the caller hears their own voice a moment later. It confirms that audio flows in both +directions before you plug in a real speech pipeline. Run it in place of the stream server, on the +same port and tunnel, when you reach a "Talk back" section. + + + +```python +# Install: python -m pip install fastapi "uvicorn[standard]" +# Save as echo_server.py and run: python echo_server.py +import json + +import uvicorn +from fastapi import FastAPI, WebSocket + +app = FastAPI() + + +@app.websocket("/stream") +async def stream(websocket: WebSocket): + await websocket.accept() + stream_sid = None + async for message in websocket.iter_text(): + event = json.loads(message) + if event["event"] == "start": + stream_sid = event["start"]["streamSid"] + print(f"Echoing stream {stream_sid}") + elif event["event"] == "media": + await websocket.send_text(json.dumps({ + "event": "media", + "streamSid": stream_sid, + "media": {"payload": event["media"]["payload"]}, + })) + elif event["event"] == "stop": + print("Stream stopped") + + +uvicorn.run(app, host="0.0.0.0", port=8080) +``` + + +```javascript +// Install: npm install ws +// Save as echo-server.mjs and run: node echo-server.mjs +import { WebSocketServer } from "ws"; + +const streams = new WebSocketServer({ port: 8080, path: "/stream" }); +console.log("Listening on port 8080"); + +streams.on("connection", (socket) => { + let streamSid; + + socket.on("message", (data) => { + const event = JSON.parse(data.toString()); + if (event.event === "start") { + streamSid = event.start.streamSid; + console.log(`Echoing stream ${streamSid}`); + } else if (event.event === "media") { + socket.send(JSON.stringify({ + event: "media", + streamSid, + media: { payload: event.media.payload }, + })); + } else if (event.event === "stop") { + console.log("Stream stopped"); + } + }); +}); +``` + + + +## Stream call audio via SWML + +SWML has two ways to stream a call, one for each type of stream: + +- To record, transcribe, or analyze a call while it carries on as normal, use + [`stream`][swml-stream]. It starts a one-way stream and moves on to the next method at once, so + the rest of the document runs while audio streams. +- To put your own voice agent or speech pipeline on the call, use [`connect`][swml-connect] with + `to` set to `stream:`. It bridges the call to your server for a bidirectional stream, and + the document waits there until the stream ends. + +### Stream a call via SWML + +When someone calls your number, SignalWire fetches the call's SWML from your server and runs it. +Your server can serve that document and accept the stream on the same port, so the one tunnel from +[Run a WebSocket server](#run-a-websocket-server) covers both. + + + + + +Stop the stream server and run this one in its place. It's the same stream server, plus a SWML +document at its root URL that streams the call, keeps it open for twenty seconds while you talk, +and says goodbye. The document is served only to requests that carry the username `signalwire` +and the password you set. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as stream_app.py and run: python stream_app.py +import json + +import uvicorn +from fastapi import FastAPI, WebSocket +from signalwire import SWMLBuilder, SWMLService + +service = SWMLService( + name="stream-call", + basic_auth=("signalwire", ""), + schema_validation=False, +) +swml = SWMLBuilder(service) +service.add_verb("stream", {"url": ""}) +swml.say("Your call is being streamed. Say a few words.").sleep(20000).say("Goodbye.") + +app = FastAPI() +# SignalWire fetches the call's SWML from the server's root URL. +app.include_router(service.as_router()) + +FRAMES_PER_SECOND = 50 # each media message carries 20 ms of audio + + +# SignalWire streams the call's audio to /stream. +@app.websocket("/stream") +async def stream(websocket: WebSocket): + await websocket.accept() + frames = {} + async for message in websocket.iter_text(): + event = json.loads(message) + if event["event"] == "start": + start = event["start"] + media_format = start["mediaFormat"] + print(f"Stream started for call {start['callSid']}: tracks {start['tracks']}, " + f"{media_format['encoding']} at {media_format['sampleRate']} Hz") + elif event["event"] == "media": + track = event["media"]["track"] + frames[track] = frames.get(track, 0) + 1 + if frames[track] % FRAMES_PER_SECOND == 0: + print(f"{track}: {frames[track] // FRAMES_PER_SECOND} s of audio") + elif event["event"] == "stop": + print("Stream stopped") + + +uvicorn.run(app, host="0.0.0.0", port=8080) +``` + + +```javascript +// Install: npm install @signalwire/sdk@2.0.5 @hono/node-server ws +// Save as stream-app.mjs and run: node stream-app.mjs +import { serve } from "@hono/node-server"; +import { SWMLService } from "@signalwire/sdk"; +import { WebSocketServer } from "ws"; + +const service = new SWMLService({ + name: "stream-call", + basicAuth: ["signalwire", ""], +}); +const swml = service.getBuilder(); +swml.addVerb("stream", { url: "" }); +swml.say("Your call is being streamed. Say a few words.").sleep(20000).say("Goodbye."); + +// SignalWire fetches the call's SWML from the server's root URL. +const server = serve({ fetch: service.getApp().fetch, port: 8080 }); +console.log("Listening on port 8080"); + +const FRAMES_PER_SECOND = 50; // each media message carries 20 ms of audio + +// SignalWire streams the call's audio to /stream. +const streams = new WebSocketServer({ server, path: "/stream" }); + +streams.on("connection", (socket) => { + const frames = new Map(); + + socket.on("message", (data) => { + const event = JSON.parse(data.toString()); + if (event.event === "start") { + const { callSid, tracks, mediaFormat } = event.start; + console.log(`Stream started for call ${callSid}: tracks ${tracks}, ` + + `${mediaFormat.encoding} at ${mediaFormat.sampleRate} Hz`); + } else if (event.event === "media") { + const track = event.media.track; + const count = (frames.get(track) ?? 0) + 1; + frames.set(track, count); + if (count % FRAMES_PER_SECOND === 0) { + console.log(`${track}: ${count / FRAMES_PER_SECOND} s of audio`); + } + } else if (event.event === "stop") { + console.log("Stream stopped"); + } + }); +}); +``` + + + +The [Server SDKs][server-sdks] build the document with the SWML builder and serve it through +`SWMLService`, which your app mounts next to its `/stream` route. Check that the document is +reachable through the tunnel: + +```bash +curl -u "signalwire:" "https:///" +``` + +The response is the SWML document, starting with `{"version": "1.0.0"`. A `401` means the password +doesn't match the one in your server. + + + + + +Create a SWML Script that fetches the document from your server: + +1. Open **My Resources**, select **+ Add**, then **Script**, then **SWML Script**. +2. Name it **Stream call** and leave **Used For** set to **Calling**. +3. Under **Handle Calls Using**, choose **External URL** and enter + `https://signalwire:@/` in **Primary Script URL**. +4. Select **Create**. + +Then assign the script to your phone number: + + + +To do both in code, see [Answer a call via SWML][answer-swml]. + + + + + +Call your SignalWire number from your phone and say a few words. The server prints a `started` +line as the call connects, then a line for each second of audio: + +```text +Stream started for call 76ac3c36-56da-4a3e-a0d6-b5f8df6da9ad: tracks ['inbound'], audio/x-mulaw at 8000 Hz +inbound: 1 s of audio +inbound: 2 s of audio +``` + +After twenty seconds you hear "Goodbye.", the call ends, and the server prints `Stream stopped`. +The stream carries only the `inbound` track, your voice, until you +[choose other tracks](#stream-options-track-and-custom-parameters). If it doesn't work, see +[Troubleshoot call streaming](#troubleshoot-call-streaming). + + + + + +The same document in YAML, to paste into a hosted SWML Script instead: + +```yaml +version: 1.0.0 +sections: + main: + - stream: + url: + - play: + url: say:Your call is being streamed. Say a few words. + - sleep: 20000 + - play: + url: say:Goodbye. +``` + +### Talk back on a bidirectional stream via SWML + +This document plays an announcement, connects the call to your server's `/stream` route, and hangs +up once your server closes the connection. In your SWML server, replace the document with this one, +and the `/stream` handler with the [echo server's](#run-an-echo-server-for-bidirectional-streams). +Set `to` to your stream URL with a `stream:` prefix. The stream's settings, such as `codec`, +`realtime`, and `name`, sit alongside `to`. + + + +```python title="Python — SWML builder" +swml = SWMLBuilder(service) +( + swml.say("You are connected to the echo server. Speak, and you will hear yourself.") + .connect(to="stream:", codec="PCMU", realtime=True, name="echo") + .hangup() +) +``` + +```javascript title="JavaScript — SWML builder" +const swml = service.getBuilder(); +swml + .say("You are connected to the echo server. Speak, and you will hear yourself.") + .connect({ to: "stream:", codec: "PCMU", realtime: true, name: "echo" }) + .hangup(); +``` + +```yaml title="YAML" +version: 1.0.0 +sections: + main: + - play: + url: say:You are connected to the echo server. Speak, and you will hear yourself. + - connect: + to: stream: + codec: PCMU + realtime: true + name: echo + - hangup: {} +``` + +```json title="JSON" +{ + "version": "1.0.0", + "sections": { + "main": [ + { "play": { "url": "say:You are connected to the echo server. Speak, and you will hear yourself." } }, + { + "connect": { + "to": "stream:", + "codec": "PCMU", + "realtime": true, + "name": "echo" + } + }, + { "hangup": {} } + ] + } +} +``` + + + +Call your number and speak. You hear the announcement, then your own voice echoed back a moment +after you say each word. Hang up to end the call; the server prints `Stream stopped`. + +When your server closes the connection, `connect` finishes and the document continues with the +next method, here `hangup`. Put a `play` or any other method there to keep the call going instead. +To stream a whole conference in both directions, give [`join_conference`][swml-join-conference] a +`stream` object; its reference lists the settings it accepts. + +### Stop a stream via SWML + +A one-way stream runs until the call ends unless you stop it. Give `stream` a `control_id`, and +run [`stop_stream`][swml-stop-stream] with the same value when your server has what it needs. In +your SWML server, replace the document lines with these to stop the stream after twenty seconds and +keep the call open: + + + +```python title="Python — SWML builder" {1,3} +service.add_verb("stream", {"url": "", "control_id": "my-stream"}) +swml.say("Your call is being streamed. Say a few words.").sleep(20000) +service.add_verb("stop_stream", {"control_id": "my-stream"}) +swml.say("The stream has stopped. Goodbye.") +``` + +```javascript title="JavaScript — SWML builder" {1,3} +swml.addVerb("stream", { url: "", control_id: "my-stream" }); +swml.say("Your call is being streamed. Say a few words.").sleep(20000); +swml.addVerb("stop_stream", { control_id: "my-stream" }); +swml.say("The stream has stopped. Goodbye."); +``` + +```yaml title="YAML" {6,10-11} +version: 1.0.0 +sections: + main: + - stream: + url: + control_id: my-stream + - play: + url: say:Your call is being streamed. Say a few words. + - sleep: 20000 + - stop_stream: + control_id: my-stream + - play: + url: say:The stream has stopped. Goodbye. +``` + +```json title="JSON" {8,13} +{ + "version": "1.0.0", + "sections": { + "main": [ + { + "stream": { + "url": "", + "control_id": "my-stream" + } + }, + { "play": { "url": "say:Your call is being streamed. Say a few words." } }, + { "sleep": 20000 }, + { "stop_stream": { "control_id": "my-stream" } }, + { "play": { "url": "say:The stream has stopped. Goodbye." } } + ] + } +} +``` + + + +The server prints `Stream stopped` before you hear "The stream has stopped." Omit `control_id` in +both places to stop the most recently started stream. A bidirectional stream has no `stop_stream`; +your server ends it by closing the connection. + +### Track a stream via SWML + +Add `status_url` to `stream` to receive a JSON webhook when the stream starts and another when it +finishes. On a `stream:` `connect`, `status_url` must be an `https://` URL; it is notified only if +the stream connects. See the [webhooks guide][webhooks] for endpoint setup and testing. + +| Webhook field | Value | +|---|---| +| `event_type` | `calling.call.stream` | +| `params.call_id` | The call ID | +| `params.control_id` | The stream's `control_id` | +| `params.state` | `streaming` when the stream starts, then `finished` | +| `params.url` | The stream's WebSocket URL | + +```json +{ + "event_type": "calling.call.stream", + "params": { + "call_id": "2e1e66e5-5d07-413d-9668-55542992eec0", + "control_id": "my-stream", + "state": "streaming", + "url": "wss://example.com/audio-stream" + } +} +``` + +On a one-way stream, `streaming` means SignalWire started the stream, not that your server accepted +the connection, so confirm the connection from your server's output. The +[stream status callback reference][stream-status-callback] lists every field. + +## Stream call audio via WebSocket (Relay) + +Start a one-way stream on an answered call with `call.stream()`. It returns a stream action that +keeps the `control_id` for you; call its `stop()` method to end the stream. For a bidirectional +stream, pass a device of type `stream` to `call.connect()`. It must be the only device in the +list. + +### Stream a call via WebSocket (Relay) + +Dial your phone, start a stream, and keep the call open for twenty seconds while you talk. Call +setup follows [Place a call via WebSocket (Relay)][place-relay]. + + + + + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as stream_call_relay.py and run: python stream_call_relay.py +import asyncio +from signalwire.relay import RelayClient + +client = RelayClient( + project="", + token="", + host=".signalwire.com", + contexts=["default"], +) + +async def main(): + async with client: + call = await client.dial( + devices=[[{ + "type": "phone", + "params": { + "from_number": "", + "to_number": "", + "timeout": 30, + }, + }]], + ) + + await call.stream(url="") + await call.play([{ + "type": "tts", + "params": {"text": "Your call is being streamed. Say a few words."}, + }]) + await asyncio.sleep(20) + + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + await call.play( + [{"type": "tts", "params": {"text": "Goodbye."}}], + on_completed=hang_up_after_playback, + ) + await call.wait_for_ended() + +asyncio.run(main()) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as stream-call-relay.mjs, +// then run: node stream-call-relay.mjs +import { RelayClient } from "@signalwire/sdk"; + +const client = new RelayClient({ + project: "", + token: "", + host: ".signalwire.com", + contexts: ["default"], +}); + +await client.connect(); + +try { + const call = await client.dial([[{ + type: "phone", + params: { + from_number: "", + to_number: "", + timeout: 30, + }, + }]]); + + await call.stream(""); + await call.play([ + { type: "tts", text: "Your call is being streamed. Say a few words." }, + ]); + await new Promise((resolve) => setTimeout(resolve, 20_000)); + + await call.play([{ type: "tts", text: "Goodbye." }], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + await call.waitForEnded(); +} finally { + await client.disconnect(); +} +``` + + + + + + + +Answer your phone and say a few words. The stream server prints a `started` line, then a line for +each second of `inbound` audio. After twenty seconds you hear "Goodbye.", the call ends, and the +server prints `Stream stopped`. If it doesn't work, see +[Troubleshoot call streaming](#troubleshoot-call-streaming). + + + + + +### Talk back on a bidirectional stream via WebSocket (Relay) + +Run the [echo server](#run-an-echo-server-for-bidirectional-streams) instead of the stream server. +This program dials, plays an announcement, then connects the call to your server through a `stream` +device. `connect()` returns as soon as SignalWire accepts the request, so the program follows the +bridge through `calling.call.connect` events and hangs up when the bridge ends. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as echo_call_relay.py and run: python echo_call_relay.py +import asyncio +from signalwire.relay import ConnectEvent, RelayClient + +client = RelayClient( + project="", + token="", + host=".signalwire.com", + contexts=["default"], +) + +async def main(): + async with client: + call = await client.dial( + devices=[[{ + "type": "phone", + "params": { + "from_number": "", + "to_number": "", + "timeout": 30, + }, + }]], + ) + + async def on_connect(event: ConnectEvent): + print(f"Stream bridge: {event.connect_state}") + # The bridge ends when your server closes the connection. + if event.connect_state in ("disconnected", "failed") and call.state != "ended": + await call.hangup() + + call.on("calling.call.connect", on_connect) + announcement = await call.play([{ + "type": "tts", + "params": {"text": "You are connected to the echo server. Speak, and you will hear yourself."}, + }]) + await announcement.wait() + await call.connect( + devices=[[{ + "type": "stream", + "params": { + "url": "", + "codec": "PCMU", + "realtime": True, + "name": "echo", + }, + }]], + ) + await call.wait_for_ended() + +asyncio.run(main()) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as echo-call-relay.mjs, +// then run: node echo-call-relay.mjs +import { RelayClient } from "@signalwire/sdk"; + +const client = new RelayClient({ + project: "", + token: "", + host: ".signalwire.com", + contexts: ["default"], +}); + +await client.connect(); + +try { + const call = await client.dial([[{ + type: "phone", + params: { + from_number: "", + to_number: "", + timeout: 30, + }, + }]]); + + call.on("calling.call.connect", async (event) => { + const state = event.params.connect_state; + console.log(`Stream bridge: ${state}`); + // The bridge ends when your server closes the connection. + if ((state === "disconnected" || state === "failed") && call.state !== "ended") { + await call.hangup(); + } + }); + const announcement = await call.play([ + { type: "tts", text: "You are connected to the echo server. Speak, and you will hear yourself." }, + ]); + await announcement.wait(); + await call.connect([[{ + type: "stream", + params: { + url: "", + codec: "PCMU", + realtime: true, + name: "echo", + }, + }]]); + await call.waitForEnded(); +} finally { + await client.disconnect(); +} +``` + + + +Answer and speak to hear your voice echoed back. The program prints `connected` while audio flows, +then `disconnected` when you hang up, or `failed` if SignalWire couldn't reach your URL. + +The call stays bridged to your server until your server closes the connection or the call ends. +This program hangs up when the bridge ends; to keep the call going instead, play audio or connect +it elsewhere. + +### Stop a stream via WebSocket (Relay) + +Keep the action that `call.stream()` returns, and call its `stop()` method when your server has +what it needs. In the [Stream a call via WebSocket (Relay)](#stream-a-call-via-websocket-relay) +program, replace the stream and sleep lines with these: + + + +```python title="Python — Relay client" {1,7} +stream = await call.stream(url="") +await call.play([{ + "type": "tts", + "params": {"text": "Your call is being streamed. Say a few words."}, +}]) +await asyncio.sleep(20) +await stream.stop() +``` + +```typescript title="TypeScript — Relay client" {1,6} +const stream = await call.stream(""); +await call.play([ + { type: "tts", text: "Your call is being streamed. Say a few words." }, +]); +await new Promise((resolve) => setTimeout(resolve, 20_000)); +await stream.stop(); +``` + + + +To stop a stream from a process that doesn't hold the call, use the REST +[`calling.stream.stop`](#stream-a-call-already-in-progress-via-rest) command with the stream's +`control_id`, which the action exposes as `control_id` in Python and `controlId` in TypeScript. + +### Track a stream via WebSocket (Relay) + +Stream events arrive in your code over the same connection: + +| Event | What to read | Typical action | +|---|---|---| +| `calling.call.stream` | `state` is `streaming` when the stream starts, then `finished`; `control_id` identifies the stream | Log it, or clean up when the stream finishes | +| `calling.call.connect` | `connect_state` moves from `connecting` to `connected` while audio flows, then `disconnected`, or `failed` if SignalWire couldn't reach your URL | Retry or hang up on `failed` | + +To log one-way stream events, register a handler before you call `call.stream()`: + + + +```python title="Python — Relay client" +from signalwire.relay import StreamEvent + +def on_stream(event: StreamEvent): + print(f"Stream {event.control_id} is {event.state}") + +call.on("calling.call.stream", on_stream) +``` + +```typescript title="TypeScript — Relay client" +call.on("calling.call.stream", (event) => { + console.log(`Stream ${event.params.control_id} is ${event.params.state}`); +}); +``` + + + +As with the SWML webhook, `streaming` means SignalWire started the stream, not that your server +accepted the connection. + +## Stream a call already in progress via REST + +When a process that doesn't hold the call needs to stream it, send the `calling.stream` command +with the answered call's ID, a `control_id`, and the stream's `url`. The call ID is the `id` from +the `dial` response, or the `call_id` delivered to your SWML endpoint or status webhook. To try it, +make a call from the [first run](#stream-a-call-via-swml), and while it's up, run this program with +the call ID your stream server printed. The [Server SDKs][server-sdks] wrap both commands; this program +streams the call for ten seconds, then sends `calling.stream.stop` with the same `control_id`: + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as stream_rest.py and run: python stream_rest.py +import time + +from signalwire.rest import RestClient + +client = RestClient( + project="", + token="", + host=".signalwire.com", +) + +client.calling.stream( + "", + url="", + control_id="rest-stream", +) +time.sleep(10) +client.calling.stream_stop("", control_id="rest-stream") +print("Stream stopped") +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as stream-rest.mjs, +// then run: node stream-rest.mjs +import { RestClient } from "@signalwire/sdk"; + +const client = new RestClient({ + project: "", + token: "", + host: ".signalwire.com", +}); + +await client.calling.stream("", { + url: "", + control_id: "rest-stream", +}); +await new Promise((resolve) => setTimeout(resolve, 10_000)); +await client.calling.streamStop("", { control_id: "rest-stream" }); +console.log("Stream stopped"); +``` + + + +The server prints a second `started` line for the REST stream, and `Stream stopped` ten seconds +later while the call carries on. The other stream settings, such as `track`, `codec`, and +`status_url`, sit alongside `url`. In Python, pass `status_url` through `extras`. + +The command doesn't echo the `control_id`, so keep the value you sent. To call the REST API +directly, send these requests to [Call commands][call-commands]: + + + + + +`calling.stream.stop` stops one-way streams only. A bidirectional stream ends when your server +closes the WebSocket. + +## Handle stream audio on your server + +The stream server prints what arrives; a real app decodes it. This section covers the messages in +full, the stream settings that shape the audio, and two servers you can swap in for the stream +server: one saves the audio and one processes it as it arrives. Both work with the calls above +unchanged. If your server also serves your SWML, keep its SWML lines and replace only the `/stream` +handler. + +### Messages your server receives + +SignalWire sends each message as JSON text. Every message has an `event` field that names its type, +so your server parses each message and branches on `event`. Every message after `connected` also +carries a `sequenceNumber`, a string counter that starts at `"1"` and increments with each message +on the connection. + +| `event` | When it arrives | Fields you use | +|---|---|---| +| `connected` | Once, when the WebSocket opens | None; wait for `start` | +| `start` | Once, before any audio | `start.streamSid`, `start.callSid`, `start.tracks`, `start.mediaFormat`, `start.customParameters` | +| `media` | For each frame of audio on each track | `media.track`, `media.chunk`, `media.timestamp`, `media.payload` | +| `dtmf` | When a key is pressed on the call | `dtmf.digit`, one of `0` to `9`, `*`, `#`, or `A` to `D`; `dtmf.duration` | +| `mark` | Bidirectional streams only, in reply to a `mark` your server sent | `mark.name` | +| `stop` | Once, when the stream stops or the call ends | None; finish your per-stream work | + +Set up your per-stream state on `start`: + +```json +{ + "event": "start", + "sequenceNumber": "1", + "start": { + "streamSid": "7d56cc11-536d-4a45-b4fb-ed3d55be843b", + "callSid": "76ac3c36-56da-4a3e-a0d6-b5f8df6da9ad", + "tracks": ["inbound", "outbound"], + "customParameters": {"session_id": "abc123"}, + "mediaFormat": {"encoding": "audio/x-mulaw", "sampleRate": 8000, "channels": 2} + } +} +``` + +- `streamSid` identifies the stream. Each stream gets its own connection, so a server handling many + calls tells them apart by it. Send it back on every message to a bidirectional stream. +- `callSid` is the ID of the call being streamed. +- `tracks` lists the tracks that will arrive: `inbound`, `outbound`, or both. +- `mediaFormat` describes the audio. `encoding` names the codec and `sampleRate` is in hertz. + `channels` is the number of tracks; each `media` message still carries a single track. +- `customParameters` holds the custom parameters you set when you started the stream, if any. + +Each `media` message carries one frame of one track: + +```json +{ + "event": "media", + "sequenceNumber": "42", + "media": { + "track": "inbound", + "chunk": "41", + "timestamp": "820", + "payload": "" + } +} +``` + +- `track` is `inbound`, what the person on the call says, or `outbound`, what they hear. +- `chunk` counts frames on that track, starting at `"1"`. +- `timestamp` is in milliseconds and advances one frame per message. Both tracks share it, so use + it rather than arrival order to align or mix them. +- `payload` is the base64-encoded audio. + +### Choose a stream codec for the call + +The stream has its own codec, separate from the codec the call uses. SignalWire converts the call's +audio to the stream's `codec` before sending it to your server, and on a bidirectional stream +converts the audio your server sends back into the call's codec. When you don't set `codec`, every +stream uses `PCMU`, 8 kHz G.711 µ-law, whatever the call type. + +A stream can't carry more detail than the call does. Streaming a call that uses an 8 kHz codec at +16 kHz only resamples the same audio. Choose the stream codec from the call's own codec: + +| The call's codec | Audio the call carries | Stream `codec` to request | +|---|---|---| +| `PCMU`, `PCMA`, or `G729` | 8 kHz narrowband | `PCMU`, the default | +| `G722` or `AMR-WB` | 16 kHz wideband | `L16@16000h` | +| `OPUS` | Up to 48 kHz | `L16@16000h`, or `L16@24000h` when your speech model accepts it | + +Where the call's codec comes from depends on the call type: + +- Calls to and from phone numbers use a codec SignalWire sets, and the `codecs` settings in SWML + have no effect on them. Stream them with the default `PCMU`. +- SIP calls use a codec from the list your SIP endpoint or [SIP Address][sip-addresses] allows. In + SWML, `codecs` on [`answer`][swml-answer] or [`connect`][swml-connect] sets the codecs offered, + for example `G722` when you want wideband audio to stream. +- Browser SDK calls use WebRTC, and browsers support `OPUS`, so these calls can carry wideband + audio. + +Request `L16` when your speech model expects linear PCM, at the sample rate the model wants, even +on an 8 kHz call. Other codecs and packet-time modifiers are listed in the +[`connect` reference][swml-connect]. SignalWire doesn't start a stream whose codec it doesn't accept. + +| Stream `codec` | `mediaFormat.encoding` | `mediaFormat.sampleRate` | +|---|---|---| +| `PCMU` (default) | `audio/x-mulaw` | 8000 | +| `L16@16000h` | `audio/x-L16` | 16000 | +| `L16@24000h` | `audio/x-L16` | 24000 | + +A decoded `payload` is raw audio with no file header. Each frame is 20 ms by default: 160 bytes of +`PCMU`, or 640 bytes of `L16` at 16 kHz. `L16` audio is 16-bit signed samples in little-endian byte +order. + +### Stream options: track and custom parameters + +`track` selects which side of the conversation a one-way stream sends. `inbound_track`, the default, +is what the person on the call says; `outbound_track` is what they hear; `both_tracks` sends both, +with each `media` message labeled by track. A bidirectional stream sends only the `inbound` track. + +Two more settings connect a WebSocket to the rest of your application: + +- `custom_parameters` is an object you set when you start the stream. Its keys arrive as + `start.customParameters`, so pass your own session or customer IDs here rather than in the URL. +- `authorization_bearer_token` is sent as `Authorization: Bearer ` on the WebSocket + handshake. Reject connections that don't carry the token you expect. + +### Save call audio to a file + +This server writes each track to its own file as audio arrives, so memory use stays flat on a long +call. It closes the files when the stream stops or the connection drops. Run it in place of the +stream server, then make the call from your first run again. Add `track: both_tracks` to the stream to get +a second file with what the caller hears. + + + +```python +# Install: python -m pip install fastapi "uvicorn[standard]" +# Save as save_audio.py and run: python save_audio.py +import base64 +import json + +import uvicorn +from fastapi import FastAPI, WebSocket + +app = FastAPI() + + +@app.websocket("/stream") +async def stream(websocket: WebSocket): + await websocket.accept() + files = {} + try: + async for message in websocket.iter_text(): + event = json.loads(message) + if event["event"] == "start": + stream_sid = event["start"]["streamSid"] + for track in event["start"]["tracks"]: + files[track] = open(f"{stream_sid}-{track}.ulaw", "wb") + print(f"Recording stream {stream_sid}") + elif event["event"] == "media": + audio = base64.b64decode(event["media"]["payload"]) + files[event["media"]["track"]].write(audio) + elif event["event"] == "stop": + break + finally: + # Runs when the stream stops or the connection drops. + for file in files.values(): + file.close() + print(f"Saved {file.name}") + + +uvicorn.run(app, host="0.0.0.0", port=8080) +``` + + +```javascript +// Install: npm install ws +// Save as save-audio.mjs and run: node save-audio.mjs +import { createWriteStream } from "node:fs"; +import { WebSocketServer } from "ws"; + +const server = new WebSocketServer({ port: 8080, path: "/stream" }); +console.log("Listening on port 8080"); + +server.on("connection", (socket) => { + const files = new Map(); + + socket.on("message", (data) => { + const event = JSON.parse(data.toString()); + if (event.event === "start") { + const { streamSid, tracks } = event.start; + for (const track of tracks) { + files.set(track, createWriteStream(`${streamSid}-${track}.ulaw`)); + } + console.log(`Recording stream ${streamSid}`); + } else if (event.event === "media") { + files.get(event.media.track).write(Buffer.from(event.media.payload, "base64")); + } + }); + + // Runs when the stream stops or the connection drops. + socket.on("close", () => { + for (const file of files.values()) { + file.end(); + console.log(`Saved ${file.path}`); + } + }); +}); +``` + + + +When the call ends, the server prints `Saved` with each file's name. The files hold raw `PCMU` +audio with no header. Convert one to WAV with [ffmpeg](https://ffmpeg.org/) to play it: + +```bash +ffmpeg -f mulaw -ar 8000 -ac 1 -i -inbound.ulaw inbound.wav +``` + +For an `L16` stream, use `-f s16le` and the stream's sample rate, such as `-ar 16000`. Audio from +the moment before your server accepts the connection isn't streamed, so a file can start a fraction +of a second into the call. + +### Buffer audio for processing + +Speech-to-text services, voice agents, and analytics usually want audio in fixed-size pieces rather +than one `media` message at a time. Buffer each track by bytes, and hand a window to your processing +whenever the buffer holds enough audio. With `PCMU`, one byte is one sample, so a one-second window +is `sampleRate` bytes. + +This server cuts one-second windows and measures each one's loudness. Replace `analyze` with your +processing, such as a request to a speech-to-text API. + + + +```python +# Install: python -m pip install fastapi "uvicorn[standard]" +# Save as process_audio.py and run: python process_audio.py +import base64 +import json +import math + +import uvicorn +from fastapi import FastAPI, WebSocket + +app = FastAPI() + + +def mulaw_to_linear(value): + # Decode one G.711 µ-law byte to a 16-bit sample. + value = ~value & 0xFF + exponent = (value >> 4) & 0x07 + sample = ((((value & 0x0F) << 3) + 0x84) << exponent) - 0x84 + return -sample if value & 0x80 else sample + + +def analyze(track, window): + samples = [mulaw_to_linear(value) for value in window] + rms = math.sqrt(sum(sample * sample for sample in samples) / len(samples)) + level = 20 * math.log10(max(rms, 1) / 32768) + print(f"{track}: {level:.0f} dBFS") + + +@app.websocket("/stream") +async def stream(websocket: WebSocket): + await websocket.accept() + buffers = {} + window_bytes = 8000 + async for message in websocket.iter_text(): + event = json.loads(message) + if event["event"] == "start": + window_bytes = event["start"]["mediaFormat"]["sampleRate"] + buffers = {track: bytearray() for track in event["start"]["tracks"]} + elif event["event"] == "media": + track = event["media"]["track"] + buffer = buffers[track] + buffer += base64.b64decode(event["media"]["payload"]) + if len(buffer) >= window_bytes: + analyze(track, bytes(buffer[:window_bytes])) + del buffer[:window_bytes] + + +uvicorn.run(app, host="0.0.0.0", port=8080) +``` + + +```javascript +// Install: npm install ws +// Save as process-audio.mjs and run: node process-audio.mjs +import { WebSocketServer } from "ws"; + +function mulawToLinear(byte) { + // Decode one G.711 µ-law byte to a 16-bit sample. + const value = ~byte & 0xff; + const exponent = (value >> 4) & 0x07; + const sample = ((((value & 0x0f) << 3) + 0x84) << exponent) - 0x84; + return value & 0x80 ? -sample : sample; +} + +function analyze(track, window) { + let sum = 0; + for (const byte of window) sum += mulawToLinear(byte) ** 2; + const rms = Math.sqrt(sum / window.length); + const level = 20 * Math.log10(Math.max(rms, 1) / 32768); + console.log(`${track}: ${level.toFixed(0)} dBFS`); +} + +const server = new WebSocketServer({ port: 8080, path: "/stream" }); +console.log("Listening on port 8080"); + +server.on("connection", (socket) => { + const buffers = new Map(); + let windowBytes = 8000; + + socket.on("message", (data) => { + const event = JSON.parse(data.toString()); + if (event.event === "start") { + windowBytes = event.start.mediaFormat.sampleRate; + for (const track of event.start.tracks) buffers.set(track, Buffer.alloc(0)); + } else if (event.event === "media") { + const track = event.media.track; + let buffer = Buffer.concat([buffers.get(track), Buffer.from(event.media.payload, "base64")]); + if (buffer.length >= windowBytes) { + analyze(track, buffer.subarray(0, windowBytes)); + buffer = buffer.subarray(windowBytes); + } + buffers.set(track, buffer); + } + }); +}); +``` + + + +Run it in place of the stream server, make the call from your first run again, and speak. The server prints +a line per second for each track, in dBFS, and the number rises toward zero while that side talks. + +`analyze` runs inside the receive loop, which suits quick work like this. For slow work such as a +network request, hand each window to a background task, so the server keeps reading audio while it +waits. The decoder assumes the default `PCMU` codec. `L16` audio is already linear 16-bit PCM, so +skip the decoding and read two bytes per sample; a one-second window then holds `sampleRate * 2` +bytes. + +## Send audio back on a bidirectional stream + +On a bidirectional stream, SignalWire plays the audio your server sends into the call. The stream's +`realtime` setting decides what happens to audio your server sends faster than it plays: + +- `realtime: false` (the default): SignalWire queues the audio and plays it in order. The queue is + bounded; once it fills, new audio and marks are dropped. +- `realtime: true`: SignalWire keeps the queue short and drops new audio while it backs up, so + playback stays close to live. + +In either mode, send audio in small chunks at about the rate it plays. Sending an entire file at +once fills the queue, and a very large backlog ends the stream. + +### Messages your server sends back + +Your server sends JSON messages to SignalWire on the same connection. Include the `streamSid` from +the `start` message on each one, as the samples do. + + + + +Plays `media.payload`, base64-encoded raw audio in the stream's codec, into the call. SignalWire +queues these messages and plays them in order. Send raw audio only: a payload that includes a file +header, such as a WAV header, plays as noise. + +```json +{ + "event": "media", + "streamSid": "", + "media": { "payload": "" } +} +``` + + + + +Asks SignalWire to send a `mark` message with the same `mark.name` back once everything queued +before it has played, or right away if nothing is queued. Use it to learn when a prompt has +finished. + +```json +{ + "event": "mark", + "streamSid": "", + "mark": { "name": "prompt-done" } +} +``` + + + + +Stops playback and empties the queue, including key presses your server queued, so you can +interrupt what the caller hears, for example when they start talking or press a key. Marks still +waiting in the queue come back at once, so after a `clear`, treat returned marks as acknowledgments +of cleared audio, not proof that the caller heard it. + +```json +{ + "event": "clear", + "streamSid": "" +} +``` + + + + +Sends `dtmf.digit`, one of `0` to `9`, `*`, `#`, or `A` to `D`, into the call as a key press. Add +`dtmf.duration` to set how long the key is held. + +```json +{ + "event": "dtmf", + "streamSid": "", + "dtmf": { "digit": "1" } +} +``` + + + + +### Play your own audio into the call + +To play audio your server produces, such as a recorded prompt or text-to-speech output, convert it +to the stream's codec, split it into frames, and send each frame as a `media` message. This server +plays a prompt when the stream starts, lets the caller skip it with any key, and closes the +connection once the prompt has finished or been skipped. + +The server sends 160-byte frames of 8 kHz µ-law audio about every 20 ms. After the final frame, +it sends a `mark` and waits for the acknowledgment before closing. On a key press, it stops +sending, sends `clear`, and closes. Receiving continues while audio plays. + +Convert your prompt to raw 8 kHz µ-law with no header first, for example with +`ffmpeg -i prompt.mp3 -ar 8000 -ac 1 -f mulaw prompt.ulaw`, and save `prompt.ulaw` next to the server. + + + +```python +# Install: python -m pip install fastapi "uvicorn[standard]" +# Save as play_audio.py next to prompt.ulaw and run: python play_audio.py +import asyncio +import base64 +import json + +import uvicorn +from fastapi import FastAPI, WebSocket + +app = FastAPI() +FRAME_BYTES = 160 # 20 ms of 8 kHz µ-law audio + +with open("prompt.ulaw", "rb") as prompt_file: + PROMPT = prompt_file.read() + + +async def play(websocket, stream_sid, audio): + for offset in range(0, len(audio), FRAME_BYTES): + frame = audio[offset:offset + FRAME_BYTES] + await websocket.send_text(json.dumps({ + "event": "media", + "streamSid": stream_sid, + "media": {"payload": base64.b64encode(frame).decode()}, + })) + # Send one frame every 20 ms, the rate it plays. + await asyncio.sleep(0.02) + # SignalWire sends this mark back once everything before it has played. + await websocket.send_text(json.dumps({ + "event": "mark", + "streamSid": stream_sid, + "mark": {"name": "prompt-done"}, + })) + + +@app.websocket("/stream") +async def stream(websocket: WebSocket): + await websocket.accept() + stream_sid = None + player = None + try: + async for message in websocket.iter_text(): + event = json.loads(message) + if event["event"] == "start": + stream_sid = event["start"]["streamSid"] + player = asyncio.create_task(play(websocket, stream_sid, PROMPT)) + elif event["event"] == "dtmf" and player: + # Any key skips the prompt: stop sending, then drop what is queued. + player.cancel() + await websocket.send_text(json.dumps({"event": "clear", "streamSid": stream_sid})) + print(f"Prompt skipped with {event['dtmf']['digit']}") + break + elif event["event"] == "mark" and event["mark"]["name"] == "prompt-done": + print("Prompt finished") + break + finally: + if player: + player.cancel() + await websocket.close() + + +uvicorn.run(app, host="0.0.0.0", port=8080) +``` + + +```javascript +// Install: npm install ws +// Save as play-audio.mjs next to prompt.ulaw and run: node play-audio.mjs +import { readFileSync } from "node:fs"; +import { WebSocketServer } from "ws"; + +const FRAME_BYTES = 160; // 20 ms of 8 kHz µ-law audio +const FRAME_MS = 20; +const PROMPT = readFileSync("prompt.ulaw"); + +const server = new WebSocketServer({ port: 8080, path: "/stream" }); +console.log("Listening on port 8080"); + +server.on("connection", (socket) => { + let streamSid; + let timer; + + function play(audio) { + let offset = 0; + // Send one frame every 20 ms, the rate it plays. + timer = setInterval(() => { + if (offset >= audio.length) { + clearInterval(timer); + // SignalWire sends this mark back once everything before it has played. + socket.send(JSON.stringify({ event: "mark", streamSid, mark: { name: "prompt-done" } })); + return; + } + const frame = audio.subarray(offset, offset + FRAME_BYTES); + socket.send(JSON.stringify({ event: "media", streamSid, media: { payload: frame.toString("base64") } })); + offset += FRAME_BYTES; + }, FRAME_MS); + } + + socket.on("message", (data) => { + const event = JSON.parse(data.toString()); + if (event.event === "start") { + streamSid = event.start.streamSid; + play(PROMPT); + } else if (event.event === "dtmf") { + // Any key skips the prompt: stop sending, then drop what is queued. + clearInterval(timer); + socket.send(JSON.stringify({ event: "clear", streamSid })); + console.log(`Prompt skipped with ${event.dtmf.digit}`); + socket.close(); + } else if (event.event === "mark" && event.mark.name === "prompt-done") { + console.log("Prompt finished"); + socket.close(); + } + }); + socket.on("close", () => clearInterval(timer)); +}); +``` + + + +Run it in place of the echo server, then make your Talk back call again. You hear the announcement, +then your prompt. Let it finish, or press a key to cut it short; either way the server prints the +outcome and closes the connection, and the call hangs up. + +## Troubleshoot call streaming + +Find the symptom you see: + +- **The call plays normally, but your server prints nothing.** SignalWire couldn't reach your stream + URL, and the call carried on without a stream. Check that the URL begins with `wss://` and ends + with `/stream`, and that the tunnel is running and points at port `8080`. A Relay program reports + the same problem on a bidirectional stream as the `failed` connect state. +- **You hear an error or silence when you call your number.** SignalWire couldn't fetch your SWML. + Rerun the `curl` check with the exact URL in the SWML Script, and confirm that the server and the + tunnel are still running. A `401` means the password in the URL doesn't match the server's. +- **You hear your number's old behavior.** The number still points at another Resource. Open it + under **Phone Numbers** and check **Inbound Call Settings**. +- **The phone never rings, or the call doesn't connect.** Check that `` is a number + in your Space or a verified caller ID. A trial project only calls and receives calls from verified + numbers. +- **You hear silence on a bidirectional stream.** Check that the call uses `connect`, or a `stream` + device in Relay, rather than a one-way `stream`, which ignores anything your server sends. +- **Your prompt plays as loud static.** The audio has a file header, or isn't in the stream's codec. + Convert it to raw 8 kHz µ-law, as [Play your own audio into the call](#play-your-own-audio-into-the-call) + shows. diff --git a/fern/products/platform/pages/calling/voice/machine-detection.mdx b/fern/products/platform/pages/calling/voice/machine-detection.mdx new file mode 100644 index 0000000000..6fd0a65033 --- /dev/null +++ b/fern/products/platform/pages/calling/voice/machine-detection.mdx @@ -0,0 +1,843 @@ +--- +title: Detect machines +slug: voice/machine-detection +description: Detect people, voicemail, and fax machines, then act on the result with SWML, Relay, or REST. +max-toc-depth: 3 +--- + +[make-and-receive-calls]: /docs/platform/voice/make-and-receive-calls +[prepare-calls]: /docs/platform/voice/make-and-receive-calls#prepare-for-your-first-call +[place-swml]: /docs/platform/voice/make-and-receive-calls#place-a-call-via-swml +[answer-swml]: /docs/platform/voice/make-and-receive-calls#answer-a-call-via-swml +[place-relay]: /docs/platform/voice/make-and-receive-calls#place-a-call-via-websocket-relay +[answer-relay]: /docs/platform/voice/make-and-receive-calls#answer-a-call-via-websocket-relay +[caller-id]: /docs/platform/voice/how-to-set-caller-id-or-cnam +[trial-mode]: /docs/platform/trial-mode +[tcpa]: /docs/platform/compliance/tcpa +[webhooks]: /docs/platform/webhooks +[swml-detect-machine]: /docs/swml/reference/calling/detect-machine +[swml-switch]: /docs/swml/reference/calling/switch +[swml-ai]: /docs/swml/reference/calling/ai +[swml-receive-fax]: /docs/swml/reference/calling/receive-fax +[call-commands]: /docs/apis/rest/calls/call-commands + +Machine detection lets SignalWire identify whether a person, voicemail, or a fax machine is on +the call so your app can choose what happens next. This guide shows two flows: greet a person +or leave a voicemail, and send a document when a fax machine answers. + +## How detection works + +SignalWire listens to audio on an answered call. A short greeting followed by silence suggests a +person; longer speech suggests voicemail or an IVR menu. Fax detection listens for a fax tone. +If there isn't enough audio to decide, your app needs a fallback for the uncertain result. + +Voicemail detection can also wait for the greeting to end before you leave a message. The +sections below explain how to handle these results in each approach. + +## Choose an approach + +Follow the section for your app's approach: + +- [SWML](#detect-machines-via-swml): add `detect_machine` to your call document and branch on + the result. Optionally send events to a webhook. +- [WebSocket (Relay)](#detect-machines-via-websocket-relay): start detection on an answered call + and handle events in your code. No public URL is needed. +- [REST](#detect-on-a-call-already-in-progress-via-rest): start detection by call ID from any + process and receive results at a webhook. + +## Prepare for detection + +Start with working call setup from [Make and receive calls][make-and-receive-calls]. Test AMD +(answering machine detection) with a phone you can answer or send to voicemail. To test fax +detection, use a fax destination and a publicly accessible PDF. + + +A [trial project][trial-mode] only places calls to and receives calls from numbers you've +purchased or verified. [Prepare for your first call][prepare-calls] shows how to verify the phone +you'll test with. + + + +Prerecorded and synthesized voicemail messages fall under consent, do-not-call, and calling-hour +rules. Read the [TCPA guide][tcpa] before you dial anyone but yourself. + + +Replace these values in the samples you run: + +| Value | Replace with | +|---|---| +| `` | Your Space's subdomain in `.signalwire.com` | +| `` | Your Project ID | +| `` | Your API token, used only in server code | +| `` | Your SignalWire phone number, or a [verified caller ID][caller-id], in E.164 format | +| `` | The phone or fax number you'll call, in E.164 format | +| `` | The public URL of a PDF that SignalWire can fetch and fax | + +## Detect machines via SWML + +[`detect_machine`][swml-detect-machine] pauses the document by default, then sets `detect_result`. +Use [`switch`][swml-switch] to choose the next action. + +| `detect_result` | Meaning | Typical action | +|---|---|---| +| `human` | A short greeting followed by silence | Play a message or connect an agent | +| `machine` | Speech exceeds the voice or word threshold, or a beep is heard | Leave voicemail if you waited for the greeting to end; otherwise hang up | +| `fax` | The configured fax tone was detected | Send or receive a fax | +| `unknown` | No decision before `timeout` | Greet the caller or use another fallback | +| `failed` | Invalid settings, missing `status_url` with `wait: false`, or detection already running | Log the failure and use a fallback | +| `detecting` | Background detection is running with `wait: false` | Handle events at `status_url` | + +`detect_machine_beep` is `true` when the machine detector heard a beep; otherwise it is `false`. +With `detectors: amd,fax`, a fax tone can register as a beep, so a `fax` result can also report +`true`. `detect_ms` holds the elapsed milliseconds, or `-1` with `wait: false`. + +### Detect voicemail via SWML + +Use AMD to distinguish a person from voicemail, then branch on the result. +`detect_message_end: true` waits for a beep or a pause of `machine_ready_timeout` before the +`machine` branch plays. The `default` branch also greets `unknown` and `failed` results. + +The SDK programs place the call as in [Place a call via SWML][place-swml]. Each branch is built +with the SDK's SWML builder. The YAML and JSON tabs contain the equivalent complete document. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as leave_message.py and run: python leave_message.py +from signalwire import SWMLBuilder, SWMLService +from signalwire.rest import RestClient + +client = RestClient( + project="", + token="", + host=".signalwire.com", +) + +live = ( + SWMLBuilder(SWMLService(name="live-message")) + .say("Hello! Your Bayview Taxi ride is confirmed for 8 AM tomorrow.") + .build()["sections"]["main"] +) +voicemail = ( + SWMLBuilder(SWMLService(name="voicemail-message")) + .say( + "This is Bayview Taxi. Your ride is confirmed for 8 AM tomorrow. " + "Reply to our text message if you need to change it." + ) + .build()["sections"]["main"] +) + +swml = ( + SWMLBuilder(SWMLService(name="leave-a-message")) + .detect_machine(detectors="amd", detect_message_end=True, timeout=45) + .switch( + variable="detect_result", + case={ + "human": live, + "machine": voicemail, + }, + default=live, + ) + .hangup() + .build() +) + +call = client.calling.dial( + from_="", + to="", + swml=swml, +) +print(call["id"]) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as leave-message.mjs, +// then run: node leave-message.mjs +import { RestClient, SwmlBuilder } from "@signalwire/sdk"; + +const client = new RestClient({ + project: "", + token: "", + host: ".signalwire.com", +}); + +const live = new SwmlBuilder() + .say("Hello! Your Bayview Taxi ride is confirmed for 8 AM tomorrow.") + .document.sections.main; +const voicemail = new SwmlBuilder() + .say( + "This is Bayview Taxi. Your ride is confirmed for 8 AM tomorrow. " + + "Reply to our text message if you need to change it.", + ) + .document.sections.main; + +const swml = new SwmlBuilder() + .detect_machine({ detectors: "amd", detect_message_end: true, timeout: 45 }) + .switch({ + variable: "detect_result", + case: { + human: live, + machine: voicemail, + }, + default: live, + }) + .hangup() + .build(); + +const call = await client.calling.dial({ + from: "", + to: "", + swml, +}); +console.log(call.id); +``` + + +```yaml +version: 1.0.0 +sections: + main: + - detect_machine: + detectors: amd + detect_message_end: true + timeout: 45 + - switch: + variable: detect_result + case: + human: + - play: + url: say:Hello! Your Bayview Taxi ride is confirmed for 8 AM tomorrow. + machine: + - play: + url: say:This is Bayview Taxi. Your ride is confirmed for 8 AM tomorrow. Reply to our text message if you need to change it. + default: + - play: + url: say:Hello! Your Bayview Taxi ride is confirmed for 8 AM tomorrow. + - hangup: {} +``` + + +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { + "detect_machine": { + "detectors": "amd", + "detect_message_end": true, + "timeout": 45 + } + }, + { + "switch": { + "variable": "detect_result", + "case": { + "human": [ + { "play": { "url": "say:Hello! Your Bayview Taxi ride is confirmed for 8 AM tomorrow." } } + ], + "machine": [ + { "play": { "url": "say:This is Bayview Taxi. Your ride is confirmed for 8 AM tomorrow. Reply to our text message if you need to change it." } } + ] + }, + "default": [ + { "play": { "url": "say:Hello! Your Bayview Taxi ride is confirmed for 8 AM tomorrow." } } + ] + } + }, + { "hangup": {} } + ] + } +} +``` + + + +Run the example and answer with "Hello?" to hear the live confirmation. Run it again and send the +call to voicemail to test the message after the greeting. The 45-second timeout allows time for +the greeting; tune the silence threshold below if playback starts before the beep. + +To reject voicemail instead, set `detect_message_end: false` and use `hangup` in the `machine` +branch. An AI handoff can use [`ai`][swml-ai] in the `human` branch. + +### Detect a fax machine via SWML + +Detect whether a fax machine or a person answers with `detectors: "amd,fax"`. +The `fax` branch sends a PDF, the `human` branch plays a spoken message, and the default +branch hangs up. + +`CED` is the default tone, sent by an answering fax machine. A fax tone can resemble a voicemail +beep, so if `amd` decides first, SignalWire briefly waits for the fax detector. A detected fax +tone takes priority. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as detect_fax.py and run: python detect_fax.py +from signalwire import SWMLBuilder, SWMLService +from signalwire.rest import RestClient + +client = RestClient( + project="", + token="", + host=".signalwire.com", +) + +send_receipt = ( + SWMLBuilder(SWMLService(name="send-receipt")) + .send_fax(document="", header_info="Bayview Taxi receipt") + .build()["sections"]["main"] +) +not_a_fax = ( + SWMLBuilder(SWMLService(name="not-a-fax")) + .say("Hello, this is Bayview Taxi. We tried to fax your receipt. We will email it instead.") + .build()["sections"]["main"] +) +hang_up = ( + SWMLBuilder(SWMLService(name="hang-up")) + .hangup() + .build()["sections"]["main"] +) + +swml = ( + SWMLBuilder(SWMLService(name="detect-fax")) + .detect_machine(detectors="amd,fax", timeout=30) + .switch( + variable="detect_result", + case={ + "fax": send_receipt, + "human": not_a_fax, + }, + default=hang_up, + ) + .hangup() + .build() +) + +call = client.calling.dial( + from_="", + to="", + swml=swml, +) +print(call["id"]) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as detect-fax.mjs, +// then run: node detect-fax.mjs +import { RestClient, SwmlBuilder } from "@signalwire/sdk"; + +const client = new RestClient({ + project: "", + token: "", + host: ".signalwire.com", +}); + +const sendReceipt = new SwmlBuilder() + .send_fax({ document: "", header_info: "Bayview Taxi receipt" }) + .document.sections.main; +const notAFax = new SwmlBuilder() + .say("Hello, this is Bayview Taxi. We tried to fax your receipt. We will email it instead.") + .document.sections.main; +const hangUp = new SwmlBuilder() + .hangup() + .document.sections.main; + +const swml = new SwmlBuilder() + .detect_machine({ detectors: "amd,fax", timeout: 30 }) + .switch({ + variable: "detect_result", + case: { + fax: sendReceipt, + human: notAFax, + }, + default: hangUp, + }) + .hangup() + .build(); + +const call = await client.calling.dial({ + from: "", + to: "", + swml, +}); +console.log(call.id); +``` + + +```yaml +version: 1.0.0 +sections: + main: + - detect_machine: + detectors: amd,fax + timeout: 30 + - switch: + variable: detect_result + case: + fax: + - send_fax: + document: + header_info: Bayview Taxi receipt + human: + - play: + url: say:Hello, this is Bayview Taxi. We tried to fax your receipt. We will email it instead. + default: + - hangup: {} + - hangup: {} +``` + + +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { + "detect_machine": { + "detectors": "amd,fax", + "timeout": 30 + } + }, + { + "switch": { + "variable": "detect_result", + "case": { + "fax": [ + { + "send_fax": { + "document": "", + "header_info": "Bayview Taxi receipt" + } + } + ], + "human": [ + { "play": { "url": "say:Hello, this is Bayview Taxi. We tried to fax your receipt. We will email it instead." } } + ] + }, + "default": [ + { "hangup": {} } + ] + } + }, + { "hangup": {} } + ] + } +} +``` + + + +Test with a fax number to confirm document delivery, then with a phone to hear the spoken +fallback. For a fax machine calling you, use `tone: "CNG"` and +[`receive_fax`][swml-receive-fax] instead; its `status_url` receives the document details. +Inbound call setup is covered in [Answer a call via SWML][answer-swml]. + +### Track detection results via SWML + +Add `status_url` to `detect_machine` to receive JSON webhooks. These report intermediate detector +events; the document still branches on `detect_result`. + +| Webhook field | Value | +|---|---| +| `event_type` | `calling.call.detect` | +| `params.call_id` | The call ID | +| `params.control_id` | The detection operation's ID | +| `params.detect.type` | `machine` or `fax` | +| `params.detect.params.event` | The detector event listed below | +| `params.detect.params.beep` | `true` once a beep has been heard; absent from fax events | + +| Outcome | Callbacks, in order | +|---|---| +| A person answers | `HUMAN`, `finished` | +| A machine answers, `detect_message_end` off | `MACHINE`, `finished`, with `READY` between them if the line is already silent | +| A machine answers, `detect_message_end` on | `MACHINE`, `READY` when the greeting ends, `finished` | +| A beep is heard before `MACHINE` | `MACHINE`, then `READY`, then `finished`, regardless of `detect_message_end` | +| No decision | `UNKNOWN` at `initial_timeout`, then `finished` at `timeout` | +| A fax tone is heard | `CED` or `CNG`, then `finished` | + +`UNKNOWN` doesn't stop detection or resume the document. A silent call waits until `timeout` +before `detect_result` becomes `unknown`. If the call hangs up during machine detection, no +final `finished` callback is sent; fax detection still sends `finished`. Once set, `beep: true` +remains on later machine events. + +For background detection, set `wait: false` and supply `status_url`. The document continues +immediately with `detect_result: detecting`; act on the webhook events instead. See the +[webhooks guide][webhooks] for endpoint setup and testing. + +### Tune SWML detection + +Set these properties on `detect_machine`. Change one at a time and test with the destinations +you expect to call. + +| Setting | Default | When to change it | +|---|---|---| +| `initial_timeout` | 4.5 s | Raise it for greetings that start with silence | +| `machine_voice_threshold` | 1.25 s | Raise it if longer human greetings are classified as machines | +| `machine_words_threshold` | 6 words | Lower it if short recorded greetings are classified as people | +| `end_silence_timeout` | 1.0 s | Lower it if a person's pause after "Hello?" isn't recognized | +| `machine_ready_timeout` | Same as `end_silence_timeout` | Raise it for voicemail greetings that pause before the beep | +| `timeout` | 30 s | Raise it for long greetings; lower it for inbound callers waiting silently | +| `detect_message_end` | `false` | Set to `true` to wait through a voicemail greeting | + +For inbound screening, greet `unknown` callers and keep `timeout` short: they may be waiting +for you to speak. `detect_interruptions` is unsupported in SWML and makes detection fail. +The [`detect_machine` reference][swml-detect-machine] lists all properties, including the +`detectors` selector, which defaults to both `amd` and `fax`. + +## Detect machines via WebSocket (Relay) + +Start detection on an answered call with `detect()` and a `machine` or `fax` detector. Each +operation runs one detector, and a call can run only one detector of each type at a time. + +Register a `calling.call.detect` handler before starting detection. Read `event.detect.type` +for the detector and `event.detect.params.event` for its result: + +| Event | Meaning | Typical action | +|---|---|---| +| `HUMAN` | A short greeting followed by silence | Play a message or connect an agent | +| `MACHINE` | A recorded greeting or beep was detected | Wait for `READY` to leave voicemail, or hang up | +| `READY` | A beep or the end of the greeting | Play the voicemail message | +| `NOT_READY` | Speech resumed after `READY`, with `detect_interruptions` enabled | Wait for the next `READY` | +| `UNKNOWN` | Nothing heard before `initial_timeout` | Greet the caller or keep waiting | +| `CED` or `CNG` | The configured fax tone | Send or receive a fax | +| `finished` | Detection ended | Clean up if no action has been taken | + +An action's `wait()` returns on the first result. To leave voicemail, follow events through +`MACHINE` to `READY` instead. `detect_message_end` defaults to `true`; setting it to `false` +stops on `MACHINE`. A beep heard before `MACHINE` triggers `MACHINE` and then `READY` with +either setting; with `false`, detection has already stopped by the time a later beep plays, so +it's usually missed. + +`UNKNOWN` doesn't stop the detector: it keeps listening until it decides or `timeout` expires. +`finished` follows the final result, including when the call hangs up during detection. Once a +beep is heard, `event.detect.params.beep` is `true` on that and later machine events; fax events +don't carry it. Call the action's `stop()` to stop detection early. + +### Detect voicemail via WebSocket (Relay) + +Use AMD events to distinguish a person from voicemail and detect when the greeting ends. +The handler plays a live confirmation on `HUMAN` or `UNKNOWN`, leaves voicemail on `READY`, +and hangs up if detection finishes without a usable result. The `announced` flag prevents +later events from starting a second message. + +Call setup follows [Place a call via WebSocket (Relay)][place-relay]. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as leave_message_relay.py and run: python leave_message_relay.py +import asyncio +from signalwire.relay import RelayClient +from signalwire.relay.event import DetectEvent + +LIVE = "Hello! Your Bayview Taxi ride is confirmed for 8 AM tomorrow." +VOICEMAIL = ( + "This is Bayview Taxi. Your ride is confirmed for 8 AM tomorrow. " + "Reply to our text message if you need to change it." +) + +client = RelayClient( + project="", + token="", + contexts=["default"], +) + +async def main(): + async with client: + call = await client.dial( + devices=[[{ + "type": "phone", + "params": { + "from_number": "", + "to_number": "", + "timeout": 30, + }, + }]], + ) + announced = False + + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + async def speak(text: str): + nonlocal announced + announced = True + await call.play( + [{"type": "tts", "params": {"text": text}}], + on_completed=hang_up_after_playback, + ) + + async def on_detect(event: DetectEvent): + if announced or call.state == "ended": + return + result = event.detect.get("params", {}).get("event", "") + if result == "READY": + # The greeting and its beep have finished. + await speak(VOICEMAIL) + elif result in ("HUMAN", "UNKNOWN"): + await speak(LIVE) + elif result == "finished": + # Detection timed out without a usable result. + await call.hangup() + + call.on("calling.call.detect", on_detect) + await call.detect( + {"type": "machine", "params": {"detect_message_end": True}}, timeout=45 + ) + await call.wait_for_ended() + +asyncio.run(main()) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// Save as leave-message-relay.mts and run: npx tsx leave-message-relay.mts +import { RelayClient, DetectEvent } from "@signalwire/sdk"; + +const LIVE = "Hello! Your Bayview Taxi ride is confirmed for 8 AM tomorrow."; +const VOICEMAIL = + "This is Bayview Taxi. Your ride is confirmed for 8 AM tomorrow. " + + "Reply to our text message if you need to change it."; + +const client = new RelayClient({ + project: "", + token: "", + contexts: ["default"], +}); + +await client.connect(); + +try { + const call = await client.dial([[{ + type: "phone", + params: { + from_number: "", + to_number: "", + timeout: 30, + }, + }]]); + let announced = false; + + const speak = async (text: string) => { + announced = true; + await call.play([{ type: "tts", text }], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + }; + + call.on("calling.call.detect", async (event) => { + if (announced || call.state === "ended") return; + const detect = (event as DetectEvent).detect as { params?: { event?: string } }; + const result = detect.params?.event ?? ""; + if (result === "READY") { + // The greeting and its beep have finished. + await speak(VOICEMAIL); + } else if (result === "HUMAN" || result === "UNKNOWN") { + await speak(LIVE); + } else if (result === "finished") { + // Detection timed out without a usable result. + await call.hangup(); + } + }); + + await call.detect({ type: "machine", params: { detect_message_end: true } }, { timeout: 45 }); + await call.waitForEnded(); +} finally { + await client.disconnect(); +} +``` + + + +Test once by answering with "Hello?" and once by sending the call to voicemail. To observe the +sequence, log `event.detect` in the handler. To reject machines, hang up on `MACHINE` instead; +to hand a person to an AI agent, call `call.ai()` on `HUMAN`. + +### Detect a fax machine via WebSocket (Relay) + +Detect a fax machine by listening for `CED`, the default tone from an answering fax machine. +On detection, send the PDF; otherwise, play a spoken fallback. Unlike AMD, this detector +only decides whether it heard the fax tone; the fallback isn't a human classification. + +Listen for `calling.call.fax` with `fax.type: finished` to read `fax.params.success` and +`fax.params.pages`. These SDK versions don't complete `fax.wait()` for that payload, so the +example handles the event directly. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as detect_fax_relay.py and run: python detect_fax_relay.py +import asyncio +from signalwire.relay import RelayClient +from signalwire.relay.event import FaxEvent + +NOT_A_FAX = "Hello, this is Bayview Taxi. We tried to fax your receipt. We will email it instead." + +client = RelayClient( + project="", + token="", + contexts=["default"], +) + +def is_fax(event) -> bool: + detect = event.params.get("detect", {}) + return detect.get("params", {}).get("event") in ("CED", "CNG") + +async def main(): + async with client: + call = await client.dial( + devices=[[{ + "type": "phone", + "params": { + "from_number": "", + "to_number": "", + "timeout": 30, + }, + }]], + ) + action = await call.detect({"type": "fax", "params": {"tone": "CED"}}, timeout=8) + event = await action.wait() + + if is_fax(event): + async def on_fax(fax_event: FaxEvent): + if fax_event.fax.get("type") != "finished": + return + result = fax_event.fax.get("params", {}) + print(f"Fax sent: {result.get('success')}, {result.get('pages', 0)} pages") + if call.state != "ended": + await call.hangup() + + call.on("calling.call.fax", on_fax) + await call.send_fax( + document="", + header_info="Bayview Taxi receipt", + ) + await call.wait_for_ended() + return + + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + await call.play( + [{"type": "tts", "params": {"text": NOT_A_FAX}}], + on_completed=hang_up_after_playback, + ) + await call.wait_for_ended() + +asyncio.run(main()) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// Save as detect-fax-relay.mts and run: npx tsx detect-fax-relay.mts +import { RelayClient, RelayEvent, FaxEvent } from "@signalwire/sdk"; + +const NOT_A_FAX = "Hello, this is Bayview Taxi. We tried to fax your receipt. We will email it instead."; + +const client = new RelayClient({ + project: "", + token: "", + contexts: ["default"], +}); + +function isFax(event: RelayEvent): boolean { + const detect = event.params.detect as { params?: { event?: string } } | undefined; + return ["CED", "CNG"].includes(detect?.params?.event ?? ""); +} + +await client.connect(); + +try { + const call = await client.dial([[{ + type: "phone", + params: { + from_number: "", + to_number: "", + timeout: 30, + }, + }]]); + const action = await call.detect({ type: "fax", params: { tone: "CED" } }, { timeout: 8 }); + const event = await action.wait(); + + if (isFax(event)) { + call.on("calling.call.fax", async (faxEvent) => { + const fax = (faxEvent as FaxEvent).fax as { + type?: string; + params?: { success?: boolean; pages?: number }; + }; + if (fax.type !== "finished") return; + console.log(`Fax sent: ${fax.params?.success}, ${fax.params?.pages ?? 0} pages`); + if (call.state !== "ended") await call.hangup(); + }); + await call.sendFax("", { + headerInfo: "Bayview Taxi receipt", + }); + await call.waitForEnded(); + } else { + await call.play([{ type: "tts", text: NOT_A_FAX }], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + await call.waitForEnded(); + } +} finally { + await client.disconnect(); +} +``` + + + +Test with a fax destination, then with a phone to check the fallback. For incoming faxes, +listen for `CNG` and use `receive_fax()` in Python or `receiveFax()` in TypeScript. The finished +fax event also includes the stored document URL in `fax.params.document`. For inbound call +setup, see [Answer a call via WebSocket (Relay)][answer-relay]. + +### Tune Relay detection + +Pass `timeout` separately to `detect()`; put the other settings in the detector's `params`. + +| Setting | Default | When to change it | +|---|---|---| +| `initial_timeout` | 4.5 s | Raise it for delayed greetings; lower it to greet silent inbound callers sooner | +| `machine_voice_threshold` | 1.25 s | Raise it if longer human greetings are classified as machines | +| `machine_words_threshold` | 6 words | Lower it if short recorded greetings are classified as people | +| `end_silence_timeout` | 1.0 s | Lower it if a person's pause after "Hello?" isn't recognized | +| `machine_ready_timeout` | Same as `end_silence_timeout` | Raise it for voicemail greetings that pause before the beep | +| `timeout` | 30 s | Raise it for long greetings; keep fax checks short for voice callers | +| `detect_message_end` | `true` | Set explicitly; use `false` when you only need the initial classification | +| `detect_interruptions` | `false` | Enable it to receive `NOT_READY` if speech resumes after `READY` | + +Change one setting at a time. For inbound screening, greet `UNKNOWN` callers: they may be +waiting silently for you to speak. If you enable interruptions, handle `NOT_READY` and wait +for the next `READY` before resuming your message. + +## Detect on a call already in progress via REST + +If another process needs to start detection, send [`calling.detect`][call-commands] with the +answered call's ID, a required `control_id`, a `detect` object, and `status_url`. Use +`detect.type: machine` for AMD or `detect.type: fax` for fax tones; pass settings in +`detect.params` and `timeout` separately. `detect_message_end` defaults to `true`, and fax +`tone` defaults to `CED` (use `CNG` for incoming faxes). + + + +The command returns immediately. Your webhook receives `calling.call.detect` events with the +result in `params.detect.params.event`. Have the handler send the next call command, such as +`calling.play` on `READY` for voicemail. Use `calling.detect.stop` with the same `control_id` +to stop early. Only one detector of each type can run on a call at a time. diff --git a/fern/products/platform/pages/calling/voice/make-and-receive-calls.mdx b/fern/products/platform/pages/calling/voice/make-and-receive-calls.mdx new file mode 100644 index 0000000000..6157feb556 --- /dev/null +++ b/fern/products/platform/pages/calling/voice/make-and-receive-calls.mdx @@ -0,0 +1,1350 @@ +--- +title: Make and receive calls +slug: voice/make-and-receive-calls +description: Pick SWML, Relay, or the Browser SDK, then use it to call your own phone, answer a call to your SignalWire number, and track each call's progress. +max-toc-depth: 3 +--- + +[caller-id]: /docs/platform/voice/how-to-set-caller-id-or-cnam +[verify-caller-id]: /docs/platform/voice/how-to-set-caller-id-or-cnam#verified-caller-id +[trial-mode]: /docs/platform/trial-mode +[international]: /docs/platform/how-to-enable-international-services +[api-credentials]: /docs/platform/your-signalwire-api-space +[phone-numbers]: /docs/platform/phone-numbers +[webhooks]: /docs/platform/webhooks +[swml-intro]: /docs/swml +[swml-stream]: /docs/swml/reference/calling/stream +[swml-webhook-security]: /docs/swml/guides/webhook-security +[swml-webhook-payload]: /docs/swml/reference/calling#webhook-payload +[swml-variables]: /docs/swml/reference/variables +[swml-switch]: /docs/swml/reference/calling/switch +[swml-connect]: /docs/swml/reference/calling/connect +[swml-request]: /docs/swml/reference/calling/request +[swml-record]: /docs/swml/reference/calling/record +[relay-guide]: /docs/server-sdks/guides/relay-client +[server-sdks]: /docs/server-sdks +[browser-sdk]: /docs/browser-sdk/v4/guides/build-voice-video +[subscriber-token]: /docs/apis/rest/subscribers/tokens/create-subscriber-token +[guest-token]: /docs/apis/rest/subscribers/tokens/create-subscriber-guest-token +[resources]: /docs/platform/resources +[subscribers]: /docs/platform/subscribers +[sip-addresses]: /docs/platform/addresses#sip-addresses +[aliases]: /docs/platform/addresses#aliases +[dial-options]: /docs/browser-sdk/v4/reference/interfaces/dial-options +[call-create-error]: /docs/browser-sdk/v4/reference/errors/call-create-error +[browser-auth]: /docs/browser-sdk/v4/guides/authentication +[browser-inbound]: /docs/browser-sdk/v4/guides/inbound-calls +[browser-register]: /docs/browser-sdk/v4/reference/signalwire/register +[browser-session-state]: /docs/browser-sdk/v4/reference/interfaces/session-state +[browser-call]: /docs/browser-sdk/v4/reference/interfaces/call +[rest-update-number]: /docs/apis/rest/phone-numbers/update-phone-number +[rest-call-commands]: /docs/apis/rest/calls/call-commands +[rest-list-numbers]: /docs/apis/rest/phone-numbers/list-phone-numbers +[rest-link-number]: /docs/apis/rest/phone-number-addresses/create-phone-number-address +[rest-create-subscriber]: /docs/apis/rest/subscribers/create-subscriber +[rest-create-script]: /docs/apis/rest/swml-scripts/create-swml-script + +Place calls to phones and answer calls to your SignalWire number with SWML, Relay, or the Browser +SDK. Each section below takes one of them from a first test call on your own phone through +tracking the call's progress. + +## Choose an approach + +Each approach has its own code and its own kind of [Resource][resources] on your phone number, so +pick one and follow only its section. The sections don't build on each other, and code from one +doesn't carry over to another. + +- [SWML][swml-intro] is a document of call instructions that SignalWire runs. You build it with the + Server SDKs and send it in a REST request to place a call. To answer one, serve it from your + server or host it in SignalWire, which needs none of your code running. +- [WebSocket (Relay)][relay-guide] is a Relay client in the Server SDKs. It holds a WebSocket open + from your server, receives calls and events as they happen, and controls each call from your code. +- The [Browser SDK][browser-sdk] puts a person on the call from a web page, with their microphone, + camera, and in-call controls. + +## Prepare for your first call + +Have these values ready: + +- Your Space URL, such as `.signalwire.com`. +- Your Project ID and API token from the Dashboard's [API credentials][api-credentials] page. + Enable the token's **Voice** permission, and **Numbers** if you assign a phone number in code. +- A voice-capable [phone number in your Space][phone-numbers], and a phone you can call it from + and answer. +- For the Browser SDK, a web page you can serve over HTTPS or `localhost`. The guide creates the + [Subscriber][subscribers] and its token for you. + + +A [trial project][trial-mode] can't call international numbers, and it only places calls to and +receives calls from numbers you've purchased or verified. To test with your own phone, verify it: +in the Dashboard, open **Phone Numbers**, then the **Verified** tab, select **+ New**, and follow +[Verified caller ID][verify-caller-id]. To remove the trial restrictions, add a payment method and +fund the account with at least $5, as [Trial mode][trial-mode] describes. Outside a trial, +[enable international dialing][international] before you call another country. + + +Replace these values in the samples you run: + +| Value | Replace with | +|---|---| +| `` | Your Space's subdomain in `.signalwire.com` | +| `` | Your Project ID | +| `` | Your API token, used only in server code | +| `` | Your SignalWire phone number, or a [verified caller ID][caller-id], in E.164 format | +| `` | Where to call: a phone number in E.164 format such as `+12025550123`, a SIP URI such as `sip:support@example.com`, or a Resource Address such as `/private/support-rep` | +| `` | Your phone number's ID from its Dashboard page or [List phone numbers][rest-list-numbers], when you assign it in code | +| `` | A password you choose for your SWML server | +| `` | The public hostname of your SWML server or tunnel | +| `` | An HTTPS endpoint you control that receives call progress | +| `` | An email address to identify your test Subscriber | +| `` | The Subscriber token from [Get a Subscriber token](#get-a-subscriber-token) | + +## How an incoming call reaches your code + +Placing a call only takes a request from your code. Answering one takes a little setup first, +because SignalWire has to know where to send the call. Every phone number has one call handler: a +[Resource][resources] you assign under the number's **Inbound Call Settings**. When someone dials +the number, SignalWire hands the call to that Resource, and the Resource type decides what happens +next: + +| Approach | Resource on the number | What happens when a call arrives | +|---|---|---| +| SWML | SWML Script | SignalWire runs the script's document, first fetching it from your server when the script points at a URL | +| WebSocket (Relay) | Relay Application | SignalWire hands the call to the Relay client connected on the application's topic | +| Browser SDK | Subscriber | SignalWire rings the Subscriber's signed-in clients, such as your web page | + +So each answering walkthrough below has the same three parts: build the handler, assign it to your +number, and call the number to test it. If the number has no call handler, or still points at a +different Resource, the call never reaches your code. + +## Make and receive calls via SWML + +A SWML document lists what happens on the call, such as playing a message, forwarding the caller, +or recording. SignalWire runs it; your code supplies it. + +### Place a call via SWML + +Send a REST `dial` request with a SWML document in `swml`. SignalWire runs the document when the +destination answers. + + + + + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as outbound_call.py and run: python outbound_call.py +from signalwire import SWMLBuilder, SWMLService +from signalwire.rest import RestClient + +client = RestClient( + project="", + token="", + host=".signalwire.com", +) + +swml = ( + SWMLBuilder(SWMLService(name="outbound-call")) + .say("Hello, welcome to SignalWire!") + .build() +) + +call = client.calling.dial( + from_="", + to="", + swml=swml, +) +print(call["id"]) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as outbound-call.mjs, +// then run: node outbound-call.mjs +import { RestClient, SwmlBuilder } from "@signalwire/sdk"; + +const client = new RestClient({ + project: "", + token: "", + host: ".signalwire.com", +}); + +const swml = new SwmlBuilder() + .say("Hello, welcome to SignalWire!") + .build(); + +const call = await client.calling.dial({ + from: "", + to: "", + swml, +}); +console.log(call.id); +``` + + +```bash +curl -X POST "https://.signalwire.com/api/calling/calls" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "command": "dial", + "params": { + "from": "", + "to": "", + "swml": { + "version": "1.0.0", + "sections": { + "main": [ + { "play": {"url": "say:Hello, welcome to SignalWire!"} } + ] + } + } + } + }' +``` + + + + +`@signalwire/sdk@2.0.5` takes a single options object. Newer releases take the positional +`dial(from, to, options)` form. + + +The cURL example sends the `dial` command to [Call commands][rest-call-commands]. + +The REST API returns a call `id` and status `queued`. This confirms that SignalWire accepted the +request; the call hasn't necessarily rung or been answered yet. Save the `id` to identify this call. + + + + + + + +Answer the destination phone. You hear "Hello, welcome to SignalWire!", then the call ends. + +If the phone never rings, check that `` is a number in your Space or a verified +caller ID, and that a trial project has verified the destination. + + + + + +### Answer a call via SWML + +When someone calls your number, SignalWire runs the SWML Script assigned to it. The script either +fetches the document from your server on each call, or holds the document itself. Hosting it in +SignalWire is the quickest way to hear your first call; serving it from your server lets your code +build a different document for each caller. + +This flow shows a call handled by a script that fetches its document from your server: + + + +A caller dials your number. SignalWire looks up the number's Resource and sends your server the call details: from, to, direction, and call id. Your server returns a SWML document. SignalWire answers the caller and runs your SWML. When the call finishes, the SWML session ends. + + + + + +```mermaid +sequenceDiagram + participant Caller + participant SW as SignalWire + participant Server as Your server + + Caller->>SW: dials your number + Note over SW: Looks up the number's Resource + SW->>Server: POST call details: from, to, direction, call id + Server-->>SW: SWML document + SW->>Caller: answers + Note over Caller,SW: Your SWML runs + Note over Caller,SW: Call finishes +``` + + + + + + + + + + +SignalWire must reach your server over the internet, so this tab has four parts: run the +server, give it a public URL, check the URL, then create the script that points at it. + +Run either server below. It answers requests on port 3000 at `/swml`, but only when they carry +the username `signalwire` and the password you set. SignalWire sends those credentials from the +URL you give it, so no one else can fetch your call instructions. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as inbound_swml_server.py and run: python inbound_swml_server.py +from signalwire import SWMLBuilder, SWMLService + +service = SWMLService( + name="inbound-swml-server", + route="/swml", + port=3000, + basic_auth=("signalwire", ""), +) +SWMLBuilder(service).say("Hello, welcome to SignalWire!") + +# Serves the document at /swml. Put the credentials in the URL you give +# SignalWire: https://signalwire:@/swml +service.serve() +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as inbound-swml-server.mjs, +// then run: node inbound-swml-server.mjs +import { SWMLService } from "@signalwire/sdk"; + +const service = new SWMLService({ + name: "inbound-swml-server", + route: "/swml", + port: 3000, + basicAuth: ["signalwire", ""], +}); +service.getBuilder().say("Hello, welcome to SignalWire!"); + +// Serves the document at /swml. Put the credentials in the URL you give +// SignalWire: https://signalwire:@/swml +await service.serve(); +``` + + + +The [Server SDKs][server-sdks] serve the document with `SWMLService` and add the instructions +through its SWML builder. + +While you develop, give the server a public HTTPS URL with a tunnel such as +[ngrok](https://ngrok.com/). In a second terminal, run: + +```bash +ngrok http 3000 +``` + +ngrok prints an `https://` **Forwarding** URL. Its hostname is your ``. Keep +both the server and ngrok running while you test. A new tunnel usually means a new hostname, so +update the script's URL whenever it changes. + +Check that the document is reachable before you point a number at it: + +```bash +curl -u "signalwire:" "https:///swml" +``` + +The response is the SWML document, starting with `{"version": "1.0.0"`. A `401` means the password +doesn't match the one in your server. See [webhook security][swml-webhook-security] to also verify +that requests come from SignalWire. + +Then create the script in the Dashboard: + +1. Open **My Resources**, select **+ Add**, then **Script**, then **SWML Script**. +2. Name it **Inbound welcome** and leave **Used For** set to **Calling**. +3. Under **Handle Calls Using**, choose **External URL** and enter + `https://signalwire:@/swml` in **Primary Script URL**. +4. Select **Create** and keep the server running. + +You can skip the Dashboard steps: **Assign the number in code** in the next step creates the +script and assigns it in one request. + + + + +SignalWire stores and runs the document, so you don't start a server. + +1. Open **My Resources**, select **+ Add**, then **Script**, then **SWML Script**. +2. Name it **Inbound welcome** and leave **Used For** set to **Calling**. +3. Under **Handle Calls Using**, choose **Hosted Script** and paste this document into + **Primary Script**. +4. Select **Create**. + + + +```yaml +version: 1.0.0 +sections: + main: + - play: + url: 'say:Hello, welcome to SignalWire!' +``` + + +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { "play": { "url": "say:Hello, welcome to SignalWire!" } } + ] + } +} +``` + + + + + +The [Server SDKs][server-sdks] can build the SWML and create the hosted script in one program, +in place of the Dashboard steps above. Each program prints the script's ID; assign that script to +your number in the next step. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as inbound_script.py and run: python inbound_script.py +from signalwire import SWMLBuilder, SWMLService +from signalwire.rest import RestClient + +client = RestClient( + project="", + token="", + host=".signalwire.com", +) + +swml = ( + SWMLBuilder(SWMLService(name="inbound-welcome")) + .say("Hello, welcome to SignalWire!") + .build() +) + +script = client.fabric.swml_scripts.create( + name="Inbound welcome", + contents=swml, +) +print(script["id"]) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as inbound-script.mjs, +// then run: node inbound-script.mjs +import { RestClient, SwmlBuilder } from "@signalwire/sdk"; + +const client = new RestClient({ + project: "", + token: "", + host: ".signalwire.com", +}); + +const swml = new SwmlBuilder() + .say("Hello, welcome to SignalWire!") + .build(); + +const script = await client.fabric.swmlScripts.create({ + name: "Inbound welcome", + contents: swml, +}); +console.log(script.id); +``` + + +```bash +curl -X POST "https://.signalwire.com/api/fabric/resources/swml_scripts" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "Inbound welcome", + "contents": { + "version": "1.0.0", + "sections": { + "main": [ + { "play": { "url": "say:Hello, welcome to SignalWire!" } } + ] + } + } + }' +``` + + + +Each example sends `contents` as a JSON object. The cURL example calls +[Create SWML Script][rest-create-script]. + + + + + + + + + + + + + + +For a script served from your server, the [Server SDKs][server-sdks] create the script and assign +it in one request, replacing the number's current call handler. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as assign_swml_webhook.py and run: python assign_swml_webhook.py +from signalwire.rest import RestClient + +client = RestClient( + project="", + token="", + host=".signalwire.com", +) + +client.phone_numbers.set_swml_webhook( + "", + "https://signalwire:@/swml", +) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as assign-swml-webhook.mjs, +// then run: node assign-swml-webhook.mjs +import { RestClient } from "@signalwire/sdk"; + +const client = new RestClient({ + project: "", + token: "", + host: ".signalwire.com", +}); + +await client.phoneNumbers.setSwmlWebhook( + "", + "https://signalwire:@/swml", +); +``` + + +```bash +curl -X PUT "https://.signalwire.com/api/relay/rest/phone_numbers/" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "call_handler": "relay_script", + "call_relay_script_url": "https://signalwire:@/swml" + }' +``` + + + +The cURL example calls [Update phone number][rest-update-number]. + +To attach an existing hosted script by its ID, use [Create a phone number address][rest-link-number] with +`handler_type: "calling"`; this endpoint is in beta and requires the number to have no call +handler yet. + + + +To reach the script from a SIP client or another SignalWire app instead, give it a +[SIP Address][sip-addresses] or use its [Alias][aliases]. + + + + + +Call your SignalWire number from your phone. You hear "Hello, welcome to SignalWire!", then the +call ends. + +If it doesn't work, check the symptom: + +- **You hear an error or silence.** SignalWire reached your number but couldn't run the script. For + a script served from your server, rerun the `curl` check with the exact URL in the script, and + confirm the server and ngrok are still running. +- **You hear a different greeting, or the number's old behavior.** The number still points at + another Resource. Open it under **Phone Numbers** and check **Inbound Call Settings**. +- **The call doesn't connect at all.** In a trial project, call from a verified number. + + + + + +### Track a call via SWML + +To follow an outbound call, add `status_url` and `status_events` to the `dial` request in +[Place a call via SWML](#place-a-call-via-swml). SignalWire sends an HTTP POST to `status_url` as +the call reaches each state you list: `created`, `ringing`, `answered`, or `ended`. Without +`status_events`, you get `ended` only. The [webhooks guide][webhooks] covers endpoint setup and +local testing. + + + +```python {5-6} +call = client.calling.dial( + from_="", + to="", + swml=swml, + status_url="", + status_events=["ringing", "answered", "ended"], +) +``` + + +```typescript {5-6} +const call = await client.calling.dial({ + from: "", + to: "", + swml, + status_url: "", + status_events: ["ringing", "answered", "ended"], +}); +``` + + +```bash {15-16} +curl -X POST "https://.signalwire.com/api/calling/calls" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "command": "dial", + "params": { + "from": "", + "to": "", + "swml": { + "version": "1.0.0", + "sections": { + "main": [{ "play": {"url": "say:Hello, welcome to SignalWire!"} }] + } + }, + "status_url": "", + "status_events": ["ringing", "answered", "ended"] + } + }' +``` + + + + + +Your code sends a dial request with from, to, and SWML. SignalWire returns the call id with status queued and rings the destination and reports status ringing. When the person answers, SignalWire reports status answered and runs your SWML. When the call finishes, SignalWire reports status ended. + + + + + +```mermaid +sequenceDiagram + participant App as Your code + participant SW as SignalWire + participant Dest as Destination + + App->>SW: dial: from, to, SWML + SW-->>App: call id, status queued + SW->>Dest: rings + SW-->>App: status ringing + Dest->>SW: answers + SW-->>App: status answered + Note over SW,Dest: Your SWML runs + Note over SW,Dest: Call finishes + SW-->>App: status ended +``` + + + +For an inbound call, the request SignalWire sends your server carries the call in its `call` +object: `from`, `to`, `direction`, and `call_id` (see the +[webhook payload reference][swml-webhook-payload]). The same fields are available inside any SWML +document as [variables][swml-variables]. To read the caller's number back, replace the greeting +with this one: + + + +```python +SWMLBuilder(service).say("Thanks for calling from ${call.from}.") +``` + + +```typescript +service.getBuilder().say("Thanks for calling from ${call.from}."); +``` + + +```yaml +version: 1.0.0 +sections: + main: + - play: + url: 'say:Thanks for calling from ${call.from}.' +``` + + +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { "play": { "url": "say:Thanks for calling from ${call.from}." } } + ] + } +} +``` + + + +A SWML document can also fetch data mid-call with [`request`][swml-request] and branch on the +result with [`switch`][swml-switch]. Methods such as [`record`][swml-record], +[`connect`][swml-connect], and [`stream`][swml-stream] take their own `status_url` to report +their progress. + +## Make and receive calls via WebSocket (Relay) + +A Relay client runs on your server and holds a WebSocket connection to SignalWire. It receives +calls and events on that connection and sends commands back, so it needs no public HTTP endpoint. + +### Place a call via WebSocket (Relay) + + + + + +Run either program below. It dials the destination, plays a message once the call is answered, and +hangs up. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as outbound_relay.py and run: python outbound_relay.py +import asyncio +from signalwire.relay import RelayClient + +client = RelayClient( + project="", + token="", + contexts=["default"], +) + +async def main(): + async with client: + call = await client.dial( + devices=[[{ + "type": "phone", + "params": { + "from_number": "", + "to_number": "", + "timeout": 30, + }, + }]], + ) + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + await call.play([{ + "type": "tts", + "params": {"text": "Hello, welcome to SignalWire!"}, + }], on_completed=hang_up_after_playback) + await call.wait_for_ended() + +asyncio.run(main()) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as outbound-relay.mjs, +// then run: node outbound-relay.mjs +import { RelayClient } from "@signalwire/sdk"; + +const client = new RelayClient({ + project: "", + token: "", + contexts: ["default"], +}); + +await client.connect(); + +try { + const call = await client.dial([[{ + type: "phone", + params: { + from_number: "", + to_number: "", + timeout: 30, + }, + }]]); + await call.play([ + { type: "tts", text: "Hello, welcome to SignalWire!" }, + ], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + await call.waitForEnded(); +} finally { + await client.disconnect(); +} +``` + + + + + + + +Answer the destination phone. You hear "Hello, welcome to SignalWire!", then the call ends. + +If the phone never rings, check that `` is a number in your Space or a verified +caller ID, and that a trial project has verified the destination. + + + + + +### Answer a call via WebSocket (Relay) + +A Relay handler is a program on your server that stays connected to SignalWire, so it needs no +public URL. It subscribes to one or more topics, names you choose and list in `contexts`. A Relay +Application is the Resource that ties your phone number to one topic: calls to the number go to +whichever Relay client is subscribed to that topic. + + + + + +Run either handler below and leave it running while you test. It subscribes to the +`inbound-calling` topic, then waits. When a call arrives, it answers, plays the message, and hangs +up, and goes back to waiting for the next call. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as inbound_relay.py and run: python inbound_relay.py +from signalwire.relay import RelayClient + +client = RelayClient( + project="", + token="", + contexts=["inbound-calling"], +) + +@client.on_call +async def handle_call(call): + await call.answer() + + async def hang_up_after_playback(_event): + if call.state != "ended": + await call.hangup() + + await call.play([{ + "type": "tts", + "params": {"text": "Hello, welcome to SignalWire!"}, + }], on_completed=hang_up_after_playback) + await call.wait_for_ended() + +client.run() +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as inbound-relay.mjs, +// then run: node inbound-relay.mjs +import { RelayClient } from "@signalwire/sdk"; + +const client = new RelayClient({ + project: "", + token: "", + contexts: ["inbound-calling"], +}); + +client.onCall(async (call) => { + await call.answer(); + await call.play([ + { type: "tts", text: "Hello, welcome to SignalWire!" }, + ], { + onCompleted: async () => { + if (call.state !== "ended") await call.hangup(); + }, + }); + await call.waitForEnded(); +}); + +await client.run(); +``` + + + +The [Server SDKs][server-sdks] document every Relay client configuration option. + + + + + +Create a Relay Application for the topic: + +1. Open **My Resources**, select **+ Add**, then **Relay Application**. +2. Name it **Inbound welcome** and enter `inbound-calling` as the **Topic**. It must match the + `contexts` value in your code. +3. Select **Create**. + + + + + +The [Server SDKs][server-sdks] create the Relay Application and assign it in one request, +replacing the number's current call handler. They can also create the Relay Application on its own. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as assign_relay_topic.py and run: python assign_relay_topic.py +from signalwire.rest import RestClient + +client = RestClient( + project="", + token="", + host=".signalwire.com", +) + +client.phone_numbers.set_relay_topic("", "inbound-calling") +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as assign-relay-topic.mjs, +// then run: node assign-relay-topic.mjs +import { RestClient } from "@signalwire/sdk"; + +const client = new RestClient({ + project: "", + token: "", + host: ".signalwire.com", +}); + +await client.phoneNumbers.setRelayTopic("", { topic: "inbound-calling" }); +``` + + +```bash +curl -X PUT "https://.signalwire.com/api/relay/rest/phone_numbers/" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ + "call_handler": "relay_topic", + "call_relay_topic": "inbound-calling" + }' +``` + + + +The cURL example calls [Update phone number][rest-update-number]. + + + +To reach the handler from a SIP client or another SignalWire app instead, give the Relay +Application a [SIP Address][sip-addresses] or use its [Alias][aliases]. + + + + + +Call your SignalWire number from your phone. You hear "Hello, welcome to SignalWire!", then the +call ends. + +If it doesn't work, check the symptom: + +- **The handler logs connection errors and keeps retrying.** It can't sign in. Check the Project + ID and API token, and that the token has the **Voice** permission. +- **The call never reaches your handler.** Check that the handler is still running, that its + `contexts` value matches the Relay Application's **Topic** exactly, and that the number's + **Inbound Call Settings** point at that Relay Application. +- **The call doesn't connect at all.** In a trial project, call from a verified number. + + + + + +### Track a call via WebSocket (Relay) + +Relay reports call state through `call.on()`. Add a `calling.call.state` listener to either +first-run program, right after it gets the `call`, to see states such as `answered`, `ending`, and +`ended`, with the `end_reason` once the call finishes. An outbound `dial()` returns after the +destination answers, so there the listener sees `ending` and `ended`. + + + +```python +from signalwire.relay.event import CallStateEvent + +def handle_state(event: CallStateEvent): + print(f"State: {event.call_state}, reason: {event.end_reason}") + +call.on("calling.call.state", handle_state) +``` + + +```typescript +call.on("calling.call.state", (event) => { + console.log(`State: ${event.params.call_state}, reason: ${event.params.end_reason ?? ""}`); +}); +``` + + + +On an inbound call, the `Call` object also carries the caller's number in `device.params.from_number`, +with `direction` and `call_id`. + +This flow shows every message an outbound call exchanges on the connection. The `created`, `ringing`, and `answered` states arrive before `dial()` returns, so a listener you add afterward sees only `ending` and `ended`: + + + +Your code and SignalWire share one persistent WebSocket. Your code sends calling.dial; SignalWire reports created, ringing, and answered through calling.call.state. Your code sends calling.play; SignalWire reports playing and finished through calling.call.play. Your code sends calling.end; SignalWire reports ending and ended through calling.call.state. + + + + + +```mermaid +sequenceDiagram + participant App as Your code + participant SW as SignalWire + + Note over App,SW: One persistent WebSocket, both directions + App->>SW: calling.dial + SW-->>App: calling.call.state: created, ringing, answered + App->>SW: calling.play + SW-->>App: calling.call.play: playing, then finished + App->>SW: calling.end + SW-->>App: calling.call.state: ending, then ended +``` + + + +For more handlers, see +[Event listeners in the Relay client guide](/docs/server-sdks/guides/relay-client#event-listeners). + +## Make and receive calls in the browser + +The Browser SDK signs a web page in as a [Subscriber][subscribers], so a person places and answers +calls from the page with their own microphone and speakers. The page authenticates with a +[Subscriber token][subscriber-token] from your backend, never your API token. + +### Get a Subscriber token + +A Subscriber is the Resource for one person in your app, identified by a `reference` such as their +email. Run this program on your server once to create a test Subscriber and print a token for it. +Paste the token in place of `` in the pages below. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as subscriber_token.py and run: python subscriber_token.py +from signalwire.rest import RestClient + +client = RestClient( + project="", + token="", + host=".signalwire.com", +) + +# Create the Subscriber once. Later, run only the token request for a fresh token. +client.fabric.subscribers.create(email="") + +sat = client.fabric.tokens.create_subscriber_token(reference="") +print(sat["token"]) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as subscriber-token.mjs, +// then run: node subscriber-token.mjs +import { RestClient } from "@signalwire/sdk"; + +const client = new RestClient({ + project: "", + token: "", + host: ".signalwire.com", +}); + +// Create the Subscriber once. Later, run only the token request for a fresh token. +await client.fabric.subscribers.create({ email: "" }); + +const sat = await client.fabric.tokens.createSubscriberToken({ + reference: "", +}); +console.log(sat.token); +``` + + +```bash +# Create the Subscriber once. +curl -X POST "https://.signalwire.com/api/fabric/resources/subscribers" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ "email": "" }' + +# Issue a token for it. The response's "token" is the Subscriber token. +curl -X POST "https://.signalwire.com/api/fabric/subscribers/tokens" \ + -u ":" \ + -H "Content-Type: application/json" \ + -d '{ "reference": "" }' +``` + + + +The cURL requests call [Create Subscriber][rest-create-subscriber], then +[Create Subscriber token][subscriber-token] with the Subscriber's email as `reference`. + +A token lasts two hours by default, so run the token request again when the page stops signing in. In production, your backend issues a token each time +a user signs in, as the [authentication guide][browser-auth] shows. + +### Place a call from a browser + + + + + +Load this script on a page served over HTTPS or `localhost`, with the elements listed in its +comments. A page that only places calls can use a [guest token][guest-token] instead of a +Subscriber token. To add the camera, pass `video: true`; [`DialOptions`][dial-options] lists every +media option. + +```javascript title="JavaScript — Browser SDK" +// Install: npm install @signalwire/js@4.0.0-rc.2 rxjs@7.8.2 +// Load as a module script on an HTTPS or localhost page with these elements: +// +// +// +// Use a Subscriber Access Token issued by your backend. +import { SignalWire, StaticCredentialProvider } from "@signalwire/js"; + +const client = new SignalWire(new StaticCredentialProvider({ + token: "", +})); +const remoteAudio = document.querySelector("#remote-audio"); +const callButton = document.querySelector("#call"); +const hangupButton = document.querySelector("#hangup"); + +callButton.onclick = async () => { + callButton.disabled = true; + try { + const call = await client.dial("", { audio: true, video: false }); + call.remoteStream$.subscribe((stream) => (remoteAudio.srcObject = stream)); + hangupButton.disabled = false; + hangupButton.onclick = () => { + void call.hangup().catch(console.error); + }; + call.status$.subscribe((status) => { + if (status === "disconnected" || status === "failed" || status === "destroyed") { + remoteAudio.srcObject = null; + hangupButton.disabled = true; + callButton.disabled = false; + } + }); + } catch (error) { + callButton.disabled = false; + console.error(error); + } +}; +``` + + + + + +Select **Call**, allow microphone access, and answer the destination phone. You hear each other. +Select **Hang up** when you finish. + +If `dial()` rejects with [`CallCreateError`][call-create-error], the token's scope doesn't reach +the destination. + + + + + +### Answer a call in a browser + +Assign the Subscriber to your phone number, and calls to the number ring the page signed in as +that Subscriber. + + + + + +Use the token from [Get a Subscriber token](#get-a-subscriber-token). + + +Guest and embed tokens only place calls. The page must sign in as the Subscriber that receives +the call. + + +Load this script on a page served over HTTPS or `localhost`, with the elements listed in its +comments. The page shows who is calling and lets you answer, decline, or hang up. + +```javascript title="JavaScript — Browser SDK" +// Install: npm install @signalwire/js@4.0.0-rc.2 rxjs@7.8.2 +// Load as a module script on an HTTPS or localhost page with these elements: +//

Offline

+//

+// +// +// +// +// Use a Subscriber Access Token issued by your backend for the Subscriber +// that the phone number rings. +import { SignalWire, StaticCredentialProvider } from "@signalwire/js"; + +const client = new SignalWire(new StaticCredentialProvider({ + token: "", +})); +const statusLine = document.querySelector("#status"); +const callerLine = document.querySelector("#caller"); +const remoteAudio = document.querySelector("#remote-audio"); +const answerButton = document.querySelector("#answer"); +const declineButton = document.querySelector("#decline"); +const hangupButton = document.querySelector("#hangup"); +const finalStatuses = new Set(["disconnected", "failed", "destroyed"]); + +let currentCall = null; + +await client.register(); +statusLine.textContent = "Online"; + +client.session.incomingCalls$.subscribe((calls) => { + const ringing = calls.find((call) => call.status === "ringing"); + if (!ringing || ringing === currentCall) return; + currentCall = ringing; + callerLine.textContent = `Incoming call from ${ringing.from}`; + answerButton.disabled = false; + declineButton.disabled = false; + + ringing.remoteStream$.subscribe((stream) => (remoteAudio.srcObject = stream)); + ringing.status$.subscribe((status) => { + statusLine.textContent = status; + if (status !== "ringing") { + answerButton.disabled = true; + declineButton.disabled = true; + } + if (status === "connected") hangupButton.disabled = false; + if (finalStatuses.has(status)) { + remoteAudio.srcObject = null; + hangupButton.disabled = true; + callerLine.textContent = ""; + if (currentCall === ringing) currentCall = null; + } + }); +}); + +answerButton.onclick = () => { + void currentCall?.answer({ audio: true, video: false }); +}; +declineButton.onclick = () => { + void currentCall?.reject(); +}; +hangupButton.onclick = () => { + void currentCall?.hangup().catch(console.error); +}; +``` + +Awaiting [`register()`][browser-register] signs the page in and marks the Subscriber online, so +the page shows **Online**. Keep it open while you test: calls ring only while it's online. + +
+ + + +The Subscriber you created is listed under **My Resources**, so you can pick it like any other Resource. + + + + + + + +Call your SignalWire number from your phone. The page shows the incoming call. Select **Answer**, +allow microphone access, and select **Hang up** when you finish. + +If it doesn't work, check the symptom: + +- **The page never shows Online.** `register()` failed, most often because the token expired. + Issue a new token and reload the page. +- **The page is Online but never rings.** Check that the number's **Inbound Call Settings** point + at the same Subscriber the token was issued for. +- **The call connects but you can't hear each other.** Allow microphone access, and serve the page + over HTTPS or `localhost`. +- **The call doesn't connect at all.** In a trial project, call from a verified number. + + + +
+ +The Browser SDK [inbound calls guide][browser-inbound] builds a complete receiver page, including +two callers ringing at once. + +### Track a call in a browser + +The Browser SDK is the client-side counterpart of the Relay client: the page holds a WebSocket +connection to SignalWire, and call state arrives as events on it rather than as HTTP callbacks. As +in [Track a call via WebSocket (Relay)](#track-a-call-via-websocket-relay), you subscribe to a +call's events, here through the call's `status$` observable instead of `call.on()`. + +An outbound `dial()` returns the call while it is `ringing`. The call then moves through +`connecting` and `connected`, and through `disconnecting`, `disconnected`, and `destroyed` once it +ends. With `disconnected`, `failed`, and `destroyed` treated as final, one subscription updates the +page for every outcome. To show the status on the calling page, add `

Idle

` to +[Place a call from a browser](#place-a-call-from-a-browser), then add the lookup below and replace +that page's `status$` subscription: + +```javascript title="JavaScript — Browser SDK" +const statusLine = document.querySelector("#status"); + +// Inside callButton.onclick, after dial() resolves: +call.status$.subscribe((status) => { + statusLine.textContent = `Call: ${status}`; + if (status === "disconnected" || status === "failed" || status === "destroyed") { + remoteAudio.srcObject = null; + hangupButton.disabled = true; + callButton.disabled = false; + } +}); +``` + +The answering page in [Answer a call in a browser](#answer-a-call-in-a-browser) already writes each +status to `#status`. An inbound call follows the same path once it's answered; one that leaves +`ringing` without reaching `connected` was declined, or the caller hung up. + +Each entry in [`incomingCalls$`][browser-session-state] is a [`Call`][browser-call] with +`direction` set to `inbound`, the browser's equivalent of the Relay `Call` a server handler +receives. Read `from` for the caller's number or Address, `to` for the number or Address they +dialed, and `fromName` for a display name. SignalWire sends `_undef_` as `fromName` when the +caller supplied none, so fall back to `from`. + +## Next steps + + + + + Document structure, webhook payload, variables, and every calling method. + + + + Authentication, contexts, inbound and outbound calls, and call control methods. + + + + Build a full receiver, handle two callers ringing at once, and test from the REST API. + + + + Address types, contexts, and how SignalWire routes a call to the right Resource. + + + diff --git a/fern/products/platform/pages/calling/voice/outbound-calling.mdx b/fern/products/platform/pages/calling/voice/outbound-calling.mdx deleted file mode 100644 index a50cde1be9..0000000000 --- a/fern/products/platform/pages/calling/voice/outbound-calling.mdx +++ /dev/null @@ -1,1871 +0,0 @@ ---- -title: Outbound calling -slug: voice/outbound-calling -description: Place your first outbound phone call, track its progress, and add AI or browser calling to your application. -max-toc-depth: 3 ---- - -[caller-id]: /docs/platform/voice/how-to-set-caller-id-or-cnam -[trial-mode]: /docs/platform/trial-mode -[international]: /docs/platform/how-to-enable-international-services -[api-credentials]: /docs/platform/your-signalwire-api-space -[phone-numbers]: /docs/platform/phone-numbers -[swml-ai]: /docs/swml/reference/calling/ai -[ai-best-practices]: /docs/platform/ai/best-practices -[tcpa]: /docs/platform/compliance/tcpa -[webhooks]: /docs/platform/webhooks -[swml-detect-machine]: /docs/swml/reference/calling/detect-machine -[swml-record-call]: /docs/swml/reference/calling/record-call -[swml-stream]: /docs/swml/reference/calling/stream -[call-whisper]: /docs/swml/guides/call-whisper -[subscriber-token]: /docs/apis/rest/subscribers/tokens/create-subscriber-token -[guest-token]: /docs/apis/rest/subscribers/tokens/create-subscriber-guest-token -[resources]: /docs/platform/resources -[sip-credentials]: /docs/platform/voice/sip/sip-credentials -[subscribers]: /docs/platform/subscribers -[dial-options]: /docs/browser-sdk/v4/reference/interfaces/dial-options -[device-management]: /docs/browser-sdk/v4/guides/device-management -[call-create-error]: /docs/browser-sdk/v4/reference/errors/call-create-error -[browser-inbound]: /docs/browser-sdk/v4/guides/inbound-calls -[browser-call-controls]: /docs/browser-sdk/v4/guides/call-controls -[ts-dial]: /docs/server-sdks/reference/typescript/rest/calling/dial -[address-default-channel]: /docs/browser-sdk/v4/reference/address/default-channel -[browser-transfer]: /docs/browser-sdk/v4/reference/webrtc-call/transfer -[media-access-error]: /docs/browser-sdk/v4/reference/errors/media-access-error -[call-errors]: /docs/browser-sdk/v4/reference/webrtc-call/errors$ -[media-options]: /docs/browser-sdk/v4/reference/interfaces/media-options - -Place an outbound phone call with SignalWire and choose what happens when the destination answers. -Start by calling your own phone and playing a short announcement, then track the call's progress, -run an AI agent, or let users call from your web app. - -## Prepare for your first call - -Have these values ready: - -- Your Space URL, such as `.signalwire.com`. -- Your Project ID and API token from the Dashboard's [API credentials][api-credentials] page. - Enable the token's **Voice** permission for the Calling API. -- If calling a phone number, a voice-capable [phone number purchased in your Space][phone-numbers] - or a [verified caller ID][caller-id]. -- If calling from the browser, you need a [Subscriber token][subscriber-token] or - [guest token][guest-token] to provide to the Browser SDK client. -- A destination device you can answer. - - -A [trial project][trial-mode] can dial only numbers it has purchased or verified, and cannot call -internationally at all. Any other project can dial any number, but needs -[international dialing enabled][international] before it reaches another country. - - -## Make your first call - -Call a phone you can answer and play a short announcement. - - - -### Choose how to place your call - -Choose the approach that fits how you want to control the call. - -| What you want to do | Where to start | -|---|---| -| Give SignalWire call instructions over HTTP, supplied inline or returned by your webhook | [REST Calling API](#place-the-call), using a Server SDK or cURL | -| Control the call in real time, asynchronously receiving events and sending commands over a persistent WebSocket connection | [WebSocket (Relay)](#place-the-call), using a Server SDK | -| Let someone place and speak on a call from your web app | [Browser SDK](#place-the-call) | - -Each approach places the same call, but they differ in how you follow and control it afterward. - -| Function | REST | WebSocket (Relay) | Browser SDK | -|---|---|---|---| -| Place the call without holding a connection open | | | | -| Place the call from a web page, with the user speaking on it | | | | -| Command a call already in progress from any process, by its call ID | | | | -| Follow the call's events in your own code, with no public webhook URL | | | | -| Receive call progress as HTTP callbacks to a URL you host | | | | - -SWML doesn't place calls. It's the script the call runs once it connects, so you place the call -with REST or Relay and pass SWML in the `swml` field. - -### Set your credentials and caller ID - -Replace these values in the code sample you choose: - -| Value | Replace with | -|---|---| -| `` | Your Space's subdomain in `.signalwire.com` | -| `` | Your Project ID | -| `` | Your API token | -| `` | Your caller ID number | -| `` | A [Subscriber token][subscriber-token] created by your backend, for the Browser SDK examples | - -### Choose a destination - -A call can reach a phone, a [SIP destination][sip-credentials], a [Subscriber][subscribers], or -another [Resource][resources] in your SignalWire Space. - -| Destination | Dial | Example | -|---|---|---| -| Phone | Its number in [E.164 format](/docs/platform/what-is-e164) | `+12025550123` | -| SIP destination | Its SIP URI | `sip:support@example.com` | -| Subscriber | Its resource address | `/private/support-rep` | -| Application | Its resource address | `/public/support-agent` | -| Conference | Its resource address | `/public/team-standup` | - -For this walkthrough, choose a device you can answer and replace -`` with its address. - -### Place the call - -Use the REST Calling API with a SignalWire Server SDK or any server-side HTTP client. For -WebSocket calling, use a Server SDK or the Browser SDK. - - - - -The request includes a SignalWire Markup Language (SWML) document in `swml`. SignalWire runs -it when the destination answers, playing the announcement below. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as outbound_call.py and run: python outbound_call.py -from signalwire import SWMLBuilder, SWMLService -from signalwire.rest import RestClient - -client = RestClient( - project="", - token="", - host=".signalwire.com", -) - -swml = ( - SWMLBuilder(SWMLService(name="outbound-call")) - .say("Hello, welcome to SignalWire!") - .build() -) - -call = client.calling.dial( - from_="", - to="", - swml=swml, -) -print(call["id"]) -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as outbound-call.mjs, -// then run: node outbound-call.mjs -import { RestClient, SwmlBuilder } from "@signalwire/sdk"; - -const client = new RestClient({ - project: "", - token: "", - host: ".signalwire.com", -}); - -const swml = new SwmlBuilder() - .say("Hello, welcome to SignalWire!") - .build(); - -const call = await client.calling.dial({ - from: "", - to: "", - swml, -}); -console.log(call.id); -``` - - -```bash -curl -X POST "https://.signalwire.com/api/calling/calls" \ - -u ":" \ - -H "Content-Type: application/json" \ - -d '{ - "command": "dial", - "params": { - "from": "", - "to": "", - "swml": { - "version": "1.0.0", - "sections": { - "main": [ - { "play": {"url": "say:Hello, welcome to SignalWire!"} } - ] - } - } - } - }' -``` - - - - -The TypeScript samples on this page pin `@signalwire/sdk@2.0.5`, whose `dial()` takes a single -options object. The [TypeScript `dial` reference][ts-dial] documents the positional -`dial(from, to, options)` form of a newer release. Match the form to the version you install. - - -The REST API returns a call `id` and status `queued`. This confirms that SignalWire accepted the -request; the call hasn't necessarily rung or been answered yet. Save the `id` to identify this call. - - - - - - -Use a Server SDK when controlling a call flow from the server, or the Browser SDK when placing a -call from a web app. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as outbound_call.py and run: python outbound_call.py -import asyncio -from signalwire.relay import RelayClient - -client = RelayClient( - project="", - token="", - host=".signalwire.com", - contexts=["default"], -) - -async def main(): - async with client: - call = await client.dial( - devices=[[{ - "type": "phone", - "params": { - "from_number": "", - "to_number": "", - "timeout": 30, - }, - }]], - ) - async def hang_up_after_playback(_event): - if call.state != "ended": - await call.hangup() - - await call.play([{ - "type": "tts", - "params": {"text": "Hello, welcome to SignalWire!"}, - }], on_completed=hang_up_after_playback) - await call.wait_for_ended() - -asyncio.run(main()) -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as outbound-call.mjs, -// then run: node outbound-call.mjs -import { RelayClient } from "@signalwire/sdk"; - -const client = new RelayClient({ - project: "", - token: "", - host: ".signalwire.com", - contexts: ["default"], -}); - -await client.connect(); - -try { - const call = await client.dial([[{ - type: "phone", - params: { - from_number: "", - to_number: "", - timeout: 30, - }, - }]]); - await call.play([ - { type: "tts", text: "Hello, welcome to SignalWire!" }, - ], { - onCompleted: async () => { - if (call.state !== "ended") await call.hangup(); - }, - }); - await call.waitForEnded(); -} finally { - await client.disconnect(); -} -``` - - -```javascript -// Install: npm install @signalwire/js@latest rxjs -// Run on HTTPS or localhost with these elements in your page: -// -// -// -// Use a Subscriber Access Token issued by your backend. -import { SignalWire, StaticCredentialProvider } from "@signalwire/js"; - -const client = new SignalWire(new StaticCredentialProvider({ - token: "", -})); -const remoteAudio = document.querySelector("#remote-audio"); -const callButton = document.querySelector("#call"); -const hangupButton = document.querySelector("#hangup"); - -callButton.onclick = async () => { - callButton.disabled = true; - try { - const call = await client.dial("", { audio: true, video: false }); - call.remoteStream$.subscribe((stream) => (remoteAudio.srcObject = stream)); - hangupButton.disabled = false; - hangupButton.onclick = () => { - void call.hangup().catch(console.error); - }; - call.status$.subscribe((status) => { - if (status === "disconnected" || status === "failed" || status === "destroyed") { - remoteAudio.srcObject = null; - hangupButton.disabled = true; - callButton.disabled = false; - } - }); - } catch (error) { - callButton.disabled = false; - console.error(error); - } -}; -``` - - - - - - -### Answer the call - -Answer the destination phone. With a server example, you should hear "Hello, welcome to -SignalWire!", then the call ends. With the browser example, allow -microphone access to speak on the call and select **Hang up** when you finish. - - - -## Track the call's progress - -Use callbacks with REST or event handlers with Relay to follow what happens after you dial. -Follow the section for the approach you used for your first call. - -### Track call progress via REST - -Add `status_url` and `status_events` to your first request to receive call progress callbacks. -Keep the inline `swml` announcement. The examples below place another call with notifications -for `ringing`, `answered`, and `ended`. - -Before running the request, replace `` with a webhook endpoint -you control that SignalWire can reach. Your endpoint receives HTTP POST requests as the call -reaches the selected states. See the [webhooks guide][webhooks] for endpoint setup and local testing. -`status_events` accepts `created`, `ringing`, `answered`, and `ended`; if omitted, it defaults -to `ended`. - - - -```python -swml = ( - SWMLBuilder(SWMLService(name="outbound-call")) - .say("Hello, welcome to SignalWire!") - .build() -) - -call = client.calling.dial( - from_="", - to="", - swml=swml, - status_url="", - status_events=["ringing", "answered", "ended"], -) -``` - - -```typescript -const swml = new SwmlBuilder() - .say("Hello, welcome to SignalWire!") - .build(); - -const call = await client.calling.dial({ - from: "", - to: "", - swml, - status_url: "", - status_events: ["ringing", "answered", "ended"], -}); -``` - - -```bash -curl -X POST "https://.signalwire.com/api/calling/calls" \ - -u ":" \ - -H "Content-Type: application/json" \ - -d '{ - "command": "dial", - "params": { - "from": "", - "to": "", - "swml": { - "version": "1.0.0", - "sections": { - "main": [ - { "play": {"url": "say:Hello, welcome to SignalWire!"} } - ] - } - }, - "status_url": "", - "status_events": ["ringing", "answered", "ended"] - } - }' -``` - - - -This flow shows a call with `ringing`, `answered`, and `ended` status events enabled: - - - -Your code sends a dial request with from, to, and SWML. SignalWire returns the call id with status queued and rings the destination and reports status ringing. When the person answers, SignalWire reports status answered and runs your SWML. When the call finishes, SignalWire reports status ended. - - - - - -```mermaid -sequenceDiagram - participant App as Your code - participant SW as SignalWire - participant Dest as Destination - - App->>SW: dial: from, to, SWML - SW-->>App: call id, status queued - SW->>Dest: rings - SW-->>App: status ringing - Dest->>SW: answers - SW-->>App: status answered - Note over SW,Dest: Your SWML runs - Note over SW,Dest: Call finishes - SW-->>App: status ended -``` - - - -### Track call progress via WebSocket - -Relay exposes call state events through `call.on()`. Because `dial()` returns after the destination -answers, the handler observes later states such as `ending` and `ended`. - -The Browser SDK returns a WebRTC `Call` while it is `ringing`. Subscribe to `call.status$` to follow -it through `connecting`, `connected`, and the final states. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as outbound_call.py and run: python outbound_call.py -import asyncio -from signalwire.relay import RelayClient -from signalwire.relay.event import CallStateEvent - -client = RelayClient( - project="", - token="", - host=".signalwire.com", - contexts=["default"], -) - -async def main(): - async with client: - call = await client.dial( - devices=[[{ - "type": "phone", - "params": { - "from_number": "", - "to_number": "", - "timeout": 30, - }, - }]], - ) - def handle_state(event: CallStateEvent): - print(f"State: {event.call_state}, reason: {event.end_reason}") - - call.on("calling.call.state", handle_state) - async def hang_up_after_playback(_event): - if call.state != "ended": - await call.hangup() - - await call.play([{ - "type": "tts", - "params": {"text": "Hello, welcome to SignalWire!"}, - }], on_completed=hang_up_after_playback) - await call.wait_for_ended() - -asyncio.run(main()) -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as outbound-call.mjs, -// then run: node outbound-call.mjs -import { RelayClient } from "@signalwire/sdk"; - -const client = new RelayClient({ - project: "", - token: "", - host: ".signalwire.com", - contexts: ["default"], -}); - -await client.connect(); - -try { - const call = await client.dial([[{ - type: "phone", - params: { - from_number: "", - to_number: "", - timeout: 30, - }, - }]]); - call.on("calling.call.state", (event) => { - console.log(`State: ${event.params.call_state}, reason: ${event.params.end_reason ?? ""}`); - }); - await call.play([ - { type: "tts", text: "Hello, welcome to SignalWire!" }, - ], { - onCompleted: async () => { - if (call.state !== "ended") await call.hangup(); - }, - }); - await call.waitForEnded(); -} finally { - await client.disconnect(); -} -``` - - -```javascript -// Install: npm install @signalwire/js@latest rxjs -// Run on HTTPS or localhost with these elements in your page: -//

Idle

-// -// -// -import { SignalWire, StaticCredentialProvider } from "@signalwire/js"; - -const client = new SignalWire(new StaticCredentialProvider({ - token: "", -})); -const statusLine = document.querySelector("#status"); -const remoteAudio = document.querySelector("#remote-audio"); -const callButton = document.querySelector("#call"); -const hangupButton = document.querySelector("#hangup"); -const finalStatuses = new Set(["disconnected", "failed", "destroyed"]); - -callButton.onclick = async () => { - callButton.disabled = true; - try { - const call = await client.dial("", { audio: true, video: false }); - call.remoteStream$.subscribe((stream) => (remoteAudio.srcObject = stream)); - call.status$.subscribe((status) => { - statusLine.textContent = `Call: ${status}`; - console.log(`Call: ${status}`); - - if (finalStatuses.has(status)) { - remoteAudio.srcObject = null; - hangupButton.disabled = true; - callButton.disabled = false; - } - }); - - hangupButton.disabled = false; - hangupButton.onclick = () => { - void call.hangup().catch(console.error); - }; - } catch (error) { - statusLine.textContent = "Call failed"; - callButton.disabled = false; - console.error(error); - } -}; -``` -
-
- -For more Relay event handlers, see -[Event listeners in the Relay client guide](/docs/server-sdks/guides/relay-client#event-listeners). - -For Relay, this flow shows the commands your code sends and the events SignalWire returns over the -same persistent connection: - - - -Your code and SignalWire share one persistent WebSocket. Your code sends calling.dial; SignalWire reports created, ringing, and answered through calling.call.state. Your code sends calling.play; SignalWire reports playing and finished through calling.call.play. Your code sends calling.end; SignalWire reports ending and ended through calling.call.state. - - - - - -```mermaid -sequenceDiagram - participant App as Your code - participant SW as SignalWire - - Note over App,SW: One persistent WebSocket, both directions - App->>SW: calling.dial - SW-->>App: calling.call.state: created, ringing, answered - App->>SW: calling.play - SW-->>App: calling.call.play: playing, then finished - App->>SW: calling.end - SW-->>App: calling.call.state: ending, then ended -``` - - - -## Examples - -### Run an AI agent - -Start an AI agent that welcomes the person and answers basic questions about SignalWire. - - -Before dialing, follow consent, do-not-call, and calling-hour requirements for artificial voices. -See the [TCPA guide][tcpa] and [AI best practices][ai-best-practices]. - - -#### Run an AI agent via REST - -Send a `dial` request with an inline SWML [`ai` instruction][swml-ai] that starts when the call is answered. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as outbound_call.py and run: python outbound_call.py -from signalwire import SWMLBuilder, SWMLService -from signalwire.rest import RestClient - -client = RestClient( - project="", - token="", - host=".signalwire.com", -) - -swml = ( - SWMLBuilder(SWMLService(name="outbound-ai-call")) - .ai( - prompt_text="Welcome the caller to SignalWire. Briefly explain that SignalWire provides APIs and SDKs for voice, messaging, video, and AI. Answer basic follow-up questions. If you are unsure, direct the caller to signalwire.com.", - params={ - "static_greeting": "Hello, welcome to SignalWire! This call uses an artificial voice.", - "static_greeting_no_barge": True, - }, - ) - .build() -) - -call = client.calling.dial( - from_="", - to="", - swml=swml, -) -print(call["id"]) -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as outbound-call.mjs, -// then run: node outbound-call.mjs -import { RestClient, SwmlBuilder } from "@signalwire/sdk"; - -const client = new RestClient({ - project: "", - token: "", - host: ".signalwire.com", -}); - -const swml = new SwmlBuilder() - .ai({ - prompt: "Welcome the caller to SignalWire. Briefly explain that SignalWire provides APIs and SDKs for voice, messaging, video, and AI. Answer basic follow-up questions. If you are unsure, direct the caller to signalwire.com.", - params: { - static_greeting: "Hello, welcome to SignalWire! This call uses an artificial voice.", - static_greeting_no_barge: true, - }, - }) - .build(); - -const call = await client.calling.dial({ - from: "", - to: "", - swml, -}); -console.log(call.id); -``` - - -```bash -curl -X POST "https://.signalwire.com/api/calling/calls" \ - -u ":" \ - -H "Content-Type: application/json" \ - -d '{ - "command": "dial", - "params": { - "from": "", - "to": "", - "swml": { - "version": "1.0.0", - "sections": { - "main": [ - { - "ai": { - "params": { - "static_greeting": "Hello, welcome to SignalWire! This call uses an artificial voice.", - "static_greeting_no_barge": true - }, - "prompt": { - "text": "Welcome the caller to SignalWire. Briefly explain that SignalWire provides APIs and SDKs for voice, messaging, video, and AI. Answer basic follow-up questions. If you are unsure, direct the caller to signalwire.com." - } - } - } - ] - } - } - } - }' -``` - - - -#### Run an AI agent via WebSocket (Relay) - -Dial with Relay, start the agent with `call.ai()`, and keep the connection open until the call ends. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as outbound_call.py and run: python outbound_call.py -import asyncio -from signalwire.relay import RelayClient - -client = RelayClient( - project="", - token="", - host=".signalwire.com", - contexts=["default"], -) - -async def main(): - async with client: - call = await client.dial( - devices=[[{ - "type": "phone", - "params": { - "from_number": "", - "to_number": "", - "timeout": 30, - }, - }]], - ) - await call.ai( - ai_params={ - "static_greeting": "Hello, welcome to SignalWire! This call uses an artificial voice.", - "static_greeting_no_barge": True, - }, - prompt={ - "text": """Welcome the caller to SignalWire. Briefly explain that SignalWire -provides APIs and SDKs for voice, messaging, video, and AI. Answer basic -follow-up questions. If you are unsure, direct the caller to signalwire.com.""" - }, - ) - # Keep the connection open until the destination hangs up. - await call.wait_for_ended() - -asyncio.run(main()) -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as outbound-call.mjs, -// then run: node outbound-call.mjs -import { RelayClient } from "@signalwire/sdk"; - -const client = new RelayClient({ - project: "", - token: "", - host: ".signalwire.com", - contexts: ["default"], -}); - -await client.connect(); - -try { - const call = await client.dial([[{ - type: "phone", - params: { - from_number: "", - to_number: "", - timeout: 30, - }, - }]]); - await call.ai({ - aiParams: { - static_greeting: "Hello, welcome to SignalWire! This call uses an artificial voice.", - static_greeting_no_barge: true, - }, - prompt: { - text: `Welcome the caller to SignalWire. Briefly explain that SignalWire - provides APIs and SDKs for voice, messaging, video, and AI. Answer basic - follow-up questions. If you are unsure, direct the caller to signalwire.com.`, - }, - }); - // Keep the connection open until the destination hangs up. - await call.waitForEnded(); -} finally { - await client.disconnect(); -} -``` - - - -### Leave a voicemail - -Use answering machine detection (AMD) to speak to a person immediately or leave a message after a -voicemail greeting and beep. - -Follow the consent and calling-hour requirements in the [TCPA guide][tcpa]. - -#### Leave a voicemail via REST - -Use [`detect_machine`][swml-detect-machine] and `switch` to choose the live or voicemail message. - - - -```python -voicemail = "say:Hello, welcome to SignalWire! Visit signalwire.com to learn more." -live = "say:Hello, welcome to SignalWire!" - -swml = ( - SWMLBuilder(SWMLService(name="outbound-voicemail")) - .detect_machine( - detectors="amd", - detect_message_end=True, - timeout=30, - ) - .switch( - variable="detect_result", - case={ - "machine": [{"play": {"url": voicemail}}], - "human": [{"play": {"url": live}}], - }, - default=[{ - "play": { - "url": "say:Hello, welcome to SignalWire!" - } - }], - ) - .hangup() - .build() -) - -call = client.calling.dial( - from_="", - to="", - swml=swml, -) -print(call["id"]) -``` - - -```typescript -const voicemail = "say:Hello, welcome to SignalWire! Visit signalwire.com to learn more."; -const live = "say:Hello, welcome to SignalWire!"; - -const swml = new SwmlBuilder() - .detect_machine({ - detectors: "amd", - detect_message_end: true, - timeout: 30, - }) - .switch({ - variable: "detect_result", - case: { - machine: [{ play: { url: voicemail } }], - human: [{ play: { url: live } }], - }, - default: [{ - play: { - url: "say:Hello, welcome to SignalWire!", - }, - }], - }) - .hangup() - .build(); - -const call = await client.calling.dial({ - from: "", - to: "", - swml, -}); -console.log(call.id); -``` - - -```bash -curl -X POST "https://.signalwire.com/api/calling/calls" \ - -u ":" \ - -H "Content-Type: application/json" \ - -d '{ - "command": "dial", - "params": { - "from": "", - "to": "", - "swml": { - "version": "1.0.0", - "sections": { - "main": [ - { - "detect_machine": { - "detectors": "amd", - "detect_message_end": true, - "timeout": 30 - } - }, - { - "switch": { - "variable": "detect_result", - "case": { - "machine": [ - { "play": {"url": "say:Hello, welcome to SignalWire! Visit signalwire.com to learn more."} } - ], - "human": [ - { "play": {"url": "say:Hello, welcome to SignalWire!"} } - ] - }, - "default": [ - { "play": {"url": "say:Hello, welcome to SignalWire!"} } - ] - } - }, - { "hangup": {} } - ] - } - } - } - }' -``` - - - -#### Leave a voicemail via WebSocket (Relay) - -Use `call.detect()` to play the live message after `HUMAN` or `UNKNOWN`, or wait for `READY` after a -machine greeting. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as outbound_call.py and run: python outbound_call.py -import asyncio -from signalwire.relay import RelayClient -from signalwire.relay.event import DetectEvent - -VOICEMAIL = "Hello, welcome to SignalWire! Visit signalwire.com to learn more." -LIVE = "Hello, welcome to SignalWire!" - -client = RelayClient( - project="", - token="", - host=".signalwire.com", - contexts=["default"], -) - -def outcome(event: DetectEvent) -> str: - return event.detect.get("params", {}).get("event", "") - -async def main(): - async with client: - call = await client.dial( - devices=[[{ - "type": "phone", - "params": { - "from_number": "", - "to_number": "", - "timeout": 30, - }, - }]], - ) - async def hang_up_after_playback(_event): - if call.state != "ended": - await call.hangup() - - announced = False - - async def announce(event: DetectEvent): - nonlocal announced - if announced or call.state == "ended": - return - result = outcome(event) - if result == "READY": - # The voicemail greeting and its beep have finished. - announced = True - await call.play( - [{"type": "tts", "params": {"text": VOICEMAIL}}], - on_completed=hang_up_after_playback, - ) - elif result in ("HUMAN", "UNKNOWN"): - announced = True - await call.play( - [{"type": "tts", "params": {"text": LIVE}}], - on_completed=hang_up_after_playback, - ) - elif result == "finished": - await call.hangup() - - call.on("calling.call.detect", announce) - await call.detect({"type": "machine", "params": {"detect_message_end": True}}, timeout=30) - await call.wait_for_ended() - -asyncio.run(main()) -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// Save as outbound-call.mts and run: npx tsx outbound-call.mts -import { RelayClient, DetectEvent, RelayEvent } from "@signalwire/sdk"; - -const VOICEMAIL = "Hello, welcome to SignalWire! Visit signalwire.com to learn more."; -const LIVE = "Hello, welcome to SignalWire!"; - -const client = new RelayClient({ - project: "", - token: "", - host: ".signalwire.com", - contexts: ["default"], -}); - -function outcome(event: RelayEvent): string { - const detect = (event as DetectEvent).detect?.params as { event?: string } | undefined; - return detect?.event ?? ""; -} - -await client.connect(); - -try { - const call = await client.dial([[{ - type: "phone", - params: { - from_number: "", - to_number: "", - timeout: 30, - }, - }]]); - const hangUpAfterPlayback = async () => { - if (call.state !== "ended") await call.hangup(); - }; - let announced = false; - - call.on("calling.call.detect", async (event) => { - if (announced || call.state === "ended") return; - const result = outcome(event); - if (result === "READY") { - // The voicemail greeting and its beep have finished. - announced = true; - await call.play([{ type: "tts", text: VOICEMAIL }], { onCompleted: hangUpAfterPlayback }); - } else if (result === "HUMAN" || result === "UNKNOWN") { - announced = true; - await call.play([{ type: "tts", text: LIVE }], { onCompleted: hangUpAfterPlayback }); - } else if (result === "finished") { - await call.hangup(); - } - }); - - await call.detect({ type: "machine", params: { detect_message_end: true } }, { timeout: 30 }); - await call.waitForEnded(); -} finally { - await client.disconnect(); -} -``` - - - -### Whisper before connecting two people - -Play a private message to ``, then connect that call to -``. - -#### Play a whisper via REST - -Use `connect.confirm` to play the [whisper][call-whisper] to the agent before bridging the calls. - - - -```python -whisper = "say:You are about to be connected to the caller." - -swml = ( - SWMLBuilder(SWMLService(name="outbound-whisper")) - .say("Hello, welcome to SignalWire!") - .connect(**{ - "from": "", - "to": "", - "confirm": [{"play": {"url": whisper}}], - "confirm_timeout": 20, - }) - .build() -) - -call = client.calling.dial( - from_="", - to="", - swml=swml, -) -print(call["id"]) -``` - - -```typescript -const whisper = "say:You are about to be connected to the caller."; - -const swml = new SwmlBuilder() - .say("Hello, welcome to SignalWire!") - .connect({ - from: "", - to: "", - confirm: [{ play: { url: whisper } }], - confirm_timeout: 20, - }) - .build(); - -const call = await client.calling.dial({ - from: "", - to: "", - swml, -}); -console.log(call.id); -``` - - -```bash -curl -X POST "https://.signalwire.com/api/calling/calls" \ - -u ":" \ - -H "Content-Type: application/json" \ - -d '{ - "command": "dial", - "params": { - "from": "", - "to": "", - "swml": { - "version": "1.0.0", - "sections": { - "main": [ - { "play": {"url": "say:Hello, welcome to SignalWire!"} }, - { - "connect": { - "from": "", - "to": "", - "confirm": [ - { "play": {"url": "say:You are about to be connected to the caller."} } - ], - "confirm_timeout": 20 - } - } - ] - } - } - } - }' -``` - - - -#### Play a whisper via WebSocket (Relay) - -Dial the agent first, play the whisper, then connect the caller after playback finishes. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as outbound_call.py and run: python outbound_call.py -import asyncio -from signalwire.relay import RelayClient - -client = RelayClient( - project="", - token="", - host=".signalwire.com", - contexts=["default"], -) - -async def main(): - async with client: - # Call the agent first: only this leg hears the whisper. - call = await client.dial( - devices=[[{ - "type": "phone", - "params": { - "from_number": "", - "to_number": "", - "timeout": 30, - }, - }]], - ) - async def connect_the_caller(_event): - if call.state != "ended": - await call.connect([[{ - "type": "phone", - "params": { - "from_number": "", - "to_number": "", - "timeout": 30, - }, - }]]) - - await call.play( - [{"type": "tts", "params": {"text": "You are about to be connected to the caller."}}], - on_completed=connect_the_caller, - ) - await call.wait_for_ended() - -asyncio.run(main()) -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as outbound-call.mjs, -// then run: node outbound-call.mjs -import { RelayClient } from "@signalwire/sdk"; - -const client = new RelayClient({ - project: "", - token: "", - host: ".signalwire.com", - contexts: ["default"], -}); - -await client.connect(); - -try { - // Call the agent first: only this leg hears the whisper. - const call = await client.dial([[{ - type: "phone", - params: { - from_number: "", - to_number: "", - timeout: 30, - }, - }]]); - await call.play( - [{ type: "tts", text: "You are about to be connected to the caller." }], - { - onCompleted: async () => { - if (call.state === "ended") return; - await call.connect([[{ - type: "phone", - params: { - from_number: "", - to_number: "", - timeout: 30, - }, - }]]); - }, - }, - ); - await call.waitForEnded(); -} finally { - await client.disconnect(); -} -``` - - - -### Record the call - -Record both sides of an outbound call and retrieve the finished recording URL. - - -Confirm which parties must consent and announce the recording when required. - - -#### Record the call via REST - -Start [`record_call`][swml-record-call] in the background and receive the result at `status_url`. - - - -```python -swml = ( - SWMLBuilder(SWMLService(name="outbound-recording")) - .record_call( - format="mp3", - direction="both", - stereo=True, - beep=True, - status_url="", - ) - .say("Hello, welcome to SignalWire!") - .build() -) - -call = client.calling.dial( - from_="", - to="", - swml=swml, -) -print(call["id"]) -``` - - -```typescript -const swml = new SwmlBuilder() - .record_call({ - format: "mp3", - direction: "both", - stereo: true, - beep: true, - status_url: "", - }) - .say("Hello, welcome to SignalWire!") - .build(); - -const call = await client.calling.dial({ - from: "", - to: "", - swml, -}); -console.log(call.id); -``` - - -```bash -curl -X POST "https://.signalwire.com/api/calling/calls" \ - -u ":" \ - -H "Content-Type: application/json" \ - -d '{ - "command": "dial", - "params": { - "from": "", - "to": "", - "swml": { - "version": "1.0.0", - "sections": { - "main": [ - { - "record_call": { - "format": "mp3", - "direction": "both", - "stereo": true, - "beep": true, - "status_url": "" - } - }, - { "play": {"url": "say:Hello, welcome to SignalWire!"} } - ] - } - } - } - }' -``` - - - -#### Record the call via WebSocket (Relay) - -Start `call.record()` and read the recording URL from its `finished` event. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as outbound_call.py and run: python outbound_call.py -import asyncio -from signalwire.relay import RelayClient - -client = RelayClient( - project="", - token="", - host=".signalwire.com", - contexts=["default"], -) - -async def main(): - async with client: - call = await client.dial( - devices=[[{ - "type": "phone", - "params": { - "from_number": "", - "to_number": "", - "timeout": 30, - }, - }]], - ) - recording = await call.record( - audio={ - "format": "mp3", - "direction": "both", - "stereo": True, - "beep": True, - "initial_timeout": 0, - "end_silence_timeout": 0, - }, - ) - async def hang_up_after_playback(_event): - if call.state != "ended": - await call.hangup() - - await call.play( - [{"type": "tts", "params": {"text": "Hello, welcome to SignalWire!"}}], - on_completed=hang_up_after_playback, - ) - await call.wait_for_ended() - finished = await recording.wait() - print(f"Recording: {finished.url}") - -asyncio.run(main()) -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// Save as outbound-call.mts and run: npx tsx outbound-call.mts -import { RelayClient, RecordEvent } from "@signalwire/sdk"; - -const client = new RelayClient({ - project: "", - token: "", - host: ".signalwire.com", - contexts: ["default"], -}); - -await client.connect(); - -try { - const call = await client.dial([[{ - type: "phone", - params: { - from_number: "", - to_number: "", - timeout: 30, - }, - }]]); - const recording = await call.record({ - format: "mp3", - direction: "both", - stereo: true, - beep: true, - initial_timeout: 0, - end_silence_timeout: 0, - }); - await call.play( - [{ type: "tts", text: "Hello, welcome to SignalWire!" }], - { - onCompleted: async () => { - if (call.state !== "ended") await call.hangup(); - }, - }, - ); - await call.waitForEnded(); - const finished = await recording.wait(); - console.log(`Recording: ${(finished as RecordEvent).url}`); -} finally { - await client.disconnect(); -} -``` - - - -### Stream the call audio - -Stream both sides of a live call to your secure WebSocket endpoint for real-time processing. - -#### Stream call audio via REST - -Start [`stream`][swml-stream] in the background and send status events to your webhook. - - - -```python -# `stream` is not yet in the builder's bundled schema, so add it as raw SWML. -swml_builder = SWMLBuilder( - SWMLService(name="outbound-stream", schema_validation=False) -) -swml_builder.service.add_verb("stream", { - "url": "", - "track": "both_tracks", - "codec": "PCMU", - "status_url": "", -}) -swml = ( - swml_builder - .say("Hello, welcome to SignalWire!") - .build() -) - -call = client.calling.dial( - from_="", - to="", - swml=swml, -) -print(call["id"]) -``` - - -```typescript -// `stream` is not yet in the builder's bundled schema, so add it as raw SWML. -const swmlBuilder = new SwmlBuilder(); -swmlBuilder.setValidation(false); -swmlBuilder.addVerb("stream", { - url: "", - track: "both_tracks", - codec: "PCMU", - status_url: "", -}); -swmlBuilder.setValidation(true); -const swml = swmlBuilder - .say("Hello, welcome to SignalWire!") - .build(); - -const call = await client.calling.dial({ - from: "", - to: "", - swml, -}); -console.log(call.id); -``` - - -```bash -curl -X POST "https://.signalwire.com/api/calling/calls" \ - -u ":" \ - -H "Content-Type: application/json" \ - -d '{ - "command": "dial", - "params": { - "from": "", - "to": "", - "swml": { - "version": "1.0.0", - "sections": { - "main": [ - { - "stream": { - "url": "", - "track": "both_tracks", - "codec": "PCMU", - "status_url": "" - } - }, - { "play": {"url": "say:Hello, welcome to SignalWire!"} } - ] - } - } - } - }' -``` - - - -#### Stream call audio via WebSocket (Relay) - -Start `call.stream()` over the Relay connection and keep it running until the call ends. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as outbound_call.py and run: python outbound_call.py -import asyncio -from signalwire.relay import RelayClient - -client = RelayClient( - project="", - token="", - host=".signalwire.com", - contexts=["default"], -) - -async def main(): - async with client: - call = await client.dial( - devices=[[{ - "type": "phone", - "params": { - "from_number": "", - "to_number": "", - "timeout": 30, - }, - }]], - ) - stream = await call.stream( - url="", - track="both_tracks", - codec="PCMU", - custom_parameters={"session_id": ""}, - ) - print(f"Streaming audio, control ID {stream.control_id}") - - async def hang_up_after_playback(_event): - if call.state != "ended": - await call.hangup() - - await call.play( - [{"type": "tts", "params": {"text": "Hello, welcome to SignalWire!"}}], - on_completed=hang_up_after_playback, - ) - await call.wait_for_ended() - -asyncio.run(main()) -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as outbound-call.mjs, -// then run: node outbound-call.mjs -import { RelayClient } from "@signalwire/sdk"; - -const client = new RelayClient({ - project: "", - token: "", - host: ".signalwire.com", - contexts: ["default"], -}); - -await client.connect(); - -try { - const call = await client.dial([[{ - type: "phone", - params: { - from_number: "", - to_number: "", - timeout: 30, - }, - }]]); - const stream = await call.stream("", { - track: "both_tracks", - codec: "PCMU", - customParameters: { session_id: "" }, - }); - console.log(`Streaming audio, control ID ${stream.controlId}`); - await call.play( - [{ type: "tts", text: "Hello, welcome to SignalWire!" }], - { - onCompleted: async () => { - if (call.state !== "ended") await call.hangup(); - }, - }, - ); - await call.waitForEnded(); -} finally { - await client.disconnect(); -} -``` - - - -### Call from the browser - -Place a WebRTC call from a web page using a restricted [guest token][guest-token] from your backend. -Serve the page over HTTPS or `localhost` so the browser can access the microphone. - - - -```html - - - - - Call with SignalWire - - -

Idle

- - - - - - -``` -
- -```javascript -// Install: npm install @signalwire/js@latest rxjs -// Save as call.js next to the page above. -// GET /api/guest-token is your own endpoint: it creates a guest SAT with your -// Project API token and returns it as {"token": "..."}. -import { SignalWire, StaticCredentialProvider } from "@signalwire/js"; - -const statusLine = document.querySelector("#status"); -const remoteAudio = document.querySelector("#remote-audio"); -const callButton = document.querySelector("#call"); -const hangupButton = document.querySelector("#hangup"); - -let clientPromise; - -function getClient() { - clientPromise ??= (async () => { - const response = await fetch("/api/guest-token"); - if (!response.ok) throw new Error(`Token request failed: ${response.status}`); - const { token } = await response.json(); - if (!token) throw new Error("Token response did not include a token"); - return new SignalWire(new StaticCredentialProvider({ token })); - })().catch((error) => { - clientPromise = undefined; - throw error; - }); - return clientPromise; -} - -function reset() { - remoteAudio.srcObject = null; - callButton.disabled = false; - hangupButton.disabled = true; -} - -callButton.onclick = async () => { - callButton.disabled = true; - statusLine.textContent = "Connecting"; - try { - const client = await getClient(); - const call = await client.dial("", { audio: true, video: false }); - call.remoteStream$.subscribe((stream) => (remoteAudio.srcObject = stream)); - hangupButton.disabled = false; - hangupButton.onclick = () => { - void call.hangup().catch(console.error); - }; - call.status$.subscribe((status) => { - statusLine.textContent = status; - if (status === "disconnected" || status === "failed" || status === "destroyed") { - reset(); - } - }); - } catch (error) { - statusLine.textContent = "Call failed"; - console.error(error); - reset(); - } -}; -``` - -
- -#### Choose audio, video, or both - -`client.dial()` takes a [`DialOptions`][dial-options] object whose `audio` and `video` keys set what -the browser captures and sends. Omit them and the call sends audio only. - - - - -```javascript -const call = await client.dial("", { audio: true, video: true }); -``` - -A standard video call. Both tracks come from the selected microphone and camera. - - - - -```javascript -const call = await client.dial("", { audio: true, video: false }); -``` - -A phone-style call, with no camera permission prompt. - - - - -```javascript -const call = await client.dial("", { audio: false, video: true }); -``` - -Joins on camera with the microphone muted — a kiosk, or a viewer who watches without speaking. - - - - -```javascript -const call = await client.dial("", { - audio: false, - video: false, - receiveAudio: true, - receiveVideo: true, -}); -``` - -Joins without sending any media. The remote tracks still arrive on `remoteStream$`. - - - - -A destination address can carry a `?channel=audio` or `?channel=video` hint that sets the matching -defaults, but options passed to `dial()` always win. If you're picking destinations from the -directory, an `Address` exposes [`defaultChannel`][address-default-channel], a ready-to-dial URI, so -you don't assemble the string yourself. To pin the microphone, camera, or speaker across -every call instead of constraining each `dial()`, use the [device management APIs][device-management]. - -#### When local media can't be captured - -If the local media can't be captured, the SDK falls back to receive-only: the call connects, remote media arrives on -`remoteStream$`, and the reason is reported on [`errors$`][call-errors] as a non-fatal -[`MediaAccessError`][media-access-error]. - -```javascript -import { MediaAccessError } from "@signalwire/js"; - -call.errors$.subscribe(({ error, fatal }) => { - if (error instanceof MediaAccessError && !fatal) { - banner.textContent = error.denied - ? `You joined without ${error.media}. Grant access and rejoin to send it.` - : `Couldn't open your ${error.media}. You're receiving only.`; - } -}); -``` - -Set [`fallbackToReceiveOnly`][media-options] to `false` to make an acquisition failure fatal -instead. - -#### Attach the media to the page - -The call exposes `localStream$` (what the user sends) and `remoteStream$` (what the user receives). -Bind each to a media element's `srcObject`. The sample above binds `remoteStream$` to an `
@@ -109,7 +106,7 @@ Click the **Add** button to select from the grid of available Resource types. -The Resource picker offers **Script**, **AI Agent**, **Conference Room**, **Relay Application**, **Subscriber**, **FreeSWITCH Connector**, **Call Flow**, and **SIP**. +The Resource picker offers **Script**, **AI Agent**, **Video Room**, **Relay Application**, **Subscriber**, **FreeSWITCH Connector**, **Call Flow**, and **SIP**. **Script** asks for a SWML or cXML Script, **AI Agent** for a Custom or Google DialogFlow Agent, and **SIP** for a SIP Credential or SIP Gateway. @@ -117,6 +114,13 @@ Alternatively, you can create new Resources from their subpages in the sidebar m After selecting a Resource, enter the details for the Resource on a new page, and select Create to confirm. +#### Give it an Address + +A new Resource is reachable at the alias SignalWire creates from its name. To take calls from the +phone network, assign it as a phone number's call handler, or add a SIP Address or another alias +from the Resource's **Addresses & Phone Numbers** tab. The [Addresses guide](/docs/platform/addresses#manage-addresses) +walks through each. + If you don't see the **My Resources** tab, your SignalWire Space is on the **Legacy Dashboard**, which does not support the Resources experience. [Contact Support](https://support.signalwire.com/) @@ -148,8 +152,8 @@ The **My Resources** page lists each Resource's name, type, and last update time Manage the users in your communication system via subscribers. - - Understand contexts, naming, and how Resources are identified and called. + + Phone numbers, SIP Addresses, and aliases: how a Resource is reached and how to assign them. List, retrieve, and delete Resources programmatically. diff --git a/fern/products/platform/pages/platform/call-fabric/subscribers.mdx b/fern/products/platform/pages/platform/call-fabric/subscribers.mdx index 631ce24d21..e07bcded58 100644 --- a/fern/products/platform/pages/platform/call-fabric/subscribers.mdx +++ b/fern/products/platform/pages/platform/call-fabric/subscribers.mdx @@ -1,8 +1,8 @@ --- id: b0e8b4e1-9172-49c4-8455-b3f22114b173 title: Subscribers -subtitle: The foundation of user management in Call Fabric -description: Comprehensive overview of SignalWire Call Fabric Subscribers - the building blocks of Programmable Unified Communications for user management and onboarding. +subtitle: The foundation of user management on SignalWire +description: Comprehensive overview of SignalWire Subscribers - the building blocks of Programmable Unified Communications for user management and onboarding. slug: subscribers --- @@ -15,7 +15,7 @@ slug: subscribers ## What are subscribers? -Subscribers are the core [Resources][resources] in SignalWire's Call Fabric platform that represent users +Subscribers are the core [Resources][resources] on SignalWire that represent users in your communication system. More than just a simple user account, Subscribers provide a complete user management solution with built-in authentication, communication endpoints, and billing integration. @@ -33,7 +33,7 @@ Every Subscriber comes with four core components that work together to provide a emails, company details, timezones, and locations. - Multi-channel connectivity with private Call Fabric address for internal communication plus public phone numbers for external calls. + Multi-channel connectivity with private resource address for internal communication plus public phone numbers for external calls. Full SIP, WebRTC, and PSTN support. @@ -49,10 +49,10 @@ Subscribers are built on three core technical systems: ### Resource addressing -Subscribers use Call Fabric's unified addressing system for consistent identification across all platform +Subscribers use SignalWire's unified addressing system for consistent identification across all platform [Resources][resources]. Each Subscriber is uniquely identified by an address in the format `//`. -**Addresses make Subscribers directly callable.** When a call is placed to a Subscriber's address, Call Fabric +**Addresses make Subscribers directly callable.** When a call is placed to a Subscriber's address, SignalWire automatically routes the call directly to that Subscriber. This enables seamless peer-to-peer communication without complex routing configuration. @@ -67,7 +67,7 @@ without complex routing configuration. **How direct calling works:** - When someone calls `/private/john-doe`, the call rings John's registered device - The Subscriber can answer on any device (mobile app, web browser, desk phone) -- Call Fabric handles device registration, presence, and simultaneous ring automatically +- SignalWire handles device registration, presence, and simultaneous ring automatically Subscribers default to `private` context for security, with optional public aliases for external access. Learn more about [Resource Addresses][resource-addresses], including contexts, naming conventions, and advanced routing options. diff --git a/fern/products/platform/pages/platform/core/glossary.mdx b/fern/products/platform/pages/platform/core/glossary.mdx index 2c32b415d5..fddbe8707f 100644 --- a/fern/products/platform/pages/platform/core/glossary.mdx +++ b/fern/products/platform/pages/platform/core/glossary.mdx @@ -36,7 +36,7 @@ max-toc-depth: 3 [video-token]: /docs/apis/rest/video/room-tokens/create-room-token [webhooks]: /docs/platform/webhooks -This glossary defines each SignalWire term, with the aliases and historical names it answers to and the similar terms it should not be confused with. +This glossary defines each SignalWire term, with the aliases and historical names it answers to and the similar terms it should not be confused with. An alias is listed only where it is still live in the product, such as a Dashboard label, an API path or field, an SDK parameter, or a package name, and each entry says where. ## Accounts and access @@ -69,7 +69,7 @@ Each Project has its own Project ID and API tokens, so a Project is the unit of A Project nested one level beneath a root Project. A Subproject is a full Project with its own Project ID and Resources, but Subprojects cannot contain other Subprojects. -Subprojects can be created and deleted through the [Projects API][projects-api] with a Project's API token; creating or deleting a root Project through the API takes a [Personal access token](#personal-access-token). Note that a Project must release its phone numbers and remove its Subprojects before it can be deleted. +Subprojects can be created and deleted through the [Projects API][projects-api] with a Project's API token; creating or deleting a root Project through the API takes a [Personal access token](#personal-access-token). A Project must release its phone numbers and remove its Subprojects before it can be deleted, and the last Project in a Space cannot be deleted. #### Project ID [#project-id] @@ -79,7 +79,7 @@ In the Compatibility API, this is called the **Account SID** for compatibility w ### API token [#api-token] -A Project-scoped credential used server-side, and the password half of HTTP Basic [authentication][authorization]. A Project can hold several tokens, each with its own scopes, and you create and revoke them from the Dashboard. +A Project-scoped credential used server-side, and the password half of HTTP Basic [authentication][authorization]. A Project can hold several tokens, each with its own scopes, and you create and revoke them from the Dashboard or through the REST API. An API token does not belong in a browser; client-side credentials are created by calling an API endpoint with it. @@ -98,23 +98,23 @@ The tokens at a glance: | [Chat token][chat-token] | Client-side credential for Chat, created with an API token. | | [Personal access token](#personal-access-token) | Per user, not per Project. Administers the Space over the API and downloads FreeSWITCH binaries. | -## Call Fabric [#call-fabric] +## Resources and Addresses [#resources-and-addresses] -SignalWire's addressing model. Every communication entity — a user, a script, an AI agent, a SIP endpoint, a video room — is a [Resource][resources] reachable at an Address, so one dialing model reaches all of them and all of them are managed the same way. +SignalWire's addressing model. Every communication entity — a user, a script, an AI agent, a SIP endpoint, a video room — is a [Resource][resources] reachable at an Address, so one dialing model reaches all of them and all of them are managed the same way. The Dashboard and the `/api/fabric/` REST paths still use the name **Call Fabric** for this model. ### Resource [#resource] -A container object representing one communication entity. Every Resource has a **Type** — Subscriber, SWML Script, cXML Script, AI Agent, Call Flow, Relay Application, FreeSWITCH Connector, SIP, Video Room — and one or more [Addresses][addresses] that make it reachable. All types share the same addressing and management model. +A container object representing one communication entity. Every Resource has a **Type** and one or more [Addresses][addresses] that make it reachable. The REST API defines fourteen types and reports each Resource's in the `type` field of its response: Subscriber, AI Agent, SWML Script, SWML Webhook, cXML Script, cXML Application, cXML Webhook, Call Flow, Relay Application, FreeSWITCH Connector, SIP Credential, whose `type` value is `sip_endpoint`, SIP Gateway, Dialogflow Agent, and Video Room. The Dashboard also offers Remote AI Agent, which has no REST API type. All types share the same addressing and management model. Capital-R Resource is not the generic "REST resource" of an API path. The REST namespace of the Server SDKs uses "resource" in that looser sense too. ### Resource Address [#resource-address] -The path that reaches a Resource, in the form `/context/name`. The context is `public` or `private`, and the name defaults to the Resource's name. An AI agent named `Sigmond` in the public context is reachable at `/public/Sigmond`. +The path that reaches a Resource, in the form `/context/name`. Every Project starts with a `public` and a `private` context, and you can add named contexts of either access type from the Dashboard. The name defaults to the Resource's name in lowercase. An AI agent named `Sigmond` in the public context is reachable at `/public/sigmond`. -Addresses are mutable and a Resource can have several, including phone numbers and SIP URIs. When you're addressing a Resource from within its own context, you can omit the context: a Subscriber named `Bob` in the `private` context is reachable at `/private/Bob`, or, from within that context, just `/Bob`. +Addresses are mutable and a Resource can have several, including phone numbers and SIP URIs. When you're addressing a Resource from within its own context, you can omit the context: a Subscriber named `Bob` in the `private` context is reachable at `/private/bob`, or, from within that context, just `/bob`. -Some older pages say "Fabric Address"; it names the same thing. +The REST API reference calls it a **Fabric Address**. ### Phone number [#phone-number] @@ -128,11 +128,11 @@ A [Resource][subscribers] type representing a user in your communication system, A short-lived credential identifying one Subscriber and carrying the capabilities granted to them, sent as Bearer authentication. Also written **Subscriber Access Token** or **SAT**. Your backend creates one using your Project's API token and hands it to the browser, where the [Browser SDK][sat] uses it to open a session. -Three variants exist for different levels of trust — the default SAT, a Guest SAT, and an Invite SAT — alongside a separate Embed token for public widgets. +Three variants exist for different levels of trust: the default SAT for a signed-in Subscriber, a Guest SAT that your backend creates for a visitor and limits to a list of Addresses, and an Invite SAT that a signed-in Subscriber creates for one recipient and one Address. A separate Embed token serves public widgets. ### Relay Application [#relay-application] -A Resource type representing your own server connected over [Relay](#relay). It carries a **context**, and calls addressed to the Resource are handed to whichever Relay client is subscribed to that context. +A Resource type representing your own server connected over [Relay](#relay). It carries a **topic**, and calls addressed to the Resource are sent to whichever connected Relay client is subscribed to that topic. The Dashboard labels the field **Topic**. In the Server SDKs, `RelayClient` subscribes to it through its `contexts` parameter. A Relay Application is not the Relay namespace of the Server SDKs and not the Server SDKs themselves. It is the Dashboard-side Resource that routes a call to code you are already running. @@ -154,13 +154,32 @@ The whole call as the person on the other end experiences it, from the moment it The relationship between two user agents. A call is made of one or more legs: forwarding an inbound call to a single SIP endpoint is two legs, and fanning it out to four endpoints is five. -In SWML each leg has its own `call` object with its own `call_id`, and connecting to a new leg re-initializes that object with the new leg's data. A leg's `call_id` is the same identifier the logs show as its [Segment ID](#segment-id). +In SWML each leg has its own `call` object with its own [Call ID](#call-id), and connecting to a new leg re-initializes that object with the new leg's data. + +### Call ID [#call-id] + +The UUID of one [leg](#call-leg), fixed from the moment the leg starts until it hangs up. In Calling SWML it is `call.call_id`. In the Relay namespace of the Server SDKs it is `call.id`. SWML status callbacks and AI webhooks send it as `call_id`. Connecting to a new leg gives that leg its own Call ID, which the first leg's webhooks report as `peer.call_id`. ### Segment ID [#segment-id] -A UUID identifying one [leg](#call-leg) of a call — or one message or fax — in the logs, written **SID**. A call with several legs produces several segments, and each leg keeps its SID for its whole lifecycle. In Calling SWML, the same identifier appears as the leg's `call_id`. +The UUID of a leg's log record, and the identifier to quote in a support ticket. A leg's first segment reuses its [Call ID](#call-id), so for an ordinary call the two are the same value. If SignalWire re-routes the leg to a new handler, such as a SIP REFER or a cXML transfer, a new segment begins on the same leg: the Segment ID changes and the Call ID does not. Messages and faxes have Segment IDs too. + +The Dashboard labels it **Segment ID** in every log's detail view, and the [Segment IDs page][segment-ids] shows where. The REST APIs return it as `id`, and Calling SWML exposes it as `call.segment_id`. The Compatibility API writes it **SID**, as in `CallSid`, and its Dashboard log pages use the same abbreviation. + +The identifiers at a glance: + +| Identifier | Identifies | Where you see it | +|---|---|---| +| [Call ID](#call-id) | One leg, for its whole life | `call_id` in SWML, status callbacks, and AI webhooks; `call.id` in the Relay namespace of the Server SDKs | +| [Segment ID](#segment-id) | One leg's log record; a new one after a re-route | Dashboard logs; `id` in REST responses; `segment_id` in SWML and status callbacks | +| `CallSid` | The leg's Segment ID, under the Compatibility API's name | Compatibility REST responses and every cXML request and status callback | +| `ParentCallSid` | The Segment ID of the leg that created this one | Compatibility status callbacks; `parent_id` in the REST voice logs | +| `AccountSid` | Your [Project ID](#project-id) | Compatibility API | +| Message ID | One message's log record | `id` in REST responses; `message_id` in Relay events; `MessageSid` in Compatibility webhooks; **Message Segment ID** in the Dashboard | +| `FaxSid` | One fax's log record | Compatibility API; **Fax Segment ID** in the Dashboard. `MediaSid` is the stored document, a different ID | +| `ai_session_id` | One AI session on a leg | AI webhooks | -The REST APIs return it as `id`, and it is the identifier to quote when filing a support ticket. The [Segment IDs page][segment-ids] shows where to find them in the Dashboard. +The `conversation_id` in AI webhooks is the value you set in `ai.params`, not a platform identifier. ## SWML @@ -172,7 +191,7 @@ Unqualified, "SWML" means [Calling SWML][swml-calling], the document type for vo #### Messaging SWML [#messaging-swml] -The [document type][swml-messaging] for inbound SMS and MMS. A document can run up to 100 method steps per inbound message, and execution stops at that ceiling. +The [document type][swml-messaging] for inbound SMS and MMS. A document can run up to 100 method steps and 10 `request` calls per inbound message, and execution stops at either ceiling. Messaging SWML is not Calling SWML with a smaller method set. It supports only plain variable substitution with `%{path.to.value}` — no JavaScript, no method calls, no operators. For dynamic behavior, use `switch` to branch and `request` to fetch computed values from your server. See the [expressions reference][expressions]. @@ -184,7 +203,7 @@ The SignalWire AI Gateway: a JSON protocol over HTTP by which an AI agent calls A named capability you hand to the agent — a name, a description, and a JSON Schema describing its parameters. Each call is one HTTP POST answered by one JSON reply, with nothing held open in between. See the [tool calling guide][tool-calling]. -A SWAIG function is not an ordinary webhook, in four ways. The model decides when to call it, reading your description, rather than an event triggering it. The reply's `response` field is written into the agent's conversational context rather than spoken verbatim. A function declared via `SWAIG.includes` adds a discovery step — a function signature request — that enumerates available functions when the agent loads; a function declared inline needs no such request, since its signature is already in the document. And a `data_map` variant runs entirely on SignalWire's side, with no server of yours involved at all. +A SWAIG function is not an ordinary webhook, in four ways. The model decides when to call it, reading your description, rather than an event triggering it. The reply's `response` field is written into the agent's conversational context rather than spoken verbatim. A function declared via `SWAIG.includes` adds a discovery step — a function signature request — that enumerates available functions when the agent loads; a function declared inline needs no such request, since its signature is already in the document. And a `data_map` variant runs on SignalWire's side, so it needs no webhook endpoint of yours, though it can still fetch from HTTP APIs you name. ### Webhook [#webhook] @@ -206,13 +225,13 @@ The namespace that builds AI-driven call flows declaratively. Your agent runs an #### Relay namespace [#relay] -SignalWire's real-time protocol for imperative call control — JSON-RPC 2.0 over a persistent WebSocket — and the SDK namespace that speaks it. Your code subscribes to contexts, reacts to events as they arrive, and issues commands: answer, play, collect digits, record, bridge, transfer. See the [Relay client guide][relay-client]. +SignalWire's real-time protocol for imperative call control — JSON-RPC 2.0 over a persistent WebSocket — and the SDK namespace that speaks it. Your code subscribes to topics, reacts to events as they arrive, and issues commands: answer, play, collect digits, record, bridge, transfer. See the [Relay client guide][relay-client]. Reach for Relay when you need to react to a call as it unfolds. Reach for [SWML](#swml-document) when you can describe the whole flow up front. -The persistent, authenticated WebSocket connection a `RelayClient` holds is its **Relay session**: over one session it subscribes to contexts, receives events, and carries every call and message it handles. +The persistent, authenticated WebSocket connection a `RelayClient` holds is its **Relay session**: over one session it subscribes to topics, receives events, and carries every call and message it handles. -You'll also see the all-caps spelling **RELAY** on older pages, along with the names **Realtime SDK** and **Relay Realtime SDK**. All three refer to this namespace; the capitalization carries no meaning. +**Realtime SDK** and **Relay Realtime SDK** are the names of the Node.js package `@signalwire/realtime-api`, the earlier Relay client for JavaScript. Relay in either name means this namespace. Relay is not a [Relay Application](#relay-application), which is the Dashboard Resource that routes a call to your Relay client. @@ -236,7 +255,7 @@ The Compatibility API is not the route to SignalWire AI. Use [SWML](#swml-docume Compatibility XML, the XML language for controlling calls, messages, and faxes through the Compatibility API. It is compatible with Twilio's TwiML, so existing TwiML documents work without modification. See the [cXML specification][cxml]. -**LaML** is the former name of cXML and of the Compatibility API. It is retired as a product name but still live as an identifier, so you will keep meeting it: in `/api/laml/` URL paths, in the `RestClient.LaML` SDK namespace, in the LAML Bins resource of the Compatibility API — not a Call Fabric [Resource](#resource) — and on Dashboard labels such as **cXML/LaML**. When you see LaML in a name or a URL, read cXML. +**LaML** is the former name of cXML and of the Compatibility API. It is retired as a product name but still live as an identifier, so you will keep meeting it: in `/api/laml/` URL paths, in the `RestClient.LaML` SDK namespace, in the LAML Bins resource of the Compatibility API — not a [Resource](#resource) — and on Dashboard labels such as **cXML/LaML**. When you see LaML in a name or a URL, read cXML. ### Call Flow Builder [#call-flow-builder] @@ -250,7 +269,7 @@ The no-code visual tool in the Dashboard for building voice applications as a tr |---|---| | [SWML][ai-method] | The `ai` method: runs a conversation on a live call, joining speech recognition, a model, and text-to-speech. | | [The platform][ai-overview] | SignalWire AI as a capability: prompts, contexts, state, and tools. | -| [The Dashboard][resources] | The AI Agent Resource type: configured in the Dashboard, reachable at an Address like any Resource. | +| [Resources][resources] | The AI Agent Resource type: reachable at an Address like any Resource. | | [Server SDKs][agent-base] | An `AgentBase` application: your Python or TypeScript program that generates SWML at request time. | | [Call Flow Builder][cfb-ai-node] | The AI Agent node: one block in a visual call flow. | diff --git a/fern/products/platform/pages/platform/core/rate-limits.mdx b/fern/products/platform/pages/platform/core/rate-limits.mdx index e90901986b..4bb469e207 100644 --- a/fern/products/platform/pages/platform/core/rate-limits.mdx +++ b/fern/products/platform/pages/platform/core/rate-limits.mdx @@ -105,6 +105,7 @@ Please be prepared to share detailed information about your use case. If approved, you **MUST** set up auto top up on your project to the total cost of the numbers monthly **before the limit will be raised**. This requirement prevents the suspension of services due to insufficient balance. Pricing for phone numbers can be found on the [SignalWire pricing page](https://signalwire.com/pricing/messaging). +See [Auto Top-Up](/docs/platform/auto-top-up) for how it is charged and what enabling it commits you to.
diff --git a/fern/products/platform/pages/platform/integrations/FreeSWITCH/installing-freeswitch-or-freeswitch-advantage/index.mdx b/fern/products/platform/pages/platform/integrations/FreeSWITCH/installing-freeswitch-or-freeswitch-advantage/index.mdx index 0ae8f38c60..1e0204f84a 100644 --- a/fern/products/platform/pages/platform/integrations/FreeSWITCH/installing-freeswitch-or-freeswitch-advantage/index.mdx +++ b/fern/products/platform/pages/platform/integrations/FreeSWITCH/installing-freeswitch-or-freeswitch-advantage/index.mdx @@ -25,8 +25,8 @@ Before we begin, here is some general FreeSWITCH terminology that may be importa ## Getting an Access Token -A SignalWire account is now required to download the pre-build FreeSWITCH binaries. First [create a SignalWire Space](/docs/platform/signing-up-for-a-space), then go to the `Personal Access Tokens` -section located on the left side of the Dashboard. From there, create a Personal Access Token. [Click here to learn more](https://freeswitch.org/confluence/display/FREESWITCH/Debian). +A SignalWire account is now required to download the pre-build FreeSWITCH binaries. First [create a SignalWire Space](/docs/platform/signing-up-for-a-space), then open the user menu in the +Dashboard's top-right corner, select **Personal Access Tokens**, and create a token. [Click here to learn more](https://freeswitch.org/confluence/display/FREESWITCH/Debian). diff --git a/fern/products/platform/pages/platform/phone-numbers/overview.mdx b/fern/products/platform/pages/platform/phone-numbers/overview.mdx index edf18a229d..6d6b3c1f64 100644 --- a/fern/products/platform/pages/platform/phone-numbers/overview.mdx +++ b/fern/products/platform/pages/platform/phone-numbers/overview.mdx @@ -68,7 +68,7 @@ The "⋯" menu has an Edit link to the same page to change the actions taken whe - [Webhooks](/docs/platform/webhooks) - [SWML Reference](/docs/swml/) -- [Making and Receiving Phone Calls](/docs/swml/guides/make-and-receive-calls) +- [Answer an inbound call](/docs/platform/voice/make-and-receive-calls) ## Verified diff --git a/fern/products/platform/pages/platform/setup/auto-top-up.mdx b/fern/products/platform/pages/platform/setup/auto-top-up.mdx new file mode 100644 index 0000000000..09c09618bf --- /dev/null +++ b/fern/products/platform/pages/platform/setup/auto-top-up.mdx @@ -0,0 +1,64 @@ +--- +title: Auto Top-Up +subtitle: Keep your balance funded automatically, and what enabling it commits you to. +description: How Auto Top-Up funds your SignalWire balance and when your card is charged. +slug: /auto-top-up +max-toc-depth: 3 +--- + +Adding a payment method to your Space turns on Auto Top-Up. +When your balance falls below a threshold you set, SignalWire charges the card you chose and adds the funds to your balance. +This keeps calls and messages running, and keeps recurring charges such as phone numbers paid. + + +Auto Top-Up is required for any account with active SignalWire resources. +You can change the amount, the threshold, and the card that funds it. + + +## When you are charged + +| Setting | Default | Limits | +| :-- | :-- | :-- | +| Threshold | `$5` | Minimum `$5`, maximum `$1,000,000` | +| Top-up amount | `$10` | Minimum `$10` | + +The charge is normally the top-up amount. +If topping up by that amount would still leave your balance at or below the threshold, SignalWire charges enough to clear the threshold and add the top-up amount on top. +The amount charged can therefore be larger than the amount you configured. + +With a threshold of `$50` and a top-up amount of `$10`, a balance that falls to `$5` is charged `$55`. + +Auto Top-Up charges at most once every six hours. +A Space that spends faster than that can reach a zero balance between charges and lose service until the next one, so set a top-up amount that covers six hours of your own traffic. + +Some features require Auto Top-Up to be active before you can use them. +Registering a campaign with [The Campaign Registry](/docs/platform/messaging/campaign-registry) is one of them, and returns the `auto_top_up_deactivated` error while Auto Top-Up is off. + +## Change your settings + +Open **Billing → Low Balance Settings** in the Dashboard to change the top-up amount, the threshold, and which card funds Auto Top-Up. + +## Remove the card that funds Auto Top-Up + +A card cannot be removed while it is your Auto Top-Up payment method. To remove it: + + + +### Add another card + +Add the replacement payment method to your Space. + +### Point Auto Top-Up at the new card + +In Low Balance Settings, select the new card as your Auto Top-Up payment method and save. + +### Remove the original card + +The original card can now be removed from the Payment Methods page. + + + +## If a charge fails + +If the charge is declined, or no valid card is on file to charge, SignalWire turns Auto Top-Up off and emails your Space administrators. +Adding a payment method or topping up your balance manually turns it back on. diff --git a/fern/products/platform/pages/platform/setup/trial-mode.mdx b/fern/products/platform/pages/platform/setup/trial-mode.mdx index eccdd36e1d..98cc881b7a 100644 --- a/fern/products/platform/pages/platform/setup/trial-mode.mdx +++ b/fern/products/platform/pages/platform/setup/trial-mode.mdx @@ -7,6 +7,11 @@ slug: trial-mode All new SignalWire accounts begin in Trial Mode, a restricted status to prevent abuse of services. To remove Trial Mode, simply add a credit card to your account and fund it with at least $5 of credit. + +Adding a payment method also turns on [Auto Top-Up](/docs/platform/auto-top-up), +which keeps your balance funded automatically and is required for any account with active SignalWire resources. + + - - - Manage your Spaces and Projects from the command line with the powerful and scriptable SignalWire Interactive Shell - - - - Quickly bootstrap a versatile development and testing environment with the WireStarter Docker container, pre-loaded with demo apps for immediate use - - - diff --git a/fern/products/platform/pages/tools/swsh/index.mdx b/fern/products/platform/pages/tools/swsh/index.mdx deleted file mode 100644 index 51f2d00ead..0000000000 --- a/fern/products/platform/pages/tools/swsh/index.mdx +++ /dev/null @@ -1,438 +0,0 @@ ---- -id: 6dab02c5-d2ed-4f97-a256-2f5ba078a91b - -title: Introduction to SWSH (SignalWire interactive shell) -sidebar-title: SWSH -description: A comprehensive introduction to installing and using the SignalWire Interactive Shell (SWSH). -image: "/assets/images/tools/swsh/swsh-warp.webp" -author: Shane Harrell, August Lindgren-Ruby -slug: swsh - ---- - -SWSH (**S**ignal**W**ire interactive **SH**ell) -is a command line utility written in Python to interface with SignalWire APIs. -SWSH is built to easily configure and manage SignalWire Spaces from a command-line environment. - -SWSH is extremely useful in scripting contexts, and allows the user to -perform repeated tasks quickly and efficiently by passing commands into SWSH. - - - -![The SWSH command prompt.](/assets/images/tools/swsh/swsh-warp.webp) - - - -### **Prerequisites** - -Before you begin, ensure you have the following prerequisites: - -- **A free SignalWire Account** -- **SignalWire API Credentials:** -Copy your Project ID and API Token from the -[API tab](https://my.signalwire.com?page=credentials) of your SignalWire Dashboard. -- **[Python 3 (or later)](https://wiki.python.org/moin/BeginnersGuide/Download):** -Python is required to install SWSH in a standalone manner. -- **[Docker Desktop](https://www.docker.com/products/docker-desktop/)** -is required for installing SWSH as a part of the SignalWire WireStarter container. -Docker is *not* required for installing the standalone Python package. - ---- - -## **Installation** - -SWSH can be installed in two ways. - -1. [**Standalone:**](#standalone) If you wish to use SWSH by itself, install its Python package. -2. [**With WireStarter:**](#wirestarter) SWSH can also be installed with our WireStarter Docker container, -which also sets up the SignalWire SDKs and sets up a convenient development and testing environment. - - -### Standalone Installation [#standalone] - - - - - -Install SWSH standalone if you're looking for a scriptable SignalWire CLI without the additional development and testing features provided by WireStarter. - -Python3 is required for the SWSH standalone installation. -We also recommend using the python3 `venv` module, but it isn't required. - -1. **Create a new Python virtual environment** - -This command uses the `venv` module to create a new Python virtual environment named "swsh". -Before running it, navigate to the directory where you wish to store the swsh virtual environment. - -```bash -python3 -m venv swsh -``` - -2. **Activate the SWSH virtual environment** - -This command activates the `swsh` virtual environment you just created. -This changes your shell's environment to use the Python and pip binaries within this environment, -isolating your Python setup from the system-wide Python installation. - -```bash -source swsh/bin/activate -``` - -3. **Install SWSH** - -This command installs the swsh package and its dependencies inside the activated virtual environment. - - -We're aware of an issue with Python 3.12 causing dependency issues. -Avoid these issues by specifying version 3.11 for pip. - - -```bash -pip3.11 install swsh -``` - -4. **Start the SWSH command prompt** - -Now that SWSH is installed, you can start a shell with it by running: - -``` -swsh -``` - - - - - - -Install SWSH on your Windows system using Command Prompt or PowerShell. -Python3 is required for the SWSH standalone installation. -We also recommend using the python3 `venv` module, but it isn't required. - -1. **Create a new Python virtual environment** - -This command uses the `venv` module to create a new Python virtual environment named "swsh". -Before running it, navigate to the directory where you wish to store the swsh virtual environment. - -```cmd -python3 -m venv swsh -``` - -2. **Activate the SWSH virtual environment** - -Activation of the virtual environment requires different commands in Command Prompt and PowerShell. - - - - - -```cmd -swsh\Scripts\activate -``` - - - - - -```powershell -swsh\Scripts\Activate.ps1 -``` - - - - - -3. **Install SWSH** - -This command installs the swsh package and its dependencies inside the activated virtual environment. - -```cmd -pip install swsh -``` - -4. **Start the SWSH command prompt** - -Now that SWSH is installed, you can start a shell with it by running: - -``` -swsh -``` - -Follow the prompts on screen to enter your SignalWire Space, Project ID, and API token. -Your SignalWire Space is the subdomain that prefixes `signalwire.com`. -If your Dashboard is accessed at `https://spacename.signalwire.com/dashboard`, -you should enter `spacename` when prompted for your Space. - - - - - ---- - -### WireStarter (Docker Image) Installation [#wirestarter] - -WireStarter is a Docker container which sets up the SignalWire SDKs and builds a development and testing environment for new developers. -Install SWSH with WireStarter if you want to take advantage of WireStarter's features. - -The instructions for installing WireStarter using Docker are universal and will work on MacOS, Linux, and Windows. - -1. **Start Docker Desktop** - -Docker must be running at the start of the process. - -2. **Download and install WireStarter** - -WireStarter has been updated recently. -If you've used WireStarter before, be sure to delete the previous version and reinstall the latest version of the container. - -```shell -docker run --name wirestarter briankwest/wirestarter:latest -``` - -3. **Start SWSH** - -This command starts a terminal UI which will prompt you for relevant IDs and tokens. -It will walk you through configuring the development and testing environment. -It then automatically enters SWSH. - -Follow the prompts on screen to enter your SignalWire Space, Project ID, and API token. -Your SignalWire Space is the subdomain that prefixes `signalwire.com`. -If your Dashboard is accessed at `https://spacename.signalwire.com/dashboard`, -you should enter `spacename` when prompted for your Space. -Copy the Project ID and REST API token from the -[API pane](https://my.signalwire.com?page=credentials) of your SignalWire Dashboard. - - -If you don't plan to set up a WireStarter example application, you can safely ignore both ngrok prompts by leaving them blank and hitting **Enter** or **Return**. - - -```shell -docker exec -ti wirestarter bash -``` - -Learn more about WireStarter by visiting its [repository on GitHub](https://github.com/signalwire/WireStarter). - ---- - -## **Running SWSH** - -Now that SWSH is installed, you can run it at any time by entering this command: - -```bash -swsh -``` - -The Project ID, API Token, and API Key must be correctly configured in order to use SWSH commands. - -### Startup Variables - -The following variables can be set to streamline startup. -They are also required for running in Non-Interactive mode. -If they are not set, SWSH will ask for them at startup. - -**Linux / MacOS:** - -```bash -export PROJECT_ID= -export SIGNALWIRE_SPACE= -export REST_API_TOKEN= -``` - -**Windows:** - -```bash -setx PROJECT_ID= -setx SIGNALWIRE_SPACE= -setx REST_API_TOKEN= -``` - ---- - -## **Commands** - -This section defines all SWSH commands. Commands can be run interactively or non-interactively. - -#### Interactive Commands - -Interactive commands are done within the SWSH shell itself. -For example: - -1. Type `swsh` to enter the shell -2. Enter the following command: `phone_number list` - -#### Scriptable (Non-Interactive) Commands - -This type of command can be passed into SWSH, allowing for the output from SWSH to be passed back to the main shell. -This type of SWSH command is ideal for scripting. -[Startup variables](#startup-variables) must be set in order to enable scriptable commands. - -Scriptable commands use the same syntax as Interactive commands, but condensed into a single line. -For example: - -```bash -swsh phone_number list -``` - ---- - -### Space - -Manage your SignalWire Space using the following SWSH commands: - -| Command | Description | -|:-------------|:-------------------------------------| -| `space cd` | Change to the specified Space | -| `space show` | Show details about the current Space | - - -### Project - -Manage the Project (and any subprojects) -within a SignalWire Space using the following SWSH commands: - -| Command | Description | -|:-----------------|:------------------------------------------------------| -| `project list` | Show a list of all projects in your SignalWire Space. | -| `project create` | Create a new Project. | -| `project update` | Update the Project details. | -| `project delete` | Delete a Project. | - -### Domain Application - -[Domain Applications](/docs/apis/rest/domain-applications/create-domain-application) -allow you to send SIP traffic to a custom domain and run specified logic. -Manage Domain Applications within a SignalWire Project using the following commands: - -| Command | Description | -|:----------------------------|:---------------------------------| -| `domain_application list` | List domain applications. | -| `domain_application create` | Create a new domain application. | -| `domain application update` | Update a domain application. | -| `domain application delete` | Delete a domain application. | - -### Number Group - -[Number Groups](/docs/apis/rest/number-groups/create-number-group) -are useful for configuring a set (or "group") of numbers as a single entity. -Manage Number Groups within a SignalWire Project using the following commands: - -| Command | Description | -|:----------------------|:------------------------------------------------| -| `number_group list` | List existing Number Groups in your Space. | -| `number_group create` | Create a new Number Group. | -| `number_group update` | Update an existing Number Group. | -| `number_group delete` | Delete a Number Group. | - - -### cXML Application - -Manage [cXML Applications](/docs/compatibility-api/rest/applications/create-application) -within a SignalWire Project with these commands: - -{/* Shane will change to cxml_* soon */} - -| Command | Description | -|:------------------|:-----------------------------| -| `laml_bin list` | List existing LaML bins. | -| `laml_bin create` | Create a new LaML bin. | -| `laml_bin update` | Update an existing LaML bin. | -| `laml_bin delete` | Delete a LaML bin. | - - -### Phone Number - -Manage the SignalWire [Phone Numbers](/docs/apis/rest/phone-numbers/purchase-phone-number) -within a SignalWire Project with these commands: - -| Command | Description | -|:----------------------|:-----------------------------------------------------| -| `phone_number list` | List the phone numbers associated with your Project. | -| `phone_number buy` | Buy a new phone number. | -| `phone_number update` | Update an existing phone number. | -| `phone_number delete` | Delete one of our phone numbers. | -| `phone_number lookup` | Look up and filter phone numbers. | - - -### SIP Endpoint - -Manage [SIP Endpoints](/docs/apis/rest/sip-credentials/list-sip-credentials) -within a SignalWire Project with these commands: - -| Command | Description | -|:----------------------|:---------------------------------| -| `sip_endpoint list` | List existing SIP Endpoints. | -| `sip_endpoint create` | Create a new SIP Endpoint. | -| `sip_endpoint update` | Update a SIP Endpoint. | -| `sip_endpoint delete` | Delete an existing SIP Endpoint. | - - -### SIP Profile - -Manage SIP Profiles within a SignalWire Project with these commands: - -| Command | Description | -|:---------------------|:---------------------| -| `sip_profile list` | List SIP Profiles. | -| `sip_profile update` | Update SIP Profiles. | - - -### Make a Call - -Initiate a phone call between two parties using a SignalWire Project. - - - -The Sending Phone Number must belong to the project. - - - -```bash -send_call --from-num --to-num --url -``` - - -### Request Call Records - -Retrive Call Records on a SignalWire Project - -| Command | Description | -|:------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `get_call` | Retrieves a detailed list of recent calls. | -| `get_call --id ` | Retrieves call information.
Replace `` with the [SID (SignalWire ID)](/docs/platform/what-is-a-sid) of the desired call. | -| `get_call --all-active` | Retrieves call information for all active calls. | - - -### Send a Text - -Transmit a text message to a destination using a SignalWire Project. - - - -The Sending Phone Number must belong to the project. - - - -```bash -send_text --from-num --to-num --text-body "" -``` - - -### Clear - -Clears the screen. - -`clear` - - -### Exit - -Exit the swsh subshell. - -`exit` - ---- - - -### Have a question or bug to report? - -Help us improve SWSH for your use case by -[reporting an Issue on the SWSH GitHub Repository](https://github.com/signalwire/swsh/issues). diff --git a/fern/products/platform/pages/tools/wirestarter/index.mdx b/fern/products/platform/pages/tools/wirestarter/index.mdx deleted file mode 100644 index 9ff05fd34e..0000000000 --- a/fern/products/platform/pages/tools/wirestarter/index.mdx +++ /dev/null @@ -1,231 +0,0 @@ ---- -id: be660e26-71af-4a30-a221-4319284b921d -title: Introduction to WireStarter -sidebar-title: WireStarter -slug: wirestarter -description: Get started with WireStarter, a versatile development and testing environment with pre-loaded demo applications. ---- - -WireStarter is a Docker container which sets up the SignalWire SDKs and builds a development and testing environment for new developers. - -WireStarter includes SWSH (the SignalWire interactive Shell) by default. -SWSH is a scriptable utility built to easily configure and manage SignalWire Spaces from a command-line environment. -{/* Learn more by reading our [introduction to SWSH](/docs/tools/swsh/). */} - -## **Prerequisites** - -Before you begin, ensure you have the following prerequisites: - -- **A free [SignalWire Account](https://signalwire.com/signup)** -- **SignalWire API Credentials:** -Copy your Project ID and API Token from the -[API tab](https://my.signalwire.com?page=credentials) of your SignalWire Dashboard. -- **[Docker Desktop](https://www.docker.com/products/docker-desktop/)** - -If you intend to set up an example application, you'll also need to -[install ngrok](https://ngrok.com/docs/getting-started/#step-1-install) -and create a free [ngrok account](https://dashboard.ngrok.com/signup). - ---- - -## **Installation** - -The instructions for installing WireStarter using Docker are universal and will work on MacOS, Linux, and Windows. - -The script we run in step 3 will ask for your -SignalWire Space ID, -SignalWire Project ID, -SignalWire Project Token, -ngrok Token, and -ngrok Args (optional - mostly for custom domains), -so make sure you have that information handy by opening the -SignalWire ['tokens' page](https://my.signalwire.com?page=credentials) -and the ngrok ['Your Authtoken' page](https://dashboard.ngrok.com/get-started/your-authtoken). - -Repeat these instructions anytime you need to start WireStarter again. - - - -### Start Docker Desktop - -Docker must be running at the start of the process. - -### Download, install, and run WireStarter - -WireStarter is frequently updated. -If you've used WireStarter before, be sure to delete the previous version -(using the Docker Desktop UI or the command line) -and reinstall the latest version of the container. - -```shell -docker run -it -d --rm --name wirestarter briankwest/wirestarter:latest -``` - -This Docker command downloads and installs WireStarter (if it isn't already installed). -It then runs the container in the background and automatically removes it on exit. - -### Start SWSH - -This command starts a terminal UI which will prompt you for relevant IDs and tokens. -It will walk you through configuring the development and testing environment so you can quickly deploy and test our -[example applications](https://github.com/signalwire/digital_employees). -It then automatically enters SWSH (SignalWire Shell), the official SignalWire CLI. - -Follow the prompts on screen to enter your SignalWire Space, Project ID, and API token. -Your SignalWire Space is the subdomain that prefixes `.signalwire.com`. -In other words, if your Dashboard is accessed at `https://spacename.signalwire.com/dashboard`, -you should enter `spacename` when prompted for your Space. -Copy the Project ID and REST API token from the -[API pane](https://my.signalwire.com?page=credentials) of your SignalWire Dashboard. - -```shell -docker exec -ti wirestarter bash -``` - - - - - -![The WireStarter interface. The user is prompted to enter their SignalWire Space domain.](/assets/images/tools/wirestarter/wirestarter-space.webp) - - - - - -When prompted, select your preferred editor: nano, vim, or emacs. -We recommend nano for beginners. - -Copy the SignalWire Space ID, Project ID, and Project token from [the API pane](https://my.signalwire.com?page=credentials) of your SignalWire Dashboard. -Copy the ngrok Token from the [Your Authtoken](https://dashboard.ngrok.com/get-started/your-authtoken) ngrok page. -ngrok Args are optional and only needed if you want to use a custom ngrok domain name. If not, leave the text field blank and proceed. - - -If you don't plan to set up a WireStarter example application, you can safely ignore both ngrok prompts by leaving them blank and hitting **Enter** or **Return**. - - -Learn more about WireStarter by visiting its [repository on GitHub](https://github.com/signalwire/WireStarter). - -### Optional: Buy and set up a phone number - -After entering the SignalWire and ngrok information in the previous step, you will enter the [SWSH CLI](/docs/platform/swsh). -If you already have a number set up in your Space that you want to use, you can skip this step. - - -Phone numbers purchased in the Dashboard UI must be named before being assigned to these demos. -Any name will work — just edit and save the populated number as its own name. Numbers purchased in SWSH are not affected by this limitation. - - - - - - -![The SWSH terminal.](/assets/images/tools/swsh/swsh.webp) - - - - - -Purchase and configure a phone number using the **`phone_number`** command. - -Enter `help` or `help -v` to view more options for SWSH. - -You can also purchase a phone number in the Web UI in your [SignalWire Space](https://my.signalwire.com?page=phone_numbers). - - - - - -![Purchased phone numbers](/assets/images/dashboard/phone-numbers/purchased-phone-numbers.webp) - - - - - - - -In the Dashboard, open **Phone Numbers** > **Purchased** to search existing numbers or select **+ New** to purchase one. - - - -### Set Startup Variables - -Set the following variables from the same bash prompt in order to streamline startup. -These variables are required for running SWSH in Non-Interactive mode. -If they are not set, SWSH will ask for them at startup. - - - -```bash title="Linux / MacOS" -export PROJECT_ID= -export SIGNALWIRE_SPACE= -export REST_API_TOKEN= -``` - - -```bash title="Windows" -setx PROJECT_ID= -setx SIGNALWIRE_SPACE= -setx REST_API_TOKEN= -``` - - - -Learn more by reading our [Introduction to SWSH](/docs/platform/swsh). - -### Build an Example Application - -Follow these instructions to build and test an [example application](https://github.com/signalwire/digital_employees/tree/main)! - -**Run `exit` to Exit SWSH** - -Once WireStarter is successfully configured, and you've purchased any numbers with SWSH, -run `exit` once to exit SWSH. - - - - - - **Run `setup.sh`** - - From the same bash prompt, run `setup.sh` and select a demo. - Follow the instructions to assign a phone number and finish setup. - - If you encounter any problems using WireStarter, please let us know by - [reporting an issue on its GitHub repo](https://github.com/signalwire/WireStarter/issues). - - You can also get live support in the [Community Discord](https://discord.com/invite/F2WNYTNjuF), or by emailing devex@signalwire.com. - - - - - - - - - -![The setup script.](/assets/images/tools/wirestarter/swsh-to-setup.webp) - - - - - - - -A successful `setup.sh` run prints the public ngrok tunnel and its local `/workdir/public` mapping, confirms that `/workdir` is persistent, and then opens the SWSH prompt. - - - - - - - - - ---- - -## **Help** - -Have a question or bug to report? - -Help us improve WireStarter for your use case by -[reporting an Issue on the GitHub Repository](https://github.com/signalwire/WireStarter). diff --git a/fern/products/platform/platform.yml b/fern/products/platform/platform.yml index 85634a775b..6f7f06ec96 100644 --- a/fern/products/platform/platform.yml +++ b/fern/products/platform/platform.yml @@ -16,9 +16,6 @@ tabs: messaging: display-name: Messaging icon: fa-regular fa-message-dots - tools: - display-name: Tools - icon: fa-regular fa-wrench navigation: - tab: platform @@ -32,12 +29,30 @@ navigation: - folder: ./pages/platform/setup title: Setup title-source: frontmatter - - folder: ./pages/platform/core - title: Core - title-source: frontmatter - - folder: ./pages/platform/call-fabric - title: Architecture - title-source: frontmatter + - section: Core + contents: + - page: Projects + path: ./pages/platform/core/projects.mdx + - page: Resources + path: ./pages/platform/call-fabric/resources.mdx + - page: Addresses + path: ./pages/platform/call-fabric/addresses.mdx + - page: Subscribers + path: ./pages/platform/call-fabric/subscribers.mdx + - page: Webhooks + path: ./pages/platform/core/webhooks/index.mdx + - page: Allow SignalWire IPs through your firewall + path: ./pages/platform/core/allowing-signalwire-ips-through-your-firewall.mdx + - page: Default limits + path: ./pages/platform/core/rate-limits.mdx + - page: Glossary + path: ./pages/platform/core/glossary.mdx + - page: International support + path: ./pages/platform/core/how-to-enable-international-outbound-dialing-sms.mdx + - page: Media URL protection + path: ./pages/platform/core/media-protection.mdx + - page: Segment IDs + path: ./pages/platform/core/segment-ids.mdx - folder: ./pages/platform/phone-numbers title: Phone numbers title-source: frontmatter @@ -87,8 +102,3 @@ navigation: - folder: ./pages/messaging/chat title-source: frontmatter title: Chat - - - tab: tools - layout: - - folder: ./pages/tools - title-source: frontmatter diff --git a/fern/products/server-sdks/pages/guides/build-ai-agents/call-recording.mdx b/fern/products/server-sdks/pages/guides/build-ai-agents/call-recording.mdx deleted file mode 100644 index a2fa843ead..0000000000 --- a/fern/products/server-sdks/pages/guides/build-ai-agents/call-recording.mdx +++ /dev/null @@ -1,507 +0,0 @@ ---- -title: "Call Recording" -description: Record calls using record_call() and stop_record_call() methods on FunctionResult with support for stereo/mono, multiple formats, and webhook notifications. -slug: guides/call-recording -max-toc-depth: 3 ---- - -Call recording is essential for many business applications: quality assurance, compliance, training, dispute resolution, and analytics. The SDK provides flexible recording options that let you capture exactly what you need while respecting privacy and compliance requirements. - -Recording happens server-side on SignalWire's infrastructure, so there's no additional load on your application server. Recordings are stored securely and can be retrieved via webhooks or the SignalWire API. - -### When to Record - -Common recording use cases: - -- **Quality assurance**: Review agent performance and customer interactions -- **Compliance**: Meet regulatory requirements for financial services, healthcare, etc. -- **Training**: Build libraries of good (and problematic) call examples -- **Dispute resolution**: Have an authoritative record of what was said -- **Analytics**: Feed recordings into speech analytics platforms -- **Transcription**: Generate text transcripts for search and analysis - -### Recording Overview - -**`record_call()`** - -- Starts background recording -- Continues while conversation proceeds -- Supports stereo (separate channels) or mono -- Output formats: WAV, MP3, or MP4 -- Direction: speak only, listen only, or both - -**`stop_record_call()`** - -- Stops an active recording -- Uses control_id to target specific recording -- Recording is automatically stopped on call end - -Recording methods across all languages: - -| Language | Start Recording | Stop Recording | -|----------|----------------|----------------| -| Python | `result.record_call(control_id="main", stereo=True, format="wav")` | `result.stop_record_call(control_id="main")` | -| TypeScript | `result.recordCall({ controlId: 'main', stereo: true, format: 'wav' })` | `result.stopRecordCall('main')` | -{/* - -| Go | `result.RecordCall("main", true, "wav")` | `result.StopRecordCall("main")` | -| Ruby | `result.record_call(control_id: 'main', stereo: true, format: 'wav')` | `result.stop_record_call(control_id: 'main')` | -| Java | `result.recordCall("main", true, "wav")` | `result.stopRecordCall("main")` | -| Perl | `$result->record_call(control_id => 'main', stereo => 1, format => 'wav')` | `$result->stop_record_call(control_id => 'main')` | -| C++ | `result.record_call("main", true, "wav")` | `result.stop_record_call("main")` | -| PHP | `$agent->recordCall(format: 'wav', stereo: true)` | `$result->stopRecordCall(controlId: 'main')` | - -*/} - -### Basic Recording - -```python -from signalwire import AgentBase -from signalwire.core.function_result import FunctionResult - -class RecordingAgent(AgentBase): - def __init__(self): - super().__init__(name="recording-agent") - self.add_language("English", "en-US", "rime.spore") - - self.prompt_add_section( - "Role", - "You are a customer service agent. " - "Start recording when the customer agrees." - ) - - self.define_tool( - name="start_recording", - description="Start recording the call with customer consent", - parameters={"type": "object", "properties": {}}, - handler=self.start_recording - ) - - def start_recording(self, args, raw_data): - return ( - FunctionResult("Recording has started.") - .record_call( - control_id="main_recording", - stereo=True, - format="wav" - ) - ) - -if __name__ == "__main__": - agent = RecordingAgent() - agent.run() -``` - -### Recording Parameters - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `control_id` | str | None | Identifier to stop specific recording | -| `stereo` | bool | False | True for separate L/R channels | -| `format` | str | `"wav"` | Output format: "wav", "mp3", or "mp4" (TypeScript: "wav" or "mp3" only) | -| `direction` | str | `"both"` | "speak", "listen", or "both" | -| `terminators` | str | None | DTMF digits that stop recording | -| `beep` | bool | False | Play beep before recording | -| `input_sensitivity` | float | `44.0` | Audio sensitivity threshold | -| `initial_timeout` | float | None | Seconds to wait for speech (voicemail use) | -| `end_silence_timeout` | float | None | Silence duration to auto-stop (voicemail use) | -| `max_length` | float | None | Maximum recording seconds | -| `status_url` | str | None | Webhook for recording events | - - -**Timeout Parameters**: For continuous call recording, do not set `initial_timeout` or `end_silence_timeout`. These parameters are designed for voicemail-style recordings where you want automatic termination based on speech patterns. - -- **Continuous recording**: Omit timeout parameters; use `stop_record_call()` or call termination to end -- **Voicemail recording**: Set appropriate values (e.g., `initial_timeout=10.0`, `end_silence_timeout=3.0`) - - -### Stereo vs Mono Recording - -The `stereo` parameter determines how audio channels are recorded. This choice significantly affects how you can use the recording afterward. - -#### Stereo Recording (stereo=True) - -Records caller and agent on separate channels (left and right): - -```python -def start_stereo_recording(self, args, raw_data): - return ( - FunctionResult("Recording in stereo mode") - .record_call( - control_id="stereo_rec", - stereo=True, # Caller on left, agent on right - format="wav" - ) - ) -``` - -**When to use stereo:** - -- **Speech-to-text transcription**: Most transcription services work better with separated audio, correctly attributing speech to each party -- **Speaker diarization**: Analysis tools can easily identify who said what -- **Quality review**: Isolate agent or caller audio for focused review -- **Training data**: Clean separation for building speech models -- **Noise analysis**: Identify which side has audio quality issues - -**Stereo considerations:** - -- Larger file sizes (roughly 2x mono) -- Requires stereo-capable playback for proper review -- Some basic media players may only play one channel by default - -#### Mono Recording (stereo=False) - -Records both parties mixed into a single channel: - -```python -def start_mono_recording(self, args, raw_data): - return ( - FunctionResult("Recording in mono mode") - .record_call( - control_id="mono_rec", - stereo=False, # Mixed audio (default) - format="mp3" - ) - ) -``` - -**When to use mono:** - -- **Simple archival**: Just need a record of what was said -- **Storage-constrained environments**: Smaller file sizes -- **Human playback**: Easier to listen to on any device -- **Basic compliance**: Where separate channels aren't required - -### Direction Options - -```python -## Record only what the AI/agent speaks -def record_agent_only(self, args, raw_data): - return ( - FunctionResult("Recording agent audio") - .record_call(direction="speak") - ) - -## Record only what the caller says -def record_caller_only(self, args, raw_data): - return ( - FunctionResult("Recording caller audio") - .record_call(direction="listen") - ) - -## Record both sides (default) -def record_both(self, args, raw_data): - return ( - FunctionResult("Recording full conversation") - .record_call(direction="both") - ) -``` - -### Recording with Webhook - -Receive notifications when recording completes: - -```python -def start_recording_with_callback(self, args, raw_data): - return ( - FunctionResult("Recording started") - .record_call( - control_id="webhook_rec", - status_url="https://example.com/recording-complete" - ) - ) -``` - -The webhook receives recording metadata including the URL to download the file. - -### Auto-Stop Recording - -Configure automatic stop conditions: - -```python -def start_auto_stop_recording(self, args, raw_data): - return ( - FunctionResult("Recording with auto-stop") - .record_call( - max_length=300.0, # Stop after 5 minutes - end_silence_timeout=5.0, # Stop after 5 seconds of silence - terminators="#" # Stop if user presses # - ) - ) -``` - -### Stop Recording - -Stop a recording by control_id: - -```python -from signalwire import AgentBase -from signalwire.core.function_result import FunctionResult - -class ControlledRecordingAgent(AgentBase): - def __init__(self): - super().__init__(name="controlled-recording-agent") - self.add_language("English", "en-US", "rime.spore") - - self.prompt_add_section( - "Role", - "You handle call recordings. You can start and stop recording." - ) - - self._register_functions() - - def _register_functions(self): - self.define_tool( - name="start_recording", - description="Start recording the call", - parameters={"type": "object", "properties": {}}, - handler=self.start_recording - ) - - self.define_tool( - name="stop_recording", - description="Stop recording the call", - parameters={"type": "object", "properties": {}}, - handler=self.stop_recording - ) - - def start_recording(self, args, raw_data): - return ( - FunctionResult("Recording has started") - .record_call(control_id="main") - ) - - def stop_recording(self, args, raw_data): - return ( - FunctionResult("Recording has stopped") - .stop_record_call(control_id="main") - ) - -if __name__ == "__main__": - agent = ControlledRecordingAgent() - agent.run() -``` - -### Recording with Beep - -Alert the caller that recording is starting: - -```python -def start_recording_with_beep(self, args, raw_data): - return ( - FunctionResult("This call will be recorded") - .record_call( - beep=True, # Plays a beep before recording starts - format="mp3" - ) - ) -``` - -### Complete Example - -```python -#!/usr/bin/env python3 -## compliance_agent.py - Agent with recording compliance features -from signalwire import AgentBase -from signalwire.core.function_result import FunctionResult - -class ComplianceAgent(AgentBase): - """Agent with full recording compliance features""" - - def __init__(self): - super().__init__(name="compliance-agent") - self.add_language("English", "en-US", "rime.spore") - - self.prompt_add_section( - "Role", - "You are a customer service agent. Before recording, you must " - "inform the customer and get their verbal consent." - ) - - self.prompt_add_section( - "Recording Policy", - """ - 1. Always inform customer: "This call may be recorded for quality purposes." - 2. Ask for consent: "Do you agree to the recording?" - 3. Only start recording after explicit "yes" or agreement. - 4. If customer declines, proceed without recording. - """ - ) - - self._register_functions() - - def _register_functions(self): - self.define_tool( - name="start_compliant_recording", - description="Start recording after customer consent is obtained", - parameters={"type": "object", "properties": {}}, - handler=self.start_compliant_recording - ) - - self.define_tool( - name="pause_recording", - description="Pause recording for sensitive information", - parameters={"type": "object", "properties": {}}, - handler=self.pause_recording - ) - - self.define_tool( - name="resume_recording", - description="Resume recording after sensitive section", - parameters={"type": "object", "properties": {}}, - handler=self.resume_recording - ) - - def start_compliant_recording(self, args, raw_data): - call_id = raw_data.get("call_id", "unknown") - - return ( - FunctionResult("Recording has begun. Thank you for your consent.") - .record_call( - control_id=f"compliance_{call_id}", - stereo=True, - format="wav", - beep=True, - status_url="https://example.com/recordings/status" - ) - .update_global_data({"recording_active": True}) - ) - - def pause_recording(self, args, raw_data): - call_id = raw_data.get("call_id", "unknown") - - return ( - FunctionResult( - "Recording paused. You may now provide sensitive information." - ) - .stop_record_call(control_id=f"compliance_{call_id}") - .update_global_data({"recording_active": False}) - ) - - def resume_recording(self, args, raw_data): - call_id = raw_data.get("call_id", "unknown") - - return ( - FunctionResult("Recording resumed.") - .record_call( - control_id=f"compliance_{call_id}", - stereo=True, - format="wav" - ) - .update_global_data({"recording_active": True}) - ) - -if __name__ == "__main__": - agent = ComplianceAgent() - agent.run() -``` - -### Format Comparison - -The `format` parameter determines the output file type. Each format has tradeoffs: - -| Format | Best For | File Size | Quality | Notes | -|--------|----------|-----------|---------|-------| -| `wav` | Transcription, archival | Large | Lossless | Uncompressed, no quality loss | -| `mp3` | General storage | Small | Lossy | Good compression, widely supported | -| `mp4` | Video calls | Medium | Lossy | Required for video recording | - -**Choosing a format:** - -- **wav**: Use when quality matters more than storage. Best for speech analytics, transcription services, and long-term archival where you might need to reprocess later. Files can be 10x larger than MP3. - -- **mp3**: Use for general-purpose recording where storage costs matter. Quality is sufficient for human review and most transcription services. Good balance of size and quality. - -- **mp4**: Required if you're recording video calls. Contains both audio and video tracks. - -### Storage and Retention Considerations - -Recordings consume storage and may have regulatory requirements. Plan your retention strategy: - -**Storage costs**: A 10-minute mono MP3 recording is roughly 2-3 MB. At scale, this adds up. A business handling 1,000 calls/day generates 60-90 GB/month of recordings. - -**Retention policies**: - -- **Financial services**: Often required to retain for 5-7 years -- **Healthcare (HIPAA)**: Typically 6 years -- **General business**: 1-2 years is common -- **Training/QA**: Keep only what's valuable - -**Automated cleanup**: Build processes to delete old recordings according to your policy. Don't assume someone will do it manually. - -**Access controls**: Recordings may contain sensitive information. Restrict access to those who need it for legitimate business purposes. - -### Compliance and Legal Considerations - -Recording laws vary by jurisdiction. Understanding your obligations is critical. - -#### Consent Requirements - -**One-party consent** (e.g., most US states): Only one party needs to know about the recording. The agent itself can be that party, but best practice is still to inform callers. - -**Two-party/all-party consent** (e.g., California, many European countries): All parties must consent before recording. You must: -1. Inform the caller that recording may occur -2. Obtain explicit consent before starting -3. Provide an option to decline -4. Proceed without recording if declined - -**Best practice**: Regardless of jurisdiction, always inform callers. It builds trust and protects you legally. - -#### Compliance Implementation - -```python -self.prompt_add_section( - "Recording Disclosure", - """ - At the start of every call: - 1. Say: "This call may be recorded for quality and training purposes." - 2. Ask: "Do you consent to recording?" - 3. If yes: Call start_recording function - 4. If no: Say "No problem, I'll proceed without recording" and continue - 5. NEVER start recording without explicit consent - """ -) -``` - -#### Sensitive Information - -Some information should never be recorded, or recordings should be paused: -- Credit card numbers (PCI compliance) -- Social Security numbers -- Medical information in non-healthcare contexts -- Passwords or PINs - -Use the pause/resume pattern shown in the complete example to handle these situations. - -### Recording Best Practices - -#### Compliance - -- Always inform callers before recording -- Obtain consent where legally required -- Provide option to decline recording -- Document consent in call logs -- Pause recording for sensitive information (credit cards, SSN) -- Know your jurisdiction's consent requirements - -#### Technical - -- Use control_id for multiple recordings or pause/resume -- Use stereo=True for transcription accuracy -- Use status_url to track recording completion -- Set max_length to prevent oversized files -- Handle webhook failures gracefully - -#### Storage - -- Use WAV for quality, MP3 for size, MP4 for video -- Implement retention policies aligned with regulations -- Secure storage with encryption at rest -- Restrict access to recordings -- Build automated cleanup processes - -#### Quality - -- Test recording quality in your deployment environment -- Verify both channels are capturing clearly in stereo mode -- Monitor for failed recordings via status webhooks diff --git a/fern/products/server-sdks/pages/guides/build-ai-agents/overview.mdx b/fern/products/server-sdks/pages/guides/build-ai-agents/overview.mdx index ee4b5d6e7c..3975a375ed 100644 --- a/fern/products/server-sdks/pages/guides/build-ai-agents/overview.mdx +++ b/fern/products/server-sdks/pages/guides/build-ai-agents/overview.mdx @@ -7,7 +7,7 @@ max-toc-depth: 3 [contexts-and-workflows]: /docs/server-sdks/guides/contexts-workflows [state-management]: /docs/server-sdks/guides/state-management -[call-recording]: /docs/server-sdks/guides/call-recording +[call-recording]: /docs/platform/voice/record-calls [call-transfer]: /docs/server-sdks/guides/call-transfer [multi-agent-servers]: /docs/server-sdks/guides/multi-agent [search-and-knowledge]: /docs/server-sdks/guides/search-knowledge @@ -29,7 +29,7 @@ Build sophisticated voice AI agents using the SignalWire SDK. This section cover Manage data throughout call sessions using global_data, metadata, and post_prompt. - + Record calls with stereo/mono options, multiple formats, and webhook notifications. diff --git a/fern/products/server-sdks/pages/guides/build-ai-agents/voice-language.mdx b/fern/products/server-sdks/pages/guides/build-ai-agents/voice-language.mdx index 5f64ff3ae7..eb1324ca51 100644 --- a/fern/products/server-sdks/pages/guides/build-ai-agents/voice-language.mdx +++ b/fern/products/server-sdks/pages/guides/build-ai-agents/voice-language.mdx @@ -93,12 +93,10 @@ self.add_language("English", "en-US", "josh", engine="elevenlabs") | Groq | `groq-tts` | `groq-tts.autumn` | [Voice IDs](/docs/platform/voice/tts/groq-tts#usage) | | Inworld | `inworld` | `inworld.Lauren:inworld-tts-1.5-mini` | [Voice IDs](/docs/platform/voice/tts/inworld#voices) | | Microsoft Azure | `azure` | `azure.en-US-AvaNeural` | [Voice IDs](/docs/platform/voice/tts/azure#usage) | -| MiniMax | `minimax` | `minimax.English_CalmWoman:speech-2.6-turbo` | [Voice IDs](/docs/platform/voice/tts/minimax#voices) | | Mistral | `mistral` | `mistral.` | [Voice IDs](/docs/platform/voice/tts/mistral#usage) | | OpenAI | `openai` | `openai.alloy` | [Voice IDs](/docs/platform/voice/tts/openai#usage) | | Rime | `rime` | `rime.luna:coda` | [Voice IDs](/docs/platform/voice/tts/rime#voices) | | Smallest.ai | `smallest` | `smallest.sophia:lightning_v3.1` | [Voice IDs](/docs/platform/voice/tts/smallest#usage) | -| Speechify | `speechify` | `speechify.alicia:simba-3.0` | [Voice IDs](/docs/platform/voice/tts/speechify#usage) | ### Filler Phrases diff --git a/fern/products/server-sdks/pages/reference/python/core/overview.mdx b/fern/products/server-sdks/pages/reference/python/core/overview.mdx index 95e3b71bac..1c86e75218 100644 --- a/fern/products/server-sdks/pages/reference/python/core/overview.mdx +++ b/fern/products/server-sdks/pages/reference/python/core/overview.mdx @@ -3,7 +3,7 @@ title: "SignalWire Python Server SDK" sidebar-title: Overview subtitle: "Build AI agents, control calls in real time, and manage platform resources" slug: reference/python -description: "SDK reference overview for SignalWire Agents, Relay, and REST APIs." +description: "Reference for the Agents, Relay, and REST namespaces of the Python Server SDK." max-toc-depth: 3 position: 0 --- diff --git a/fern/products/server-sdks/pages/reference/python/relay/call/connect.mdx b/fern/products/server-sdks/pages/reference/python/relay/call/connect.mdx index ed648b387b..0a4b06cc00 100644 --- a/fern/products/server-sdks/pages/reference/python/relay/call/connect.mdx +++ b/fern/products/server-sdks/pages/reference/python/relay/call/connect.mdx @@ -31,6 +31,9 @@ This method corresponds to the SWML [`connect`][connect] verb. See the serially (one group at a time). Each inner list is dialed in parallel (all devices in the group ring simultaneously). + Up to 20 devices are dialed in total, counted across all groups rather than + per group. Any device after the 20th is skipped. + Each device dict contains: - `"type"` -- Device type (`"phone"`, `"sip"`) - `"params"` -- Type-specific parameters (`to_number`, `from_number`, etc.) diff --git a/fern/products/server-sdks/pages/reference/python/relay/client/dial.mdx b/fern/products/server-sdks/pages/reference/python/relay/client/dial.mdx index c3f4977d0d..a6823b13b5 100644 --- a/fern/products/server-sdks/pages/reference/python/relay/client/dial.mdx +++ b/fern/products/server-sdks/pages/reference/python/relay/client/dial.mdx @@ -30,6 +30,9 @@ Raises `RelayError` if the dial fails or if no answer is received within the - **Serial dial** (try one after another): each inner list has one device - **Parallel dial** (ring simultaneously): one inner list with multiple devices + + Up to 20 devices are dialed in total, counted across all inner lists rather + than per list. Any device after the 20th is skipped. diff --git a/fern/products/server-sdks/pages/reference/typescript/core/overview.mdx b/fern/products/server-sdks/pages/reference/typescript/core/overview.mdx index e21afd2491..6cc2a71b05 100644 --- a/fern/products/server-sdks/pages/reference/typescript/core/overview.mdx +++ b/fern/products/server-sdks/pages/reference/typescript/core/overview.mdx @@ -3,7 +3,7 @@ title: "SignalWire TypeScript Server SDK" sidebar-title: Overview subtitle: "Build AI agents, control calls in real time, and manage platform resources" slug: reference/typescript -description: "SDK reference overview for SignalWire Agents, Relay, and REST APIs." +description: "Reference for the Agents, Relay, and REST namespaces of the TypeScript Server SDK." max-toc-depth: 3 position: 0 --- diff --git a/fern/products/server-sdks/pages/reference/typescript/relay/call/connect.mdx b/fern/products/server-sdks/pages/reference/typescript/relay/call/connect.mdx index 96a789b843..288be9edf9 100644 --- a/fern/products/server-sdks/pages/reference/typescript/relay/call/connect.mdx +++ b/fern/products/server-sdks/pages/reference/typescript/relay/call/connect.mdx @@ -31,6 +31,9 @@ This method corresponds to the SWML [`connect`][connect] verb. See the serially (one group at a time). Each inner array is dialed in parallel (all devices in the group ring simultaneously). + Up to 20 devices are dialed in total, counted across all groups rather than + per group. Any device after the 20th is skipped. + Each device object contains: - `"type"` -- Device type (`"phone"`, `"sip"`, or `"fabric"` for a resource address) diff --git a/fern/products/server-sdks/pages/reference/typescript/relay/client/dial.mdx b/fern/products/server-sdks/pages/reference/typescript/relay/client/dial.mdx index fb09df8e1e..aa0531e39e 100644 --- a/fern/products/server-sdks/pages/reference/typescript/relay/client/dial.mdx +++ b/fern/products/server-sdks/pages/reference/typescript/relay/client/dial.mdx @@ -32,6 +32,9 @@ Throws `RelayError` if the dial fails or if no answer is received within the - **Serial dial** (try one after another): each inner array has one device - **Parallel dial** (ring simultaneously): one inner array with multiple devices + + Up to 20 devices are dialed in total, counted across all inner arrays rather + than per array. Any device after the 20th is skipped. diff --git a/fern/products/server-sdks/pages/reference/typescript/relay/overview.mdx b/fern/products/server-sdks/pages/reference/typescript/relay/overview.mdx index e1d6e1cf89..e4d9c05dd5 100644 --- a/fern/products/server-sdks/pages/reference/typescript/relay/overview.mdx +++ b/fern/products/server-sdks/pages/reference/typescript/relay/overview.mdx @@ -42,7 +42,6 @@ import { RelayClient } from '@signalwire/sdk'; const client = new RelayClient({ project: 'your-project-id', token: 'your-api-token', - host: 'your-space.signalwire.com', contexts: ['support', 'sales'], }); @@ -65,13 +64,12 @@ subscribing to different contexts. An IVR that answers calls, plays a menu, collects a digit, and routes accordingly: -```typescript {13} +```typescript {12} import { RelayClient } from '@signalwire/sdk'; const client = new RelayClient({ project: 'your-project-id', token: 'your-api-token', - host: 'your-space.signalwire.com', contexts: ['default'], }); diff --git a/fern/products/swml/pages/guides/recipes/creating-ivr-with-swml.mdx b/fern/products/swml/pages/guides/recipes/creating-ivr-with-swml.mdx index 7de02a22ce..3be43bf259 100644 --- a/fern/products/swml/pages/guides/recipes/creating-ivr-with-swml.mdx +++ b/fern/products/swml/pages/guides/recipes/creating-ivr-with-swml.mdx @@ -16,8 +16,8 @@ SWML enables you to create Relay applications using a descriptive format without ## Getting started -Before proceeding ahead with this tutorial, you should be familiar with the [Making and Receiving Phone Calls](/docs/swml/guides/make-and-receive-calls#swml) guide. -This resource will offer you step-by-step instructions on how to create a SWML script directly on your [SignalWire SWML Dashboard](https://my.signalwire.com?page=relay-bins). +Start with the [inbound calling guide](/docs/platform/voice/make-and-receive-calls#answer-a-call-via-swml) +to create a hosted SWML Script and assign it to a phone number. Use that setup for the menu below. The first crucial step is to have a SignalWire Space. Begin by [signing up now to get started](https://signalwire.com/signups/new). diff --git a/fern/products/swml/pages/guides/recipes/forwarding-calls.mdx b/fern/products/swml/pages/guides/recipes/forwarding-calls.mdx index aa6250ea62..9e075a9809 100644 --- a/fern/products/swml/pages/guides/recipes/forwarding-calls.mdx +++ b/fern/products/swml/pages/guides/recipes/forwarding-calls.mdx @@ -5,11 +5,10 @@ description: Use SWML to forward calls max-toc-depth: 3 --- -In [Making and receiving phone calls](/docs/swml/guides/make-and-receive-calls) we learned how to use SWML -to define what should happen when a call is received by one of your -SignalWire numbers. In that case, we just played some audio. In this article, -instead, we will use the same technique to forward the call to a different -number. +Use a hosted SWML Script to forward incoming calls to another number. Start with the +[inbound calling guide](/docs/platform/voice/make-and-receive-calls#answer-a-call-via-swml) to create +the script and assign it to your SignalWire number, then replace its greeting with forwarding +instructions. ## SWML for call forwarding diff --git a/fern/products/swml/pages/guides/recipes/making-and-receiving-calls.mdx b/fern/products/swml/pages/guides/recipes/making-and-receiving-calls.mdx deleted file mode 100644 index 6de67d04bd..0000000000 --- a/fern/products/swml/pages/guides/recipes/making-and-receiving-calls.mdx +++ /dev/null @@ -1,184 +0,0 @@ ---- -title: Making and receiving phone calls -slug: guides/make-and-receive-calls -description: Overview of the many ways you can make and receive calls using SignalWire products. -max-toc-depth: 3 ---- - -{/* Links */} -[swml]: /docs/swml "SignalWire Markup Language" -[sw-api]: /docs/apis "SignalWire API" - -Follow this guide to make and receive your first phone calls using -[SignalWire Markup Language (SWML)][swml] and -the [SignalWire API][sw-api]. - -## Prerequisites - -To be able to make calls, you will need: - -- a SignalWire phone number -- your API credentials (Space URL, Project ID, and API token) - -Also, note that if your account is in trial mode, -you'll need to upgrade it in order to call numbers other than your own verified numbers. - -To acquire a phone number, -[log in](https://signalwire.com/signin) to your SignalWire Space. -From the [Phone Numbers section](https://my.signalwire.com/?phone_numbers), -[buy a new phone number](/docs/platform/phone-numbers). -You will need at least one number to make and receive calls. - -Find your API tokens in the API section of your Space, as shown below. -You may need to create a new token if you never used one. -Make sure that your token has at least the "Voice" scope enabled. - - - - - -![The API page.](/assets/images/dashboard/credentials/api-credentials.webp) - - - - - - - -Open **API Credentials** in the Dashboard and copy the **Project ID** and an API token with the **Voice** scope. If necessary, select **+ New** to create a token. - - - - - -## SWML - -### Receiving incoming calls - -To handle incoming calls we need to configure the phone number in our -[SignalWire Space](https://signalwire.com/signin) to answer calls using a SWML Script. - - - -```yaml -version: 1.0.0 -sections: - main: - - play: say:Hello from SignalWire! -``` - -Take note of the Request URL for the SWML Script that we created. You can even create a new script if you want to define a different behavior for incoming calls. - -To configure your number to handle incoming calls with an SWML Script, click the [Phone Numbers](https://my.signalwire.com/?phone_numbers) section within your SignalWire Space, and edit the settings of the specific number you would like to use to answer calls. -Set **Handle calls using** to **a SWML Script**, then select your SWML Script from the dropdown - -That's it! Inbound calls to this SignalWire number will execute the specified SWML Script. - -### Making your first call - -Outbound calls can be made via the SignalWire REST API's [Create a Call endpoint](/docs/apis/rest/calls/call-commands). -This is accomplished by sending a POST request using SWML in the request body to handle the call. -The SWML can be served via URL or passed inline directly as an escaped JSON string. - - - - -```bash -curl -L -g 'https://Your_Space_Name.signalwire.com/api/calling/calls' \ --H 'Content-Type: application/json' \ --H 'Accept: application/json' \ --H "Authorization: Basic $(echo -n "${YOUR-PROJECT-ID}:${YOUR-API-TOKEN}" | base64)" \ ---data-raw '{ - "command": "dial", - "params": { - "from": "sip:from-sip@example-112233445566.sip.signalwire.com", - "to": "+1xxxxxxxxxx", - "caller_id": "+1234567890", - "fallback_url": "https://example.com/fallback", - "status_url": "https://example.com/status_callback", - "status_events": [ - "answered", - "ended" - ], - "url": "https://example.com/swml" - } -}' -``` - - - - -```bash -curl -L -g 'https://Your_Space_Name.signalwire.com/api/calling/calls' \ --H 'Content-Type: application/json' \ --H 'Accept: application/json' \ --H "Authorization: Basic $(echo -n "${YOUR-PROJECT-ID}:${YOUR-API-TOKEN}" | base64)" \ ---data-raw '{ - "command": "dial", - "params": { - "from": "sip:from-sip@example-112233445566.sip.signalwire.com", - "to": "+1xxxxxxxxxx", - "caller_id": "+1234567890", - "fallback_url": "https://example.com/fallback", - "status_url": "https://example.com/status_callback", - "status_events": [ - "answered", - "ended" - ] - }, - "swml": { - "version": "1.0.0", - "sections": { - "main": [ - { - "play": "say:Hello from SignalWire!" - } - ] - } - } -}' -``` - - - - - - -To pass SWML as an inline string, quotes must be escaped, as shown in the example below. - - - -```bash -curl -L -g 'https://Your_Space_Name.signalwire.com/api/calling/calls' \ --H 'Content-Type: application/json' \ --H 'Accept: application/json' \ --H "Authorization: Basic $(echo -n "${YOUR-PROJECT-ID}:${YOUR-API-TOKEN}" | base64)" \ ---data-raw '{ - "command": "dial", - "params": { - "from": "sip:from-sip@example-112233445566.sip.signalwire.com", - "to": "+1xxxxxxxxxx", - "caller_id": "+1234567890", - "fallback_url": "https://example.com/fallback", - "status_url": "https://example.com/status_callback", - "status_events": [ - "answered", - "ended" - ], - "swml": "{\"version\":\"1.0.0\",\"sections\":{\"main\":[{\"play\":\"say:Hello from SignalWire!\"}]}}" - } -}' -``` - - - - ---- - -## Next steps - -SWML scripts allow you to handle incoming phone calls, -and REST APIs make it easy to trigger outbound calls. - -If you need more flexibility and real-time control on your calls, -check out the [SDKs](/docs/server-sdks) for programmatic call handling. diff --git a/fern/products/swml/pages/guides/recipes/recording-calls.mdx b/fern/products/swml/pages/guides/recipes/recording-calls.mdx deleted file mode 100644 index fc42f4ed33..0000000000 --- a/fern/products/swml/pages/guides/recipes/recording-calls.mdx +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Recording calls -slug: guides/record-calls -description: Using SWML to record ongoing calls. -max-toc-depth: 3 ---- - -In [Making and receiving phone calls](/docs/swml/guides/make-and-receive-calls) we learned how to use SWML Scripts to define what should happen when a call is received by one of your -SignalWire numbers. In that case, we just played some audio. In this article, -instead, we will use the same technique to record the audio of the call. - -## Recording calls with SignalWire - -We are going to define the instructions for recording the call in a SWML script hosted on SignalWire. -To create a new SWML script, navigate to the **Resources** section from your sidebar. -From there, create a new script, and select the **SWML** option. - -Create a new script, and paste the following SWML in it: - -```yaml -version: 1.0.0 -sections: - main: - - record_call: - format: mp3 - direction: "both" - - play: - url: 'say: Welcome to SignalWire. You should hear this in your call recording.' -``` - -We used the [`record_call`](/docs/swml/reference/record-call) method to start the recording in the background, then the [`play`](/docs/swml/reference/play) method to play a text-to-speech message. -The recording will be available from your SignalWire Space in the **Storage** section, within **Recordings**. - - - -![Call Recording Example SWML.](/assets/images/dashboard/sidebar/Call-Recording-Example-SWML.webp) - - - - - -Save the example above as a hosted SWML Script Resource. Recordings created by the script appear under **Storage** > **Recordings**. - - - -The [`record_call`](/docs/swml/reference/record-call) method accepts parameters to configure the format, direction of the recording, terminators, and more. -For additional information, see the `record_call` [technical documentation](/docs/swml/reference/record-call). - -## Assigning the script to a SignalWire phone number - -The final step is to configure one of your SignalWire phone numbers to answer calls using the SWML Script we just created. You can do that from the **Phone Numbers** section: - - - -![Assign Resource.](/assets/images/dashboard/phone-numbers/assign-resource-voice.webp) - - - - - -In the Dashboard, open **Phone Numbers** > **Purchased**, select the number, and open its edit page. Under **Inbound Call Settings**, select **+ Assign Resource**, choose the recording SWML script, and save. - - - -Refer to [Making and receiving phone calls](/docs/swml/guides/make-and-receive-calls#receiving-incoming-calls) for more information about this step. - -## Conclusion - -You are now ready to test the call recording script. - -SWML scripts offer a quick and easy way to get started with common use cases. If you need more -flexibility and real-time control on your calls, check out the [SDKs](/docs/server-sdks) for programmatic call handling. diff --git a/fern/products/swml/pages/reference/methods/calling/ai/ai_params/index.mdx b/fern/products/swml/pages/reference/methods/calling/ai/ai_params/index.mdx index 123ec1c1be..c86b0c80de 100644 --- a/fern/products/swml/pages/reference/methods/calling/ai/ai_params/index.mdx +++ b/fern/products/swml/pages/reference/methods/calling/ai/ai_params/index.mdx @@ -412,7 +412,7 @@ Control background audio, hold music, and greeting messages to enhance the calle - A URL for the hold music to play, accepting WAV, mp3, and FreeSWITCH `tone_stream`. + A URL for the hold music to play, accepting WAV, mp3, and FreeSWITCH [`tone_stream`](https://developer.signalwire.com/freeswitch/media-and-codecs/audio-files/#mod_tone_stream-and-the-tgml-generator). diff --git a/fern/products/swml/pages/reference/methods/calling/ai/languages/index.mdx b/fern/products/swml/pages/reference/methods/calling/ai/languages/index.mdx index 6b87c3e79a..64a4adf1af 100644 --- a/fern/products/swml/pages/reference/methods/calling/ai/languages/index.mdx +++ b/fern/products/swml/pages/reference/methods/calling/ai/languages/index.mdx @@ -20,7 +20,9 @@ max-toc-depth: 3 [elevenlabs]: /docs/platform/voice/tts/elevenlabs [fish]: /docs/platform/voice/tts/fish [inworld]: /docs/platform/voice/tts/inworld +{/* hidden 2026-10-05 [minimax]: /docs/platform/voice/tts/minimax +*/} [rime]: /docs/platform/voice/tts/rime [smallest]: /docs/platform/voice/tts/smallest @@ -60,7 +62,10 @@ key rather than emptying it. String format: `.`, with an optional `:` suffix for engines that offer a choice of model. +{/* hidden 2026-10-05 Select engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `deepgram`, `cartesia`, `rime`, `inworld`, `minimax`, `groq-tts`, `mistral`, `grok`, `smallest`, `fish`, or `speechify`. Select voice from [TTS provider reference][tts-providers]. +*/} +Select engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `deepgram`, `cartesia`, `rime`, `inworld`, `groq-tts`, `mistral`, `grok`, `smallest`, or `fish`. Select voice from [TTS provider reference][tts-providers]. For example, `"gcloud.fr-FR-Neural2-B"` or `"elevenlabs.rachel:eleven_flash_v2_5"`. Always name the engine: a bare voice id resolves against a default engine that can change. See [`voice` usage](#use-voice-strings) for more details. @@ -68,12 +73,18 @@ See [`voice` usage](#use-voice-strings) for more details. Lets the AI vary its emotion as it speaks. A global emotion, or specific emotions for certain topics, can be set within the prompt of the AI. +{/* hidden 2026-10-05 Only works with the [Cartesia][cartesia] and [MiniMax][minimax] TTS engines. For a fixed MiniMax emotion, use [`params.emotion`](#paramsemotion) instead. +*/} +Only works with the [Cartesia][cartesia] TTS engine. Lets the AI vary its speaking speed during the conversation. The speed behavior can be defined in the prompt of the AI. +{/* hidden 2026-10-05 Only works with the [Cartesia][cartesia], [ElevenLabs][elevenlabs], [MiniMax][minimax], [Rime][rime], [Inworld][inworld], [Smallest][smallest], and [Fish][fish] TTS engines. +*/} +Only works with the [Cartesia][cartesia], [ElevenLabs][elevenlabs], [Rime][rime], [Inworld][inworld], [Smallest][smallest], and [Fish][fish] TTS engines. @@ -141,6 +152,7 @@ See [`voice` usage](#use-voice-strings) for more details. + {/* hidden 2026-10-05 How quickly the voice speaks. Values below `1.0` slow the voice down; values above `1.0` speed it up. @@ -174,6 +186,7 @@ See [`voice` usage](#use-voice-strings) for more details. Only works with the MiniMax TTS engine. + */} @@ -195,7 +208,10 @@ See [`voice` usage](#use-voice-strings) for more details. Compose the `voice` string using the `.` syntax, optionally followed by `:`. +{/* hidden 2026-10-05 First, select your engine using the `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `deepgram`, `cartesia`, `rime`, `inworld`, `minimax`, `groq-tts`, `mistral`, `grok`, `smallest`, `fish`, or `speechify` identifier. +*/} +First, select your engine using the `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `deepgram`, `cartesia`, `rime`, `inworld`, `groq-tts`, `mistral`, `grok`, `smallest`, or `fish` identifier. Append a period (`.`), and then the specific voice ID from the TTS provider, giving `gcloud.en-US-Casual-K`. Where an engine offers more than one model, append a colon (`:`) and the model ID, as in `elevenlabs.rachel:eleven_flash_v2_5`. Refer to SignalWire's [Supported Voices and Languages][tts-providers] diff --git a/fern/products/swml/pages/reference/methods/calling/connect/index.mdx b/fern/products/swml/pages/reference/methods/calling/connect/index.mdx index 5cf028149f..bb6a612aa1 100644 --- a/fern/products/swml/pages/reference/methods/calling/connect/index.mdx +++ b/fern/products/swml/pages/reference/methods/calling/connect/index.mdx @@ -122,14 +122,14 @@ Dial a single destination directly using the `to` property. Maximum time, in seconds, to wait for an answer. - - SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends. + + SWML to execute on this call after its bridge with the queued call ends. Only applies when `to` starts with `queue:`. Can be either: - A URL (http or https) that returns a SWML document - An inline SWML document (as a JSON string) - Required when connecting to a queue (when `to` starts with `queue:`). + When omitted, the call hangs up when the bridge ends. Either way, the script does not continue past `connect` for queue targets, so `result` never runs. @@ -216,6 +216,10 @@ Dial multiple destinations simultaneously — the first to answer is bridged and Array of destination objects to dial simultaneously. The first destination to answer is bridged and the rest are cancelled. + + + Up to 20 destinations are dialed. Any destination after the 20th never rings, and `connect` reports no error for it. To reach more, see [Dial more than 20 destinations](#dial-more-than-20-destinations). + @@ -353,14 +357,6 @@ Dial multiple destinations simultaneously — the first to answer is bridged and Maximum time, in seconds, to wait for an answer. - - SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends. - - Can be either: - - A URL (http or https) that returns a SWML document - - An inline SWML document (as a JSON string) - - If true, WebRTC media is offered to the SIP endpoint. Has no effect on calls to phone numbers. @@ -426,6 +422,10 @@ Dial destinations in sequence — each destination is tried one at a time, movin Array of destination objects to dial in order. Each destination is tried sequentially — if the first fails, the next is attempted. + + + Up to 20 destinations are tried. Any destination after the 20th never rings, and `connect` reports no error for it. To reach more, see [Dial more than 20 destinations](#dial-more-than-20-destinations). + @@ -563,14 +563,6 @@ Dial destinations in sequence — each destination is tried one at a time, movin Maximum time, in seconds, to wait for an answer. - - SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends. - - Can be either: - - A URL (http or https) that returns a SWML document - - An inline SWML document (as a JSON string) - - If true, WebRTC media is offered to the SIP endpoint. Has no effect on calls to phone numbers. @@ -638,6 +630,10 @@ Combine both strategies. The outer array is the **serial** dimension — groups Array of arrays combining both strategies. The outer array is the **serial** dimension — each element is a group tried in order. Each inner array is the **parallel** dimension — all destinations in that group are dialed simultaneously. If no destination in the current group answers, the next group is attempted. In the `[][]` notation below, the first `[]` is the serial (group) index and the second `[]` is the parallel (destination) index within that group. + + + Up to 20 destinations are dialed in total, counted across all groups rather than per group. With three groups of eight destinations, the first two groups ring in full (16 destinations), the third group rings only its first four, and its last four never ring. `connect` reports no error for skipped destinations. To reach more, see [Dial more than 20 destinations](#dial-more-than-20-destinations). + @@ -775,14 +771,6 @@ Combine both strategies. The outer array is the **serial** dimension — groups Maximum time, in seconds, to wait for an answer. - - SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends. - - Can be either: - - A URL (http or https) that returns a SWML document - - An inline SWML document (as a JSON string) - - If true, WebRTC media is offered to the SIP endpoint. Has no effect on calls to phone numbers. @@ -1332,6 +1320,78 @@ sections:
+### Dial more than 20 destinations + +To reach more than 20 destinations, split them into batches of up to 20 and start the next batch from the `result` block when `connect_result` is `failed`. The batches ring one after another: the second batch starts only after the first batch's `timeout` expires with no answer. Put the destinations most likely to answer in the first batch. + +This example shows two destinations per batch to keep it short. Each `parallel` array can hold up to 20. + + + +```yaml +version: 1.0.0 +sections: + main: + - connect: + timeout: 20 + parallel: + - to: "+15551110001" + - to: "+15551110002" + result: + case: + failed: + - connect: + timeout: 20 + parallel: + - to: "+15551110021" + - to: "+15551110022" +``` + + +```json +{ + "version": "1.0.0", + "sections": { + "main": [ + { + "connect": { + "timeout": 20, + "parallel": [ + { + "to": "+15551110001" + }, + { + "to": "+15551110002" + } + ], + "result": { + "case": { + "failed": [ + { + "connect": { + "timeout": 20, + "parallel": [ + { + "to": "+15551110021" + }, + { + "to": "+15551110022" + } + ] + } + } + ] + } + } + } + } + ] + } +} +``` + + + ### Dial SIP serially with a timeout @@ -1424,7 +1484,7 @@ sections: -### Connect to a queue with transfer after bridge +### Connect to a queue @@ -1434,7 +1494,7 @@ sections: main: - connect: to: "queue:support" - transfer_after_bridge: "https://example.com/post-call-swml" + execute_after_queue: "https://example.com/post-call-swml" ``` @@ -1446,7 +1506,7 @@ sections: { "connect": { "to": "queue:support", - "transfer_after_bridge": "https://example.com/post-call-swml" + "execute_after_queue": "https://example.com/post-call-swml" } } ] diff --git a/fern/products/swml/pages/reference/methods/calling/enter_queue.mdx b/fern/products/swml/pages/reference/methods/calling/enter_queue.mdx index 1738c53b9d..ae6c821f36 100644 --- a/fern/products/swml/pages/reference/methods/calling/enter_queue.mdx +++ b/fern/products/swml/pages/reference/methods/calling/enter_queue.mdx @@ -9,7 +9,7 @@ max-toc-depth: 3 Place the current call in a named queue where it will wait to be connected to an available agent or resource. While waiting, callers will hear music or custom audio. When an agent connects to the queue (using the [`connect`](/docs/swml/reference/calling/connect) method), the caller and agent are bridged together. -After the bridge completes (when the agent or caller hangs up), execution continues with the SWML script specified in `transfer_after_bridge`. +After the bridge completes (when the agent or caller hangs up), execution continues with the SWML script specified in `execute_after_queue`, or the call hangs up if none was given. ## **Properties** @@ -24,8 +24,9 @@ After the bridge completes (when the agent or caller hangs up), execution contin - - SWML to execute after the bridge completes (when the agent or caller hangs up). This defines what should happen after the call is connected to an agent and the bridge ends. + + SWML to execute after the bridge with the agent ends. When omitted, the call hangs up when the bridge ends. + If the call leaves the queue without being bridged (`wait_time` expires or the caller hangs up), this field is not used and the script continues with the next instruction; check `queue_result`. Can be either: - A URL (http or https) that returns a SWML document @@ -50,7 +51,7 @@ After the bridge completes (when the agent or caller hangs up), execution contin - + Maximum time in seconds to wait in the queue before timeout. @@ -282,7 +283,7 @@ sections: main: - enter_queue: queue_name: "my_queue" - transfer_after_bridge: "https://example.com/post-call-swml" + execute_after_queue: "https://example.com/post-call-swml" ``` @@ -294,7 +295,7 @@ sections: { "enter_queue": { "queue_name": "my_queue", - "transfer_after_bridge": "https://example.com/post-call-swml" + "execute_after_queue": "https://example.com/post-call-swml" } } ] @@ -316,7 +317,7 @@ sections: queue_name: "sales_queue" status_url: "https://example.com/queue-status" wait_time: 1800 - transfer_after_bridge: "https://example.com/post-call-swml" + execute_after_queue: "https://example.com/post-call-swml" ``` @@ -330,7 +331,7 @@ sections: "queue_name": "sales_queue", "status_url": "https://example.com/queue-status", "wait_time": 1800, - "transfer_after_bridge": "https://example.com/post-call-swml" + "execute_after_queue": "https://example.com/post-call-swml" } } ] diff --git a/fern/products/swml/pages/reference/methods/calling/record_call.mdx b/fern/products/swml/pages/reference/methods/calling/record_call.mdx index 684201fffa..1b8e1fb5ec 100644 --- a/fern/products/swml/pages/reference/methods/calling/record_call.mdx +++ b/fern/products/swml/pages/reference/methods/calling/record_call.mdx @@ -10,7 +10,7 @@ max-toc-depth: 3 Record call in the background. Unlike the [`record` method](/docs/swml/reference/calling/record), the `record_call` method will start the recording and continue executing the SWML script while allowing the recording to happen in the background. -To stop call recordings started with `record_call`, use the [`stop_call_record`](/docs/swml/reference/calling/stop-record-call) method. +To stop call recordings started with `record_call`, use the [`stop_record_call`](/docs/swml/reference/calling/stop-record-call) method. ## **Properties** @@ -141,29 +141,69 @@ A POST request will be sent to `status_url` with a JSON payload like the followi - - Recording result details (present when state is `finished`). + + URL of the recorded media on `files.signalwire.com`. Present from the `recording` state onward. + + + + + ID of the recording, matching the `id` returned by the [Recordings API](/docs/apis/rest/recordings/list-call-recordings). + + + + + Recording duration in seconds. Present when the recording ends. - - - URL to download the recording. + + Recording file size in bytes. Present when the recording ends. - - Recording duration in seconds. + + Unix timestamp (float) when the recording started. Present when the recording ends. - - Recording file size in bytes. + + Unix timestamp (float) when the recording ended. Present when the recording ends. - - Recording format. **Valid values:** `wav`, `mp3`. + + Unix timestamp (float) of the first recorded audio frame. Present when state is `finished`. + + + + + How paused recording handles audio. Only present when `state` is `paused`. **Valid values:** `silence`, `skip`. + + + + + The call segment the recording belongs to. + + + + + The configuration the recording ran with. + + + + + + Recording format. **Valid values:** `wav`, `mp3`, `mp4`. + + + + + Direction of the audio recorded. **Valid values:** `speak`, `listen`, `both`. + + + + + Whether the recording was made in stereo mode. @@ -184,11 +224,20 @@ A POST request will be sent to `status_url` with a JSON payload like the followi "node_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "control_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "state": "finished", + "url": "https://files.signalwire.com///recordings/.wav", + "recording_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + "duration": 18, + "size": 298284, + "start_time": 1789651036.217461, + "end_time": 1789651055.516839, + "first_frame_time": 1789651036.219012, + "segment_id": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "record": { - "url": "https://your-space.signalwire.com/api/v1/recordings/rec-uuid/download", - "duration": 15.5, - "size": 248320, - "format": "wav" + "audio": { + "format": "wav", + "direction": "both", + "stereo": false + } } } } diff --git a/fern/redirects.yml b/fern/redirects.yml new file mode 100644 index 0000000000..c3c4f71871 --- /dev/null +++ b/fern/redirects.yml @@ -0,0 +1,883 @@ +# Redirects for signalwire.com/docs, loaded by `redirects:` in docs.yml. +# Fern applies the first rule that matches, so keep an exact path above any +# wildcard that would also match it. Comment each group with why the pages moved. +redirects: + # The outbound calling guide merged into the platform make and receive calls + # guide. + - source: /docs/platform/voice/outbound-calling + destination: /docs/platform/voice/make-and-receive-calls + # The combined SWML calling walkthrough is now covered by the platform + # calling guide. + - source: /docs/swml/guides/make-and-receive-calls + destination: /docs/platform/voice/make-and-receive-calls + # Recording guides consolidated into the platform record-calls guide. + - source: /docs/server-sdks/guides/call-recording + destination: /docs/platform/voice/record-calls + - source: /docs/swml/guides/record-calls + destination: /docs/platform/voice/record-calls + # Browser SDK outbound guide consolidated into the platform calling guide, + # which now carries the browser walkthrough and media options. + - source: /docs/browser-sdk/guides/outbound-calls + destination: /docs/platform/voice/make-and-receive-calls + - source: /docs/browser-sdk/v4/guides/outbound-calls + destination: /docs/platform/voice/make-and-receive-calls + # Legacy Agents SDK pages (#526). Use known paths and equivalent existing + # content only. Exact entries prevent unknown or removed pages (examples, + # best-practices, patterns, migration, changelog) from redirecting to an + # unrelated overview or a nonexistent guide. Those paths remain not found. + - source: /docs/agents-sdk + destination: /docs/server-sdks + - source: /docs/agents-sdk/advanced/call-recording + destination: /docs/platform/voice/record-calls + - source: /docs/agents-sdk/advanced/call-transfer + destination: /docs/server-sdks/guides/call-transfer + - source: /docs/agents-sdk/advanced/contexts-workflows + destination: /docs/server-sdks/guides/contexts-workflows + - source: /docs/agents-sdk/advanced/mcp-gateway + destination: /docs/server-sdks/guides/mcp-gateway + - source: /docs/agents-sdk/advanced/multi-agent + destination: /docs/server-sdks/guides/multi-agent + - source: /docs/agents-sdk/advanced/search-knowledge + destination: /docs/server-sdks/guides/search-knowledge + - source: /docs/agents-sdk/advanced/state-management + destination: /docs/server-sdks/guides/state-management + - source: /docs/agents-sdk/api/agent-base + destination: /docs/server-sdks/reference/python/agents/agent-base + - source: /docs/agents-sdk/api/cli-sw-agent-init + destination: /docs/server-sdks/reference/python/agents/cli/sw-agent-init + - source: /docs/agents-sdk/api/cli-sw-search + destination: /docs/server-sdks/reference/python/agents/cli/sw-search + - source: /docs/agents-sdk/api/cli/swaig-test + destination: /docs/server-sdks/reference/python/agents/cli/swaig-test + - source: /docs/agents-sdk/api/configuration + destination: /docs/server-sdks/reference/python/agents/configuration + - source: /docs/agents-sdk/api/contexts + destination: /docs/server-sdks/reference/python/agents/context-builder + - source: /docs/agents-sdk/api/data-map + destination: /docs/server-sdks/reference/python/agents/data-map + - source: /docs/agents-sdk/api/environment-variables + destination: /docs/server-sdks/reference/python/agents/configuration/environment-variables + - source: /docs/agents-sdk/api/function-result + destination: /docs/server-sdks/reference/python/agents/function-result + - source: /docs/agents-sdk/api/skill-base + destination: /docs/server-sdks/reference/python/agents/skill-base + - source: /docs/agents-sdk/api/swaig-function + destination: /docs/server-sdks/reference/python/agents/swaig-function + - source: /docs/agents-sdk/api/swml-schema + destination: /docs/server-sdks/guides/swml + - source: /docs/agents-sdk/api/swml-service + destination: /docs/server-sdks/reference/python/agents/swml-service + - source: /docs/agents-sdk/appendix/ai-parameters-reference + destination: /docs/server-sdks/guides/ai-parameters + - source: /docs/agents-sdk/appendix/troubleshooting + destination: /docs/server-sdks/guides/troubleshooting + - source: /docs/agents-sdk/building-agents/agent-base + destination: /docs/server-sdks/guides/agent-base + - source: /docs/agents-sdk/building-agents/ai-parameters + destination: /docs/server-sdks/guides/ai-parameters + - source: /docs/agents-sdk/building-agents/call-flow + destination: /docs/server-sdks/guides/call-flow + - source: /docs/agents-sdk/building-agents/hints + destination: /docs/server-sdks/guides/hints + - source: /docs/agents-sdk/building-agents/prompts-pom + destination: /docs/server-sdks/guides/prompts-pom + - source: /docs/agents-sdk/building-agents/static-vs-dynamic + destination: /docs/server-sdks/guides/static-vs-dynamic + - source: /docs/agents-sdk/building-agents/voice-language + destination: /docs/server-sdks/guides/voice-language + - source: /docs/agents-sdk/core-concepts/architecture + destination: /docs/server-sdks/guides/architecture + - source: /docs/agents-sdk/core-concepts/lifecycle + destination: /docs/server-sdks/guides/lifecycle + - source: /docs/agents-sdk/core-concepts/security + destination: /docs/server-sdks/guides/security + - source: /docs/agents-sdk/core-concepts/swaig + destination: /docs/server-sdks/guides/swaig + - source: /docs/agents-sdk/core-concepts/swml + destination: /docs/server-sdks/guides/swml + - source: /docs/agents-sdk/deployment/cgi-mode + destination: /docs/server-sdks/guides/cgi-mode + - source: /docs/agents-sdk/deployment/docker-kubernetes + destination: /docs/server-sdks/guides/docker-kubernetes + - source: /docs/agents-sdk/deployment/local-development + destination: /docs/server-sdks/guides/local-development + - source: /docs/agents-sdk/deployment/production + destination: /docs/server-sdks/guides/production + - source: /docs/agents-sdk/deployment/serverless + destination: /docs/server-sdks/guides/serverless + - source: /docs/agents-sdk/dev-environment + destination: /docs/server-sdks/guides/dev-environment + - source: /docs/agents-sdk/exposing-agents + destination: /docs/server-sdks/guides/exposing-agents + - source: /docs/agents-sdk/getting-started/dev-environment + destination: /docs/server-sdks/guides/dev-environment + - source: /docs/agents-sdk/getting-started/exposing-agents + destination: /docs/server-sdks/guides/exposing-agents + - source: /docs/agents-sdk/getting-started/installation + destination: /docs/server-sdks/guides/installation + - source: /docs/agents-sdk/getting-started/quickstart + destination: /docs/server-sdks/guides/quickstart + - source: /docs/agents-sdk/installation + destination: /docs/server-sdks/guides/installation + - source: /docs/agents-sdk/prefabs/concierge + destination: /docs/server-sdks/guides/concierge + - source: /docs/agents-sdk/prefabs/faq-bot + destination: /docs/server-sdks/guides/faq-bot + - source: /docs/agents-sdk/prefabs/info-gatherer + destination: /docs/server-sdks/guides/info-gatherer + - source: /docs/agents-sdk/prefabs/receptionist + destination: /docs/server-sdks/guides/receptionist + - source: /docs/agents-sdk/prefabs/survey + destination: /docs/server-sdks/guides/survey + - source: /docs/agents-sdk/python + destination: /docs/server-sdks + - source: /docs/agents-sdk/python/guides/account-setup + destination: /docs/server-sdks/guides/account-setup + - source: /docs/agents-sdk/python/guides/adding-skills + destination: /docs/server-sdks/guides/adding-skills + - source: /docs/agents-sdk/python/guides/agent-base + destination: /docs/server-sdks/guides/agent-base + - source: /docs/agents-sdk/python/guides/ai-parameters + destination: /docs/server-sdks/guides/ai-parameters + - source: /docs/agents-sdk/python/guides/architecture + destination: /docs/server-sdks/guides/architecture + - source: /docs/agents-sdk/python/guides/builtin-skills + destination: /docs/server-sdks/guides/builtin-skills + - source: /docs/agents-sdk/python/guides/call-flow + destination: /docs/server-sdks/guides/call-flow + - source: /docs/agents-sdk/python/guides/call-recording + destination: /docs/platform/voice/record-calls + - source: /docs/agents-sdk/python/guides/call-transfer + destination: /docs/server-sdks/guides/call-transfer + - source: /docs/agents-sdk/python/guides/cgi-mode + destination: /docs/server-sdks/guides/cgi-mode + - source: /docs/agents-sdk/python/guides/concierge + destination: /docs/server-sdks/guides/concierge + - source: /docs/agents-sdk/python/guides/contexts-workflows + destination: /docs/server-sdks/guides/contexts-workflows + - source: /docs/agents-sdk/python/guides/custom + destination: /docs/server-sdks/guides/custom + - source: /docs/agents-sdk/python/guides/data-map + destination: /docs/server-sdks/guides/data-map + - source: /docs/agents-sdk/python/guides/defining-functions + destination: /docs/server-sdks/guides/defining-functions + - source: /docs/agents-sdk/python/guides/dev-environment + destination: /docs/server-sdks/guides/dev-environment + - source: /docs/agents-sdk/python/guides/docker-kubernetes + destination: /docs/server-sdks/guides/docker-kubernetes + - source: /docs/agents-sdk/python/guides/exposing-agents + destination: /docs/server-sdks/guides/exposing-agents + - source: /docs/agents-sdk/python/guides/faq-bot + destination: /docs/server-sdks/guides/faq-bot + - source: /docs/agents-sdk/python/guides/hints + destination: /docs/server-sdks/guides/hints + - source: /docs/agents-sdk/python/guides/info-gatherer + destination: /docs/server-sdks/guides/info-gatherer + - source: /docs/agents-sdk/python/guides/installation + destination: /docs/server-sdks/guides/installation + - source: /docs/agents-sdk/python/guides/lifecycle + destination: /docs/server-sdks/guides/lifecycle + - source: /docs/agents-sdk/python/guides/local-development + destination: /docs/server-sdks/guides/local-development + - source: /docs/agents-sdk/python/guides/mapping-numbers + destination: /docs/server-sdks/guides/mapping-numbers + - source: /docs/agents-sdk/python/guides/mcp-gateway + destination: /docs/server-sdks/guides/mcp-gateway + - source: /docs/agents-sdk/python/guides/multi-agent + destination: /docs/server-sdks/guides/multi-agent + - source: /docs/agents-sdk/python/guides/native-functions + destination: /docs/server-sdks/guides/native-functions + - source: /docs/agents-sdk/python/guides/parameters + destination: /docs/server-sdks/guides/parameters + - source: /docs/agents-sdk/python/guides/phone-numbers + destination: /docs/server-sdks/guides/phone-numbers + - source: /docs/agents-sdk/python/guides/production + destination: /docs/server-sdks/guides/production + - source: /docs/agents-sdk/python/guides/prompts-pom + destination: /docs/server-sdks/guides/prompts-pom + - source: /docs/agents-sdk/python/guides/quickstart + destination: /docs/server-sdks/guides/quickstart + - source: /docs/agents-sdk/python/guides/receptionist + destination: /docs/server-sdks/guides/receptionist + - source: /docs/agents-sdk/python/guides/result-actions + destination: /docs/server-sdks/guides/result-actions + - source: /docs/agents-sdk/python/guides/search-knowledge + destination: /docs/server-sdks/guides/search-knowledge + - source: /docs/agents-sdk/python/guides/security + destination: /docs/server-sdks/guides/security + - source: /docs/agents-sdk/python/guides/serverless + destination: /docs/server-sdks/guides/serverless + - source: /docs/agents-sdk/python/guides/skill-config + destination: /docs/server-sdks/guides/skill-config + - source: /docs/agents-sdk/python/guides/state-management + destination: /docs/server-sdks/guides/state-management + - source: /docs/agents-sdk/python/guides/static-vs-dynamic + destination: /docs/server-sdks/guides/static-vs-dynamic + - source: /docs/agents-sdk/python/guides/survey + destination: /docs/server-sdks/guides/survey + - source: /docs/agents-sdk/python/guides/swaig + destination: /docs/server-sdks/guides/swaig + - source: /docs/agents-sdk/python/guides/swml + destination: /docs/server-sdks/guides/swml + - source: /docs/agents-sdk/python/guides/testing + destination: /docs/server-sdks/guides/testing + - source: /docs/agents-sdk/python/guides/troubleshooting + destination: /docs/server-sdks/guides/troubleshooting + - source: /docs/agents-sdk/python/guides/understanding-skills + destination: /docs/server-sdks/guides/understanding-skills + - source: /docs/agents-sdk/python/guides/voice-language + destination: /docs/server-sdks/guides/voice-language + - source: /docs/agents-sdk/python/reference/agent-base + destination: /docs/server-sdks/reference/python/agents/agent-base + - source: /docs/agents-sdk/python/reference/ai-parameters-reference + destination: /docs/server-sdks/guides/ai-parameters + - source: /docs/agents-sdk/python/reference/cli-sw-agent-init + destination: /docs/server-sdks/reference/python/agents/cli/sw-agent-init + - source: /docs/agents-sdk/python/reference/cli-sw-search + destination: /docs/server-sdks/reference/python/agents/cli/sw-search + - source: /docs/agents-sdk/python/reference/cli-swaig-test + destination: /docs/server-sdks/reference/python/agents/cli/swaig-test + - source: /docs/agents-sdk/python/reference/configuration + destination: /docs/server-sdks/reference/python/agents/configuration + - source: /docs/agents-sdk/python/reference/contexts + destination: /docs/server-sdks/reference/python/agents/context-builder + - source: /docs/agents-sdk/python/reference/data-map + destination: /docs/server-sdks/reference/python/agents/data-map + - source: /docs/agents-sdk/python/reference/environment-variables + destination: /docs/server-sdks/reference/python/agents/configuration/environment-variables + - source: /docs/agents-sdk/python/reference/function-result + destination: /docs/server-sdks/reference/python/agents/function-result + - source: /docs/agents-sdk/python/reference/skill-base + destination: /docs/server-sdks/reference/python/agents/skill-base + - source: /docs/agents-sdk/python/reference/swaig-function + destination: /docs/server-sdks/reference/python/agents/swaig-function + - source: /docs/agents-sdk/python/reference/swml-schema + destination: /docs/server-sdks/guides/swml + - source: /docs/agents-sdk/python/reference/swml-service + destination: /docs/server-sdks/reference/python/agents/swml-service + - source: /docs/agents-sdk/python/reference/troubleshooting + destination: /docs/server-sdks/guides/troubleshooting + - source: /docs/agents-sdk/quickstart + destination: /docs/server-sdks/guides/quickstart + - source: /docs/agents-sdk/security + destination: /docs/server-sdks/guides/security + - source: /docs/agents-sdk/signalwire-integration/account-setup + destination: /docs/server-sdks/guides/account-setup + - source: /docs/agents-sdk/signalwire-integration/mapping-numbers + destination: /docs/server-sdks/guides/mapping-numbers + - source: /docs/agents-sdk/signalwire-integration/phone-numbers + destination: /docs/server-sdks/guides/phone-numbers + - source: /docs/agents-sdk/signalwire-integration/testing + destination: /docs/server-sdks/guides/testing + - source: /docs/agents-sdk/signalwire-integration/troubleshooting + destination: /docs/server-sdks/guides/troubleshooting + - source: /docs/agents-sdk/skills/adding-skills + destination: /docs/server-sdks/guides/adding-skills + - source: /docs/agents-sdk/skills/builtin-skills + destination: /docs/server-sdks/guides/builtin-skills + - source: /docs/agents-sdk/skills/custom + destination: /docs/server-sdks/guides/custom + - source: /docs/agents-sdk/skills/skill-config + destination: /docs/server-sdks/guides/skill-config + - source: /docs/agents-sdk/skills/understanding-skills + destination: /docs/server-sdks/guides/understanding-skills + - source: /docs/agents-sdk/swaig-functions/data-map + destination: /docs/server-sdks/guides/data-map + - source: /docs/agents-sdk/swaig-functions/datamap + destination: /docs/server-sdks/guides/data-map + - source: /docs/agents-sdk/swaig-functions/defining-functions + destination: /docs/server-sdks/guides/defining-functions + - source: /docs/agents-sdk/swaig-functions/native-functions + destination: /docs/server-sdks/guides/native-functions + - source: /docs/agents-sdk/swaig-functions/parameters + destination: /docs/server-sdks/guides/parameters + - source: /docs/agents-sdk/swaig-functions/result-actions + destination: /docs/server-sdks/guides/result-actions + - source: /docs/agents-sdk/swaig-functions/results-actions + destination: /docs/server-sdks/guides/result-actions + - source: /docs/server-sdk + destination: /docs/server-sdks + - source: /docs/server-sdk/:slug* + destination: /docs/server-sdks/:slug* + # Browser SDK v3 guides removed (v3 is deprecated); point old guide URLs at + # the v4 migration guide, which covers the v3->v4 API mapping and flags the + # features v4 does not implement yet. These must precede the general + # /docs/browser-sdk/js/:slug* wildcard below, which would otherwise send + # guide paths into the now-deleted v3 guides tree. + - source: /docs/browser-sdk/v3/js/guides + destination: /docs/browser-sdk/guides/migrate-from-v3 + - source: /docs/browser-sdk/v3/js/guides/:slug* + destination: /docs/browser-sdk/guides/migrate-from-v3 + - source: /docs/browser-sdk/js/guides + destination: /docs/browser-sdk/guides/migrate-from-v3 + - source: /docs/browser-sdk/js/guides/:slug* + destination: /docs/browser-sdk/guides/migrate-from-v3 + + - source: /docs/browser-sdk/js + destination: /docs/browser-sdk/v3/js + - source: /docs/browser-sdk/js/:slug* + destination: /docs/browser-sdk/v3/js/:slug* + - source: /docs/browser-sdk/click-to-call + destination: /docs/browser-sdk/v3/click-to-call + - source: /docs/browser-sdk/click-to-call/:slug* + destination: /docs/browser-sdk/v3/click-to-call/:slug* + + # The TypeScript SDK removed the Twilio-compatible LAML REST namespace + # (client.compat); point its old reference pages at the REST client overview. + - source: /docs/server-sdks/reference/typescript/rest/compat + destination: /docs/server-sdks/reference/typescript/rest + - source: /docs/server-sdks/reference/typescript/rest/compat/:slug* + destination: /docs/server-sdks/reference/typescript/rest + + # The SWMLService `onRequest` override hook is now protected (renamed + # `buildSwmlForRequest`) and no longer documented; point its old page URL at + # the public equivalent, `setOnRequestCallback`. + - source: /docs/server-sdks/reference/typescript/agents/swml-service/on-request + destination: /docs/server-sdks/reference/typescript/agents/swml-service/set-on-request-callback + + # SwmlBuilder getDocument()/renderDocument() were removed from the SDK in + # favor of the Python-parity names build()/render(). + - source: /docs/server-sdks/reference/typescript/agents/swml-builder/get-document + destination: /docs/server-sdks/reference/typescript/agents/swml-builder/build + - source: /docs/server-sdks/reference/typescript/agents/swml-builder/render-document + destination: /docs/server-sdks/reference/typescript/agents/swml-builder/render + + # The Python SDK removed its Twilio-compatibility REST namespace + # (`client.compat`, signalwire-python 3d08c96); the pages that documented it + # are gone. Send old URLs to the Python REST overview. + - source: /docs/server-sdks/reference/python/rest/compat + destination: /docs/server-sdks/reference/python/rest + - source: /docs/server-sdks/reference/python/rest/compat/:slug* + destination: /docs/server-sdks/reference/python/rest + + # The prompt writing techniques guide duplicated the prompt engineering + # overview; the additive parts were merged into it and the page removed. + - source: /docs/platform/ai/prompt-engineering/best-practices + destination: /docs/platform/ai/prompt-engineering + + # Prompt surfaces now live in the consolidated prompt engineering guide. + - source: /docs/platform/ai/prompt-engineering/where-to-apply + destination: /docs/platform/ai/prompt-engineering + + # The VAPI inbound and outbound guides were merged into one integration guide. + - source: /docs/platform/ai/vapi/inbound + destination: /docs/platform/ai/vapi + - source: /docs/platform/ai/vapi/outbound + destination: /docs/platform/ai/vapi + + # SWML methods reorganized into calling/ and messaging/ subsections. + # The old methods overview lived at /docs/swml/reference, which was + # entirely calling-flavored — point it at the new calling overview. + - source: /docs/swml/reference + destination: /docs/swml/reference/calling + + # Legacy SWML methods (#526): map renamed verbs and merged property pages + # directly to their current reference, avoiding an extra hop or a 404. + - source: /docs/swml/methods + destination: /docs/swml/reference/calling + - source: /docs/swml/methods/ai + destination: /docs/swml/reference/calling/ai + - source: /docs/swml/methods/ai/hints + destination: /docs/swml/reference/calling/ai + - source: /docs/swml/methods/ai/languages + destination: /docs/swml/reference/calling/ai/languages + - source: /docs/swml/methods/ai/languages/params + destination: /docs/swml/reference/calling/ai/languages + - source: /docs/swml/methods/ai/params + destination: /docs/swml/reference/calling/ai/params + - source: /docs/swml/methods/ai/params/conscience + destination: /docs/swml/reference/calling/ai/params + - source: /docs/swml/methods/ai/params/hold-music + destination: /docs/swml/reference/calling/ai/params + - source: /docs/swml/methods/ai/params/hold_music + destination: /docs/swml/reference/calling/ai/params + - source: /docs/swml/methods/ai/params/interrupt-prompt + destination: /docs/swml/reference/calling/ai/params + - source: /docs/swml/methods/ai/params/interrupt_prompt + destination: /docs/swml/reference/calling/ai/params + - source: /docs/swml/methods/ai/post-prompt + destination: /docs/swml/reference/calling/ai + - source: /docs/swml/methods/ai/post-prompt-url + destination: /docs/swml/reference/calling/ai + - source: /docs/swml/methods/ai/post_prompt + destination: /docs/swml/reference/calling/ai + - source: /docs/swml/methods/ai/post_prompt_url + destination: /docs/swml/reference/calling/ai + - source: /docs/swml/methods/ai/prompt + destination: /docs/swml/reference/calling/ai/prompt + - source: /docs/swml/methods/ai/prompt/contexts + destination: /docs/swml/reference/calling/ai/prompt + - source: /docs/swml/methods/ai/prompt/contexts/steps + destination: /docs/swml/reference/calling/ai/prompt + - source: /docs/swml/methods/ai/prompt/pom + destination: /docs/swml/reference/calling/ai/prompt + - source: /docs/swml/methods/ai/pronounce + destination: /docs/swml/reference/calling/ai + - source: /docs/swml/methods/ai/swaig + destination: /docs/swml/reference/calling/ai/swaig + - source: /docs/swml/methods/ai/swaig/defaults + destination: /docs/swml/reference/calling/ai/swaig + - source: /docs/swml/methods/ai/swaig/defaults/web-hook-url + destination: /docs/swml/reference/calling/ai/swaig + - source: /docs/swml/methods/ai/swaig/defaults/web_hook_url + destination: /docs/swml/reference/calling/ai/swaig + - source: /docs/swml/methods/ai/swaig/functions + destination: /docs/swml/reference/calling/ai/swaig/functions + - source: /docs/swml/methods/ai/swaig/functions/data-map + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/data-map/expressions + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/data-map/output + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/data-map/webhooks + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/data-map/webhooks/foreach + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/data_map + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/data_map/expressions + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/data_map/output + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/data_map/webhooks + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/data_map/webhooks/foreach + destination: /docs/swml/reference/calling/ai/swaig/functions/data-map + - source: /docs/swml/methods/ai/swaig/functions/fillers + destination: /docs/swml/reference/calling/ai/swaig/functions + - source: /docs/swml/methods/ai/swaig/functions/parameters + destination: /docs/swml/reference/calling/ai/swaig/functions/parameters + - source: /docs/swml/methods/ai/swaig/functions/web-hook-url + destination: /docs/swml/reference/calling/ai/swaig/functions + - source: /docs/swml/methods/ai/swaig/functions/web_hook_url + destination: /docs/swml/reference/calling/ai/swaig/functions + - source: /docs/swml/methods/ai/swaig/includes + destination: /docs/swml/reference/calling/ai/swaig/includes + - source: /docs/swml/methods/ai/swaig/internal-fillers + destination: /docs/swml/reference/calling/ai/swaig + - source: /docs/swml/methods/ai/swaig/internal_fillers + destination: /docs/swml/reference/calling/ai/swaig + - source: /docs/swml/methods/ai/swaig/native-functions + destination: /docs/swml/reference/calling/ai/swaig + - source: /docs/swml/methods/ai/swaig/native_functions + destination: /docs/swml/reference/calling/ai/swaig + - source: /docs/swml/methods/amazon-bedrock + destination: /docs/swml/reference/calling/amazon-bedrock + - source: /docs/swml/methods/amazon-bedrock/params + destination: /docs/swml/reference/calling/amazon-bedrock/params + - source: /docs/swml/methods/amazon-bedrock/post-prompt + destination: /docs/swml/reference/calling/amazon-bedrock + - source: /docs/swml/methods/amazon-bedrock/post-prompt-url + destination: /docs/swml/reference/calling/amazon-bedrock + - source: /docs/swml/methods/amazon-bedrock/prompt + destination: /docs/swml/reference/calling/amazon-bedrock/prompt + - source: /docs/swml/methods/amazon-bedrock/prompt/pom + destination: /docs/swml/reference/calling/amazon-bedrock/prompt + - source: /docs/swml/methods/amazon-bedrock/swaig + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/amazon-bedrock/swaig/defaults + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/amazon-bedrock/swaig/defaults/web-hook-url + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/amazon-bedrock/swaig/functions + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions + - source: /docs/swml/methods/amazon-bedrock/swaig/functions/data-map + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon-bedrock/swaig/functions/data-map/expressions + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon-bedrock/swaig/functions/data-map/output + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon-bedrock/swaig/functions/data-map/webhooks + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon-bedrock/swaig/functions/data-map/webhooks/foreach + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon-bedrock/swaig/functions/parameters + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/parameters + - source: /docs/swml/methods/amazon-bedrock/swaig/functions/web-hook-url + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions + - source: /docs/swml/methods/amazon-bedrock/swaig/includes + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/amazon-bedrock/swaig/native-functions + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/amazon_bedrock + destination: /docs/swml/reference/calling/amazon-bedrock + - source: /docs/swml/methods/amazon_bedrock/params + destination: /docs/swml/reference/calling/amazon-bedrock/params + - source: /docs/swml/methods/amazon_bedrock/post_prompt + destination: /docs/swml/reference/calling/amazon-bedrock + - source: /docs/swml/methods/amazon_bedrock/post_prompt_url + destination: /docs/swml/reference/calling/amazon-bedrock + - source: /docs/swml/methods/amazon_bedrock/prompt + destination: /docs/swml/reference/calling/amazon-bedrock/prompt + - source: /docs/swml/methods/amazon_bedrock/prompt/pom + destination: /docs/swml/reference/calling/amazon-bedrock/prompt + - source: /docs/swml/methods/amazon_bedrock/swaig + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/amazon_bedrock/swaig/defaults + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/amazon_bedrock/swaig/defaults/web_hook_url + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/amazon_bedrock/swaig/functions + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions + - source: /docs/swml/methods/amazon_bedrock/swaig/functions/data_map + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon_bedrock/swaig/functions/data_map/expressions + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon_bedrock/swaig/functions/data_map/output + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon_bedrock/swaig/functions/data_map/webhooks + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon_bedrock/swaig/functions/data_map/webhooks/foreach + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/data-map + - source: /docs/swml/methods/amazon_bedrock/swaig/functions/parameters + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions/parameters + - source: /docs/swml/methods/amazon_bedrock/swaig/functions/web_hook_url + destination: /docs/swml/reference/calling/amazon-bedrock/swaig/functions + - source: /docs/swml/methods/amazon_bedrock/swaig/includes + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/amazon_bedrock/swaig/native_functions + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + - source: /docs/swml/methods/answer + destination: /docs/swml/reference/calling/answer + - source: /docs/swml/methods/cond + destination: /docs/swml/reference/calling/cond + - source: /docs/swml/methods/connect + destination: /docs/swml/reference/calling/connect + - source: /docs/swml/methods/connect/headers + destination: /docs/swml/reference/calling/connect + - source: /docs/swml/methods/denoise + destination: /docs/swml/reference/calling/denoise + - source: /docs/swml/methods/detect-machine + destination: /docs/swml/reference/calling/detect-machine + - source: /docs/swml/methods/detect_machine + destination: /docs/swml/reference/calling/detect-machine + - source: /docs/swml/methods/enter-queue + destination: /docs/swml/reference/calling/enter-queue + - source: /docs/swml/methods/enter_queue + destination: /docs/swml/reference/calling/enter-queue + - source: /docs/swml/methods/execute + destination: /docs/swml/reference/calling/execute + - source: /docs/swml/methods/goto + destination: /docs/swml/reference/calling/goto + - source: /docs/swml/methods/hangup + destination: /docs/swml/reference/calling/hangup + - source: /docs/swml/methods/join-conference + destination: /docs/swml/reference/calling/join-conference + - source: /docs/swml/methods/join-room + destination: /docs/swml/reference/calling/join-room + - source: /docs/swml/methods/join_conference + destination: /docs/swml/reference/calling/join-conference + - source: /docs/swml/methods/join_room + destination: /docs/swml/reference/calling/join-room + - source: /docs/swml/methods/label + destination: /docs/swml/reference/calling/label + - source: /docs/swml/methods/live-transcribe + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live-transcribe/action + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live-transcribe/action/start + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live-transcribe/action/stop + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live-transcribe/action/summarize + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live-translate + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live-translate/action + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live-translate/action/inject + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live-translate/action/start + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live-translate/action/stop + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live-translate/action/summarize + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live_transcribe + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live_transcribe/action + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live_transcribe/action/start + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live_transcribe/action/stop + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live_transcribe/action/summarize + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/methods/live_translate + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live_translate/action + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live_translate/action/inject + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live_translate/action/start + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live_translate/action/stop + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/live_translate/action/summarize + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/methods/pay + destination: /docs/swml/reference/calling/pay + - source: /docs/swml/methods/pay/parameters + destination: /docs/swml/reference/calling/pay + - source: /docs/swml/methods/pay/payment-connector-url + destination: /docs/swml/reference/calling/pay + - source: /docs/swml/methods/pay/payment_connector_url + destination: /docs/swml/reference/calling/pay + - source: /docs/swml/methods/pay/prompts + destination: /docs/swml/reference/calling/pay + - source: /docs/swml/methods/pay/prompts/actions + destination: /docs/swml/reference/calling/pay + - source: /docs/swml/methods/play + destination: /docs/swml/reference/calling/play + - source: /docs/swml/methods/prompt + destination: /docs/swml/reference/calling/prompt + - source: /docs/swml/methods/receive-fax + destination: /docs/swml/reference/calling/receive-fax + - source: /docs/swml/methods/receive_fax + destination: /docs/swml/reference/calling/receive-fax + - source: /docs/swml/methods/record + destination: /docs/swml/reference/calling/record + - source: /docs/swml/methods/record-call + destination: /docs/swml/reference/calling/record-call + - source: /docs/swml/methods/record_call + destination: /docs/swml/reference/calling/record-call + - source: /docs/swml/methods/request + destination: /docs/swml/reference/calling/request + - source: /docs/swml/methods/return + destination: /docs/swml/reference/calling/return + - source: /docs/swml/methods/send-digits + destination: /docs/swml/reference/calling/send-digits + - source: /docs/swml/methods/send-fax + destination: /docs/swml/reference/calling/send-fax + - source: /docs/swml/methods/send-sms + destination: /docs/swml/reference/calling/send-sms + - source: /docs/swml/methods/send_digits + destination: /docs/swml/reference/calling/send-digits + - source: /docs/swml/methods/send_fax + destination: /docs/swml/reference/calling/send-fax + - source: /docs/swml/methods/send_sms + destination: /docs/swml/reference/calling/send-sms + - source: /docs/swml/methods/set + destination: /docs/swml/reference/calling/set + - source: /docs/swml/methods/sip-refer + destination: /docs/swml/reference/calling/sip-refer + - source: /docs/swml/methods/sip_refer + destination: /docs/swml/reference/calling/sip-refer + - source: /docs/swml/methods/sleep + destination: /docs/swml/reference/calling/sleep + - source: /docs/swml/methods/stop-denoise + destination: /docs/swml/reference/calling/stop-denoise + - source: /docs/swml/methods/stop-record-call + destination: /docs/swml/reference/calling/stop-record-call + - source: /docs/swml/methods/stop-tap + destination: /docs/swml/reference/calling/stop-tap + - source: /docs/swml/methods/stop_denoise + destination: /docs/swml/reference/calling/stop-denoise + - source: /docs/swml/methods/stop_record_call + destination: /docs/swml/reference/calling/stop-record-call + - source: /docs/swml/methods/stop_tap + destination: /docs/swml/reference/calling/stop-tap + - source: /docs/swml/methods/switch + destination: /docs/swml/reference/calling/switch + - source: /docs/swml/methods/tap + destination: /docs/swml/reference/calling/tap + - source: /docs/swml/methods/transfer + destination: /docs/swml/reference/calling/transfer + - source: /docs/swml/methods/unset + destination: /docs/swml/reference/calling/unset + - source: /docs/swml/methods/user-event + destination: /docs/swml/reference/calling/user-event + - source: /docs/swml/methods/user_event + destination: /docs/swml/reference/calling/user-event + + # SWAIG.defaults never had its own page; it is documented on the SWAIG page (#526). + - source: /docs/swml/reference/ai/swaig/defaults + destination: /docs/swml/reference/calling/ai/swaig + - source: /docs/swml/reference/calling/ai/swaig/defaults + destination: /docs/swml/reference/calling/ai/swaig + + # Folder-style methods with nested sub-pages — wildcard catches every old child path. + - source: /docs/swml/reference/ai + destination: /docs/swml/reference/calling/ai + - source: /docs/swml/reference/ai/:slug* + destination: /docs/swml/reference/calling/ai/:slug* + - source: /docs/swml/reference/amazon-bedrock + destination: /docs/swml/reference/calling/amazon-bedrock + - source: /docs/swml/reference/amazon-bedrock/:slug* + destination: /docs/swml/reference/calling/amazon-bedrock/:slug* + + # amazon_bedrock reads only SWAIG.functions and SWAIG.defaults.web_hook_url, so the + # includes page documented a feature the engine never had. Removed; point it at SWAIG. + - source: /docs/swml/reference/calling/amazon-bedrock/swaig/includes + destination: /docs/swml/reference/calling/amazon-bedrock/swaig + + # Top-level calling method slugs (one redirect per method — a blanket + # /docs/swml/reference/:slug wildcard would incorrectly catch /messaging/* too). + - source: /docs/swml/reference/answer + destination: /docs/swml/reference/calling/answer + - source: /docs/swml/reference/cond + destination: /docs/swml/reference/calling/cond + - source: /docs/swml/reference/connect + destination: /docs/swml/reference/calling/connect + - source: /docs/swml/reference/denoise + destination: /docs/swml/reference/calling/denoise + - source: /docs/swml/reference/detect-machine + destination: /docs/swml/reference/calling/detect-machine + - source: /docs/swml/reference/enter-queue + destination: /docs/swml/reference/calling/enter-queue + - source: /docs/swml/reference/execute + destination: /docs/swml/reference/calling/execute + - source: /docs/swml/reference/goto + destination: /docs/swml/reference/calling/goto + - source: /docs/swml/reference/hangup + destination: /docs/swml/reference/calling/hangup + - source: /docs/swml/reference/join-conference + destination: /docs/swml/reference/calling/join-conference + - source: /docs/swml/reference/join-room + destination: /docs/swml/reference/calling/join-room + - source: /docs/swml/reference/label + destination: /docs/swml/reference/calling/label + - source: /docs/swml/reference/live-transcribe + destination: /docs/swml/reference/calling/live-transcribe + - source: /docs/swml/reference/live-translate + destination: /docs/swml/reference/calling/live-translate + - source: /docs/swml/reference/pay + destination: /docs/swml/reference/calling/pay + - source: /docs/swml/reference/play + destination: /docs/swml/reference/calling/play + - source: /docs/swml/reference/prompt + destination: /docs/swml/reference/calling/prompt + - source: /docs/swml/reference/receive-fax + destination: /docs/swml/reference/calling/receive-fax + - source: /docs/swml/reference/record + destination: /docs/swml/reference/calling/record + - source: /docs/swml/reference/record-call + destination: /docs/swml/reference/calling/record-call + - source: /docs/swml/reference/request + destination: /docs/swml/reference/calling/request + - source: /docs/swml/reference/return + destination: /docs/swml/reference/calling/return + - source: /docs/swml/reference/send-digits + destination: /docs/swml/reference/calling/send-digits + - source: /docs/swml/reference/send-fax + destination: /docs/swml/reference/calling/send-fax + - source: /docs/swml/reference/send-sms + destination: /docs/swml/reference/calling/send-sms + - source: /docs/swml/reference/set + destination: /docs/swml/reference/calling/set + - source: /docs/swml/reference/sip-refer + destination: /docs/swml/reference/calling/sip-refer + - source: /docs/swml/reference/sleep + destination: /docs/swml/reference/calling/sleep + - source: /docs/swml/reference/stop-denoise + destination: /docs/swml/reference/calling/stop-denoise + - source: /docs/swml/reference/stop-record-call + destination: /docs/swml/reference/calling/stop-record-call + - source: /docs/swml/reference/stop-tap + destination: /docs/swml/reference/calling/stop-tap + - source: /docs/swml/reference/switch + destination: /docs/swml/reference/calling/switch + - source: /docs/swml/reference/tap + destination: /docs/swml/reference/calling/tap + - source: /docs/swml/reference/transfer + destination: /docs/swml/reference/calling/transfer + - source: /docs/swml/reference/unset + destination: /docs/swml/reference/calling/unset + - source: /docs/swml/reference/user-event + destination: /docs/swml/reference/calling/user-event + + # The SIP Domain Applications page was reframed and renamed to SIP Credentials. + - source: /docs/platform/voice/sip/domain-applications + destination: /docs/platform/voice/sip/sip-credentials + + # The AI platform page was merged into the AI overview. + - source: /docs/platform/ai/capabilities + destination: /docs/platform/ai + + # The no-code agents guide documented the Dashboard UI and was removed; + # the AI overview is the closest replacement. + - source: /docs/platform/ai/no-code-agents + destination: /docs/platform/ai + + # Phone number management references are grouped by customer workflow. + - source: /docs/apis/rest/phone-numbers/retrieve-caller-id-name + destination: /docs/apis/rest/caller-id-name/retrieve-caller-id-name + - source: /docs/apis/rest/phone-numbers/request-caller-id-name + destination: /docs/apis/rest/caller-id-name/request-caller-id-name + - source: /docs/apis/rest/phone-numbers/clear-caller-id-name + destination: /docs/apis/rest/caller-id-name/clear-caller-id-name + - source: /docs/apis/rest/phone-numbers/assign-e-911-address + destination: /docs/apis/rest/e-911-addresses/assign-e-911-address + - source: /docs/apis/rest/phone-numbers/remove-e-911-address + destination: /docs/apis/rest/e-911-addresses/remove-e-911-address + - source: /docs/apis/rest/phone-numbers/assign-resource-phone-route + destination: /docs/apis/rest/phone-routes/assign-resource-phone-route + - source: /docs/apis/rest/phone-numbers/lookup-phone-number + destination: /docs/apis/rest/phone-number-lookup/lookup-phone-number + - source: /docs/apis/rest/number-group-membership/list-number-group-memberships + destination: /docs/apis/rest/number-groups/list-number-group-memberships + - source: /docs/apis/rest/number-group-membership/create-number-group-membership + destination: /docs/apis/rest/number-groups/create-number-group-membership + - source: /docs/apis/rest/number-group-membership/retrieve-number-group-membership + destination: /docs/apis/rest/number-groups/retrieve-number-group-membership + - source: /docs/apis/rest/number-group-membership/delete-number-group-membership + destination: /docs/apis/rest/number-groups/delete-number-group-membership + + # Webhook reference pages moved out of their per-resource sections into one + # top-level Webhooks section. A callback like the SWAIG tool webhook fires for + # voice AI, Amazon Bedrock, sidecar agents, and text conversations alike, so + # filing it under Calls made a shared payload look channel-specific. + # One entry per moved page — the set is closed, since the old sections no + # longer exist and no new URL can appear beneath them. + - source: /docs/apis/rest/calls/webhooks/ai-swaig-tool-webhook + destination: /docs/apis/rest/webhooks/ai-swaig-tool-webhook + - source: /docs/apis/rest/calls/webhooks/swaig-signature-request + destination: /docs/apis/rest/webhooks/swaig-signature-request + - source: /docs/apis/rest/calls/webhooks/ai-post-prompt-callback + destination: /docs/apis/rest/webhooks/ai-post-prompt-callback + - source: /docs/apis/rest/calls/webhooks/ai-debug-webhook + destination: /docs/apis/rest/webhooks/ai-debug-webhook + - source: /docs/apis/rest/calls/webhooks/bedrock-swaig-tool-webhook + destination: /docs/apis/rest/webhooks/bedrock-swaig-tool-webhook + - source: /docs/apis/rest/calls/webhooks/bedrock-post-prompt-callback + destination: /docs/apis/rest/webhooks/bedrock-post-prompt-callback + - source: /docs/apis/rest/calls/webhooks/ai-sidecar-callback + destination: /docs/apis/rest/webhooks/ai-sidecar-callback + - source: /docs/apis/rest/calls/webhooks/ai-sidecar-swaig-tool-webhook + destination: /docs/apis/rest/webhooks/ai-sidecar-swaig-tool-webhook + - source: /docs/apis/rest/calls/webhooks/transcribe-status-callback + destination: /docs/apis/rest/webhooks/transcribe-status-callback + - source: /docs/apis/rest/calls/webhooks/stream-status-callback + destination: /docs/apis/rest/webhooks/stream-status-callback + - source: /docs/apis/rest/messages/webhooks/message-status-callback + destination: /docs/apis/rest/webhooks/message-status-callback + - source: /docs/apis/rest/campaign-registry/webhooks/ten-dlc-status-callback + destination: /docs/apis/rest/webhooks/ten-dlc-status-callback + - source: /docs/apis/rest/swml-webhook/webhooks/inbound-call-webhook + destination: /docs/apis/rest/webhooks/inbound-call-webhook + - source: /docs/apis/rest/swml-webhook/webhooks/inbound-message-webhook + destination: /docs/apis/rest/webhooks/inbound-message-webhook + + # Each per-resource Webhooks section also answered on its own URL, returning a + # 307 to its first child. That landing is generated from the section, so it + # disappears with it — these four need entries of their own. Each points at the + # new location of the page it lands on today, so the destination is a real page + # in the same channel rather than an arbitrary first child. + - source: /docs/apis/rest/calls/webhooks + destination: /docs/apis/rest/webhooks/transcribe-status-callback + - source: /docs/apis/rest/messages/webhooks + destination: /docs/apis/rest/webhooks/message-status-callback + - source: /docs/apis/rest/campaign-registry/webhooks + destination: /docs/apis/rest/webhooks/ten-dlc-status-callback + - source: /docs/apis/rest/swml-webhook/webhooks + destination: /docs/apis/rest/webhooks/inbound-call-webhook + + # Tools section removed 2026-09-22. SWSH and WireStarter are now documented + # only by their GitHub READMEs, so those two leave the docs site. The section + # overview had no equivalent page and goes to the Platform home. + - source: /docs/platform/tools + destination: /docs/platform + - source: /docs/platform/swsh + destination: https://github.com/signalwire/swsh + - source: /docs/platform/wirestarter + destination: https://github.com/signalwire/WireStarter diff --git a/fern/snippets/common/call-fabric/resource-addresses.md b/fern/snippets/common/call-fabric/resource-addresses.md deleted file mode 100644 index 93158b9a2a..0000000000 --- a/fern/snippets/common/call-fabric/resource-addresses.md +++ /dev/null @@ -1,56 +0,0 @@ -{/* Shared component: Resource Addresses */} - -Each **Resource** is uniquely identified by its **Address**, allowing for precise targeting and interaction within the Call Fabric ecosystem. -This simplifies the development process by providing a standardized way to handle different communication elements, and -enhances flexibility, as developers can interact with a wide range of communication tools using a unified approach. - - - -Resources can have **multiple addresses**, and addresses are **mutable**. -For instance, you can map a SWML script and a Video Room to the same Resource Address. -These addresses can be changed or deleted later as needed. - - - -## Types - -Call Fabric supports multiple address types to accommodate different communication protocols and use cases: - -- **Phone numbers**: Traditional phone numbers in E.164 format (e.g., `+14155551234`) that can be mapped to resources for PSTN connectivity. -- **SIP addresses**: SIP URIs for VoIP communications (e.g., `sip:user@domain.com`) enabling direct SIP endpoint connections. -- **Alias**: Custom names that provide alternative addressing for resources, making them easier to remember and use (e.g., `/support-queue` or `/main-conference`). - -Each address type follows the same context and naming conventions described below, allowing seamless integration across different communication channels. - -Each **Resource Address** has two components: - -- **Context**: Identifies the path of the address. Currently can be `public` or `private`. -- **Name**: By default the name of the address will be the name of the resource, however, - a user can also change or add an `alias` of an address. - -For example, the address for an `AI Agent` resource named `Alice-AI` in the `public` context would be `/public/Alice-AI`. -If you were to change the `alias` to `John-AI` the address would become `/public/John-AI`. - - -If you are interacting with a resource from within the same context, you can omit the context from the address. -For example, if you are interacting with a [Subscribers](/docs/platform/subscribers) resource named `Bob` from within the `private` context, -you can use the address `/Bob` instead of `/private/Bob`. - - -Once you have created a Resource, you can use the address to interact with it within the Call Fabric ecosystem. -Additionally, you can view the created resource in the `Resources` tab of the SignalWire Dashboard. -Here, you can view the address, type, and other details of the resource. - - - - - The Resources page of the SignalWire Dashboard. - - - - - - -The **My Resources** page lists each Resource's name, type, and last update time and provides search and type filters. - - diff --git a/fern/snippets/common/call-fabric/resource-contexts.md b/fern/snippets/common/call-fabric/resource-contexts.md index 12778e8c70..29121f60aa 100644 --- a/fern/snippets/common/call-fabric/resource-contexts.md +++ b/fern/snippets/common/call-fabric/resource-contexts.md @@ -1,13 +1,13 @@ {/* Shared component: Resource Contexts */} -`Contexts` in Call Fabric define the operational environment or 'scenario' under which +`Contexts` define the operational environment or 'scenario' under which [Resources](/docs/platform/call-fabric/resources) operate. They determine how resources are routed and interact with each other. -Every Space has two contexts: +Every Project starts with two contexts, and you can add named contexts of either access type from the Dashboard's Contexts page: - The `public` context exposes the Resource to anyone. - The `private` context exposes the Resource to [Subscribers](/docs/platform/subscribers). Use Contexts to structure and secure your communication flows -with granular control over how different elements within the Call Fabric interact and are exposed. +with granular control over how different Resources interact and are exposed. diff --git a/fern/snippets/common/call-fabric/resources-fyi-card.mdx b/fern/snippets/common/call-fabric/resources-fyi-card.mdx index a70510469c..a3aa0bf6c7 100644 --- a/fern/snippets/common/call-fabric/resources-fyi-card.mdx +++ b/fern/snippets/common/call-fabric/resources-fyi-card.mdx @@ -2,5 +2,5 @@ Learn more about Resources, the interoperable communications building blocks that interact with [Subscribers](/docs/platform/subscribers) - in SignalWire's Call Fabric architecture. + on SignalWire. diff --git a/fern/snippets/common/dashboard/_assign-resource-to-number.mdx b/fern/snippets/common/dashboard/_assign-resource-to-number.mdx new file mode 100644 index 0000000000..39e86aadd2 --- /dev/null +++ b/fern/snippets/common/dashboard/_assign-resource-to-number.mdx @@ -0,0 +1,16 @@ +{/* Shared component: assign a Resource as a phone number's call handler in the Dashboard */} + +Open **Phone Numbers**, select the number, and select **Edit Settings**. Under **Inbound Call +Settings**, select **Assign Resource**, choose the Resource, and save. To assign from the Resource +instead, open its **Addresses & Phone Numbers** tab, select **+ Add**, then **Phone Number**, and +pick a number you own. + + + + + +![A phone number's Edit page in the Dashboard showing the Assign Resource button under Inbound Call Settings](/assets/images/dashboard/phone-numbers/assign-resource-voice.webp) + + + + diff --git a/fern/snippets/common/dashboard/_resource-admonition.mdx b/fern/snippets/common/dashboard/_resource-admonition.mdx index 4c1c066863..c19ac68563 100644 --- a/fern/snippets/common/dashboard/_resource-admonition.mdx +++ b/fern/snippets/common/dashboard/_resource-admonition.mdx @@ -1,5 +1,5 @@ {/* Shared component: Resource admonition */} -[Resources](/docs/platform/resources) are the building blocks of SignalWire applications. They include AI Agents, SWML Scripts, cXML Scripts, SIP Endpoints, and more. +[Resources](/docs/platform/resources) are the building blocks of SignalWire applications. They include AI Agents, SWML Scripts, cXML Scripts, SIP Credentials, and more. diff --git a/fern/styles.css b/fern/styles.css index c411bf8256..27791b586c 100644 --- a/fern/styles.css +++ b/fern/styles.css @@ -294,6 +294,12 @@ a[href*="god.gw.postman.com"] > img { height: 100%; } +/* Fern renders custom icon files as , so currentColor can't inherit + the theme text color and the icon draws black. Invert it in dark mode. */ +.dark .fern-selection-item-icon img.fern-file-icon { + filter: invert(1); +} + /* --- Desktop (≥ 1024 px) --- */ @media (min-width: 1024px) { /* Dropdown panel — rounded corners, scroll when content exceeds viewport */ diff --git a/package.json b/package.json index 8027a94083..078c59699c 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ }, "devDependencies": { "@types/react": "^19.0.0", - "fern-api": "5.67.1", + "fern-api": "5.131.1", "js-yaml": "^4.1.0", "openapi-to-postmanv2": "6.0.1", "react": "^19.0.0" diff --git a/specs/compatibility-api/tokens/main.tsp b/specs/compatibility-api/tokens/main.tsp index 0105ac2b96..fab18bdedb 100644 --- a/specs/compatibility-api/tokens/main.tsp +++ b/specs/compatibility-api/tokens/main.tsp @@ -19,9 +19,11 @@ namespace CompatibilityAPI.Tokens { @summary("Generate a new API Token") @doc(""" Creates a project API token for server-side REST authentication within the project. It remains usable until you delete it or remove required permissions. Client applications should receive a service-specific Chat, PubSub, Room, or Subscriber Token instead. - + For the SignalWire REST API's project route, use [Create API token](/docs/apis/rest/project-tokens/create-token). + The response is the only place the token secret is returned. No later request, including [Update an API Token](/docs/compatibility-api/rest/tokens/update-token), can read it back. If you lose it, delete the token and create a new one. + ${tokenPermissions<"_Management_">} """) @post @@ -30,7 +32,7 @@ namespace CompatibilityAPI.Tokens { @header contentType: "application/x-www-form-urlencoded", @body body: CreateTokenRequest, ): - | TokenResponse + | CreateTokenResponse | CompatibilityStatusCode400 | CompatibilityStatusCode401 | CompatibilityStatusCode422Token; @@ -40,6 +42,10 @@ namespace CompatibilityAPI.Tokens { @doc(""" Changes the name or enabled permission categories of an existing project API token. For the SignalWire REST API's project route, use [Update API token](/docs/apis/rest/project-tokens/update-token). + The response contains the token's `id`, `name`, and `permissions` only. The token secret is returned once, by [Generate a new API Token](/docs/compatibility-api/rest/tokens/create-token), and cannot be retrieved afterwards. + + Updating a token does not rotate or reissue its secret. The existing secret keeps working after the update. + ${tokenPermissions<"_Management_">} """) @patch(#{ implicitOptionality: true }) diff --git a/specs/compatibility-api/tokens/models/core.tsp b/specs/compatibility-api/tokens/models/core.tsp index cdbb432319..69fea0664b 100644 --- a/specs/compatibility-api/tokens/models/core.tsp +++ b/specs/compatibility-api/tokens/models/core.tsp @@ -16,11 +16,11 @@ model TokenIdPath { @doc("API Token model.") model Token { - @doc("The unique identifier of the created API Token.") + @doc("The unique identifier of the API Token.") @example("ea14556a-984f-11ee-b9d1-0242ac120002") id: uuid; - @doc("The name of the created API Token.") + @doc("The name of the API Token.") @example("John Doe's Token") @minLength(1) name: string; @@ -28,8 +28,13 @@ model Token { @doc("The permissions enabled for this token.") @example(#["calling", "fax", "messaging"]) permissions: string[]; +} + +@doc("API Token model as returned when the token is created, including the token secret.") +model CreatedToken { + ...Token; - @doc("The API token that can be used along with the project ID for basic authentication.") + @doc("The API token secret, used as the password in HTTP Basic auth alongside the project ID. Returned only in this response and cannot be retrieved again; store it securely.") @example("swapi_0123456789ab0123456789ab0123456789ab") token: string; } diff --git a/specs/compatibility-api/tokens/models/responses.tsp b/specs/compatibility-api/tokens/models/responses.tsp index c047a3c1f0..971f5901a5 100644 --- a/specs/compatibility-api/tokens/models/responses.tsp +++ b/specs/compatibility-api/tokens/models/responses.tsp @@ -6,3 +6,8 @@ using TypeSpec.Http; model TokenResponse { ...Token; } + +@doc("Response returned when a token is created. This is the only response that includes the token secret.") +model CreateTokenResponse { + ...CreatedToken; +} diff --git a/specs/signalwire-rest/calling-api/calls/models/examples.tsp b/specs/signalwire-rest/calling-api/calls/models/examples.tsp index 31898c25ae..5e82faaff9 100644 --- a/specs/signalwire-rest/calling-api/calls/models/examples.tsp +++ b/specs/signalwire-rest/calling-api/calls/models/examples.tsp @@ -311,6 +311,7 @@ const detectCallExample = #{ id: callId, params: #{ control_id: "detect-control-1", + status_url: "https://example.com/webhooks/detection", detect: #{ type: DetectType.machine, params: #{ initial_timeout: 4.5, end_silence_timeout: 1.0 }, diff --git a/specs/signalwire-rest/calling-api/calls/models/requests.tsp b/specs/signalwire-rest/calling-api/calls/models/requests.tsp index 4c0a8f6f0e..e3d41eb6e5 100644 --- a/specs/signalwire-rest/calling-api/calls/models/requests.tsp +++ b/specs/signalwire-rest/calling-api/calls/models/requests.tsp @@ -516,8 +516,10 @@ model CallCreateParamsBase { @minValue(0) max_price_per_minute?: float64; - @doc("DTMF digits to send after the call is answered. Allowed characters: `0-9`, `A-D`, `*`, `#`, `w` (wait), `,` (pause).") + @doc("DTMF digits to send after the call is answered, at most 98 characters. Allowed characters: `0-9`, `A-D`, `*`, `#`, and the pauses `w` (0.5 seconds), `W` (1 second), and `,` (0.5 seconds). SignalWire waits 0.5 seconds after answer before sending the first digit.") @example("1234#") + @pattern("^[0-9A-Da-d*#wW,]{1,98}$") + @maxLength(98) send_digits?: string; @doc("Preferred FreeSWITCH region(s) for call routing. Must be drawn from the project's available regions. Accepts a single region or a priority-ordered array.") diff --git a/specs/signalwire-rest/fabric-api/_shared/enums.tsp b/specs/signalwire-rest/fabric-api/_shared/enums.tsp index 7e781635cb..18d5c9bebb 100644 --- a/specs/signalwire-rest/fabric-api/_shared/enums.tsp +++ b/specs/signalwire-rest/fabric-api/_shared/enums.tsp @@ -44,6 +44,7 @@ enum HandleCallsUsing { enum FabricResponseType { AiAgent: "ai_agent", + RemoteAiAgent: "remote_ai_agent", DialogflowAgent: "dialogflow_agent", CallFlow: "call_flow", SwmlWebhook: "swml_webhook", diff --git a/specs/signalwire-rest/fabric-api/resources/models/core.tsp b/specs/signalwire-rest/fabric-api/resources/models/core.tsp index 321eb31176..30ecf37120 100644 --- a/specs/signalwire-rest/fabric-api/resources/models/core.tsp +++ b/specs/signalwire-rest/fabric-api/resources/models/core.tsp @@ -8,3 +8,25 @@ model ResourcePathID { @path id: uuid; } + +model RemoteAIAgent { + @doc("Unique ID of the Remote AI Agent.") + @example("b2a4c6e8-1f3d-4a5b-9c7e-0d2f4a6b8c1e") + id: uuid; + + @doc("Name of the Remote AI Agent.") + @example("Support Agent") + name: string; + + @doc("URL of the agent you host. SignalWire requests the SWML document for each call from this URL.") + @example("https://agent.example.com/swml") + primary_request_url: url; + + @doc("URL SignalWire requests the SWML document from if the primary URL cannot be reached or fails.") + @example("https://agent.example.com/fallback") + fallback_request_url: url | null; + + @doc("URL that receives a JSON event when a call to this agent completes, with details of the finished call.") + @example("https://agent.example.com/status") + status_callback_url: url | null; +} diff --git a/specs/signalwire-rest/fabric-api/resources/models/responses.tsp b/specs/signalwire-rest/fabric-api/resources/models/responses.tsp index cae9487c49..6e85d22b04 100644 --- a/specs/signalwire-rest/fabric-api/resources/models/responses.tsp +++ b/specs/signalwire-rest/fabric-api/resources/models/responses.tsp @@ -55,6 +55,16 @@ model ResourceResponseAI is ResourceResponseBase { ai_agent: AIAgent; } +@summary("Remote AI Agent") +model ResourceResponseRemoteAIAgent is ResourceResponseBase { + @doc(RESPONSE_TYPE_DESC) + @example(FabricResponseType.RemoteAiAgent) + type: FabricResponseType.RemoteAiAgent; + + @doc("An object containing the response data of the Remote AI Agent") + remote_ai_agent: RemoteAIAgent; +} + @summary("Call Flow") model ResourceResponseCallFlow is ResourceResponseBase { @doc(RESPONSE_TYPE_DESC) @@ -188,6 +198,7 @@ model ResourceResponseConferenceRoom is ResourceResponseBase { @oneOf union ResourceResponse { ResourceResponseAI, + ResourceResponseRemoteAIAgent, ResourceResponseCallFlow, ResourceResponseCXMLWebhook, ResourceResponseCXMLScript, diff --git a/specs/signalwire-rest/relay-rest/recordings/models/core.tsp b/specs/signalwire-rest/relay-rest/recordings/models/core.tsp index fe366ca1e4..86c8c8cfd7 100644 --- a/specs/signalwire-rest/relay-rest/recordings/models/core.tsp +++ b/specs/signalwire-rest/relay-rest/recordings/models/core.tsp @@ -30,8 +30,8 @@ model RecordingBase { @example(2) duration_in_seconds: int32; - @doc("Error code if the recording failed.") - error_code?: string; + @doc("Error code if the recording failed, and `null` otherwise.") + error_code: string | null; @doc("Price of the recording.") @example(0.05) @@ -41,12 +41,19 @@ model RecordingBase { @example("USD") price_unit: string; - @doc("Status of the recording.") - @example("completed") + @doc(""" + Status of the recording. One of `recording`, `paused`, `finished`, or `no_input`. + `no_input` means audio wasn't detected before the timeout. + The media is only downloadable once the status is `finished`. + """) + @example("finished") status: string; - @doc("URL of the recording file.") - @example("https://example.com/recording.mp3") + @doc(""" + Path to the recording, relative to your Space URL. The full URL returns the recording's JSON metadata. + Add a format suffix to download the recording: `.wav` or `.mp3`. + """) + @example("/api/relay/rest/recordings/d3444402-7b43-4512-8735-9d5e1f387814") url: string; @doc("Indicates whether the recording is stereo.") diff --git a/specs/swml/calling/Methods/ai/ai_languages.tsp b/specs/swml/calling/Methods/ai/ai_languages.tsp index aeb92cc216..b84d41672c 100644 --- a/specs/swml/calling/Methods/ai/ai_languages.tsp +++ b/specs/swml/calling/Methods/ai/ai_languages.tsp @@ -36,11 +36,20 @@ model LanguagesBase { @example("fr-FR") listen_language?: string | string[]; + // hidden 2026-10-05 + // @doc(""" + // Voice to use for the language. String format: `.`, with an optional + // `:` suffix for engines that offer a choice of model. + // Select engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `cartesia`, `deepgram`, `rime`, + // `inworld`, `minimax`, `groq-tts`, `mistral`, `grok`, `smallest`, `fish`, or `speechify`. + // For example, `gcloud.fr-FR-Neural2-B` or `elevenlabs.rachel:eleven_flash_v2_5`. + // Always name the engine: a bare voice id resolves against a default engine that can change. + // """) @doc(""" Voice to use for the language. String format: `.`, with an optional `:` suffix for engines that offer a choice of model. Select engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `cartesia`, `deepgram`, `rime`, - `inworld`, `minimax`, `groq-tts`, `mistral`, `grok`, `smallest`, `fish`, or `speechify`. + `inworld`, `groq-tts`, `mistral`, `grok`, `smallest`, or `fish`. For example, `gcloud.fr-FR-Neural2-B` or `elevenlabs.rachel:eleven_flash_v2_5`. Always name the engine: a bare voice id resolves against a default engine that can change. """) @@ -55,20 +64,35 @@ model LanguagesBase { @example("coda") `model`?: string; + // hidden 2026-10-05 + // @doc(""" + // Lets the AI vary its emotion as it speaks. A global emotion, or specific emotions for certain + // topics, can be set within the prompt of the AI. + // IMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia) and [`MiniMax`](/docs/platform/voice/tts/minimax) TTS engines. + // For a fixed (non-automatic) MiniMax emotion, use [`params.emotion`](#paramsemotion) instead. + // """) @doc(""" Lets the AI vary its emotion as it speaks. A global emotion, or specific emotions for certain topics, can be set within the prompt of the AI. - IMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia) and [`MiniMax`](/docs/platform/voice/tts/minimax) TTS engines. - For a fixed (non-automatic) MiniMax emotion, use [`params.emotion`](#paramsemotion) instead. + IMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia) TTS engine. """) @example(true) auto_emotion?: boolean = false; + // hidden 2026-10-05 + // @doc(""" + // Lets the AI vary its speaking speed during the conversation. The speed behavior can be defined + // in the prompt of the AI. + // IMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia), + // [`ElevenLabs`](/docs/platform/voice/tts/elevenlabs), [`MiniMax`](/docs/platform/voice/tts/minimax), + // [`Rime`](/docs/platform/voice/tts/rime), [`Inworld`](/docs/platform/voice/tts/inworld), + // [`Smallest`](/docs/platform/voice/tts/smallest), and [`Fish`](/docs/platform/voice/tts/fish) TTS engines. + // """) @doc(""" Lets the AI vary its speaking speed during the conversation. The speed behavior can be defined in the prompt of the AI. IMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia), - [`ElevenLabs`](/docs/platform/voice/tts/elevenlabs), [`MiniMax`](/docs/platform/voice/tts/minimax), + [`ElevenLabs`](/docs/platform/voice/tts/elevenlabs), [`Rime`](/docs/platform/voice/tts/rime), [`Inworld`](/docs/platform/voice/tts/inworld), [`Smallest`](/docs/platform/voice/tts/smallest), and [`Fish`](/docs/platform/voice/tts/fish) TTS engines. """) @@ -110,28 +134,29 @@ model LanguageParams { @maxValue(2.0) temperature?: float | SWMLVar = 1.0; - @doc("How quickly the voice speaks. Values below `1.0` slow the voice down; values above `1.0` speed it up. IMPORTANT: Only works with the MiniMax TTS engine.") - @minValue(0.5) - @maxValue(2.0) - speed?: float | SWMLVar = 1.0; - - @doc("The speaking volume. Lower values are quieter. IMPORTANT: Only works with the MiniMax TTS engine.") - @minValue(0.1) - @maxValue(1.0) - vol?: float | SWMLVar = 1.0; - - @doc("The pitch shift in semitones. Negative values lower the pitch; positive values raise it. IMPORTANT: Only works with the MiniMax TTS engine.") - @minValue(-12) - @maxValue(12) - pitch?: int32 | SWMLVar = 0; - - @doc(""" - A fixed emotional tone for the generated speech. - To vary the emotion automatically during a conversation, use [`languages[].auto_emotion`](#languagesauto_emotion) instead. - IMPORTANT: Only works with the MiniMax TTS engine. - """) - @example("happy") - emotion?: "happy" | "sad" | "angry" | "fearful" | "disgusted" | "surprised" | "neutral"; + // hidden 2026-10-05 + // @doc("How quickly the voice speaks. Values below `1.0` slow the voice down; values above `1.0` speed it up. IMPORTANT: Only works with the MiniMax TTS engine.") + // @minValue(0.5) + // @maxValue(2.0) + // speed?: float | SWMLVar = 1.0; + // + // @doc("The speaking volume. Lower values are quieter. IMPORTANT: Only works with the MiniMax TTS engine.") + // @minValue(0.1) + // @maxValue(1.0) + // vol?: float | SWMLVar = 1.0; + // + // @doc("The pitch shift in semitones. Negative values lower the pitch; positive values raise it. IMPORTANT: Only works with the MiniMax TTS engine.") + // @minValue(-12) + // @maxValue(12) + // pitch?: int32 | SWMLVar = 0; + // + // @doc(""" + // A fixed emotional tone for the generated speech. + // To vary the emotion automatically during a conversation, use [`languages[].auto_emotion`](#languagesauto_emotion) instead. + // IMPORTANT: Only works with the MiniMax TTS engine. + // """) + // @example("happy") + // emotion?: "happy" | "sad" | "angry" | "fearful" | "disgusted" | "surprised" | "neutral"; } // One model rather than the two-variant union this used to be. The union made `fillers` and diff --git a/specs/swml/calling/Methods/connect/main.tsp b/specs/swml/calling/Methods/connect/main.tsp index 6038d7f527..1b279b4b9c 100644 --- a/specs/swml/calling/Methods/connect/main.tsp +++ b/specs/swml/calling/Methods/connect/main.tsp @@ -150,15 +150,15 @@ model ConnectDeviceBase { call_state_url?: url; @doc(""" - SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends. + SWML to execute on this call after its bridge with the queued call ends. Only applies when + `to` starts with `queue:`. When omitted, the call hangs up when the bridge ends. Either way, + the script does not continue past `connect` for queue targets, so `result` never runs. Can be either: - A URL (http or https) that returns a SWML document - An inline SWML document (as a JSON string) - - **Note:** This parameter is REQUIRED when connecting to a queue (when `to` starts with "queue:") """) - @example("https://example.com/after-bridge.swml") - transfer_after_bridge?: string | SWMLVar; + @example("https://example.com/after-queue.swml") + execute_after_queue?: string | SWMLVar; @doc(""" An array of call state event names to be notified about. @@ -331,14 +331,20 @@ model ConnectDeviceSingle is ConnectDeviceBase { @summary("Serial Dialing") @doc("Dial destinations one at a time in sequence. If the first destination does not answer, the next destination in the array is tried, and so on.") model ConnectDeviceSerial is ConnectDeviceBase { - @doc("Array of destination objects to dial in order. Each destination is tried sequentially — if the current destination does not answer, the next one in the array is attempted.") + @doc(""" + Array of destination objects to dial in order. Each destination is tried sequentially — if the current destination does not answer, the next one in the array is attempted. + Up to 20 destinations are tried. Any destination after the 20th is skipped without an error. + """) serial: ConnectDestination[]; } @summary("Parallel Dialing") @doc("Dial multiple destinations simultaneously. All destinations in the array ring at the same time — the first to answer is bridged and the remaining calls are cancelled.") model ConnectDeviceParallel is ConnectDeviceBase { - @doc("Array of destination objects to dial simultaneously. All destinations ring at the same time — the first to answer is bridged and the remaining calls are cancelled.") + @doc(""" + Array of destination objects to dial simultaneously. All destinations ring at the same time — the first to answer is bridged and the remaining calls are cancelled. + Up to 20 destinations are dialed. Any destination after the 20th is skipped without an error. + """) parallel: ConnectDestination[]; } @@ -350,6 +356,7 @@ model ConnectDeviceSerialParallel is ConnectDeviceBase { The outer array is the **serial** dimension — each element is a group tried in order. Each inner array is the **parallel** dimension — all destinations in that group are dialed simultaneously. If no destination in the current group answers, the next group is attempted. + Up to 20 destinations are dialed in total, counted across all groups rather than per group. Any destination after the 20th is skipped without an error. """) serial_parallel: ConnectDestination[][]; } diff --git a/specs/swml/calling/Methods/enter_queue/main.tsp b/specs/swml/calling/Methods/enter_queue/main.tsp index ebbd9d38d5..53451c94fd 100644 --- a/specs/swml/calling/Methods/enter_queue/main.tsp +++ b/specs/swml/calling/Methods/enter_queue/main.tsp @@ -13,13 +13,16 @@ model EnterQueueObject { queue_name: string; @doc(""" - SWML to execute after the bridge completes. This defines what should happen after the call is connected to an agent and the bridge ends. + SWML to execute after the bridge with the agent ends. When omitted, the call hangs up when + the bridge ends. If the call leaves the queue without being bridged (`wait_time` expires or + the caller hangs up), this field is not used and the script continues with the next + instruction; check `queue_result`. Can be either: - A URL (http or https) that returns a SWML document - An inline SWML document (as a JSON string) """) @example("https://example.com/post-call-survey") - transfer_after_bridge: string | SWMLVar; + execute_after_queue?: string | SWMLVar; @doc("HTTP or HTTPS URL to deliver queue status events. Default not set") @example("https://example.com/queue-status") @@ -29,10 +32,10 @@ model EnterQueueObject { @example("https://example.com/queue-music.mp3") wait_url?: url | SWMLVar; - @doc("Maximum time in seconds to wait in the queue before timeout. Default `3600`") + @doc("Maximum time in seconds to wait in the queue before timeout. Default `180`") @minValue(1) @example(1800) - wait_time?: integer | SWMLVar = 3600; + wait_time?: integer | SWMLVar = 180; } @summary("enter_queue Method") @@ -41,7 +44,8 @@ model EnterQueue { Place the current call in a named queue where it will wait to be connected to an available agent or resource. While waiting, callers will hear music or custom audio. When an agent connects to the queue (using the connect method), the caller and agent are bridged together. - After the bridge completes, execution continues with the SWML script specified in transfer_after_bridge. + After the bridge completes, execution continues with the SWML script specified in execute_after_queue, + or the call hangs up if none was given. """) @summary("enter_queue") enter_queue: EnterQueueObject; diff --git a/specs/swml/calling/tsp-output/@typespec/json-schema/SWMLObject.json b/specs/swml/calling/tsp-output/@typespec/json-schema/SWMLObject.json index 5c5ff35248..d173afa947 100644 --- a/specs/swml/calling/tsp-output/@typespec/json-schema/SWMLObject.json +++ b/specs/swml/calling/tsp-output/@typespec/json-schema/SWMLObject.json @@ -360,7 +360,7 @@ "properties": { "enter_queue": { "$ref": "#/$defs/EnterQueueObject", - "description": "Place the current call in a named queue where it will wait to be connected to an available agent or resource.\nWhile waiting, callers will hear music or custom audio.\nWhen an agent connects to the queue (using the connect method), the caller and agent are bridged together.\nAfter the bridge completes, execution continues with the SWML script specified in transfer_after_bridge.", + "description": "Place the current call in a named queue where it will wait to be connected to an available agent or resource.\nWhile waiting, callers will hear music or custom audio.\nWhen an agent connects to the queue (using the connect method), the caller and agent are bridged together.\nAfter the bridge completes, execution continues with the SWML script specified in execute_after_queue,\nor the call hangs up if none was given.", "title": "enter_queue" } }, @@ -3083,7 +3083,7 @@ ], "description": "Webhook URL to send call status change notifications to. Authentication can also be set in the URL in the format of `username:password@url`." }, - "transfer_after_bridge": { + "execute_after_queue": { "anyOf": [ { "type": "string" @@ -3093,9 +3093,9 @@ } ], "examples": [ - "https://example.com/after-bridge.swml" + "https://example.com/after-queue.swml" ], - "description": "SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)\n\n**Note:** This parameter is REQUIRED when connecting to a queue (when `to` starts with \"queue:\")" + "description": "SWML to execute on this call after its bridge with the queued call ends. Only applies when\n`to` starts with `queue:`. When omitted, the call hangs up when the bridge ends. Either way,\nthe script does not continue past `connect` for queue targets, so `result` never runs.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)" }, "call_state_events": { "type": "array", @@ -3398,7 +3398,7 @@ ], "description": "Webhook URL to send call status change notifications to. Authentication can also be set in the URL in the format of `username:password@url`." }, - "transfer_after_bridge": { + "execute_after_queue": { "anyOf": [ { "type": "string" @@ -3408,9 +3408,9 @@ } ], "examples": [ - "https://example.com/after-bridge.swml" + "https://example.com/after-queue.swml" ], - "description": "SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)\n\n**Note:** This parameter is REQUIRED when connecting to a queue (when `to` starts with \"queue:\")" + "description": "SWML to execute on this call after its bridge with the queued call ends. Only applies when\n`to` starts with `queue:`. When omitted, the call hangs up when the bridge ends. Either way,\nthe script does not continue past `connect` for queue targets, so `result` never runs.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)" }, "call_state_events": { "type": "array", @@ -3435,7 +3435,7 @@ "items": { "$ref": "#/$defs/ConnectDestination" }, - "description": "Array of destination objects to dial in order. Each destination is tried sequentially — if the current destination does not answer, the next one in the array is attempted." + "description": "Array of destination objects to dial in order. Each destination is tried sequentially — if the current destination does not answer, the next one in the array is attempted.\nUp to 20 destinations are tried. Any destination after the 20th is skipped without an error." } }, "required": [ @@ -3642,7 +3642,7 @@ ], "description": "Webhook URL to send call status change notifications to. Authentication can also be set in the URL in the format of `username:password@url`." }, - "transfer_after_bridge": { + "execute_after_queue": { "anyOf": [ { "type": "string" @@ -3652,9 +3652,9 @@ } ], "examples": [ - "https://example.com/after-bridge.swml" + "https://example.com/after-queue.swml" ], - "description": "SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)\n\n**Note:** This parameter is REQUIRED when connecting to a queue (when `to` starts with \"queue:\")" + "description": "SWML to execute on this call after its bridge with the queued call ends. Only applies when\n`to` starts with `queue:`. When omitted, the call hangs up when the bridge ends. Either way,\nthe script does not continue past `connect` for queue targets, so `result` never runs.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)" }, "call_state_events": { "type": "array", @@ -3679,7 +3679,7 @@ "items": { "$ref": "#/$defs/ConnectDestination" }, - "description": "Array of destination objects to dial simultaneously. All destinations ring at the same time — the first to answer is bridged and the remaining calls are cancelled." + "description": "Array of destination objects to dial simultaneously. All destinations ring at the same time — the first to answer is bridged and the remaining calls are cancelled.\nUp to 20 destinations are dialed. Any destination after the 20th is skipped without an error." } }, "required": [ @@ -3886,7 +3886,7 @@ ], "description": "Webhook URL to send call status change notifications to. Authentication can also be set in the URL in the format of `username:password@url`." }, - "transfer_after_bridge": { + "execute_after_queue": { "anyOf": [ { "type": "string" @@ -3896,9 +3896,9 @@ } ], "examples": [ - "https://example.com/after-bridge.swml" + "https://example.com/after-queue.swml" ], - "description": "SWML to execute after the bridge completes. This defines what should happen after the call is connected and the bridge ends.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)\n\n**Note:** This parameter is REQUIRED when connecting to a queue (when `to` starts with \"queue:\")" + "description": "SWML to execute on this call after its bridge with the queued call ends. Only applies when\n`to` starts with `queue:`. When omitted, the call hangs up when the bridge ends. Either way,\nthe script does not continue past `connect` for queue targets, so `result` never runs.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)" }, "call_state_events": { "type": "array", @@ -3926,7 +3926,7 @@ "$ref": "#/$defs/ConnectDestination" } }, - "description": "Two-dimensional array combining serial and parallel strategies.\nThe outer array is the **serial** dimension — each element is a group tried in order.\nEach inner array is the **parallel** dimension — all destinations in that group are dialed simultaneously.\nIf no destination in the current group answers, the next group is attempted." + "description": "Two-dimensional array combining serial and parallel strategies.\nThe outer array is the **serial** dimension — each element is a group tried in order.\nEach inner array is the **parallel** dimension — all destinations in that group are dialed simultaneously.\nIf no destination in the current group answers, the next group is attempted.\nUp to 20 destinations are dialed in total, counted across all groups rather than per group. Any destination after the 20th is skipped without an error." } }, "required": [ @@ -3948,7 +3948,7 @@ ], "description": "Name of the queue to enter. If a queue with this name does not exist, it will be automatically created." }, - "transfer_after_bridge": { + "execute_after_queue": { "anyOf": [ { "type": "string" @@ -3960,7 +3960,7 @@ "examples": [ "https://example.com/post-call-survey" ], - "description": "SWML to execute after the bridge completes. This defines what should happen after the call is connected to an agent and the bridge ends.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)" + "description": "SWML to execute after the bridge with the agent ends. When omitted, the call hangs up when\nthe bridge ends. If the call leaves the queue without being bridged (`wait_time` expires or\nthe caller hangs up), this field is not used and the script continues with the next\ninstruction; check `queue_result`.\nCan be either:\n- A URL (http or https) that returns a SWML document\n- An inline SWML document (as a JSON string)" }, "status_url": { "type": "string", @@ -3994,17 +3994,16 @@ "$ref": "#/$defs/SWMLVar" } ], - "default": 3600, + "default": 180, "examples": [ 1800 ], "minimum": 1, - "description": "Maximum time in seconds to wait in the queue before timeout. Default `3600`" + "description": "Maximum time in seconds to wait in the queue before timeout. Default `180`" } }, "required": [ - "queue_name", - "transfer_after_bridge" + "queue_name" ], "unevaluatedProperties": { "not": {} @@ -4946,7 +4945,7 @@ "examples": [ "gcloud.fr-FR-Neural2-B" ], - "description": "Voice to use for the language. String format: `.`, with an optional\n`:` suffix for engines that offer a choice of model.\nSelect engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `cartesia`, `deepgram`, `rime`,\n`inworld`, `minimax`, `groq-tts`, `mistral`, `grok`, `smallest`, `fish`, or `speechify`.\nFor example, `gcloud.fr-FR-Neural2-B` or `elevenlabs.rachel:eleven_flash_v2_5`.\nAlways name the engine: a bare voice id resolves against a default engine that can change." + "description": "Voice to use for the language. String format: `.`, with an optional\n`:` suffix for engines that offer a choice of model.\nSelect engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `cartesia`, `deepgram`, `rime`,\n`inworld`, `groq-tts`, `mistral`, `grok`, `smallest`, or `fish`.\nFor example, `gcloud.fr-FR-Neural2-B` or `elevenlabs.rachel:eleven_flash_v2_5`.\nAlways name the engine: a bare voice id resolves against a default engine that can change." }, "model": { "type": "string", @@ -4961,7 +4960,7 @@ "examples": [ true ], - "description": "Lets the AI vary its emotion as it speaks. A global emotion, or specific emotions for certain\ntopics, can be set within the prompt of the AI.\nIMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia) and [`MiniMax`](/docs/platform/voice/tts/minimax) TTS engines.\nFor a fixed (non-automatic) MiniMax emotion, use [`params.emotion`](#paramsemotion) instead." + "description": "Lets the AI vary its emotion as it speaks. A global emotion, or specific emotions for certain\ntopics, can be set within the prompt of the AI.\nIMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia) TTS engine." }, "auto_speed": { "type": "boolean", @@ -4969,7 +4968,7 @@ "examples": [ true ], - "description": "Lets the AI vary its speaking speed during the conversation. The speed behavior can be defined\nin the prompt of the AI.\nIMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia),\n[`ElevenLabs`](/docs/platform/voice/tts/elevenlabs), [`MiniMax`](/docs/platform/voice/tts/minimax),\n[`Rime`](/docs/platform/voice/tts/rime), [`Inworld`](/docs/platform/voice/tts/inworld),\n[`Smallest`](/docs/platform/voice/tts/smallest), and [`Fish`](/docs/platform/voice/tts/fish) TTS engines." + "description": "Lets the AI vary its speaking speed during the conversation. The speed behavior can be defined\nin the prompt of the AI.\nIMPORTANT: Only works with the [`Cartesia`](/docs/platform/voice/tts/cartesia),\n[`ElevenLabs`](/docs/platform/voice/tts/elevenlabs),\n[`Rime`](/docs/platform/voice/tts/rime), [`Inworld`](/docs/platform/voice/tts/inworld),\n[`Smallest`](/docs/platform/voice/tts/smallest), and [`Fish`](/docs/platform/voice/tts/fish) TTS engines." }, "engine": { "type": "string", @@ -8285,86 +8284,6 @@ "minimum": 0, "maximum": 2, "description": "Controls the randomness and expressiveness of the generated speech. Lower values produce a more consistent, predictable delivery; higher values introduce more variation. IMPORTANT: Only works with the Inworld TTS engine." - }, - "speed": { - "anyOf": [ - { - "type": "number" - }, - { - "$ref": "#/$defs/SWMLVar" - } - ], - "default": 1, - "minimum": 0.5, - "maximum": 2, - "description": "How quickly the voice speaks. Values below `1.0` slow the voice down; values above `1.0` speed it up. IMPORTANT: Only works with the MiniMax TTS engine." - }, - "vol": { - "anyOf": [ - { - "type": "number" - }, - { - "$ref": "#/$defs/SWMLVar" - } - ], - "default": 1, - "minimum": 0.1, - "maximum": 1, - "description": "The speaking volume. Lower values are quieter. IMPORTANT: Only works with the MiniMax TTS engine." - }, - "pitch": { - "anyOf": [ - { - "type": "integer", - "minimum": -2147483648, - "maximum": 2147483647 - }, - { - "$ref": "#/$defs/SWMLVar" - } - ], - "default": 0, - "minimum": -12, - "maximum": 12, - "description": "The pitch shift in semitones. Negative values lower the pitch; positive values raise it. IMPORTANT: Only works with the MiniMax TTS engine." - }, - "emotion": { - "anyOf": [ - { - "type": "string", - "const": "happy" - }, - { - "type": "string", - "const": "sad" - }, - { - "type": "string", - "const": "angry" - }, - { - "type": "string", - "const": "fearful" - }, - { - "type": "string", - "const": "disgusted" - }, - { - "type": "string", - "const": "surprised" - }, - { - "type": "string", - "const": "neutral" - } - ], - "examples": [ - "happy" - ], - "description": "A fixed emotional tone for the generated speech.\nTo vary the emotion automatically during a conversation, use [`languages[].auto_emotion`](#languagesauto_emotion) instead.\nIMPORTANT: Only works with the MiniMax TTS engine." } }, "unevaluatedProperties": { @@ -8387,7 +8306,7 @@ "examples": [ "gcloud.fr-FR-Neural2-B" ], - "description": "Voice to use for the language. String format: `.`, with an optional\n`:` suffix for engines that offer a choice of model.\nSelect engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `cartesia`, `deepgram`, `rime`,\n`inworld`, `minimax`, `groq-tts`, `mistral`, `grok`, `smallest`, `fish`, or `speechify`.\nFor example, `gcloud.fr-FR-Neural2-B` or `elevenlabs.rachel:eleven_flash_v2_5`.\nAlways name the engine: a bare voice id resolves against a default engine that can change." + "description": "Voice to use for the language. String format: `.`, with an optional\n`:` suffix for engines that offer a choice of model.\nSelect engine from `gcloud`, `polly`, `amazon`, `azure`, `openai`, `elevenlabs`, `cartesia`, `deepgram`, `rime`,\n`inworld`, `groq-tts`, `mistral`, `grok`, `smallest`, or `fish`.\nFor example, `gcloud.fr-FR-Neural2-B` or `elevenlabs.rachel:eleven_flash_v2_5`.\nAlways name the engine: a bare voice id resolves against a default engine that can change." }, "model": { "type": "string", diff --git a/yarn.lock b/yarn.lock index 44f68fb226..153e64a3e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -635,10 +635,10 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fern-api@5.67.1: - version "5.67.1" - resolved "https://registry.yarnpkg.com/fern-api/-/fern-api-5.67.1.tgz#9eafa6894736789e47a8ad76bc22a6c12f1f72d3" - integrity sha512-iMpbfv49nnGwW27MTHhxVdkqEG1OKGAZ0GJGOQSOa/9Hmhfdz/cBPl0G2IosPEJYFRUBAz0nsqzpkWF9S7yYIw== +fern-api@5.131.1: + version "5.131.1" + resolved "https://registry.yarnpkg.com/fern-api/-/fern-api-5.131.1.tgz#acfe9e4ec3c706b30620992bf592061e651e0c95" + integrity sha512-eaQ/LNpEbf3dYno99WsbkyTp8C45zMcvIcGtu904HJIsp4Spi0+dgBzvbgAHzeZbDdEGGGTLVcKmNkBTrcniEw== optionalDependencies: "@boundaryml/baml" "^0.219.0" From 32be498e02014b99d2d3242f804f92a5c26e39f3 Mon Sep 17 00:00:00 2001 From: August Date: Fri, 9 Oct 2026 17:53:26 +0000 Subject: [PATCH 06/12] docs(voice): rewrite route calls guide to the capability guide rule --- .../pages/calling/voice/call-routing.mdx | 714 ++++++++++-------- 1 file changed, 413 insertions(+), 301 deletions(-) diff --git a/fern/products/platform/pages/calling/voice/call-routing.mdx b/fern/products/platform/pages/calling/voice/call-routing.mdx index 1615bd7cdb..07c98a13c6 100644 --- a/fern/products/platform/pages/calling/voice/call-routing.mdx +++ b/fern/products/platform/pages/calling/voice/call-routing.mdx @@ -1,8 +1,7 @@ --- -title: Call routing -slug: /voice/call-routing +title: Route calls +slug: voice/call-routing description: Answer a call and speak from a flow you host or serve, then collect what the caller says, branch on it, handle silence, and read the result in the call log or your own code. -position: 1 max-toc-depth: 3 --- @@ -17,12 +16,9 @@ max-toc-depth: 3 [cfb-version]: /docs/call-flow-builder/guides/version [control-flow]: /docs/swml/guides/goto-execute-transfer-disambiguation [create-call]: /docs/apis/rest/calls/call-commands -[outbound]: /docs/platform/voice/outbound-calling +[make-receive]: /docs/platform/voice/make-and-receive-calls [phone-numbers]: /docs/platform/phone-numbers [relay-client]: /docs/server-sdks/guides/relay-client -[relay-collect]: /docs/server-sdks/reference/python/relay/call/play-and-collect -[relay-connect]: /docs/server-sdks/reference/python/relay/call/connect -[relay-events]: /docs/server-sdks/reference/python/relay/events [resources]: /docs/platform/resources [rest-calling]: /docs/apis/rest/calls/call-commands [server-sdks]: /docs/server-sdks @@ -40,9 +36,9 @@ whether the call arrived on a phone number, a SIP address, or a browser. Start b and speaking one line, then collect speech and branch on it, handle silence and unmatched replies, and track what the flow heard. -## Pick the right product for call routing +## Pick the right product for routing calls -| Function | SWML | Relay | REST Calling API | Browser SDK | Call Flow Builder | +| Function | SWML | WebSocket (Relay) | REST | Browser SDK | Call Flow Builder | |---|---|---|---|---|---| | Answer the call and speak without running a server | | | | | | | Collect speech or keypad digits and branch on the result | | | | | | @@ -60,25 +56,27 @@ and track what the flow heard. - The [Browser SDK][browser-sdk] places and receives calls from a web page. It is the caller or the callee, never the flow. - [Call Flow Builder][cfb] is a visual editor in the Dashboard. You connect nodes and SignalWire - hosts the result as a Call Flow resource. + hosts the result as a Call Flow Resource. -## Prepare for call routing +## Prepare for routing calls Have these values ready: - Your Space URL, such as `.signalwire.com`. -- For the Relay and REST Calling API paths, your Project ID and an API token from the Dashboard's +- For the Relay and REST paths, your Project ID and an API token from the Dashboard's [API credentials][api-credentials] page, with the **Voice** permission enabled. A hosted SWML script or a Call Flow needs no credentials. - For SWML served from your own server, Python 3 or Node.js and [ngrok](https://ngrok.com/download). -- For the hand-off example, a phone number you can answer. +- For the hand-off example, a phone number you can answer, and a number in your Space or a verified + caller ID to present when the flow dials it. A [trial project][trial-mode] can hand a call to a number it has purchased or verified, and cannot reach international numbers at all. Every other step in this guide works on a trial project. -This guide receives calls. To place them, start with [Outbound calling][outbound]. +This guide picks up once a call reaches your flow. To place calls, or to point a phone number at a +flow, start with [Make and receive calls][make-receive]. ## Answer a call and speak @@ -97,7 +95,9 @@ them. | `` | Your Space's subdomain in `.signalwire.com` | | `` | Your Project ID | | `` | Your API token | -| `` | The ID of a call in progress, for the REST Calling API samples | +| `` | A password you choose; SignalWire presents it when it fetches a served SWML document | +| `` | The hostname of the tunnel in front of your served SWML document | +| `` | The ID of a call in progress, for the REST samples | | `` | A public HTTPS URL on your server that accepts POST requests | | `` | A phone number you can answer, in E.164 format | | `` | A number in your Space, or a verified caller ID | @@ -107,41 +107,47 @@ them. -The document below answers the call, speaks, and hangs up. The Server SDK classes build the same -document from code and serve it over HTTP; the YAML and JSON forms are what you paste into the -Dashboard. `SWMLService` is the non-AI base of the Server SDK's agent classes and validates every -verb against the SWML schema as you add it. +The document below answers the call, speaks, and hangs up. The [Server SDKs][server-sdks] build +it from code with the SWML builder and serve it over HTTP; the YAML and JSON forms are what you +paste into the Dashboard. - + ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as call_routing.py and run: python call_routing.py -from signalwire import SWMLService - -service = SWMLService(name="call-routing") - -service.add_verb("answer", {}) -service.add_verb("play", {"url": "say:Thanks for calling Bayview Taxi. Your flow is running."}) -service.add_verb("hangup", {}) +# Save as route_calls.py and run: python route_calls.py +from signalwire import SWMLBuilder, SWMLService + +service = SWMLService( + name="route-calls", + route="/swml", + port=3000, + basic_auth=("signalwire", ""), +) +SWMLBuilder(service).answer().say("Thanks for calling Bayview Taxi. Your flow is running.").hangup() -if __name__ == "__main__": - service.serve() +# Serves the document at /swml. Put the credentials in the URL you give +# SignalWire: https://signalwire:@/swml +service.serve() ``` - + ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as call-routing.mjs, -// then run: node call-routing.mjs +// This sample also runs as JavaScript: save as route-calls.mjs, +// then run: node route-calls.mjs import { SWMLService } from "@signalwire/sdk"; -const service = new SWMLService({ name: "call-routing" }); - -service.addVerb("answer", {}); -service.addVerb("play", { url: "say:Thanks for calling Bayview Taxi. Your flow is running." }); -service.addVerb("hangup", {}); +const service = new SWMLService({ + name: "route-calls", + route: "/swml", + port: 3000, + basicAuth: ["signalwire", ""], +}); +service.getBuilder().answer().say("Thanks for calling Bayview Taxi. Your flow is running.").hangup(); +// Serves the document at /swml. Put the credentials in the URL you give +// SignalWire: https://signalwire:@/swml await service.serve(); ``` @@ -174,19 +180,20 @@ sections: Execution starts at the `main` section, which every document must have. Each section is an ordered list of methods. `answer` picks up the call, `play` speaks the text after the `say:` -prefix, and `hangup` ends the call. +prefix, and `hangup` ends the call. The builder's `say` is shorthand for a `play` with a `say:` +URL, and every builder method validates its method against the SWML schema before adding it. -A Relay client stays connected to SignalWire and receives every call routed to its context. The +A Relay client stays connected to SignalWire and receives every call routed to its topic. The handler answers, speaks, and hangs up when playback completes. ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as call_routing.py and run: python call_routing.py +# Save as route_calls_relay.py and run: python route_calls_relay.py from signalwire.relay import RelayClient client = RelayClient( @@ -218,8 +225,8 @@ client.run() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as call-routing.mjs, -// then run: node call-routing.mjs +// This sample also runs as JavaScript: save as route-calls-relay.mjs, +// then run: node route-calls-relay.mjs import { RelayClient } from "@signalwire/sdk"; const client = new RelayClient({ @@ -246,7 +253,7 @@ await client.run(); -`contexts` names the topic the client listens on. The Relay Application resource you create in the +`contexts` names the topic the client listens on. The Relay Application Resource you create in the next step uses the same name, so SignalWire knows which running client gets the call. `run()` blocks until you stop the process, reconnecting if the connection drops. @@ -269,9 +276,9 @@ how deployed and draft versions relate. -### Give the flow a resource +### Give the flow a Resource -SignalWire routes calls to [resources][resources]. This step makes your flow one, and it is the +SignalWire routes calls to [Resources][resources]. This step makes your flow one, and it is the only place in this guide where delivery differs by surface. Every later task changes the flow's contents, not how it reaches the call. @@ -282,20 +289,20 @@ Choose where the document lives. #### Host it in your Space - +1. Open **My Resources**, select **+ Add**, then **Script**, then **SWML Script**. +2. Name it **Route calls**. +3. Under **Handle Calls Using**, choose **Hosted Script**, paste the YAML or JSON form of the + document into **Primary Script**, and save. -Name the script, paste the YAML or JSON form of the document, and save it. It appears in -**Resources** as a SWML Script. Return here to replace its contents in each later task. +The script is listed under **My Resources**. Return here to replace its contents in each later +task. #### Serve it from your server -Start the flow from the Server SDK sample, with credentials you choose so the URL survives a -restart: +Start the flow from the SWML builder sample: ```bash -export SWML_BASIC_AUTH_USER="signalwire" -export SWML_BASIC_AUTH_PASSWORD="replace-with-a-long-random-password" -python call_routing.py +python route_calls.py ``` In a second terminal, open a tunnel to port 3000 and keep it running: @@ -304,29 +311,28 @@ In a second terminal, open a tunnel to port 3000 and keep it running: ngrok http 3000 ``` -Confirm the document is reachable through the tunnel: +ngrok prints an `https://` **Forwarding** URL. Its hostname is your ``. Confirm +the document is reachable through the tunnel: ```bash curl --fail \ - --user "signalwire:replace-with-a-long-random-password" \ - "https://abc123.ngrok-free.app/" \ + --user "signalwire:" \ + "https:///swml" \ | python -m json.tool ``` -A working flow returns a JSON document with `"version": "1.0.0"` and a `sections.main` array. A -`401` response means the credentials in the request differ from the ones you exported before -starting the flow. +A working flow returns a JSON document with `"version": "1.0.0"` and a `sections.main` array. -Then create the resource. Open the [SignalWire Dashboard](https://my.signalwire.com), select -**Script**, and then **External URL**. Set the Primary Script URL to the tunnel URL with the -credentials embedded, and select **Create**: +Then create the Resource: -```text -https://signalwire:replace-with-a-long-random-password@abc123.ngrok-free.app/ -``` +1. Open **My Resources**, select **+ Add**, then **Script**, then **SWML Script**. +2. Name it **Route calls**. +3. Under **Handle Calls Using**, choose **External URL**, enter + `https://signalwire:@/swml` in + **Primary Script URL**, and save. -The resource appears in **Resources**. Later tasks change `call_routing.py` and restart it; the -resource keeps pointing at the tunnel. +Later tasks change `route_calls.py` and restart it; the Resource keeps pointing at the tunnel. A +new tunnel usually means a new hostname, so update the Resource whenever it changes. @@ -334,36 +340,40 @@ resource keeps pointing at the tunnel. Start the client and leave it running: ```bash -python call_routing.py +python route_calls_relay.py ``` -In the Dashboard, open **Resources**, select **+ Add New**, and choose **Relay Application**. Set -**Name** to anything you like and **Topic** to `default`, the value in the client's `contexts`, -then save. Calls to this resource reach whichever connected client listens on that topic. +In the Dashboard, open **My Resources**, select **+ Add**, then **Relay Application**. Name it and +enter `default` as the **Topic**, the value in the client's `contexts`, then save. Calls to this +Resource reach whichever connected client listens on that topic. -A deployed Call Flow is already a resource. Open **Resources** and find it under **Call Flows**. +A deployed Call Flow is already a Resource, listed under **My Resources**. ### Call it and listen -Open the resource in **Resources** and select **Click-to-Test**, under the resource's name. A new -tab opens, shows "Connecting", and places a browser call to the resource. Allow microphone access -if the browser asks. +Open the Resource under **My Resources** and select **Click-to-Test**, under the Resource's name. A +new tab opens, shows "Connecting", and places a browser call to the Resource. Allow microphone +access if the browser asks. You hear "Thanks for calling Bayview Taxi. Your flow is running." and the call ends. -If the call connects but stays silent, the flow never ran. For a served SWML document, repeat the -`curl` request to confirm the tunnel still answers, then check that the External URL resource -carries the same URL and credentials. For a hosted script, reopen it and confirm the document -saved with a `main` section. For Relay, check that the client process is still running and that -the resource's **Topic** matches its `contexts`. **Click-to-Test** appears only on resources that -handle calls; if it is disabled, the resource has no address, so open its **Addresses** and add an -alias. +If it doesn't, match the symptom: + +- **The call connects but stays silent.** The flow never ran. For a served document, repeat the + `curl` request to confirm the tunnel still answers, then check that the External URL Resource + carries the same URL and password. For a hosted script, reopen it and confirm the document saved + with a `main` section. For Relay, check that the client process is still running and that the + Resource's **Topic** matches its `contexts`. +- **`curl` returns 401.** The password in the request differs from the one in the sample's + `basic_auth`. +- **Click-to-Test is disabled.** It appears only on Resources that handle calls and have an + address. Open the Resource's **Addresses** and add an alias. @@ -384,37 +394,40 @@ text lands in the `prompt_value` variable and the outcome in `prompt_result`. return. Replace the flow with this version. The `booking` and `dispatch` sections each speak a different -line, and `no_match` catches everything else. +line, and `no_match` catches everything else. The builder's methods append to `main`; the named +sections go through the service. - + ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as call_routing.py and run: python call_routing.py -from signalwire import SWMLService - -service = SWMLService(name="call-routing") - -service.add_verb("answer", {}) -service.add_verb( - "prompt", - { - "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", - "speech_hints": ["booking", "dispatch"], - }, +# Save as route_calls.py and run: python route_calls.py +from signalwire import SWMLBuilder, SWMLService + +service = SWMLService( + name="route-calls", + route="/swml", + port=3000, + basic_auth=("signalwire", ""), ) -service.add_verb( - "switch", - { - "variable": "prompt_value", - "case": { +( + SWMLBuilder(service) + .answer() + .prompt( + play=["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], + speech_hints=["booking", "dispatch"], + ) + .switch( + variable="prompt_value", + case={ "booking": [{"transfer": {"dest": "booking"}}], "dispatch": [{"transfer": {"dest": "dispatch"}}], }, - "default": [{"transfer": {"dest": "no_match"}}], - }, + default=[{"transfer": {"dest": "no_match"}}], + ) ) +# The builder appends to the main section. Named sections go through the service. service.add_verb_to_section("booking", "play", {"url": "say:You said booking."}) service.add_verb_to_section("booking", "hangup", {}) @@ -424,41 +437,48 @@ service.add_verb_to_section("dispatch", "hangup", {}) service.add_verb_to_section("no_match", "play", {"url": "say:Sorry, I didn't catch that. Goodbye."}) service.add_verb_to_section("no_match", "hangup", {}) -if __name__ == "__main__": - service.serve() +service.serve() ``` - + ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as call-routing.mjs, -// then run: node call-routing.mjs +// This sample also runs as JavaScript: save as route-calls.mjs, +// then run: node route-calls.mjs import { SWMLService } from "@signalwire/sdk"; -const service = new SWMLService({ name: "call-routing" }); - -service.addVerb("answer", {}); -service.addVerb("prompt", { - play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", - speech_hints: ["booking", "dispatch"], -}); -service.addVerb("switch", { - variable: "prompt_value", - case: { - booking: [{ transfer: { dest: "booking" } }], - dispatch: [{ transfer: { dest: "dispatch" } }], - }, - default: [{ transfer: { dest: "no_match" } }], +const service = new SWMLService({ + name: "route-calls", + route: "/swml", + port: 3000, + basicAuth: ["signalwire", ""], }); +const swml = service.getBuilder(); + +swml + .answer() + .prompt({ + play: ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], + speech_hints: ["booking", "dispatch"], + }) + .switch({ + variable: "prompt_value", + case: { + booking: [{ transfer: { dest: "booking" } }], + dispatch: [{ transfer: { dest: "dispatch" } }], + }, + default: [{ transfer: { dest: "no_match" } }], + }); -service.addVerbToSection("booking", "play", { url: "say:You said booking." }); -service.addVerbToSection("booking", "hangup", {}); +// The builder's verb methods append to the main section. Named sections use addVerbToSection. +swml.addVerbToSection("booking", "play", { url: "say:You said booking." }); +swml.addVerbToSection("booking", "hangup", {}); -service.addVerbToSection("dispatch", "play", { url: "say:You said dispatch." }); -service.addVerbToSection("dispatch", "hangup", {}); +swml.addVerbToSection("dispatch", "play", { url: "say:You said dispatch." }); +swml.addVerbToSection("dispatch", "hangup", {}); -service.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); -service.addVerbToSection("no_match", "hangup", {}); +swml.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); +swml.addVerbToSection("no_match", "hangup", {}); await service.serve(); ``` @@ -470,7 +490,8 @@ sections: main: - answer: {} - prompt: - play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch." + play: + - "say:Thanks for calling Bayview Taxi. Say booking or dispatch." speech_hints: - booking - dispatch @@ -509,7 +530,7 @@ sections: { "answer": {} }, { "prompt": { - "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "play": ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], "speech_hints": ["booking", "dispatch"] } }, @@ -542,32 +563,34 @@ sections: -`add_verb_to_section` creates a section on first use and appends to it after that. `switch` -compares the whole value exactly, so a case key must match the recognized text character for -character. SWML also has a `cond` method that branches on a JavaScript expression, but the Server -SDKs cannot emit it yet, so this guide uses `switch` throughout. +`add_verb_to_section` and `addVerbToSection` create a section on first use and append to it after +that. `switch` compares the whole value exactly. SignalWire lowercases recognized speech and strips +its punctuation before storing it in `prompt_value`, so "Booking." still matches the `booking` +case, but "booking please" does not. SWML also has a `cond` method that branches on a JavaScript +expression; the Python SDK cannot emit it, because `add_verb` takes only object-valued methods and +`cond` takes a list, so this guide branches with `switch` on every surface. -Restart the served flow, or paste the new document into the hosted script, then call the resource +Restart the served flow, or paste the new document into the hosted script, then call the Resource three times: say "booking", say "dispatch", and say nothing. You hear a different line each time. If every call ends in `no_match`, the recognized text did not equal a case key; the tracking section below shows what the flow heard. -### Collect speech and branch via Relay +### Collect speech and branch via WebSocket (Relay) -[`play_and_collect`][relay-collect] plays the prompt and resolves when input arrives, times out, -or fails. The result carries a `type` of `speech`, `digit`, `no_input`, or `no_match`, and for -speech the recognized `text` with a `confidence` score. Your code compares the text and continues. +The [Server SDKs][server-sdks] expose the prompt as `play_and_collect` on the call. It plays the +prompt and resolves when input arrives, times out, or fails. The result carries a `type` of +`speech`, `digit`, `no_input`, or `no_match`, and for speech the recognized `text` with a +`confidence` score. Your code compares the text and continues. -Over the REST Calling API the same collect command runs against a call you already hold the ID -for, so the request needs the call to exist first, for example a call your Relay client or a hosted -script answered. The result arrives at `status_url` as a `calling.call.collect` event instead of a -return value. +Over REST the same collect command runs against a call you already hold the ID for, so the request +needs the call to exist first, for example a call your Relay client or a hosted script answered. +The result arrives at `status_url` as a `calling.call.collect` event instead of a return value. ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as call_routing.py and run: python call_routing.py +# Save as route_calls_relay.py and run: python route_calls_relay.py from signalwire.relay import RelayClient client = RelayClient( @@ -617,7 +640,7 @@ client.run() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// Save as call-routing.mts and run: npx tsx call-routing.mts +// Save as route-calls-relay.mts and run: npx tsx route-calls-relay.mts import { RelayClient } from "@signalwire/sdk"; const client = new RelayClient({ @@ -657,7 +680,7 @@ client.onCall(async (call) => { await client.run(); ``` - + ```bash # Runs against a call that is already answered; play the question first with calling.play. curl --request POST "https://.signalwire.com/api/calling/calls" \ @@ -676,21 +699,24 @@ curl --request POST "https://.signalwire.com/api/calling/calls" \ +The [Calling API reference][rest-calling] documents every `calling.collect` field. + Because the comparison runs in your code, you can match loosely: `"booking" in heard` accepts -"booking please" as well as "booking". Restart the client and call the resource three times to hear +"booking please" as well as "booking". Restart the client and call the Resource three times to hear the three outcomes. If the client logs an authentication error at startup, the project, token, and Space do not belong together. ### Collect speech and branch via Call Flow Builder -Replace the **Play Audio or TTS** node with a [**Gather Input**][cfb-gather] node. Set its Text to -Speech to "Thanks for calling Bayview Taxi. Say booking or dispatch.", choose speech input, and add -two input options, `booking` and `dispatch`. The node grows one output connector per option, plus -**Unknown** and **No Input**. +Replace the **Play Audio or TTS** node with a [**Gather Input**][cfb-gather] node and set its Text +to Speech to "Thanks for calling Bayview Taxi. Say booking or dispatch." Every input option pairs a +key with a word: add one option with **Caller presses** `1` and **Or says** `booking`, and a second +with `2` and `dispatch`. The node grows one output connector per option, plus **Unknown** and +**No Input**. Connect each option to its own **Play Audio or TTS** node with the matching line, and each of those to a **Hangup Call** node. Leave **Unknown** and **No Input** for the next task. Select -**Deploy**, then call the resource three times. +**Deploy**, then call the Resource three times. ## Handle silence and unmatched speech @@ -699,13 +725,13 @@ Each surface reports the two cases separately, so the flow can say something dif ### Handle silence and unmatched speech via SWML -After `prompt`, `prompt_result` is `match_speech`, `no_input`, or `no_match`. The `default` case -already routes both failure results to `no_match`; this change makes that section say which one -happened, using a JavaScript expression inside the spoken text. Only the `no_match` section -changes. +After `prompt`, `prompt_result` is `match_speech`, `no_input`, `no_match`, or `failed`, and +`match_digits` once keypad input is enabled. The `default` case already routes everything but a +match to `no_match`; this change makes that section say which one happened, using a JavaScript +expression inside the spoken text. Only the `no_match` section changes. - + ```python {1-6} service.add_verb_to_section( "no_match", @@ -715,12 +741,12 @@ service.add_verb_to_section( service.add_verb_to_section("no_match", "hangup", {}) ``` - + ```typescript {1-4} -service.addVerbToSection("no_match", "play", { +swml.addVerbToSection("no_match", "play", { url: "say:${prompt_result == 'no_input' ? \"I didn't hear anything.\" : \"I didn't understand that.\"} Goodbye.", }); -service.addVerbToSection("no_match", "hangup", {}); +swml.addVerbToSection("no_match", "hangup", {}); ``` @@ -744,7 +770,7 @@ service.addVerbToSection("no_match", "hangup", {}); The wait for input before `no_input` is five seconds by default; `prompt.initial_timeout` changes it. -### Handle silence and unmatched speech via Relay +### Handle silence and unmatched speech via WebSocket (Relay) The collect result's `type` is `no_input` when the caller stayed silent and `no_match` when speech arrived but matched nothing. Replace the reply selection in the Relay sample: @@ -797,14 +823,33 @@ itself, use one of the two paths below. ### Receive the result via SWML Add a `status_url` to the `prompt` method. SignalWire sends a `calling.call.collect` event to that -URL when input arrives. The same event reaches the `status_url` on a REST Calling API `calling.collect` +URL when input arrives. The same event reaches the `status_url` on a REST `calling.collect` command. + +```python {4} + .prompt( + play=["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], + speech_hints=["booking", "dispatch"], + status_url="", + ) +``` + + +```typescript {4} + .prompt({ + play: ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], + speech_hints: ["booking", "dispatch"], + status_url: "", + }) +``` + -```yaml {4} +```yaml {5} - prompt: - play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch." + play: + - "say:Thanks for calling Bayview Taxi. Say booking or dispatch." speech_hints: [booking, dispatch] status_url: "" ``` @@ -813,7 +858,7 @@ command. ```json {5} { "prompt": { - "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "play": ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], "speech_hints": ["booking", "dispatch"], "status_url": "" } @@ -873,11 +918,11 @@ sequenceDiagram -### Receive the result via Relay +### Receive the result via WebSocket (Relay) The Relay client already holds the result: it is the event that `action.wait()` returned. To log every collect event as it happens, including partial ones, register a handler on the call before -starting the prompt. The [Relay events reference][relay-events] lists the payload fields. +starting the prompt. The [Server SDKs][server-sdks] document the fields of every call event. @@ -899,7 +944,7 @@ starting the prompt. The [Relay events reference][relay-events] lists the payloa -The caller dials the resource. SignalWire hands the call to your Relay client on the default topic. Your client answers and sends play_and_collect. SignalWire plays the prompt and the caller says dispatch. SignalWire sends your client a calling.call.collect event with result type speech and the text. wait() returns and your code picks the branch, then plays the reply and hangs up. +The caller dials the Resource. SignalWire hands the call to your Relay client on the default topic. Your client answers and sends play_and_collect. SignalWire plays the prompt and the caller says dispatch. SignalWire sends your client a calling.call.collect event with result type speech and the text. wait() returns and your code picks the branch, then plays the reply and hangs up. @@ -911,7 +956,7 @@ sequenceDiagram participant SW as SignalWire participant App as Your Relay client - Caller->>SW: calls the resource address + Caller->>SW: calls the Resource address SW->>App: call arrives on topic default App->>SW: answer, play_and_collect SW->>Caller: prompt plays: say booking or dispatch @@ -928,8 +973,8 @@ sequenceDiagram | Surface | Where the recognized text shows up | How silence and no match are reported | |---|---|---| | SWML | `prompt_value` inside the document; the `status_url` webhook | `prompt_result` is `no_input` or `no_match` | -| Relay | The `result` on the event `action.wait()` returns; `call.on` handlers | `result.type` is `no_input` or `no_match` | -| REST Calling API | The `status_url` webhook only | `params.result.type` is `no_input` or `no_match` | +| WebSocket (Relay) | The `result` on the event `action.wait()` returns; `call.on` handlers | `result.type` is `no_input` or `no_match` | +| REST | The `status_url` webhook only | `params.result.type` is `no_input` or `no_match` | | Call Flow Builder | Not exposed; the flow branches on the matched option | The **No Input** and **Unknown** connectors | The Dashboard's call log shows the Collect step and its outcome for every surface, but never the @@ -938,18 +983,18 @@ text. ## Reach the same flow from any channel The flow you wrote does not know where the call came from. The Dashboard reached it through -**Click-to-Test**. A [phone number][phone-numbers] assigned to the same resource runs the identical -flow, and so does a SIP address, a browser call to the resource's [address][addresses], or an -outbound call you place with the [REST Calling API][create-call] and point at the resource. -Direction and channel are routing details on the resource; the flow is the same program. That is -also why delivery was a single step above: once a resource exists, every task in this guide edits +**Click-to-Test**. A [phone number][phone-numbers] assigned to the same Resource runs the identical +flow, and so does a SIP address, a browser call to the Resource's [address][addresses], or an +outbound call you place with the [REST Calling API][create-call] and point at the Resource. +Direction and channel are routing details on the Resource; the flow is the same program. That is +also why delivery was a single step above: once a Resource exists, every task in this guide edits the flow and leaves the routing alone. ## Examples ### Accept a keypad digit as well as speech -Some callers are in a noisy place or on a handset with no microphone to speak of. Offer keys and +Some callers are in a noisy place or on a handset that makes speaking awkward. Offer keys and words at once, and treat "press 1" and "say booking" as the same answer. #### Accept a keypad digit as well as speech via SWML @@ -958,37 +1003,39 @@ Setting one digit parameter alongside the speech parameters enables both inputs. joins the prompt, and the digit keys join the switch. - + ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as call_routing.py and run: python call_routing.py -from signalwire import SWMLService - -service = SWMLService(name="call-routing") - -service.add_verb("answer", {}) -service.add_verb( - "prompt", - { - "play": "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2.", - "max_digits": 1, - "speech_hints": ["booking", "dispatch"], - }, +# Save as route_calls.py and run: python route_calls.py +from signalwire import SWMLBuilder, SWMLService + +service = SWMLService( + name="route-calls", + route="/swml", + port=3000, + basic_auth=("signalwire", ""), ) -service.add_verb( - "switch", - { - "variable": "prompt_value", - "case": { +( + SWMLBuilder(service) + .answer() + .prompt( + play=["say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2."], + max_digits=1, + speech_hints=["booking", "dispatch"], + ) + .switch( + variable="prompt_value", + case={ "booking": [{"transfer": {"dest": "booking"}}], "1": [{"transfer": {"dest": "booking"}}], "dispatch": [{"transfer": {"dest": "dispatch"}}], "2": [{"transfer": {"dest": "dispatch"}}], }, - "default": [{"transfer": {"dest": "no_match"}}], - }, + default=[{"transfer": {"dest": "no_match"}}], + ) ) +# The builder appends to the main section. Named sections go through the service. service.add_verb_to_section("booking", "play", {"url": "say:You said booking."}) service.add_verb_to_section("booking", "hangup", {}) @@ -998,44 +1045,51 @@ service.add_verb_to_section("dispatch", "hangup", {}) service.add_verb_to_section("no_match", "play", {"url": "say:Sorry, I didn't catch that. Goodbye."}) service.add_verb_to_section("no_match", "hangup", {}) -if __name__ == "__main__": - service.serve() +service.serve() ``` - + ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as call-routing.mjs, -// then run: node call-routing.mjs +// This sample also runs as JavaScript: save as route-calls.mjs, +// then run: node route-calls.mjs import { SWMLService } from "@signalwire/sdk"; -const service = new SWMLService({ name: "call-routing" }); - -service.addVerb("answer", {}); -service.addVerb("prompt", { - play: "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2.", - max_digits: 1, - speech_hints: ["booking", "dispatch"], -}); -service.addVerb("switch", { - variable: "prompt_value", - case: { - booking: [{ transfer: { dest: "booking" } }], - "1": [{ transfer: { dest: "booking" } }], - dispatch: [{ transfer: { dest: "dispatch" } }], - "2": [{ transfer: { dest: "dispatch" } }], - }, - default: [{ transfer: { dest: "no_match" } }], +const service = new SWMLService({ + name: "route-calls", + route: "/swml", + port: 3000, + basicAuth: ["signalwire", ""], }); +const swml = service.getBuilder(); + +swml + .answer() + .prompt({ + play: ["say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2."], + max_digits: 1, + speech_hints: ["booking", "dispatch"], + }) + .switch({ + variable: "prompt_value", + case: { + booking: [{ transfer: { dest: "booking" } }], + "1": [{ transfer: { dest: "booking" } }], + dispatch: [{ transfer: { dest: "dispatch" } }], + "2": [{ transfer: { dest: "dispatch" } }], + }, + default: [{ transfer: { dest: "no_match" } }], + }); -service.addVerbToSection("booking", "play", { url: "say:You said booking." }); -service.addVerbToSection("booking", "hangup", {}); +// The builder's verb methods append to the main section. Named sections use addVerbToSection. +swml.addVerbToSection("booking", "play", { url: "say:You said booking." }); +swml.addVerbToSection("booking", "hangup", {}); -service.addVerbToSection("dispatch", "play", { url: "say:You said dispatch." }); -service.addVerbToSection("dispatch", "hangup", {}); +swml.addVerbToSection("dispatch", "play", { url: "say:You said dispatch." }); +swml.addVerbToSection("dispatch", "hangup", {}); -service.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); -service.addVerbToSection("no_match", "hangup", {}); +swml.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); +swml.addVerbToSection("no_match", "hangup", {}); await service.serve(); ``` @@ -1047,7 +1101,8 @@ sections: main: - answer: {} - prompt: - play: "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2." + play: + - "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2." max_digits: 1 speech_hints: - booking @@ -1093,7 +1148,7 @@ sections: { "answer": {} }, { "prompt": { - "play": "say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2.", + "play": ["say:Thanks for calling Bayview Taxi. Say booking or press 1. Say dispatch or press 2."], "max_digits": 1, "speech_hints": ["booking", "dispatch"] } @@ -1129,7 +1184,7 @@ sections: -#### Accept a keypad digit as well as speech via Relay +#### Accept a keypad digit as well as speech via WebSocket (Relay) Pass both `digits` and `speech` in the collect config. A keypad reply comes back with type `digit` and the pressed key in `params.digits`, so the code maps keys to the same words. @@ -1138,7 +1193,7 @@ Pass both `digits` and `speech` in the collect config. A keypad reply comes back ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as call_routing.py and run: python call_routing.py +# Save as route_calls_relay.py and run: python route_calls_relay.py from signalwire.relay import RelayClient client = RelayClient( @@ -1192,7 +1247,7 @@ client.run() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// Save as call-routing.mts and run: npx tsx call-routing.mts +// Save as route-calls-relay.mts and run: npx tsx route-calls-relay.mts import { RelayClient } from "@signalwire/sdk"; const client = new RelayClient({ @@ -1240,8 +1295,9 @@ await client.run(); #### Accept a keypad digit as well as speech via Call Flow Builder -The **Gather Input** node accepts keypad digits and speech together. Add `1` and `2` as further -input options and connect each to the same node as its spoken twin. +The flow you built already accepts both, because every **Gather Input** option carries a +**Caller presses** key as well as an **Or says** word. Change the prompt text to mention the keys +and select **Deploy**. ### Hand the call to a phone @@ -1260,34 +1316,36 @@ The `dispatch` section announces the hand-off, then [`connect`][swml-connect] di destination. The caller's own number is presented as caller ID unless you set `from`. - + ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as call_routing.py and run: python call_routing.py -from signalwire import SWMLService - -service = SWMLService(name="call-routing") - -service.add_verb("answer", {}) -service.add_verb( - "prompt", - { - "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", - "speech_hints": ["booking", "dispatch"], - }, +# Save as route_calls.py and run: python route_calls.py +from signalwire import SWMLBuilder, SWMLService + +service = SWMLService( + name="route-calls", + route="/swml", + port=3000, + basic_auth=("signalwire", ""), ) -service.add_verb( - "switch", - { - "variable": "prompt_value", - "case": { +( + SWMLBuilder(service) + .answer() + .prompt( + play=["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], + speech_hints=["booking", "dispatch"], + ) + .switch( + variable="prompt_value", + case={ "booking": [{"transfer": {"dest": "booking"}}], "dispatch": [{"transfer": {"dest": "dispatch"}}], }, - "default": [{"transfer": {"dest": "no_match"}}], - }, + default=[{"transfer": {"dest": "no_match"}}], + ) ) +# The builder appends to the main section. Named sections go through the service. service.add_verb_to_section("booking", "play", {"url": "say:You said booking."}) service.add_verb_to_section("booking", "hangup", {}) @@ -1298,42 +1356,49 @@ service.add_verb_to_section("dispatch", "hangup", {}) service.add_verb_to_section("no_match", "play", {"url": "say:Sorry, I didn't catch that. Goodbye."}) service.add_verb_to_section("no_match", "hangup", {}) -if __name__ == "__main__": - service.serve() +service.serve() ``` - + ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as call-routing.mjs, -// then run: node call-routing.mjs +// This sample also runs as JavaScript: save as route-calls.mjs, +// then run: node route-calls.mjs import { SWMLService } from "@signalwire/sdk"; -const service = new SWMLService({ name: "call-routing" }); - -service.addVerb("answer", {}); -service.addVerb("prompt", { - play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", - speech_hints: ["booking", "dispatch"], -}); -service.addVerb("switch", { - variable: "prompt_value", - case: { - booking: [{ transfer: { dest: "booking" } }], - dispatch: [{ transfer: { dest: "dispatch" } }], - }, - default: [{ transfer: { dest: "no_match" } }], +const service = new SWMLService({ + name: "route-calls", + route: "/swml", + port: 3000, + basicAuth: ["signalwire", ""], }); +const swml = service.getBuilder(); + +swml + .answer() + .prompt({ + play: ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], + speech_hints: ["booking", "dispatch"], + }) + .switch({ + variable: "prompt_value", + case: { + booking: [{ transfer: { dest: "booking" } }], + dispatch: [{ transfer: { dest: "dispatch" } }], + }, + default: [{ transfer: { dest: "no_match" } }], + }); -service.addVerbToSection("booking", "play", { url: "say:You said booking." }); -service.addVerbToSection("booking", "hangup", {}); +// The builder's verb methods append to the main section. Named sections use addVerbToSection. +swml.addVerbToSection("booking", "play", { url: "say:You said booking." }); +swml.addVerbToSection("booking", "hangup", {}); -service.addVerbToSection("dispatch", "play", { url: "say:Connecting you to dispatch." }); -service.addVerbToSection("dispatch", "connect", { to: "" }); -service.addVerbToSection("dispatch", "hangup", {}); +swml.addVerbToSection("dispatch", "play", { url: "say:Connecting you to dispatch." }); +swml.addVerbToSection("dispatch", "connect", { to: "" }); +swml.addVerbToSection("dispatch", "hangup", {}); -service.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); -service.addVerbToSection("no_match", "hangup", {}); +swml.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); +swml.addVerbToSection("no_match", "hangup", {}); await service.serve(); ``` @@ -1345,7 +1410,8 @@ sections: main: - answer: {} - prompt: - play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch." + play: + - "say:Thanks for calling Bayview Taxi. Say booking or dispatch." speech_hints: - booking - dispatch @@ -1386,7 +1452,7 @@ sections: { "answer": {} }, { "prompt": { - "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "play": ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], "speech_hints": ["booking", "dispatch"] } }, @@ -1420,17 +1486,16 @@ sections: -#### Hand the call to a phone via Relay +#### Hand the call to a phone via WebSocket (Relay) -[`connect`][relay-connect] takes a list of device groups; each inner list rings at once and the -outer list rings in turn. The dispatch branch bridges to one phone and then waits for the call to -end. +`connect` takes a list of device groups; each inner list rings at once and the outer list rings in +turn. The dispatch branch bridges to one phone and then waits for the call to end. ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as call_routing.py and run: python call_routing.py +# Save as route_calls_relay.py and run: python route_calls_relay.py from signalwire.relay import RelayClient client = RelayClient( @@ -1485,7 +1550,7 @@ client.run() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// Save as call-routing.mts and run: npx tsx call-routing.mts +// Save as route-calls-relay.mts and run: npx tsx route-calls-relay.mts import { RelayClient } from "@signalwire/sdk"; const client = new RelayClient({ @@ -1548,11 +1613,57 @@ up. [`goto`][swml-goto] jumps to a label within the same section, and its `when` condition and `max` count keep the loop bounded. A `label` before the prompt and a conditional `goto` after it repeat -the question once. The Server SDKs can emit the `goto` step but not `label`, whose value is a bare -string rather than an object, so this variation is for a hosted or hand-written document. The -[control flow guide][control-flow] compares `goto` with `execute` and `transfer`. +the question once. The TypeScript builder has a `label` method; the Python SDK cannot emit +`label`, whose value is a bare string rather than an object, so from Python paste the YAML or JSON +form into a hosted script. The [control flow guide][control-flow] compares `goto` with `execute` +and `transfer`. + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as route-calls.mjs, +// then run: node route-calls.mjs +import { SWMLService } from "@signalwire/sdk"; + +const service = new SWMLService({ + name: "route-calls", + route: "/swml", + port: 3000, + basicAuth: ["signalwire", ""], +}); +const swml = service.getBuilder(); + +swml + .answer() + .label("ask") + .prompt({ + play: ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], + speech_hints: ["booking", "dispatch"], + }) + .goto({ label: "ask", when: "prompt_result == 'no_input'", max: 1 }) + .switch({ + variable: "prompt_value", + case: { + booking: [{ transfer: { dest: "booking" } }], + dispatch: [{ transfer: { dest: "dispatch" } }], + }, + default: [{ transfer: { dest: "no_match" } }], + }); + +// The builder's verb methods append to the main section. Named sections use addVerbToSection. +swml.addVerbToSection("booking", "play", { url: "say:You said booking." }); +swml.addVerbToSection("booking", "hangup", {}); + +swml.addVerbToSection("dispatch", "play", { url: "say:You said dispatch." }); +swml.addVerbToSection("dispatch", "hangup", {}); + +swml.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); +swml.addVerbToSection("no_match", "hangup", {}); + +await service.serve(); +``` + ```yaml version: 1.0.0 @@ -1561,7 +1672,8 @@ sections: - answer: {} - label: ask - prompt: - play: "say:Thanks for calling Bayview Taxi. Say booking or dispatch." + play: + - "say:Thanks for calling Bayview Taxi. Say booking or dispatch." speech_hints: - booking - dispatch @@ -1605,7 +1717,7 @@ sections: { "label": "ask" }, { "prompt": { - "play": "say:Thanks for calling Bayview Taxi. Say booking or dispatch.", + "play": ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], "speech_hints": ["booking", "dispatch"] } }, @@ -1645,7 +1757,7 @@ sections: -#### Ask again when the caller says nothing via Relay +#### Ask again when the caller says nothing via WebSocket (Relay) A loop around the prompt exits on the first reply of any kind and gives up after two silent attempts. @@ -1654,7 +1766,7 @@ attempts. ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as call_routing.py and run: python call_routing.py +# Save as route_calls_relay.py and run: python route_calls_relay.py from signalwire.relay import RelayClient client = RelayClient( @@ -1710,7 +1822,7 @@ client.run() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// Save as call-routing.mts and run: npx tsx call-routing.mts +// Save as route-calls-relay.mts and run: npx tsx route-calls-relay.mts import { RelayClient } from "@signalwire/sdk"; const client = new RelayClient({ @@ -1760,17 +1872,17 @@ await client.run(); - - Place the call yourself, then run this flow on the far end once the destination answers. + + Point a phone number at this flow, or place the call yourself and run the flow once the + destination answers. A recorded, multi-department menu in hosted SWML that connects each branch to a real number. - - Serve a different document per call, add routing callbacks, and secure the endpoint for - production. + + Move a served SWML document from a tunnel to a production host. From 0f4d0d040585d846e3f4fa6bb6639245c0698961 Mon Sep 17 00:00:00 2001 From: August Date: Fri, 9 Oct 2026 17:53:34 +0000 Subject: [PATCH 07/12] docs(voice): retitle the route calls card and llms.txt entry --- fern/llms.txt | 2 +- fern/products/platform/pages/calling/voice/overview.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fern/llms.txt b/fern/llms.txt index cdcf183448..07c9a0a2ca 100644 --- a/fern/llms.txt +++ b/fern/llms.txt @@ -153,7 +153,7 @@ Feature pages are grouped by channel. SDK pages come first when available, follo ### Calling -- [Call routing](/docs/platform/voice/call-routing): Answer a call and speak from a flow you host or serve, then collect what the caller says, branch on it, handle silence, and read the result in the call log or your own code. +- [Route calls](/docs/platform/voice/call-routing): Answer a call and speak from a flow you host or serve, then collect what the caller says, branch on it, handle silence, and read the result in the call log or your own code. - [Record calls](/docs/platform/voice/record-calls): Record a whole call in the background with SWML, Relay, the REST Calling API, or Call Flow Builder, then stop, pause, capture a single message or a conference, and manage the files with the Recordings API. - [Call transfer](/docs/server-sdks/guides/call-transfer): Transfer a call to a phone number, SIP endpoint, or SWML document. - [Real-time transcription](/docs/server-sdks/reference/python/relay/call/live-transcribe): Start or stop live transcription on a call. diff --git a/fern/products/platform/pages/calling/voice/overview.mdx b/fern/products/platform/pages/calling/voice/overview.mdx index 2914392eef..96c9e94ad1 100644 --- a/fern/products/platform/pages/calling/voice/overview.mdx +++ b/fern/products/platform/pages/calling/voice/overview.mdx @@ -21,7 +21,7 @@ Whether building a UCaaS solution, modernizing a legacy IVR, augmenting CX with Pick SWML, Relay, or the browser, then call your phone and answer a call to your number - + Answer a call, collect what the caller says, and branch on it with SWML, Relay, or Call Flow Builder From 98b70077c0d7776d1b6619a1fb891beae2201716 Mon Sep 17 00:00:00 2001 From: August Date: Fri, 30 Oct 2026 17:00:50 +0000 Subject: [PATCH 08/12] feat(calling): convert the route calls guide into collect caller input --- .../{call-routing.mdx => collect-input.mdx} | 900 ++++-------------- 1 file changed, 189 insertions(+), 711 deletions(-) rename fern/products/platform/pages/calling/voice/{call-routing.mdx => collect-input.mdx} (59%) diff --git a/fern/products/platform/pages/calling/voice/call-routing.mdx b/fern/products/platform/pages/calling/voice/collect-input.mdx similarity index 59% rename from fern/products/platform/pages/calling/voice/call-routing.mdx rename to fern/products/platform/pages/calling/voice/collect-input.mdx index 07c98a13c6..59bec5a37e 100644 --- a/fern/products/platform/pages/calling/voice/call-routing.mdx +++ b/fern/products/platform/pages/calling/voice/collect-input.mdx @@ -1,64 +1,75 @@ --- -title: Route calls -slug: voice/call-routing -description: Answer a call and speak from a flow you host or serve, then collect what the caller says, branch on it, handle silence, and read the result in the call log or your own code. +title: Collect caller input +slug: voice/collect-input +description: Ask the caller a question with SWML, Relay, or Call Flow Builder, collect speech or key presses, branch on the answer, handle silence and unmatched replies, and read the result in the call log or your own code. max-toc-depth: 3 --- -[addresses]: /docs/platform/addresses +[answer-relay]: /docs/platform/voice/make-and-receive-calls#answer-a-call-via-websocket-relay [api-credentials]: /docs/platform/your-signalwire-api-space -[browser-sdk]: /docs/browser-sdk [cfb]: /docs/call-flow-builder +[cfb-answer]: /docs/call-flow-builder/reference/answer-call [cfb-forward]: /docs/call-flow-builder/reference/forward-to-phone [cfb-gather]: /docs/call-flow-builder/reference/gather-input [cfb-hangup]: /docs/call-flow-builder/reference/hangup-call [cfb-play]: /docs/call-flow-builder/reference/play-audio-or-tts [cfb-version]: /docs/call-flow-builder/guides/version [control-flow]: /docs/swml/guides/goto-execute-transfer-disambiguation -[create-call]: /docs/apis/rest/calls/call-commands +[create-swml-script]: /docs/platform/voice/make-and-receive-calls#create-the-swml-script +[forward-relay]: /docs/platform/voice/forward-calls#forward-an-incoming-call-via-websocket-relay +[forward-swml]: /docs/platform/voice/forward-calls#forward-an-incoming-call-via-swml +[how-incoming]: /docs/platform/voice/make-and-receive-calls#how-an-incoming-call-reaches-your-code [make-receive]: /docs/platform/voice/make-and-receive-calls -[phone-numbers]: /docs/platform/phone-numbers [relay-client]: /docs/server-sdks/guides/relay-client -[resources]: /docs/platform/resources [rest-calling]: /docs/apis/rest/calls/call-commands [server-sdks]: /docs/server-sdks +[speak-rest]: /docs/platform/voice/speak-text#speak-text-on-a-call-in-progress-via-rest +[speak-text]: /docs/platform/voice/speak-text [swml]: /docs/swml -[swml-connect]: /docs/swml/reference/calling/connect [swml-goto]: /docs/swml/reference/calling/goto [swml-prompt]: /docs/swml/reference/calling/prompt [swml-switch]: /docs/swml/reference/calling/switch [swml-transfer]: /docs/swml/reference/calling/transfer -[trial-mode]: /docs/platform/trial-mode -Route a call by deciding what happens after SignalWire answers it: greet the caller, ask a -question, and send the call down a branch based on the reply. The flow you write does not care -whether the call arrived on a phone number, a SIP address, or a browser. Start by answering a call -and speaking one line, then collect speech and branch on it, handle silence and unmatched replies, -and track what the flow heard. - -## Pick the right product for routing calls - -| Function | SWML | WebSocket (Relay) | REST | Browser SDK | Call Flow Builder | -|---|---|---|---|---|---| -| Answer the call and speak without running a server | | | | | | -| Collect speech or keypad digits and branch on the result | | | | | | -| Run the routing logic in your own process, step by step, while the call is live | | | | | | -| Command a call that is already in progress, by its call ID | | | | | | -| Build the flow visually, with no code | | | | | | +Ask the caller a question, collect what they say or press, and send the call down a branch based +on the answer. That one pattern is a department menu, a yes-or-no confirmation, or a request for +an account number, and it works the same whether the call reached your flow from a phone number, a +SIP address, or a browser. Start by asking one question and branching on the reply, then handle +silence and unmatched replies, track what the flow heard, and extend the prompt to keypad digits +and a retry. + +## Pick the right product for collecting caller input + +| Function | SWML | WebSocket (Relay) | REST | Call Flow Builder | +|---|---|---|---|---| +| Ask a question and branch on the answer without running a server | | | | | +| Collect speech, keypad digits, or both on one prompt | | | | | +| Play the question and collect the reply in one command | | | | | +| Tell silence apart from a reply that matched nothing | | | | | +| Compare the reply in your own code while the call is live | | | | | +| Collect input on a call another process answered, by its call ID | | | | | +| Build the menu visually, with no code | | | | | - [SWML][swml] is a JSON or YAML document that SignalWire runs step by step. Generate it with the [Server SDKs][server-sdks] or write it by hand, then host it in your Space or serve it from your - own server. -- [Relay][relay-client] is the WebSocket client in the Server SDKs. Your process receives the call - and issues each command as the call proceeds. -- The [REST Calling API][rest-calling] sends the same commands over HTTP to a call you already hold - the ID for. Results come back as webhooks. -- The [Browser SDK][browser-sdk] places and receives calls from a web page. It is the caller or the - callee, never the flow. -- [Call Flow Builder][cfb] is a visual editor in the Dashboard. You connect nodes and SignalWire - hosts the result as a Call Flow Resource. - -## Prepare for routing calls + own server. Its `prompt` method asks and collects in one step. +- [Relay][relay-client] is the WebSocket client in the Server SDKs. Your process receives the call, + plays the question, and gets the reply back as a value it can compare. +- The [REST Calling API][rest-calling] sends the same collect command over HTTP to a call you + already hold the ID for. The reply arrives as a webhook. +- [Call Flow Builder][cfb] is a visual editor in the Dashboard. Its Gather Input node asks, + collects, and branches without code. + +The Browser SDK places and receives calls from a web page. It is the caller or the callee, never +the flow, so it has no column here. + +## Prepare to collect caller input + +Start from working inbound call setup in [Make and receive calls][make-receive]: a SWML Script, +Relay Application, or Call Flow that a call can reach. This guide picks up once a call reaches your +flow. [How an incoming call reaches your code][how-incoming] explains why the same flow answers a +phone number, a SIP address, a browser call, or the Dashboard's **Click-to-Test** button. To pick a +voice for the questions, see [Speak text on a call][speak-text]. Have these values ready: @@ -66,26 +77,8 @@ Have these values ready: - For the Relay and REST paths, your Project ID and an API token from the Dashboard's [API credentials][api-credentials] page, with the **Voice** permission enabled. A hosted SWML script or a Call Flow needs no credentials. -- For SWML served from your own server, Python 3 or Node.js and [ngrok](https://ngrok.com/download). -- For the hand-off example, a phone number you can answer, and a number in your Space or a verified - caller ID to present when the flow dials it. - - -A [trial project][trial-mode] can hand a call to a number it has purchased or verified, and cannot -reach international numbers at all. Every other step in this guide works on a trial project. - - -This guide picks up once a call reaches your flow. To place calls, or to point a phone number at a -flow, start with [Make and receive calls][make-receive]. - -## Answer a call and speak - -The smallest flow that does something audible: answer, speak one line, hang up. You call it from -the Dashboard, so no phone number is involved yet. - - - -### Set your credentials +- For SWML served from your own server, Python 3 or Node.js and a tunnel such as + [ngrok](https://ngrok.com/download). Replace these placeholders in the samples. The hosted SWML and Call Flow Builder paths use none of them. @@ -94,297 +87,18 @@ them. |---|---| | `` | Your Space's subdomain in `.signalwire.com` | | `` | Your Project ID | -| `` | Your API token | +| `` | Your API token, used only in server code | | `` | A password you choose; SignalWire presents it when it fetches a served SWML document | -| `` | The hostname of the tunnel in front of your served SWML document | | `` | The ID of a call in progress, for the REST samples | | `` | A public HTTPS URL on your server that accepts POST requests | -| `` | A phone number you can answer, in E.164 format | -| `` | A number in your Space, or a verified caller ID | - -### Write the flow - - - - -The document below answers the call, speaks, and hangs up. The [Server SDKs][server-sdks] build -it from code with the SWML builder and serve it over HTTP; the YAML and JSON forms are what you -paste into the Dashboard. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as route_calls.py and run: python route_calls.py -from signalwire import SWMLBuilder, SWMLService - -service = SWMLService( - name="route-calls", - route="/swml", - port=3000, - basic_auth=("signalwire", ""), -) -SWMLBuilder(service).answer().say("Thanks for calling Bayview Taxi. Your flow is running.").hangup() - -# Serves the document at /swml. Put the credentials in the URL you give -# SignalWire: https://signalwire:@/swml -service.serve() -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as route-calls.mjs, -// then run: node route-calls.mjs -import { SWMLService } from "@signalwire/sdk"; - -const service = new SWMLService({ - name: "route-calls", - route: "/swml", - port: 3000, - basicAuth: ["signalwire", ""], -}); -service.getBuilder().answer().say("Thanks for calling Bayview Taxi. Your flow is running.").hangup(); - -// Serves the document at /swml. Put the credentials in the URL you give -// SignalWire: https://signalwire:@/swml -await service.serve(); -``` - - -```yaml -version: 1.0.0 -sections: - main: - - answer: {} - - play: - url: "say:Thanks for calling Bayview Taxi. Your flow is running." - - hangup: {} -``` - - -```json -{ - "version": "1.0.0", - "sections": { - "main": [ - { "answer": {} }, - { "play": { "url": "say:Thanks for calling Bayview Taxi. Your flow is running." } }, - { "hangup": {} } - ] - } -} -``` - - - -Execution starts at the `main` section, which every document must have. Each section is an -ordered list of methods. `answer` picks up the call, `play` speaks the text after the `say:` -prefix, and `hangup` ends the call. The builder's `say` is shorthand for a `play` with a `say:` -URL, and every builder method validates its method against the SWML schema before adding it. - - - - -A Relay client stays connected to SignalWire and receives every call routed to its topic. The -handler answers, speaks, and hangs up when playback completes. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as route_calls_relay.py and run: python route_calls_relay.py -from signalwire.relay import RelayClient - -client = RelayClient( - project="", - token="", - host=".signalwire.com", - contexts=["default"], -) - - -@client.on_call -async def handle_call(call): - await call.answer() - - async def hang_up_after_playback(_event): - if call.state != "ended": - await call.hangup() - - await call.play( - [{"type": "tts", "params": {"text": "Thanks for calling Bayview Taxi. Your flow is running."}}], - on_completed=hang_up_after_playback, - ) - await call.wait_for_ended() +## Ask a question and branch on the answer -client.run() -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as route-calls-relay.mjs, -// then run: node route-calls-relay.mjs -import { RelayClient } from "@signalwire/sdk"; - -const client = new RelayClient({ - project: "", - token: "", - host: ".signalwire.com", - contexts: ["default"], -}); +In every surface the pattern is the same: play a question, wait for input, compare the result, and +continue down one path. Bayview Taxi asks callers to say "booking" or "dispatch". Speech hints tell +the recognizer which words to expect, which makes short single-word replies reliable. -client.onCall(async (call) => { - await call.answer(); - await call.play([ - { type: "tts", text: "Thanks for calling Bayview Taxi. Your flow is running." }, - ], { - onCompleted: async () => { - if (call.state !== "ended") await call.hangup(); - }, - }); - await call.waitForEnded(); -}); - -await client.run(); -``` - - - -`contexts` names the topic the client listens on. The Relay Application Resource you create in the -next step uses the same name, so SignalWire knows which running client gets the call. `run()` -blocks until you stop the process, reconnecting if the connection drops. - - - - -Open **Tools** > **Call Flow Builder** in the Dashboard, select **Add New**, name the flow, and -select **Save**. Open the flow's **More Options** menu and select **Edit** to reach the canvas. - -Every flow starts from the **Handle Call** node. Connect these nodes in order: - -1. [**Answer Call**](/docs/call-flow-builder/reference/answer-call). -2. [**Play Audio or TTS**][cfb-play], with the text - "Thanks for calling Bayview Taxi. Your flow is running." in its Text to Speech setting. -3. [**Hangup Call**][cfb-hangup]. - -Select **Deploy** to make this version the live one. The [versioning guide][cfb-version] explains -how deployed and draft versions relate. - - - - -### Give the flow a Resource - -SignalWire routes calls to [Resources][resources]. This step makes your flow one, and it is the -only place in this guide where delivery differs by surface. Every later task changes the flow's -contents, not how it reaches the call. - - - - -Choose where the document lives. - -#### Host it in your Space - -1. Open **My Resources**, select **+ Add**, then **Script**, then **SWML Script**. -2. Name it **Route calls**. -3. Under **Handle Calls Using**, choose **Hosted Script**, paste the YAML or JSON form of the - document into **Primary Script**, and save. - -The script is listed under **My Resources**. Return here to replace its contents in each later -task. - -#### Serve it from your server - -Start the flow from the SWML builder sample: - -```bash -python route_calls.py -``` - -In a second terminal, open a tunnel to port 3000 and keep it running: - -```bash -ngrok http 3000 -``` - -ngrok prints an `https://` **Forwarding** URL. Its hostname is your ``. Confirm -the document is reachable through the tunnel: - -```bash -curl --fail \ - --user "signalwire:" \ - "https:///swml" \ - | python -m json.tool -``` - -A working flow returns a JSON document with `"version": "1.0.0"` and a `sections.main` array. - -Then create the Resource: - -1. Open **My Resources**, select **+ Add**, then **Script**, then **SWML Script**. -2. Name it **Route calls**. -3. Under **Handle Calls Using**, choose **External URL**, enter - `https://signalwire:@/swml` in - **Primary Script URL**, and save. - -Later tasks change `route_calls.py` and restart it; the Resource keeps pointing at the tunnel. A -new tunnel usually means a new hostname, so update the Resource whenever it changes. - - - - -Start the client and leave it running: - -```bash -python route_calls_relay.py -``` - -In the Dashboard, open **My Resources**, select **+ Add**, then **Relay Application**. Name it and -enter `default` as the **Topic**, the value in the client's `contexts`, then save. Calls to this -Resource reach whichever connected client listens on that topic. - - - - -A deployed Call Flow is already a Resource, listed under **My Resources**. - - - - -### Call it and listen - -Open the Resource under **My Resources** and select **Click-to-Test**, under the Resource's name. A -new tab opens, shows "Connecting", and places a browser call to the Resource. Allow microphone -access if the browser asks. - -You hear "Thanks for calling Bayview Taxi. Your flow is running." and the call ends. - -If it doesn't, match the symptom: - -- **The call connects but stays silent.** The flow never ran. For a served document, repeat the - `curl` request to confirm the tunnel still answers, then check that the External URL Resource - carries the same URL and password. For a hosted script, reopen it and confirm the document saved - with a `main` section. For Relay, check that the client process is still running and that the - Resource's **Topic** matches its `contexts`. -- **`curl` returns 401.** The password in the request differs from the one in the sample's - `basic_auth`. -- **Click-to-Test is disabled.** It appears only on Resources that handle calls and have an - address. Open the Resource's **Addresses** and add an alias. - - - -## Collect speech and branch on it - -The flow now asks a question and routes on the answer. In every surface the pattern is the same: -play a prompt, wait for input, compare the result, and continue down one path. Bayview Taxi asks -callers to say "booking" or "dispatch". Speech hints tell the recognizer which words to expect, -which makes short single-word replies reliable. - -### Collect speech and branch via SWML +### Ask a question and branch via SWML Three methods do the work. [`prompt`][swml-prompt] plays the question and waits. Setting any speech parameter, such as `speech_hints`, switches it from keypad digits to speech; the recognized @@ -393,19 +107,20 @@ text lands in the `prompt_value` variable and the outcome in `prompt_result`. `default` when nothing matches. [`transfer`][swml-transfer] jumps to another section and does not return. -Replace the flow with this version. The `booking` and `dispatch` sections each speak a different -line, and `no_match` catches everything else. The builder's methods append to `main`; the named -sections go through the service. +The `booking` and `dispatch` sections each speak a different line, and `no_match` catches +everything else. The [Server SDKs][server-sdks] build the document with the SWML builder and serve +it over HTTP; the YAML and JSON forms are what you paste into a hosted script. The builder's +methods append to `main`; the named sections go through the service. ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as route_calls.py and run: python route_calls.py +# Save as collect_input.py and run: python collect_input.py from signalwire import SWMLBuilder, SWMLService service = SWMLService( - name="route-calls", + name="collect-input", route="/swml", port=3000, basic_auth=("signalwire", ""), @@ -443,12 +158,12 @@ service.serve() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as route-calls.mjs, -// then run: node route-calls.mjs +// This sample also runs as JavaScript: save as collect-input.mjs, +// then run: node collect-input.mjs import { SWMLService } from "@signalwire/sdk"; const service = new SWMLService({ - name: "route-calls", + name: "collect-input", route: "/swml", port: 3000, basicAuth: ["signalwire", ""], @@ -568,29 +283,43 @@ that. `switch` compares the whole value exactly. SignalWire lowercases recognize its punctuation before storing it in `prompt_value`, so "Booking." still matches the `booking` case, but "booking please" does not. SWML also has a `cond` method that branches on a JavaScript expression; the Python SDK cannot emit it, because `add_verb` takes only object-valued methods and -`cond` takes a list, so this guide branches with `switch` on every surface. +`cond` takes a list, so the SWML samples in this guide branch with `switch`. -Restart the served flow, or paste the new document into the hosted script, then call the Resource -three times: say "booking", say "dispatch", and say nothing. You hear a different line each time. -If every call ends in `no_match`, the recognized text did not equal a case key; the tracking -section below shows what the flow heard. +Run the program and point an External URL SWML Script at it through your tunnel, or paste the YAML +or JSON into a Hosted Script, as in [Create the SWML Script][create-swml-script]. To put dispatch +callers through to a person instead of playing a line, the `dispatch` section can +[connect the call to a phone][forward-swml]. -### Collect speech and branch via WebSocket (Relay) +Then open the Resource under **My Resources** and select **Click-to-Test**, under the Resource's +name. A new tab opens, shows "Connecting", and places a browser call to the Resource. Allow +microphone access if the browser asks. Call three times: say "booking", say "dispatch", and say +nothing. You hear a different line each time. + +If you don't, match the symptom: + +- **The call connects but stays silent.** The flow never ran. For a served document, request it + through the tunnel with `curl` to confirm it still answers, then check that the Resource's + **Primary Script URL** carries the same hostname and password. For a hosted script, reopen it and + confirm the document saved with a `main` section. +- **`curl` returns 401.** The password in the request differs from the one in the sample's + `basic_auth`. +- **Every call ends in the `no_match` line.** The recognized text did not equal a case key. + [Track what the flow heard](#track-what-the-flow-heard) shows the text SignalWire stored. +- **Click-to-Test is disabled.** It appears only on Resources that handle calls and have an + address. Open the Resource's **Addresses & Phone Numbers** tab and add an alias. + +### Ask a question and branch via WebSocket (Relay) The [Server SDKs][server-sdks] expose the prompt as `play_and_collect` on the call. It plays the -prompt and resolves when input arrives, times out, or fails. The result carries a `type` of +question and resolves when input arrives, times out, or fails. The result carries a `type` of `speech`, `digit`, `no_input`, or `no_match`, and for speech the recognized `text` with a `confidence` score. Your code compares the text and continues. -Over REST the same collect command runs against a call you already hold the ID for, so the request -needs the call to exist first, for example a call your Relay client or a hosted script answered. -The result arrives at `status_url` as a `calling.call.collect` event instead of a return value. - ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as route_calls_relay.py and run: python route_calls_relay.py +# Save as collect_input_relay.py and run: python collect_input_relay.py from signalwire.relay import RelayClient client = RelayClient( @@ -640,7 +369,7 @@ client.run() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// Save as route-calls-relay.mts and run: npx tsx route-calls-relay.mts +// Save as collect-input-relay.mts and run: npx tsx collect-input-relay.mts import { RelayClient } from "@signalwire/sdk"; const client = new RelayClient({ @@ -680,6 +409,67 @@ client.onCall(async (call) => { await client.run(); ``` + + +Because the comparison runs in your code, you can match loosely: `"booking" in heard` accepts +"booking please" as well as "booking". To put dispatch callers through to a person, +[connect the call to a phone][forward-relay] instead of playing the reply. + +Run the client and create a Relay Application Resource whose **Topic** is `default`, the value in +the client's `contexts`, as in [Answer a call via WebSocket (Relay)][answer-relay]. Then open the +Resource under **My Resources**, select **Click-to-Test**, and call three times to hear the three +outcomes. If the client logs an authentication error at startup, the project, token, and Space do +not belong together. If the call connects but stays silent, check that the client process is still +running and that the Resource's **Topic** matches its `contexts`. + +Over REST, the same collect runs as the `calling.collect` command on a call you already hold the +ID for, such as one a hosted script answered. REST can't play the question and collect in one +command, so [speak the question with `calling.play`][speak-rest] first. The reply arrives at +`status_url` as a `calling.call.collect` event instead of a return value, and `control_id` names +the collect so you can match the event to it. + + + +```python +# Install: python -m pip install signalwire-sdk==3.4.1 +# Save as collect_rest.py and run: python collect_rest.py +from signalwire.rest import RestClient + +client = RestClient( + project="", + token="", + host=".signalwire.com", +) + +# signalwire-sdk 3.4.1 has no status_url argument; extras merges it into the command's params. +client.calling.collect( + "", + control_id="collect-1", + speech={"hints": ["booking", "dispatch"], "language": "en-US"}, + extras={"status_url": ""}, +) +``` + + +```typescript +// Install: npm install @signalwire/sdk@2.0.5 +// This sample also runs as JavaScript: save as collect-rest.mjs, +// then run: node collect-rest.mjs +import { RestClient } from "@signalwire/sdk"; + +const client = new RestClient({ + project: "", + token: "", + host: ".signalwire.com", +}); + +await client.calling.collect("", { + control_id: "collect-1", + speech: { hints: ["booking", "dispatch"], language: "en-US" }, + status_url: "", +}); +``` + ```bash # Runs against a call that is already answered; play the question first with calling.play. @@ -690,7 +480,7 @@ curl --request POST "https://.signalwire.com/api/calling/calls" \ "id": "", "command": "calling.collect", "params": { - "control_id": "route-1", + "control_id": "collect-1", "speech": { "hints": ["booking", "dispatch"], "language": "en-US" }, "status_url": "" } @@ -701,22 +491,25 @@ curl --request POST "https://.signalwire.com/api/calling/calls" \ The [Calling API reference][rest-calling] documents every `calling.collect` field. -Because the comparison runs in your code, you can match loosely: `"booking" in heard` accepts -"booking please" as well as "booking". Restart the client and call the Resource three times to hear -the three outcomes. If the client logs an authentication error at startup, the project, token, and -Space do not belong together. +### Ask a question and branch via Call Flow Builder -### Collect speech and branch via Call Flow Builder +Open **Tools** > **Call Flow Builder** in the Dashboard, select **Add New**, name the flow, and +select **Save**. Open the flow's **More Options** menu and select **Edit** to reach the canvas. +Every flow starts from the **Handle Call** node. Connect these nodes in order: -Replace the **Play Audio or TTS** node with a [**Gather Input**][cfb-gather] node and set its Text -to Speech to "Thanks for calling Bayview Taxi. Say booking or dispatch." Every input option pairs a -key with a word: add one option with **Caller presses** `1` and **Or says** `booking`, and a second -with `2` and `dispatch`. The node grows one output connector per option, plus **Unknown** and -**No Input**. +1. [**Answer Call**][cfb-answer]. +2. [**Gather Input**][cfb-gather], with "Thanks for calling Bayview Taxi. Say booking or dispatch." + as its Text to Speech. Every input option pairs a key with a word: add one option with + **Caller presses** `1` and **Or says** `booking`, and a second with `2` and `dispatch`. The node + grows one output connector per option, plus **Unknown** and **No Input**. +3. A [**Play Audio or TTS**][cfb-play] node on each option's connector, with the matching line, + and a [**Hangup Call**][cfb-hangup] node after each. To put dispatch callers through to a + person, use a [**Forward to Phone**][cfb-forward] node instead. -Connect each option to its own **Play Audio or TTS** node with the matching line, and each of -those to a **Hangup Call** node. Leave **Unknown** and **No Input** for the next task. Select -**Deploy**, then call the Resource three times. +Leave **Unknown** and **No Input** for the next task. Select **Deploy** to make this version the +live one; the [versioning guide][cfb-version] explains how deployed and draft versions relate. A +deployed Call Flow is a Resource under **My Resources**, so **Click-to-Test** works here too: call +three times and hear the three outcomes. ## Handle silence and unmatched speech @@ -873,7 +666,7 @@ The POST body for a recognized reply looks like this. `params.result.type` is `n ```json { "event_type": "calling.call.collect", - "event_channel": "signalwire_calling_...", + "event_channel": "swml:...", "timestamp": 1757971200.123, "project_id": "", "space_id": "...", @@ -980,16 +773,6 @@ sequenceDiagram The Dashboard's call log shows the Collect step and its outcome for every surface, but never the text. -## Reach the same flow from any channel - -The flow you wrote does not know where the call came from. The Dashboard reached it through -**Click-to-Test**. A [phone number][phone-numbers] assigned to the same Resource runs the identical -flow, and so does a SIP address, a browser call to the Resource's [address][addresses], or an -outbound call you place with the [REST Calling API][create-call] and point at the Resource. -Direction and channel are routing details on the Resource; the flow is the same program. That is -also why delivery was a single step above: once a Resource exists, every task in this guide edits -the flow and leaves the routing alone. - ## Examples ### Accept a keypad digit as well as speech @@ -1006,11 +789,11 @@ joins the prompt, and the digit keys join the switch. ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as route_calls.py and run: python route_calls.py +# Save as collect_input.py and run: python collect_input.py from signalwire import SWMLBuilder, SWMLService service = SWMLService( - name="route-calls", + name="collect-input", route="/swml", port=3000, basic_auth=("signalwire", ""), @@ -1051,12 +834,12 @@ service.serve() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as route-calls.mjs, -// then run: node route-calls.mjs +// This sample also runs as JavaScript: save as collect-input.mjs, +// then run: node collect-input.mjs import { SWMLService } from "@signalwire/sdk"; const service = new SWMLService({ - name: "route-calls", + name: "collect-input", route: "/swml", port: 3000, basicAuth: ["signalwire", ""], @@ -1193,7 +976,7 @@ Pass both `digits` and `speech` in the collect config. A keypad reply comes back ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as route_calls_relay.py and run: python route_calls_relay.py +# Save as collect_input_relay.py and run: python collect_input_relay.py from signalwire.relay import RelayClient client = RelayClient( @@ -1247,7 +1030,7 @@ client.run() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// Save as route-calls-relay.mts and run: npx tsx route-calls-relay.mts +// Save as collect-input-relay.mts and run: npx tsx collect-input-relay.mts import { RelayClient } from "@signalwire/sdk"; const client = new RelayClient({ @@ -1299,311 +1082,6 @@ The flow you built already accepts both, because every **Gather Input** option c **Caller presses** key as well as an **Or says** word. Change the prompt text to mention the keys and select **Deploy**. -### Hand the call to a phone - -Once the flow knows what the caller wants, connect them to a person. Bayview Taxi sends dispatch -callers to Ada's desk phone. The caller hears ringing, and the flow resumes only if the connection -fails or the other side hangs up first. - - -On a [trial project][trial-mode], `` must be a number the project has purchased -or verified. - - -#### Hand the call to a phone via SWML - -The `dispatch` section announces the hand-off, then [`connect`][swml-connect] dials the -destination. The caller's own number is presented as caller ID unless you set `from`. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as route_calls.py and run: python route_calls.py -from signalwire import SWMLBuilder, SWMLService - -service = SWMLService( - name="route-calls", - route="/swml", - port=3000, - basic_auth=("signalwire", ""), -) -( - SWMLBuilder(service) - .answer() - .prompt( - play=["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], - speech_hints=["booking", "dispatch"], - ) - .switch( - variable="prompt_value", - case={ - "booking": [{"transfer": {"dest": "booking"}}], - "dispatch": [{"transfer": {"dest": "dispatch"}}], - }, - default=[{"transfer": {"dest": "no_match"}}], - ) -) - -# The builder appends to the main section. Named sections go through the service. -service.add_verb_to_section("booking", "play", {"url": "say:You said booking."}) -service.add_verb_to_section("booking", "hangup", {}) - -service.add_verb_to_section("dispatch", "play", {"url": "say:Connecting you to dispatch."}) -service.add_verb_to_section("dispatch", "connect", {"to": ""}) -service.add_verb_to_section("dispatch", "hangup", {}) - -service.add_verb_to_section("no_match", "play", {"url": "say:Sorry, I didn't catch that. Goodbye."}) -service.add_verb_to_section("no_match", "hangup", {}) - -service.serve() -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as route-calls.mjs, -// then run: node route-calls.mjs -import { SWMLService } from "@signalwire/sdk"; - -const service = new SWMLService({ - name: "route-calls", - route: "/swml", - port: 3000, - basicAuth: ["signalwire", ""], -}); -const swml = service.getBuilder(); - -swml - .answer() - .prompt({ - play: ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], - speech_hints: ["booking", "dispatch"], - }) - .switch({ - variable: "prompt_value", - case: { - booking: [{ transfer: { dest: "booking" } }], - dispatch: [{ transfer: { dest: "dispatch" } }], - }, - default: [{ transfer: { dest: "no_match" } }], - }); - -// The builder's verb methods append to the main section. Named sections use addVerbToSection. -swml.addVerbToSection("booking", "play", { url: "say:You said booking." }); -swml.addVerbToSection("booking", "hangup", {}); - -swml.addVerbToSection("dispatch", "play", { url: "say:Connecting you to dispatch." }); -swml.addVerbToSection("dispatch", "connect", { to: "" }); -swml.addVerbToSection("dispatch", "hangup", {}); - -swml.addVerbToSection("no_match", "play", { url: "say:Sorry, I didn't catch that. Goodbye." }); -swml.addVerbToSection("no_match", "hangup", {}); - -await service.serve(); -``` - - -```yaml -version: 1.0.0 -sections: - main: - - answer: {} - - prompt: - play: - - "say:Thanks for calling Bayview Taxi. Say booking or dispatch." - speech_hints: - - booking - - dispatch - - switch: - variable: prompt_value - case: - booking: - - transfer: - dest: booking - dispatch: - - transfer: - dest: dispatch - default: - - transfer: - dest: no_match - booking: - - play: - url: "say:You said booking." - - hangup: {} - dispatch: - - play: - url: "say:Connecting you to dispatch." - - connect: - to: "" - - hangup: {} - no_match: - - play: - url: "say:Sorry, I didn't catch that. Goodbye." - - hangup: {} -``` - - -```json -{ - "version": "1.0.0", - "sections": { - "main": [ - { "answer": {} }, - { - "prompt": { - "play": ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], - "speech_hints": ["booking", "dispatch"] - } - }, - { - "switch": { - "variable": "prompt_value", - "case": { - "booking": [{ "transfer": { "dest": "booking" } }], - "dispatch": [{ "transfer": { "dest": "dispatch" } }] - }, - "default": [{ "transfer": { "dest": "no_match" } }] - } - } - ], - "booking": [ - { "play": { "url": "say:You said booking." } }, - { "hangup": {} } - ], - "dispatch": [ - { "play": { "url": "say:Connecting you to dispatch." } }, - { "connect": { "to": "" } }, - { "hangup": {} } - ], - "no_match": [ - { "play": { "url": "say:Sorry, I didn't catch that. Goodbye." } }, - { "hangup": {} } - ] - } -} -``` - - - -#### Hand the call to a phone via WebSocket (Relay) - -`connect` takes a list of device groups; each inner list rings at once and the outer list rings in -turn. The dispatch branch bridges to one phone and then waits for the call to end. - - - -```python -# Install: python -m pip install signalwire-sdk==3.4.1 -# Save as route_calls_relay.py and run: python route_calls_relay.py -from signalwire.relay import RelayClient - -client = RelayClient( - project="", - token="", - host=".signalwire.com", - contexts=["default"], -) - - -@client.on_call -async def handle_call(call): - await call.answer() - - action = await call.play_and_collect( - media=[{"type": "tts", "params": {"text": "Thanks for calling Bayview Taxi. Say booking or dispatch."}}], - collect={"speech": {"hints": ["booking", "dispatch"], "language": "en-US"}}, - ) - event = await action.wait() - result = event.params.get("result", {}) - - heard = "" - if result.get("type") == "speech": - heard = result.get("params", {}).get("text", "").lower() - - if "dispatch" in heard: - announce = await call.play([{"type": "tts", "params": {"text": "Connecting you to dispatch."}}]) - await announce.wait() - await call.connect([[{ - "type": "phone", - "params": {"to_number": "", "from_number": "", "timeout": 30}, - }]]) - await call.wait_for_ended() - return - - reply = "You said booking." if "booking" in heard else "Sorry, I didn't catch that. Goodbye." - - async def hang_up_after_playback(_event): - if call.state != "ended": - await call.hangup() - - await call.play( - [{"type": "tts", "params": {"text": reply}}], - on_completed=hang_up_after_playback, - ) - await call.wait_for_ended() - - -client.run() -``` - - -```typescript -// Install: npm install @signalwire/sdk@2.0.5 -// Save as route-calls-relay.mts and run: npx tsx route-calls-relay.mts -import { RelayClient } from "@signalwire/sdk"; - -const client = new RelayClient({ - project: "", - token: "", - host: ".signalwire.com", - contexts: ["default"], -}); - -client.onCall(async (call) => { - await call.answer(); - - const action = await call.playAndCollect( - [{ type: "tts", text: "Thanks for calling Bayview Taxi. Say booking or dispatch." }], - { speech: { hints: ["booking", "dispatch"], language: "en-US" } }, - ); - const event = await action.wait(); - const result = (event.params.result ?? {}) as { - type?: string; - params?: { text?: string }; - }; - const heard = result.type === "speech" ? (result.params?.text ?? "").toLowerCase() : ""; - - if (heard.includes("dispatch")) { - const announce = await call.play([{ type: "tts", text: "Connecting you to dispatch." }]); - await announce.wait(); - await call.connect([[{ - type: "phone", - params: { to_number: "", from_number: "", timeout: 30 }, - }]]); - await call.waitForEnded(); - return; - } - - const reply = heard.includes("booking") ? "You said booking." : "Sorry, I didn't catch that. Goodbye."; - await call.play([{ type: "tts", text: reply }], { - onCompleted: async () => { - if (call.state !== "ended") await call.hangup(); - }, - }); - await call.waitForEnded(); -}); - -await client.run(); -``` - - - -#### Hand the call to a phone via Call Flow Builder - -Connect the `dispatch` option to a [**Forward to Phone**][cfb-forward] node with -`` as its number, then select **Deploy**. - ### Ask again when the caller says nothing One retry turns a dead end into a second chance. Ask the question again after silence, then give @@ -1622,12 +1100,12 @@ and `transfer`. ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// This sample also runs as JavaScript: save as route-calls.mjs, -// then run: node route-calls.mjs +// This sample also runs as JavaScript: save as collect-input.mjs, +// then run: node collect-input.mjs import { SWMLService } from "@signalwire/sdk"; const service = new SWMLService({ - name: "route-calls", + name: "collect-input", route: "/swml", port: 3000, basicAuth: ["signalwire", ""], @@ -1766,7 +1244,7 @@ attempts. ```python # Install: python -m pip install signalwire-sdk==3.4.1 -# Save as route_calls_relay.py and run: python route_calls_relay.py +# Save as collect_input_relay.py and run: python collect_input_relay.py from signalwire.relay import RelayClient client = RelayClient( @@ -1822,7 +1300,7 @@ client.run() ```typescript // Install: npm install @signalwire/sdk@2.0.5 -// Save as route-calls-relay.mts and run: npx tsx route-calls-relay.mts +// Save as collect-input-relay.mts and run: npx tsx collect-input-relay.mts import { RelayClient } from "@signalwire/sdk"; const client = new RelayClient({ @@ -1872,17 +1350,17 @@ await client.run(); - - Point a phone number at this flow, or place the call yourself and run the flow once the - destination answers. + + Pick a voice for the questions, and speak on a call in progress over REST. - - A recorded, multi-department menu in hosted SWML that connects each branch to a real number. + + Connect the branch the caller chose to a phone, and play a message when nobody answers. - - Move a served SWML document from a tunnel to a production host. + + Point a phone number at this flow, or place the call yourself and run the flow once the + destination answers. From d4ef787213e02bdd0cae55f362b17db8e569ac9b Mon Sep 17 00:00:00 2001 From: August Date: Fri, 30 Oct 2026 17:01:07 +0000 Subject: [PATCH 09/12] docs(calling): point the overview, llms.txt, and speak text at the collect input guide --- fern/llms.txt | 3 +-- .../platform/pages/calling/voice/TTS/speak-text.mdx | 2 ++ fern/products/platform/pages/calling/voice/overview.mdx | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/fern/llms.txt b/fern/llms.txt index f3415e9035..3033ec11ab 100644 --- a/fern/llms.txt +++ b/fern/llms.txt @@ -154,7 +154,6 @@ Feature pages are grouped by channel. SDK pages come first when available, follo ### Calling -- [Route calls](/docs/platform/voice/call-routing): Answer a call and speak from a flow you host or serve, then collect what the caller says, branch on it, handle silence, and read the result in the call log or your own code. - [Record calls](/docs/platform/voice/record-calls): Record a whole call in the background with SWML, Relay, the REST Calling API, or Call Flow Builder, then stop, pause, capture a single message or a conference, and manage the files with the Recordings API. - [Forward calls](/docs/platform/voice/forward-calls): Forward calls to your SignalWire number to another phone with SWML or Relay, play a message when nobody answers, and forward a call already in progress over REST. - [Call transfer](/docs/server-sdks/guides/call-transfer): Transfer a call to a phone number, SIP endpoint, or SWML document. @@ -164,7 +163,7 @@ Feature pages are grouped by channel. SDK pages come first when available, follo - [Stream call audio](/docs/platform/voice/call-streaming): Stream a live call to your own WebSocket server with SWML, Relay, or REST, then save or process the audio as it arrives, and play audio back into the call on a bidirectional stream. - [Conferencing](/docs/server-sdks/reference/python/relay/call/join-conference): Join a call to an ad-hoc audio conference. - [Secure payments](/docs/server-sdks/reference/python/relay/call/pay): Collect payment information on a call. -- [Collect caller input](/docs/server-sdks/reference/python/relay/call/play-and-collect): Play audio and collect speech or key presses. +- [Collect caller input](/docs/platform/voice/collect-input): Ask the caller a question with SWML, Relay, or Call Flow Builder, collect speech or key presses, branch on the answer, handle silence and unmatched replies, and read the result in the call log or your own code. - [Detect machines](/docs/platform/voice/machine-detection): Detect people, voicemail, and fax machines with SWML or Relay. Follow an AMD example and a fax example, handle results, and tune detection. - [Noise reduction](/docs/server-sdks/reference/python/relay/call/denoise): Start noise reduction on a call. - [Queue calls](/docs/platform/voice/call-queues): Hold callers in a queue and connect each one to the next free agent with SWML or Relay, then track, remove, and manage waiting callers. diff --git a/fern/products/platform/pages/calling/voice/TTS/speak-text.mdx b/fern/products/platform/pages/calling/voice/TTS/speak-text.mdx index 24707c10a8..bab54cbbd6 100644 --- a/fern/products/platform/pages/calling/voice/TTS/speak-text.mdx +++ b/fern/products/platform/pages/calling/voice/TTS/speak-text.mdx @@ -25,6 +25,7 @@ position: 1 [swml-set]: /docs/swml/reference/calling/set [swml-ai-languages]: /docs/swml/reference/calling/ai/languages#use-voice-strings [call-commands]: /docs/apis/rest/calls/call-commands +[collect-input]: /docs/platform/voice/collect-input Text-to-speech (TTS) reads text aloud on a live call, such as a booking confirmation or a menu. You give SignalWire the text and a voice from the [TTS voice catalog][tts-voices], and it speaks @@ -405,3 +406,4 @@ or `calling.play.volume` with the same `control_id`. The REST Calling API can't speak and collect input in one step. To speak a menu, start the call with a SWML [`prompt`][swml-prompt] or control it from a Relay client. +[Collect caller input][collect-input] shows both and how to branch on the reply. diff --git a/fern/products/platform/pages/calling/voice/overview.mdx b/fern/products/platform/pages/calling/voice/overview.mdx index 096c287c50..ed5088aae8 100644 --- a/fern/products/platform/pages/calling/voice/overview.mdx +++ b/fern/products/platform/pages/calling/voice/overview.mdx @@ -21,8 +21,8 @@ Whether building a UCaaS solution, modernizing a legacy IVR, augmenting CX with Pick SWML, Relay, or the browser, then call your phone and answer a call to your number - - Answer a call, collect what the caller says, and branch on it with SWML, Relay, or Call Flow Builder + + Ask a question, collect speech or key presses, and branch on the answer with SWML, Relay, or Call Flow Builder Learn whether a person, voicemail, or fax machine is on a call you place or receive, and act on it @@ -178,7 +178,7 @@ Yes. Speak text from [SWML](/docs/swml/reference/calling/play), from a [Relay cl -Speech to text is available through [SWML's prompt method](/docs/swml/reference/prompt) or you can collect speech and transcribe with Node.js using the [Relay SDK](/docs/server-sdks/reference/python/relay/call/collect). +Yes. Collect what a caller says with [SWML's `prompt` method](/docs/swml/reference/calling/prompt), a Relay client, or the REST Calling API; the [Collect caller input](/docs/platform/voice/collect-input) guide covers each of them and shows how to branch on the reply. From eba0c65edce438e61c92f43ec1ef5f54a50d7b72 Mon Sep 17 00:00:00 2001 From: August Date: Fri, 30 Oct 2026 17:01:16 +0000 Subject: [PATCH 10/12] docs(swml): retire the simple IVR recipe and redirect it to collect caller input --- .../guides/recipes/creating-ivr-with-swml.mdx | 527 ------------------ fern/redirects.yml | 3 + 2 files changed, 3 insertions(+), 527 deletions(-) delete mode 100644 fern/products/swml/pages/guides/recipes/creating-ivr-with-swml.mdx diff --git a/fern/products/swml/pages/guides/recipes/creating-ivr-with-swml.mdx b/fern/products/swml/pages/guides/recipes/creating-ivr-with-swml.mdx deleted file mode 100644 index 3be43bf259..0000000000 --- a/fern/products/swml/pages/guides/recipes/creating-ivr-with-swml.mdx +++ /dev/null @@ -1,527 +0,0 @@ ---- -id: 80fec1fc-b153-474f-801b-8cd4aecb1566 -slug: guides/ivr -title: Simple IVR -description: Learn how to create a simple IVR with SWML. -x-custom: - tags: - - favorite - - sdk:swml - - product:voice -max-toc-depth: 3 ---- - -In this tutorial, we will demonstrate how to build a Simple IVR (Interactive Voice Response) using SWML (SignalWire Markup Language). -SWML enables you to create Relay applications using a descriptive format without the need for additional infrastructure like your own server. - -## Getting started - -Start with the [inbound calling guide](/docs/platform/voice/make-and-receive-calls#answer-a-call-via-swml) -to create a hosted SWML Script and assign it to a phone number. Use that setup for the menu below. - -The first crucial step is to have a SignalWire Space. Begin by [signing up now to get started](https://signalwire.com/signups/new). - -In this guide we will create an IVR with SWML that takes a prompt from the user and directs callers to the appropriate resource. - - - - - -```yaml -version: 1.0.0 -sections: - main: - - answer: {} - - play: - urls: - - >- - say:Welcome to the Vance Refrigerator Corporation. For Quality - assurance this call maybe recorded - - record_call: - stereo: true - format: wav - - prompt: - play: >- - say:Press 1 to talk to sales, Press 2 to talk to Support, Press 3 to - talk to a Customer Representative - say_language: en-US - max_digits: 1 - speech_hints: - - one - - two - - three - - switch: - variable: prompt_value - case: - '1': - - execute: - dest: sales - '2': - - execute: - dest: support - '3': - - execute: - dest: customer - one: - - execute: - dest: sales - two: - - execute: - dest: support - three: - - execute: - dest: customer - default: - - execute: - dest: sales - sales: - - play: - url: 'say:You have reached sales' - - connect: - to: +1XXXXXXXXXX - support: - - play: - url: 'say:You have reached support' - - connect: - to: +1YYYYYYYYYY - customer: - - play: - url: 'say:You have reached a Customer representative' - - connect: - to: +1ZZZZZZZZZZ -``` - - -```json -{ - "version": "1.0.0", - "sections": { - "main": [ - { - "answer": {} - }, - { - "play": { - "urls": [ - "say:Welcome to the Vance Refrigerator Corporation. For Quality assurance this call maybe recorded" - ] - } - }, - { - "record_call": { - "stereo": true, - "format": "wav" - } - }, - { - "prompt": { - "play": "say:Press 1 to talk to sales, Press 2 to talk to Support, Press 3 to talk to a Customer Representative", - "say_language": "en-US", - "max_digits": 1, - "speech_hints": [ - "one", - "two", - "three" - ] - } - }, - { - "switch": { - "variable": "prompt_value", - "case": { - "1": [ - { - "execute": { - "dest": "sales" - } - } - ], - "2": [ - { - "execute": { - "dest": "support" - } - } - ], - "3": [ - { - "execute": { - "dest": "customer" - } - } - ], - "one": [ - { - "execute": { - "dest": "sales" - } - } - ], - "two": [ - { - "execute": { - "dest": "support" - } - } - ], - "three": [ - { - "execute": { - "dest": "customer" - } - } - ] - }, - "default": [ - { - "execute": { - "dest": "sales" - } - } - ] - } - } - ], - "sales": [ - { - "play": { - "url": "say:You have reached sales" - } - }, - { - "connect": { - "to": "+1XXXXXXXXXX" - } - } - ], - "support": [ - { - "play": { - "url": "say:You have reached support" - } - }, - { - "connect": { - "to": "+1YYYYYYYYYY" - } - } - ], - "customer": [ - { - "play": { - "url": "say:You have reached a Customer representative" - } - }, - { - "connect": { - "to": "+1ZZZZZZZZZZ" - } - } - ] - } -} -``` - - - - - -To put this script into action right away, simply copy it into a [new SWML script](https://my.signalwire.com?page=relay-bins/new), -replace placeholders with your information, and save it with a descriptive name so you can assign a phone number to run it. - -Below, we will dissect each section and method of this script to gain a clear understanding of its purpose and functionality. - -### Sections - -Each SWML script comprises a "sections" field, which serves as a mapping of named sections for execution. -The initial execution always begins with the "main" section. -It is essential to include a "main" section in the document at all times. - -Firstly, we "answer" the call. -Then, we proceed by using the [`play`](/docs/swml/reference/play) method to welcome our customer and provide them with a simple menu to choose from. -Afterward, we initiate the call recording using [`record_call`](/docs/swml/reference/record-call). - - - -```yaml -version: 1.0.0 -sections: - main: - - answer: {} - - play: - urls: - - >- - say:Welcome to the Vance Refrigerator Corporation. For Quality - assurance this call maybe recorded - - record_call: - stereo: true - format: wav -``` - - -```json -{ - "version": "1.0.0", - "sections": { - "main": [ - { - "answer": {} - }, - { - "play": { - "urls": [ - "say:Welcome to the Vance Refrigerator Corporation. For Quality assurance this call maybe recorded" - ] - } - }, - { - "record_call": { - "stereo": true, - "format": "wav" - } - } - ] - } -} -``` - - - -### Gather Input - -Still in the "main" section, we use the [`prompt`](/docs/swml/reference/prompt) method to collect digits from the end user: -`1` for Sales, `2` for Support and `3` for a Customer representative. - - - -```yaml -- prompt: - play: >- - say:Press 1 to talk to sales, Press 2 to talk to Support, Press 3 to talk - to a Customer Representative - say_language: en-US - max_digits: 1 - speech_hints: - - one - - two - - three -``` - - -```json -[ - { - "prompt": { - "play": "say:Press 1 to talk to sales, Press 2 to talk to Support, Press 3 to talk to a Customer Representative", - "say_language": "en-US", - "max_digits": 1, - "speech_hints": [ - "one", - "two", - "three" - ] - } - } -] -``` - - - -### Conditional Handling - -SWML provides you with ability to use conditional statements with the result from `prompt`. -In this final part of the "main" section, we use [`switch`](/docs/swml/reference/switch) to direct a caller to Sales in the case of a response of 1, Support for a response of 2, and a connects to a representative in the case of a response of 3. -Within each switch case, we use the [`execute`](/docs/swml/reference/execute) method to execute another section of our script. - - - -```yaml -- switch: - variable: prompt_value - case: - '1': - - execute: - dest: sales - '2': - - execute: - dest: support - '3': - - execute: - dest: customer - one: - - execute: - dest: sales - two: - - execute: - dest: support - three: - - execute: - dest: customer - default: - - execute: - dest: sales -``` - - -```json -[ - { - "switch": { - "variable": "prompt_value", - "case": { - "1": [ - { - "execute": { - "dest": "sales" - } - } - ], - "2": [ - { - "execute": { - "dest": "support" - } - } - ], - "3": [ - { - "execute": { - "dest": "customer" - } - } - ], - "one": [ - { - "execute": { - "dest": "sales" - } - } - ], - "two": [ - { - "execute": { - "dest": "support" - } - } - ], - "three": [ - { - "execute": { - "dest": "customer" - } - } - ] - }, - "default": [ - { - "execute": { - "dest": "sales" - } - } - ] - } - } -] -``` - - - -### Connecting Call - -After the user makes a selection, they are directed to dedicated sections **sales**, **support**, or **customer**, triggering an outbound call to the corresponding department or agent. -This seamless integration is achieved through the [`connect`](/docs/swml/reference/connect) method, where the "to" parameter is the department or agent's phone number. -You will want to either replace these values in your script or add environmental variables. - - - -```yaml -sales: - - play: - url: say:You have reached sales - - connect: - to: "+1XXXXXXXXXX" -support: - - play: - url: say:You have reached support - - connect: - to: "+1YYYYYYYYYY" -customer: - - play: - url: say:You have reached a Customer representative - - connect: - to: "+1ZZZZZZZZZZ" -``` - - -```json -{ - "sales": [ - { - "play": { - "url": "say:You have reached sales" - } - }, - { - "connect": { - "to": "+1XXXXXXXXXX" - } - } - ], - "support": [ - { - "play": { - "url": "say:You have reached support" - } - }, - { - "connect": { - "to": "+1YYYYYYYYYY" - } - } - ], - "customer": [ - { - "play": { - "url": "say:You have reached a Customer representative" - } - }, - { - "connect": { - "to": "+1ZZZZZZZZZZ" - } - } - ] -} -``` - - - -### Testing - -To put our creation to the test, make sure your script is saved to your Resource, or your SWML scripts with a recognizable name. -Then we'll purchase a phone number from our [SignalWire Space](https://my.signalwire.com?page=phone_numbers/new) to run it. -Follow the [Buying a Phone Number](/docs/platform/phone-numbers) if you need help. -Once you have your phone number, we can assign our newly crafted SWML Script resource to handle incoming calls for that number. - - - -![Assign resource to phone number.](/assets/images/dashboard/phone-numbers/assign-resource-voice.png) - - - - - -In the Dashboard, open **Phone Numbers** > **Purchased**, select the number, and open its edit page. Under **Inbound Call Settings**, select **+ Assign Resource**, choose the IVR SWML script, and save. - - - -Upon calling the assigned phone number, our script will execute, and you should hear the instructions running as intended. -This exciting step will allow us to experience firsthand the interactive capabilities of our SWML-based IVR system. -In just a matter of minutes, we have successfully crafted a basic IVR system using SWML script. -This powerful yet straightforward solution opens up a world of possibilities for enhancing customer interactions and streamlining communication processes. -With SWML's versatility, you can now explore more advanced features and build even more sophisticated applications to suit your specific business needs. -The journey to creating efficient and interactive voice responses has just begun, so explore our options and craft your perfect solution today. - -# Reference - -- [SWML Technical Reference](/docs/swml) diff --git a/fern/redirects.yml b/fern/redirects.yml index eef366134b..7f7565106f 100644 --- a/fern/redirects.yml +++ b/fern/redirects.yml @@ -18,6 +18,9 @@ redirects: # The SWML forwarding recipe merged into the platform forward calls guide. - source: /docs/swml/guides/forward-calls destination: /docs/platform/voice/forward-calls + # The SWML IVR recipe merged into the platform collect caller input guide. + - source: /docs/swml/guides/ivr + destination: /docs/platform/voice/collect-input # Browser SDK outbound guide consolidated into the platform calling guide, # which now carries the browser walkthrough and media options. - source: /docs/browser-sdk/guides/outbound-calls From 39183346f322fbe3a6d0c54cc50f11ac6e12da5d Mon Sep 17 00:00:00 2001 From: August Date: Tue, 3 Nov 2026 19:13:22 +0000 Subject: [PATCH 11/12] fix(calling): correct the collect caller input guide after review --- .../pages/calling/voice/collect-input.mdx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/fern/products/platform/pages/calling/voice/collect-input.mdx b/fern/products/platform/pages/calling/voice/collect-input.mdx index 59bec5a37e..f38659d137 100644 --- a/fern/products/platform/pages/calling/voice/collect-input.mdx +++ b/fern/products/platform/pages/calling/voice/collect-input.mdx @@ -46,13 +46,15 @@ and a retry. | Collect speech, keypad digits, or both on one prompt | | | | | | Play the question and collect the reply in one command | | | | | | Tell silence apart from a reply that matched nothing | | | | | -| Compare the reply in your own code while the call is live | | | | | +| Receive the reply in your own process without hosting a webhook | | | | | | Collect input on a call another process answered, by its call ID | | | | | | Build the menu visually, with no code | | | | | - [SWML][swml] is a JSON or YAML document that SignalWire runs step by step. Generate it with the [Server SDKs][server-sdks] or write it by hand, then host it in your Space or serve it from your - own server. Its `prompt` method asks and collects in one step. + own server. Its `prompt` method asks and collects in one step. To compare the reply on your own + server instead, `transfer` or `execute` to a URL: SignalWire posts the document's variables, + `prompt_value` among them, and runs the SWML you return. - [Relay][relay-client] is the WebSocket client in the Server SDKs. Your process receives the call, plays the question, and gets the reply back as a value it can compare. - The [REST Calling API][rest-calling] sends the same collect command over HTTP to a call you @@ -282,8 +284,7 @@ sections: that. `switch` compares the whole value exactly. SignalWire lowercases recognized speech and strips its punctuation before storing it in `prompt_value`, so "Booking." still matches the `booking` case, but "booking please" does not. SWML also has a `cond` method that branches on a JavaScript -expression; the Python SDK cannot emit it, because `add_verb` takes only object-valued methods and -`cond` takes a list, so the SWML samples in this guide branch with `switch`. +expression. The Python SDK can't emit it, so the SWML samples in this guide branch with `switch`. Run the program and point an External URL SWML Script at it through your tunnel, or paste the YAML or JSON into a Hosted Script, as in [Create the SWML Script][create-swml-script]. To put dispatch @@ -714,8 +715,8 @@ sequenceDiagram ### Receive the result via WebSocket (Relay) The Relay client already holds the result: it is the event that `action.wait()` returned. To log -every collect event as it happens, including partial ones, register a handler on the call before -starting the prompt. The [Server SDKs][server-sdks] document the fields of every call event. +every collect event as it happens, register a handler on the call before starting the prompt. The +[Server SDKs][server-sdks] document the fields of every call event. @@ -768,10 +769,10 @@ sequenceDiagram | SWML | `prompt_value` inside the document; the `status_url` webhook | `prompt_result` is `no_input` or `no_match` | | WebSocket (Relay) | The `result` on the event `action.wait()` returns; `call.on` handlers | `result.type` is `no_input` or `no_match` | | REST | The `status_url` webhook only | `params.result.type` is `no_input` or `no_match` | -| Call Flow Builder | Not exposed; the flow branches on the matched option | The **No Input** and **Unknown** connectors | +| Call Flow Builder | The `%{prompt_value}` variable in any later node | The **No Input** and **Unknown** connectors | -The Dashboard's call log shows the Collect step and its outcome for every surface, but never the -text. +The Dashboard's call log shows that a Collect step ran, for every surface, but not its outcome and +never the text. ## Examples From c850c502b19d54f395c4e2eafc7a38280031ae05 Mon Sep 17 00:00:00 2001 From: August Date: Thu, 5 Nov 2026 22:04:37 +0000 Subject: [PATCH 12/12] fix(calling): address review of the collect caller input guide --- .../img/collect-webhook-lifecycle-themed.svg | 2 +- .../pages/calling/voice/collect-input.mdx | 131 ++++++++++-------- 2 files changed, 78 insertions(+), 55 deletions(-) diff --git a/fern/assets/images/img/collect-webhook-lifecycle-themed.svg b/fern/assets/images/img/collect-webhook-lifecycle-themed.svg index 5c636eb1fa..55a6c261c5 100644 --- a/fern/assets/images/img/collect-webhook-lifecycle-themed.svg +++ b/fern/assets/images/img/collect-webhook-lifecycle-themed.svg @@ -80,7 +80,7 @@ speech, text, confidence - 200 OK + 200 OK, not awaited diff --git a/fern/products/platform/pages/calling/voice/collect-input.mdx b/fern/products/platform/pages/calling/voice/collect-input.mdx index f38659d137..55c1bc1df2 100644 --- a/fern/products/platform/pages/calling/voice/collect-input.mdx +++ b/fern/products/platform/pages/calling/voice/collect-input.mdx @@ -6,21 +6,25 @@ max-toc-depth: 3 --- [answer-relay]: /docs/platform/voice/make-and-receive-calls#answer-a-call-via-websocket-relay +[answer-swml]: /docs/platform/voice/make-and-receive-calls#answer-a-call-via-swml [api-credentials]: /docs/platform/your-signalwire-api-space [cfb]: /docs/call-flow-builder [cfb-answer]: /docs/call-flow-builder/reference/answer-call +[cfb-conditions]: /docs/call-flow-builder/reference/conditions [cfb-forward]: /docs/call-flow-builder/reference/forward-to-phone [cfb-gather]: /docs/call-flow-builder/reference/gather-input +[cfb-gather-loop]: /docs/call-flow-builder/reference/gather-input#input-with-infinite-loop-prevention [cfb-hangup]: /docs/call-flow-builder/reference/hangup-call [cfb-play]: /docs/call-flow-builder/reference/play-audio-or-tts +[cfb-set-variables]: /docs/call-flow-builder/reference/set-variables [cfb-version]: /docs/call-flow-builder/guides/version +[collect-webhook]: /docs/apis/rest/webhooks/collect-status-callback [control-flow]: /docs/swml/guides/goto-execute-transfer-disambiguation [create-swml-script]: /docs/platform/voice/make-and-receive-calls#create-the-swml-script [forward-relay]: /docs/platform/voice/forward-calls#forward-an-incoming-call-via-websocket-relay [forward-swml]: /docs/platform/voice/forward-calls#forward-an-incoming-call-via-swml [how-incoming]: /docs/platform/voice/make-and-receive-calls#how-an-incoming-call-reaches-your-code [make-receive]: /docs/platform/voice/make-and-receive-calls -[relay-client]: /docs/server-sdks/guides/relay-client [rest-calling]: /docs/apis/rest/calls/call-commands [server-sdks]: /docs/server-sdks [speak-rest]: /docs/platform/voice/speak-text#speak-text-on-a-call-in-progress-via-rest @@ -45,7 +49,7 @@ and a retry. | Ask a question and branch on the answer without running a server | | | | | | Collect speech, keypad digits, or both on one prompt | | | | | | Play the question and collect the reply in one command | | | | | -| Tell silence apart from a reply that matched nothing | | | | | +| Tell silence apart from speech the recognizer could not make out | | | | | | Receive the reply in your own process without hosting a webhook | | | | | | Collect input on a call another process answered, by its call ID | | | | | | Build the menu visually, with no code | | | | | @@ -55,7 +59,7 @@ and a retry. own server. Its `prompt` method asks and collects in one step. To compare the reply on your own server instead, `transfer` or `execute` to a URL: SignalWire posts the document's variables, `prompt_value` among them, and runs the SWML you return. -- [Relay][relay-client] is the WebSocket client in the Server SDKs. Your process receives the call, +- [Relay][server-sdks] is the WebSocket client in the Server SDKs. Your process receives the call, plays the question, and gets the reply back as a value it can compare. - The [REST Calling API][rest-calling] sends the same collect command over HTTP to a call you already hold the ID for. The reply arrives as a webhook. @@ -79,8 +83,8 @@ Have these values ready: - For the Relay and REST paths, your Project ID and an API token from the Dashboard's [API credentials][api-credentials] page, with the **Voice** permission enabled. A hosted SWML script or a Call Flow needs no credentials. -- For SWML served from your own server, Python 3 or Node.js and a tunnel such as - [ngrok](https://ngrok.com/download). +- Python 3 or Node.js for the served SWML and Relay samples. A served document also needs the + tunnel and basic auth password set up in [Answer a call via SWML][answer-swml]. Replace these placeholders in the samples. The hosted SWML and Call Flow Builder paths use none of them. @@ -117,7 +121,7 @@ methods append to `main`; the named sections go through the service. ```python -# Install: python -m pip install signalwire-sdk==3.4.1 +# Install: python -m pip install signalwire-sdk # Save as collect_input.py and run: python collect_input.py from signalwire import SWMLBuilder, SWMLService @@ -159,7 +163,7 @@ service.serve() ```typescript -// Install: npm install @signalwire/sdk@2.0.5 +// Install: npm install @signalwire/sdk // This sample also runs as JavaScript: save as collect-input.mjs, // then run: node collect-input.mjs import { SWMLService } from "@signalwire/sdk"; @@ -280,11 +284,9 @@ sections: -`add_verb_to_section` and `addVerbToSection` create a section on first use and append to it after -that. `switch` compares the whole value exactly. SignalWire lowercases recognized speech and strips -its punctuation before storing it in `prompt_value`, so "Booking." still matches the `booking` -case, but "booking please" does not. SWML also has a `cond` method that branches on a JavaScript -expression. The Python SDK can't emit it, so the SWML samples in this guide branch with `switch`. +`switch` compares the whole value exactly. SignalWire lowercases recognized speech and strips its +punctuation before storing it in `prompt_value`, so "Booking." still matches the `booking` case, +but "booking please" does not. Run the program and point an External URL SWML Script at it through your tunnel, or paste the YAML or JSON into a Hosted Script, as in [Create the SWML Script][create-swml-script]. To put dispatch @@ -298,12 +300,9 @@ nothing. You hear a different line each time. If you don't, match the symptom: -- **The call connects but stays silent.** The flow never ran. For a served document, request it - through the tunnel with `curl` to confirm it still answers, then check that the Resource's - **Primary Script URL** carries the same hostname and password. For a hosted script, reopen it and - confirm the document saved with a `main` section. -- **`curl` returns 401.** The password in the request differs from the one in the sample's - `basic_auth`. +- **The call connects but stays silent.** The flow never ran. [Answer a call via SWML][answer-swml] + shows how to confirm that SignalWire can fetch a served document and that the Resource points at + it. - **Every call ends in the `no_match` line.** The recognized text did not equal a case key. [Track what the flow heard](#track-what-the-flow-heard) shows the text SignalWire stored. - **Click-to-Test is disabled.** It appears only on Resources that handle calls and have an @@ -313,13 +312,13 @@ If you don't, match the symptom: The [Server SDKs][server-sdks] expose the prompt as `play_and_collect` on the call. It plays the question and resolves when input arrives, times out, or fails. The result carries a `type` of -`speech`, `digit`, `no_input`, or `no_match`, and for speech the recognized `text` with a +`speech`, `digit`, `no_input`, `no_match`, or `error`, and for speech the recognized `text` with a `confidence` score. Your code compares the text and continues. ```python -# Install: python -m pip install signalwire-sdk==3.4.1 +# Install: python -m pip install signalwire-sdk # Save as collect_input_relay.py and run: python collect_input_relay.py from signalwire.relay import RelayClient @@ -369,7 +368,7 @@ client.run() ```typescript -// Install: npm install @signalwire/sdk@2.0.5 +// Install: npm install @signalwire/sdk // Save as collect-input-relay.mts and run: npx tsx collect-input-relay.mts import { RelayClient } from "@signalwire/sdk"; @@ -425,14 +424,16 @@ running and that the Resource's **Topic** matches its `contexts`. Over REST, the same collect runs as the `calling.collect` command on a call you already hold the ID for, such as one a hosted script answered. REST can't play the question and collect in one -command, so [speak the question with `calling.play`][speak-rest] first. The reply arrives at -`status_url` as a `calling.call.collect` event instead of a return value, and `control_id` names -the collect so you can match the event to it. +command, so [speak the question with `calling.play`][speak-rest] first, and send the collect once +playback finishes with `start_input_timers` set to `true`. Without it, the wait for input doesn't +start until you send `calling.collect.start_input_timers`. The reply arrives at `status_url` as a +`calling.call.collect` event instead of a return value, and `control_id` names the collect so you +can match the event to it. ```python -# Install: python -m pip install signalwire-sdk==3.4.1 +# Install: python -m pip install signalwire-sdk # Save as collect_rest.py and run: python collect_rest.py from signalwire.rest import RestClient @@ -442,18 +443,18 @@ client = RestClient( host=".signalwire.com", ) -# signalwire-sdk 3.4.1 has no status_url argument; extras merges it into the command's params. +# collect() has no status_url or start_input_timers argument; extras adds them to the command's params. client.calling.collect( "", control_id="collect-1", speech={"hints": ["booking", "dispatch"], "language": "en-US"}, - extras={"status_url": ""}, + extras={"status_url": "", "start_input_timers": True}, ) ``` ```typescript -// Install: npm install @signalwire/sdk@2.0.5 +// Install: npm install @signalwire/sdk // This sample also runs as JavaScript: save as collect-rest.mjs, // then run: node collect-rest.mjs import { RestClient } from "@signalwire/sdk"; @@ -464,10 +465,11 @@ const client = new RestClient({ host: ".signalwire.com", }); +// collect() has no status_url or start_input_timers option; extras adds them to the command's params. await client.calling.collect("", { control_id: "collect-1", speech: { hints: ["booking", "dispatch"], language: "en-US" }, - status_url: "", + extras: { status_url: "", start_input_timers: true }, }); ``` @@ -483,6 +485,7 @@ curl --request POST "https://.signalwire.com/api/calling/calls" \ "params": { "control_id": "collect-1", "speech": { "hints": ["booking", "dispatch"], "language": "en-US" }, + "start_input_timers": true, "status_url": "" } }' @@ -490,7 +493,8 @@ curl --request POST "https://.signalwire.com/api/calling/calls" \ -The [Calling API reference][rest-calling] documents every `calling.collect` field. +The [Calling API reference][rest-calling] documents every `calling.collect` field, and the +[collect status callback reference][collect-webhook] the event that reaches `status_url`. ### Ask a question and branch via Call Flow Builder @@ -514,13 +518,16 @@ three times and hear the three outcomes. ## Handle silence and unmatched speech -A caller who says nothing, or says something the flow did not plan for, must still get an answer. -Each surface reports the two cases separately, so the flow can say something different for each. +A caller who says nothing, or whose words the recognizer could not make out, must still get an +answer. Each surface reports the two cases separately, so the flow can say something different for +each. A reply the recognizer did understand comes back as text whether or not it is one of your +words, so an off-menu reply is caught by your comparison, not by these cases. ### Handle silence and unmatched speech via SWML After `prompt`, `prompt_result` is `match_speech`, `no_input`, `no_match`, or `failed`, and -`match_digits` once keypad input is enabled. The `default` case already routes everything but a +`match_digits` once keypad input is enabled. `match_speech` means the recognizer returned text, not +that the text is one of your cases. The `default` case already routes everything but a match to `no_match`; this change makes that section say which one happened, using a JavaScript expression inside the spoken text. Only the `no_match` section changes. @@ -566,8 +573,10 @@ it. ### Handle silence and unmatched speech via WebSocket (Relay) -The collect result's `type` is `no_input` when the caller stayed silent and `no_match` when speech -arrived but matched nothing. Replace the reply selection in the Relay sample: +The collect result's `type` is `no_input` when the caller stayed silent. Anything the recognizer +transcribes comes back as `speech`, whether or not it's one of your words, so your comparison +catches an off-menu reply. `no_match` means the recognizer returned no text at all. Replace the +reply selection in the Relay sample: @@ -617,8 +626,9 @@ itself, use one of the two paths below. ### Receive the result via SWML Add a `status_url` to the `prompt` method. SignalWire sends a `calling.call.collect` event to that -URL when input arrives. The same event reaches the `status_url` on a REST `calling.collect` -command. +URL when input arrives, and `calling.call.play` events to the same URL as the question plays, so +check `event_type` before reading `params.result`. The same collect event reaches the `status_url` +on a REST `calling.collect` command. @@ -686,11 +696,12 @@ The POST body for a recognized reply looks like this. `params.result.type` is `n } ``` -The [`prompt` reference][swml-prompt] documents every field. +The [collect status callback reference][collect-webhook] documents every field of the event, and +the [`prompt` reference][swml-prompt] the play events that reach the same URL. -SignalWire plays the prompt to the caller. The caller says dispatch. SignalWire stores dispatch in prompt_value and switch runs the dispatch branch. SignalWire posts a calling.call.collect event to your status_url with result type speech, the text, and a confidence score. Your server returns 200 OK. The dispatch branch plays to the caller. +SignalWire plays the prompt to the caller. The caller says dispatch. SignalWire stores dispatch in prompt_value and switch runs the dispatch branch. SignalWire posts a calling.call.collect event to your status_url with result type speech, the text, and a confidence score, and your server returns 200 OK. The flow does not wait for that reply: the dispatch branch plays to the caller meanwhile. @@ -705,9 +716,12 @@ sequenceDiagram SW->>Caller: prompt plays: say booking or dispatch Caller->>SW: says "dispatch" Note over SW: prompt_value is dispatch, switch runs the dispatch branch - SW->>Srv: POST status_url: calling.call.collect, type speech, text, confidence - Srv-->>SW: 200 OK - SW->>Caller: dispatch branch plays + par The flow does not wait for the webhook + SW->>Srv: POST status_url: calling.call.collect, type speech, text, confidence + Srv-->>SW: 200 OK + and + SW->>Caller: dispatch branch plays + end ``` @@ -764,7 +778,7 @@ sequenceDiagram ### Compare the surfaces -| Surface | Where the recognized text shows up | How silence and no match are reported | +| Surface | Where the recognized text shows up | How silence and unrecognized speech are reported | |---|---|---| | SWML | `prompt_value` inside the document; the `status_url` webhook | `prompt_result` is `no_input` or `no_match` | | WebSocket (Relay) | The `result` on the event `action.wait()` returns; `call.on` handlers | `result.type` is `no_input` or `no_match` | @@ -789,7 +803,7 @@ joins the prompt, and the digit keys join the switch. ```python -# Install: python -m pip install signalwire-sdk==3.4.1 +# Install: python -m pip install signalwire-sdk # Save as collect_input.py and run: python collect_input.py from signalwire import SWMLBuilder, SWMLService @@ -834,7 +848,7 @@ service.serve() ```typescript -// Install: npm install @signalwire/sdk@2.0.5 +// Install: npm install @signalwire/sdk // This sample also runs as JavaScript: save as collect-input.mjs, // then run: node collect-input.mjs import { SWMLService } from "@signalwire/sdk"; @@ -976,7 +990,7 @@ Pass both `digits` and `speech` in the collect config. A keypad reply comes back ```python -# Install: python -m pip install signalwire-sdk==3.4.1 +# Install: python -m pip install signalwire-sdk # Save as collect_input_relay.py and run: python collect_input_relay.py from signalwire.relay import RelayClient @@ -1030,7 +1044,7 @@ client.run() ```typescript -// Install: npm install @signalwire/sdk@2.0.5 +// Install: npm install @signalwire/sdk // Save as collect-input-relay.mts and run: npx tsx collect-input-relay.mts import { RelayClient } from "@signalwire/sdk"; @@ -1092,15 +1106,13 @@ up. [`goto`][swml-goto] jumps to a label within the same section, and its `when` condition and `max` count keep the loop bounded. A `label` before the prompt and a conditional `goto` after it repeat -the question once. The TypeScript builder has a `label` method; the Python SDK cannot emit -`label`, whose value is a bare string rather than an object, so from Python paste the YAML or JSON -form into a hosted script. The [control flow guide][control-flow] compares `goto` with `execute` -and `transfer`. +the question once. The [control flow guide][control-flow] compares `goto` with `execute` and +`transfer`. ```typescript -// Install: npm install @signalwire/sdk@2.0.5 +// Install: npm install @signalwire/sdk // This sample also runs as JavaScript: save as collect-input.mjs, // then run: node collect-input.mjs import { SWMLService } from "@signalwire/sdk"; @@ -1115,6 +1127,8 @@ const swml = service.getBuilder(); swml .answer() + // The Python SDK's builder can't emit label, whose value is a bare string rather than an object; + // from Python, paste the YAML or JSON tab into a hosted script. .label("ask") .prompt({ play: ["say:Thanks for calling Bayview Taxi. Say booking or dispatch."], @@ -1244,7 +1258,7 @@ attempts. ```python -# Install: python -m pip install signalwire-sdk==3.4.1 +# Install: python -m pip install signalwire-sdk # Save as collect_input_relay.py and run: python collect_input_relay.py from signalwire.relay import RelayClient @@ -1300,7 +1314,7 @@ client.run() ```typescript -// Install: npm install @signalwire/sdk@2.0.5 +// Install: npm install @signalwire/sdk // Save as collect-input-relay.mts and run: npx tsx collect-input-relay.mts import { RelayClient } from "@signalwire/sdk"; @@ -1347,6 +1361,15 @@ await client.run(); +#### Ask again when the caller says nothing via Call Flow Builder + +A counter bounds the loop. Route the **Gather Input** node's **No Input** connector to a +[**Set Variables**][cfb-set-variables] node that sets `count` to `%{count} + 1`, then to a +[**Conditions**][cfb-conditions] node with the condition `%{count} > 1`. Connect the condition's +connector to a **Hangup Call** node, and **Else** to a **Play Audio or TTS** node that says "I +didn't hear anything." and leads back to **Gather Input**. The Gather Input reference builds the +same flow in [Input with infinite loop prevention][cfb-gather-loop]. + ## Next steps