Interaction Types
- Echo interactions
- Response interactions
- Interrupt interactions
- Override conversation context interactions
- Sensitivity interactions
Observable Events
- Utterance Events
- Utterance Streaming Events
- Tool Call Events
- Perception Tool Call Events
- Perception Analysis Events
- Replica Started/Stopped Speaking
- User Started/Stopped Speaking
Which Interaction Should I Send?
| Interaction | Use when |
|---|---|
conversation.respond | A user typed a message and the replica should respond as if the user had spoken that text. This is the natural text-input event for chat-style UI. |
conversation.echo | Your app supplies text or audio for the replica to speak directly, such as echo-mode or custom ASR flows. |
conversation.interrupt | Your app needs to stop the replica while it is speaking. |
Daily sendAppMessage Payloads
Use Daily’s sendAppMessage(interaction, '*') to send interaction events over the call data channel.
Text input: conversation.respond
Replica speaks supplied content: conversation.echo
modality: 'audio', pass base64 audio, include sample_rate, and keep done: false until the final audio chunk.
Stop the replica: conversation.interrupt
Event Ordering and Turn Tracking
All events broadcasted by Tavus include the following fields for timing, ordering, and grouping:-
timestamp(number) — Unix timestamp (seconds since epoch) indicating when the event was created. Use this to build timestamped transcripts or reconstruct the full timeline of a conversation. -
seq(integer) — A globally monotonic sequence number. Every event gets the next value in the sequence, so a higherseqalways means the event was sent later. Use this to reconcile events that may arrive out of order over the data channel. -
turn_idx(integer, optional) — The conversation turn index. This value increments each time aconversation.respondinteraction is received, and groups all events that belong to the same conversational turn. Use it to correlate related events — for example, an utterance, its tool calls, and the replica speaking state changes that all stem from the same user input. This field is present on conversation-related events (utterances, tool calls, speaking state changes, perception events, etc.) and omitted on events that are not tied to a specific turn. -
inference_id(string, optional) — A stable identifier for a generated utterance or inference. Use it withconversation.utterance,conversation.utterance.streaming, and tool-call events to reconcile optimistic UI state with the final events Tavus emits.
Call Client Example
Interaction events use a WebRTC data channel for communication. In Tavus’s case, this is powered by Daily, which makes setting up the call client quick and simple.- Daily JS
- Daily Python
- Daily React
Here’s an example of using DailyJS to create a call client in JavaScript:
The Daily
app-message event is used to send and receive events and interactions between your server and CVI.
