@elevenlabs/react 0.9.2 → 0.10.0

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,13 +1,13 @@
1
1
 
2
- > @elevenlabs/react@0.9.2 prebuild /home/runner/work/packages/packages/packages/react
2
+ > @elevenlabs/react@0.10.0 prebuild /home/runner/work/packages/packages/packages/react
3
3
  > npm run generate-version
4
4
 
5
5
 
6
- > @elevenlabs/react@0.9.2 generate-version
6
+ > @elevenlabs/react@0.10.0 generate-version
7
7
  > printf "// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"%s\";\n" "$npm_package_version" > src/version.ts
8
8
 
9
9
 
10
- > @elevenlabs/react@0.9.2 build /home/runner/work/packages/packages/packages/react
10
+ > @elevenlabs/react@0.10.0 build /home/runner/work/packages/packages/packages/react
11
11
  > BROWSERSLIST_ENV=modern microbundle --jsx React.createElement --jsxFragment React.Fragment --jsxImportSource react src/index.ts
12
12
 
13
13
  No name was provided for external module '@elevenlabs/client' in output.globals – guessing 'client'
@@ -17,6 +17,6 @@ Build "@elevenlabs/react" to dist:
17
17
  2.87 kB: lib.modern.js.gz
18
18
  2.52 kB: lib.modern.js.br
19
19
  3.15 kB: lib.module.js.gz
20
- 2.78 kB: lib.module.js.br
21
- 3.24 kB: lib.umd.js.gz
20
+ 2.77 kB: lib.module.js.br
21
+ 3.25 kB: lib.umd.js.gz
22
22
  2.87 kB: lib.umd.js.br
@@ -1,4 +1,4 @@
1
1
 
2
- > @elevenlabs/react@0.9.2 generate-version /home/runner/work/packages/packages/packages/react
2
+ > @elevenlabs/react@0.10.0 generate-version /home/runner/work/packages/packages/packages/react
3
3
  > printf "// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"%s\";\n" "$npm_package_version" > src/version.ts
4
4
 
package/README.md CHANGED
@@ -529,8 +529,6 @@ console.log(canSendFeedback); // boolean
529
529
 
530
530
  React hook for managing real-time speech-to-text transcription with ElevenLabs Scribe Realtime v2.
531
531
 
532
- **Note:** Scribe Realtime v2 is currently in closed beta. For access please [contact sales](https://elevenlabs.io/contact-sales).
533
-
534
532
  #### Quick Start
535
533
 
536
534
  ```tsx
@@ -538,12 +536,12 @@ import { useScribe } from "@elevenlabs/react";
538
536
 
539
537
  function MyComponent() {
540
538
  const scribe = useScribe({
541
- modelId: "scribe_realtime_v2",
539
+ modelId: "scribe_v2_realtime",
542
540
  onPartialTranscript: (data) => {
543
541
  console.log("Partial:", data.text);
544
542
  },
545
- onFinalTranscript: (data) => {
546
- console.log("Final:", data.text);
543
+ onCommittedTranscript: (data) => {
544
+ console.log("Committed:", data.text);
547
545
  },
548
546
  });
549
547
 
@@ -570,7 +568,7 @@ function MyComponent() {
570
568
  {scribe.partialTranscript && <p>Live: {scribe.partialTranscript}</p>}
571
569
 
572
570
  <div>
573
- {scribe.finalTranscripts.map((t) => (
571
+ {scribe.committedTranscripts.map((t) => (
574
572
  <p key={t.id}>{t.text}</p>
575
573
  ))}
576
574
  </div>
@@ -620,7 +618,7 @@ Configure the hook with default options and callbacks:
620
618
  const scribe = useScribe({
621
619
  // Connection options (can be overridden in connect())
622
620
  token: "optional-default-token",
623
- modelId: "scribe_realtime_v2",
621
+ modelId: "scribe_v2_realtime",
624
622
  baseUri: "wss://api.elevenlabs.io",
625
623
 
626
624
  // VAD options
@@ -649,8 +647,8 @@ const scribe = useScribe({
649
647
  // Event callbacks
650
648
  onSessionStarted: () => console.log("Session started"),
651
649
  onPartialTranscript: (data) => console.log("Partial:", data.text),
652
- onFinalTranscript: (data) => console.log("Final:", data.text),
653
- onFinalTranscriptWithTimestamps: (data) => console.log("With timestamps:", data),
650
+ onCommittedTranscript: (data) => console.log("Committed:", data.text),
651
+ onCommittedTranscriptWithTimestamps: (data) => console.log("With timestamps:", data),
654
652
  onError: (error) => console.error("Error:", error),
655
653
  onAuthError: (data) => console.error("Auth error:", data.error),
656
654
  onConnect: () => console.log("Connected"),
@@ -665,7 +663,7 @@ Stream audio directly from the user's microphone:
665
663
  ```tsx
666
664
  function MicrophoneTranscription() {
667
665
  const scribe = useScribe({
668
- modelId: "scribe_realtime_v2",
666
+ modelId: "scribe_v2_realtime",
669
667
  });
670
668
 
671
669
  const startRecording = async () => {
@@ -695,7 +693,7 @@ function MicrophoneTranscription() {
695
693
  </div>
696
694
  )}
697
695
 
698
- {scribe.finalTranscripts.map((transcript) => (
696
+ {scribe.committedTranscripts.map((transcript) => (
699
697
  <div key={transcript.id}>{transcript.text}</div>
700
698
  ))}
701
699
  </div>
@@ -713,7 +711,7 @@ import { useScribe, AudioFormat } from "@elevenlabs/react";
713
711
  function FileTranscription() {
714
712
  const [file, setFile] = useState<File | null>(null);
715
713
  const scribe = useScribe({
716
- modelId: "scribe_realtime_v2",
714
+ modelId: "scribe_v2_realtime",
717
715
  audioFormat: AudioFormat.PCM_16000,
718
716
  sampleRate: 16000,
719
717
  });
@@ -764,7 +762,7 @@ function FileTranscription() {
764
762
  Transcribe
765
763
  </button>
766
764
 
767
- {scribe.finalTranscripts.map((transcript) => (
765
+ {scribe.committedTranscripts.map((transcript) => (
768
766
  <div key={transcript.id}>{transcript.text}</div>
769
767
  ))}
770
768
  </div>
@@ -780,7 +778,7 @@ function FileTranscription() {
780
778
  - **isConnected** - Boolean indicating if connected
781
779
  - **isTranscribing** - Boolean indicating if actively transcribing
782
780
  - **partialTranscript** - Current partial (interim) transcript
783
- - **finalTranscripts** - Array of completed transcript segments
781
+ - **committedTranscripts** - Array of completed transcript segments
784
782
  - **error** - Current error message, or null
785
783
 
786
784
  ```tsx
@@ -789,7 +787,7 @@ const scribe = useScribe(/* options */);
789
787
  console.log(scribe.status); // "connected"
790
788
  console.log(scribe.isConnected); // true
791
789
  console.log(scribe.partialTranscript); // "hello world"
792
- console.log(scribe.finalTranscripts); // [{ id: "...", text: "...", timestamp: ..., isFinal: true }]
790
+ console.log(scribe.committedTranscripts); // [{ id: "...", text: "...", timestamp: ..., isFinal: true }]
793
791
  console.log(scribe.error); // null or error string
794
792
  ```
795
793
 
@@ -855,14 +853,14 @@ const connection = scribe.getConnection();
855
853
 
856
854
  #### Transcript Segment Type
857
855
 
858
- Each final transcript segment has the following structure:
856
+ Each committed transcript segment has the following structure:
859
857
 
860
858
  ```typescript
861
859
  interface TranscriptSegment {
862
860
  id: string; // Unique identifier
863
861
  text: string; // Transcript text
864
862
  timestamp: number; // Unix timestamp
865
- isFinal: boolean; // Always true for final transcripts
863
+ isFinal: boolean; // Always true for committed transcripts
866
864
  }
867
865
  ```
868
866
 
@@ -878,10 +876,10 @@ const scribe = useScribe({
878
876
  onPartialTranscript: (data: { text: string }) => {
879
877
  console.log("Partial:", data.text);
880
878
  },
881
- onFinalTranscript: (data: { text: string }) => {
882
- console.log("Final:", data.text);
879
+ onCommittedTranscript: (data: { text: string }) => {
880
+ console.log("Committed:", data.text);
883
881
  },
884
- onFinalTranscriptWithTimestamps: (data: {
882
+ onCommittedTranscriptWithTimestamps: (data: {
885
883
  text: string;
886
884
  timestamps?: { start: number; end: number }[];
887
885
  }) => {
@@ -905,23 +903,23 @@ const scribe = useScribe({
905
903
 
906
904
  #### Commit Strategies
907
905
 
908
- Control when transcriptions are finalized:
906
+ Control when transcriptions are committed:
909
907
 
910
908
  ```tsx
911
909
  import { CommitStrategy } from "@elevenlabs/react";
912
910
 
913
- // Automatic (default) - API detects speech end
914
- const scribe = useScribe({
915
- commitStrategy: CommitStrategy.AUTOMATIC,
916
- });
917
-
918
- // Manual - you control when to commit
911
+ // Manual (default) - you control when to commit
919
912
  const scribe = useScribe({
920
913
  commitStrategy: CommitStrategy.MANUAL,
921
914
  });
922
915
 
923
916
  // Later...
924
- scribe.commit(); // Finalize transcription
917
+ scribe.commit(); // Commit transcription
918
+
919
+ // Voice Activity Detection - model detects silences and automatically commits
920
+ const scribe = useScribe({
921
+ commitStrategy: CommitStrategy.VAD,
922
+ });
925
923
  ```
926
924
 
927
925
  #### Complete Example
@@ -934,10 +932,10 @@ function ScribeDemo() {
934
932
  const [mode, setMode] = useState<"microphone" | "file">("microphone");
935
933
 
936
934
  const scribe = useScribe({
937
- modelId: "scribe_realtime_v2",
935
+ modelId: "scribe_v2_realtime",
938
936
  commitStrategy: CommitStrategy.AUTOMATIC,
939
937
  onSessionStarted: () => console.log("Started"),
940
- onFinalTranscript: (data) => console.log("Final:", data.text),
938
+ onCommittedTranscript: (data) => console.log("Committed:", data.text),
941
939
  onError: (error) => console.error("Error:", error),
942
940
  });
943
941
 
@@ -979,10 +977,10 @@ function ScribeDemo() {
979
977
  </div>
980
978
  )}
981
979
 
982
- {/* Final Transcripts */}
980
+ {/* Committed Transcripts */}
983
981
  <div>
984
- <h2>Transcripts ({scribe.finalTranscripts.length})</h2>
985
- {scribe.finalTranscripts.map((t) => (
982
+ <h2>Transcripts ({scribe.committedTranscripts.length})</h2>
983
+ {scribe.committedTranscripts.map((t) => (
986
984
  <div key={t.id}>
987
985
  <span>{new Date(t.timestamp).toLocaleTimeString()}</span>
988
986
  <p>{t.text}</p>
@@ -1012,7 +1010,7 @@ import {
1012
1010
  } from "@elevenlabs/react";
1013
1011
 
1014
1012
  const scribe: UseScribeReturn = useScribe({
1015
- modelId: "scribe_realtime_v2",
1013
+ modelId: "scribe_v2_realtime",
1016
1014
  microphone: {
1017
1015
  echoCancellation: true,
1018
1016
  },
package/dist/lib.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("react"),n=require("@elevenlabs/client");function t(){return t=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},t.apply(null,arguments)}var r=["micMuted","volume","serverLocation"];function o(e){switch(void 0===e&&(e="us"),e){case"eu-residency":case"in-residency":case"us":case"global":return e;default:return console.warn("[ConversationalAI] Invalid server-location: "+e+'. Defaulting to "us"'),"us"}}function i(e){return{us:"wss://api.elevenlabs.io","eu-residency":"wss://api.eu.residency.elevenlabs.io","in-residency":"wss://api.in.residency.elevenlabs.io",global:"wss://api.elevenlabs.io"}[e]}function u(e){return{us:"wss://livekit.rtc.elevenlabs.io","eu-residency":"wss://livekit.rtc.eu.residency.elevenlabs.io","in-residency":"wss://livekit.rtc.in.residency.elevenlabs.io",global:"wss://livekit.rtc.elevenlabs.io"}[e]}Object.defineProperty(exports,"AudioFormat",{enumerable:!0,get:function(){return n.AudioFormat}}),Object.defineProperty(exports,"CommitStrategy",{enumerable:!0,get:function(){return n.CommitStrategy}}),Object.defineProperty(exports,"RealtimeEvents",{enumerable:!0,get:function(){return n.RealtimeEvents}}),Object.defineProperty(exports,"postOverallFeedback",{enumerable:!0,get:function(){return n.postOverallFeedback}}),exports.getLivekitUrlForLocation=u,exports.getOriginForLocation=i,exports.parseLocation=o,exports.useConversation=function(l){void 0===l&&(l={});var a=l.micMuted,c=l.volume,s=l.serverLocation,d=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}(l,r),v=e.useRef(null),f=e.useRef(null),m=e.useState("disconnected"),h=m[0],g=m[1],p=e.useState(!1),S=p[0],C=p[1],b=e.useState("listening"),y=b[0],M=b[1],T=e.useRef(a),R=e.useRef(c);return T.current=a,R.current=c,e.useEffect(function(){var e;void 0!==a&&(null==v||null==(e=v.current)||e.setMicMuted(a))},[a]),e.useEffect(function(){var e;void 0!==c&&(null==v||null==(e=v.current)||e.setVolume({volume:c}))},[c]),e.useEffect(function(){return function(){var e;null==(e=v.current)||e.endSession()}},[]),{startSession:function(e){try{var r,l,a=function(r){return l?r:function(r,l){try{var a=(I=i(D=o((null==e?void 0:e.serverLocation)||s)),A=u(D),f.current=n.Conversation.startSession(t({},null!=d?d:{},null!=e?e:{},{origin:I,livekitUrl:A,overrides:t({},null!=(c=null==d?void 0:d.overrides)?c:{},null!=(m=null==e?void 0:e.overrides)?m:{},{client:t({},null!=(h=null==d||null==(p=d.overrides)?void 0:p.client)?h:{},null!=(S=null==e||null==(b=e.overrides)?void 0:b.client)?S:{},{source:(null==e||null==(y=e.overrides)||null==(y=y.client)?void 0:y.source)||(null==d||null==(P=d.overrides)||null==(P=P.client)?void 0:P.source)||"react_sdk",version:(null==e||null==(E=e.overrides)||null==(E=E.client)?void 0:E.version)||(null==d||null==(w=d.overrides)||null==(w=w.client)?void 0:w.version)||"0.9.2"})}),onConnect:(null==e?void 0:e.onConnect)||(null==d?void 0:d.onConnect),onDisconnect:(null==e?void 0:e.onDisconnect)||(null==d?void 0:d.onDisconnect),onError:(null==e?void 0:e.onError)||(null==d?void 0:d.onError),onMessage:(null==e?void 0:e.onMessage)||(null==d?void 0:d.onMessage),onAudio:(null==e?void 0:e.onAudio)||(null==d?void 0:d.onAudio),onDebug:(null==e?void 0:e.onDebug)||(null==d?void 0:d.onDebug),onUnhandledClientToolCall:(null==e?void 0:e.onUnhandledClientToolCall)||(null==d?void 0:d.onUnhandledClientToolCall),onVadScore:(null==e?void 0:e.onVadScore)||(null==d?void 0:d.onVadScore),onInterruption:(null==e?void 0:e.onInterruption)||(null==d?void 0:d.onInterruption),onAgentToolResponse:(null==e?void 0:e.onAgentToolResponse)||(null==d?void 0:d.onAgentToolResponse),onConversationMetadata:(null==e?void 0:e.onConversationMetadata)||(null==d?void 0:d.onConversationMetadata),onMCPToolCall:(null==e?void 0:e.onMCPToolCall)||(null==d?void 0:d.onMCPToolCall),onMCPConnectionStatus:(null==e?void 0:e.onMCPConnectionStatus)||(null==d?void 0:d.onMCPConnectionStatus),onAsrInitiationMetadata:(null==e?void 0:e.onAsrInitiationMetadata)||(null==d?void 0:d.onAsrInitiationMetadata),onAgentChatResponsePart:(null==e?void 0:e.onAgentChatResponsePart)||(null==d?void 0:d.onAgentChatResponsePart),onModeChange:function(n){var t,r=n.mode;M(r),null==(t=(null==e?void 0:e.onModeChange)||(null==d?void 0:d.onModeChange))||t({mode:r})},onStatusChange:function(n){var t,r=n.status;g(r),null==(t=(null==e?void 0:e.onStatusChange)||(null==d?void 0:d.onStatusChange))||t({status:r})},onCanSendFeedbackChange:function(n){var t,r=n.canSendFeedback;C(r),null==(t=(null==e?void 0:e.onCanSendFeedbackChange)||(null==d?void 0:d.onCanSendFeedbackChange))||t({canSendFeedback:r})}})),Promise.resolve(f.current).then(function(e){return v.current=e,void 0!==T.current&&v.current.setMicMuted(T.current),void 0!==R.current&&v.current.setVolume({volume:R.current}),v.current.getId()}))}catch(e){return l(!0,e)}var c,m,h,p,S,b,y,P,E,w,D,I,A;return a&&a.then?a.then(l.bind(null,!1),l.bind(null,!0)):l(!1,a)}(0,function(e,n){if(f.current=null,e)throw n;return n})};if(null!=(r=v.current)&&r.isOpen())return Promise.resolve(v.current.getId());var c=function(){if(f.current)return Promise.resolve(f.current).then(function(e){var n=e.getId();return l=1,n})}();return Promise.resolve(c&&c.then?c.then(a):a(c))}catch(e){return Promise.reject(e)}},endSession:function(){try{var e=v.current;return v.current=null,Promise.resolve(null==e?void 0:e.endSession()).then(function(){})}catch(e){return Promise.reject(e)}},setVolume:function(e){var n;null==(n=v.current)||n.setVolume({volume:e.volume})},getInputByteFrequencyData:function(){var e;return null==(e=v.current)?void 0:e.getInputByteFrequencyData()},getOutputByteFrequencyData:function(){var e;return null==(e=v.current)?void 0:e.getOutputByteFrequencyData()},getInputVolume:function(){var e,n;return null!=(e=null==(n=v.current)?void 0:n.getInputVolume())?e:0},getOutputVolume:function(){var e,n;return null!=(e=null==(n=v.current)?void 0:n.getOutputVolume())?e:0},sendFeedback:function(e){var n;null==(n=v.current)||n.sendFeedback(e)},getId:function(){var e;return null==(e=v.current)?void 0:e.getId()},sendContextualUpdate:function(e){var n;null==(n=v.current)||n.sendContextualUpdate(e)},sendUserMessage:function(e){var n;null==(n=v.current)||n.sendUserMessage(e)},sendUserActivity:function(){var e;null==(e=v.current)||e.sendUserActivity()},sendMCPToolApprovalResult:function(e,n){var t;null==(t=v.current)||t.sendMCPToolApprovalResult(e,n)},changeInputDevice:function(e){try{var n,t=function(e){if(n)return e;throw new Error("Device switching is only available for voice conversations")},r=function(){if(v.current&&"changeInputDevice"in v.current)return Promise.resolve(v.current.changeInputDevice(e)).then(function(e){return n=1,e})}();return Promise.resolve(r&&r.then?r.then(t):t(r))}catch(e){return Promise.reject(e)}},changeOutputDevice:function(e){try{var n,t=function(e){if(n)return e;throw new Error("Device switching is only available for voice conversations")},r=function(){if(v.current&&"changeOutputDevice"in v.current)return Promise.resolve(v.current.changeOutputDevice(e)).then(function(e){return n=1,e})}();return Promise.resolve(r&&r.then?r.then(t):t(r))}catch(e){return Promise.reject(e)}},status:h,canSendFeedback:S,micMuted:a,isSpeaking:"speaking"===y}},exports.useScribe=function(r){void 0===r&&(r={});var o=r.onSessionStarted,i=r.onPartialTranscript,u=r.onFinalTranscript,l=r.onFinalTranscriptWithTimestamps,a=r.onError,c=r.onAuthError,s=r.onConnect,d=r.onDisconnect,v=r.token,f=r.modelId,m=r.baseUri,h=r.commitStrategy,g=r.vadSilenceThresholdSecs,p=r.vadThreshold,S=r.minSpeechDurationMs,C=r.minSilenceDurationMs,b=r.languageCode,y=r.microphone,M=r.audioFormat,T=r.sampleRate,R=r.autoConnect,P=void 0!==R&&R,E=e.useRef(null),w=e.useState("disconnected"),D=w[0],I=w[1],A=e.useState(""),k=A[0],F=A[1],O=e.useState([]),x=O[0],U=O[1],j=e.useState(null),L=j[0],V=j[1];e.useEffect(function(){return function(){var e;null==(e=E.current)||e.close()}},[]);var N=e.useCallback(function(e){void 0===e&&(e={});try{if(E.current)return console.warn("Already connected"),Promise.resolve();try{I("connecting"),V(null);var t=e.token||v,r=e.modelId||f;if(!t)throw new Error("Token is required");if(!r)throw new Error("Model ID is required");var R,P=e.microphone||y,w=e.audioFormat||M,D=e.sampleRate||T;if(P)R=n.Scribe.connect({token:t,modelId:r,baseUri:e.baseUri||m,commitStrategy:e.commitStrategy||h,vadSilenceThresholdSecs:e.vadSilenceThresholdSecs||g,vadThreshold:e.vadThreshold||p,minSpeechDurationMs:e.minSpeechDurationMs||S,minSilenceDurationMs:e.minSilenceDurationMs||C,languageCode:e.languageCode||b,microphone:P});else{if(!w||!D)throw new Error("Either microphone options or (audioFormat + sampleRate) must be provided");R=n.Scribe.connect({token:t,modelId:r,baseUri:e.baseUri||m,commitStrategy:e.commitStrategy||h,vadSilenceThresholdSecs:e.vadSilenceThresholdSecs||g,vadThreshold:e.vadThreshold||p,minSpeechDurationMs:e.minSpeechDurationMs||S,minSilenceDurationMs:e.minSilenceDurationMs||C,languageCode:e.languageCode||b,audioFormat:w,sampleRate:D})}E.current=R,R.on(n.RealtimeEvents.SESSION_STARTED,function(){I("connected"),null==o||o()}),R.on(n.RealtimeEvents.PARTIAL_TRANSCRIPT,function(e){var n=e;F(n.text),I("transcribing"),null==i||i(n)}),R.on(n.RealtimeEvents.FINAL_TRANSCRIPT,function(e){var n=e,t={id:Date.now()+"-"+Math.random(),text:n.text,timestamp:Date.now(),isFinal:!0};U(function(e){return[].concat(e,[t])}),F(""),null==u||u(n)}),R.on(n.RealtimeEvents.FINAL_TRANSCRIPT_WITH_TIMESTAMPS,function(e){var n=e,t={id:Date.now()+"-"+Math.random(),text:n.text,timestamp:Date.now(),isFinal:!0};U(function(e){return[].concat(e,[t])}),F(""),null==l||l(n)}),R.on(n.RealtimeEvents.ERROR,function(e){var n=e;V(n.error),I("error"),null==a||a(new Error(n.error))}),R.on(n.RealtimeEvents.AUTH_ERROR,function(e){var n=e;V(n.error),I("error"),null==c||c(n)}),R.on(n.RealtimeEvents.OPEN,function(){null==s||s()}),R.on(n.RealtimeEvents.CLOSE,function(){I("disconnected"),E.current=null,null==d||d()})}catch(e){var A=e instanceof Error?e.message:"Failed to connect";throw V(A),I("error"),e}return Promise.resolve()}catch(e){return Promise.reject(e)}},[v,f,m,h,g,p,S,C,b,y,M,T,o,i,u,l,a,c,s,d]),q=e.useCallback(function(){var e;null==(e=E.current)||e.close(),E.current=null,I("disconnected")},[]),_=e.useCallback(function(e,n){if(!E.current)throw new Error("Not connected to Scribe");E.current.send(t({audioBase64:e},n))},[]),B=e.useCallback(function(){if(!E.current)throw new Error("Not connected to Scribe");E.current.commit()},[]),H=e.useCallback(function(){U([]),F("")},[]),W=e.useCallback(function(){return E.current},[]);return e.useEffect(function(){P&&N()},[P,N]),{status:D,isConnected:"connected"===D||"transcribing"===D,isTranscribing:"transcribing"===D,partialTranscript:k,finalTranscripts:x,error:L,connect:N,disconnect:q,sendAudio:_,commit:B,clearTranscripts:H,getConnection:W}};
1
+ var e=require("react"),n=require("@elevenlabs/client");function t(){return t=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},t.apply(null,arguments)}var r=["micMuted","volume","serverLocation"];function o(e){switch(void 0===e&&(e="us"),e){case"eu-residency":case"in-residency":case"us":case"global":return e;default:return console.warn("[ConversationalAI] Invalid server-location: "+e+'. Defaulting to "us"'),"us"}}function i(e){return{us:"wss://api.elevenlabs.io","eu-residency":"wss://api.eu.residency.elevenlabs.io","in-residency":"wss://api.in.residency.elevenlabs.io",global:"wss://api.elevenlabs.io"}[e]}function u(e){return{us:"wss://livekit.rtc.elevenlabs.io","eu-residency":"wss://livekit.rtc.eu.residency.elevenlabs.io","in-residency":"wss://livekit.rtc.in.residency.elevenlabs.io",global:"wss://livekit.rtc.elevenlabs.io"}[e]}Object.defineProperty(exports,"AudioFormat",{enumerable:!0,get:function(){return n.AudioFormat}}),Object.defineProperty(exports,"CommitStrategy",{enumerable:!0,get:function(){return n.CommitStrategy}}),Object.defineProperty(exports,"RealtimeEvents",{enumerable:!0,get:function(){return n.RealtimeEvents}}),Object.defineProperty(exports,"postOverallFeedback",{enumerable:!0,get:function(){return n.postOverallFeedback}}),exports.getLivekitUrlForLocation=u,exports.getOriginForLocation=i,exports.parseLocation=o,exports.useConversation=function(l){void 0===l&&(l={});var c=l.micMuted,a=l.volume,s=l.serverLocation,d=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}(l,r),v=e.useRef(null),f=e.useRef(null),m=e.useState("disconnected"),h=m[0],g=m[1],p=e.useState(!1),S=p[0],C=p[1],b=e.useState("listening"),M=b[0],T=b[1],y=e.useRef(c),R=e.useRef(a);return y.current=c,R.current=a,e.useEffect(function(){var e;void 0!==c&&(null==v||null==(e=v.current)||e.setMicMuted(c))},[c]),e.useEffect(function(){var e;void 0!==a&&(null==v||null==(e=v.current)||e.setVolume({volume:a}))},[a]),e.useEffect(function(){return function(){var e;null==(e=v.current)||e.endSession()}},[]),{startSession:function(e){try{var r,l,c=function(r){return l?r:function(r,l){try{var c=(I=i(w=o((null==e?void 0:e.serverLocation)||s)),k=u(w),f.current=n.Conversation.startSession(t({},null!=d?d:{},null!=e?e:{},{origin:I,livekitUrl:k,overrides:t({},null!=(a=null==d?void 0:d.overrides)?a:{},null!=(m=null==e?void 0:e.overrides)?m:{},{client:t({},null!=(h=null==d||null==(p=d.overrides)?void 0:p.client)?h:{},null!=(S=null==e||null==(b=e.overrides)?void 0:b.client)?S:{},{source:(null==e||null==(M=e.overrides)||null==(M=M.client)?void 0:M.source)||(null==d||null==(P=d.overrides)||null==(P=P.client)?void 0:P.source)||"react_sdk",version:(null==e||null==(E=e.overrides)||null==(E=E.client)?void 0:E.version)||(null==d||null==(D=d.overrides)||null==(D=D.client)?void 0:D.version)||"0.10.0"})}),onConnect:(null==e?void 0:e.onConnect)||(null==d?void 0:d.onConnect),onDisconnect:(null==e?void 0:e.onDisconnect)||(null==d?void 0:d.onDisconnect),onError:(null==e?void 0:e.onError)||(null==d?void 0:d.onError),onMessage:(null==e?void 0:e.onMessage)||(null==d?void 0:d.onMessage),onAudio:(null==e?void 0:e.onAudio)||(null==d?void 0:d.onAudio),onDebug:(null==e?void 0:e.onDebug)||(null==d?void 0:d.onDebug),onUnhandledClientToolCall:(null==e?void 0:e.onUnhandledClientToolCall)||(null==d?void 0:d.onUnhandledClientToolCall),onVadScore:(null==e?void 0:e.onVadScore)||(null==d?void 0:d.onVadScore),onInterruption:(null==e?void 0:e.onInterruption)||(null==d?void 0:d.onInterruption),onAgentToolResponse:(null==e?void 0:e.onAgentToolResponse)||(null==d?void 0:d.onAgentToolResponse),onConversationMetadata:(null==e?void 0:e.onConversationMetadata)||(null==d?void 0:d.onConversationMetadata),onMCPToolCall:(null==e?void 0:e.onMCPToolCall)||(null==d?void 0:d.onMCPToolCall),onMCPConnectionStatus:(null==e?void 0:e.onMCPConnectionStatus)||(null==d?void 0:d.onMCPConnectionStatus),onAsrInitiationMetadata:(null==e?void 0:e.onAsrInitiationMetadata)||(null==d?void 0:d.onAsrInitiationMetadata),onAgentChatResponsePart:(null==e?void 0:e.onAgentChatResponsePart)||(null==d?void 0:d.onAgentChatResponsePart),onModeChange:function(n){var t,r=n.mode;T(r),null==(t=(null==e?void 0:e.onModeChange)||(null==d?void 0:d.onModeChange))||t({mode:r})},onStatusChange:function(n){var t,r=n.status;g(r),null==(t=(null==e?void 0:e.onStatusChange)||(null==d?void 0:d.onStatusChange))||t({status:r})},onCanSendFeedbackChange:function(n){var t,r=n.canSendFeedback;C(r),null==(t=(null==e?void 0:e.onCanSendFeedbackChange)||(null==d?void 0:d.onCanSendFeedbackChange))||t({canSendFeedback:r})}})),Promise.resolve(f.current).then(function(e){return v.current=e,void 0!==y.current&&v.current.setMicMuted(y.current),void 0!==R.current&&v.current.setVolume({volume:R.current}),v.current.getId()}))}catch(e){return l(!0,e)}var a,m,h,p,S,b,M,P,E,D,w,I,k;return c&&c.then?c.then(l.bind(null,!1),l.bind(null,!0)):l(!1,c)}(0,function(e,n){if(f.current=null,e)throw n;return n})};if(null!=(r=v.current)&&r.isOpen())return Promise.resolve(v.current.getId());var a=function(){if(f.current)return Promise.resolve(f.current).then(function(e){var n=e.getId();return l=1,n})}();return Promise.resolve(a&&a.then?a.then(c):c(a))}catch(e){return Promise.reject(e)}},endSession:function(){try{var e=v.current;return v.current=null,Promise.resolve(null==e?void 0:e.endSession()).then(function(){})}catch(e){return Promise.reject(e)}},setVolume:function(e){var n;null==(n=v.current)||n.setVolume({volume:e.volume})},getInputByteFrequencyData:function(){var e;return null==(e=v.current)?void 0:e.getInputByteFrequencyData()},getOutputByteFrequencyData:function(){var e;return null==(e=v.current)?void 0:e.getOutputByteFrequencyData()},getInputVolume:function(){var e,n;return null!=(e=null==(n=v.current)?void 0:n.getInputVolume())?e:0},getOutputVolume:function(){var e,n;return null!=(e=null==(n=v.current)?void 0:n.getOutputVolume())?e:0},sendFeedback:function(e){var n;null==(n=v.current)||n.sendFeedback(e)},getId:function(){var e;return null==(e=v.current)?void 0:e.getId()},sendContextualUpdate:function(e){var n;null==(n=v.current)||n.sendContextualUpdate(e)},sendUserMessage:function(e){var n;null==(n=v.current)||n.sendUserMessage(e)},sendUserActivity:function(){var e;null==(e=v.current)||e.sendUserActivity()},sendMCPToolApprovalResult:function(e,n){var t;null==(t=v.current)||t.sendMCPToolApprovalResult(e,n)},changeInputDevice:function(e){try{var n,t=function(e){if(n)return e;throw new Error("Device switching is only available for voice conversations")},r=function(){if(v.current&&"changeInputDevice"in v.current)return Promise.resolve(v.current.changeInputDevice(e)).then(function(e){return n=1,e})}();return Promise.resolve(r&&r.then?r.then(t):t(r))}catch(e){return Promise.reject(e)}},changeOutputDevice:function(e){try{var n,t=function(e){if(n)return e;throw new Error("Device switching is only available for voice conversations")},r=function(){if(v.current&&"changeOutputDevice"in v.current)return Promise.resolve(v.current.changeOutputDevice(e)).then(function(e){return n=1,e})}();return Promise.resolve(r&&r.then?r.then(t):t(r))}catch(e){return Promise.reject(e)}},status:h,canSendFeedback:S,micMuted:c,isSpeaking:"speaking"===M}},exports.useScribe=function(r){void 0===r&&(r={});var o=r.onSessionStarted,i=r.onPartialTranscript,u=r.onCommittedTranscript,l=r.onCommittedTranscriptWithTimestamps,c=r.onError,a=r.onAuthError,s=r.onConnect,d=r.onDisconnect,v=r.token,f=r.modelId,m=r.baseUri,h=r.commitStrategy,g=r.vadSilenceThresholdSecs,p=r.vadThreshold,S=r.minSpeechDurationMs,C=r.minSilenceDurationMs,b=r.languageCode,M=r.microphone,T=r.audioFormat,y=r.sampleRate,R=r.autoConnect,P=void 0!==R&&R,E=e.useRef(null),D=e.useState("disconnected"),w=D[0],I=D[1],k=e.useState(""),A=k[0],O=k[1],F=e.useState([]),x=F[0],U=F[1],j=e.useState(null),V=j[0],L=j[1];e.useEffect(function(){return function(){var e;null==(e=E.current)||e.close()}},[]);var q=e.useCallback(function(e){void 0===e&&(e={});try{if(E.current)return console.warn("Already connected"),Promise.resolve();try{I("connecting"),L(null);var t=e.token||v,r=e.modelId||f;if(!t)throw new Error("Token is required");if(!r)throw new Error("Model ID is required");var R,P=e.microphone||M,D=e.audioFormat||T,w=e.sampleRate||y;if(P)R=n.Scribe.connect({token:t,modelId:r,baseUri:e.baseUri||m,commitStrategy:e.commitStrategy||h,vadSilenceThresholdSecs:e.vadSilenceThresholdSecs||g,vadThreshold:e.vadThreshold||p,minSpeechDurationMs:e.minSpeechDurationMs||S,minSilenceDurationMs:e.minSilenceDurationMs||C,languageCode:e.languageCode||b,microphone:P});else{if(!D||!w)throw new Error("Either microphone options or (audioFormat + sampleRate) must be provided");R=n.Scribe.connect({token:t,modelId:r,baseUri:e.baseUri||m,commitStrategy:e.commitStrategy||h,vadSilenceThresholdSecs:e.vadSilenceThresholdSecs||g,vadThreshold:e.vadThreshold||p,minSpeechDurationMs:e.minSpeechDurationMs||S,minSilenceDurationMs:e.minSilenceDurationMs||C,languageCode:e.languageCode||b,audioFormat:D,sampleRate:w})}E.current=R,R.on(n.RealtimeEvents.SESSION_STARTED,function(){I("connected"),null==o||o()}),R.on(n.RealtimeEvents.PARTIAL_TRANSCRIPT,function(e){var n=e;O(n.text),I("transcribing"),null==i||i(n)}),R.on(n.RealtimeEvents.COMMITTED_TRANSCRIPT,function(e){var n=e,t={id:Date.now()+"-"+Math.random(),text:n.text,timestamp:Date.now(),isFinal:!0};U(function(e){return[].concat(e,[t])}),O(""),null==u||u(n)}),R.on(n.RealtimeEvents.COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS,function(e){var n=e,t={id:Date.now()+"-"+Math.random(),text:n.text,timestamp:Date.now(),isFinal:!0};U(function(e){return[].concat(e,[t])}),O(""),null==l||l(n)}),R.on(n.RealtimeEvents.ERROR,function(e){var n=e;L(n.error),I("error"),null==c||c(new Error(n.error))}),R.on(n.RealtimeEvents.AUTH_ERROR,function(e){var n=e;L(n.error),I("error"),null==a||a(n)}),R.on(n.RealtimeEvents.OPEN,function(){null==s||s()}),R.on(n.RealtimeEvents.CLOSE,function(){I("disconnected"),E.current=null,null==d||d()})}catch(e){var k=e instanceof Error?e.message:"Failed to connect";throw L(k),I("error"),e}return Promise.resolve()}catch(e){return Promise.reject(e)}},[v,f,m,h,g,p,S,C,b,M,T,y,o,i,u,l,c,a,s,d]),_=e.useCallback(function(){var e;null==(e=E.current)||e.close(),E.current=null,I("disconnected")},[]),N=e.useCallback(function(e,n){if(!E.current)throw new Error("Not connected to Scribe");E.current.send(t({audioBase64:e},n))},[]),B=e.useCallback(function(){if(!E.current)throw new Error("Not connected to Scribe");E.current.commit()},[]),H=e.useCallback(function(){U([]),O("")},[]),W=e.useCallback(function(){return E.current},[]);return e.useEffect(function(){P&&q()},[P,q]),{status:w,isConnected:"connected"===w||"transcribing"===w,isTranscribing:"transcribing"===w,partialTranscript:A,committedTranscripts:x,error:V,connect:q,disconnect:_,sendAudio:N,commit:B,clearTranscripts:H,getConnection:W}};
2
2
  //# sourceMappingURL=lib.cjs.map
package/dist/lib.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.cjs","sources":["../src/index.ts","../src/version.ts","../src/scribe.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport {\n Conversation,\n type SessionConfig,\n type Options,\n type ClientToolsConfig,\n type InputConfig,\n type AudioWorkletConfig,\n type OutputConfig,\n type FormatConfig,\n type Mode,\n type Status,\n type Callbacks,\n} from \"@elevenlabs/client\";\n\n// Device configuration types for audio device switching\nexport type DeviceFormatConfig = {\n format: \"pcm\" | \"ulaw\";\n sampleRate: number;\n outputDeviceId?: string;\n};\n\nexport type DeviceInputConfig = {\n preferHeadphonesForIosDevices?: boolean;\n inputDeviceId?: string;\n};\n\nimport { PACKAGE_VERSION } from \"./version\";\n\nexport type Location = \"us\" | \"global\" | \"eu-residency\" | \"in-residency\";\n\nexport function parseLocation(location: string = \"us\"): Location {\n switch (location) {\n case \"eu-residency\":\n case \"in-residency\":\n case \"us\":\n case \"global\":\n return location;\n default:\n console.warn(\n `[ConversationalAI] Invalid server-location: ${location}. Defaulting to \"us\"`\n );\n return \"us\";\n }\n}\n\nexport function getOriginForLocation(location: Location): string {\n const originMap: Record<Location, string> = {\n us: \"wss://api.elevenlabs.io\",\n \"eu-residency\": \"wss://api.eu.residency.elevenlabs.io\",\n \"in-residency\": \"wss://api.in.residency.elevenlabs.io\",\n global: \"wss://api.elevenlabs.io\",\n };\n\n return originMap[location];\n}\n\nexport function getLivekitUrlForLocation(location: Location): string {\n const livekitUrlMap: Record<Location, string> = {\n us: \"wss://livekit.rtc.elevenlabs.io\",\n \"eu-residency\": \"wss://livekit.rtc.eu.residency.elevenlabs.io\",\n \"in-residency\": \"wss://livekit.rtc.in.residency.elevenlabs.io\",\n global: \"wss://livekit.rtc.elevenlabs.io\",\n };\n\n return livekitUrlMap[location];\n}\n\nexport type {\n Role,\n Mode,\n Status,\n SessionConfig,\n DisconnectionDetails,\n Language,\n VadScoreEvent,\n InputConfig,\n FormatConfig,\n VoiceConversation,\n TextConversation,\n Callbacks,\n} from \"@elevenlabs/client\";\nexport { postOverallFeedback } from \"@elevenlabs/client\";\n\n// Scribe exports\nexport {\n useScribe,\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"./scribe\";\nexport type {\n ScribeStatus,\n TranscriptSegment,\n ScribeCallbacks,\n ScribeHookOptions,\n UseScribeReturn,\n RealtimeConnection,\n} from \"./scribe\";\n\nexport type HookOptions = Partial<\n SessionConfig &\n HookCallbacks &\n ClientToolsConfig &\n InputConfig &\n OutputConfig &\n AudioWorkletConfig &\n FormatConfig & {\n serverLocation?: Location | string;\n }\n>;\nexport type ControlledState = {\n micMuted?: boolean;\n volume?: number;\n};\nexport type HookCallbacks = Pick<\n Callbacks,\n | \"onConnect\"\n | \"onDisconnect\"\n | \"onError\"\n | \"onMessage\"\n | \"onAudio\"\n | \"onModeChange\"\n | \"onStatusChange\"\n | \"onCanSendFeedbackChange\"\n | \"onDebug\"\n | \"onUnhandledClientToolCall\"\n | \"onVadScore\"\n | \"onInterruption\"\n | \"onAgentToolResponse\"\n | \"onConversationMetadata\"\n | \"onMCPToolCall\"\n | \"onMCPConnectionStatus\"\n | \"onAsrInitiationMetadata\"\n | \"onAgentChatResponsePart\"\n>;\n\nexport function useConversation<T extends HookOptions & ControlledState>(\n props: T = {} as T\n) {\n const { micMuted, volume, serverLocation, ...defaultOptions } = props;\n const conversationRef = useRef<Conversation | null>(null);\n const lockRef = useRef<Promise<Conversation> | null>(null);\n const [status, setStatus] = useState<Status>(\"disconnected\");\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n const [mode, setMode] = useState<Mode>(\"listening\");\n\n const micMutedRef = useRef<boolean | undefined>(micMuted);\n const volumeRef = useRef<number | undefined>(volume);\n\n micMutedRef.current = micMuted;\n volumeRef.current = volume;\n\n useEffect(() => {\n if (micMuted !== undefined) {\n conversationRef?.current?.setMicMuted(micMuted);\n }\n }, [micMuted]);\n\n useEffect(() => {\n if (volume !== undefined) {\n conversationRef?.current?.setVolume({ volume });\n }\n }, [volume]);\n\n useEffect(() => {\n return () => {\n conversationRef.current?.endSession();\n };\n }, []);\n\n return {\n startSession: (async (options?: HookOptions) => {\n if (conversationRef.current?.isOpen()) {\n return conversationRef.current.getId();\n }\n\n if (lockRef.current) {\n const conversation = await lockRef.current;\n return conversation.getId();\n }\n\n try {\n const resolvedServerLocation = parseLocation(\n options?.serverLocation || serverLocation\n );\n const origin = getOriginForLocation(resolvedServerLocation);\n const livekitUrl = getLivekitUrlForLocation(resolvedServerLocation);\n\n lockRef.current = Conversation.startSession({\n ...(defaultOptions ?? {}),\n ...(options ?? {}),\n origin,\n livekitUrl,\n overrides: {\n ...(defaultOptions?.overrides ?? {}),\n ...(options?.overrides ?? {}),\n client: {\n ...(defaultOptions?.overrides?.client ?? {}),\n ...(options?.overrides?.client ?? {}),\n source:\n options?.overrides?.client?.source ||\n defaultOptions?.overrides?.client?.source ||\n \"react_sdk\",\n version:\n options?.overrides?.client?.version ||\n defaultOptions?.overrides?.client?.version ||\n PACKAGE_VERSION,\n },\n },\n // Pass through user-provided callbacks\n onConnect: options?.onConnect || defaultOptions?.onConnect,\n onDisconnect: options?.onDisconnect || defaultOptions?.onDisconnect,\n onError: options?.onError || defaultOptions?.onError,\n onMessage: options?.onMessage || defaultOptions?.onMessage,\n onAudio: options?.onAudio || defaultOptions?.onAudio,\n onDebug: options?.onDebug || defaultOptions?.onDebug,\n onUnhandledClientToolCall:\n options?.onUnhandledClientToolCall ||\n defaultOptions?.onUnhandledClientToolCall,\n onVadScore: options?.onVadScore || defaultOptions?.onVadScore,\n onInterruption:\n options?.onInterruption || defaultOptions?.onInterruption,\n onAgentToolResponse:\n options?.onAgentToolResponse || defaultOptions?.onAgentToolResponse,\n onConversationMetadata:\n options?.onConversationMetadata ||\n defaultOptions?.onConversationMetadata,\n onMCPToolCall:\n options?.onMCPToolCall || defaultOptions?.onMCPToolCall,\n onMCPConnectionStatus:\n options?.onMCPConnectionStatus ||\n defaultOptions?.onMCPConnectionStatus,\n onAsrInitiationMetadata:\n options?.onAsrInitiationMetadata ||\n defaultOptions?.onAsrInitiationMetadata,\n onAgentChatResponsePart:\n options?.onAgentChatResponsePart ||\n defaultOptions?.onAgentChatResponsePart,\n onModeChange: ({ mode }) => {\n setMode(mode);\n (options?.onModeChange || defaultOptions?.onModeChange)?.({ mode });\n },\n onStatusChange: ({ status }) => {\n setStatus(status);\n (options?.onStatusChange || defaultOptions?.onStatusChange)?.({\n status,\n });\n },\n onCanSendFeedbackChange: ({ canSendFeedback }) => {\n setCanSendFeedback(canSendFeedback);\n (\n options?.onCanSendFeedbackChange ||\n defaultOptions?.onCanSendFeedbackChange\n )?.({ canSendFeedback });\n },\n } as Options);\n\n conversationRef.current = await lockRef.current;\n // Persist controlled state between sessions using refs to get current values\n if (micMutedRef.current !== undefined) {\n conversationRef.current.setMicMuted(micMutedRef.current);\n }\n if (volumeRef.current !== undefined) {\n conversationRef.current.setVolume({ volume: volumeRef.current });\n }\n\n return conversationRef.current.getId();\n } finally {\n lockRef.current = null;\n }\n }) as T extends SessionConfig\n ? (options?: HookOptions) => Promise<string>\n : (options: SessionConfig & HookOptions) => Promise<string>,\n endSession: async () => {\n const conversation = conversationRef.current;\n conversationRef.current = null;\n await conversation?.endSession();\n },\n setVolume: ({ volume }: { volume: number }) => {\n conversationRef.current?.setVolume({ volume });\n },\n getInputByteFrequencyData: () => {\n return conversationRef.current?.getInputByteFrequencyData();\n },\n getOutputByteFrequencyData: () => {\n return conversationRef.current?.getOutputByteFrequencyData();\n },\n getInputVolume: () => {\n return conversationRef.current?.getInputVolume() ?? 0;\n },\n getOutputVolume: () => {\n return conversationRef.current?.getOutputVolume() ?? 0;\n },\n sendFeedback: (like: boolean) => {\n conversationRef.current?.sendFeedback(like);\n },\n getId: () => {\n return conversationRef.current?.getId();\n },\n sendContextualUpdate: (text: string) => {\n conversationRef.current?.sendContextualUpdate(text);\n },\n sendUserMessage: (text: string) => {\n conversationRef.current?.sendUserMessage(text);\n },\n sendUserActivity: () => {\n conversationRef.current?.sendUserActivity();\n },\n sendMCPToolApprovalResult: (toolCallId: string, isApproved: boolean) => {\n conversationRef.current?.sendMCPToolApprovalResult(\n toolCallId,\n isApproved\n );\n },\n changeInputDevice: async (\n config: DeviceFormatConfig & DeviceInputConfig\n ) => {\n if (\n conversationRef.current &&\n \"changeInputDevice\" in conversationRef.current\n ) {\n return await (\n conversationRef.current as unknown as {\n changeInputDevice: (config: any) => Promise<any>;\n }\n ).changeInputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n changeOutputDevice: async (config: DeviceFormatConfig) => {\n if (\n conversationRef.current &&\n \"changeOutputDevice\" in conversationRef.current\n ) {\n return await (\n conversationRef.current as unknown as {\n changeOutputDevice: (config: any) => Promise<any>;\n }\n ).changeOutputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n status,\n canSendFeedback,\n micMuted,\n isSpeaking: mode === \"speaking\",\n };\n}\n\n// const con = useConversation({agentId: \"\"})\n","// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.9.2\";\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport { Scribe, RealtimeEvents } from \"@elevenlabs/client\";\nimport type {\n RealtimeConnection,\n AudioOptions,\n MicrophoneOptions,\n AudioFormat,\n CommitStrategy,\n PartialTranscriptMessage,\n FinalTranscriptMessage,\n FinalTranscriptWithTimestampsMessage,\n ScribeErrorMessage,\n ScribeAuthErrorMessage,\n} from \"@elevenlabs/client\";\n\n// ============= Types =============\n\nexport type ScribeStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"transcribing\"\n | \"error\";\n\nexport interface TranscriptSegment {\n id: string;\n text: string;\n timestamp: number;\n isFinal: boolean;\n}\n\nexport interface ScribeCallbacks {\n onSessionStarted?: () => void;\n onPartialTranscript?: (data: { text: string }) => void;\n onFinalTranscript?: (data: { text: string }) => void;\n onFinalTranscriptWithTimestamps?: (data: {\n text: string;\n timestamps?: { start: number; end: number }[];\n }) => void;\n onError?: (error: Error | Event) => void;\n onAuthError?: (data: { error: string }) => void;\n onConnect?: () => void;\n onDisconnect?: () => void;\n}\n\nexport interface ScribeHookOptions extends ScribeCallbacks {\n // Connection options\n token?: string;\n modelId?: string;\n baseUri?: string;\n\n // VAD options\n commitStrategy?: CommitStrategy;\n vadSilenceThresholdSecs?: number;\n vadThreshold?: number;\n minSpeechDurationMs?: number;\n minSilenceDurationMs?: number;\n languageCode?: string;\n\n // Microphone options (for automatic microphone mode)\n microphone?: {\n deviceId?: string;\n echoCancellation?: boolean;\n noiseSuppression?: boolean;\n autoGainControl?: boolean;\n channelCount?: number;\n };\n\n // Manual audio options\n audioFormat?: AudioFormat;\n sampleRate?: number;\n\n // Auto-connect on mount\n autoConnect?: boolean;\n}\n\nexport interface UseScribeReturn {\n // State\n status: ScribeStatus;\n isConnected: boolean;\n isTranscribing: boolean;\n partialTranscript: string;\n finalTranscripts: TranscriptSegment[];\n error: string | null;\n\n // Connection methods\n connect: (options?: Partial<ScribeHookOptions>) => Promise<void>;\n disconnect: () => void;\n\n // Audio methods (for manual mode)\n sendAudio: (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number }\n ) => void;\n commit: () => void;\n\n // Utility methods\n clearTranscripts: () => void;\n getConnection: () => RealtimeConnection | null;\n}\n\n// ============= Hook Implementation =============\n\nexport function useScribe(options: ScribeHookOptions = {}): UseScribeReturn {\n const {\n // Callbacks\n onSessionStarted,\n onPartialTranscript,\n onFinalTranscript,\n onFinalTranscriptWithTimestamps,\n onError,\n onAuthError,\n onConnect,\n onDisconnect,\n\n // Connection options\n token: defaultToken,\n modelId: defaultModelId,\n baseUri: defaultBaseUri,\n commitStrategy: defaultCommitStrategy,\n vadSilenceThresholdSecs: defaultVadSilenceThresholdSecs,\n vadThreshold: defaultVadThreshold,\n minSpeechDurationMs: defaultMinSpeechDurationMs,\n minSilenceDurationMs: defaultMinSilenceDurationMs,\n languageCode: defaultLanguageCode,\n\n // Mode options\n microphone: defaultMicrophone,\n audioFormat: defaultAudioFormat,\n sampleRate: defaultSampleRate,\n\n // Auto-connect\n autoConnect = false,\n } = options;\n\n const connectionRef = useRef<RealtimeConnection | null>(null);\n\n const [status, setStatus] = useState<ScribeStatus>(\"disconnected\");\n const [partialTranscript, setPartialTranscript] = useState<string>(\"\");\n const [finalTranscripts, setFinalTranscripts] = useState<TranscriptSegment[]>(\n []\n );\n const [error, setError] = useState<string | null>(null);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n connectionRef.current?.close();\n };\n }, []);\n\n const connect = useCallback(\n async (runtimeOptions: Partial<ScribeHookOptions> = {}) => {\n if (connectionRef.current) {\n console.warn(\"Already connected\");\n return;\n }\n\n try {\n setStatus(\"connecting\");\n setError(null);\n\n // Merge default options with runtime options\n const token = runtimeOptions.token || defaultToken;\n const modelId = runtimeOptions.modelId || defaultModelId;\n\n if (!token) {\n throw new Error(\"Token is required\");\n }\n if (!modelId) {\n throw new Error(\"Model ID is required\");\n }\n\n // Determine mode: microphone or manual\n const microphone = runtimeOptions.microphone || defaultMicrophone;\n const audioFormat = runtimeOptions.audioFormat || defaultAudioFormat;\n const sampleRate = runtimeOptions.sampleRate || defaultSampleRate;\n\n let connection: RealtimeConnection;\n\n if (microphone) {\n // Microphone mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n microphone,\n } as MicrophoneOptions);\n } else if (audioFormat && sampleRate) {\n // Manual audio mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n audioFormat,\n sampleRate,\n } as AudioOptions);\n } else {\n throw new Error(\n \"Either microphone options or (audioFormat + sampleRate) must be provided\"\n );\n }\n\n connectionRef.current = connection;\n\n // Set up event listeners\n connection.on(RealtimeEvents.SESSION_STARTED, () => {\n setStatus(\"connected\");\n onSessionStarted?.();\n });\n\n connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data: unknown) => {\n const message = data as PartialTranscriptMessage;\n setPartialTranscript(message.text);\n setStatus(\"transcribing\");\n onPartialTranscript?.(message);\n });\n\n connection.on(RealtimeEvents.FINAL_TRANSCRIPT, (data: unknown) => {\n const message = data as FinalTranscriptMessage;\n const segment: TranscriptSegment = {\n id: `${Date.now()}-${Math.random()}`,\n text: message.text,\n timestamp: Date.now(),\n isFinal: true,\n };\n setFinalTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onFinalTranscript?.(message);\n });\n\n connection.on(\n RealtimeEvents.FINAL_TRANSCRIPT_WITH_TIMESTAMPS,\n (data: unknown) => {\n const message = data as FinalTranscriptWithTimestampsMessage;\n const segment: TranscriptSegment = {\n id: `${Date.now()}-${Math.random()}`,\n text: message.text,\n timestamp: Date.now(),\n isFinal: true,\n };\n setFinalTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onFinalTranscriptWithTimestamps?.(message);\n }\n );\n\n connection.on(RealtimeEvents.ERROR, (err: unknown) => {\n const message = err as ScribeErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onError?.(new Error(message.error));\n });\n\n connection.on(RealtimeEvents.AUTH_ERROR, (data: unknown) => {\n const message = data as ScribeAuthErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onAuthError?.(message);\n });\n\n connection.on(RealtimeEvents.OPEN, () => {\n onConnect?.();\n });\n\n connection.on(RealtimeEvents.CLOSE, () => {\n setStatus(\"disconnected\");\n connectionRef.current = null;\n onDisconnect?.();\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to connect\";\n setError(errorMessage);\n setStatus(\"error\");\n throw err;\n }\n },\n [\n defaultToken,\n defaultModelId,\n defaultBaseUri,\n defaultCommitStrategy,\n defaultVadSilenceThresholdSecs,\n defaultVadThreshold,\n defaultMinSpeechDurationMs,\n defaultMinSilenceDurationMs,\n defaultLanguageCode,\n defaultMicrophone,\n defaultAudioFormat,\n defaultSampleRate,\n onSessionStarted,\n onPartialTranscript,\n onFinalTranscript,\n onFinalTranscriptWithTimestamps,\n onError,\n onAuthError,\n onConnect,\n onDisconnect,\n ]\n );\n\n const disconnect = useCallback(() => {\n connectionRef.current?.close();\n connectionRef.current = null;\n setStatus(\"disconnected\");\n }, []);\n\n const sendAudio = useCallback(\n (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number }\n ) => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.send({ audioBase64, ...options });\n },\n []\n );\n\n const commit = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.commit();\n }, []);\n\n const clearTranscripts = useCallback(() => {\n setFinalTranscripts([]);\n setPartialTranscript(\"\");\n }, []);\n\n const getConnection = useCallback(() => {\n return connectionRef.current;\n }, []);\n\n // Auto-connect if enabled\n useEffect(() => {\n if (autoConnect) {\n connect();\n }\n }, [autoConnect, connect]);\n\n return {\n // State\n status,\n isConnected: status === \"connected\" || status === \"transcribing\",\n isTranscribing: status === \"transcribing\",\n partialTranscript,\n finalTranscripts,\n error,\n\n // Methods\n connect,\n disconnect,\n sendAudio,\n commit,\n clearTranscripts,\n getConnection,\n };\n}\n\n// Export types and enums from client for convenience\nexport {\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"@elevenlabs/client\";\nexport type { RealtimeConnection } from \"@elevenlabs/client\";\n"],"names":["parseLocation","location","console","warn","getOriginForLocation","us","global","getLivekitUrlForLocation","props","micMuted","volume","serverLocation","defaultOptions","_objectWithoutPropertiesLoose","_excluded","conversationRef","useRef","lockRef","_useState","useState","status","setStatus","_useState2","canSendFeedback","setCanSendFeedback","_useState3","mode","setMode","micMutedRef","volumeRef","current","useEffect","_conversationRef$curr","undefined","setMicMuted","_conversationRef$curr2","setVolume","_conversationRef$curr3","endSession","startSession","options","_conversationRef$curr4","_exit","_temp2","_result","origin","resolvedServerLocation","livekitUrl","Conversation","_extends","overrides","_defaultOptions$overr","_options$overrides","client","_defaultOptions$overr2","_defaultOptions$overr3","_options$overrides$cl","_options$overrides2","source","_options$overrides3","_defaultOptions$overr4","version","_options$overrides4","_defaultOptions$overr5","onConnect","onDisconnect","onError","onMessage","onAudio","onDebug","onUnhandledClientToolCall","onVadScore","onInterruption","onAgentToolResponse","onConversationMetadata","onMCPToolCall","onMCPConnectionStatus","onAsrInitiationMetadata","onAgentChatResponsePart","onModeChange","_ref","_ref2","onStatusChange","_ref3","_ref4","onCanSendFeedbackChange","_ref5","_ref6","Promise","resolve","then","_lockRef$current","getId","_finallyRethrows","_wasThrown","_result2","isOpen","_temp","conversation","_conversation$getId","e","reject","_ref7","_conversationRef$curr5","getInputByteFrequencyData","_conversationRef$curr6","getOutputByteFrequencyData","_conversationRef$curr7","getInputVolume","_conversationRef$curr8","_conversationRef$curr9","getOutputVolume","_conversationRef$curr0","_conversationRef$curr1","sendFeedback","like","_conversationRef$curr10","_conversationRef$curr11","sendContextualUpdate","text","_conversationRef$curr12","sendUserMessage","_conversationRef$curr13","sendUserActivity","_conversationRef$curr14","sendMCPToolApprovalResult","toolCallId","isApproved","_conversationRef$curr15","changeInputDevice","config","_temp4","_exit2","_result3","Error","_temp3","_await$conversationRe","changeOutputDevice","_temp6","_exit3","_result4","_temp5","_await$conversationRe2","isSpeaking","onSessionStarted","onPartialTranscript","onFinalTranscript","onFinalTranscriptWithTimestamps","onAuthError","defaultToken","token","defaultModelId","modelId","defaultBaseUri","baseUri","defaultCommitStrategy","commitStrategy","defaultVadSilenceThresholdSecs","vadSilenceThresholdSecs","defaultVadThreshold","vadThreshold","defaultMinSpeechDurationMs","minSpeechDurationMs","defaultMinSilenceDurationMs","minSilenceDurationMs","defaultLanguageCode","languageCode","defaultMicrophone","microphone","defaultAudioFormat","audioFormat","defaultSampleRate","sampleRate","_options$autoConnect","autoConnect","connectionRef","partialTranscript","setPartialTranscript","finalTranscripts","setFinalTranscripts","_useState4","error","setError","_connectionRef$curren","close","connect","useCallback","runtimeOptions","connection","Scribe","on","RealtimeEvents","SESSION_STARTED","PARTIAL_TRANSCRIPT","data","message","FINAL_TRANSCRIPT","segment","id","Date","now","Math","random","timestamp","isFinal","prev","concat","FINAL_TRANSCRIPT_WITH_TIMESTAMPS","ERROR","err","AUTH_ERROR","OPEN","CLOSE","errorMessage","disconnect","_connectionRef$curren2","sendAudio","audioBase64","send","commit","clearTranscripts","getConnection","isConnected","isTranscribing"],"mappings":"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"}
1
+ {"version":3,"file":"lib.cjs","sources":["../src/index.ts","../src/version.ts","../src/scribe.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport {\n Conversation,\n type SessionConfig,\n type Options,\n type ClientToolsConfig,\n type InputConfig,\n type AudioWorkletConfig,\n type OutputConfig,\n type FormatConfig,\n type Mode,\n type Status,\n type Callbacks,\n} from \"@elevenlabs/client\";\n\n// Device configuration types for audio device switching\nexport type DeviceFormatConfig = {\n format: \"pcm\" | \"ulaw\";\n sampleRate: number;\n outputDeviceId?: string;\n};\n\nexport type DeviceInputConfig = {\n preferHeadphonesForIosDevices?: boolean;\n inputDeviceId?: string;\n};\n\nimport { PACKAGE_VERSION } from \"./version\";\n\nexport type Location = \"us\" | \"global\" | \"eu-residency\" | \"in-residency\";\n\nexport function parseLocation(location: string = \"us\"): Location {\n switch (location) {\n case \"eu-residency\":\n case \"in-residency\":\n case \"us\":\n case \"global\":\n return location;\n default:\n console.warn(\n `[ConversationalAI] Invalid server-location: ${location}. Defaulting to \"us\"`\n );\n return \"us\";\n }\n}\n\nexport function getOriginForLocation(location: Location): string {\n const originMap: Record<Location, string> = {\n us: \"wss://api.elevenlabs.io\",\n \"eu-residency\": \"wss://api.eu.residency.elevenlabs.io\",\n \"in-residency\": \"wss://api.in.residency.elevenlabs.io\",\n global: \"wss://api.elevenlabs.io\",\n };\n\n return originMap[location];\n}\n\nexport function getLivekitUrlForLocation(location: Location): string {\n const livekitUrlMap: Record<Location, string> = {\n us: \"wss://livekit.rtc.elevenlabs.io\",\n \"eu-residency\": \"wss://livekit.rtc.eu.residency.elevenlabs.io\",\n \"in-residency\": \"wss://livekit.rtc.in.residency.elevenlabs.io\",\n global: \"wss://livekit.rtc.elevenlabs.io\",\n };\n\n return livekitUrlMap[location];\n}\n\nexport type {\n Role,\n Mode,\n Status,\n SessionConfig,\n DisconnectionDetails,\n Language,\n VadScoreEvent,\n InputConfig,\n FormatConfig,\n VoiceConversation,\n TextConversation,\n Callbacks,\n} from \"@elevenlabs/client\";\nexport { postOverallFeedback } from \"@elevenlabs/client\";\n\n// Scribe exports\nexport {\n useScribe,\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"./scribe\";\nexport type {\n ScribeStatus,\n TranscriptSegment,\n ScribeCallbacks,\n ScribeHookOptions,\n UseScribeReturn,\n RealtimeConnection,\n} from \"./scribe\";\n\nexport type HookOptions = Partial<\n SessionConfig &\n HookCallbacks &\n ClientToolsConfig &\n InputConfig &\n OutputConfig &\n AudioWorkletConfig &\n FormatConfig & {\n serverLocation?: Location | string;\n }\n>;\nexport type ControlledState = {\n micMuted?: boolean;\n volume?: number;\n};\nexport type HookCallbacks = Pick<\n Callbacks,\n | \"onConnect\"\n | \"onDisconnect\"\n | \"onError\"\n | \"onMessage\"\n | \"onAudio\"\n | \"onModeChange\"\n | \"onStatusChange\"\n | \"onCanSendFeedbackChange\"\n | \"onDebug\"\n | \"onUnhandledClientToolCall\"\n | \"onVadScore\"\n | \"onInterruption\"\n | \"onAgentToolResponse\"\n | \"onConversationMetadata\"\n | \"onMCPToolCall\"\n | \"onMCPConnectionStatus\"\n | \"onAsrInitiationMetadata\"\n | \"onAgentChatResponsePart\"\n>;\n\nexport function useConversation<T extends HookOptions & ControlledState>(\n props: T = {} as T\n) {\n const { micMuted, volume, serverLocation, ...defaultOptions } = props;\n const conversationRef = useRef<Conversation | null>(null);\n const lockRef = useRef<Promise<Conversation> | null>(null);\n const [status, setStatus] = useState<Status>(\"disconnected\");\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n const [mode, setMode] = useState<Mode>(\"listening\");\n\n const micMutedRef = useRef<boolean | undefined>(micMuted);\n const volumeRef = useRef<number | undefined>(volume);\n\n micMutedRef.current = micMuted;\n volumeRef.current = volume;\n\n useEffect(() => {\n if (micMuted !== undefined) {\n conversationRef?.current?.setMicMuted(micMuted);\n }\n }, [micMuted]);\n\n useEffect(() => {\n if (volume !== undefined) {\n conversationRef?.current?.setVolume({ volume });\n }\n }, [volume]);\n\n useEffect(() => {\n return () => {\n conversationRef.current?.endSession();\n };\n }, []);\n\n return {\n startSession: (async (options?: HookOptions) => {\n if (conversationRef.current?.isOpen()) {\n return conversationRef.current.getId();\n }\n\n if (lockRef.current) {\n const conversation = await lockRef.current;\n return conversation.getId();\n }\n\n try {\n const resolvedServerLocation = parseLocation(\n options?.serverLocation || serverLocation\n );\n const origin = getOriginForLocation(resolvedServerLocation);\n const livekitUrl = getLivekitUrlForLocation(resolvedServerLocation);\n\n lockRef.current = Conversation.startSession({\n ...(defaultOptions ?? {}),\n ...(options ?? {}),\n origin,\n livekitUrl,\n overrides: {\n ...(defaultOptions?.overrides ?? {}),\n ...(options?.overrides ?? {}),\n client: {\n ...(defaultOptions?.overrides?.client ?? {}),\n ...(options?.overrides?.client ?? {}),\n source:\n options?.overrides?.client?.source ||\n defaultOptions?.overrides?.client?.source ||\n \"react_sdk\",\n version:\n options?.overrides?.client?.version ||\n defaultOptions?.overrides?.client?.version ||\n PACKAGE_VERSION,\n },\n },\n // Pass through user-provided callbacks\n onConnect: options?.onConnect || defaultOptions?.onConnect,\n onDisconnect: options?.onDisconnect || defaultOptions?.onDisconnect,\n onError: options?.onError || defaultOptions?.onError,\n onMessage: options?.onMessage || defaultOptions?.onMessage,\n onAudio: options?.onAudio || defaultOptions?.onAudio,\n onDebug: options?.onDebug || defaultOptions?.onDebug,\n onUnhandledClientToolCall:\n options?.onUnhandledClientToolCall ||\n defaultOptions?.onUnhandledClientToolCall,\n onVadScore: options?.onVadScore || defaultOptions?.onVadScore,\n onInterruption:\n options?.onInterruption || defaultOptions?.onInterruption,\n onAgentToolResponse:\n options?.onAgentToolResponse || defaultOptions?.onAgentToolResponse,\n onConversationMetadata:\n options?.onConversationMetadata ||\n defaultOptions?.onConversationMetadata,\n onMCPToolCall:\n options?.onMCPToolCall || defaultOptions?.onMCPToolCall,\n onMCPConnectionStatus:\n options?.onMCPConnectionStatus ||\n defaultOptions?.onMCPConnectionStatus,\n onAsrInitiationMetadata:\n options?.onAsrInitiationMetadata ||\n defaultOptions?.onAsrInitiationMetadata,\n onAgentChatResponsePart:\n options?.onAgentChatResponsePart ||\n defaultOptions?.onAgentChatResponsePart,\n onModeChange: ({ mode }) => {\n setMode(mode);\n (options?.onModeChange || defaultOptions?.onModeChange)?.({ mode });\n },\n onStatusChange: ({ status }) => {\n setStatus(status);\n (options?.onStatusChange || defaultOptions?.onStatusChange)?.({\n status,\n });\n },\n onCanSendFeedbackChange: ({ canSendFeedback }) => {\n setCanSendFeedback(canSendFeedback);\n (\n options?.onCanSendFeedbackChange ||\n defaultOptions?.onCanSendFeedbackChange\n )?.({ canSendFeedback });\n },\n } as Options);\n\n conversationRef.current = await lockRef.current;\n // Persist controlled state between sessions using refs to get current values\n if (micMutedRef.current !== undefined) {\n conversationRef.current.setMicMuted(micMutedRef.current);\n }\n if (volumeRef.current !== undefined) {\n conversationRef.current.setVolume({ volume: volumeRef.current });\n }\n\n return conversationRef.current.getId();\n } finally {\n lockRef.current = null;\n }\n }) as T extends SessionConfig\n ? (options?: HookOptions) => Promise<string>\n : (options: SessionConfig & HookOptions) => Promise<string>,\n endSession: async () => {\n const conversation = conversationRef.current;\n conversationRef.current = null;\n await conversation?.endSession();\n },\n setVolume: ({ volume }: { volume: number }) => {\n conversationRef.current?.setVolume({ volume });\n },\n getInputByteFrequencyData: () => {\n return conversationRef.current?.getInputByteFrequencyData();\n },\n getOutputByteFrequencyData: () => {\n return conversationRef.current?.getOutputByteFrequencyData();\n },\n getInputVolume: () => {\n return conversationRef.current?.getInputVolume() ?? 0;\n },\n getOutputVolume: () => {\n return conversationRef.current?.getOutputVolume() ?? 0;\n },\n sendFeedback: (like: boolean) => {\n conversationRef.current?.sendFeedback(like);\n },\n getId: () => {\n return conversationRef.current?.getId();\n },\n sendContextualUpdate: (text: string) => {\n conversationRef.current?.sendContextualUpdate(text);\n },\n sendUserMessage: (text: string) => {\n conversationRef.current?.sendUserMessage(text);\n },\n sendUserActivity: () => {\n conversationRef.current?.sendUserActivity();\n },\n sendMCPToolApprovalResult: (toolCallId: string, isApproved: boolean) => {\n conversationRef.current?.sendMCPToolApprovalResult(\n toolCallId,\n isApproved\n );\n },\n changeInputDevice: async (\n config: DeviceFormatConfig & DeviceInputConfig\n ) => {\n if (\n conversationRef.current &&\n \"changeInputDevice\" in conversationRef.current\n ) {\n return await (\n conversationRef.current as unknown as {\n changeInputDevice: (config: any) => Promise<any>;\n }\n ).changeInputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n changeOutputDevice: async (config: DeviceFormatConfig) => {\n if (\n conversationRef.current &&\n \"changeOutputDevice\" in conversationRef.current\n ) {\n return await (\n conversationRef.current as unknown as {\n changeOutputDevice: (config: any) => Promise<any>;\n }\n ).changeOutputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n status,\n canSendFeedback,\n micMuted,\n isSpeaking: mode === \"speaking\",\n };\n}\n\n// const con = useConversation({agentId: \"\"})\n","// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.10.0\";\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport { Scribe, RealtimeEvents } from \"@elevenlabs/client\";\nimport type {\n RealtimeConnection,\n AudioOptions,\n MicrophoneOptions,\n AudioFormat,\n CommitStrategy,\n PartialTranscriptMessage,\n CommittedTranscriptMessage,\n CommittedTranscriptWithTimestampsMessage,\n ScribeErrorMessage,\n ScribeAuthErrorMessage,\n} from \"@elevenlabs/client\";\n\n// ============= Types =============\n\nexport type ScribeStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"transcribing\"\n | \"error\";\n\nexport interface TranscriptSegment {\n id: string;\n text: string;\n timestamp: number;\n isFinal: boolean;\n}\n\nexport interface ScribeCallbacks {\n onSessionStarted?: () => void;\n onPartialTranscript?: (data: { text: string }) => void;\n onCommittedTranscript?: (data: { text: string }) => void;\n onCommittedTranscriptWithTimestamps?: (data: {\n text: string;\n timestamps?: { start: number; end: number }[];\n }) => void;\n onError?: (error: Error | Event) => void;\n onAuthError?: (data: { error: string }) => void;\n onConnect?: () => void;\n onDisconnect?: () => void;\n}\n\nexport interface ScribeHookOptions extends ScribeCallbacks {\n // Connection options\n token?: string;\n modelId?: string;\n baseUri?: string;\n\n // VAD options\n commitStrategy?: CommitStrategy;\n vadSilenceThresholdSecs?: number;\n vadThreshold?: number;\n minSpeechDurationMs?: number;\n minSilenceDurationMs?: number;\n languageCode?: string;\n\n // Microphone options (for automatic microphone mode)\n microphone?: {\n deviceId?: string;\n echoCancellation?: boolean;\n noiseSuppression?: boolean;\n autoGainControl?: boolean;\n channelCount?: number;\n };\n\n // Manual audio options\n audioFormat?: AudioFormat;\n sampleRate?: number;\n\n // Auto-connect on mount\n autoConnect?: boolean;\n}\n\nexport interface UseScribeReturn {\n // State\n status: ScribeStatus;\n isConnected: boolean;\n isTranscribing: boolean;\n partialTranscript: string;\n committedTranscripts: TranscriptSegment[];\n error: string | null;\n\n // Connection methods\n connect: (options?: Partial<ScribeHookOptions>) => Promise<void>;\n disconnect: () => void;\n\n // Audio methods (for manual mode)\n sendAudio: (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number }\n ) => void;\n commit: () => void;\n\n // Utility methods\n clearTranscripts: () => void;\n getConnection: () => RealtimeConnection | null;\n}\n\n// ============= Hook Implementation =============\n\nexport function useScribe(options: ScribeHookOptions = {}): UseScribeReturn {\n const {\n // Callbacks\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onConnect,\n onDisconnect,\n\n // Connection options\n token: defaultToken,\n modelId: defaultModelId,\n baseUri: defaultBaseUri,\n commitStrategy: defaultCommitStrategy,\n vadSilenceThresholdSecs: defaultVadSilenceThresholdSecs,\n vadThreshold: defaultVadThreshold,\n minSpeechDurationMs: defaultMinSpeechDurationMs,\n minSilenceDurationMs: defaultMinSilenceDurationMs,\n languageCode: defaultLanguageCode,\n\n // Mode options\n microphone: defaultMicrophone,\n audioFormat: defaultAudioFormat,\n sampleRate: defaultSampleRate,\n\n // Auto-connect\n autoConnect = false,\n } = options;\n\n const connectionRef = useRef<RealtimeConnection | null>(null);\n\n const [status, setStatus] = useState<ScribeStatus>(\"disconnected\");\n const [partialTranscript, setPartialTranscript] = useState<string>(\"\");\n const [committedTranscripts, setCommittedTranscripts] = useState<\n TranscriptSegment[]\n >([]);\n const [error, setError] = useState<string | null>(null);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n connectionRef.current?.close();\n };\n }, []);\n\n const connect = useCallback(\n async (runtimeOptions: Partial<ScribeHookOptions> = {}) => {\n if (connectionRef.current) {\n console.warn(\"Already connected\");\n return;\n }\n\n try {\n setStatus(\"connecting\");\n setError(null);\n\n // Merge default options with runtime options\n const token = runtimeOptions.token || defaultToken;\n const modelId = runtimeOptions.modelId || defaultModelId;\n\n if (!token) {\n throw new Error(\"Token is required\");\n }\n if (!modelId) {\n throw new Error(\"Model ID is required\");\n }\n\n // Determine mode: microphone or manual\n const microphone = runtimeOptions.microphone || defaultMicrophone;\n const audioFormat = runtimeOptions.audioFormat || defaultAudioFormat;\n const sampleRate = runtimeOptions.sampleRate || defaultSampleRate;\n\n let connection: RealtimeConnection;\n\n if (microphone) {\n // Microphone mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n microphone,\n } as MicrophoneOptions);\n } else if (audioFormat && sampleRate) {\n // Manual audio mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n audioFormat,\n sampleRate,\n } as AudioOptions);\n } else {\n throw new Error(\n \"Either microphone options or (audioFormat + sampleRate) must be provided\"\n );\n }\n\n connectionRef.current = connection;\n\n // Set up event listeners\n connection.on(RealtimeEvents.SESSION_STARTED, () => {\n setStatus(\"connected\");\n onSessionStarted?.();\n });\n\n connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data: unknown) => {\n const message = data as PartialTranscriptMessage;\n setPartialTranscript(message.text);\n setStatus(\"transcribing\");\n onPartialTranscript?.(message);\n });\n\n connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data: unknown) => {\n const message = data as CommittedTranscriptMessage;\n const segment: TranscriptSegment = {\n id: `${Date.now()}-${Math.random()}`,\n text: message.text,\n timestamp: Date.now(),\n isFinal: true,\n };\n setCommittedTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onCommittedTranscript?.(message);\n });\n\n connection.on(\n RealtimeEvents.COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS,\n (data: unknown) => {\n const message = data as CommittedTranscriptWithTimestampsMessage;\n const segment: TranscriptSegment = {\n id: `${Date.now()}-${Math.random()}`,\n text: message.text,\n timestamp: Date.now(),\n isFinal: true,\n };\n setCommittedTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onCommittedTranscriptWithTimestamps?.(message);\n }\n );\n\n connection.on(RealtimeEvents.ERROR, (err: unknown) => {\n const message = err as ScribeErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onError?.(new Error(message.error));\n });\n\n connection.on(RealtimeEvents.AUTH_ERROR, (data: unknown) => {\n const message = data as ScribeAuthErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onAuthError?.(message);\n });\n\n connection.on(RealtimeEvents.OPEN, () => {\n onConnect?.();\n });\n\n connection.on(RealtimeEvents.CLOSE, () => {\n setStatus(\"disconnected\");\n connectionRef.current = null;\n onDisconnect?.();\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to connect\";\n setError(errorMessage);\n setStatus(\"error\");\n throw err;\n }\n },\n [\n defaultToken,\n defaultModelId,\n defaultBaseUri,\n defaultCommitStrategy,\n defaultVadSilenceThresholdSecs,\n defaultVadThreshold,\n defaultMinSpeechDurationMs,\n defaultMinSilenceDurationMs,\n defaultLanguageCode,\n defaultMicrophone,\n defaultAudioFormat,\n defaultSampleRate,\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onConnect,\n onDisconnect,\n ]\n );\n\n const disconnect = useCallback(() => {\n connectionRef.current?.close();\n connectionRef.current = null;\n setStatus(\"disconnected\");\n }, []);\n\n const sendAudio = useCallback(\n (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number }\n ) => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.send({ audioBase64, ...options });\n },\n []\n );\n\n const commit = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.commit();\n }, []);\n\n const clearTranscripts = useCallback(() => {\n setCommittedTranscripts([]);\n setPartialTranscript(\"\");\n }, []);\n\n const getConnection = useCallback(() => {\n return connectionRef.current;\n }, []);\n\n // Auto-connect if enabled\n useEffect(() => {\n if (autoConnect) {\n connect();\n }\n }, [autoConnect, connect]);\n\n return {\n // State\n status,\n isConnected: status === \"connected\" || status === \"transcribing\",\n isTranscribing: status === \"transcribing\",\n partialTranscript,\n committedTranscripts,\n error,\n\n // Methods\n connect,\n disconnect,\n sendAudio,\n commit,\n clearTranscripts,\n getConnection,\n };\n}\n\n// Export types and enums from client for convenience\nexport {\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"@elevenlabs/client\";\nexport type { RealtimeConnection } from \"@elevenlabs/client\";\n"],"names":["parseLocation","location","console","warn","getOriginForLocation","us","global","getLivekitUrlForLocation","props","micMuted","volume","serverLocation","defaultOptions","_objectWithoutPropertiesLoose","_excluded","conversationRef","useRef","lockRef","_useState","useState","status","setStatus","_useState2","canSendFeedback","setCanSendFeedback","_useState3","mode","setMode","micMutedRef","volumeRef","current","useEffect","_conversationRef$curr","undefined","setMicMuted","_conversationRef$curr2","setVolume","_conversationRef$curr3","endSession","startSession","options","_conversationRef$curr4","_exit","_temp2","_result","origin","resolvedServerLocation","livekitUrl","Conversation","_extends","overrides","_defaultOptions$overr","_options$overrides","client","_defaultOptions$overr2","_defaultOptions$overr3","_options$overrides$cl","_options$overrides2","source","_options$overrides3","_defaultOptions$overr4","version","_options$overrides4","_defaultOptions$overr5","onConnect","onDisconnect","onError","onMessage","onAudio","onDebug","onUnhandledClientToolCall","onVadScore","onInterruption","onAgentToolResponse","onConversationMetadata","onMCPToolCall","onMCPConnectionStatus","onAsrInitiationMetadata","onAgentChatResponsePart","onModeChange","_ref","_ref2","onStatusChange","_ref3","_ref4","onCanSendFeedbackChange","_ref5","_ref6","Promise","resolve","then","_lockRef$current","getId","_finallyRethrows","_wasThrown","_result2","isOpen","_temp","conversation","_conversation$getId","e","reject","_ref7","_conversationRef$curr5","getInputByteFrequencyData","_conversationRef$curr6","getOutputByteFrequencyData","_conversationRef$curr7","getInputVolume","_conversationRef$curr8","_conversationRef$curr9","getOutputVolume","_conversationRef$curr0","_conversationRef$curr1","sendFeedback","like","_conversationRef$curr10","_conversationRef$curr11","sendContextualUpdate","text","_conversationRef$curr12","sendUserMessage","_conversationRef$curr13","sendUserActivity","_conversationRef$curr14","sendMCPToolApprovalResult","toolCallId","isApproved","_conversationRef$curr15","changeInputDevice","config","_temp4","_exit2","_result3","Error","_temp3","_await$conversationRe","changeOutputDevice","_temp6","_exit3","_result4","_temp5","_await$conversationRe2","isSpeaking","onSessionStarted","onPartialTranscript","onCommittedTranscript","onCommittedTranscriptWithTimestamps","onAuthError","defaultToken","token","defaultModelId","modelId","defaultBaseUri","baseUri","defaultCommitStrategy","commitStrategy","defaultVadSilenceThresholdSecs","vadSilenceThresholdSecs","defaultVadThreshold","vadThreshold","defaultMinSpeechDurationMs","minSpeechDurationMs","defaultMinSilenceDurationMs","minSilenceDurationMs","defaultLanguageCode","languageCode","defaultMicrophone","microphone","defaultAudioFormat","audioFormat","defaultSampleRate","sampleRate","_options$autoConnect","autoConnect","connectionRef","partialTranscript","setPartialTranscript","committedTranscripts","setCommittedTranscripts","_useState4","error","setError","_connectionRef$curren","close","connect","useCallback","runtimeOptions","connection","Scribe","on","RealtimeEvents","SESSION_STARTED","PARTIAL_TRANSCRIPT","data","message","COMMITTED_TRANSCRIPT","segment","id","Date","now","Math","random","timestamp","isFinal","prev","concat","COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS","ERROR","err","AUTH_ERROR","OPEN","CLOSE","errorMessage","disconnect","_connectionRef$curren2","sendAudio","audioBase64","send","commit","clearTranscripts","getConnection","isConnected","isTranscribing"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{useRef as n,useState as e,useEffect as o,useCallback as r}from"react";import{Scribe as t,RealtimeEvents as l,Conversation as i}from"@elevenlabs/client";export{AudioFormat,CommitStrategy,RealtimeEvents,postOverallFeedback}from"@elevenlabs/client";function a(){return a=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var o=arguments[e];for(var r in o)({}).hasOwnProperty.call(o,r)&&(n[r]=o[r])}return n},a.apply(null,arguments)}function u(i={}){const{onSessionStarted:u,onPartialTranscript:c,onFinalTranscript:s,onFinalTranscriptWithTimestamps:d,onError:v,onAuthError:g,onConnect:m,onDisconnect:h,token:p,modelId:S,baseUri:C,commitStrategy:M,vadSilenceThresholdSecs:T,vadThreshold:b,minSpeechDurationMs:w,minSilenceDurationMs:y,languageCode:f,microphone:D,audioFormat:I,sampleRate:A,autoConnect:R=!1}=i,F=n(null),[E,k]=e("disconnected"),[P,O]=e(""),[U,V]=e([]),[x,N]=e(null);o(()=>()=>{var n;null==(n=F.current)||n.close()},[]);const _=r(async(n={})=>{if(F.current)console.warn("Already connected");else try{k("connecting"),N(null);const e=n.token||p,o=n.modelId||S;if(!e)throw new Error("Token is required");if(!o)throw new Error("Model ID is required");const r=n.microphone||D,i=n.audioFormat||I,a=n.sampleRate||A;let R;if(r)R=t.connect({token:e,modelId:o,baseUri:n.baseUri||C,commitStrategy:n.commitStrategy||M,vadSilenceThresholdSecs:n.vadSilenceThresholdSecs||T,vadThreshold:n.vadThreshold||b,minSpeechDurationMs:n.minSpeechDurationMs||w,minSilenceDurationMs:n.minSilenceDurationMs||y,languageCode:n.languageCode||f,microphone:r});else{if(!i||!a)throw new Error("Either microphone options or (audioFormat + sampleRate) must be provided");R=t.connect({token:e,modelId:o,baseUri:n.baseUri||C,commitStrategy:n.commitStrategy||M,vadSilenceThresholdSecs:n.vadSilenceThresholdSecs||T,vadThreshold:n.vadThreshold||b,minSpeechDurationMs:n.minSpeechDurationMs||w,minSilenceDurationMs:n.minSilenceDurationMs||y,languageCode:n.languageCode||f,audioFormat:i,sampleRate:a})}F.current=R,R.on(l.SESSION_STARTED,()=>{k("connected"),null==u||u()}),R.on(l.PARTIAL_TRANSCRIPT,n=>{const e=n;O(e.text),k("transcribing"),null==c||c(e)}),R.on(l.FINAL_TRANSCRIPT,n=>{const e=n,o={id:`${Date.now()}-${Math.random()}`,text:e.text,timestamp:Date.now(),isFinal:!0};V(n=>[...n,o]),O(""),null==s||s(e)}),R.on(l.FINAL_TRANSCRIPT_WITH_TIMESTAMPS,n=>{const e=n,o={id:`${Date.now()}-${Math.random()}`,text:e.text,timestamp:Date.now(),isFinal:!0};V(n=>[...n,o]),O(""),null==d||d(e)}),R.on(l.ERROR,n=>{const e=n;N(e.error),k("error"),null==v||v(new Error(e.error))}),R.on(l.AUTH_ERROR,n=>{const e=n;N(e.error),k("error"),null==g||g(e)}),R.on(l.OPEN,()=>{null==m||m()}),R.on(l.CLOSE,()=>{k("disconnected"),F.current=null,null==h||h()})}catch(n){const e=n instanceof Error?n.message:"Failed to connect";throw N(e),k("error"),n}},[p,S,C,M,T,b,w,y,f,D,I,A,u,c,s,d,v,g,m,h]),L=r(()=>{var n;null==(n=F.current)||n.close(),F.current=null,k("disconnected")},[]),q=r((n,e)=>{if(!F.current)throw new Error("Not connected to Scribe");F.current.send(a({audioBase64:n},e))},[]),B=r(()=>{if(!F.current)throw new Error("Not connected to Scribe");F.current.commit()},[]),$=r(()=>{V([]),O("")},[]),j=r(()=>F.current,[]);return o(()=>{R&&_()},[R,_]),{status:E,isConnected:"connected"===E||"transcribing"===E,isTranscribing:"transcribing"===E,partialTranscript:P,finalTranscripts:U,error:x,connect:_,disconnect:L,sendAudio:q,commit:B,clearTranscripts:$,getConnection:j}}const c=["micMuted","volume","serverLocation"];function s(n="us"){switch(n){case"eu-residency":case"in-residency":case"us":case"global":return n;default:return console.warn(`[ConversationalAI] Invalid server-location: ${n}. Defaulting to "us"`),"us"}}function d(n){return{us:"wss://api.elevenlabs.io","eu-residency":"wss://api.eu.residency.elevenlabs.io","in-residency":"wss://api.in.residency.elevenlabs.io",global:"wss://api.elevenlabs.io"}[n]}function v(n){return{us:"wss://livekit.rtc.elevenlabs.io","eu-residency":"wss://livekit.rtc.eu.residency.elevenlabs.io","in-residency":"wss://livekit.rtc.in.residency.elevenlabs.io",global:"wss://livekit.rtc.elevenlabs.io"}[n]}function g(r={}){const{micMuted:t,volume:l,serverLocation:u}=r,g=function(n,e){if(null==n)return{};var o={};for(var r in n)if({}.hasOwnProperty.call(n,r)){if(-1!==e.indexOf(r))continue;o[r]=n[r]}return o}(r,c),m=n(null),h=n(null),[p,S]=e("disconnected"),[C,M]=e(!1),[T,b]=e("listening"),w=n(t),y=n(l);return w.current=t,y.current=l,o(()=>{var n;void 0!==t&&(null==m||null==(n=m.current)||n.setMicMuted(t))},[t]),o(()=>{var n;void 0!==l&&(null==m||null==(n=m.current)||n.setVolume({volume:l}))},[l]),o(()=>()=>{var n;null==(n=m.current)||n.endSession()},[]),{startSession:async n=>{var e;if(null!=(e=m.current)&&e.isOpen())return m.current.getId();if(h.current)return(await h.current).getId();try{var o,r,t,l,c,p,C,T,f,D;const e=s((null==n?void 0:n.serverLocation)||u),I=d(e),A=v(e);return h.current=i.startSession(a({},null!=g?g:{},null!=n?n:{},{origin:I,livekitUrl:A,overrides:a({},null!=(o=null==g?void 0:g.overrides)?o:{},null!=(r=null==n?void 0:n.overrides)?r:{},{client:a({},null!=(t=null==g||null==(l=g.overrides)?void 0:l.client)?t:{},null!=(c=null==n||null==(p=n.overrides)?void 0:p.client)?c:{},{source:(null==n||null==(C=n.overrides)||null==(C=C.client)?void 0:C.source)||(null==g||null==(T=g.overrides)||null==(T=T.client)?void 0:T.source)||"react_sdk",version:(null==n||null==(f=n.overrides)||null==(f=f.client)?void 0:f.version)||(null==g||null==(D=g.overrides)||null==(D=D.client)?void 0:D.version)||"0.9.2"})}),onConnect:(null==n?void 0:n.onConnect)||(null==g?void 0:g.onConnect),onDisconnect:(null==n?void 0:n.onDisconnect)||(null==g?void 0:g.onDisconnect),onError:(null==n?void 0:n.onError)||(null==g?void 0:g.onError),onMessage:(null==n?void 0:n.onMessage)||(null==g?void 0:g.onMessage),onAudio:(null==n?void 0:n.onAudio)||(null==g?void 0:g.onAudio),onDebug:(null==n?void 0:n.onDebug)||(null==g?void 0:g.onDebug),onUnhandledClientToolCall:(null==n?void 0:n.onUnhandledClientToolCall)||(null==g?void 0:g.onUnhandledClientToolCall),onVadScore:(null==n?void 0:n.onVadScore)||(null==g?void 0:g.onVadScore),onInterruption:(null==n?void 0:n.onInterruption)||(null==g?void 0:g.onInterruption),onAgentToolResponse:(null==n?void 0:n.onAgentToolResponse)||(null==g?void 0:g.onAgentToolResponse),onConversationMetadata:(null==n?void 0:n.onConversationMetadata)||(null==g?void 0:g.onConversationMetadata),onMCPToolCall:(null==n?void 0:n.onMCPToolCall)||(null==g?void 0:g.onMCPToolCall),onMCPConnectionStatus:(null==n?void 0:n.onMCPConnectionStatus)||(null==g?void 0:g.onMCPConnectionStatus),onAsrInitiationMetadata:(null==n?void 0:n.onAsrInitiationMetadata)||(null==g?void 0:g.onAsrInitiationMetadata),onAgentChatResponsePart:(null==n?void 0:n.onAgentChatResponsePart)||(null==g?void 0:g.onAgentChatResponsePart),onModeChange:({mode:e})=>{var o;b(e),null==(o=(null==n?void 0:n.onModeChange)||(null==g?void 0:g.onModeChange))||o({mode:e})},onStatusChange:({status:e})=>{var o;S(e),null==(o=(null==n?void 0:n.onStatusChange)||(null==g?void 0:g.onStatusChange))||o({status:e})},onCanSendFeedbackChange:({canSendFeedback:e})=>{var o;M(e),null==(o=(null==n?void 0:n.onCanSendFeedbackChange)||(null==g?void 0:g.onCanSendFeedbackChange))||o({canSendFeedback:e})}})),m.current=await h.current,void 0!==w.current&&m.current.setMicMuted(w.current),void 0!==y.current&&m.current.setVolume({volume:y.current}),m.current.getId()}finally{h.current=null}},endSession:async()=>{const n=m.current;m.current=null,await(null==n?void 0:n.endSession())},setVolume:({volume:n})=>{var e;null==(e=m.current)||e.setVolume({volume:n})},getInputByteFrequencyData:()=>{var n;return null==(n=m.current)?void 0:n.getInputByteFrequencyData()},getOutputByteFrequencyData:()=>{var n;return null==(n=m.current)?void 0:n.getOutputByteFrequencyData()},getInputVolume:()=>{var n,e;return null!=(n=null==(e=m.current)?void 0:e.getInputVolume())?n:0},getOutputVolume:()=>{var n,e;return null!=(n=null==(e=m.current)?void 0:e.getOutputVolume())?n:0},sendFeedback:n=>{var e;null==(e=m.current)||e.sendFeedback(n)},getId:()=>{var n;return null==(n=m.current)?void 0:n.getId()},sendContextualUpdate:n=>{var e;null==(e=m.current)||e.sendContextualUpdate(n)},sendUserMessage:n=>{var e;null==(e=m.current)||e.sendUserMessage(n)},sendUserActivity:()=>{var n;null==(n=m.current)||n.sendUserActivity()},sendMCPToolApprovalResult:(n,e)=>{var o;null==(o=m.current)||o.sendMCPToolApprovalResult(n,e)},changeInputDevice:async n=>{if(m.current&&"changeInputDevice"in m.current)return await m.current.changeInputDevice(n);throw new Error("Device switching is only available for voice conversations")},changeOutputDevice:async n=>{if(m.current&&"changeOutputDevice"in m.current)return await m.current.changeOutputDevice(n);throw new Error("Device switching is only available for voice conversations")},status:p,canSendFeedback:C,micMuted:t,isSpeaking:"speaking"===T}}export{v as getLivekitUrlForLocation,d as getOriginForLocation,s as parseLocation,g as useConversation,u as useScribe};
1
+ import{useRef as n,useState as e,useEffect as o,useCallback as r}from"react";import{Scribe as t,RealtimeEvents as l,Conversation as i}from"@elevenlabs/client";export{AudioFormat,CommitStrategy,RealtimeEvents,postOverallFeedback}from"@elevenlabs/client";function u(){return u=Object.assign?Object.assign.bind():function(n){for(var e=1;e<arguments.length;e++){var o=arguments[e];for(var r in o)({}).hasOwnProperty.call(o,r)&&(n[r]=o[r])}return n},u.apply(null,arguments)}function a(i={}){const{onSessionStarted:a,onPartialTranscript:c,onCommittedTranscript:s,onCommittedTranscriptWithTimestamps:d,onError:v,onAuthError:m,onConnect:g,onDisconnect:h,token:p,modelId:C,baseUri:S,commitStrategy:M,vadSilenceThresholdSecs:T,vadThreshold:b,minSpeechDurationMs:w,minSilenceDurationMs:y,languageCode:D,microphone:f,audioFormat:I,sampleRate:A,autoConnect:R=!1}=i,E=n(null),[k,F]=e("disconnected"),[O,P]=e(""),[U,V]=e([]),[x,_]=e(null);o(()=>()=>{var n;null==(n=E.current)||n.close()},[]);const N=r(async(n={})=>{if(E.current)console.warn("Already connected");else try{F("connecting"),_(null);const e=n.token||p,o=n.modelId||C;if(!e)throw new Error("Token is required");if(!o)throw new Error("Model ID is required");const r=n.microphone||f,i=n.audioFormat||I,u=n.sampleRate||A;let R;if(r)R=t.connect({token:e,modelId:o,baseUri:n.baseUri||S,commitStrategy:n.commitStrategy||M,vadSilenceThresholdSecs:n.vadSilenceThresholdSecs||T,vadThreshold:n.vadThreshold||b,minSpeechDurationMs:n.minSpeechDurationMs||w,minSilenceDurationMs:n.minSilenceDurationMs||y,languageCode:n.languageCode||D,microphone:r});else{if(!i||!u)throw new Error("Either microphone options or (audioFormat + sampleRate) must be provided");R=t.connect({token:e,modelId:o,baseUri:n.baseUri||S,commitStrategy:n.commitStrategy||M,vadSilenceThresholdSecs:n.vadSilenceThresholdSecs||T,vadThreshold:n.vadThreshold||b,minSpeechDurationMs:n.minSpeechDurationMs||w,minSilenceDurationMs:n.minSilenceDurationMs||y,languageCode:n.languageCode||D,audioFormat:i,sampleRate:u})}E.current=R,R.on(l.SESSION_STARTED,()=>{F("connected"),null==a||a()}),R.on(l.PARTIAL_TRANSCRIPT,n=>{const e=n;P(e.text),F("transcribing"),null==c||c(e)}),R.on(l.COMMITTED_TRANSCRIPT,n=>{const e=n,o={id:`${Date.now()}-${Math.random()}`,text:e.text,timestamp:Date.now(),isFinal:!0};V(n=>[...n,o]),P(""),null==s||s(e)}),R.on(l.COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS,n=>{const e=n,o={id:`${Date.now()}-${Math.random()}`,text:e.text,timestamp:Date.now(),isFinal:!0};V(n=>[...n,o]),P(""),null==d||d(e)}),R.on(l.ERROR,n=>{const e=n;_(e.error),F("error"),null==v||v(new Error(e.error))}),R.on(l.AUTH_ERROR,n=>{const e=n;_(e.error),F("error"),null==m||m(e)}),R.on(l.OPEN,()=>{null==g||g()}),R.on(l.CLOSE,()=>{F("disconnected"),E.current=null,null==h||h()})}catch(n){const e=n instanceof Error?n.message:"Failed to connect";throw _(e),F("error"),n}},[p,C,S,M,T,b,w,y,D,f,I,A,a,c,s,d,v,m,g,h]),q=r(()=>{var n;null==(n=E.current)||n.close(),E.current=null,F("disconnected")},[]),B=r((n,e)=>{if(!E.current)throw new Error("Not connected to Scribe");E.current.send(u({audioBase64:n},e))},[]),L=r(()=>{if(!E.current)throw new Error("Not connected to Scribe");E.current.commit()},[]),$=r(()=>{V([]),P("")},[]),j=r(()=>E.current,[]);return o(()=>{R&&N()},[R,N]),{status:k,isConnected:"connected"===k||"transcribing"===k,isTranscribing:"transcribing"===k,partialTranscript:O,committedTranscripts:U,error:x,connect:N,disconnect:q,sendAudio:B,commit:L,clearTranscripts:$,getConnection:j}}const c=["micMuted","volume","serverLocation"];function s(n="us"){switch(n){case"eu-residency":case"in-residency":case"us":case"global":return n;default:return console.warn(`[ConversationalAI] Invalid server-location: ${n}. Defaulting to "us"`),"us"}}function d(n){return{us:"wss://api.elevenlabs.io","eu-residency":"wss://api.eu.residency.elevenlabs.io","in-residency":"wss://api.in.residency.elevenlabs.io",global:"wss://api.elevenlabs.io"}[n]}function v(n){return{us:"wss://livekit.rtc.elevenlabs.io","eu-residency":"wss://livekit.rtc.eu.residency.elevenlabs.io","in-residency":"wss://livekit.rtc.in.residency.elevenlabs.io",global:"wss://livekit.rtc.elevenlabs.io"}[n]}function m(r={}){const{micMuted:t,volume:l,serverLocation:a}=r,m=function(n,e){if(null==n)return{};var o={};for(var r in n)if({}.hasOwnProperty.call(n,r)){if(-1!==e.indexOf(r))continue;o[r]=n[r]}return o}(r,c),g=n(null),h=n(null),[p,C]=e("disconnected"),[S,M]=e(!1),[T,b]=e("listening"),w=n(t),y=n(l);return w.current=t,y.current=l,o(()=>{var n;void 0!==t&&(null==g||null==(n=g.current)||n.setMicMuted(t))},[t]),o(()=>{var n;void 0!==l&&(null==g||null==(n=g.current)||n.setVolume({volume:l}))},[l]),o(()=>()=>{var n;null==(n=g.current)||n.endSession()},[]),{startSession:async n=>{var e;if(null!=(e=g.current)&&e.isOpen())return g.current.getId();if(h.current)return(await h.current).getId();try{var o,r,t,l,c,p,S,T,D,f;const e=s((null==n?void 0:n.serverLocation)||a),I=d(e),A=v(e);return h.current=i.startSession(u({},null!=m?m:{},null!=n?n:{},{origin:I,livekitUrl:A,overrides:u({},null!=(o=null==m?void 0:m.overrides)?o:{},null!=(r=null==n?void 0:n.overrides)?r:{},{client:u({},null!=(t=null==m||null==(l=m.overrides)?void 0:l.client)?t:{},null!=(c=null==n||null==(p=n.overrides)?void 0:p.client)?c:{},{source:(null==n||null==(S=n.overrides)||null==(S=S.client)?void 0:S.source)||(null==m||null==(T=m.overrides)||null==(T=T.client)?void 0:T.source)||"react_sdk",version:(null==n||null==(D=n.overrides)||null==(D=D.client)?void 0:D.version)||(null==m||null==(f=m.overrides)||null==(f=f.client)?void 0:f.version)||"0.10.0"})}),onConnect:(null==n?void 0:n.onConnect)||(null==m?void 0:m.onConnect),onDisconnect:(null==n?void 0:n.onDisconnect)||(null==m?void 0:m.onDisconnect),onError:(null==n?void 0:n.onError)||(null==m?void 0:m.onError),onMessage:(null==n?void 0:n.onMessage)||(null==m?void 0:m.onMessage),onAudio:(null==n?void 0:n.onAudio)||(null==m?void 0:m.onAudio),onDebug:(null==n?void 0:n.onDebug)||(null==m?void 0:m.onDebug),onUnhandledClientToolCall:(null==n?void 0:n.onUnhandledClientToolCall)||(null==m?void 0:m.onUnhandledClientToolCall),onVadScore:(null==n?void 0:n.onVadScore)||(null==m?void 0:m.onVadScore),onInterruption:(null==n?void 0:n.onInterruption)||(null==m?void 0:m.onInterruption),onAgentToolResponse:(null==n?void 0:n.onAgentToolResponse)||(null==m?void 0:m.onAgentToolResponse),onConversationMetadata:(null==n?void 0:n.onConversationMetadata)||(null==m?void 0:m.onConversationMetadata),onMCPToolCall:(null==n?void 0:n.onMCPToolCall)||(null==m?void 0:m.onMCPToolCall),onMCPConnectionStatus:(null==n?void 0:n.onMCPConnectionStatus)||(null==m?void 0:m.onMCPConnectionStatus),onAsrInitiationMetadata:(null==n?void 0:n.onAsrInitiationMetadata)||(null==m?void 0:m.onAsrInitiationMetadata),onAgentChatResponsePart:(null==n?void 0:n.onAgentChatResponsePart)||(null==m?void 0:m.onAgentChatResponsePart),onModeChange:({mode:e})=>{var o;b(e),null==(o=(null==n?void 0:n.onModeChange)||(null==m?void 0:m.onModeChange))||o({mode:e})},onStatusChange:({status:e})=>{var o;C(e),null==(o=(null==n?void 0:n.onStatusChange)||(null==m?void 0:m.onStatusChange))||o({status:e})},onCanSendFeedbackChange:({canSendFeedback:e})=>{var o;M(e),null==(o=(null==n?void 0:n.onCanSendFeedbackChange)||(null==m?void 0:m.onCanSendFeedbackChange))||o({canSendFeedback:e})}})),g.current=await h.current,void 0!==w.current&&g.current.setMicMuted(w.current),void 0!==y.current&&g.current.setVolume({volume:y.current}),g.current.getId()}finally{h.current=null}},endSession:async()=>{const n=g.current;g.current=null,await(null==n?void 0:n.endSession())},setVolume:({volume:n})=>{var e;null==(e=g.current)||e.setVolume({volume:n})},getInputByteFrequencyData:()=>{var n;return null==(n=g.current)?void 0:n.getInputByteFrequencyData()},getOutputByteFrequencyData:()=>{var n;return null==(n=g.current)?void 0:n.getOutputByteFrequencyData()},getInputVolume:()=>{var n,e;return null!=(n=null==(e=g.current)?void 0:e.getInputVolume())?n:0},getOutputVolume:()=>{var n,e;return null!=(n=null==(e=g.current)?void 0:e.getOutputVolume())?n:0},sendFeedback:n=>{var e;null==(e=g.current)||e.sendFeedback(n)},getId:()=>{var n;return null==(n=g.current)?void 0:n.getId()},sendContextualUpdate:n=>{var e;null==(e=g.current)||e.sendContextualUpdate(n)},sendUserMessage:n=>{var e;null==(e=g.current)||e.sendUserMessage(n)},sendUserActivity:()=>{var n;null==(n=g.current)||n.sendUserActivity()},sendMCPToolApprovalResult:(n,e)=>{var o;null==(o=g.current)||o.sendMCPToolApprovalResult(n,e)},changeInputDevice:async n=>{if(g.current&&"changeInputDevice"in g.current)return await g.current.changeInputDevice(n);throw new Error("Device switching is only available for voice conversations")},changeOutputDevice:async n=>{if(g.current&&"changeOutputDevice"in g.current)return await g.current.changeOutputDevice(n);throw new Error("Device switching is only available for voice conversations")},status:p,canSendFeedback:S,micMuted:t,isSpeaking:"speaking"===T}}export{v as getLivekitUrlForLocation,d as getOriginForLocation,s as parseLocation,m as useConversation,a as useScribe};
2
2
  //# sourceMappingURL=lib.modern.js.map