Skip to main content
When a tool is delivered via app message, your client receives a 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)
{
  "message_type": "conversation",
  "event_type": "conversation.tool_result",
  "conversation_id": "<conversation_id>",
  "properties": {
    "tool_call_id": "<id from the tool_call event>",
    "output": "It is 72 degrees and sunny in San Francisco.",
    "status": "success"
  }
}
FieldTypeRequiredDescription
tool_call_idstringMust match the tool_call_id from the original conversation.tool_call (or conversation.perception_tool_call) event.
outputstring | objectThe tool result. Strings are passed through; objects are JSON-serialized.
statusstring"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.