@elevenlabs/react 0.9.1 → 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,22 +1,22 @@
1
1
 
2
- > @elevenlabs/react@0.9.1 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.1 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.1 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'
14
14
  Build "@elevenlabs/react" to dist:
15
- 3.18 kB: lib.cjs.gz
16
- 2.81 kB: lib.cjs.br
15
+ 3.19 kB: lib.cjs.gz
16
+ 2.82 kB: lib.cjs.br
17
17
  2.87 kB: lib.modern.js.gz
18
18
  2.52 kB: lib.modern.js.br
19
- 3.14 kB: lib.module.js.gz
20
- 2.78 kB: lib.module.js.br
21
- 3.24 kB: lib.umd.js.gz
19
+ 3.15 kB: lib.module.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.1 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>
@@ -589,6 +587,7 @@ app.get("/scribe-token", yourAuthMiddleware, async (req, res) => {
589
587
  const response = await fetch(
590
588
  "https://api.elevenlabs.io/v1/single-use-token/realtime_scribe",
591
589
  {
590
+ method: "POST",
592
591
  headers: {
593
592
  "xi-api-key": process.env.ELEVENLABS_API_KEY,
594
593
  },
@@ -619,7 +618,7 @@ Configure the hook with default options and callbacks:
619
618
  const scribe = useScribe({
620
619
  // Connection options (can be overridden in connect())
621
620
  token: "optional-default-token",
622
- modelId: "scribe_realtime_v2",
621
+ modelId: "scribe_v2_realtime",
623
622
  baseUri: "wss://api.elevenlabs.io",
624
623
 
625
624
  // VAD options
@@ -648,8 +647,8 @@ const scribe = useScribe({
648
647
  // Event callbacks
649
648
  onSessionStarted: () => console.log("Session started"),
650
649
  onPartialTranscript: (data) => console.log("Partial:", data.text),
651
- onFinalTranscript: (data) => console.log("Final:", data.text),
652
- onFinalTranscriptWithTimestamps: (data) => console.log("With timestamps:", data),
650
+ onCommittedTranscript: (data) => console.log("Committed:", data.text),
651
+ onCommittedTranscriptWithTimestamps: (data) => console.log("With timestamps:", data),
653
652
  onError: (error) => console.error("Error:", error),
654
653
  onAuthError: (data) => console.error("Auth error:", data.error),
655
654
  onConnect: () => console.log("Connected"),
@@ -664,7 +663,7 @@ Stream audio directly from the user's microphone:
664
663
  ```tsx
665
664
  function MicrophoneTranscription() {
666
665
  const scribe = useScribe({
667
- modelId: "scribe_realtime_v2",
666
+ modelId: "scribe_v2_realtime",
668
667
  });
669
668
 
670
669
  const startRecording = async () => {
@@ -694,7 +693,7 @@ function MicrophoneTranscription() {
694
693
  </div>
695
694
  )}
696
695
 
697
- {scribe.finalTranscripts.map((transcript) => (
696
+ {scribe.committedTranscripts.map((transcript) => (
698
697
  <div key={transcript.id}>{transcript.text}</div>
699
698
  ))}
700
699
  </div>
@@ -712,7 +711,7 @@ import { useScribe, AudioFormat } from "@elevenlabs/react";
712
711
  function FileTranscription() {
713
712
  const [file, setFile] = useState<File | null>(null);
714
713
  const scribe = useScribe({
715
- modelId: "scribe_realtime_v2",
714
+ modelId: "scribe_v2_realtime",
716
715
  audioFormat: AudioFormat.PCM_16000,
717
716
  sampleRate: 16000,
718
717
  });
@@ -763,7 +762,7 @@ function FileTranscription() {
763
762
  Transcribe
764
763
  </button>
765
764
 
766
- {scribe.finalTranscripts.map((transcript) => (
765
+ {scribe.committedTranscripts.map((transcript) => (
767
766
  <div key={transcript.id}>{transcript.text}</div>
768
767
  ))}
769
768
  </div>
@@ -779,7 +778,7 @@ function FileTranscription() {
779
778
  - **isConnected** - Boolean indicating if connected
780
779
  - **isTranscribing** - Boolean indicating if actively transcribing
781
780
  - **partialTranscript** - Current partial (interim) transcript
782
- - **finalTranscripts** - Array of completed transcript segments
781
+ - **committedTranscripts** - Array of completed transcript segments
783
782
  - **error** - Current error message, or null
784
783
 
785
784
  ```tsx
@@ -788,7 +787,7 @@ const scribe = useScribe(/* options */);
788
787
  console.log(scribe.status); // "connected"
789
788
  console.log(scribe.isConnected); // true
790
789
  console.log(scribe.partialTranscript); // "hello world"
791
- console.log(scribe.finalTranscripts); // [{ id: "...", text: "...", timestamp: ..., isFinal: true }]
790
+ console.log(scribe.committedTranscripts); // [{ id: "...", text: "...", timestamp: ..., isFinal: true }]
792
791
  console.log(scribe.error); // null or error string
793
792
  ```
794
793
 
@@ -854,14 +853,14 @@ const connection = scribe.getConnection();
854
853
 
855
854
  #### Transcript Segment Type
856
855
 
857
- Each final transcript segment has the following structure:
856
+ Each committed transcript segment has the following structure:
858
857
 
859
858
  ```typescript
860
859
  interface TranscriptSegment {
861
860
  id: string; // Unique identifier
862
861
  text: string; // Transcript text
863
862
  timestamp: number; // Unix timestamp
864
- isFinal: boolean; // Always true for final transcripts
863
+ isFinal: boolean; // Always true for committed transcripts
865
864
  }
866
865
  ```
867
866
 
@@ -877,10 +876,10 @@ const scribe = useScribe({
877
876
  onPartialTranscript: (data: { text: string }) => {
878
877
  console.log("Partial:", data.text);
879
878
  },
880
- onFinalTranscript: (data: { text: string }) => {
881
- console.log("Final:", data.text);
879
+ onCommittedTranscript: (data: { text: string }) => {
880
+ console.log("Committed:", data.text);
882
881
  },
883
- onFinalTranscriptWithTimestamps: (data: {
882
+ onCommittedTranscriptWithTimestamps: (data: {
884
883
  text: string;
885
884
  timestamps?: { start: number; end: number }[];
886
885
  }) => {
@@ -904,23 +903,23 @@ const scribe = useScribe({
904
903
 
905
904
  #### Commit Strategies
906
905
 
907
- Control when transcriptions are finalized:
906
+ Control when transcriptions are committed:
908
907
 
909
908
  ```tsx
910
909
  import { CommitStrategy } from "@elevenlabs/react";
911
910
 
912
- // Automatic (default) - API detects speech end
913
- const scribe = useScribe({
914
- commitStrategy: CommitStrategy.AUTOMATIC,
915
- });
916
-
917
- // Manual - you control when to commit
911
+ // Manual (default) - you control when to commit
918
912
  const scribe = useScribe({
919
913
  commitStrategy: CommitStrategy.MANUAL,
920
914
  });
921
915
 
922
916
  // Later...
923
- 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
+ });
924
923
  ```
925
924
 
926
925
  #### Complete Example
@@ -933,10 +932,10 @@ function ScribeDemo() {
933
932
  const [mode, setMode] = useState<"microphone" | "file">("microphone");
934
933
 
935
934
  const scribe = useScribe({
936
- modelId: "scribe_realtime_v2",
935
+ modelId: "scribe_v2_realtime",
937
936
  commitStrategy: CommitStrategy.AUTOMATIC,
938
937
  onSessionStarted: () => console.log("Started"),
939
- onFinalTranscript: (data) => console.log("Final:", data.text),
938
+ onCommittedTranscript: (data) => console.log("Committed:", data.text),
940
939
  onError: (error) => console.error("Error:", error),
941
940
  });
942
941
 
@@ -978,10 +977,10 @@ function ScribeDemo() {
978
977
  </div>
979
978
  )}
980
979
 
981
- {/* Final Transcripts */}
980
+ {/* Committed Transcripts */}
982
981
  <div>
983
- <h2>Transcripts ({scribe.finalTranscripts.length})</h2>
984
- {scribe.finalTranscripts.map((t) => (
982
+ <h2>Transcripts ({scribe.committedTranscripts.length})</h2>
983
+ {scribe.committedTranscripts.map((t) => (
985
984
  <div key={t.id}>
986
985
  <span>{new Date(t.timestamp).toLocaleTimeString()}</span>
987
986
  <p>{t.text}</p>
@@ -1011,7 +1010,7 @@ import {
1011
1010
  } from "@elevenlabs/react";
1012
1011
 
1013
1012
  const scribe: UseScribeReturn = useScribe({
1014
- modelId: "scribe_realtime_v2",
1013
+ modelId: "scribe_v2_realtime",
1015
1014
  microphone: {
1016
1015
  echoCancellation: true,
1017
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.1"})}),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.1\";\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.1"})}),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