SWAIG Actions Reference
This document describes all supported SWAIG actions that can be returned from function calls, their expected JSON parameters, and proposed Python helper methods for the SwaigFunctionResult
class.
Core Call Control Actions
1. SWML Execution
Purpose: Execute a SWML document or transfer to SWML
JSON Structure:
{
"SWML": "<swml_content>",
"transfer": "true|false" // optional
}
Parameters:
SWML
(required): String (raw SWML JSON) or Object (structured SWML data)transfer
(optional): String "true"/"false" or Boolean - controls if call exits agent
Proposed Python Method:
result.execute_swml(swml_content, transfer=False)
Method Parameters:
swml_content
(required): Flexible input supporting:- String: Raw SWML JSON text
- Dict: SWML data structure (Python dictionary)
- SWML Object: SignalWire SWML SDK object with
.to_dict()
method
transfer
(optional): Boolean - whether call should exit agent after execution (default: False)
Usage Examples:
from signalwire.swml import SWML
# 1. Raw SWML string (simple cases)
result.execute_swml('{"version":"1.0.0","sections":{"main":[{"say":"Hello World"}]}}')
# 2. SWML dictionary (programmatic construction)
swml_dict = {
"version": "1.0.0",
"sections": {
"main": [
{"say": "Please hold while I transfer you"},
{"connect": {"to": "+15551234567"}}
]
}
}
result.execute_swml(swml_dict, transfer=True)
# 3. SWML SDK object (best developer experience with IDE support)
swml_doc = SWML()
swml_doc.add_application("main", "say", {"text": "Connecting you now"})
swml_doc.add_application("main", "connect", {"to": "support@company.com"})
result.execute_swml(swml_doc, transfer=True)
# 4. Complex SWML with multiple sections
swml_doc = SWML()
swml_doc.add_application("main", "say", {"text": "Please choose an option"})
swml_doc.add_application("main", "gather", {
"input": {"speech": {"timeout": 5}},
"action_url": "/handle_choice"
})
result.execute_swml(swml_doc) # No transfer, return to agent after execution
2. Call Hangup
Purpose: Terminate the call
JSON Structure:
{
"hangup": true
}
Parameters:
hangup
(required): Boolean - must be true to hangup
Proposed Python Method:
result.hangup()
Usage Examples:
result.hangup()
Call Hold & Flow Control Actions
3. Hold Call
Purpose: Put the call on hold with optional timeout
JSON Structure:
// Simple timeout
{
"hold": 300
}
// String timeout (parsed)
{
"hold": "5m"
}
// Object with timeout
{
"hold": {
"timeout": 300
}
}
Parameters:
hold
(required): Number (seconds), String (time format), or Objecttimeout
(required if object): Number - timeout in seconds (max 900)
Proposed Python Method:
result.hold(timeout=300)
Usage Examples:
result.hold(60) # 60 seconds
result.hold("5m") # 5 minutes (if string parsing supported)
4. Wait for User Input
Purpose: Control how agent waits for user input
JSON Structure:
{
"wait_for_user": true|false|<number>|"answer_first"
}
Parameters:
wait_for_user
(required): Boolean, Number (timeout), or String ("answer_first")
Proposed Python Method:
result.wait_for_user(enabled=True, timeout=None, answer_first=False)
Usage Examples:
result.wait_for_user(True) # Wait indefinitely
result.wait_for_user(timeout=30) # Wait 30 seconds
result.wait_for_user(answer_first=True) # Special "answer_first" mode
5. Stop Agent
Purpose: Stop the agent execution
JSON Structure:
{
"stop": true
}
Parameters:
stop
(required): Boolean - must be true to stop
Proposed Python Method:
result.stop()
Usage Examples:
result.stop()
Speech & Audio Control Actions
6. Say Text
Purpose: Make the agent speak specific text
JSON Structure:
{
"say": "<text_to_speak>"
}
Parameters:
say
(required): String - text for agent to speak
Proposed Python Method:
result.say(text)
Usage Examples:
result.say("Hello, how can I help you today?")
7. Play Background Audio
Purpose: Play audio file in background
JSON Structure:
// Simple filename
{
"playback_bg": "<filename>"
}
// With options
{
"playback_bg": {
"file": "<filename>",
"wait": true|false // optional
}
}
Parameters:
playback_bg
(required): String (filename) or Objectfile
(required if object): String - audio filename/pathwait
(optional): Boolean - whether to suppress attention-getting behavior during playback
Proposed Python Method:
result.play_background_audio(filename, wait=False)
Usage Examples:
# Play background audio, AI will try to get user attention per attention timeout
result.play_background_audio("hold_music.wav")
# Play background audio, AI won't try to get user attention while playing
result.play_background_audio("announcement.mp3", wait=True)
Behavior Notes:
- Audio plays in background while AI can still hear and respond to user
wait=False
(default): AI will attempt to get user's attention according to attention timeoutwait=True
: AI suppresses attention-getting behavior during playback
8. Stop Background Audio
Purpose: Stop currently playing background audio
JSON Structure:
{
"stop_playback_bg": true
}
Parameters:
stop_playback_bg
(required): Boolean - must be true to stop playback
Proposed Python Method:
result.stop_background_audio()
Usage Examples:
result.stop_background_audio()
Speech Recognition Settings
9. End of Speech Timeout
Purpose: Adjust speech detection timeout - milliseconds of silence after speaking has been detected to finalize speech recognition
JSON Structure:
{
"end_of_speech_timeout": 1500
}
Parameters:
end_of_speech_timeout
(required): Number or String - timeout in milliseconds of silence after speech detection to finalize recognition
Proposed Python Method:
result.set_end_of_speech_timeout(milliseconds)
Usage Examples:
result.set_end_of_speech_timeout(2000) # Wait 2 seconds of silence to finalize speech
Behavior Notes:
- Mirrors the agent startup parameter of the same name
- Controls how long to wait for silence after speech is detected before finalizing recognition
- Higher values = more patient waiting for user to finish speaking
- Lower values = faster response but may cut off slow speakers
10. Speech Event Timeout
Purpose: Adjust speech event timeout - milliseconds since last speech detection event to finalize recognition
JSON Structure:
{
"speech_event_timeout": 5000
}
Parameters:
speech_event_timeout
(required): Number or String - timeout in milliseconds since last speech detection event
Proposed Python Method:
result.set_speech_event_timeout(milliseconds)
Usage Examples:
result.set_speech_event_timeout(3000) # Finalize after 3 seconds since last speech event
Behavior Notes:
- Mirrors the agent startup parameter of the same name
- Works better in noisy environments than
end_of_speech_timeout
- Doesn't require silence - just lack of new speech detection events
- Useful when background noise prevents true silence detection
- More robust for real-world call environments
Data Management Actions
11. Set Global Data
Purpose: Update global agent data variables
JSON Structure:
{
"set_global_data": {
"key1": "value1",
"key2": "value2"
}
}
Parameters:
set_global_data
(required): Object - key-value pairs to set/update
Proposed Python Method:
result.update_global_data(data_dict) # Already implemented
Usage Examples:
result.update_global_data({"user_name": "John", "step": 2})
12. Unset Global Data
Purpose: Remove global agent data variables
JSON Structure:
// Single key
{
"unset_global_data": "key_name"
}
// Multiple keys
{
"unset_global_data": ["key1", "key2"]
}
Parameters:
unset_global_data
(required): String (single key) or Array (multiple keys)
Proposed Python Method:
result.remove_global_data(keys)
Usage Examples:
result.remove_global_data("temporary_data")
result.remove_global_data(["step", "temp_value"])
13. Set Metadata
Purpose: Set metadata scoped to current function's meta_data_token
JSON Structure:
{
"set_meta_data": {
"key1": "value1",
"key2": "value2"
}
}
Parameters:
set_meta_data
(required): Object - key-value pairs for metadata
Proposed Python Method:
result.set_metadata(data_dict)
Usage Examples:
result.set_metadata({"session_id": "abc123", "user_tier": "premium"})
Scoping Behavior:
- Metadata is scoped based on the
meta_data_token
parameter in the SWAIG function prototype - If no
meta_data_token
is provided: scope defaults to function name/URL - If
meta_data_token
is provided: functions with the same token share metadata scope - This allows grouping related functions to share metadata
14. Unset Metadata
Purpose: Remove metadata from current function's meta_data_token scope
JSON Structure:
// Single key
{
"unset_meta_data": "key_name"
}
// Multiple keys
{
"unset_meta_data": ["key1", "key2"]
}
Parameters:
unset_meta_data
(required): String (single key) or Array (multiple keys)
Proposed Python Method:
result.remove_metadata(keys)
Usage Examples:
result.remove_metadata("temp_session_data")
result.remove_metadata(["cache_key", "temp_flag"])
Scoping Behavior:
- Removes metadata from the same scope as determined by
meta_data_token
in function prototype - Scope follows same rules as
set_meta_data
action
Function & Behavior Control Actions
15. Toggle Functions
Purpose: Enable/disable specific SWAIG functions
JSON Structure:
{
"toggle_functions": [
{
"function": "function_name",
"active": true|false
}
]
}
Parameters:
toggle_functions
(required): Array of objectsfunction
(required): String - function name to toggleactive
(required): Boolean - whether function should be active
Proposed Python Method:
result.toggle_functions(function_toggles)
Usage Examples:
result.toggle_functions([
{"function": "transfer_call", "active": False},
{"function": "lookup_info", "active": True}
])
16. Functions on Timeout
Purpose: Enable function calls on speaker timeout
JSON Structure:
{
"functions_on_speaker_timeout": true|false
}
Parameters:
functions_on_speaker_timeout
(required): Boolean
Proposed Python Method:
result.enable_functions_on_timeout(enabled=True)
Usage Examples:
result.enable_functions_on_timeout(True)
17. Extensive Data
Purpose: Send full data to LLM for this turn only, then use smaller replacement in subsequent turns
JSON Structure:
{
"extensive_data": true|false
}
Parameters:
extensive_data
(required): Boolean - whether to send extensive data this turn only
Proposed Python Method:
result.enable_extensive_data(enabled=True)
Usage Examples:
result.enable_extensive_data(True)
Behavior Notes:
- When
true
: Sends full/detailed data to LLM for current response only - After this turn: System automatically replaces extensive data with smaller version
- Useful for providing rich context without ongoing cost/latency impact
- Helps optimize token usage while maintaining context quality when needed
Agent Settings & Configuration Actions
18. Update Settings
Purpose: Update agent runtime settings
JSON Structure:
{
"settings": {
"frequency-penalty": -1.5,
"presence-penalty": 0.5,
"max-tokens": 1024,
"top-p": 0.9,
"confidence": 0.8,
"barge-confidence": 0.7,
"temperature": 0.7
}
}
Parameters:
settings
(required): Object - settings key-value pairs with the following supported options:frequency-penalty
(optional): Float (-2.0 to 2.0) - Penalizes repeated tokenspresence-penalty
(optional): Float (-2.0 to 2.0) - Penalizes tokens based on presencemax-tokens
(optional): Integer (0 to 4096) - Maximum tokens in responsetop-p
(optional): Float (0.0 to 1.0) - Nucleus sampling parameterconfidence
(optional): Float (0.0 to 1.0) - Speech recognition confidence thresholdbarge-confidence
(optional): Float (0.0 to 1.0) - Confidence threshold for barge-intemperature
(optional): Float (0.0 to 2.0, clamped to 1.5) - Randomness in responses
Proposed Python Method:
result.update_settings(settings_dict)
Usage Examples:
# Update AI model parameters
result.update_settings({
"temperature": 0.7,
"max-tokens": 2048,
"frequency-penalty": -0.5
})
# Update speech recognition settings
result.update_settings({
"confidence": 0.8,
"barge-confidence": 0.7
})
# Update all supported settings
result.update_settings({
"frequency-penalty": 1.0,
"presence-penalty": 0.5,
"max-tokens": 1024,
"top-p": 0.9,
"confidence": 0.75,
"barge-confidence": 0.6,
"temperature": 0.8
})
19. Context Switch
Purpose: Change agent context/prompt during conversation
JSON Structure:
// Simple prompt change
{
"context_switch": "<new_system_prompt>"
}
// Advanced context switching
{
"context_switch": {
"system_prompt": "<new_system_prompt>",
"user_prompt": "<user_message>",
"system_pom": "<pom_content>",
"user_pom": "<user_pom_content>",
"consolidate": true|false,
"full_reset": true|false
}
}
Parameters:
context_switch
(required): String (simple prompt) or Object (advanced)system_prompt
(optional): String - new system promptuser_prompt
(optional): String - user message to addsystem_pom
(optional): String - POM-based system promptuser_pom
(optional): String - POM-based user promptconsolidate
(optional): Boolean - summarize existing conversationfull_reset
(optional): Boolean - complete context reset
Proposed Python Method:
result.switch_context(system_prompt=None, user_prompt=None, consolidate=False, full_reset=False)
Usage Examples:
# Simple context switch
result.switch_context("You are now a technical support agent")
# Advanced context switch
result.switch_context(
system_prompt="You are a billing specialist",
user_prompt="The user needs help with their invoice",
consolidate=True
)
20. User Input Simulation
Purpose: Queue simulated user input
JSON Structure:
{
"user_input": "<simulated_input_text>"
}
Parameters:
user_input
(required): String - text to simulate as user input
Proposed Python Method:
result.simulate_user_input(text)
Usage Examples:
result.simulate_user_input("Yes, I'd like to speak to billing")
Notes
- Permissions: Some actions require specific permissions (e.g.,
swaig_allow_swml
,swaig_allow_settings
,swaig_set_global_data
) - Method Chaining: All proposed methods should return
self
to enable method chaining - Type Safety: Consider using type hints and validation for all parameters
- Backward Compatibility: Keep existing
add_action()
andadd_actions()
methods for custom use cases