signalwire-agents 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +112 -0
- package/README.md +417 -0
- package/dist/AgentBase.d.ts +481 -0
- package/dist/AgentBase.js +1155 -0
- package/dist/AgentBase.js.map +1 -0
- package/dist/AgentServer.d.ts +60 -0
- package/dist/AgentServer.js +128 -0
- package/dist/AgentServer.js.map +1 -0
- package/dist/AuthHandler.d.ts +56 -0
- package/dist/AuthHandler.js +119 -0
- package/dist/AuthHandler.js.map +1 -0
- package/dist/ConfigLoader.d.ts +68 -0
- package/dist/ConfigLoader.js +150 -0
- package/dist/ConfigLoader.js.map +1 -0
- package/dist/ContextBuilder.d.ts +431 -0
- package/dist/ContextBuilder.js +751 -0
- package/dist/ContextBuilder.js.map +1 -0
- package/dist/DataMap.d.ts +179 -0
- package/dist/DataMap.js +321 -0
- package/dist/DataMap.js.map +1 -0
- package/dist/Logger.d.ts +91 -0
- package/dist/Logger.js +191 -0
- package/dist/Logger.js.map +1 -0
- package/dist/PomBuilder.d.ts +144 -0
- package/dist/PomBuilder.js +249 -0
- package/dist/PomBuilder.js.map +1 -0
- package/dist/PromptManager.d.ts +85 -0
- package/dist/PromptManager.js +108 -0
- package/dist/PromptManager.js.map +1 -0
- package/dist/SchemaUtils.d.ts +42 -0
- package/dist/SchemaUtils.js +148 -0
- package/dist/SchemaUtils.js.map +1 -0
- package/dist/ServerlessAdapter.d.ts +100 -0
- package/dist/ServerlessAdapter.js +166 -0
- package/dist/ServerlessAdapter.js.map +1 -0
- package/dist/SessionManager.d.ts +86 -0
- package/dist/SessionManager.js +155 -0
- package/dist/SessionManager.js.map +1 -0
- package/dist/SslConfig.d.ts +77 -0
- package/dist/SslConfig.js +100 -0
- package/dist/SslConfig.js.map +1 -0
- package/dist/SwaigFunction.d.ts +88 -0
- package/dist/SwaigFunction.js +125 -0
- package/dist/SwaigFunction.js.map +1 -0
- package/dist/SwaigFunctionResult.d.ts +442 -0
- package/dist/SwaigFunctionResult.js +735 -0
- package/dist/SwaigFunctionResult.js.map +1 -0
- package/dist/SwmlBuilder.d.ts +37 -0
- package/dist/SwmlBuilder.js +55 -0
- package/dist/SwmlBuilder.js.map +1 -0
- package/dist/cli/agent-loader.d.ts +22 -0
- package/dist/cli/agent-loader.js +106 -0
- package/dist/cli/agent-loader.js.map +1 -0
- package/dist/cli/mock-data.d.ts +37 -0
- package/dist/cli/mock-data.js +79 -0
- package/dist/cli/mock-data.js.map +1 -0
- package/dist/cli/swaig-test.d.ts +32 -0
- package/dist/cli/swaig-test.js +405 -0
- package/dist/cli/swaig-test.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/prefabs/ConciergeAgent.d.ts +64 -0
- package/dist/prefabs/ConciergeAgent.js +188 -0
- package/dist/prefabs/ConciergeAgent.js.map +1 -0
- package/dist/prefabs/FAQBotAgent.d.ts +68 -0
- package/dist/prefabs/FAQBotAgent.js +206 -0
- package/dist/prefabs/FAQBotAgent.js.map +1 -0
- package/dist/prefabs/InfoGathererAgent.d.ts +73 -0
- package/dist/prefabs/InfoGathererAgent.js +202 -0
- package/dist/prefabs/InfoGathererAgent.js.map +1 -0
- package/dist/prefabs/ReceptionistAgent.d.ts +65 -0
- package/dist/prefabs/ReceptionistAgent.js +205 -0
- package/dist/prefabs/ReceptionistAgent.js.map +1 -0
- package/dist/prefabs/SurveyAgent.d.ts +84 -0
- package/dist/prefabs/SurveyAgent.js +324 -0
- package/dist/prefabs/SurveyAgent.js.map +1 -0
- package/dist/prefabs/index.d.ts +13 -0
- package/dist/prefabs/index.js +14 -0
- package/dist/prefabs/index.js.map +1 -0
- package/dist/skills/SkillBase.d.ts +134 -0
- package/dist/skills/SkillBase.js +105 -0
- package/dist/skills/SkillBase.js.map +1 -0
- package/dist/skills/SkillManager.d.ts +83 -0
- package/dist/skills/SkillManager.js +159 -0
- package/dist/skills/SkillManager.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +105 -0
- package/dist/skills/SkillRegistry.js +195 -0
- package/dist/skills/SkillRegistry.js.map +1 -0
- package/dist/skills/builtin/api_ninjas_trivia.d.ts +35 -0
- package/dist/skills/builtin/api_ninjas_trivia.js +161 -0
- package/dist/skills/builtin/api_ninjas_trivia.js.map +1 -0
- package/dist/skills/builtin/claude_skills.d.ts +34 -0
- package/dist/skills/builtin/claude_skills.js +156 -0
- package/dist/skills/builtin/claude_skills.js.map +1 -0
- package/dist/skills/builtin/custom_skills.d.ts +59 -0
- package/dist/skills/builtin/custom_skills.js +231 -0
- package/dist/skills/builtin/custom_skills.js.map +1 -0
- package/dist/skills/builtin/datasphere.d.ts +34 -0
- package/dist/skills/builtin/datasphere.js +163 -0
- package/dist/skills/builtin/datasphere.js.map +1 -0
- package/dist/skills/builtin/datasphere_serverless.d.ts +54 -0
- package/dist/skills/builtin/datasphere_serverless.js +155 -0
- package/dist/skills/builtin/datasphere_serverless.js.map +1 -0
- package/dist/skills/builtin/datetime.d.ts +31 -0
- package/dist/skills/builtin/datetime.js +95 -0
- package/dist/skills/builtin/datetime.js.map +1 -0
- package/dist/skills/builtin/google_maps.d.ts +33 -0
- package/dist/skills/builtin/google_maps.js +233 -0
- package/dist/skills/builtin/google_maps.js.map +1 -0
- package/dist/skills/builtin/index.d.ts +28 -0
- package/dist/skills/builtin/index.js +75 -0
- package/dist/skills/builtin/index.js.map +1 -0
- package/dist/skills/builtin/info_gatherer.d.ts +52 -0
- package/dist/skills/builtin/info_gatherer.js +237 -0
- package/dist/skills/builtin/info_gatherer.js.map +1 -0
- package/dist/skills/builtin/joke.d.ts +32 -0
- package/dist/skills/builtin/joke.js +142 -0
- package/dist/skills/builtin/joke.js.map +1 -0
- package/dist/skills/builtin/math.d.ts +33 -0
- package/dist/skills/builtin/math.js +120 -0
- package/dist/skills/builtin/math.js.map +1 -0
- package/dist/skills/builtin/mcp_gateway.d.ts +35 -0
- package/dist/skills/builtin/mcp_gateway.js +85 -0
- package/dist/skills/builtin/mcp_gateway.js.map +1 -0
- package/dist/skills/builtin/native_vector_search.d.ts +44 -0
- package/dist/skills/builtin/native_vector_search.js +248 -0
- package/dist/skills/builtin/native_vector_search.js.map +1 -0
- package/dist/skills/builtin/play_background_file.d.ts +34 -0
- package/dist/skills/builtin/play_background_file.js +135 -0
- package/dist/skills/builtin/play_background_file.js.map +1 -0
- package/dist/skills/builtin/spider.d.ts +34 -0
- package/dist/skills/builtin/spider.js +164 -0
- package/dist/skills/builtin/spider.js.map +1 -0
- package/dist/skills/builtin/swml_transfer.d.ts +44 -0
- package/dist/skills/builtin/swml_transfer.js +204 -0
- package/dist/skills/builtin/swml_transfer.js.map +1 -0
- package/dist/skills/builtin/weather_api.d.ts +34 -0
- package/dist/skills/builtin/weather_api.js +136 -0
- package/dist/skills/builtin/weather_api.js.map +1 -0
- package/dist/skills/builtin/web_search.d.ts +34 -0
- package/dist/skills/builtin/web_search.js +141 -0
- package/dist/skills/builtin/web_search.js.map +1 -0
- package/dist/skills/builtin/wikipedia_search.d.ts +34 -0
- package/dist/skills/builtin/wikipedia_search.js +166 -0
- package/dist/skills/builtin/wikipedia_search.js.map +1 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.js +10 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/docs/agent-guide.md +869 -0
- package/docs/api-reference.md +2419 -0
- package/docs/architecture.md +843 -0
- package/docs/cli-guide.md +579 -0
- package/docs/configuration.md +422 -0
- package/docs/contexts-guide.md +787 -0
- package/docs/datamap-guide.md +1141 -0
- package/docs/prefabs-guide.md +830 -0
- package/docs/security.md +436 -0
- package/docs/serverless-guide.md +513 -0
- package/docs/skills-guide.md +845 -0
- package/docs/swaig-reference.md +1627 -0
- package/examples/call-flow.ts +60 -0
- package/examples/contexts-steps.ts +62 -0
- package/examples/datamap-tools.ts +52 -0
- package/examples/dynamic-config.ts +51 -0
- package/examples/multi-agent.ts +67 -0
- package/examples/pom-prompt.ts +68 -0
- package/examples/simple-agent.ts +33 -0
- package/package.json +35 -0
- package/src/AgentBase.ts +1279 -0
- package/src/AgentServer.ts +149 -0
- package/src/AuthHandler.ts +141 -0
- package/src/ConfigLoader.ts +165 -0
- package/src/ContextBuilder.ts +796 -0
- package/src/DataMap.ts +365 -0
- package/src/Logger.ts +197 -0
- package/src/PomBuilder.ts +298 -0
- package/src/PromptManager.ts +133 -0
- package/src/SchemaUtils.ts +170 -0
- package/src/ServerlessAdapter.ts +218 -0
- package/src/SessionManager.ts +161 -0
- package/src/SslConfig.ts +118 -0
- package/src/SwaigFunction.ts +168 -0
- package/src/SwaigFunctionResult.ts +864 -0
- package/src/SwmlBuilder.ts +62 -0
- package/src/cli/agent-loader.ts +122 -0
- package/src/cli/mock-data.ts +110 -0
- package/src/cli/swaig-test.ts +440 -0
- package/src/index.ts +99 -0
- package/src/prefabs/ConciergeAgent.ts +251 -0
- package/src/prefabs/FAQBotAgent.ts +263 -0
- package/src/prefabs/InfoGathererAgent.ts +276 -0
- package/src/prefabs/ReceptionistAgent.ts +277 -0
- package/src/prefabs/SurveyAgent.ts +413 -0
- package/src/prefabs/index.ts +23 -0
- package/src/skills/SkillBase.ts +184 -0
- package/src/skills/SkillManager.ts +177 -0
- package/src/skills/SkillRegistry.ts +231 -0
- package/src/skills/builtin/api_ninjas_trivia.ts +230 -0
- package/src/skills/builtin/claude_skills.ts +239 -0
- package/src/skills/builtin/custom_skills.ts +326 -0
- package/src/skills/builtin/datasphere.ts +225 -0
- package/src/skills/builtin/datasphere_serverless.ts +194 -0
- package/src/skills/builtin/datetime.ts +115 -0
- package/src/skills/builtin/google_maps.ts +347 -0
- package/src/skills/builtin/index.ts +79 -0
- package/src/skills/builtin/info_gatherer.ts +331 -0
- package/src/skills/builtin/joke.ts +180 -0
- package/src/skills/builtin/math.ts +150 -0
- package/src/skills/builtin/mcp_gateway.ts +99 -0
- package/src/skills/builtin/native_vector_search.ts +327 -0
- package/src/skills/builtin/play_background_file.ts +189 -0
- package/src/skills/builtin/spider.ts +232 -0
- package/src/skills/builtin/swml_transfer.ts +285 -0
- package/src/skills/builtin/weather_api.ts +193 -0
- package/src/skills/builtin/web_search.ts +212 -0
- package/src/skills/builtin/wikipedia_search.ts +248 -0
- package/src/skills/index.ts +12 -0
- package/src/types.ts +99 -0
- package/tests/AgentBase.test.ts +693 -0
- package/tests/AgentServer.test.ts +102 -0
- package/tests/AuthHandler.test.ts +121 -0
- package/tests/ConfigLoader.test.ts +121 -0
- package/tests/DataMap.test.ts +286 -0
- package/tests/Logger.test.ts +218 -0
- package/tests/PomBuilder.test.ts +164 -0
- package/tests/ProxyDetection.test.ts +185 -0
- package/tests/SchemaUtils.test.ts +106 -0
- package/tests/ServerlessAdapter.test.ts +200 -0
- package/tests/SessionManager.test.ts +139 -0
- package/tests/SslConfig.test.ts +97 -0
- package/tests/SwaigFunctionResult.test.ts +298 -0
- package/tests/cli/mock-data.test.ts +94 -0
- package/tests/cli/swaig-test.test.ts +96 -0
- package/tests/prefabs/prefabs.test.ts +854 -0
- package/tests/setup.ts +6 -0
- package/tests/skills/SkillBase.test.ts +118 -0
- package/tests/skills/SkillManager.test.ts +164 -0
- package/tests/skills/SkillRegistry.test.ts +124 -0
- package/tests/skills/builtin.test.ts +924 -0
- package/tsconfig.json +18 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,1627 @@
|
|
|
1
|
+
# SwaigFunctionResult Reference
|
|
2
|
+
|
|
3
|
+
Complete API reference for the `SwaigFunctionResult` class in the SignalWire AI Agents TypeScript SDK.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
- [Overview](#overview)
|
|
10
|
+
- [Core Methods](#core-methods)
|
|
11
|
+
- [constructor](#constructor)
|
|
12
|
+
- [setResponse](#setresponse)
|
|
13
|
+
- [setPostProcess](#setpostprocess)
|
|
14
|
+
- [addAction](#addaction)
|
|
15
|
+
- [addActions](#addactions)
|
|
16
|
+
- [toDict](#todict)
|
|
17
|
+
- [Call Control](#call-control)
|
|
18
|
+
- [connect](#connect)
|
|
19
|
+
- [swmlTransfer](#swmltransfer)
|
|
20
|
+
- [hangup](#hangup)
|
|
21
|
+
- [hold](#hold)
|
|
22
|
+
- [waitForUser](#waitforuser)
|
|
23
|
+
- [stop](#stop)
|
|
24
|
+
- [Audio](#audio)
|
|
25
|
+
- [say](#say)
|
|
26
|
+
- [playBackgroundFile](#playbackgroundfile)
|
|
27
|
+
- [stopBackgroundFile](#stopbackgroundfile)
|
|
28
|
+
- [Speech](#speech)
|
|
29
|
+
- [addDynamicHints](#adddynamichints)
|
|
30
|
+
- [clearDynamicHints](#cleardynamichints)
|
|
31
|
+
- [setEndOfSpeechTimeout](#setendofspeechtimeout)
|
|
32
|
+
- [setSpeechEventTimeout](#setspeecheventtimeout)
|
|
33
|
+
- [Data Management](#data-management)
|
|
34
|
+
- [updateGlobalData](#updateglobaldata)
|
|
35
|
+
- [removeGlobalData](#removeglobaldata)
|
|
36
|
+
- [setMetadata](#setmetadata)
|
|
37
|
+
- [removeMetadata](#removemetadata)
|
|
38
|
+
- [SWML Actions](#swml-actions)
|
|
39
|
+
- [executeSwml](#executeswml)
|
|
40
|
+
- [switchContext](#switchcontext)
|
|
41
|
+
- [swmlChangeStep](#swmlchangestep)
|
|
42
|
+
- [swmlChangeContext](#swmlchangecontext)
|
|
43
|
+
- [swmlUserEvent](#swmluserevent)
|
|
44
|
+
- [Function Control](#function-control)
|
|
45
|
+
- [toggleFunctions](#togglefunctions)
|
|
46
|
+
- [enableFunctionsOnTimeout](#enablefunctionsontimeout)
|
|
47
|
+
- [updateSettings](#updatesettings)
|
|
48
|
+
- [User Input and History](#user-input-and-history)
|
|
49
|
+
- [simulateUserInput](#simulateuserinput)
|
|
50
|
+
- [enableExtensiveData](#enableextensivedata)
|
|
51
|
+
- [replaceInHistory](#replaceinhistory)
|
|
52
|
+
- [Communication](#communication)
|
|
53
|
+
- [sendSms](#sendsms)
|
|
54
|
+
- [recordCall](#recordcall)
|
|
55
|
+
- [stopRecordCall](#stoprecordcall)
|
|
56
|
+
- [tap](#tap)
|
|
57
|
+
- [stopTap](#stoptap)
|
|
58
|
+
- [Rooms and Conferencing](#rooms-and-conferencing)
|
|
59
|
+
- [joinRoom](#joinroom)
|
|
60
|
+
- [sipRefer](#siprefer)
|
|
61
|
+
- [joinConference](#joinconference)
|
|
62
|
+
- [RPC](#rpc)
|
|
63
|
+
- [executeRpc](#executerpc)
|
|
64
|
+
- [rpcDial](#rpcdial)
|
|
65
|
+
- [rpcAiMessage](#rpcaimessage)
|
|
66
|
+
- [rpcAiUnhold](#rpcaiunhold)
|
|
67
|
+
- [Payments](#payments)
|
|
68
|
+
- [pay](#pay)
|
|
69
|
+
- [createPaymentPrompt (static)](#createpaymentprompt-static)
|
|
70
|
+
- [createPaymentAction (static)](#createpaymentaction-static)
|
|
71
|
+
- [createPaymentParameter (static)](#createpaymentparameter-static)
|
|
72
|
+
- [Fluent Chaining](#fluent-chaining)
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Overview
|
|
77
|
+
|
|
78
|
+
`SwaigFunctionResult` is the return type for SWAIG tool handlers. It carries two pieces of information back to the SignalWire AI engine:
|
|
79
|
+
|
|
80
|
+
1. **Response text** -- A string the AI uses as the tool's output. The AI reads this text and incorporates it into its conversation with the caller.
|
|
81
|
+
2. **Actions** -- An ordered list of structured commands (hangup, connect, play audio, send SMS, etc.) that the platform executes as side effects.
|
|
82
|
+
|
|
83
|
+
When a tool handler runs, it constructs a `SwaigFunctionResult`, optionally adds actions, and returns it. The SDK serializes it via `toDict()` and sends it back to SignalWire.
|
|
84
|
+
|
|
85
|
+
### Basic usage
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { AgentBase, SwaigFunctionResult } from '@anthropic/signalwire-agents';
|
|
89
|
+
|
|
90
|
+
const agent = new AgentBase({ name: 'my-agent', basicAuth: ['user', 'pass'] });
|
|
91
|
+
|
|
92
|
+
agent.defineTool({
|
|
93
|
+
name: 'transfer_call',
|
|
94
|
+
description: 'Transfer the caller to a human agent',
|
|
95
|
+
parameters: {},
|
|
96
|
+
handler: () => {
|
|
97
|
+
return new SwaigFunctionResult('Transferring you now.')
|
|
98
|
+
.connect('+15551234567');
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### How serialization works
|
|
104
|
+
|
|
105
|
+
When the handler returns, the SDK calls `toDict()` to produce a plain object:
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
const result = new SwaigFunctionResult('Done').hangup();
|
|
109
|
+
console.log(result.toDict());
|
|
110
|
+
// { response: "Done", action: [{ hangup: true }] }
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
If both `response` and `action` are empty, `toDict()` returns `{ response: "Action completed." }` as a fallback so the AI always receives a valid response.
|
|
114
|
+
|
|
115
|
+
### Properties
|
|
116
|
+
|
|
117
|
+
| Property | Type | Description |
|
|
118
|
+
|---------------|-----------------------------|--------------------------------------------------------------|
|
|
119
|
+
| `response` | `string` | Text returned to the AI engine. |
|
|
120
|
+
| `action` | `Record<string, unknown>[]` | Ordered list of action objects to execute. |
|
|
121
|
+
| `postProcess` | `boolean` | When `true`, actions execute after the AI formulates its reply. |
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Core Methods
|
|
126
|
+
|
|
127
|
+
### constructor
|
|
128
|
+
|
|
129
|
+
Create a new `SwaigFunctionResult`.
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
constructor(response?: string, postProcess?: boolean)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
| Parameter | Type | Default | Description |
|
|
136
|
+
|---------------|-----------|---------|------------------------------------------------|
|
|
137
|
+
| `response` | `string` | `''` | Initial response text for the AI. |
|
|
138
|
+
| `postProcess` | `boolean` | `false` | Whether actions should be post-processed. |
|
|
139
|
+
|
|
140
|
+
**Returns:** A new `SwaigFunctionResult` instance.
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
// Empty result (will serialize as "Action completed.")
|
|
144
|
+
const r1 = new SwaigFunctionResult();
|
|
145
|
+
|
|
146
|
+
// With response text
|
|
147
|
+
const r2 = new SwaigFunctionResult('Order placed successfully.');
|
|
148
|
+
|
|
149
|
+
// With post-processing enabled
|
|
150
|
+
const r3 = new SwaigFunctionResult('Processing payment...', true);
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
### setResponse
|
|
156
|
+
|
|
157
|
+
Set or replace the response text.
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
setResponse(response: string): this
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
| Parameter | Type | Description |
|
|
164
|
+
|------------|----------|---------------------------|
|
|
165
|
+
| `response` | `string` | The new response text. |
|
|
166
|
+
|
|
167
|
+
**Returns:** `this` for chaining.
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
const result = new SwaigFunctionResult()
|
|
171
|
+
.setResponse('Your balance is $42.50');
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
### setPostProcess
|
|
177
|
+
|
|
178
|
+
Enable or disable post-processing of actions.
|
|
179
|
+
|
|
180
|
+
When post-processing is enabled, the actions are executed **after** the AI has formulated its spoken response to the caller, rather than before. This is useful when you want the AI to speak first and then perform side effects (like hanging up).
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
setPostProcess(postProcess: boolean): this
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
| Parameter | Type | Description |
|
|
187
|
+
|---------------|-----------|------------------------------------------|
|
|
188
|
+
| `postProcess` | `boolean` | Whether to enable post-processing. |
|
|
189
|
+
|
|
190
|
+
**Returns:** `this` for chaining.
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
const result = new SwaigFunctionResult('Goodbye!')
|
|
194
|
+
.setPostProcess(true)
|
|
195
|
+
.hangup();
|
|
196
|
+
// The AI says "Goodbye!" first, then the hangup executes.
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
### addAction
|
|
202
|
+
|
|
203
|
+
Append a single named action to the action list. This is the low-level method used internally by most other methods. You can use it directly for custom or undocumented actions.
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
addAction(name: string, data: unknown): this
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
| Parameter | Type | Description |
|
|
210
|
+
|-----------|-----------|-----------------------------------------|
|
|
211
|
+
| `name` | `string` | The action name (e.g., `"hangup"`). |
|
|
212
|
+
| `data` | `unknown` | The action payload. |
|
|
213
|
+
|
|
214
|
+
**Returns:** `this` for chaining.
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
const result = new SwaigFunctionResult('Done')
|
|
218
|
+
.addAction('custom_action', { key: 'value' });
|
|
219
|
+
// action: [{ custom_action: { key: "value" } }]
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
### addActions
|
|
225
|
+
|
|
226
|
+
Append multiple action objects at once. Each object in the array should be a single-key record mapping an action name to its payload.
|
|
227
|
+
|
|
228
|
+
```typescript
|
|
229
|
+
addActions(actions: Record<string, unknown>[]): this
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
| Parameter | Type | Description |
|
|
233
|
+
|-----------|-----------------------------|------------------------------------|
|
|
234
|
+
| `actions` | `Record<string, unknown>[]` | Array of action objects to append. |
|
|
235
|
+
|
|
236
|
+
**Returns:** `this` for chaining.
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
const result = new SwaigFunctionResult('Multi-step')
|
|
240
|
+
.addActions([
|
|
241
|
+
{ say: 'Step one complete.' },
|
|
242
|
+
{ say: 'Step two complete.' },
|
|
243
|
+
{ hangup: true },
|
|
244
|
+
]);
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
### toDict
|
|
250
|
+
|
|
251
|
+
Serialize the result to a plain object for the SWAIG response wire format.
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
toDict(): Record<string, unknown>
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**Returns:** A dictionary with `response`, `action`, and optionally `post_process` fields.
|
|
258
|
+
|
|
259
|
+
**Behavior:**
|
|
260
|
+
- If `response` is non-empty, it is included as `response`.
|
|
261
|
+
- If `action` has entries, they are included as `action`.
|
|
262
|
+
- If `postProcess` is `true` and there are actions, `post_process: true` is included.
|
|
263
|
+
- If both `response` and `action` are empty, the result falls back to `{ response: "Action completed." }`.
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
const result = new SwaigFunctionResult('Hello').say('Welcome!');
|
|
267
|
+
console.log(result.toDict());
|
|
268
|
+
// {
|
|
269
|
+
// response: "Hello",
|
|
270
|
+
// action: [{ say: "Welcome!" }]
|
|
271
|
+
// }
|
|
272
|
+
|
|
273
|
+
const empty = new SwaigFunctionResult();
|
|
274
|
+
console.log(empty.toDict());
|
|
275
|
+
// { response: "Action completed." }
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Call Control
|
|
281
|
+
|
|
282
|
+
### connect
|
|
283
|
+
|
|
284
|
+
Connect (transfer) the call to another destination using SWML. This generates an inline SWML document with a `connect` verb.
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
connect(destination: string, final?: boolean, fromAddr?: string): this
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
| Parameter | Type | Default | Description |
|
|
291
|
+
|---------------|-----------|---------|----------------------------------------------------------|
|
|
292
|
+
| `destination` | `string` | -- | Phone number or SIP URI to connect to. |
|
|
293
|
+
| `final` | `boolean` | `true` | If `true`, the AI session ends after the transfer. |
|
|
294
|
+
| `fromAddr` | `string` | -- | Optional caller ID for the outbound leg. |
|
|
295
|
+
|
|
296
|
+
**Returns:** `this` for chaining.
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
// Simple transfer
|
|
300
|
+
const result = new SwaigFunctionResult('Connecting you to support.')
|
|
301
|
+
.connect('+15551234567');
|
|
302
|
+
|
|
303
|
+
// Non-final transfer (AI continues after the connected call ends)
|
|
304
|
+
const result2 = new SwaigFunctionResult('Let me conference in my manager.')
|
|
305
|
+
.connect('+15559876543', false);
|
|
306
|
+
|
|
307
|
+
// Transfer with custom caller ID
|
|
308
|
+
const result3 = new SwaigFunctionResult('Transferring...')
|
|
309
|
+
.connect('+15551234567', true, '+15550001111');
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
### swmlTransfer
|
|
315
|
+
|
|
316
|
+
Transfer the call to a SWML destination with a custom AI response set before transferring. Unlike `connect`, this uses the SWML `transfer` verb with a `set` verb to inject an AI response.
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
swmlTransfer(dest: string, aiResponse: string, final?: boolean): this
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
| Parameter | Type | Default | Description |
|
|
323
|
+
|--------------|-----------|---------|----------------------------------------------------|
|
|
324
|
+
| `dest` | `string` | -- | The transfer destination. |
|
|
325
|
+
| `aiResponse` | `string` | -- | AI response text to set before transferring. |
|
|
326
|
+
| `final` | `boolean` | `true` | Whether this is a final transfer. |
|
|
327
|
+
|
|
328
|
+
**Returns:** `this` for chaining.
|
|
329
|
+
|
|
330
|
+
```typescript
|
|
331
|
+
const result = new SwaigFunctionResult('Transfer initiated.')
|
|
332
|
+
.swmlTransfer('sip:support@example.com', 'Call is being transferred to support.');
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
### hangup
|
|
338
|
+
|
|
339
|
+
Hang up the call. Adds a `{ hangup: true }` action.
|
|
340
|
+
|
|
341
|
+
```typescript
|
|
342
|
+
hangup(): this
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**Returns:** `this` for chaining.
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
const result = new SwaigFunctionResult('Thank you for calling. Goodbye!')
|
|
349
|
+
.setPostProcess(true)
|
|
350
|
+
.hangup();
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
### hold
|
|
356
|
+
|
|
357
|
+
Place the call on hold for a specified duration. The timeout is clamped between 0 and 900 seconds (15 minutes).
|
|
358
|
+
|
|
359
|
+
```typescript
|
|
360
|
+
hold(timeout?: number): this
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
| Parameter | Type | Default | Description |
|
|
364
|
+
|-----------|----------|---------|--------------------------------------|
|
|
365
|
+
| `timeout` | `number` | `300` | Hold duration in seconds (0--900). |
|
|
366
|
+
|
|
367
|
+
**Returns:** `this` for chaining.
|
|
368
|
+
|
|
369
|
+
```typescript
|
|
370
|
+
// Hold for default 5 minutes
|
|
371
|
+
const result = new SwaigFunctionResult('Please hold.').hold();
|
|
372
|
+
|
|
373
|
+
// Hold for 60 seconds
|
|
374
|
+
const result2 = new SwaigFunctionResult('Brief hold.').hold(60);
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
### waitForUser
|
|
380
|
+
|
|
381
|
+
Wait for user input before continuing. Supports multiple modes: simple enable/disable, a timeout, or an "answer first" mode.
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
waitForUser(opts?: {
|
|
385
|
+
enabled?: boolean;
|
|
386
|
+
timeout?: number;
|
|
387
|
+
answerFirst?: boolean;
|
|
388
|
+
}): this
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
| Parameter | Type | Default | Description |
|
|
392
|
+
|--------------------|-----------|---------|--------------------------------------------------|
|
|
393
|
+
| `opts.enabled` | `boolean` | -- | Enable or disable waiting for user input. |
|
|
394
|
+
| `opts.timeout` | `number` | -- | Timeout in seconds to wait for user input. |
|
|
395
|
+
| `opts.answerFirst` | `boolean` | -- | If `true`, wait for the call to be answered first. |
|
|
396
|
+
|
|
397
|
+
**Priority:** `answerFirst` > `timeout` > `enabled`. If no options are provided, `wait_for_user` is set to `true`.
|
|
398
|
+
|
|
399
|
+
**Returns:** `this` for chaining.
|
|
400
|
+
|
|
401
|
+
```typescript
|
|
402
|
+
// Simple wait
|
|
403
|
+
const r1 = new SwaigFunctionResult('Go ahead.').waitForUser();
|
|
404
|
+
|
|
405
|
+
// Wait with timeout
|
|
406
|
+
const r2 = new SwaigFunctionResult('I will wait 10 seconds.')
|
|
407
|
+
.waitForUser({ timeout: 10 });
|
|
408
|
+
|
|
409
|
+
// Answer-first mode
|
|
410
|
+
const r3 = new SwaigFunctionResult('Waiting for answer.')
|
|
411
|
+
.waitForUser({ answerFirst: true });
|
|
412
|
+
|
|
413
|
+
// Disable waiting
|
|
414
|
+
const r4 = new SwaigFunctionResult('Continuing.')
|
|
415
|
+
.waitForUser({ enabled: false });
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
### stop
|
|
421
|
+
|
|
422
|
+
Stop the AI session entirely. Adds a `{ stop: true }` action.
|
|
423
|
+
|
|
424
|
+
```typescript
|
|
425
|
+
stop(): this
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
**Returns:** `this` for chaining.
|
|
429
|
+
|
|
430
|
+
```typescript
|
|
431
|
+
const result = new SwaigFunctionResult('Session ended.').stop();
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
## Audio
|
|
437
|
+
|
|
438
|
+
### say
|
|
439
|
+
|
|
440
|
+
Speak text to the caller via text-to-speech (TTS).
|
|
441
|
+
|
|
442
|
+
```typescript
|
|
443
|
+
say(text: string): this
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
| Parameter | Type | Description |
|
|
447
|
+
|-----------|----------|--------------------------|
|
|
448
|
+
| `text` | `string` | The text to speak. |
|
|
449
|
+
|
|
450
|
+
**Returns:** `this` for chaining.
|
|
451
|
+
|
|
452
|
+
```typescript
|
|
453
|
+
const result = new SwaigFunctionResult('Info retrieved.')
|
|
454
|
+
.say('Your order number is 12345.');
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
459
|
+
### playBackgroundFile
|
|
460
|
+
|
|
461
|
+
Play an audio file in the background during the call. The AI conversation continues while the file plays.
|
|
462
|
+
|
|
463
|
+
```typescript
|
|
464
|
+
playBackgroundFile(filename: string, wait?: boolean): this
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
| Parameter | Type | Default | Description |
|
|
468
|
+
|------------|-----------|---------|----------------------------------------------------|
|
|
469
|
+
| `filename` | `string` | -- | URL or path of the audio file. |
|
|
470
|
+
| `wait` | `boolean` | `false` | If `true`, block until playback completes. |
|
|
471
|
+
|
|
472
|
+
**Returns:** `this` for chaining.
|
|
473
|
+
|
|
474
|
+
```typescript
|
|
475
|
+
// Play background music (non-blocking)
|
|
476
|
+
const result = new SwaigFunctionResult('Playing hold music.')
|
|
477
|
+
.playBackgroundFile('https://example.com/hold-music.mp3');
|
|
478
|
+
|
|
479
|
+
// Play and wait for completion
|
|
480
|
+
const result2 = new SwaigFunctionResult('Listen to this announcement.')
|
|
481
|
+
.playBackgroundFile('https://example.com/announcement.wav', true);
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
### stopBackgroundFile
|
|
487
|
+
|
|
488
|
+
Stop any currently playing background audio file.
|
|
489
|
+
|
|
490
|
+
```typescript
|
|
491
|
+
stopBackgroundFile(): this
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
**Returns:** `this` for chaining.
|
|
495
|
+
|
|
496
|
+
```typescript
|
|
497
|
+
const result = new SwaigFunctionResult('Stopping music.')
|
|
498
|
+
.stopBackgroundFile();
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## Speech
|
|
504
|
+
|
|
505
|
+
### addDynamicHints
|
|
506
|
+
|
|
507
|
+
Add dynamic speech recognition hints to improve transcription accuracy for specific words or phrases. Hints can be plain strings or pattern-replacement objects.
|
|
508
|
+
|
|
509
|
+
```typescript
|
|
510
|
+
addDynamicHints(
|
|
511
|
+
hints: (string | { pattern: string; replace: string; ignore_case?: boolean })[]
|
|
512
|
+
): this
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
| Parameter | Type | Description |
|
|
516
|
+
|-----------|-----------------------------------------------------------------------------------|------------------------------------------------|
|
|
517
|
+
| `hints` | `(string \| { pattern: string; replace: string; ignore_case?: boolean })[]` | Array of hint strings or pattern objects. |
|
|
518
|
+
|
|
519
|
+
**Returns:** `this` for chaining.
|
|
520
|
+
|
|
521
|
+
```typescript
|
|
522
|
+
// Simple word hints
|
|
523
|
+
const result = new SwaigFunctionResult('Ready.')
|
|
524
|
+
.addDynamicHints(['SignalWire', 'SWML', 'SWAIG']);
|
|
525
|
+
|
|
526
|
+
// Pattern-replacement hints
|
|
527
|
+
const result2 = new SwaigFunctionResult('Ready.')
|
|
528
|
+
.addDynamicHints([
|
|
529
|
+
{ pattern: 'signal wire', replace: 'SignalWire', ignore_case: true },
|
|
530
|
+
{ pattern: 'swiggy', replace: 'SWAIG' },
|
|
531
|
+
]);
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
### clearDynamicHints
|
|
537
|
+
|
|
538
|
+
Remove all previously added dynamic speech recognition hints.
|
|
539
|
+
|
|
540
|
+
```typescript
|
|
541
|
+
clearDynamicHints(): this
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
**Returns:** `this` for chaining.
|
|
545
|
+
|
|
546
|
+
```typescript
|
|
547
|
+
const result = new SwaigFunctionResult('Hints cleared.')
|
|
548
|
+
.clearDynamicHints();
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
### setEndOfSpeechTimeout
|
|
554
|
+
|
|
555
|
+
Set the silence duration that marks the end of a user's speech. A shorter timeout makes the AI respond more quickly after the user stops talking; a longer timeout allows for natural pauses.
|
|
556
|
+
|
|
557
|
+
```typescript
|
|
558
|
+
setEndOfSpeechTimeout(milliseconds: number): this
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
| Parameter | Type | Description |
|
|
562
|
+
|----------------|----------|-----------------------------------|
|
|
563
|
+
| `milliseconds` | `number` | Timeout in milliseconds. |
|
|
564
|
+
|
|
565
|
+
**Returns:** `this` for chaining.
|
|
566
|
+
|
|
567
|
+
```typescript
|
|
568
|
+
const result = new SwaigFunctionResult('Adjusted speech timeout.')
|
|
569
|
+
.setEndOfSpeechTimeout(500); // 500ms of silence = end of speech
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
574
|
+
### setSpeechEventTimeout
|
|
575
|
+
|
|
576
|
+
Set the timeout for speech event detection.
|
|
577
|
+
|
|
578
|
+
```typescript
|
|
579
|
+
setSpeechEventTimeout(milliseconds: number): this
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
| Parameter | Type | Description |
|
|
583
|
+
|----------------|----------|-----------------------------------|
|
|
584
|
+
| `milliseconds` | `number` | Timeout in milliseconds. |
|
|
585
|
+
|
|
586
|
+
**Returns:** `this` for chaining.
|
|
587
|
+
|
|
588
|
+
```typescript
|
|
589
|
+
const result = new SwaigFunctionResult('Event timeout set.')
|
|
590
|
+
.setSpeechEventTimeout(3000);
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
---
|
|
594
|
+
|
|
595
|
+
## Data Management
|
|
596
|
+
|
|
597
|
+
### updateGlobalData
|
|
598
|
+
|
|
599
|
+
Merge key-value pairs into the global data store. The global data store is shared across all SWAIG functions during a call and persists for the call's lifetime.
|
|
600
|
+
|
|
601
|
+
```typescript
|
|
602
|
+
updateGlobalData(data: Record<string, unknown>): this
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
| Parameter | Type | Description |
|
|
606
|
+
|-----------|----------------------------|------------------------------------|
|
|
607
|
+
| `data` | `Record<string, unknown>` | Key-value pairs to set or update. |
|
|
608
|
+
|
|
609
|
+
**Returns:** `this` for chaining.
|
|
610
|
+
|
|
611
|
+
```typescript
|
|
612
|
+
const result = new SwaigFunctionResult('Data saved.')
|
|
613
|
+
.updateGlobalData({ customer_id: 'C-123', tier: 'premium' });
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
---
|
|
617
|
+
|
|
618
|
+
### removeGlobalData
|
|
619
|
+
|
|
620
|
+
Remove one or more keys from the global data store.
|
|
621
|
+
|
|
622
|
+
```typescript
|
|
623
|
+
removeGlobalData(keys: string | string[]): this
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
| Parameter | Type | Description |
|
|
627
|
+
|-----------|----------------------|------------------------------------------|
|
|
628
|
+
| `keys` | `string \| string[]` | A single key or array of keys to remove. |
|
|
629
|
+
|
|
630
|
+
**Returns:** `this` for chaining.
|
|
631
|
+
|
|
632
|
+
```typescript
|
|
633
|
+
// Remove a single key
|
|
634
|
+
const r1 = new SwaigFunctionResult('Removed.')
|
|
635
|
+
.removeGlobalData('temp_token');
|
|
636
|
+
|
|
637
|
+
// Remove multiple keys
|
|
638
|
+
const r2 = new SwaigFunctionResult('Cleaned up.')
|
|
639
|
+
.removeGlobalData(['temp_token', 'session_cache']);
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
---
|
|
643
|
+
|
|
644
|
+
### setMetadata
|
|
645
|
+
|
|
646
|
+
Set metadata key-value pairs on the current call. Metadata is attached to the call record and can be used for reporting, billing tags, or downstream processing.
|
|
647
|
+
|
|
648
|
+
```typescript
|
|
649
|
+
setMetadata(data: Record<string, unknown>): this
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
| Parameter | Type | Description |
|
|
653
|
+
|-----------|----------------------------|-------------------------------|
|
|
654
|
+
| `data` | `Record<string, unknown>` | Metadata key-value pairs. |
|
|
655
|
+
|
|
656
|
+
**Returns:** `this` for chaining.
|
|
657
|
+
|
|
658
|
+
```typescript
|
|
659
|
+
const result = new SwaigFunctionResult('Metadata set.')
|
|
660
|
+
.setMetadata({ department: 'sales', priority: 'high' });
|
|
661
|
+
```
|
|
662
|
+
|
|
663
|
+
---
|
|
664
|
+
|
|
665
|
+
### removeMetadata
|
|
666
|
+
|
|
667
|
+
Remove metadata keys from the current call.
|
|
668
|
+
|
|
669
|
+
```typescript
|
|
670
|
+
removeMetadata(keys: string | string[]): this
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
| Parameter | Type | Description |
|
|
674
|
+
|-----------|----------------------|------------------------------------------|
|
|
675
|
+
| `keys` | `string \| string[]` | A single key or array of keys to remove. |
|
|
676
|
+
|
|
677
|
+
**Returns:** `this` for chaining.
|
|
678
|
+
|
|
679
|
+
```typescript
|
|
680
|
+
const result = new SwaigFunctionResult('Metadata removed.')
|
|
681
|
+
.removeMetadata(['temp_flag', 'debug_info']);
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
---
|
|
685
|
+
|
|
686
|
+
## SWML Actions
|
|
687
|
+
|
|
688
|
+
### executeSwml
|
|
689
|
+
|
|
690
|
+
Execute arbitrary SWML content as an action. Accepts either a JSON string or an object. If the string is not valid JSON, it is wrapped in a `{ raw_swml: ... }` object.
|
|
691
|
+
|
|
692
|
+
```typescript
|
|
693
|
+
executeSwml(
|
|
694
|
+
swmlContent: string | Record<string, unknown>,
|
|
695
|
+
transfer?: boolean
|
|
696
|
+
): this
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
| Parameter | Type | Default | Description |
|
|
700
|
+
|---------------|-----------------------------------------|---------|---------------------------------------------------|
|
|
701
|
+
| `swmlContent` | `string \| Record<string, unknown>` | -- | SWML as a JSON string or object. |
|
|
702
|
+
| `transfer` | `boolean` | `false` | If `true`, the SWML execution transfers the call. |
|
|
703
|
+
|
|
704
|
+
**Returns:** `this` for chaining.
|
|
705
|
+
|
|
706
|
+
```typescript
|
|
707
|
+
// Execute SWML from an object
|
|
708
|
+
const result = new SwaigFunctionResult('Executing custom flow.')
|
|
709
|
+
.executeSwml({
|
|
710
|
+
version: '1.0.0',
|
|
711
|
+
sections: {
|
|
712
|
+
main: [{ play: { url: 'https://example.com/audio.mp3' } }],
|
|
713
|
+
},
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
// Execute with transfer
|
|
717
|
+
const result2 = new SwaigFunctionResult('Transferring via SWML.')
|
|
718
|
+
.executeSwml({
|
|
719
|
+
version: '1.0.0',
|
|
720
|
+
sections: {
|
|
721
|
+
main: [{ connect: { to: '+15551234567' } }],
|
|
722
|
+
},
|
|
723
|
+
}, true);
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
---
|
|
727
|
+
|
|
728
|
+
### switchContext
|
|
729
|
+
|
|
730
|
+
Switch the AI context at runtime. This can change the system prompt, inject a user prompt, consolidate conversation history, or perform a full reset of the AI context.
|
|
731
|
+
|
|
732
|
+
```typescript
|
|
733
|
+
switchContext(opts?: {
|
|
734
|
+
systemPrompt?: string;
|
|
735
|
+
userPrompt?: string;
|
|
736
|
+
consolidate?: boolean;
|
|
737
|
+
fullReset?: boolean;
|
|
738
|
+
}): this
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
| Parameter | Type | Description |
|
|
742
|
+
|---------------------|-----------|-------------------------------------------------------------------|
|
|
743
|
+
| `opts.systemPrompt` | `string` | New system prompt to switch to. |
|
|
744
|
+
| `opts.userPrompt` | `string` | User prompt to inject into the new context. |
|
|
745
|
+
| `opts.consolidate` | `boolean` | If `true`, summarize and carry over conversation history. |
|
|
746
|
+
| `opts.fullReset` | `boolean` | If `true`, completely reset the AI context (clear all history). |
|
|
747
|
+
|
|
748
|
+
**Behavior:** If only `systemPrompt` is provided (no other options), the action uses a simple string value. Otherwise, it builds an object with the specified fields.
|
|
749
|
+
|
|
750
|
+
**Returns:** `this` for chaining.
|
|
751
|
+
|
|
752
|
+
```typescript
|
|
753
|
+
// Simple context switch -- just change the system prompt
|
|
754
|
+
const r1 = new SwaigFunctionResult('Switching to billing mode.')
|
|
755
|
+
.switchContext({ systemPrompt: 'You are a billing specialist.' });
|
|
756
|
+
|
|
757
|
+
// Switch with consolidation (carry over conversation summary)
|
|
758
|
+
const r2 = new SwaigFunctionResult('Escalating to supervisor.')
|
|
759
|
+
.switchContext({
|
|
760
|
+
systemPrompt: 'You are a supervisor handling an escalated call.',
|
|
761
|
+
consolidate: true,
|
|
762
|
+
});
|
|
763
|
+
|
|
764
|
+
// Full reset
|
|
765
|
+
const r3 = new SwaigFunctionResult('Starting fresh.')
|
|
766
|
+
.switchContext({
|
|
767
|
+
systemPrompt: 'You are a general assistant.',
|
|
768
|
+
fullReset: true,
|
|
769
|
+
});
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
---
|
|
773
|
+
|
|
774
|
+
### swmlChangeStep
|
|
775
|
+
|
|
776
|
+
Change the current SWML step. Steps are named blocks within a SWML document that control call flow.
|
|
777
|
+
|
|
778
|
+
```typescript
|
|
779
|
+
swmlChangeStep(stepName: string): this
|
|
780
|
+
```
|
|
781
|
+
|
|
782
|
+
| Parameter | Type | Description |
|
|
783
|
+
|------------|----------|------------------------------------|
|
|
784
|
+
| `stepName` | `string` | The name of the step to switch to. |
|
|
785
|
+
|
|
786
|
+
**Returns:** `this` for chaining.
|
|
787
|
+
|
|
788
|
+
```typescript
|
|
789
|
+
const result = new SwaigFunctionResult('Moving to verification.')
|
|
790
|
+
.swmlChangeStep('verify_identity');
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
---
|
|
794
|
+
|
|
795
|
+
### swmlChangeContext
|
|
796
|
+
|
|
797
|
+
Change the current SWML context. Contexts are separate AI configurations that can be switched during a call.
|
|
798
|
+
|
|
799
|
+
```typescript
|
|
800
|
+
swmlChangeContext(contextName: string): this
|
|
801
|
+
```
|
|
802
|
+
|
|
803
|
+
| Parameter | Type | Description |
|
|
804
|
+
|---------------|----------|---------------------------------------|
|
|
805
|
+
| `contextName` | `string` | The name of the context to switch to. |
|
|
806
|
+
|
|
807
|
+
**Returns:** `this` for chaining.
|
|
808
|
+
|
|
809
|
+
```typescript
|
|
810
|
+
const result = new SwaigFunctionResult('Switching to Spanish.')
|
|
811
|
+
.swmlChangeContext('spanish_support');
|
|
812
|
+
```
|
|
813
|
+
|
|
814
|
+
---
|
|
815
|
+
|
|
816
|
+
### swmlUserEvent
|
|
817
|
+
|
|
818
|
+
Emit a custom user event via SWML. User events can be consumed by external systems listening to the call's event stream.
|
|
819
|
+
|
|
820
|
+
```typescript
|
|
821
|
+
swmlUserEvent(eventData: Record<string, unknown>): this
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
| Parameter | Type | Description |
|
|
825
|
+
|-------------|----------------------------|----------------------|
|
|
826
|
+
| `eventData` | `Record<string, unknown>` | The event payload. |
|
|
827
|
+
|
|
828
|
+
**Returns:** `this` for chaining.
|
|
829
|
+
|
|
830
|
+
```typescript
|
|
831
|
+
const result = new SwaigFunctionResult('Event emitted.')
|
|
832
|
+
.swmlUserEvent({
|
|
833
|
+
type: 'order_placed',
|
|
834
|
+
order_id: 'ORD-456',
|
|
835
|
+
total: 29.99,
|
|
836
|
+
});
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
---
|
|
840
|
+
|
|
841
|
+
## Function Control
|
|
842
|
+
|
|
843
|
+
### toggleFunctions
|
|
844
|
+
|
|
845
|
+
Enable or disable SWAIG functions by name at runtime. This allows dynamic control over which tools the AI can call based on the conversation state.
|
|
846
|
+
|
|
847
|
+
```typescript
|
|
848
|
+
toggleFunctions(toggles: { function: string; active: boolean }[]): this
|
|
849
|
+
```
|
|
850
|
+
|
|
851
|
+
| Parameter | Type | Description |
|
|
852
|
+
|--------------------|-----------|------------------------------------------|
|
|
853
|
+
| `toggles[].function` | `string` | The name of the SWAIG function. |
|
|
854
|
+
| `toggles[].active` | `boolean` | `true` to enable, `false` to disable. |
|
|
855
|
+
|
|
856
|
+
**Returns:** `this` for chaining.
|
|
857
|
+
|
|
858
|
+
```typescript
|
|
859
|
+
// After authentication, enable account-specific tools
|
|
860
|
+
const result = new SwaigFunctionResult('Identity verified.')
|
|
861
|
+
.toggleFunctions([
|
|
862
|
+
{ function: 'check_balance', active: true },
|
|
863
|
+
{ function: 'make_payment', active: true },
|
|
864
|
+
{ function: 'verify_identity', active: false },
|
|
865
|
+
]);
|
|
866
|
+
```
|
|
867
|
+
|
|
868
|
+
---
|
|
869
|
+
|
|
870
|
+
### enableFunctionsOnTimeout
|
|
871
|
+
|
|
872
|
+
Control whether SWAIG functions can fire automatically when the speaker timeout triggers (i.e., when the caller is silent).
|
|
873
|
+
|
|
874
|
+
```typescript
|
|
875
|
+
enableFunctionsOnTimeout(enabled?: boolean): this
|
|
876
|
+
```
|
|
877
|
+
|
|
878
|
+
| Parameter | Type | Default | Description |
|
|
879
|
+
|-----------|-----------|---------|------------------------------------------------------|
|
|
880
|
+
| `enabled` | `boolean` | `true` | Whether to enable function execution on timeout. |
|
|
881
|
+
|
|
882
|
+
**Returns:** `this` for chaining.
|
|
883
|
+
|
|
884
|
+
```typescript
|
|
885
|
+
// Enable functions on speaker timeout
|
|
886
|
+
const r1 = new SwaigFunctionResult('Monitoring silence.')
|
|
887
|
+
.enableFunctionsOnTimeout();
|
|
888
|
+
|
|
889
|
+
// Disable functions on speaker timeout
|
|
890
|
+
const r2 = new SwaigFunctionResult('Waiting patiently.')
|
|
891
|
+
.enableFunctionsOnTimeout(false);
|
|
892
|
+
```
|
|
893
|
+
|
|
894
|
+
---
|
|
895
|
+
|
|
896
|
+
### updateSettings
|
|
897
|
+
|
|
898
|
+
Update AI engine settings at runtime. This allows dynamic modification of parameters like temperature, top_p, or any other engine setting.
|
|
899
|
+
|
|
900
|
+
```typescript
|
|
901
|
+
updateSettings(settings: Record<string, unknown>): this
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
| Parameter | Type | Description |
|
|
905
|
+
|------------|----------------------------|--------------------------------------|
|
|
906
|
+
| `settings` | `Record<string, unknown>` | Key-value pairs of settings. |
|
|
907
|
+
|
|
908
|
+
**Returns:** `this` for chaining.
|
|
909
|
+
|
|
910
|
+
```typescript
|
|
911
|
+
const result = new SwaigFunctionResult('Settings updated.')
|
|
912
|
+
.updateSettings({ temperature: 0.3, top_p: 0.9 });
|
|
913
|
+
```
|
|
914
|
+
|
|
915
|
+
---
|
|
916
|
+
|
|
917
|
+
## User Input and History
|
|
918
|
+
|
|
919
|
+
### simulateUserInput
|
|
920
|
+
|
|
921
|
+
Inject text as if the user had spoken it. This is useful for programmatically driving the conversation flow.
|
|
922
|
+
|
|
923
|
+
```typescript
|
|
924
|
+
simulateUserInput(text: string): this
|
|
925
|
+
```
|
|
926
|
+
|
|
927
|
+
| Parameter | Type | Description |
|
|
928
|
+
|-----------|----------|------------------------------------|
|
|
929
|
+
| `text` | `string` | The simulated user input text. |
|
|
930
|
+
|
|
931
|
+
**Returns:** `this` for chaining.
|
|
932
|
+
|
|
933
|
+
```typescript
|
|
934
|
+
const result = new SwaigFunctionResult('Proceeding with default.')
|
|
935
|
+
.simulateUserInput('Yes, please go ahead.');
|
|
936
|
+
```
|
|
937
|
+
|
|
938
|
+
---
|
|
939
|
+
|
|
940
|
+
### enableExtensiveData
|
|
941
|
+
|
|
942
|
+
Enable or disable extensive data reporting in function calls. When enabled, SWAIG function invocations include additional metadata about the call state.
|
|
943
|
+
|
|
944
|
+
```typescript
|
|
945
|
+
enableExtensiveData(enabled?: boolean): this
|
|
946
|
+
```
|
|
947
|
+
|
|
948
|
+
| Parameter | Type | Default | Description |
|
|
949
|
+
|-----------|-----------|---------|------------------------------------------|
|
|
950
|
+
| `enabled` | `boolean` | `true` | Whether to enable extensive data. |
|
|
951
|
+
|
|
952
|
+
**Returns:** `this` for chaining.
|
|
953
|
+
|
|
954
|
+
```typescript
|
|
955
|
+
const result = new SwaigFunctionResult('Extensive data enabled.')
|
|
956
|
+
.enableExtensiveData();
|
|
957
|
+
```
|
|
958
|
+
|
|
959
|
+
---
|
|
960
|
+
|
|
961
|
+
### replaceInHistory
|
|
962
|
+
|
|
963
|
+
Replace the function call output in the conversation history. This controls what the AI "remembers" about this function invocation.
|
|
964
|
+
|
|
965
|
+
```typescript
|
|
966
|
+
replaceInHistory(text?: string | boolean): this
|
|
967
|
+
```
|
|
968
|
+
|
|
969
|
+
| Parameter | Type | Default | Description |
|
|
970
|
+
|-----------|-----------------------|---------|-----------------------------------------------------------|
|
|
971
|
+
| `text` | `string \| boolean` | `true` | Replacement text, or `true` to replace with the response. |
|
|
972
|
+
|
|
973
|
+
**Returns:** `this` for chaining.
|
|
974
|
+
|
|
975
|
+
```typescript
|
|
976
|
+
// Replace with the response text
|
|
977
|
+
const r1 = new SwaigFunctionResult('Sensitive data redacted.')
|
|
978
|
+
.replaceInHistory();
|
|
979
|
+
|
|
980
|
+
// Replace with custom text
|
|
981
|
+
const r2 = new SwaigFunctionResult('SSN verified.')
|
|
982
|
+
.replaceInHistory('Identity verification completed.');
|
|
983
|
+
```
|
|
984
|
+
|
|
985
|
+
---
|
|
986
|
+
|
|
987
|
+
## Communication
|
|
988
|
+
|
|
989
|
+
### sendSms
|
|
990
|
+
|
|
991
|
+
Send an SMS or MMS message from within the call flow. At least one of `body` or `media` must be provided.
|
|
992
|
+
|
|
993
|
+
```typescript
|
|
994
|
+
sendSms(opts: {
|
|
995
|
+
toNumber: string;
|
|
996
|
+
fromNumber: string;
|
|
997
|
+
body?: string;
|
|
998
|
+
media?: string[];
|
|
999
|
+
tags?: string[];
|
|
1000
|
+
region?: string;
|
|
1001
|
+
}): this
|
|
1002
|
+
```
|
|
1003
|
+
|
|
1004
|
+
| Parameter | Type | Description |
|
|
1005
|
+
|------------------|------------|------------------------------------------------|
|
|
1006
|
+
| `opts.toNumber` | `string` | Recipient phone number. |
|
|
1007
|
+
| `opts.fromNumber` | `string` | Sender phone number (must be a number you own).|
|
|
1008
|
+
| `opts.body` | `string` | SMS text body. |
|
|
1009
|
+
| `opts.media` | `string[]` | Array of media URLs for MMS. |
|
|
1010
|
+
| `opts.tags` | `string[]` | Optional tags for the message. |
|
|
1011
|
+
| `opts.region` | `string` | Optional region for message routing. |
|
|
1012
|
+
|
|
1013
|
+
**Throws:** `Error` if neither `body` nor `media` is provided.
|
|
1014
|
+
|
|
1015
|
+
**Returns:** `this` for chaining.
|
|
1016
|
+
|
|
1017
|
+
```typescript
|
|
1018
|
+
// Send a text SMS
|
|
1019
|
+
const result = new SwaigFunctionResult('Confirmation sent.')
|
|
1020
|
+
.sendSms({
|
|
1021
|
+
toNumber: '+15551234567',
|
|
1022
|
+
fromNumber: '+15559876543',
|
|
1023
|
+
body: 'Your appointment is confirmed for tomorrow at 2pm.',
|
|
1024
|
+
});
|
|
1025
|
+
|
|
1026
|
+
// Send an MMS with an image
|
|
1027
|
+
const result2 = new SwaigFunctionResult('Receipt sent.')
|
|
1028
|
+
.sendSms({
|
|
1029
|
+
toNumber: '+15551234567',
|
|
1030
|
+
fromNumber: '+15559876543',
|
|
1031
|
+
body: 'Here is your receipt:',
|
|
1032
|
+
media: ['https://example.com/receipt.png'],
|
|
1033
|
+
});
|
|
1034
|
+
```
|
|
1035
|
+
|
|
1036
|
+
---
|
|
1037
|
+
|
|
1038
|
+
### recordCall
|
|
1039
|
+
|
|
1040
|
+
Start recording the call with configurable options.
|
|
1041
|
+
|
|
1042
|
+
```typescript
|
|
1043
|
+
recordCall(opts?: {
|
|
1044
|
+
controlId?: string;
|
|
1045
|
+
stereo?: boolean;
|
|
1046
|
+
format?: 'wav' | 'mp3';
|
|
1047
|
+
direction?: 'speak' | 'listen' | 'both';
|
|
1048
|
+
terminators?: string;
|
|
1049
|
+
beep?: boolean;
|
|
1050
|
+
inputSensitivity?: number;
|
|
1051
|
+
initialTimeout?: number;
|
|
1052
|
+
endSilenceTimeout?: number;
|
|
1053
|
+
maxLength?: number;
|
|
1054
|
+
statusUrl?: string;
|
|
1055
|
+
}): this
|
|
1056
|
+
```
|
|
1057
|
+
|
|
1058
|
+
| Parameter | Type | Default | Description |
|
|
1059
|
+
|-------------------------|---------------------------------|----------|-------------------------------------------------|
|
|
1060
|
+
| `opts.controlId` | `string` | -- | Identifier for this recording (for stop/status).|
|
|
1061
|
+
| `opts.stereo` | `boolean` | `false` | Record in stereo (separate channels). |
|
|
1062
|
+
| `opts.format` | `'wav' \| 'mp3'` | `'wav'` | Recording file format. |
|
|
1063
|
+
| `opts.direction` | `'speak' \| 'listen' \| 'both'` | `'both'` | Which audio direction to record. |
|
|
1064
|
+
| `opts.terminators` | `string` | -- | DTMF keys that stop the recording. |
|
|
1065
|
+
| `opts.beep` | `boolean` | `false` | Play a beep when recording starts. |
|
|
1066
|
+
| `opts.inputSensitivity` | `number` | `44.0` | Sensitivity for voice activity detection. |
|
|
1067
|
+
| `opts.initialTimeout` | `number` | -- | Seconds to wait for initial speech. |
|
|
1068
|
+
| `opts.endSilenceTimeout`| `number` | -- | Seconds of silence before stopping. |
|
|
1069
|
+
| `opts.maxLength` | `number` | -- | Maximum recording length in seconds. |
|
|
1070
|
+
| `opts.statusUrl` | `string` | -- | Webhook URL for recording status callbacks. |
|
|
1071
|
+
|
|
1072
|
+
**Returns:** `this` for chaining.
|
|
1073
|
+
|
|
1074
|
+
```typescript
|
|
1075
|
+
// Simple recording
|
|
1076
|
+
const result = new SwaigFunctionResult('Recording started.')
|
|
1077
|
+
.recordCall();
|
|
1078
|
+
|
|
1079
|
+
// Stereo MP3 recording with a control ID
|
|
1080
|
+
const result2 = new SwaigFunctionResult('Recording...')
|
|
1081
|
+
.recordCall({
|
|
1082
|
+
controlId: 'main-recording',
|
|
1083
|
+
stereo: true,
|
|
1084
|
+
format: 'mp3',
|
|
1085
|
+
maxLength: 3600,
|
|
1086
|
+
statusUrl: 'https://example.com/recording-status',
|
|
1087
|
+
});
|
|
1088
|
+
```
|
|
1089
|
+
|
|
1090
|
+
---
|
|
1091
|
+
|
|
1092
|
+
### stopRecordCall
|
|
1093
|
+
|
|
1094
|
+
Stop an active call recording.
|
|
1095
|
+
|
|
1096
|
+
```typescript
|
|
1097
|
+
stopRecordCall(controlId?: string): this
|
|
1098
|
+
```
|
|
1099
|
+
|
|
1100
|
+
| Parameter | Type | Description |
|
|
1101
|
+
|-------------|----------|--------------------------------------------------|
|
|
1102
|
+
| `controlId` | `string` | Optional control ID of the recording to stop. |
|
|
1103
|
+
|
|
1104
|
+
**Returns:** `this` for chaining.
|
|
1105
|
+
|
|
1106
|
+
```typescript
|
|
1107
|
+
const result = new SwaigFunctionResult('Recording stopped.')
|
|
1108
|
+
.stopRecordCall('main-recording');
|
|
1109
|
+
```
|
|
1110
|
+
|
|
1111
|
+
---
|
|
1112
|
+
|
|
1113
|
+
### tap
|
|
1114
|
+
|
|
1115
|
+
Start a media tap to stream audio to an external URI (e.g., for real-time transcription or monitoring).
|
|
1116
|
+
|
|
1117
|
+
```typescript
|
|
1118
|
+
tap(opts: {
|
|
1119
|
+
uri: string;
|
|
1120
|
+
controlId?: string;
|
|
1121
|
+
direction?: 'speak' | 'hear' | 'both';
|
|
1122
|
+
codec?: 'PCMU' | 'PCMA';
|
|
1123
|
+
rtpPtime?: number;
|
|
1124
|
+
statusUrl?: string;
|
|
1125
|
+
}): this
|
|
1126
|
+
```
|
|
1127
|
+
|
|
1128
|
+
| Parameter | Type | Default | Description |
|
|
1129
|
+
|------------------|----------------------------------|----------|----------------------------------------------|
|
|
1130
|
+
| `opts.uri` | `string` | -- | Destination URI for the media stream. |
|
|
1131
|
+
| `opts.controlId` | `string` | -- | Identifier for this tap (for stop/status). |
|
|
1132
|
+
| `opts.direction` | `'speak' \| 'hear' \| 'both'` | `'both'` | Which audio direction to tap. |
|
|
1133
|
+
| `opts.codec` | `'PCMU' \| 'PCMA'` | `'PCMU'` | Audio codec for the stream. |
|
|
1134
|
+
| `opts.rtpPtime` | `number` | `20` | RTP packetization time in milliseconds. |
|
|
1135
|
+
| `opts.statusUrl` | `string` | -- | Webhook URL for tap status callbacks. |
|
|
1136
|
+
|
|
1137
|
+
**Returns:** `this` for chaining.
|
|
1138
|
+
|
|
1139
|
+
```typescript
|
|
1140
|
+
const result = new SwaigFunctionResult('Tap started.')
|
|
1141
|
+
.tap({
|
|
1142
|
+
uri: 'wss://transcription.example.com/stream',
|
|
1143
|
+
controlId: 'realtime-tap',
|
|
1144
|
+
direction: 'both',
|
|
1145
|
+
});
|
|
1146
|
+
```
|
|
1147
|
+
|
|
1148
|
+
---
|
|
1149
|
+
|
|
1150
|
+
### stopTap
|
|
1151
|
+
|
|
1152
|
+
Stop an active media tap.
|
|
1153
|
+
|
|
1154
|
+
```typescript
|
|
1155
|
+
stopTap(controlId?: string): this
|
|
1156
|
+
```
|
|
1157
|
+
|
|
1158
|
+
| Parameter | Type | Description |
|
|
1159
|
+
|-------------|----------|---------------------------------------------|
|
|
1160
|
+
| `controlId` | `string` | Optional control ID of the tap to stop. |
|
|
1161
|
+
|
|
1162
|
+
**Returns:** `this` for chaining.
|
|
1163
|
+
|
|
1164
|
+
```typescript
|
|
1165
|
+
const result = new SwaigFunctionResult('Tap stopped.')
|
|
1166
|
+
.stopTap('realtime-tap');
|
|
1167
|
+
```
|
|
1168
|
+
|
|
1169
|
+
---
|
|
1170
|
+
|
|
1171
|
+
## Rooms and Conferencing
|
|
1172
|
+
|
|
1173
|
+
### joinRoom
|
|
1174
|
+
|
|
1175
|
+
Join a SignalWire room by name.
|
|
1176
|
+
|
|
1177
|
+
```typescript
|
|
1178
|
+
joinRoom(name: string): this
|
|
1179
|
+
```
|
|
1180
|
+
|
|
1181
|
+
| Parameter | Type | Description |
|
|
1182
|
+
|-----------|----------|-----------------------|
|
|
1183
|
+
| `name` | `string` | The room name. |
|
|
1184
|
+
|
|
1185
|
+
**Returns:** `this` for chaining.
|
|
1186
|
+
|
|
1187
|
+
```typescript
|
|
1188
|
+
const result = new SwaigFunctionResult('Joining the meeting room.')
|
|
1189
|
+
.joinRoom('team-standup');
|
|
1190
|
+
```
|
|
1191
|
+
|
|
1192
|
+
---
|
|
1193
|
+
|
|
1194
|
+
### sipRefer
|
|
1195
|
+
|
|
1196
|
+
Send a SIP REFER to transfer the call to another SIP endpoint.
|
|
1197
|
+
|
|
1198
|
+
```typescript
|
|
1199
|
+
sipRefer(toUri: string): this
|
|
1200
|
+
```
|
|
1201
|
+
|
|
1202
|
+
| Parameter | Type | Description |
|
|
1203
|
+
|-----------|----------|---------------------------------------|
|
|
1204
|
+
| `toUri` | `string` | The SIP URI to refer the call to. |
|
|
1205
|
+
|
|
1206
|
+
**Returns:** `this` for chaining.
|
|
1207
|
+
|
|
1208
|
+
```typescript
|
|
1209
|
+
const result = new SwaigFunctionResult('Transferring via SIP.')
|
|
1210
|
+
.sipRefer('sip:agent@pbx.example.com');
|
|
1211
|
+
```
|
|
1212
|
+
|
|
1213
|
+
---
|
|
1214
|
+
|
|
1215
|
+
### joinConference
|
|
1216
|
+
|
|
1217
|
+
Join a conference by name with optional configuration parameters.
|
|
1218
|
+
|
|
1219
|
+
```typescript
|
|
1220
|
+
joinConference(name: string, opts?: {
|
|
1221
|
+
muted?: boolean;
|
|
1222
|
+
beep?: 'true' | 'false' | 'onEnter' | 'onExit';
|
|
1223
|
+
startOnEnter?: boolean;
|
|
1224
|
+
endOnExit?: boolean;
|
|
1225
|
+
waitUrl?: string;
|
|
1226
|
+
maxParticipants?: number;
|
|
1227
|
+
record?: 'do-not-record' | 'record-from-start';
|
|
1228
|
+
region?: string;
|
|
1229
|
+
trim?: 'trim-silence' | 'do-not-trim';
|
|
1230
|
+
coach?: string;
|
|
1231
|
+
statusCallbackEvent?: string;
|
|
1232
|
+
statusCallback?: string;
|
|
1233
|
+
statusCallbackMethod?: 'GET' | 'POST';
|
|
1234
|
+
recordingStatusCallback?: string;
|
|
1235
|
+
recordingStatusCallbackMethod?: 'GET' | 'POST';
|
|
1236
|
+
recordingStatusCallbackEvent?: string;
|
|
1237
|
+
result?: unknown;
|
|
1238
|
+
}): this
|
|
1239
|
+
```
|
|
1240
|
+
|
|
1241
|
+
| Parameter | Type | Default | Description |
|
|
1242
|
+
|----------------------------------------|---------------------------------------------|---------------------|------------------------------------------------------|
|
|
1243
|
+
| `name` | `string` | -- | Conference name. |
|
|
1244
|
+
| `opts.muted` | `boolean` | -- | Join muted. |
|
|
1245
|
+
| `opts.beep` | `'true' \| 'false' \| 'onEnter' \| 'onExit'` | `'true'` | When to play the beep sound. |
|
|
1246
|
+
| `opts.startOnEnter` | `boolean` | `true` | Start the conference when this participant joins. |
|
|
1247
|
+
| `opts.endOnExit` | `boolean` | -- | End the conference when this participant leaves. |
|
|
1248
|
+
| `opts.waitUrl` | `string` | -- | URL to play while waiting for the conference to start.|
|
|
1249
|
+
| `opts.maxParticipants` | `number` | `250` | Maximum number of participants. |
|
|
1250
|
+
| `opts.record` | `'do-not-record' \| 'record-from-start'` | `'do-not-record'` | Recording mode. |
|
|
1251
|
+
| `opts.region` | `string` | -- | Region for the conference. |
|
|
1252
|
+
| `opts.trim` | `'trim-silence' \| 'do-not-trim'` | `'trim-silence'` | Silence trimming mode for recordings. |
|
|
1253
|
+
| `opts.coach` | `string` | -- | Call SID of participant to coach (whisper to). |
|
|
1254
|
+
| `opts.statusCallbackEvent` | `string` | -- | Events to trigger status callback. |
|
|
1255
|
+
| `opts.statusCallback` | `string` | -- | URL for status callback. |
|
|
1256
|
+
| `opts.statusCallbackMethod` | `'GET' \| 'POST'` | `'POST'` | HTTP method for status callback. |
|
|
1257
|
+
| `opts.recordingStatusCallback` | `string` | -- | URL for recording status callback. |
|
|
1258
|
+
| `opts.recordingStatusCallbackMethod` | `'GET' \| 'POST'` | `'POST'` | HTTP method for recording status callback. |
|
|
1259
|
+
| `opts.recordingStatusCallbackEvent` | `string` | `'completed'` | Events to trigger recording status callback. |
|
|
1260
|
+
| `opts.result` | `unknown` | -- | Custom result data. |
|
|
1261
|
+
|
|
1262
|
+
**Behavior:** When only the `name` is provided (or all options are at their defaults), the `join_conference` action uses the name as a simple string value. When non-default options are specified, it uses an object with all the configured parameters.
|
|
1263
|
+
|
|
1264
|
+
**Returns:** `this` for chaining.
|
|
1265
|
+
|
|
1266
|
+
```typescript
|
|
1267
|
+
// Simple conference join
|
|
1268
|
+
const result = new SwaigFunctionResult('Joining conference.')
|
|
1269
|
+
.joinConference('support-queue');
|
|
1270
|
+
|
|
1271
|
+
// Conference with options
|
|
1272
|
+
const result2 = new SwaigFunctionResult('Joining as listener.')
|
|
1273
|
+
.joinConference('all-hands', {
|
|
1274
|
+
muted: true,
|
|
1275
|
+
record: 'record-from-start',
|
|
1276
|
+
maxParticipants: 50,
|
|
1277
|
+
beep: 'onEnter',
|
|
1278
|
+
});
|
|
1279
|
+
```
|
|
1280
|
+
|
|
1281
|
+
---
|
|
1282
|
+
|
|
1283
|
+
## RPC
|
|
1284
|
+
|
|
1285
|
+
### executeRpc
|
|
1286
|
+
|
|
1287
|
+
Execute a SignalWire RPC method via SWML. This is the low-level RPC method; convenience wrappers like `rpcDial`, `rpcAiMessage`, and `rpcAiUnhold` are built on top of it.
|
|
1288
|
+
|
|
1289
|
+
```typescript
|
|
1290
|
+
executeRpc(opts: {
|
|
1291
|
+
method: string;
|
|
1292
|
+
params?: Record<string, unknown>;
|
|
1293
|
+
callId?: string;
|
|
1294
|
+
nodeId?: string;
|
|
1295
|
+
}): this
|
|
1296
|
+
```
|
|
1297
|
+
|
|
1298
|
+
| Parameter | Type | Description |
|
|
1299
|
+
|---------------|----------------------------|-------------------------------------|
|
|
1300
|
+
| `opts.method` | `string` | The RPC method name. |
|
|
1301
|
+
| `opts.params` | `Record<string, unknown>` | Optional parameters for the method. |
|
|
1302
|
+
| `opts.callId` | `string` | Optional target call ID. |
|
|
1303
|
+
| `opts.nodeId` | `string` | Optional target node ID. |
|
|
1304
|
+
|
|
1305
|
+
**Returns:** `this` for chaining.
|
|
1306
|
+
|
|
1307
|
+
```typescript
|
|
1308
|
+
const result = new SwaigFunctionResult('RPC executed.')
|
|
1309
|
+
.executeRpc({
|
|
1310
|
+
method: 'calling.play',
|
|
1311
|
+
callId: 'call-abc-123',
|
|
1312
|
+
params: {
|
|
1313
|
+
url: 'https://example.com/notification.mp3',
|
|
1314
|
+
},
|
|
1315
|
+
});
|
|
1316
|
+
```
|
|
1317
|
+
|
|
1318
|
+
---
|
|
1319
|
+
|
|
1320
|
+
### rpcDial
|
|
1321
|
+
|
|
1322
|
+
Dial a number via RPC. This creates an outbound call using the SignalWire RPC mechanism.
|
|
1323
|
+
|
|
1324
|
+
```typescript
|
|
1325
|
+
rpcDial(
|
|
1326
|
+
toNumber: string,
|
|
1327
|
+
fromNumber: string,
|
|
1328
|
+
destSwml: string,
|
|
1329
|
+
deviceType?: string
|
|
1330
|
+
): this
|
|
1331
|
+
```
|
|
1332
|
+
|
|
1333
|
+
| Parameter | Type | Default | Description |
|
|
1334
|
+
|--------------|----------|-----------|------------------------------------------|
|
|
1335
|
+
| `toNumber` | `string` | -- | Destination phone number. |
|
|
1336
|
+
| `fromNumber` | `string` | -- | Caller ID number. |
|
|
1337
|
+
| `destSwml` | `string` | -- | SWML destination for the dialed call. |
|
|
1338
|
+
| `deviceType` | `string` | `'phone'` | Device type for the outbound leg. |
|
|
1339
|
+
|
|
1340
|
+
**Returns:** `this` for chaining.
|
|
1341
|
+
|
|
1342
|
+
```typescript
|
|
1343
|
+
const result = new SwaigFunctionResult('Dialing out.')
|
|
1344
|
+
.rpcDial('+15551234567', '+15559876543', 'https://example.com/swml');
|
|
1345
|
+
```
|
|
1346
|
+
|
|
1347
|
+
---
|
|
1348
|
+
|
|
1349
|
+
### rpcAiMessage
|
|
1350
|
+
|
|
1351
|
+
Send an AI message to another call via RPC. This injects a message into the target call's AI conversation.
|
|
1352
|
+
|
|
1353
|
+
```typescript
|
|
1354
|
+
rpcAiMessage(callId: string, messageText: string, role?: string): this
|
|
1355
|
+
```
|
|
1356
|
+
|
|
1357
|
+
| Parameter | Type | Default | Description |
|
|
1358
|
+
|---------------|----------|------------|--------------------------------------|
|
|
1359
|
+
| `callId` | `string` | -- | The target call ID. |
|
|
1360
|
+
| `messageText` | `string` | -- | The message text to inject. |
|
|
1361
|
+
| `role` | `string` | `'system'` | The message role. |
|
|
1362
|
+
|
|
1363
|
+
**Returns:** `this` for chaining.
|
|
1364
|
+
|
|
1365
|
+
```typescript
|
|
1366
|
+
const result = new SwaigFunctionResult('Message sent to other call.')
|
|
1367
|
+
.rpcAiMessage('call-abc-123', 'The customer has been verified.');
|
|
1368
|
+
```
|
|
1369
|
+
|
|
1370
|
+
---
|
|
1371
|
+
|
|
1372
|
+
### rpcAiUnhold
|
|
1373
|
+
|
|
1374
|
+
Unhold a call that was previously placed on hold, via RPC.
|
|
1375
|
+
|
|
1376
|
+
```typescript
|
|
1377
|
+
rpcAiUnhold(callId: string): this
|
|
1378
|
+
```
|
|
1379
|
+
|
|
1380
|
+
| Parameter | Type | Description |
|
|
1381
|
+
|-----------|----------|--------------------------------|
|
|
1382
|
+
| `callId` | `string` | The target call ID to unhold. |
|
|
1383
|
+
|
|
1384
|
+
**Returns:** `this` for chaining.
|
|
1385
|
+
|
|
1386
|
+
```typescript
|
|
1387
|
+
const result = new SwaigFunctionResult('Resuming the held call.')
|
|
1388
|
+
.rpcAiUnhold('call-abc-123');
|
|
1389
|
+
```
|
|
1390
|
+
|
|
1391
|
+
---
|
|
1392
|
+
|
|
1393
|
+
## Payments
|
|
1394
|
+
|
|
1395
|
+
### pay
|
|
1396
|
+
|
|
1397
|
+
Initiate a payment collection flow on the call. The payment is collected via DTMF or speech and processed by the specified payment connector.
|
|
1398
|
+
|
|
1399
|
+
```typescript
|
|
1400
|
+
pay(opts: {
|
|
1401
|
+
paymentConnectorUrl: string;
|
|
1402
|
+
inputMethod?: string;
|
|
1403
|
+
statusUrl?: string;
|
|
1404
|
+
paymentMethod?: string;
|
|
1405
|
+
timeout?: number;
|
|
1406
|
+
maxAttempts?: number;
|
|
1407
|
+
securityCode?: boolean;
|
|
1408
|
+
postalCode?: boolean | string;
|
|
1409
|
+
minPostalCodeLength?: number;
|
|
1410
|
+
tokenType?: string;
|
|
1411
|
+
chargeAmount?: string;
|
|
1412
|
+
currency?: string;
|
|
1413
|
+
language?: string;
|
|
1414
|
+
voice?: string;
|
|
1415
|
+
description?: string;
|
|
1416
|
+
validCardTypes?: string;
|
|
1417
|
+
parameters?: PaymentParameter[];
|
|
1418
|
+
prompts?: PaymentPrompt[];
|
|
1419
|
+
aiResponse?: string;
|
|
1420
|
+
}): this
|
|
1421
|
+
```
|
|
1422
|
+
|
|
1423
|
+
| Parameter | Type | Default | Description |
|
|
1424
|
+
|----------------------------|----------------------|---------------------------------------|-----------------------------------------------------------------|
|
|
1425
|
+
| `opts.paymentConnectorUrl` | `string` | -- | URL of the payment connector endpoint. |
|
|
1426
|
+
| `opts.inputMethod` | `string` | `'dtmf'` | Input method (`'dtmf'` or `'speech'`). |
|
|
1427
|
+
| `opts.statusUrl` | `string` | -- | Webhook URL for payment status callbacks. |
|
|
1428
|
+
| `opts.paymentMethod` | `string` | `'credit-card'` | Payment method type. |
|
|
1429
|
+
| `opts.timeout` | `number` | `5` | Timeout in seconds for each input step. |
|
|
1430
|
+
| `opts.maxAttempts` | `number` | `1` | Maximum number of retry attempts. |
|
|
1431
|
+
| `opts.securityCode` | `boolean` | `true` | Whether to collect the security code (CVV). |
|
|
1432
|
+
| `opts.postalCode` | `boolean \| string` | `true` | Whether to collect postal code, or a fixed postal code string. |
|
|
1433
|
+
| `opts.minPostalCodeLength` | `number` | `0` | Minimum length for postal code input. |
|
|
1434
|
+
| `opts.tokenType` | `string` | `'reusable'` | Token type for tokenized payments. |
|
|
1435
|
+
| `opts.chargeAmount` | `string` | -- | Amount to charge (e.g., `'29.99'`). |
|
|
1436
|
+
| `opts.currency` | `string` | `'usd'` | Currency code. |
|
|
1437
|
+
| `opts.language` | `string` | `'en-US'` | Language for payment prompts. |
|
|
1438
|
+
| `opts.voice` | `string` | `'woman'` | Voice for payment prompts. |
|
|
1439
|
+
| `opts.description` | `string` | -- | Description of the payment. |
|
|
1440
|
+
| `opts.validCardTypes` | `string` | `'visa mastercard amex'` | Space-separated list of accepted card types. |
|
|
1441
|
+
| `opts.parameters` | `PaymentParameter[]` | -- | Custom parameters for the payment connector. |
|
|
1442
|
+
| `opts.prompts` | `PaymentPrompt[]` | -- | Custom prompts for payment steps. |
|
|
1443
|
+
| `opts.aiResponse` | `string` | Template referencing `${pay_result}` | AI response set after payment completes. |
|
|
1444
|
+
|
|
1445
|
+
**Returns:** `this` for chaining.
|
|
1446
|
+
|
|
1447
|
+
```typescript
|
|
1448
|
+
const result = new SwaigFunctionResult('Collecting payment.')
|
|
1449
|
+
.pay({
|
|
1450
|
+
paymentConnectorUrl: 'https://payments.example.com/connector',
|
|
1451
|
+
chargeAmount: '49.99',
|
|
1452
|
+
currency: 'usd',
|
|
1453
|
+
maxAttempts: 3,
|
|
1454
|
+
timeout: 10,
|
|
1455
|
+
});
|
|
1456
|
+
```
|
|
1457
|
+
|
|
1458
|
+
---
|
|
1459
|
+
|
|
1460
|
+
### createPaymentPrompt (static)
|
|
1461
|
+
|
|
1462
|
+
Create a `PaymentPrompt` configuration object for use with the `pay()` method.
|
|
1463
|
+
|
|
1464
|
+
```typescript
|
|
1465
|
+
static createPaymentPrompt(
|
|
1466
|
+
forSituation: string,
|
|
1467
|
+
actions: PaymentAction[],
|
|
1468
|
+
cardType?: string,
|
|
1469
|
+
errorType?: string
|
|
1470
|
+
): PaymentPrompt
|
|
1471
|
+
```
|
|
1472
|
+
|
|
1473
|
+
| Parameter | Type | Description |
|
|
1474
|
+
|----------------|-------------------|---------------------------------------------------|
|
|
1475
|
+
| `forSituation` | `string` | The situation this prompt applies to. |
|
|
1476
|
+
| `actions` | `PaymentAction[]` | Actions to perform for this prompt. |
|
|
1477
|
+
| `cardType` | `string` | Optional card type filter (e.g., `'visa'`). |
|
|
1478
|
+
| `errorType` | `string` | Optional error type this prompt handles. |
|
|
1479
|
+
|
|
1480
|
+
**Returns:** A `PaymentPrompt` object.
|
|
1481
|
+
|
|
1482
|
+
```typescript
|
|
1483
|
+
const prompt = SwaigFunctionResult.createPaymentPrompt(
|
|
1484
|
+
'payment-card-number',
|
|
1485
|
+
[SwaigFunctionResult.createPaymentAction('say', 'Please enter your card number.')],
|
|
1486
|
+
);
|
|
1487
|
+
```
|
|
1488
|
+
|
|
1489
|
+
---
|
|
1490
|
+
|
|
1491
|
+
### createPaymentAction (static)
|
|
1492
|
+
|
|
1493
|
+
Create a `PaymentAction` for use within a `PaymentPrompt`.
|
|
1494
|
+
|
|
1495
|
+
```typescript
|
|
1496
|
+
static createPaymentAction(actionType: string, phrase: string): PaymentAction
|
|
1497
|
+
```
|
|
1498
|
+
|
|
1499
|
+
| Parameter | Type | Description |
|
|
1500
|
+
|--------------|----------|------------------------------------------|
|
|
1501
|
+
| `actionType` | `string` | The action type (e.g., `'say'`, `'play'`). |
|
|
1502
|
+
| `phrase` | `string` | The phrase or URL for this action. |
|
|
1503
|
+
|
|
1504
|
+
**Returns:** A `PaymentAction` object.
|
|
1505
|
+
|
|
1506
|
+
```typescript
|
|
1507
|
+
const action = SwaigFunctionResult.createPaymentAction(
|
|
1508
|
+
'say',
|
|
1509
|
+
'Please enter your credit card number followed by the pound sign.',
|
|
1510
|
+
);
|
|
1511
|
+
```
|
|
1512
|
+
|
|
1513
|
+
---
|
|
1514
|
+
|
|
1515
|
+
### createPaymentParameter (static)
|
|
1516
|
+
|
|
1517
|
+
Create a custom `PaymentParameter` for the payment connector.
|
|
1518
|
+
|
|
1519
|
+
```typescript
|
|
1520
|
+
static createPaymentParameter(name: string, value: string): PaymentParameter
|
|
1521
|
+
```
|
|
1522
|
+
|
|
1523
|
+
| Parameter | Type | Description |
|
|
1524
|
+
|-----------|----------|------------------------|
|
|
1525
|
+
| `name` | `string` | The parameter name. |
|
|
1526
|
+
| `value` | `string` | The parameter value. |
|
|
1527
|
+
|
|
1528
|
+
**Returns:** A `PaymentParameter` object.
|
|
1529
|
+
|
|
1530
|
+
```typescript
|
|
1531
|
+
const param = SwaigFunctionResult.createPaymentParameter('merchant_id', 'MERCH-001');
|
|
1532
|
+
```
|
|
1533
|
+
|
|
1534
|
+
---
|
|
1535
|
+
|
|
1536
|
+
### Full payment example
|
|
1537
|
+
|
|
1538
|
+
```typescript
|
|
1539
|
+
const prompts = [
|
|
1540
|
+
SwaigFunctionResult.createPaymentPrompt(
|
|
1541
|
+
'payment-card-number',
|
|
1542
|
+
[SwaigFunctionResult.createPaymentAction('say', 'Please enter your card number.')],
|
|
1543
|
+
),
|
|
1544
|
+
SwaigFunctionResult.createPaymentPrompt(
|
|
1545
|
+
'payment-expiration-date',
|
|
1546
|
+
[SwaigFunctionResult.createPaymentAction('say', 'Enter the expiration date.')],
|
|
1547
|
+
),
|
|
1548
|
+
SwaigFunctionResult.createPaymentPrompt(
|
|
1549
|
+
'payment-security-code',
|
|
1550
|
+
[SwaigFunctionResult.createPaymentAction('say', 'Enter the CVV on the back of your card.')],
|
|
1551
|
+
),
|
|
1552
|
+
];
|
|
1553
|
+
|
|
1554
|
+
const params = [
|
|
1555
|
+
SwaigFunctionResult.createPaymentParameter('merchant_id', 'MERCH-001'),
|
|
1556
|
+
];
|
|
1557
|
+
|
|
1558
|
+
const result = new SwaigFunctionResult('Starting payment collection.')
|
|
1559
|
+
.pay({
|
|
1560
|
+
paymentConnectorUrl: 'https://payments.example.com/connector',
|
|
1561
|
+
chargeAmount: '99.95',
|
|
1562
|
+
currency: 'usd',
|
|
1563
|
+
maxAttempts: 3,
|
|
1564
|
+
timeout: 15,
|
|
1565
|
+
prompts,
|
|
1566
|
+
parameters: params,
|
|
1567
|
+
description: 'Annual subscription',
|
|
1568
|
+
});
|
|
1569
|
+
```
|
|
1570
|
+
|
|
1571
|
+
---
|
|
1572
|
+
|
|
1573
|
+
## Fluent Chaining
|
|
1574
|
+
|
|
1575
|
+
Every mutating method on `SwaigFunctionResult` returns `this`, enabling fluent method chaining. You can compose complex multi-action responses in a single expression.
|
|
1576
|
+
|
|
1577
|
+
```typescript
|
|
1578
|
+
agent.defineTool({
|
|
1579
|
+
name: 'complete_order',
|
|
1580
|
+
description: 'Complete an order and send confirmation',
|
|
1581
|
+
parameters: {
|
|
1582
|
+
order_id: { type: 'string', description: 'The order ID' },
|
|
1583
|
+
},
|
|
1584
|
+
handler: (args) => {
|
|
1585
|
+
const orderId = args.order_id as string;
|
|
1586
|
+
|
|
1587
|
+
return new SwaigFunctionResult(`Order ${orderId} completed.`)
|
|
1588
|
+
.setPostProcess(true)
|
|
1589
|
+
// Store data for other tools
|
|
1590
|
+
.updateGlobalData({ last_order: orderId, order_status: 'complete' })
|
|
1591
|
+
// Tag the call
|
|
1592
|
+
.setMetadata({ order_id: orderId })
|
|
1593
|
+
// Send SMS confirmation
|
|
1594
|
+
.sendSms({
|
|
1595
|
+
toNumber: '+15551234567',
|
|
1596
|
+
fromNumber: '+15559876543',
|
|
1597
|
+
body: `Your order ${orderId} has been confirmed!`,
|
|
1598
|
+
})
|
|
1599
|
+
// Speak a confirmation
|
|
1600
|
+
.say(`Your order ${orderId} is confirmed.`)
|
|
1601
|
+
// Emit a tracking event
|
|
1602
|
+
.swmlUserEvent({ type: 'order_complete', order_id: orderId })
|
|
1603
|
+
// Disable the order tool, enable the feedback tool
|
|
1604
|
+
.toggleFunctions([
|
|
1605
|
+
{ function: 'complete_order', active: false },
|
|
1606
|
+
{ function: 'submit_feedback', active: true },
|
|
1607
|
+
]);
|
|
1608
|
+
},
|
|
1609
|
+
});
|
|
1610
|
+
```
|
|
1611
|
+
|
|
1612
|
+
The chained calls produce an `action` array in the order they were called. SignalWire executes them sequentially:
|
|
1613
|
+
|
|
1614
|
+
```json
|
|
1615
|
+
{
|
|
1616
|
+
"response": "Order ORD-789 completed.",
|
|
1617
|
+
"action": [
|
|
1618
|
+
{ "set_global_data": { "last_order": "ORD-789", "order_status": "complete" } },
|
|
1619
|
+
{ "set_meta_data": { "order_id": "ORD-789" } },
|
|
1620
|
+
{ "SWML": { "version": "1.0.0", "sections": { "main": [{ "send_sms": { "to_number": "+15551234567", "from_number": "+15559876543", "body": "Your order ORD-789 has been confirmed!" } }] } } },
|
|
1621
|
+
{ "say": "Your order ORD-789 is confirmed." },
|
|
1622
|
+
{ "SWML": { "version": "1.0.0", "sections": { "main": [{ "user_event": { "event": { "type": "order_complete", "order_id": "ORD-789" } } }] } } },
|
|
1623
|
+
{ "toggle_functions": [{ "function": "complete_order", "active": false }, { "function": "submit_feedback", "active": true }] }
|
|
1624
|
+
],
|
|
1625
|
+
"post_process": true
|
|
1626
|
+
}
|
|
1627
|
+
```
|