# Voice Agent

> A voice agent that attaches to a live call and speaks with the caller.

## What it does

Attaches an agent to a live phone call and speaks with the caller. Audio streams directly to a real-time speech model, which allows the caller to interrupt the agent mid-speech. Configure the model, persona, prompt, tools, context grounding indexes, and escalations directly on the node.

Both call directions use the same three-step shape:

| Direction | Node sequence |
|---|---|
| Inbound | **[Incoming Call](./node-incoming-call.md)** → **Voice agent** → **[End Call](./node-end-call.md)** |
| Outbound | **[Create Outgoing Call](./node-create-outgoing-call.md)** → **Voice agent** → **[End Call](./node-end-call.md)** |

The node is labeled **Voice agent** in the **Agent** category of the node palette. 

## Configuration reference

| Field | Description |
|---|---|
| **Model** | The real-time speech model. |
| **Persona** | The voice for the selected model. |
| **System prompt** | The agent's role, its standing instructions, and how it should close the conversation. |
| **Temperature** | Response creativity from `0` to `1`. |
| **Maximum tokens** | Maximum token for a conversation. |
| **Call context** | The call this agent attaches to. Bind it to an upstream `callContext` — for example, `$vars.createOutgoingCall1.output.callContext`. |

## Output variables

You may optionally configure structured output variables in the **Outputs** section of the properties panel. They are useful for setting goal-oriented or routing variables to use in downstream nodes within the Flow. 

Each output variable you declare becomes a field on the agent's output object, referenced as `$vars.<agentName>.output.<name>`. Give each one a name and a type, then instruct the agent in the variable's description field how to populate it. Output generation is driven by a combination of the agent's system prompt and the output variable descriptions.

The agent populates them when it ends its voice session.

![Voice agent properties panel with the Outputs section expanded. An output named output is set to type String, with the description The output of the Voice Agent. Typically a summary of the call.](https://dev-assets.cms.uipath.com/assets/images/maestro/voice-agent-outputs-6c0afb9b.png)

The two most common uses are call summaries and [handoffs](#handoffs). For a summary, declare an output such as `call_summary` and use its description to tell the agent to summarize the call. The agent writes it when it ends its session, and downstream nodes read it as `$vars.voiceAgent1.output.call_summary`.

![Edit output dialog for a Voice agent output named call_summary, type String, with the description Summarize the call and Required turned on.](https://dev-assets.cms.uipath.com/assets/images/maestro/voice-agent-call-summary-92561ffb.png)

## Tools

Connect tools to the **Tools** handle to give the agent capabilities it can call while reasoning. The agent decides during its loop whether and when to call each connected tool. Each tool carries a description that tells the agent what the tool is for, so write clear descriptions when a tool exposes one.

While designing tools for voice agents:
* The caller waits through every tool call, so keep each tool's job small and fast. 
* Tools the agent calls in the same round return together — the slowest one sets how long the caller hears silence. 
* After a timeout the agent may report failure and try again, so make tools idempotent. A tool call that has not returned in 180 seconds will time out.

### Tool availability

| Tool category | Availability |
|---|---|
| RPA processes | Available |
| API workflows | Available |
| Activities | Available |
| Other flows (Maestro) | Available |
| Process orchestration | Available |
| Coded functions | Available |
| Agent (invoke a published standalone agent) | Available |
| Integration Service connectors | Available |
| Context Grounding indexes | Available |
| Built-in tools (Analyze Files, Deep RAG, Batch Transform) | Not available |
| Escalations | Not available |
| Model Context Protocol (MCP) tools | Not available |
| A2A (Agent-to-Agent) | Not available |
| IXP (document extraction) | Not available |

### Built-in voice tools

Every voice agent has access to two built-in tools. These are included but not shown in the Flow canvas:
1. **Dual-Tone Multi-Frequency (DTMF) tool**: used to press digits on phone key pad, which can be used to navigate external phone trees
2. **End session**: used to exit the conversation without ending the call. Useful for voice agent [handoffs](#handoffs).

### Tool guardrails

Tool-level guardrails are available on the tools connected to the Voice agent node. You can filter or block on a tool's input parameters. Configure the guardrail on the tool attached to the Voice agent's Tools handle. See [tool guardrails](https://docs.uipath.com/agents/automation-cloud/latest/user-guide/tool-guardrails).

## Handoffs

Ending a voice session is not the same as ending the call. When an agent ends its session it exits the call but leaves the line open: the agent populates its output variables, and the Flow moves to the next node. Only the **[End call](./node-end-call.md)** node and the caller can hang up the call.

That is what makes handoffs possible. Chain Voice agent nodes and bind them all to the same **Call context**. Each agent ends its own session when it is done, and only the last path reaches **End call**, so the caller stays on the line throughout.

![A Maestro Flow that places an outgoing call, attaches a Voice agent, then uses a Switch node with Billing and Invoice branches routing to a Billing voice agent and an Invoice voice agent, both of which lead to an End call node.](https://dev-assets.cms.uipath.com/assets/images/maestro/voice-agent-handoff-flow-0a46c7a2.png)

A handoff has two parts:

* **Route to the right agent.** Give the first agent an output variable — for example `handoff` — and use its description to tell the agent which value to set. Branch on that value with a **Switch** node so each case leads to the agent that handles it.
* **Carry the context over.** A receiving agent knows nothing about what was already said. Either reference a call summary output from the first agent in its system prompt (`$vars.voiceAgent1.output.call_summary`), or add a **[Get Conversation Context](./node-get-conversation-context.md)** node on the branch and reference the transcript instead. See [Call transcript](#call-transcript).

:::note
Handing a call off to a person is not supported. There is no live call transfer.
:::

## Call transcript

To read a transcript after a call, open the **debug execution trace** or the **Orchestrator job traces**. See [Observability](https://docs.uipath.com/agents/automation-cloud/latest/user-guide/conversational-agents-voice-observability).

To use the transcript inside the Flow:

1. Add a **[Get Conversation Context](./node-get-conversation-context.md)** node.
2. Pass in `$vars.<incomingOrOutgoingCallNodeId>.output.callContext.conversationId`. For example, `<incomingOrOutgoingCallNodeId>` can be `createOutgoingCall1`.
3. Reference the transcript as `$vars.<getConversationContextNodeId>.output.conversationContext.messages`. For example, `getConversationContextNodeId` can be `getConversationContext1`.

For example, you can pass the transcript to an autonomous agent for processing:

![A Maestro Flow that places an outgoing call, attaches a Voice agent with a Web Search tool, ends the call, then uses Get Conversation Context and an Autonomous Agent to process the transcript.](https://dev-assets.cms.uipath.com/assets/images/maestro/voice-get-transcript-flow-e2a93edb.png)

## Common issues

**The agent talks normally but never runs a tool.**
The Orchestrator folder has no unattended or default robot with a serverless machine assigned, so every tool call comes back as an error and the agent stays conversational. Add a robot to the folder, then call again. See [Orchestrator folder requirements](https://docs.uipath.com/agents/automation-cloud/latest/user-guide/conversational-agents-deployment#orchestrator-folder-requirements).

**The call ends before the conversation is finished, but there are no errors.**
The agent ended its own session mid-conversation, and the Flow moved on to **End call**. That is likely a prompting issue where the voice agent thought it finished helping the caller and decided to end the session.

**The agent stalls or produces static reading digit strings.**
With Gemini Live at **Temperature** `0`, long digit strings can stall or sound distorted. Raise **Temperature** slightly. If the issue persists, try the other model.

**The agent fails to attach with a tool schema error.**
The Gemini model accepts a narrow schema subset. Flatten the tool's input schema, or wrap the tool in an API workflow with a flat input schema and use the workflow as the tool instead.

**The call connects, nobody speaks, and it drops after about 25 seconds.**
A call that never attaches an agent is ended after about 25 seconds of dead air. Bind **Call context** to the `callContext` from the [Incoming Call](./node-incoming-call.md) trigger or the [Create Outgoing Call](./node-create-outgoing-call.md) node.

## Related pages

- [Incoming Call](./node-incoming-call.md)
- [Create Outgoing Call](./node-create-outgoing-call.md)
- [End Call](./node-end-call.md)
- [Deployment](https://docs.uipath.com/agents/automation-cloud/latest/user-guide/conversational-agents-voice-deployment) — connecting a number and binding it to a Flow.
