The Pipecat JavaScript client listens for messages and events from the bot via the transport layer. This allows you to respond to changes in state, errors, and other events. The client implements the RTVI standard for these communications.

Event Handling Options

You can handle events in two ways:

1. Callbacks

Define handlers in the client constructor:

const rtviClient = new RTVIClient({
  callbacks: {
    onBotReady: () => console.log("Bot ready via callback"),
    // ... other callbacks
  },
});

2. Event Listeners

Add handlers using the event emitter pattern:

rtviClient.on("botReady", () => console.log("Bot ready via event"));
// or using the enum
rtviClient.on(RTVIEvent.BotReady, () => console.log("Bot ready via event"));

Events and callbacks provide the same functionality. Choose the pattern that best fits your application’s architecture.

Callbacks

Messages and errors

onGenericMessage
data:unknown

If the client receives an unknown message type from the transport (see messages and events), it can be handled here.

onMessageError
message:RTVIMessage

Response error when an action fails or an unknown message type is sent from the client.

onError
message:RTVIMessage

Error signalled by the bot. This could be due to a malformed config update or an unknown action dispatch or the ability to complete the requested action.

State and connectivity

onTransportStateChanged
state:TransportState

Provides a TransportState string representing the connectivity state of the local client. See transports for state explanation.

onConnected

Local user successfully established a connection to the transport.

onDisconnected

Local user disconnected from the transport, either intentionally by calling rtviClient.disconnect() or due to an error.

onBotConnected

Bot connected to the transport and is configuring. Note: bot connectivity does not infer that its pipeline is yet ready to run. Please use onBotReady instead.

onParticipantJoined
participant: Participant

A non-bot participant joined the session.

onParticipantLeft
participant: Participant

A non-bot participant left the session. Note: excluded local participant.

onBotReady
botReadyData:BotReadyData

The bot has been instantiated, its pipeline is configured, and it is receiving user media and interactions. This method is passed a BotReadyData object, which contains a config RTVIClientConfigOption[] array and the RTVI version number. It is recommended to hydrate your application with the passed config in case the bot alters any configuration based on its implementation. Since the bot is remote and may be using a different version of RTVI than the client, you can use the passed version string to check for compatibility.

onBotDisconnected
participant: Participant

Bot disconnected from the transport. This may occur due to session expiry, a pipeline error or because the local participant left the session.

Configuration

onConfigUpdated
config:RTVIClientConfigOption[]

Sent when the bots configuration changes. This is most likely in response to a user updateConfig action, but can occur within a bots pipeline in response to actions or messages.

onConfigDescribe
configDescription:unknown

A list of available configuration options for each service. Sent in response to a user describeConfig() call.

"config": [
  {
      "service": "llm",
      "options": [
        { "name": "model", "type": "string" },
        { "name": "messages", "type": "array" },
        ...
      ]
  },
  {
      "service": "tts",
      "options": [
        { "name": "voice", "type": "string" },
        ...
      ]
  },
  ...
]

Actions

onActionsAvailable
actions: unknown

Response to describeActions() call. Lists available actions for the bot and their associated arguments and types.

Media and devices

onAvailableMicsUpdated
mics:MediaDeviceInfo[]

Lists available local media microphone devices. Triggered when a new device becomes available or in response to rtviClient.initDevices().

onAvailableCamsUpdated
cams:MediaDeviceInfo[]

Lists available local media camera devices. Triggered when a new device becomes available or in response to rtviClient.initDevices().

onMicUpdated
mic:MediaDeviceInfo

User selected a new microphone as their selected/active device.

onCamUpdated
cam:MediaDeviceInfo

User selected a new camera as their selected/active device.

onTrackStarted
track: MediaStreamTrack, participant:Participant

Media track from a local or remote participant was started and playable. Can be either an audio or video track.

onTrackStopped
track: MediaStreamTrack, participant:Participant

Media track from a local or remote participant was stopped and no longer playable.

Audio and Voice Activity

onLocalAudioLevel
level:number

Local audio gain level (0 to 1).

onRemoteAudioLevel
level: number, participant: Participant

Remote audio gain level (0 to 1). Note: if more than one participant is connected to the transport, the participant property details the associated peer.

onBotStartedSpeaking

The bot started speaking/sending speech audio.

onBotStoppedSpeaking

The bot stopped speaking/sending speech audio.

onUserStartedSpeaking

The local user started speaking. This method is more reliable than using audio gain and is the result of the bot’s VAD (voice activity detection) model. This provides a more accurate result in noisy environments.

onUserStoppedSpeaking

The local user stopped speaking, indicated by the VAD model.

Transcription

onUserTranscript
transcript:TranscriptData

Transcribed local user input (both partial and final).

Callback receives a TranscriptData object:

export type TranscriptData = {
  text: string;
  final: boolean;
  timestamp: string;
  user_id: string;
};
onBotTranscript
text:BotLLMTextData

Finalized bot output text generated by the LLM. Sentence aggregated.

onBotLLmText
text:BotLLMTextData

Streamed LLM token response text generated by the LLM service. Please note that this event is not dispatched when in a connected state. This callback is intended to be used for offline, single-turn actions, where not TTS service is connected.

When connected:

  • If you want to align words as they are spoken by the bot, use onBotTtsText instead.

  • If you want the full text of the LLM response, use onBotTranscript.

onBotLlmStarted
LLM service inference started.
onBotLlmStopped
LLM service inference concluded.
onBotTtsText
text: BotTTSTextData

If your TTS service supports streamed responses over sockets, the text parameter contains the words from TTS service as they are spoken If you are using a HTTP based TTS service, the text parameter will contain the full text of the TTS response.

onBotTtsStarted
TTS service started inference.
onBotTtsStarted
TTS service inference concluded.

Other

onMetrics
default: "data:PipecatMetricsData"

Pipeline data provided by Pipecat. Please see Pipecat documentation for more information.

onStorageItemStored
default: "data: StorageItemStoredData"

A message or messages item was saved to the storage / database. Assumed you have a storage context processor as part of your bot pipeline. Data references the saved message.

Events

Each callback described above has a corresponding event that can be listened for using the .on() method. This allows you to handle the same functionality using either callbacks or event listeners, depending on your preferred architecture.

Here’s the complete reference mapping events to their corresponding callbacks:

Connection Events

Event NameCallback NameData Type
connectedonConnected-
disconnectedonDisconnected-
transportStateChangedonTransportStateChangedTransportState
botConnectedonBotConnected-
botReadyonBotReadyBotReadyData
botDisconnectedonBotDisconnectedParticipant

Participant Events

Event NameCallback NameData Type
participantConnectedonParticipantJoinedParticipant
participantLeftonParticipantLeftParticipant

Media Events

Event NameCallback NameData Type
trackStartedonTrackStartedMediaStreamTrack, Participant
trackStoppedonTrackStoppedMediaStreamTrack, Participant
availableMicsUpdatedonAvailableMicsUpdatedMediaDeviceInfo[]
availableCamsUpdatedonAvailableCamsUpdatedMediaDeviceInfo[]
micUpdatedonMicUpdatedMediaDeviceInfo
camUpdatedonCamUpdatedMediaDeviceInfo

Audio Activity Events

Event NameCallback NameData Type
localAudioLevelonLocalAudioLevelnumber
remoteAudioLevelonRemoteAudioLevelnumber, Participant
botStartedSpeakingonBotStartedSpeaking-
botStoppedSpeakingonBotStoppedSpeaking-
userStartedSpeakingonUserStartedSpeaking-
userStoppedSpeakingonUserStoppedSpeaking-

Text and Transcription Events

Event NameCallback NameData Type
userTranscriptonUserTranscriptTranscriptData
botTranscriptonBotTranscriptBotLLMTextData
botLlmTextonBotLLMTextBotLLMTextData
botTtsTextonBotTtsTextBotTTSTextData

Service State Events

Event NameCallback NameData Type
botLlmStartedonBotLlmStarted-
botLlmStoppedonBotLlmStopped-
botTtsStartedonBotTtsStarted-
botTtsStoppedonBotTtsStopped-

Configuration Events

Event NameCallback NameData Type
configonConfigUpdatedRTVIClientConfigOption[]
configDescribeonConfigDescribeunknown
actionsAvailableonActionsAvailableunknown

Other Events

Event NameCallback NameData Type
metricsonMetricsPipecatMetricsData
storageItemStoredonStorageItemStoredStorageItemStoredData

Usage Example

import { RTVIEvent } from "@pipecat-ai/client-js";

// Using callbacks
const rtviClient = new RTVIClient({
  callbacks: {
    onBotReady: () => console.log("Bot ready via callback"),
    onUserTranscript: (data) => console.log("Transcript:", data.text),
  },
});

// Using event listeners
rtviClient.on(RTVIEvent.BotReady, () => {
  console.log("Bot ready via event");
});