> For a complete index of all SignalWire documentation pages, fetch https://signalwire.com/docs/llms.txt

# FunctionResult

> Fluent interface for returning responses and actions from SWAIG tool functions.

[tool]: /docs/server-sdks/reference/python/agents/agent-base#tool

[define-tool]: /docs/server-sdks/reference/python/agents/agent-base/define-tool

[agentbase]: /docs/server-sdks/reference/python/agents/agent-base

[swaig-function]: /docs/swml/reference/ai/swaig/functions

[swml-swaig-functions-reference]: /docs/swml/reference/ai/swaig/functions

[setresponse]: /docs/server-sdks/reference/python/agents/function-result/set-response

[setpostprocess]: /docs/server-sdks/reference/python/agents/function-result/set-post-process

[addaction]: /docs/server-sdks/reference/python/agents/function-result/add-action

[addactions]: /docs/server-sdks/reference/python/agents/function-result/add-actions

[todict]: /docs/server-sdks/reference/python/agents/function-result/to-dict

[connect]: /docs/server-sdks/reference/python/agents/function-result/connect

[hangup]: /docs/server-sdks/reference/python/agents/function-result/hangup

[hold]: /docs/server-sdks/reference/python/agents/function-result/hold

[swmltransfer]: /docs/server-sdks/reference/python/agents/function-result/swml-transfer

[say]: /docs/server-sdks/reference/python/agents/function-result/say

[waitforuser]: /docs/server-sdks/reference/python/agents/function-result/wait-for-user

[stop]: /docs/server-sdks/reference/python/agents/function-result/stop

[playbackgroundfile]: /docs/server-sdks/reference/python/agents/function-result/play-background-file

[stopbackgroundfile]: /docs/server-sdks/reference/python/agents/function-result/stop-background-file

[recordcall]: /docs/server-sdks/reference/python/agents/function-result/record-call

[stoprecordcall]: /docs/server-sdks/reference/python/agents/function-result/stop-record-call

[tap]: /docs/server-sdks/reference/python/agents/function-result/tap

[stoptap]: /docs/server-sdks/reference/python/agents/function-result/stop-tap

[updateglobaldata]: /docs/server-sdks/reference/python/agents/function-result/update-global-data

[removeglobaldata]: /docs/server-sdks/reference/python/agents/function-result/remove-global-data

[setmetadata]: /docs/server-sdks/reference/python/agents/function-result/set-metadata

[removemetadata]: /docs/server-sdks/reference/python/agents/function-result/remove-metadata

[swmlchangestep]: /docs/server-sdks/reference/python/agents/function-result/swml-change-step

[swmlchangecontext]: /docs/server-sdks/reference/python/agents/function-result/swml-change-context

[switchcontext]: /docs/server-sdks/reference/python/agents/function-result/switch-context

[swmluserevent]: /docs/server-sdks/reference/python/agents/function-result/swml-user-event

[simulateuserinput]: /docs/server-sdks/reference/python/agents/function-result/simulate-user-input

[togglefunctions]: /docs/server-sdks/reference/python/agents/function-result/toggle-functions

[enablefunctionsontimeout]: /docs/server-sdks/reference/python/agents/function-result/enable-functions-on-timeout

[adddynamichints]: /docs/server-sdks/reference/python/agents/function-result/add-dynamic-hints

[cleardynamichints]: /docs/server-sdks/reference/python/agents/function-result/clear-dynamic-hints

[setendofspeechtimeout]: /docs/server-sdks/reference/python/agents/function-result/set-end-of-speech-timeout

[setspeecheventtimeout]: /docs/server-sdks/reference/python/agents/function-result/set-speech-event-timeout

[updatesettings]: /docs/server-sdks/reference/python/agents/function-result/update-settings

[enableextensivedata]: /docs/server-sdks/reference/python/agents/function-result/enable-extensive-data

[replaceinhistory]: /docs/server-sdks/reference/python/agents/function-result/replace-in-history

[sendsms]: /docs/server-sdks/reference/python/agents/function-result/send-sms

[pay]: /docs/server-sdks/reference/python/agents/function-result/pay

[createpaymentprompt]: /docs/server-sdks/reference/python/agents/function-result/create-payment-prompt

[createpaymentaction]: /docs/server-sdks/reference/python/agents/function-result/create-payment-action

[createpaymentparameter]: /docs/server-sdks/reference/python/agents/function-result/create-payment-parameter

[siprefer]: /docs/server-sdks/reference/python/agents/function-result/sip-refer

[joinroom]: /docs/server-sdks/reference/python/agents/function-result/join-room

[joinconference]: /docs/server-sdks/reference/python/agents/function-result/join-conference

[executeswml]: /docs/server-sdks/reference/python/agents/function-result/execute-swml

[executerpc]: /docs/server-sdks/reference/python/agents/function-result/execute-rpc

[rpcdial]: /docs/server-sdks/reference/python/agents/function-result/rpc-dial

[rpcaimessage]: /docs/server-sdks/reference/python/agents/function-result/rpc-ai-message

[rpcaiunhold]: /docs/server-sdks/reference/python/agents/function-result/rpc-ai-unhold

`FunctionResult` is the return type for all SWAIG tool functions. It wraps a response
message (text for the AI to speak) and an ordered list of actions (transfers, SMS,
data updates, context switches, and more). Every method returns `self`, so you can
chain calls into a single fluent expression.

Returned from functions defined with the [`@tool()`][tool] decorator
or [`define_tool()`][define-tool] on
[`AgentBase`][agentbase].

FunctionResult builds the response payload for a [SWAIG function][swaig-function].
See the [SWML SWAIG functions reference][swml-swaig-functions-reference] for the
full response format specification.

## **Properties**

Text the AI speaks back to the caller after the function executes.

Ordered list of action objects to execute. Actions run sequentially in the
order they were added.

When `True`, the AI speaks the response and takes one more conversational turn
with the user before executing actions. When `False` (default), actions execute
immediately after the response.

## **Example**

```python {10}
from signalwire import AgentBase
from signalwire import FunctionResult

agent = AgentBase(name="my-agent", route="/agent")
agent.set_prompt_text("You are a helpful assistant.")

@agent.tool(name="transfer_to_billing", description="Transfer the caller to billing")
def transfer_to_billing(args, raw_data):
    return (
        FunctionResult(
            "I'll transfer you to billing. Anything else first?",
            post_process=True
        )
        .update_global_data({"transferred": True})
        .send_sms(
            to_number="+15551234567",
            from_number="+15559876543",
            body="You are being transferred to billing."
        )
        .connect("+15551234567", final=True)
    )

agent.serve()
```

## **Fluent Chaining Pattern**

Every method on `FunctionResult` returns `self`, so you build complex responses
in a single expression. Actions execute in the order they are added.

Terminal actions like `connect(final=True)` and `hangup()` end the call flow.
Place them **last** in the chain so that preceding actions (data updates, SMS, etc.)
have a chance to execute.

```python {11}
from signalwire import AgentBase
from signalwire import FunctionResult

agent = AgentBase(name="my-agent", route="/agent")
agent.set_prompt_text("You are a helpful assistant.")

@agent.tool(name="transfer_call", description="Transfer the call")
def transfer_call(args, raw_data):
    # Data update + SMS execute before the terminal transfer
    return (
        FunctionResult("Transferring you now.")
        .update_global_data({"transferred": True})
        .send_sms(
            to_number="+15551234567",
            from_number="+15559876543",
            body="Your call is being transferred."
        )
        .connect("+15551234567", final=True)  # terminal — goes last
    )

agent.serve()
```

## **Methods**

### Core

Set or replace the response text on a FunctionResult.

Enable or disable post-processing on a FunctionResult.

Append a raw action to the FunctionResult action list.

Append multiple raw actions to the FunctionResult action list.

Serialize a FunctionResult to the SWAIG response format.

### Call Control

Transfer or connect the call to another destination.

End the call immediately.

Put the call on hold with an optional timeout.

Transfer the call to a SWML endpoint with a return message.

### Speech

Make the AI agent speak specific text immediately.

Control how the agent pauses and waits for user input.

Stop the agent execution immediately.

### Media

Play an audio or video file in the background during a call.

Stop the currently playing background audio file.

Start recording the call in the background.

Stop an active background call recording.

Stream call audio to an external endpoint via WebSocket or RTP.

Stop an active media tap stream.

### Data

Set or update key-value pairs in the global session data.

Remove one or more keys from the global session data.

Set function-scoped metadata on a FunctionResult.

Remove one or more keys from the current function's metadata store.

### Context Navigation

Transition to a different step within the current conversation context.

Switch to a different conversation context.

Perform an advanced context switch with prompt replacement and history control.

### Events

Send a custom user event through SWML for real-time UI updates.

Inject text as simulated user speech input.

### Functions

Enable or disable specific SWAIG functions at runtime.

Allow SWAIG function calls when a speaker timeout occurs.

### Hints

Add speech recognition hints dynamically during a call.

Remove all dynamically added speech recognition hints.

### Settings

Adjust the end-of-speech silence timeout for speech recognition.

Adjust the speech event timeout for noisy environments.

Update AI runtime settings dynamically during a call.

Send full data to the LLM for the current turn only.

Control how this function call appears in the AI's conversation history.

### SMS

Send an SMS or MMS message from a tool function.

### Payment

Collect and process a credit card payment during a call.

Build a payment prompt object for use with pay().

Build a single action entry for a payment prompt.

Build a parameter entry for the pay() method.

### SIP

Send a SIP REFER message to transfer the call in a SIP environment.

### Rooms and Conferences

Join a SignalWire RELAY room for multi-party communication.

Join an ad-hoc audio conference with extensive configuration options.

### SWML and RPC

Execute a raw SWML document as an action.

Execute a generic RPC method on a call.

Dial out to a phone number with a destination SWML URL via RPC.

Inject a message into the AI agent running on another call.

Release another call from hold via RPC.