conversation.tool_call event carrying a tool_call_id. To return a result, send a conversation.tool_result event back with the matching tool_call_id - that’s how Tavus pairs the result with the in-flight dispatch and applies the tool’s configured on_resolve.
This applies to both LLM tools and Perception tools delivered via app message.
conversation.tool_result (sent by your client)
| Field | Type | Required | Description |
|---|---|---|---|
tool_call_id | string | ✅ | Must match the tool_call_id from the original conversation.tool_call (or conversation.perception_tool_call) event. |
output | string | object | ❌ | The tool result. Strings are passed through; objects are JSON-serialized. |
status | string | ❌ | "success" (default) or "error". On error, the PAL acknowledges the failure instead of speaking the result. |
If your client never sends a result, the dispatch eventually drops out of context. There’s no hard timeout on this path - the PAL just won’t have the data.
Perception tools are fire-and-forget by default, so the PAL does not pause for or react to a perception
tool_result. Sending one is only meaningful when you’ve changed the tool’s on_resolve behavior.
