Skip to main content
This page requires Python familiarity. Variables are set and read in Python functions.
Variables are defined by setting a property on the conv.state object within a function. You can choose a name for your variable and update its value to anything you want like so:
These variables will retain their state between turns of the conversation and can be referenced in subsequent tool calls like so:

Reading variables that haven’t been set

Reading a conv.state variable that was never assigned returns Python None – it does not raise AttributeError or KeyError. Both attribute and dictionary access are supported and equivalent:
This enables a few common patterns: Defensive defaults with or – use when any falsy value should be replaced:
Note: or cannot distinguish “never set” from a stored falsy value (0, "", False, None). Explicit unset check with is None – use when the variable is intentionally initialized to None in the start tool as a marker that no value has been collected yet:
Strict “key was assigned at all” check with in – use when you must distinguish “never assigned” from a stored None:
Initializing variables to None (or a sensible default like "" or 0) in start_function is recommended whenever a variable is referenced in a prompt template or read in a flow step before it is guaranteed to be set, so template references and conditional checks always resolve predictably.

Built-in state keys

The conv.state object comes pre-populated with system-managed keys. These are set automatically by the platform and available in every conversation:
handoff_reason and handoff_number are deprecated. Use the handoff object instead, which supports structured SIP configurations (REFER, INVITE, BYE).
You can read these values in any function:

Prompt templating

Variables can be used inside tool calls and injected dynamically into prompts shown to the LLM. To inject a variable’s value into your prompt, use the syntax $variable_name. The system will replace this placeholder with the variable’s value wherever it matches. Example: In your start function, you can write:
…then in your prompting: The current date is $current_date. …becomes: The current date is September 06, 2024. When using variable templating, ensure the stored value is readable by the LLM. Complex objects like dictionaries or datetime will be stringified automatically.

Environment configuration

You can use the conv.env property to define environment-specific functions and activate test features in sandbox or pre-release environments. For example:

Dynamic updates

The value templated into the prompt is always kept up to date, so any updates will be reflected in the next turn sent to the LLM. Example:
After running this function, the resulting prompt would display: The current date is March 22, 1995. …in the next turn.

Deleting a variable

To delete a variable, remove it from the state within a function:

Variables in the Conversations API

All conv.state variables – both built-in keys and custom variables your agent writes – are returned in the state field of the Conversations API response. This means you can retrieve any state variable programmatically after a call ends. For details on the API response structure, see the Conversations API overview.

conv object

Full reference for conv.state and other conversation properties.

Start tool

Initialize state variables before the greeting plays.

Flows

Use variables to pass data across flow steps.
Last modified on April 30, 2026