@elevenlabs/react-native 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"lib.umd.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.5.1\";\n","import { useEffect } from \"react\";\nimport { useLocalParticipant, useDataChannel } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type {\n Callbacks,\n ClientToolsConfig,\n ClientToolCallEvent,\n ConversationEvent,\n} from \"../types\";\nimport React from \"react\";\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n clientTools?: ClientToolsConfig[\"clientTools\"];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: unknown): event is ConversationEvent {\n return typeof event === \"object\" && event !== null && \"type\" in event;\n}\n\nfunction extractMessageText(event: ConversationEvent): string | null {\n switch (event.type) {\n case \"user_transcript\":\n return event.user_transcription_event.user_transcript;\n case \"agent_response\":\n return event.agent_response_event.agent_response;\n default:\n return null;\n }\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId,\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (clientToolCall.client_tool_call.tool_name in clientTools) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall.client_tool_call);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel(msg => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n const messageText = extractMessageText(message);\n if (messageText !== null) {\n callbacks.onMessage?.({\n message: messageText,\n source: message.type === \"user_transcript\" ? \"user\" : \"ai\",\n });\n }\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? \"speaking\" : \"listening\",\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n case \"audio\":\n callbacks.onAudio?.(message.audio_event.audio_base_64);\n break;\n case \"vad_score\":\n callbacks.onVadScore?.({\n vadScore: message.vad_score_event.vad_score,\n });\n break;\n case \"interruption\":\n callbacks.onInterruption?.(message.interruption_event);\n break;\n case \"mcp_tool_call\":\n callbacks.onMCPToolCall?.(message.mcp_tool_call);\n break;\n case \"mcp_connection_status\":\n callbacks.onMCPConnectionStatus?.(message.mcp_connection_status);\n break;\n case \"agent_tool_response\":\n callbacks.onAgentToolResponse?.(message.agent_tool_response);\n break;\n case \"conversation_initiation_metadata\":\n callbacks.onConversationMetadata?.(\n message.conversation_initiation_metadata_event\n );\n break;\n case \"asr_initiation_metadata\":\n callbacks.onAsrInitiationMetadata?.(\n message.asr_initiation_metadata_event\n );\n break;\n case \"agent_chat_response_part\":\n callbacks.onAgentChatResponsePart?.(message.text_response_part);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};\n","// @ts-nocheck - pnpm hoisting causes duplicate React type definitions\nimport React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n />\n {children as any}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: () => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n setMicMuted: (muted: boolean) => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = () => conversationId;\n\n const setMicMuted = React.useCallback((muted: boolean) => {\n if (localParticipant) {\n localParticipant.setMicrophoneEnabled(!muted);\n }\n }, [localParticipant]);\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n });\n\n if (overridesEvent) {\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(overridesEvent));\n participant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send overrides:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n }\n }, [handleParticipantReady, overrides, customLlmExtraBody, dynamicVariables, userId, callbacksRef]);\n\n const conversation: Conversation = {\n startSession,\n endSession,\n status,\n isSpeaking,\n // setVolume,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate: (text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n },\n sendUserMessage: (text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n },\n sendUserActivity: () => {\n sendMessage({\n type: \"user_activity\",\n });\n },\n };\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n const contextValue: ElevenLabsContextType = {\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl: setTokenFetchUrl,\n setClientTools,\n };\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n const [userId, setUserId] = useState<ConversationConfig[\"userId\"]>(undefined);\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n setUserId(config.userId);\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(async () => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.({ reason: \"user\" });\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n }, [callbacksRef, setConnect, setToken, setStatus]);\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n const hasCalledOnConnectRef = useRef(false);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n // Fire onConnect when both participant and room are fully ready\n useEffect(() => {\n if (localParticipant && roomConnected && !hasCalledOnConnectRef.current) {\n hasCalledOnConnectRef.current = true;\n callbacksRef.current.onConnect?.({ conversationId });\n }\n }, [localParticipant, roomConnected, conversationId, callbacksRef]);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n if (localParticipant) {\n return;\n }\n\n setLocalParticipant(participant);\n setStatus(\"connected\");\n },\n [localParticipant, setStatus]\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n }, []);\n\n const handleDisconnected = useCallback(() => {\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n hasCalledOnConnectRef.current = false;\n callbacksRef.current.onDisconnect?.({ reason: \"user\" });\n }, [callbacksRef, setStatus]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n };\n }\n\n overridesEvent.source_info = {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n };\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = String(config.userId);\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","_ref","onReady","isConnected","callbacks","sendMessage","_ref$clientTools","clientTools","updateCurrentEventId","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","useDataChannel","msg","_msg$from","decoder","TextDecoder","message","JSON","parse","decode","payload","event","_msg$from2","messageText","type","user_transcription_event","user_transcript","agent_response_event","agent_response","extractMessageText","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","current","event_id","ping_event","clientToolCall","Promise","resolve","client_tool_call","tool_name","_temp","parameters","then","result","formattedResult","stringify","String","tool_call_id","is_error","_catch","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","reject","handleClientToolCall","onAudio","audio_event","audio_base_64","onVadScore","vadScore","vad_score_event","vad_score","onInterruption","interruption_event","onMCPToolCall","mcp_tool_call","onMCPConnectionStatus","mcp_connection_status","onAgentToolResponse","agent_tool_response","onConversationMetadata","conversation_initiation_metadata_event","onAsrInitiationMetadata","asr_initiation_metadata_event","onAgentChatResponsePart","text_response_part","onDebug","LiveKitRoomWrapper","children","createElement","LiveKitRoom","serverUrl","token","connect","audio","video","options","adaptiveStream","pixelDensity","onConnected","onDisconnected","onParticipantReady","roomConnected","_excluded","ElevenLabsContext","createContext","registerGlobals","_useState","useState","setToken","_useState2","setConnect","_useState3","status","setStatus","_useState4","setServerUrl","_useState5","undefined","tokenFetchUrl","setTokenFetchUrl","_useState6","conversationId","setConversationId","_useState7","setIsSpeaking","_useState8","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","_useConversationCallb","callbacksRef","setCallbacks","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","userId","setUserId","startSession","config","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","agentId","info","fetch","response","json","data","ok","Error","detail","getConversationToken","_getConversationToken","endSession","onDisconnect","reason","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","hasCalledOnConnectRef","AudioSession","startAudioSession","start","stopAudioSession","onConnect","handleParticipantReady","participant","handleConnected","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","setMicMuted","muted","setMicrophoneEnabled","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","conversation","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","user_id","constructOverrides","getId","sendContextualUpdate","text","sendUserMessage","sendUserActivity","setClientTools","tools","Provider","value","context","useContext","_objectWithoutPropertiesLoose"],"mappings":"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"}
1
+ {"version":3,"file":"lib.umd.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.5.3\";\n","import { useEffect } from \"react\";\nimport { useLocalParticipant, useDataChannel } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type {\n Callbacks,\n ClientToolsConfig,\n ClientToolCallEvent,\n ConversationEvent,\n} from \"../types\";\nimport React from \"react\";\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n onEndSession: (reason: \"user\" | \"agent\") => void;\n clientTools?: ClientToolsConfig[\"clientTools\"];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: unknown): event is ConversationEvent {\n return typeof event === \"object\" && event !== null && \"type\" in event;\n}\n\nfunction extractMessageText(event: ConversationEvent): string | null {\n switch (event.type) {\n case \"user_transcript\":\n return event.user_transcription_event.user_transcript;\n case \"agent_response\":\n return event.agent_response_event.agent_response;\n default:\n return null;\n }\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId,\n onEndSession,\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n // Reset agent response count when connection status changes\n useEffect(() => {\n if (!isConnected) {\n agentResponseCountRef.current = 1;\n }\n }, [isConnected]);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (clientToolCall.client_tool_call.tool_name in clientTools) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall.client_tool_call);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel(msg => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n const messageText = extractMessageText(message);\n if (messageText !== null) {\n callbacks.onMessage?.({\n message: messageText,\n source: message.type === \"user_transcript\" ? \"user\" : \"ai\",\n });\n }\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? \"speaking\" : \"listening\",\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n case \"audio\":\n callbacks.onAudio?.(message.audio_event.audio_base_64);\n break;\n case \"vad_score\":\n callbacks.onVadScore?.({\n vadScore: message.vad_score_event.vad_score,\n });\n break;\n case \"interruption\":\n callbacks.onInterruption?.(message.interruption_event);\n break;\n case \"mcp_tool_call\":\n callbacks.onMCPToolCall?.(message.mcp_tool_call);\n break;\n case \"mcp_connection_status\":\n callbacks.onMCPConnectionStatus?.(message.mcp_connection_status);\n break;\n case \"agent_tool_response\":\n callbacks.onAgentToolResponse?.(message.agent_tool_response);\n\n if (message.agent_tool_response.tool_name === \"end_call\") {\n // End the call\n onEndSession(\"agent\");\n }\n break;\n case \"conversation_initiation_metadata\":\n callbacks.onConversationMetadata?.(\n message.conversation_initiation_metadata_event\n );\n break;\n case \"asr_initiation_metadata\":\n callbacks.onAsrInitiationMetadata?.(\n message.asr_initiation_metadata_event\n );\n break;\n case \"agent_chat_response_part\":\n callbacks.onAgentChatResponsePart?.(message.text_response_part);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};\n","// @ts-nocheck - pnpm hoisting causes duplicate React type definitions\nimport React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n onEndSession: (reason?: \"user\" | \"agent\") => void;\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n onEndSession,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n onEndSession={onEndSession}\n />\n {children as any}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: (reason?: \"user\" | \"agent\") => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n setMicMuted: (muted: boolean) => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n React.useEffect(() => {\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n }, [context, clientTools]);\n\n // Update callbacks - since this only updates a ref, it's safe to call on every render\n // and doesn't cause re-renders of the provider or its consumers\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId, status);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n setIsSpeaking(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = React.useCallback(() => conversationId, [conversationId]);\n\n const setMicMuted = React.useCallback((muted: boolean) => {\n if (localParticipant) {\n localParticipant.setMicrophoneEnabled(!muted);\n }\n }, [localParticipant]);\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n });\n\n if (overridesEvent) {\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(overridesEvent));\n participant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send overrides:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n }\n }, [handleParticipantReady, overrides, customLlmExtraBody, dynamicVariables, userId, callbacksRef]);\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n // Memoize inline callback functions\n const sendContextualUpdate = React.useCallback((text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n }, [sendMessage]);\n\n const sendUserMessage = React.useCallback((text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n }, [sendMessage]);\n\n const sendUserActivity = React.useCallback(() => {\n sendMessage({\n type: \"user_activity\",\n });\n }, [sendMessage]);\n\n // Memoize the conversation object to prevent unnecessary re-renders\n const conversation = React.useMemo<Conversation>(() => ({\n startSession,\n endSession,\n status,\n isSpeaking,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate,\n sendUserMessage,\n sendUserActivity,\n }), [\n startSession,\n endSession,\n status,\n isSpeaking,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate,\n sendUserMessage,\n sendUserActivity,\n ]);\n\n // Memoize the context value to prevent unnecessary re-renders of consumers\n const contextValue = React.useMemo<ElevenLabsContextType>(() => ({\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl,\n setClientTools,\n }), [\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n setCallbacks,\n setClientTools,\n ]);\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n key={conversationId || 'disconnected'}\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n onEndSession={endSession}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};\n","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n const [userId, setUserId] = useState<ConversationConfig[\"userId\"]>(undefined);\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n setUserId(config.userId);\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(\n async (reason: \"user\" | \"agent\" = \"user\") => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n\n // Reset session configuration state\n setOverrides({});\n setCustomLlmExtraBody(null);\n setDynamicVariables({});\n setUserId(undefined);\n setConversationId(\"\");\n\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.({ reason });\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [callbacksRef, setConnect, setToken, setStatus, setConversationId]\n );\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback, useRef } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string,\n status: ConversationStatus\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n const hasCalledOnConnectRef = useRef(false);\n\n // Reset room state when conversationId changes (new session starting)\n useEffect(() => {\n if (conversationId) {\n setRoomConnected(false);\n setLocalParticipant(null);\n hasCalledOnConnectRef.current = false;\n }\n }, [conversationId]);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n // Fire onConnect when both participant and room are fully ready\n useEffect(() => {\n if (localParticipant && roomConnected && !hasCalledOnConnectRef.current) {\n hasCalledOnConnectRef.current = true;\n callbacksRef.current.onConnect?.({ conversationId });\n }\n }, [localParticipant, roomConnected, conversationId, callbacksRef]);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n if (localParticipant) {\n return;\n }\n\n setLocalParticipant(participant);\n setStatus(\"connected\");\n },\n [localParticipant, setStatus]\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n }, []);\n\n const handleDisconnected = useCallback(() => {\n // If already disconnected, endSession already handled the disconnect callback\n if (status === \"disconnected\") {\n return;\n }\n\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n hasCalledOnConnectRef.current = false;\n callbacksRef.current.onDisconnect?.({ reason: \"user\" });\n }, [callbacksRef, setStatus, status]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n };\n }\n\n overridesEvent.source_info = {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n };\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = String(config.userId);\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","_ref","onReady","isConnected","callbacks","sendMessage","_ref$clientTools","clientTools","updateCurrentEventId","onEndSession","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","current","useDataChannel","msg","_msg$from","decoder","TextDecoder","message","JSON","parse","decode","payload","event","_msg$from2","messageText","type","user_transcription_event","user_transcript","agent_response_event","agent_response","extractMessageText","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","event_id","ping_event","clientToolCall","Promise","resolve","client_tool_call","tool_name","_temp","parameters","then","result","formattedResult","stringify","String","tool_call_id","is_error","_catch","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","reject","handleClientToolCall","onAudio","audio_event","audio_base_64","onVadScore","vadScore","vad_score_event","vad_score","onInterruption","interruption_event","onMCPToolCall","mcp_tool_call","onMCPConnectionStatus","mcp_connection_status","onAgentToolResponse","agent_tool_response","onConversationMetadata","conversation_initiation_metadata_event","onAsrInitiationMetadata","asr_initiation_metadata_event","onAgentChatResponsePart","text_response_part","onDebug","LiveKitRoomWrapper","children","createElement","LiveKitRoom","serverUrl","token","connect","audio","video","options","adaptiveStream","pixelDensity","onConnected","onDisconnected","onParticipantReady","roomConnected","_excluded","ElevenLabsContext","createContext","registerGlobals","_useState","useState","setToken","_useState2","setConnect","_useState3","status","setStatus","_useState4","setServerUrl","_useState5","undefined","tokenFetchUrl","setTokenFetchUrl","_useState6","conversationId","setConversationId","_useState7","setIsSpeaking","_useState8","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","_useConversationCallb","callbacksRef","setCallbacks","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","userId","setUserId","startSession","config","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","agentId","info","fetch","response","json","data","ok","Error","detail","getConversationToken","_getConversationToken","endSession","reason","onDisconnect","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","hasCalledOnConnectRef","AudioSession","startAudioSession","start","stopAudioSession","onConnect","handleParticipantReady","participant","handleConnected","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","getId","setMicMuted","muted","setMicrophoneEnabled","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","conversation","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","user_id","constructOverrides","setClientTools","tools","sendContextualUpdate","text","sendUserMessage","sendUserActivity","useMemo","contextValue","Provider","value","key","context","useContext","_objectWithoutPropertiesLoose"],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const PACKAGE_VERSION = "0.5.1";
1
+ export declare const PACKAGE_VERSION = "0.5.3";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevenlabs/react-native",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "ElevenLabs React Native SDK for Conversational AI",
5
5
  "main": "./dist/lib.js",
6
6
  "module": "./dist/lib.module.js",
@@ -14,6 +14,19 @@
14
14
  "require": "./dist/lib.js"
15
15
  }
16
16
  },
17
+ "scripts": {
18
+ "generate-version": "printf \"// This file is auto-generated during build\\nexport const PACKAGE_VERSION = \\\"%s\\\";\\n\" \"$npm_package_version\" > src/version.ts",
19
+ "prebuild": "npm run generate-version",
20
+ "build": "BROWSERSLIST_ENV=modern microbundle --jsx React.createElement --jsxFragment React.Fragment --jsxImportSource react src/index.ts",
21
+ "clean": "rm -rf ./dist",
22
+ "dev": "pnpm run clean && pnpm run generate-version && BROWSERSLIST_ENV=modern microbundle --jsx React.createElement --jsxFragment React.Fragment --jsxImportSource react src/index.ts -w --no-compress",
23
+ "lint": "pnpm run check-types && pnpm run lint:es && pnpm run lint:prettier",
24
+ "check-types": "tsc --noEmit --skipLibCheck",
25
+ "lint:es": "pnpm exec eslint .",
26
+ "lint:prettier": "prettier 'src/**/*.ts' --check",
27
+ "prepublishOnly": "pnpm run build",
28
+ "test": "jest"
29
+ },
17
30
  "keywords": [
18
31
  "elevenlabs",
19
32
  "react-native",
@@ -32,7 +45,7 @@
32
45
  "react-native": ">=0.70.0"
33
46
  },
34
47
  "dependencies": {
35
- "@elevenlabs/types": "0.0.2"
48
+ "@elevenlabs/types": "workspace:*"
36
49
  },
37
50
  "devDependencies": {
38
51
  "@testing-library/jest-native": "^5.4.3",
@@ -54,17 +67,5 @@
54
67
  },
55
68
  "publishConfig": {
56
69
  "access": "public"
57
- },
58
- "scripts": {
59
- "generate-version": "printf \"// This file is auto-generated during build\\nexport const PACKAGE_VERSION = \\\"%s\\\";\\n\" \"$npm_package_version\" > src/version.ts",
60
- "prebuild": "npm run generate-version",
61
- "build": "BROWSERSLIST_ENV=modern microbundle --jsx React.createElement --jsxFragment React.Fragment --jsxImportSource react src/index.ts",
62
- "clean": "rm -rf ./dist",
63
- "dev": "pnpm run clean && pnpm run generate-version && BROWSERSLIST_ENV=modern microbundle --jsx React.createElement --jsxFragment React.Fragment --jsxImportSource react src/index.ts -w --no-compress",
64
- "lint": "pnpm run check-types && pnpm run lint:es && pnpm run lint:prettier",
65
- "check-types": "tsc --noEmit --skipLibCheck",
66
- "lint:es": "pnpm exec eslint .",
67
- "lint:prettier": "prettier 'src/**/*.ts' --check",
68
- "test": "jest"
69
70
  }
70
- }
71
+ }
@@ -18,7 +18,7 @@ interface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {
18
18
 
19
19
  export interface Conversation {
20
20
  startSession: (config: ConversationConfig) => Promise<void>;
21
- endSession: () => Promise<void>;
21
+ endSession: (reason?: "user" | "agent") => Promise<void>;
22
22
  status: ConversationStatus;
23
23
  isSpeaking: boolean;
24
24
  // TODO: Implement setVolume when LiveKit React Native supports it
@@ -66,10 +66,14 @@ export const useConversation = (options: ConversationOptions = {}): Conversation
66
66
  }
67
67
  }, [context, tokenFetchUrl]);
68
68
 
69
- if (clientTools) {
70
- context.setClientTools(clientTools);
71
- }
69
+ React.useEffect(() => {
70
+ if (clientTools) {
71
+ context.setClientTools(clientTools);
72
+ }
73
+ }, [context, clientTools]);
72
74
 
75
+ // Update callbacks - since this only updates a ref, it's safe to call on every render
76
+ // and doesn't cause re-renders of the provider or its consumers
73
77
  context.setCallbacks(callbacks);
74
78
 
75
79
  return context.conversation;
@@ -131,7 +135,7 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
131
135
  handleConnected,
132
136
  handleDisconnected,
133
137
  handleError,
134
- } = useLiveKitRoom(callbacksRef, setStatus, conversationId);
138
+ } = useLiveKitRoom(callbacksRef, setStatus, conversationId, status);
135
139
 
136
140
  // Enhanced connection handler to initialize feedback state
137
141
  const handleConnectedWithFeedback = React.useCallback(() => {
@@ -147,6 +151,7 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
147
151
  // Enhanced disconnection handler to reset feedback state
148
152
  const handleDisconnectedWithFeedback = React.useCallback(() => {
149
153
  setCanSendFeedback(false);
154
+ setIsSpeaking(false);
150
155
  handleDisconnected();
151
156
  }, [handleDisconnected]);
152
157
 
@@ -187,7 +192,7 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
187
192
  console.warn('setVolume is not yet implemented in React Native SDK');
188
193
  }, []);
189
194
 
190
- const getId = () => conversationId;
195
+ const getId = React.useCallback(() => conversationId, [conversationId]);
191
196
 
192
197
  const setMicMuted = React.useCallback((muted: boolean) => {
193
198
  if (localParticipant) {
@@ -224,41 +229,61 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
224
229
  }
225
230
  }, [handleParticipantReady, overrides, customLlmExtraBody, dynamicVariables, userId, callbacksRef]);
226
231
 
227
- const conversation: Conversation = {
232
+ // Create setClientTools function that only updates ref
233
+ const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {
234
+ clientToolsRef.current = tools;
235
+ }, []);
236
+
237
+ // Memoize inline callback functions
238
+ const sendContextualUpdate = React.useCallback((text: string) => {
239
+ sendMessage({
240
+ type: "contextual_update",
241
+ text,
242
+ });
243
+ }, [sendMessage]);
244
+
245
+ const sendUserMessage = React.useCallback((text: string) => {
246
+ sendMessage({
247
+ type: "user_message",
248
+ text,
249
+ });
250
+ }, [sendMessage]);
251
+
252
+ const sendUserActivity = React.useCallback(() => {
253
+ sendMessage({
254
+ type: "user_activity",
255
+ });
256
+ }, [sendMessage]);
257
+
258
+ // Memoize the conversation object to prevent unnecessary re-renders
259
+ const conversation = React.useMemo<Conversation>(() => ({
228
260
  startSession,
229
261
  endSession,
230
262
  status,
231
263
  isSpeaking,
232
- // setVolume,
233
264
  canSendFeedback,
234
265
  getId,
235
266
  setMicMuted,
236
267
  sendFeedback,
237
- sendContextualUpdate: (text: string) => {
238
- sendMessage({
239
- type: "contextual_update",
240
- text,
241
- });
242
- },
243
- sendUserMessage: (text: string) => {
244
- sendMessage({
245
- type: "user_message",
246
- text,
247
- });
248
- },
249
- sendUserActivity: () => {
250
- sendMessage({
251
- type: "user_activity",
252
- });
253
- },
254
- };
255
-
256
- // Create setClientTools function that only updates ref
257
- const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {
258
- clientToolsRef.current = tools;
259
- }, []);
268
+ sendContextualUpdate,
269
+ sendUserMessage,
270
+ sendUserActivity,
271
+ }), [
272
+ startSession,
273
+ endSession,
274
+ status,
275
+ isSpeaking,
276
+ canSendFeedback,
277
+ getId,
278
+ setMicMuted,
279
+ sendFeedback,
280
+ sendContextualUpdate,
281
+ sendUserMessage,
282
+ sendUserActivity,
283
+ ]);
260
284
 
261
- const contextValue: ElevenLabsContextType = {
285
+ // Memoize the context value to prevent unnecessary re-renders of consumers
286
+ const contextValue = React.useMemo<ElevenLabsContextType>(() => ({
262
287
  conversation,
263
288
  callbacksRef,
264
289
  serverUrl,
@@ -266,13 +291,21 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
266
291
  clientTools: clientToolsRef.current,
267
292
  setCallbacks,
268
293
  setServerUrl,
269
- setTokenFetchUrl: setTokenFetchUrl,
294
+ setTokenFetchUrl,
295
+ setClientTools,
296
+ }), [
297
+ conversation,
298
+ callbacksRef,
299
+ serverUrl,
300
+ tokenFetchUrl,
301
+ setCallbacks,
270
302
  setClientTools,
271
- };
303
+ ]);
272
304
 
273
305
  return (
274
306
  <ElevenLabsContext.Provider value={contextValue}>
275
307
  <LiveKitRoomWrapper
308
+ key={conversationId || 'disconnected'}
276
309
  serverUrl={serverUrl}
277
310
  token={token}
278
311
  connect={connect}
@@ -285,9 +318,10 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
285
318
  sendMessage={sendMessage}
286
319
  clientTools={clientToolsRef.current}
287
320
  updateCurrentEventId={updateCurrentEventId}
321
+ onEndSession={endSession}
288
322
  >
289
323
  {children}
290
324
  </LiveKitRoomWrapper>
291
325
  </ElevenLabsContext.Provider>
292
326
  );
293
- };
327
+ };
@@ -18,6 +18,7 @@ interface LiveKitRoomWrapperProps {
18
18
  onParticipantReady: (participant: LocalParticipant) => void;
19
19
  sendMessage: (message: unknown) => void;
20
20
  clientTools: ClientToolsConfig['clientTools'];
21
+ onEndSession: (reason?: "user" | "agent") => void;
21
22
  updateCurrentEventId?: (eventId: number) => void;
22
23
  }
23
24
 
@@ -35,6 +36,7 @@ export const LiveKitRoomWrapper = ({
35
36
  sendMessage,
36
37
  clientTools,
37
38
  updateCurrentEventId,
39
+ onEndSession,
38
40
  }: LiveKitRoomWrapperProps) => {
39
41
  return (
40
42
  <LiveKitRoom
@@ -57,6 +59,7 @@ export const LiveKitRoomWrapper = ({
57
59
  sendMessage={sendMessage}
58
60
  clientTools={clientTools}
59
61
  updateCurrentEventId={updateCurrentEventId}
62
+ onEndSession={onEndSession}
60
63
  />
61
64
  {children as any}
62
65
  </LiveKitRoom>
@@ -14,6 +14,7 @@ interface MessageHandlerProps {
14
14
  isConnected: boolean;
15
15
  callbacks: Callbacks;
16
16
  sendMessage: (message: unknown) => void;
17
+ onEndSession: (reason: "user" | "agent") => void;
17
18
  clientTools?: ClientToolsConfig["clientTools"];
18
19
  updateCurrentEventId?: (eventId: number) => void;
19
20
  }
@@ -40,12 +41,20 @@ export const MessageHandler = ({
40
41
  sendMessage,
41
42
  clientTools = {},
42
43
  updateCurrentEventId,
44
+ onEndSession,
43
45
  }: MessageHandlerProps) => {
44
46
  const { localParticipant } = useLocalParticipant();
45
47
 
46
48
  // Track agent response count for synthetic event IDs (WebRTC mode)
47
49
  const agentResponseCountRef = React.useRef(1);
48
50
 
51
+ // Reset agent response count when connection status changes
52
+ useEffect(() => {
53
+ if (!isConnected) {
54
+ agentResponseCountRef.current = 1;
55
+ }
56
+ }, [isConnected]);
57
+
49
58
  useEffect(() => {
50
59
  if (isConnected && localParticipant) {
51
60
  onReady(localParticipant);
@@ -162,6 +171,11 @@ export const MessageHandler = ({
162
171
  break;
163
172
  case "agent_tool_response":
164
173
  callbacks.onAgentToolResponse?.(message.agent_tool_response);
174
+
175
+ if (message.agent_tool_response.tool_name === "end_call") {
176
+ // End the call
177
+ onEndSession("agent");
178
+ }
165
179
  break;
166
180
  case "conversation_initiation_metadata":
167
181
  callbacks.onConversationMetadata?.(
@@ -80,18 +80,29 @@ export const useConversationSession = (
80
80
  ]
81
81
  );
82
82
 
83
- const endSession = useCallback(async () => {
84
- try {
85
- setConnect(false);
86
- setToken("");
87
- setStatus("disconnected");
88
- callbacksRef.current.onStatusChange?.({ status: "disconnected" });
89
- callbacksRef.current.onDisconnect?.({ reason: "user" });
90
- } catch (error) {
91
- callbacksRef.current.onError?.(error as string);
92
- throw error;
93
- }
94
- }, [callbacksRef, setConnect, setToken, setStatus]);
83
+ const endSession = useCallback(
84
+ async (reason: "user" | "agent" = "user") => {
85
+ try {
86
+ setConnect(false);
87
+ setToken("");
88
+ setStatus("disconnected");
89
+
90
+ // Reset session configuration state
91
+ setOverrides({});
92
+ setCustomLlmExtraBody(null);
93
+ setDynamicVariables({});
94
+ setUserId(undefined);
95
+ setConversationId("");
96
+
97
+ callbacksRef.current.onStatusChange?.({ status: "disconnected" });
98
+ callbacksRef.current.onDisconnect?.({ reason });
99
+ } catch (error) {
100
+ callbacksRef.current.onError?.(error as string);
101
+ throw error;
102
+ }
103
+ },
104
+ [callbacksRef, setConnect, setToken, setStatus, setConversationId]
105
+ );
95
106
 
96
107
  return {
97
108
  startSession,
@@ -6,13 +6,23 @@ import type { ConversationStatus, Callbacks } from "../types";
6
6
  export const useLiveKitRoom = (
7
7
  callbacksRef: { current: Callbacks },
8
8
  setStatus: (status: ConversationStatus) => void,
9
- conversationId: string
9
+ conversationId: string,
10
+ status: ConversationStatus
10
11
  ) => {
11
12
  const [roomConnected, setRoomConnected] = useState(false);
12
13
  const [localParticipant, setLocalParticipant] =
13
14
  useState<LocalParticipant | null>(null);
14
15
  const hasCalledOnConnectRef = useRef(false);
15
16
 
17
+ // Reset room state when conversationId changes (new session starting)
18
+ useEffect(() => {
19
+ if (conversationId) {
20
+ setRoomConnected(false);
21
+ setLocalParticipant(null);
22
+ hasCalledOnConnectRef.current = false;
23
+ }
24
+ }, [conversationId]);
25
+
16
26
  useEffect(() => {
17
27
  const start = async () => {
18
28
  await AudioSession.startAudioSession();
@@ -49,12 +59,17 @@ export const useLiveKitRoom = (
49
59
  }, []);
50
60
 
51
61
  const handleDisconnected = useCallback(() => {
62
+ // If already disconnected, endSession already handled the disconnect callback
63
+ if (status === "disconnected") {
64
+ return;
65
+ }
66
+
52
67
  setRoomConnected(false);
53
68
  setStatus("disconnected");
54
69
  setLocalParticipant(null);
55
70
  hasCalledOnConnectRef.current = false;
56
71
  callbacksRef.current.onDisconnect?.({ reason: "user" });
57
- }, [callbacksRef, setStatus]);
72
+ }, [callbacksRef, setStatus, status]);
58
73
 
59
74
  const handleError = useCallback(
60
75
  (error: Error) => {
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  // This file is auto-generated during build
2
- export const PACKAGE_VERSION = "0.5.1";
2
+ export const PACKAGE_VERSION = "0.5.3";