UNPKG

@elevenlabs/react-native

Version:

ElevenLabs React Native SDK for Conversational AI

3 lines (2 loc) 11.3 kB
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react"),require("@livekit/react-native")):"function"==typeof define&&define.amd?define(["exports","react","@livekit/react-native"],n):n((e||self).reactNative={},e.react,e.reactNative)}(this,function(e,n,t){function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/r(n);function a(){return a=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},a.apply(null,arguments)}var c="0.3.1",l=function(e){var r=e.onReady,a=e.isConnected,c=e.callbacks,l=e.sendMessage,i=e.clientTools,s=void 0===i?{}:i,u=e.updateCurrentEventId,d=t.useLocalParticipant().localParticipant,f=o.default.useRef(1);return n.useEffect(function(){a&&d&&r(d)},[a,d,r]),t.useDataChannel(function(e){var n,t,r=new TextDecoder,o=JSON.parse(r.decode(e.payload));if(o.type){var a;if(null==c.onMessage||c.onMessage({message:o,source:null!=(n=e.from)&&n.isAgent?"ai":"user"}),null!=(t=e.from)&&t.isAgent&&(null==c.onModeChange||c.onModeChange({mode:null!=(a=e.from)&&a.isSpeaking?"speaking":"listening"}),"agent_response"===o.type&&u)){var i=f.current++;u(i)}switch(o.type){case"ping":l({type:"pong",event_id:o.ping_event.event_id});break;case"client_tool_call":!function(e){try{return Promise.resolve(function(){if(Object.prototype.hasOwnProperty.call(s,e.client_tool_call.tool_name)){var n=function(n,t){try{var r=Promise.resolve(s[e.client_tool_call.tool_name](e.client_tool_call.parameters)).then(function(n){var t="object"==typeof n?JSON.stringify(n):String(n);l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!1})})}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}(0,function(n){null==c.onError||c.onError("Client tool execution failed with following error: "+(null==n?void 0:n.message),{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:"Client tool execution failed: "+(null==n?void 0:n.message),is_error:!0})});if(n&&n.then)return n.then(function(){})}else{if(c.onUnhandledClientToolCall)return void c.onUnhandledClientToolCall(e);var t="Client tool with name "+e.client_tool_call.tool_name+" is not defined on client";null==c.onError||c.onError(t,{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!0})}}())}catch(e){return Promise.reject(e)}}(o);break;default:null==c.onDebug||c.onDebug(o)}}else null==c.onDebug||c.onDebug({type:"invalid_event",message:o})}),null},i=function(e){var n=e.children;/*#__PURE__*/return o.default.createElement(t.LiveKitRoom,{serverUrl:e.serverUrl,token:e.token,connect:e.connect,audio:!0,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:e.onConnected,onDisconnected:e.onDisconnected,onError:e.onError},/*#__PURE__*/o.default.createElement(l,{onReady:e.onParticipantReady,isConnected:e.roomConnected,callbacks:e.callbacks,sendMessage:e.sendMessage,clientTools:e.clientTools,updateCurrentEventId:e.updateCurrentEventId}),n)},s=["serverUrl","tokenFetchUrl","clientTools"],u=/*#__PURE__*/n.createContext(null);e.ElevenLabsProvider=function(e){var r=e.children;t.registerGlobals();var l=n.useState(""),s=l[0],d=l[1],f=n.useState(!1),v=f[0],h=f[1],m=n.useState("disconnected"),g=m[0],C=m[1],b=n.useState("wss://livekit.rtc.elevenlabs.io"),_=b[0],k=b[1],p=n.useState(void 0),y=p[0],S=p[1],E=n.useState(""),P=E[0],w=E[1],x=n.useState(!1),T=x[0],I=x[1],U=n.useState(!1),D=U[0],M=U[1],R=o.default.useRef(1),F=o.default.useRef(1),j=o.default.useRef({}),O=function(){var e=n.useRef({}),t=n.useCallback(function(n){e.current=n},[]);return{callbacksRef:e,setCallbacks:t}}(),L=O.callbacksRef,N=O.setCallbacks,A=o.default.useCallback(function(e){var n=a({},e,{onModeChange:function(n){I("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});N(n)},[N]),V=function(e,t,r,o,a,l){var i=n.useState({}),s=i[0],u=i[1],d=n.useState(null),f=d[0],v=d[1],h=n.useState({}),m=h[0],g=h[1],C=n.useState(void 0),b=C[0],_=C[1];return{startSession:n.useCallback(function(n){try{return Promise.resolve(function(i,s){try{var d=function(){function i(e){var n=function(e){try{var n,t;return(null==(t=((null==(n=JSON.parse(atob(e.split(".")[1])).video)?void 0:n.room)||"").match(/(conv_[a-zA-Z0-9]+)/))?void 0:t[0])||""}catch(e){return console.warn("Could not extract conversation ID from token"),""}}(s);a(n),o(s),r(!0)}var s;t("connecting"),null==e.current.onStatusChange||e.current.onStatusChange({status:"connecting"}),u(n.overrides||{}),v(n.customLlmExtraBody||null),g(n.dynamicVariables||{}),_(n.userId);var d=function(){if(!n.conversationToken)return function(){if(n.agentId)return console.info("Getting conversation token for agentId:",n.agentId),Promise.resolve(function(e,n){try{return Promise.resolve(fetch((n||"https://api.elevenlabs.io/v1/convai/conversation/token")+"?agent_id="+e+"&source=react_native_sdk&version="+c)).then(function(e){return Promise.resolve(e.json()).then(function(n){if(!e.ok)throw new Error("Failed to get conversation token: "+n.detail.message);if(!n.token)throw new Error("No conversation token received from API");return n.token})})}catch(e){return Promise.reject(e)}}(n.agentId,n.tokenFetchUrl||l)).then(function(e){s=e});throw new Error("Either conversationToken or agentId is required")}();s=n.conversationToken}();return d&&d.then?d.then(i):i()}()}catch(e){return s(e)}return d&&d.then?d.then(void 0,s):d}(0,function(n){throw t("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onError||e.current.onError(n),n}))}catch(e){return Promise.reject(e)}},[e,t,r,o,a,l]),endSession:n.useCallback(function(){try{try{r(!1),o(""),t("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onDisconnect||e.current.onDisconnect("User ended conversation")}catch(n){throw null==e.current.onError||e.current.onError(n),n}return Promise.resolve()}catch(e){return Promise.reject(e)}},[e,r,o,t]),overrides:s,customLlmExtraBody:f,dynamicVariables:m,userId:b}}(L,C,h,d,w,y),B=V.startSession,J=V.endSession,q=V.overrides,K=V.customLlmExtraBody,G=V.dynamicVariables,z=V.userId,W=function(e,r,o){var a=n.useState(!1),c=a[0],l=a[1],i=n.useState(null),s=i[0],u=i[1];return n.useEffect(function(){return function(){try{return Promise.resolve(t.AudioSession.startAudioSession()).then(function(){})}catch(e){return Promise.reject(e)}}(),function(){t.AudioSession.stopAudioSession()}},[]),{roomConnected:c,localParticipant:s,handleParticipantReady:n.useCallback(function(e){u(e)},[]),handleConnected:n.useCallback(function(){l(!0),r("connected"),null==e.current.onConnect||e.current.onConnect({conversationId:o})},[o,e,r]),handleDisconnected:n.useCallback(function(){l(!1),r("disconnected"),u(null),null==e.current.onDisconnect||e.current.onDisconnect("disconnected")},[e,r]),handleError:n.useCallback(function(n){console.error("LiveKit error:",n),null==e.current.onError||e.current.onError(n.message,void 0)},[e])}}(L,C,P),Z=W.roomConnected,H=W.localParticipant,Q=W.handleParticipantReady,X=W.handleConnected,Y=W.handleDisconnected,$=W.handleError,ee=o.default.useCallback(function(){R.current=1,F.current=1,M(!1),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:!1}),X()},[X,L]),ne=o.default.useCallback(function(){M(!1),Y()},[Y]),te=function(e,t,r){return{sendMessage:n.useCallback(function(n){try{if("connected"!==e||!t)return console.warn("Cannot send message: room not connected or no local participant"),Promise.resolve();var o=function(e,r){try{var o=(a=(new TextEncoder).encode(JSON.stringify(n)),Promise.resolve(t.publishData(a,{reliable:!0})).then(function(){}))}catch(e){return r(e)}var a;return o&&o.then?o.then(void 0,r):o}(0,function(e){console.error("Failed to send message via WebRTC:",e),console.error("Error details:",e),null==r.current.onError||r.current.onError(e)});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},[e,t,r])}}(g,H,L),re=te.sendMessage,oe=o.default.useCallback(function(){var e=R.current!==F.current;D!==e&&(M(e),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:e}))},[D,L]),ae=o.default.useCallback(function(e){D?(re({type:"feedback",score:e?"like":"dislike",event_id:R.current}),F.current=R.current,oe()):console.warn(0===F.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[D,re,oe]);o.default.useCallback(function(e){console.warn("setVolume is not yet implemented in React Native SDK")},[]);var ce=o.default.useCallback(function(e){H&&H.setMicrophoneEnabled(!e)},[H]),le=o.default.useCallback(function(e){R.current=e,oe()},[oe]),ie=o.default.useCallback(function(e){if(Q(e),H){var n=function(e){var n,t,r,o,a,l,i={type:"conversation_initiation_client_data"};return e.overrides&&(i.conversation_config_override={agent:{prompt:null==(n=e.overrides.agent)?void 0:n.prompt,first_message:null==(t=e.overrides.agent)?void 0:t.firstMessage,language:null==(r=e.overrides.agent)?void 0:r.language},tts:{voice_id:null==(o=e.overrides.tts)?void 0:o.voiceId},conversation:{text_only:null==(a=e.overrides.conversation)?void 0:a.textOnly},source_info:{source:"react_native_sdk",version:(null==(l=e.overrides)||null==(l=l.client)?void 0:l.version)||c}}),e.customLlmExtraBody&&(i.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(i.dynamic_variables=e.dynamicVariables),e.userId&&(i.user_id=String(e.userId)),i}({overrides:q,customLlmExtraBody:K,dynamicVariables:G,userId:z});re(n)}},[Q,H,q,K,G,z,re]),se={startSession:B,endSession:J,status:g,isSpeaking:T,canSendFeedback:D,getId:function(){return P},setMicMuted:ce,sendFeedback:ae,sendContextualUpdate:function(e){re({type:"contextual_update",text:e})},sendUserMessage:function(e){re({type:"user_message",text:e})},sendUserActivity:function(){re({type:"user_activity"})}},ue=o.default.useCallback(function(e){j.current=e},[]);/*#__PURE__*/return o.default.createElement(u.Provider,{value:{conversation:se,callbacksRef:L,serverUrl:_,tokenFetchUrl:y,clientTools:j.current,setCallbacks:A,setServerUrl:k,setTokenFetchUrl:S,setClientTools:ue}},/*#__PURE__*/o.default.createElement(i,{serverUrl:_,token:s,connect:v,onConnected:ee,onDisconnected:ne,onError:$,roomConnected:Z,callbacks:L.current,onParticipantReady:ie,sendMessage:re,clientTools:j.current,updateCurrentEventId:le},r))},e.useConversation=function(e){void 0===e&&(e={});var t=n.useContext(u);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");var r=e.serverUrl,a=e.tokenFetchUrl,c=e.clientTools,l=function(e,n){if(null==e)return{};var t={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==n.indexOf(r))continue;t[r]=e[r]}return t}(e,s);return o.default.useEffect(function(){r&&t.setServerUrl(r)},[t,r]),o.default.useEffect(function(){a&&t.setTokenFetchUrl(a)},[t,a]),c&&t.setClientTools(c),t.setCallbacks(l),t.conversation}}); //# sourceMappingURL=lib.umd.js.map