codicent-app-sdk 0.3.99 → 0.3.100
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.
- package/dist/cjs/components/Header.d.ts.map +1 -1
- package/dist/cjs/components/Header.js +1 -1
- package/dist/esm/components/Header.d.ts.map +1 -1
- package/dist/esm/components/Header.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/api.js +0 -1
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/client.js +0 -1
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/conversation.js +0 -1
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/event_handler.js +0 -1
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/utils.js +0 -1
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/api.js +0 -1
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/client.js +0 -1
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/conversation.js +0 -1
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/event_handler.js +0 -1
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/utils.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/components/Header.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/components/Header.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgCxD,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CA4CA,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),r=require("react-router-dom");require("./Markdown.js"),require("./Textarea.js"),require("./Button.js"),require("./CompoundButton.js"),require("./Spinner.js"),require("./TextHeader.js"),require("./TypingIndicator.js"),require("./Dialog.js"),require("./ChatInput.js"),require("./CombinedPlaceholderDialog.js"),require("./ChatMessage.js");var s=require("./VoiceIcon.js"),i=require("./AudioIcon.js");require("./FileThumbnail.js"),require("./MessageInput.js"),require("./UploadFile.js"),require("./SnapFooter.js"),require("./Profile.js"),require("./MessageItem.js"),require("./Content.js"),require("./AiInput.js"),require("./SearchBox.js"),require("./HtmlView.js"),require("./Footer.js"),require("./Page.js"),require("react"),require("../services/codicent.js"),require("../utils/MessageContent.js"),require("../node_modules/tinycolor2/esm/tinycolor.js"),require("../_virtual/index.js");var a=require("../config/index.js");require("../utils/cacheManager.js"),require("../lib/wavtools/lib/wav_packer.js"),require("../lib/wavtools/lib/analysis/audio_analysis.js"),require("../lib/wavtools/lib/wav_stream_player.js"),require("../lib/wavtools/lib/wav_recorder.js"),require("../pages/AppFrame.js"),require("../pages/Chat.js"),require("../pages/Compose.js"),require("../pages/Snap.js"),require("../pages/Search.js"),require("../pages/Login.js"),require("../pages/CrmPage.js"),require("../pages/CrmPagePersistent.js"),require("../pages/ImageView.js"),require("../pages/FormInvite.js"),require("../pages/FormAccept.js"),require("../pages/Sales.js"),require("../pages/Purchase.js"),require("../stores/chatStore.js"),require("../hooks/useLocalization.js"),require("../hooks/useAppStyles.js");var o=require("../node_modules/@griffel/react/makeStyles.esm.js"),t=require("../node_modules/@griffel/core/index.esm.js"),u=require("../node_modules/@fluentui/tokens/lib/tokens.js"),n=require("../node_modules/@fluentui/react-image/lib/components/Image/Image.js"),l=require("../node_modules/@fluentui/react-text/lib/components/presets/Title3/Title3.js"),j=require("../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-13.js");const c=o.makeStyles({header:{...t.shorthands.padding("14px"),
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),r=require("react-router-dom");require("./Markdown.js"),require("./Textarea.js"),require("./Button.js"),require("./CompoundButton.js"),require("./Spinner.js"),require("./TextHeader.js"),require("./TypingIndicator.js"),require("./Dialog.js"),require("./ChatInput.js"),require("./CombinedPlaceholderDialog.js"),require("./ChatMessage.js");var s=require("./VoiceIcon.js"),i=require("./AudioIcon.js");require("./FileThumbnail.js"),require("./MessageInput.js"),require("./UploadFile.js"),require("./SnapFooter.js"),require("./Profile.js"),require("./MessageItem.js"),require("./Content.js"),require("./AiInput.js"),require("./SearchBox.js"),require("./HtmlView.js"),require("./Footer.js"),require("./Page.js"),require("react"),require("../services/codicent.js"),require("../utils/MessageContent.js"),require("../node_modules/tinycolor2/esm/tinycolor.js"),require("../_virtual/index.js");var a=require("../config/index.js");require("../utils/cacheManager.js"),require("../lib/wavtools/lib/wav_packer.js"),require("../lib/wavtools/lib/analysis/audio_analysis.js"),require("../lib/wavtools/lib/wav_stream_player.js"),require("../lib/wavtools/lib/wav_recorder.js"),require("../pages/AppFrame.js"),require("../pages/Chat.js"),require("../pages/Compose.js"),require("../pages/Snap.js"),require("../pages/Search.js"),require("../pages/Login.js"),require("../pages/CrmPage.js"),require("../pages/CrmPagePersistent.js"),require("../pages/ImageView.js"),require("../pages/FormInvite.js"),require("../pages/FormAccept.js"),require("../pages/Sales.js"),require("../pages/Purchase.js"),require("../stores/chatStore.js"),require("../hooks/useLocalization.js"),require("../hooks/useAppStyles.js");var o=require("../node_modules/@griffel/react/makeStyles.esm.js"),t=require("../node_modules/@griffel/core/index.esm.js"),u=require("../node_modules/@fluentui/tokens/lib/tokens.js"),n=require("../node_modules/@fluentui/react-image/lib/components/Image/Image.js"),l=require("../node_modules/@fluentui/react-text/lib/components/presets/Title3/Title3.js"),j=require("../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-13.js");const c=o.makeStyles({header:{...t.shorthands.padding("14px"),textAlign:"center",position:"sticky",top:0,zIndex:1e3,alignItems:"center",height:"64px",display:"flex",justifyContent:"space-between"},logo:{height:"40px",shape:"circular"},link:{textDecoration:"none",color:"inherit"},headerItem:{display:"flex",alignItems:"center",gap:"16px"}});exports.Header=({imageUrl:o,title:t,audio:d,voice:g})=>{const q=c(),p={backgroundColor:a.getConfigValue("APP_HEADER_COLOR")||u.tokens.colorBrandBackground,color:a.getConfigValue("APP_HEADER_TEXT_COLOR")||u.tokens.colorNeutralForegroundOnBrand};return e.jsxs("header",{className:q.header,style:p,children:[e.jsxs("div",{className:q.headerItem,children:[o&&e.jsx(n.Image,{className:q.logo,alt:"Logo",src:o,height:40}),t&&e.jsx(l.Title3,{children:t})]}),e.jsxs("div",{className:q.headerItem,children:[d&&a.getConfigValue("SHOW_MICROPHONE_BUTTON")&&e.jsx(i.default,{audio:d,disabled:g?.isConnected}),g&&a.getConfigValue("SHOW_VOICE_BUTTON")&&e.jsx(s.default,{voice:g,disabled:d?.isRecording}),a.getConfigValue("SHOW_SETTINGS_BUTTON")&&e.jsx(r.Link,{to:"/menu",className:q.link,children:e.jsx(j.Settings24Regular,{})})]})]})};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/components/Header.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/components/Header.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAgCxD,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB,CA4CA,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as e,jsx as o}from"react/jsx-runtime";import{Link as t}from"react-router-dom";import"./Markdown.js";import"./Textarea.js";import"./Button.js";import"./CompoundButton.js";import"./Spinner.js";import"./TextHeader.js";import"./TypingIndicator.js";import"./Dialog.js";import"./ChatInput.js";import"./CombinedPlaceholderDialog.js";import"./ChatMessage.js";import i from"./VoiceIcon.js";import r from"./AudioIcon.js";import"./FileThumbnail.js";import"./MessageInput.js";import"./UploadFile.js";import"./SnapFooter.js";import"./Profile.js";import"./MessageItem.js";import"./Content.js";import"./AiInput.js";import"./SearchBox.js";import"./HtmlView.js";import"./Footer.js";import"./Page.js";import"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as s}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../pages/AppFrame.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Login.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"../pages/Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import{makeStyles as m}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as a}from"../node_modules/@griffel/core/index.esm.js";import{tokens as p}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{Image as n}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";import{Title3 as l}from"../node_modules/@fluentui/react-text/lib/components/presets/Title3/Title3.js";import{Settings24Regular as c}from"../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-13.js";const d=m({header:{...a.padding("14px"),
|
|
1
|
+
import{jsxs as e,jsx as o}from"react/jsx-runtime";import{Link as t}from"react-router-dom";import"./Markdown.js";import"./Textarea.js";import"./Button.js";import"./CompoundButton.js";import"./Spinner.js";import"./TextHeader.js";import"./TypingIndicator.js";import"./Dialog.js";import"./ChatInput.js";import"./CombinedPlaceholderDialog.js";import"./ChatMessage.js";import i from"./VoiceIcon.js";import r from"./AudioIcon.js";import"./FileThumbnail.js";import"./MessageInput.js";import"./UploadFile.js";import"./SnapFooter.js";import"./Profile.js";import"./MessageItem.js";import"./Content.js";import"./AiInput.js";import"./SearchBox.js";import"./HtmlView.js";import"./Footer.js";import"./Page.js";import"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as s}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../pages/AppFrame.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Login.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"../pages/Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import{makeStyles as m}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as a}from"../node_modules/@griffel/core/index.esm.js";import{tokens as p}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{Image as n}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";import{Title3 as l}from"../node_modules/@fluentui/react-text/lib/components/presets/Title3/Title3.js";import{Settings24Regular as c}from"../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-13.js";const d=m({header:{...a.padding("14px"),textAlign:"center",position:"sticky",top:0,zIndex:1e3,alignItems:"center",height:"64px",display:"flex",justifyContent:"space-between"},logo:{height:"40px",shape:"circular"},link:{textDecoration:"none",color:"inherit"},headerItem:{display:"flex",alignItems:"center",gap:"16px"}}),j=({imageUrl:m,title:a,audio:j,voice:g})=>{const u=d(),h={backgroundColor:s("APP_HEADER_COLOR")||p.colorBrandBackground,color:s("APP_HEADER_TEXT_COLOR")||p.colorNeutralForegroundOnBrand};return e("header",{className:u.header,style:h,children:[e("div",{className:u.headerItem,children:[m&&o(n,{className:u.logo,alt:"Logo",src:m,height:40}),a&&o(l,{children:a})]}),e("div",{className:u.headerItem,children:[j&&s("SHOW_MICROPHONE_BUTTON")&&o(r,{audio:j,disabled:g?.isConnected}),g&&s("SHOW_VOICE_BUTTON")&&o(i,{voice:g,disabled:j?.isRecording}),s("SHOW_SETTINGS_BUTTON")&&o(t,{to:"/menu",className:u.link,children:o(c,{})})]})]})};export{j as Header};
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var e=require("./event_handler.js"),t=require("./utils.js");class s extends e.RealtimeEventHandler{constructor({url:e,apiKey:t,dangerouslyAllowAPIKeyInBrowser:s,debug:r}={}){if(super(),this.defaultUrl="wss://api.openai.com/v1/realtime",this.url=e||this.defaultUrl,this.apiKey=t||null,this.debug=!!r,this.ws=null,globalThis.document&&this.apiKey&&!s)throw new Error('Can not provide API key in the browser without "dangerouslyAllowAPIKeyInBrowser" set to true')}isConnected(){return!!this.ws}log(...e){const t=[`[Websocket/${(new Date).toISOString()}]`].concat(e).map((e=>"object"==typeof e&&null!==e?JSON.stringify(e,null,2):e));return this.debug&&console.log(...t),!0}async connect({model:e}={model:"gpt-4o-realtime-preview-2024-10-01"}){if(this.apiKey||this.url!==this.defaultUrl||console.warn(`No apiKey provided for connection to "${this.url}"`),this.isConnected())throw new Error("Already connected");if(globalThis.WebSocket){globalThis.document&&this.apiKey&&console.warn("Warning: Connecting using API key in the browser, this is not recommended");const e=new(0,globalThis.WebSocket)(`${this.url}`,["realtime",`websocket.api_key.${this.apiKey}`]);return e.addEventListener("message",(e=>{const t=JSON.parse(e.data);this.receive(t.type,t)})),new Promise(((t,s)=>{const r=()=>{this.disconnect(e),s(new Error(`Could not connect to "${this.url}"`))};e.addEventListener("error",r),e.addEventListener("open",(()=>{this.log(`Connected to "${this.url}"`),e.removeEventListener("error",r),e.addEventListener("error",(()=>{this.disconnect(e),this.log(`Error, disconnected from "${this.url}"`),this.dispatch("close",{error:!0})})),e.addEventListener("close",(()=>{this.disconnect(e),this.log(`Disconnected from "${this.url}"`),this.dispatch("close",{error:!1})})),this.ws=e,t(!0)}))}))}{const t="ws",s=new(0,(await import(t)).default)(`${this.url||"wss://api.openai.com/v1/realtime"}${e?`?model=${e}`:""}`,[],{finishRequest:e=>{e.setHeader("Authorization",`Bearer ${this.apiKey}`),e.setHeader("OpenAI-Beta","realtime=v1"),e.setHeader("api-key",this.apiKey),e.end()}});return s.on("message",(e=>{const t=JSON.parse(e.toString());this.receive(t.type,t)})),new Promise(((e,t)=>{const r=()=>{this.disconnect(s),t(new Error(`Could not connect to "${this.url}"`))};s.on("error",r),s.on("open",(()=>{this.log(`Connected to "${this.url}"`),s.removeListener("error",r),s.on("error",(()=>{this.disconnect(s),this.log(`Error, disconnected from "${this.url}"`),this.dispatch("close",{error:!0})})),s.on("close",(()=>{this.disconnect(s),this.log(`Disconnected from "${this.url}"`),this.dispatch("close",{error:!1})})),this.ws=s,e(!0)}))}))}}disconnect(e){if(!e||this.ws===e)return this.ws&&this.ws.close(),this.ws=null,!0}receive(e,t){return this.log("received:",e,t),this.dispatch(`server.${e}`,t),this.dispatch("server.*",t),!0}send(e,s){if(!this.isConnected())throw new Error("RealtimeAPI is not connected");if("object"!=typeof(s=s||{}))throw new Error("data must be an object");const r={event_id:t.RealtimeUtils.generateId("evt_"),type:e,...s};return this.dispatch(`client.${e}`,r),this.dispatch("client.*",r),this.log("sent:",e,r),this.ws.send(JSON.stringify(r)),!0}}exports.RealtimeAPI=s;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var e=require("./event_handler.js"),t=require("./api.js"),i=require("./conversation.js"),s=require("./utils.js");class n extends e.RealtimeEventHandler{constructor({url:e,apiKey:s,dangerouslyAllowAPIKeyInBrowser:n,debug:o}={}){super(),this.defaultSessionConfig={modalities:["text","audio"],instructions:"",voice:"alloy",input_audio_format:"pcm16",output_audio_format:"pcm16",input_audio_transcription:null,turn_detection:null,tools:[],tool_choice:"auto",temperature:.8,max_response_output_tokens:4096},this.sessionConfig={},this.transcriptionModels=[{model:"whisper-1"}],this.defaultServerVadConfig={type:"server_vad",threshold:.5,prefix_padding_ms:300,silence_duration_ms:200},this.realtime=new t.RealtimeAPI({url:e,apiKey:s,dangerouslyAllowAPIKeyInBrowser:n,debug:o}),this.conversation=new i.RealtimeConversation,this._resetConfig(),this._addAPIEventHandlers()}_resetConfig(){return this.sessionCreated=!1,this.tools={},this.sessionConfig=JSON.parse(JSON.stringify(this.defaultSessionConfig)),this.inputAudioBuffer=new Int16Array(0),!0}_addAPIEventHandlers(){this.realtime.on("client.*",(e=>{const t={time:(new Date).toISOString(),source:"client",event:e};this.dispatch("realtime.event",t)})),this.realtime.on("server.*",(e=>{const t={time:(new Date).toISOString(),source:"server",event:e};this.dispatch("realtime.event",t)})),this.realtime.on("server.session.created",(()=>this.sessionCreated=!0));const e=(e,...t)=>{const{item:i,delta:s}=this.conversation.processEvent(e,...t);return{item:i,delta:s}},t=(t,...i)=>{const{item:s,delta:n}=e(t,...i);return s&&this.dispatch("conversation.updated",{item:s,delta:n}),{item:s,delta:n}},i=async e=>{try{const t=JSON.parse(e.arguments),i=this.tools[e.name];if(!i)throw new Error(`Tool "${e.name}" has not been added`);const s=await i.handler(t);this.realtime.send("conversation.item.create",{item:{type:"function_call_output",call_id:e.call_id,output:JSON.stringify(s)}})}catch(t){this.realtime.send("conversation.item.create",{item:{type:"function_call_output",call_id:e.call_id,output:JSON.stringify({error:t.message})}})}this.createResponse()};return this.realtime.on("server.response.created",e),this.realtime.on("server.response.output_item.added",e),this.realtime.on("server.response.content_part.added",e),this.realtime.on("server.input_audio_buffer.speech_started",(t=>{e(t),this.dispatch("conversation.interrupted")})),this.realtime.on("server.input_audio_buffer.speech_stopped",(t=>e(t,this.inputAudioBuffer))),this.realtime.on("server.conversation.item.created",(e=>{const{item:i}=t(e);this.dispatch("conversation.item.appended",{item:i}),"completed"===i.status&&this.dispatch("conversation.item.completed",{item:i})})),this.realtime.on("server.conversation.item.truncated",t),this.realtime.on("server.conversation.item.deleted",t),this.realtime.on("server.conversation.item.input_audio_transcription.completed",t),this.realtime.on("server.response.audio_transcript.delta",t),this.realtime.on("server.response.audio.delta",t),this.realtime.on("server.response.text.delta",t),this.realtime.on("server.response.function_call_arguments.delta",t),this.realtime.on("server.response.output_item.done",(async e=>{const{item:s}=t(e);"completed"===s.status&&this.dispatch("conversation.item.completed",{item:s}),s.formatted.tool&&i(s.formatted.tool)})),!0}isConnected(){return this.realtime.isConnected()}reset(){return this.disconnect(),this.clearEventHandlers(),this.realtime.clearEventHandlers(),this._resetConfig(),this._addAPIEventHandlers(),!0}async connect(){if(this.isConnected())throw new Error("Already connected, use .disconnect() first");return await this.realtime.connect(),this.updateSession(),!0}async waitForSessionCreated(){if(!this.isConnected())throw new Error("Not connected, use .connect() first");for(;!this.sessionCreated;)await new Promise((e=>setTimeout((()=>e()),1)));return!0}disconnect(){this.sessionCreated=!1,this.realtime.isConnected()&&this.realtime.disconnect(),this.conversation.clear()}getTurnDetectionType(){return this.sessionConfig.turn_detection?.type||null}addTool(e,t){if(!e?.name)throw new Error("Missing tool name in definition");const i=e?.name;if(this.tools[i])throw new Error(`Tool "${i}" already added. Please use .removeTool("${i}") before trying to add again.`);if("function"!=typeof t)throw new Error(`Tool "${i}" handler must be a function`);return this.tools[i]={definition:e,handler:t},this.updateSession(),this.tools[i]}removeTool(e){if(!this.tools[e])throw new Error(`Tool "${e}" does not exist, can not be removed.`);return delete this.tools[e],!0}deleteItem(e){return this.realtime.send("conversation.item.delete",{item_id:e}),!0}updateSession({modalities:e,instructions:t,voice:i,input_audio_format:s,output_audio_format:n,input_audio_transcription:o,turn_detection:r,tools:a,tool_choice:d,temperature:u,max_response_output_tokens:l}={}){void 0!==e&&(this.sessionConfig.modalities=e),void 0!==t&&(this.sessionConfig.instructions=t),void 0!==i&&(this.sessionConfig.voice=i),void 0!==s&&(this.sessionConfig.input_audio_format=s),void 0!==n&&(this.sessionConfig.output_audio_format=n),void 0!==o&&(this.sessionConfig.input_audio_transcription=o),void 0!==r&&(this.sessionConfig.turn_detection=r),void 0!==a&&(this.sessionConfig.tools=a),void 0!==d&&(this.sessionConfig.tool_choice=d),void 0!==u&&(this.sessionConfig.temperature=u),void 0!==l&&(this.sessionConfig.max_response_output_tokens=l);const c=[].concat((a||[]).map((e=>{const t={type:"function",...e};if(this.tools[t?.name])throw new Error(`Tool "${t?.name}" has already been defined`);return t})),Object.keys(this.tools).map((e=>({type:"function",...this.tools[e].definition})))),m={...this.sessionConfig};return m.tools=c,this.realtime.isConnected()&&this.realtime.send("session.update",{session:m}),!0}sendUserMessageContent(e=[]){if(e.length){for(const t of e)"input_audio"===t.type&&(t.audio instanceof ArrayBuffer||t.audio instanceof Int16Array)&&(t.audio=s.RealtimeUtils.arrayBufferToBase64(t.audio));this.realtime.send("conversation.item.create",{item:{type:"message",role:"user",content:e}})}return this.createResponse(),!0}appendInputAudio(e){return e.byteLength>0&&(this.realtime.send("input_audio_buffer.append",{audio:s.RealtimeUtils.arrayBufferToBase64(e)}),this.inputAudioBuffer=s.RealtimeUtils.mergeInt16Arrays(this.inputAudioBuffer,e)),!0}createResponse(){return null===this.getTurnDetectionType()&&this.inputAudioBuffer.byteLength>0&&(this.realtime.send("input_audio_buffer.commit"),this.conversation.queueInputAudio(this.inputAudioBuffer),this.inputAudioBuffer=new Int16Array(0)),this.realtime.send("response.create"),!0}cancelResponse(e,t=0){if(!e)return this.realtime.send("response.cancel"),{item:null};if(e){const i=this.conversation.getItem(e);if(!i)throw new Error(`Could not find item "${e}"`);if("message"!==i.type)throw new Error('Can only cancelResponse messages with type "message"');if("assistant"!==i.role)throw new Error('Can only cancelResponse messages with role "assistant"');this.realtime.send("response.cancel");const s=i.content.findIndex((e=>"audio"===e.type));if(-1===s)throw new Error("Could not find audio on item to cancel");return this.realtime.send("conversation.item.truncate",{item_id:e,content_index:s,audio_end_ms:Math.floor(t/this.conversation.defaultFrequency*1e3)}),{item:i}}}async waitForNextItem(){const e=await this.waitForNext("conversation.item.appended"),{item:t}=e;return{item:t}}async waitForNextCompletedItem(){const e=await this.waitForNext("conversation.item.completed"),{item:t}=e;return{item:t}}}exports.RealtimeClient=n;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var t=require("./utils.js");exports.RealtimeConversation=class{defaultFrequency=24e3;EventProcessors={"conversation.item.created":t=>{const{item:e}=t,o=JSON.parse(JSON.stringify(e));if(this.itemLookup[o.id]||(this.itemLookup[o.id]=o,this.items.push(o)),o.formatted={},o.formatted.audio=new Int16Array(0),o.formatted.text="",o.formatted.transcript="",this.queuedSpeechItems[o.id]&&(o.formatted.audio=this.queuedSpeechItems[o.id].audio,delete this.queuedSpeechItems[o.id]),o.content){const t=o.content.filter((t=>["text","input_text"].includes(t.type)));for(const e of t)o.formatted.text+=e.text}return this.queuedTranscriptItems[o.id]&&(o.formatted.transcript=this.queuedTranscriptItems.transcript,delete this.queuedTranscriptItems[o.id]),"message"===o.type?"user"===o.role?(o.status="completed",this.queuedInputAudio&&(o.formatted.audio=this.queuedInputAudio,this.queuedInputAudio=null)):o.status="in_progress":"function_call"===o.type?(o.formatted.tool={type:"function",name:o.name,call_id:o.call_id,arguments:""},o.status="in_progress"):"function_call_output"===o.type&&(o.status="completed",o.formatted.output=o.output),{item:o,delta:null}},"conversation.item.truncated":t=>{const{item_id:e,audio_end_ms:o}=t,s=this.itemLookup[e];if(!s)throw new Error(`item.truncated: Item "${e}" not found`);const i=Math.floor(o*this.defaultFrequency/1e3);return s.formatted.transcript="",s.formatted.audio=s.formatted.audio.slice(0,i),{item:s,delta:null}},"conversation.item.deleted":t=>{const{item_id:e}=t,o=this.itemLookup[e];if(!o)throw new Error(`item.deleted: Item "${e}" not found`);delete this.itemLookup[o.id];const s=this.items.indexOf(o);return s>-1&&this.items.splice(s,1),{item:o,delta:null}},"conversation.item.input_audio_transcription.completed":t=>{const{item_id:e,content_index:o,transcript:s}=t,i=this.itemLookup[e],r=s||" ";return i?(i.content[o].transcript=s,i.formatted.transcript=r,{item:i,delta:{transcript:s}}):(this.queuedTranscriptItems[e]={transcript:r},{item:null,delta:null})},"input_audio_buffer.speech_started":t=>{const{item_id:e,audio_start_ms:o}=t;return this.queuedSpeechItems[e]={audio_start_ms:o},{item:null,delta:null}},"input_audio_buffer.speech_stopped":(t,e)=>{const{item_id:o,audio_end_ms:s}=t;this.queuedSpeechItems[o]||(this.queuedSpeechItems[o]={audio_start_ms:s});const i=this.queuedSpeechItems[o];if(i.audio_end_ms=s,e){const t=Math.floor(i.audio_start_ms*this.defaultFrequency/1e3),o=Math.floor(i.audio_end_ms*this.defaultFrequency/1e3);i.audio=e.slice(t,o)}return{item:null,delta:null}},"response.created":t=>{const{response:e}=t;return this.responseLookup[e.id]||(this.responseLookup[e.id]=e,this.responses.push(e)),{item:null,delta:null}},"response.output_item.added":t=>{const{response_id:e,item:o}=t,s=this.responseLookup[e];if(!s)throw new Error(`response.output_item.added: Response "${e}" not found`);return s.output.push(o.id),{item:null,delta:null}},"response.output_item.done":t=>{const{item:e}=t;if(!e)throw new Error('response.output_item.done: Missing "item"');const o=this.itemLookup[e.id];if(!o)throw new Error(`response.output_item.done: Item "${e.id}" not found`);return o.status=e.status,{item:o,delta:null}},"response.content_part.added":t=>{const{item_id:e,part:o}=t,s=this.itemLookup[e];if(!s)throw new Error(`response.content_part.added: Item "${e}" not found`);return s.content.push(o),{item:s,delta:null}},"response.audio_transcript.delta":t=>{const{item_id:e,content_index:o,delta:s}=t,i=this.itemLookup[e];if(!i)throw new Error(`response.audio_transcript.delta: Item "${e}" not found`);return i.content[o].transcript+=s,i.formatted.transcript+=s,{item:i,delta:{transcript:s}}},"response.audio.delta":e=>{const{item_id:o,content_index:s,delta:i}=e,r=this.itemLookup[o];if(!r)throw new Error(`response.audio.delta: Item "${o}" not found`);const n=t.RealtimeUtils.base64ToArrayBuffer(i),u=new Int16Array(n);return r.formatted.audio=t.RealtimeUtils.mergeInt16Arrays(r.formatted.audio,u),{item:r,delta:{audio:u}}},"response.text.delta":t=>{const{item_id:e,content_index:o,delta:s}=t,i=this.itemLookup[e];if(!i)throw new Error(`response.text.delta: Item "${e}" not found`);return i.content[o].text+=s,i.formatted.text+=s,{item:i,delta:{text:s}}},"response.function_call_arguments.delta":t=>{const{item_id:e,delta:o}=t,s=this.itemLookup[e];if(!s)throw new Error(`response.function_call_arguments.delta: Item "${e}" not found`);return s.arguments+=o,s.formatted.tool.arguments+=o,{item:s,delta:{arguments:o}}}};constructor(){this.clear()}clear(){return this.itemLookup={},this.items=[],this.responseLookup={},this.responses=[],this.queuedSpeechItems={},this.queuedTranscriptItems={},this.queuedInputAudio=null,!0}queueInputAudio(t){return this.queuedInputAudio=t,t}processEvent(t,...e){if(!t.event_id)throw console.error(t),new Error('Missing "event_id" on event');if(!t.type)throw console.error(t),new Error('Missing "type" on event');const o=this.EventProcessors[t.type];if(!o)throw new Error(`Missing conversation event processor for "${t.type}"`);return o.call(this,t,...e)}getItem(t){return this.itemLookup[t]||null}getItems(){return this.items.slice()}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const e=e=>new Promise((t=>setTimeout((()=>t()),e)));exports.RealtimeEventHandler=class{constructor(){this.eventHandlers={},this.nextEventHandlers={}}clearEventHandlers(){return this.eventHandlers={},this.nextEventHandlers={},!0}on(e,t){return this.eventHandlers[e]=this.eventHandlers[e]||[],this.eventHandlers[e].push(t),t}onNext(e,t){return this.nextEventHandlers[e]=this.nextEventHandlers[e]||[],this.nextEventHandlers[e].push(t),t}off(e,t){const n=this.eventHandlers[e]||[];if(t){const s=n.indexOf(t);if(-1===s)throw new Error(`Could not turn off specified event listener for "${e}": not found as a listener`);n.splice(s,1)}else delete this.eventHandlers[e];return!0}offNext(e,t){const n=this.nextEventHandlers[e]||[];if(t){const s=n.indexOf(t);if(-1===s)throw new Error(`Could not turn off specified next event listener for "${e}": not found as a listener`);n.splice(s,1)}else delete this.nextEventHandlers[e];return!0}async waitForNext(t,n=null){const s=Date.now();let r;for(this.onNext(t,(e=>r=e));!r;){if(n){if(Date.now()-s>n)return null}await e(1)}return r}dispatch(e,t){const n=[].concat(this.eventHandlers[e]||[]);for(const e of n)e(t);const s=[].concat(this.nextEventHandlers[e]||[]);for(const e of s)e(t);return delete this.nextEventHandlers[e],!0}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const t=globalThis.atob,r=globalThis.btoa;exports.RealtimeUtils=class{static floatTo16BitPCM(t){const r=new ArrayBuffer(2*t.length),e=new DataView(r);let n=0;for(let r=0;r<t.length;r++,n+=2){let a=Math.max(-1,Math.min(1,t[r]));e.setInt16(n,a<0?32768*a:32767*a,!0)}return r}static base64ToArrayBuffer(r){const e=t(r),n=e.length,a=new Uint8Array(n);for(let t=0;t<n;t++)a[t]=e.charCodeAt(t);return a.buffer}static arrayBufferToBase64(t){t instanceof Float32Array?t=this.floatTo16BitPCM(t):t instanceof Int16Array&&(t=t.buffer);let e="",n=new Uint8Array(t);for(let t=0;t<n.length;t+=32768){let r=n.subarray(t,t+32768);e+=String.fromCharCode.apply(null,r)}return r(e)}static mergeInt16Arrays(t,r){if(t instanceof ArrayBuffer&&(t=new Int16Array(t)),r instanceof ArrayBuffer&&(r=new Int16Array(r)),!(t instanceof Int16Array&&r instanceof Int16Array))throw new Error("Both items must be Int16Array");const e=new Int16Array(t.length+r.length);for(let r=0;r<t.length;r++)e[r]=t[r];for(let n=0;n<r.length;n++)e[t.length+n]=r[n];return e}static generateId(t,r=21){const e="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";return`${t}${Array(r-t.length).fill(0).map((t=>e[Math.floor(58*Math.random())])).join("")}`}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{RealtimeEventHandler as e}from"./event_handler.js";import{RealtimeUtils as t}from"./utils.js";class s extends e{constructor({url:e,apiKey:t,dangerouslyAllowAPIKeyInBrowser:s,debug:r}={}){if(super(),this.defaultUrl="wss://api.openai.com/v1/realtime",this.url=e||this.defaultUrl,this.apiKey=t||null,this.debug=!!r,this.ws=null,globalThis.document&&this.apiKey&&!s)throw new Error('Can not provide API key in the browser without "dangerouslyAllowAPIKeyInBrowser" set to true')}isConnected(){return!!this.ws}log(...e){const t=[`[Websocket/${(new Date).toISOString()}]`].concat(e).map((e=>"object"==typeof e&&null!==e?JSON.stringify(e,null,2):e));return this.debug&&console.log(...t),!0}async connect({model:e}={model:"gpt-4o-realtime-preview-2024-10-01"}){if(this.apiKey||this.url!==this.defaultUrl||console.warn(`No apiKey provided for connection to "${this.url}"`),this.isConnected())throw new Error("Already connected");if(globalThis.WebSocket){globalThis.document&&this.apiKey&&console.warn("Warning: Connecting using API key in the browser, this is not recommended");const e=new(0,globalThis.WebSocket)(`${this.url}`,["realtime",`websocket.api_key.${this.apiKey}`]);return e.addEventListener("message",(e=>{const t=JSON.parse(e.data);this.receive(t.type,t)})),new Promise(((t,s)=>{const r=()=>{this.disconnect(e),s(new Error(`Could not connect to "${this.url}"`))};e.addEventListener("error",r),e.addEventListener("open",(()=>{this.log(`Connected to "${this.url}"`),e.removeEventListener("error",r),e.addEventListener("error",(()=>{this.disconnect(e),this.log(`Error, disconnected from "${this.url}"`),this.dispatch("close",{error:!0})})),e.addEventListener("close",(()=>{this.disconnect(e),this.log(`Disconnected from "${this.url}"`),this.dispatch("close",{error:!1})})),this.ws=e,t(!0)}))}))}{const t="ws",s=new(0,(await import(t)).default)(`${this.url||"wss://api.openai.com/v1/realtime"}${e?`?model=${e}`:""}`,[],{finishRequest:e=>{e.setHeader("Authorization",`Bearer ${this.apiKey}`),e.setHeader("OpenAI-Beta","realtime=v1"),e.setHeader("api-key",this.apiKey),e.end()}});return s.on("message",(e=>{const t=JSON.parse(e.toString());this.receive(t.type,t)})),new Promise(((e,t)=>{const r=()=>{this.disconnect(s),t(new Error(`Could not connect to "${this.url}"`))};s.on("error",r),s.on("open",(()=>{this.log(`Connected to "${this.url}"`),s.removeListener("error",r),s.on("error",(()=>{this.disconnect(s),this.log(`Error, disconnected from "${this.url}"`),this.dispatch("close",{error:!0})})),s.on("close",(()=>{this.disconnect(s),this.log(`Disconnected from "${this.url}"`),this.dispatch("close",{error:!1})})),this.ws=s,e(!0)}))}))}}disconnect(e){if(!e||this.ws===e)return this.ws&&this.ws.close(),this.ws=null,!0}receive(e,t){return this.log("received:",e,t),this.dispatch(`server.${e}`,t),this.dispatch("server.*",t),!0}send(e,s){if(!this.isConnected())throw new Error("RealtimeAPI is not connected");if("object"!=typeof(s=s||{}))throw new Error("data must be an object");const r={event_id:t.generateId("evt_"),type:e,...s};return this.dispatch(`client.${e}`,r),this.dispatch("client.*",r),this.log("sent:",e,r),this.ws.send(JSON.stringify(r)),!0}}export{s as RealtimeAPI};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{RealtimeEventHandler as e}from"./event_handler.js";import{RealtimeAPI as t}from"./api.js";import{RealtimeConversation as i}from"./conversation.js";import{RealtimeUtils as s}from"./utils.js";class o extends e{constructor({url:e,apiKey:s,dangerouslyAllowAPIKeyInBrowser:o,debug:n}={}){super(),this.defaultSessionConfig={modalities:["text","audio"],instructions:"",voice:"alloy",input_audio_format:"pcm16",output_audio_format:"pcm16",input_audio_transcription:null,turn_detection:null,tools:[],tool_choice:"auto",temperature:.8,max_response_output_tokens:4096},this.sessionConfig={},this.transcriptionModels=[{model:"whisper-1"}],this.defaultServerVadConfig={type:"server_vad",threshold:.5,prefix_padding_ms:300,silence_duration_ms:200},this.realtime=new t({url:e,apiKey:s,dangerouslyAllowAPIKeyInBrowser:o,debug:n}),this.conversation=new i,this._resetConfig(),this._addAPIEventHandlers()}_resetConfig(){return this.sessionCreated=!1,this.tools={},this.sessionConfig=JSON.parse(JSON.stringify(this.defaultSessionConfig)),this.inputAudioBuffer=new Int16Array(0),!0}_addAPIEventHandlers(){this.realtime.on("client.*",(e=>{const t={time:(new Date).toISOString(),source:"client",event:e};this.dispatch("realtime.event",t)})),this.realtime.on("server.*",(e=>{const t={time:(new Date).toISOString(),source:"server",event:e};this.dispatch("realtime.event",t)})),this.realtime.on("server.session.created",(()=>this.sessionCreated=!0));const e=(e,...t)=>{const{item:i,delta:s}=this.conversation.processEvent(e,...t);return{item:i,delta:s}},t=(t,...i)=>{const{item:s,delta:o}=e(t,...i);return s&&this.dispatch("conversation.updated",{item:s,delta:o}),{item:s,delta:o}},i=async e=>{try{const t=JSON.parse(e.arguments),i=this.tools[e.name];if(!i)throw new Error(`Tool "${e.name}" has not been added`);const s=await i.handler(t);this.realtime.send("conversation.item.create",{item:{type:"function_call_output",call_id:e.call_id,output:JSON.stringify(s)}})}catch(t){this.realtime.send("conversation.item.create",{item:{type:"function_call_output",call_id:e.call_id,output:JSON.stringify({error:t.message})}})}this.createResponse()};return this.realtime.on("server.response.created",e),this.realtime.on("server.response.output_item.added",e),this.realtime.on("server.response.content_part.added",e),this.realtime.on("server.input_audio_buffer.speech_started",(t=>{e(t),this.dispatch("conversation.interrupted")})),this.realtime.on("server.input_audio_buffer.speech_stopped",(t=>e(t,this.inputAudioBuffer))),this.realtime.on("server.conversation.item.created",(e=>{const{item:i}=t(e);this.dispatch("conversation.item.appended",{item:i}),"completed"===i.status&&this.dispatch("conversation.item.completed",{item:i})})),this.realtime.on("server.conversation.item.truncated",t),this.realtime.on("server.conversation.item.deleted",t),this.realtime.on("server.conversation.item.input_audio_transcription.completed",t),this.realtime.on("server.response.audio_transcript.delta",t),this.realtime.on("server.response.audio.delta",t),this.realtime.on("server.response.text.delta",t),this.realtime.on("server.response.function_call_arguments.delta",t),this.realtime.on("server.response.output_item.done",(async e=>{const{item:s}=t(e);"completed"===s.status&&this.dispatch("conversation.item.completed",{item:s}),s.formatted.tool&&i(s.formatted.tool)})),!0}isConnected(){return this.realtime.isConnected()}reset(){return this.disconnect(),this.clearEventHandlers(),this.realtime.clearEventHandlers(),this._resetConfig(),this._addAPIEventHandlers(),!0}async connect(){if(this.isConnected())throw new Error("Already connected, use .disconnect() first");return await this.realtime.connect(),this.updateSession(),!0}async waitForSessionCreated(){if(!this.isConnected())throw new Error("Not connected, use .connect() first");for(;!this.sessionCreated;)await new Promise((e=>setTimeout((()=>e()),1)));return!0}disconnect(){this.sessionCreated=!1,this.realtime.isConnected()&&this.realtime.disconnect(),this.conversation.clear()}getTurnDetectionType(){return this.sessionConfig.turn_detection?.type||null}addTool(e,t){if(!e?.name)throw new Error("Missing tool name in definition");const i=e?.name;if(this.tools[i])throw new Error(`Tool "${i}" already added. Please use .removeTool("${i}") before trying to add again.`);if("function"!=typeof t)throw new Error(`Tool "${i}" handler must be a function`);return this.tools[i]={definition:e,handler:t},this.updateSession(),this.tools[i]}removeTool(e){if(!this.tools[e])throw new Error(`Tool "${e}" does not exist, can not be removed.`);return delete this.tools[e],!0}deleteItem(e){return this.realtime.send("conversation.item.delete",{item_id:e}),!0}updateSession({modalities:e,instructions:t,voice:i,input_audio_format:s,output_audio_format:o,input_audio_transcription:n,turn_detection:r,tools:a,tool_choice:d,temperature:u,max_response_output_tokens:c}={}){void 0!==e&&(this.sessionConfig.modalities=e),void 0!==t&&(this.sessionConfig.instructions=t),void 0!==i&&(this.sessionConfig.voice=i),void 0!==s&&(this.sessionConfig.input_audio_format=s),void 0!==o&&(this.sessionConfig.output_audio_format=o),void 0!==n&&(this.sessionConfig.input_audio_transcription=n),void 0!==r&&(this.sessionConfig.turn_detection=r),void 0!==a&&(this.sessionConfig.tools=a),void 0!==d&&(this.sessionConfig.tool_choice=d),void 0!==u&&(this.sessionConfig.temperature=u),void 0!==c&&(this.sessionConfig.max_response_output_tokens=c);const l=[].concat((a||[]).map((e=>{const t={type:"function",...e};if(this.tools[t?.name])throw new Error(`Tool "${t?.name}" has already been defined`);return t})),Object.keys(this.tools).map((e=>({type:"function",...this.tools[e].definition})))),m={...this.sessionConfig};return m.tools=l,this.realtime.isConnected()&&this.realtime.send("session.update",{session:m}),!0}sendUserMessageContent(e=[]){if(e.length){for(const t of e)"input_audio"===t.type&&(t.audio instanceof ArrayBuffer||t.audio instanceof Int16Array)&&(t.audio=s.arrayBufferToBase64(t.audio));this.realtime.send("conversation.item.create",{item:{type:"message",role:"user",content:e}})}return this.createResponse(),!0}appendInputAudio(e){return e.byteLength>0&&(this.realtime.send("input_audio_buffer.append",{audio:s.arrayBufferToBase64(e)}),this.inputAudioBuffer=s.mergeInt16Arrays(this.inputAudioBuffer,e)),!0}createResponse(){return null===this.getTurnDetectionType()&&this.inputAudioBuffer.byteLength>0&&(this.realtime.send("input_audio_buffer.commit"),this.conversation.queueInputAudio(this.inputAudioBuffer),this.inputAudioBuffer=new Int16Array(0)),this.realtime.send("response.create"),!0}cancelResponse(e,t=0){if(!e)return this.realtime.send("response.cancel"),{item:null};if(e){const i=this.conversation.getItem(e);if(!i)throw new Error(`Could not find item "${e}"`);if("message"!==i.type)throw new Error('Can only cancelResponse messages with type "message"');if("assistant"!==i.role)throw new Error('Can only cancelResponse messages with role "assistant"');this.realtime.send("response.cancel");const s=i.content.findIndex((e=>"audio"===e.type));if(-1===s)throw new Error("Could not find audio on item to cancel");return this.realtime.send("conversation.item.truncate",{item_id:e,content_index:s,audio_end_ms:Math.floor(t/this.conversation.defaultFrequency*1e3)}),{item:i}}}async waitForNextItem(){const e=await this.waitForNext("conversation.item.appended"),{item:t}=e;return{item:t}}async waitForNextCompletedItem(){const e=await this.waitForNext("conversation.item.completed"),{item:t}=e;return{item:t}}}export{o as RealtimeClient};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{RealtimeUtils as t}from"./utils.js";class e{defaultFrequency=24e3;EventProcessors={"conversation.item.created":t=>{const{item:e}=t,o=JSON.parse(JSON.stringify(e));if(this.itemLookup[o.id]||(this.itemLookup[o.id]=o,this.items.push(o)),o.formatted={},o.formatted.audio=new Int16Array(0),o.formatted.text="",o.formatted.transcript="",this.queuedSpeechItems[o.id]&&(o.formatted.audio=this.queuedSpeechItems[o.id].audio,delete this.queuedSpeechItems[o.id]),o.content){const t=o.content.filter((t=>["text","input_text"].includes(t.type)));for(const e of t)o.formatted.text+=e.text}return this.queuedTranscriptItems[o.id]&&(o.formatted.transcript=this.queuedTranscriptItems.transcript,delete this.queuedTranscriptItems[o.id]),"message"===o.type?"user"===o.role?(o.status="completed",this.queuedInputAudio&&(o.formatted.audio=this.queuedInputAudio,this.queuedInputAudio=null)):o.status="in_progress":"function_call"===o.type?(o.formatted.tool={type:"function",name:o.name,call_id:o.call_id,arguments:""},o.status="in_progress"):"function_call_output"===o.type&&(o.status="completed",o.formatted.output=o.output),{item:o,delta:null}},"conversation.item.truncated":t=>{const{item_id:e,audio_end_ms:o}=t,s=this.itemLookup[e];if(!s)throw new Error(`item.truncated: Item "${e}" not found`);const r=Math.floor(o*this.defaultFrequency/1e3);return s.formatted.transcript="",s.formatted.audio=s.formatted.audio.slice(0,r),{item:s,delta:null}},"conversation.item.deleted":t=>{const{item_id:e}=t,o=this.itemLookup[e];if(!o)throw new Error(`item.deleted: Item "${e}" not found`);delete this.itemLookup[o.id];const s=this.items.indexOf(o);return s>-1&&this.items.splice(s,1),{item:o,delta:null}},"conversation.item.input_audio_transcription.completed":t=>{const{item_id:e,content_index:o,transcript:s}=t,r=this.itemLookup[e],n=s||" ";return r?(r.content[o].transcript=s,r.formatted.transcript=n,{item:r,delta:{transcript:s}}):(this.queuedTranscriptItems[e]={transcript:n},{item:null,delta:null})},"input_audio_buffer.speech_started":t=>{const{item_id:e,audio_start_ms:o}=t;return this.queuedSpeechItems[e]={audio_start_ms:o},{item:null,delta:null}},"input_audio_buffer.speech_stopped":(t,e)=>{const{item_id:o,audio_end_ms:s}=t;this.queuedSpeechItems[o]||(this.queuedSpeechItems[o]={audio_start_ms:s});const r=this.queuedSpeechItems[o];if(r.audio_end_ms=s,e){const t=Math.floor(r.audio_start_ms*this.defaultFrequency/1e3),o=Math.floor(r.audio_end_ms*this.defaultFrequency/1e3);r.audio=e.slice(t,o)}return{item:null,delta:null}},"response.created":t=>{const{response:e}=t;return this.responseLookup[e.id]||(this.responseLookup[e.id]=e,this.responses.push(e)),{item:null,delta:null}},"response.output_item.added":t=>{const{response_id:e,item:o}=t,s=this.responseLookup[e];if(!s)throw new Error(`response.output_item.added: Response "${e}" not found`);return s.output.push(o.id),{item:null,delta:null}},"response.output_item.done":t=>{const{item:e}=t;if(!e)throw new Error('response.output_item.done: Missing "item"');const o=this.itemLookup[e.id];if(!o)throw new Error(`response.output_item.done: Item "${e.id}" not found`);return o.status=e.status,{item:o,delta:null}},"response.content_part.added":t=>{const{item_id:e,part:o}=t,s=this.itemLookup[e];if(!s)throw new Error(`response.content_part.added: Item "${e}" not found`);return s.content.push(o),{item:s,delta:null}},"response.audio_transcript.delta":t=>{const{item_id:e,content_index:o,delta:s}=t,r=this.itemLookup[e];if(!r)throw new Error(`response.audio_transcript.delta: Item "${e}" not found`);return r.content[o].transcript+=s,r.formatted.transcript+=s,{item:r,delta:{transcript:s}}},"response.audio.delta":e=>{const{item_id:o,content_index:s,delta:r}=e,n=this.itemLookup[o];if(!n)throw new Error(`response.audio.delta: Item "${o}" not found`);const i=t.base64ToArrayBuffer(r),u=new Int16Array(i);return n.formatted.audio=t.mergeInt16Arrays(n.formatted.audio,u),{item:n,delta:{audio:u}}},"response.text.delta":t=>{const{item_id:e,content_index:o,delta:s}=t,r=this.itemLookup[e];if(!r)throw new Error(`response.text.delta: Item "${e}" not found`);return r.content[o].text+=s,r.formatted.text+=s,{item:r,delta:{text:s}}},"response.function_call_arguments.delta":t=>{const{item_id:e,delta:o}=t,s=this.itemLookup[e];if(!s)throw new Error(`response.function_call_arguments.delta: Item "${e}" not found`);return s.arguments+=o,s.formatted.tool.arguments+=o,{item:s,delta:{arguments:o}}}};constructor(){this.clear()}clear(){return this.itemLookup={},this.items=[],this.responseLookup={},this.responses=[],this.queuedSpeechItems={},this.queuedTranscriptItems={},this.queuedInputAudio=null,!0}queueInputAudio(t){return this.queuedInputAudio=t,t}processEvent(t,...e){if(!t.event_id)throw console.error(t),new Error('Missing "event_id" on event');if(!t.type)throw console.error(t),new Error('Missing "type" on event');const o=this.EventProcessors[t.type];if(!o)throw new Error(`Missing conversation event processor for "${t.type}"`);return o.call(this,t,...e)}getItem(t){return this.itemLookup[t]||null}getItems(){return this.items.slice()}}export{e as RealtimeConversation};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=e=>new Promise((t=>setTimeout((()=>t()),e)));class t{constructor(){this.eventHandlers={},this.nextEventHandlers={}}clearEventHandlers(){return this.eventHandlers={},this.nextEventHandlers={},!0}on(e,t){return this.eventHandlers[e]=this.eventHandlers[e]||[],this.eventHandlers[e].push(t),t}onNext(e,t){return this.nextEventHandlers[e]=this.nextEventHandlers[e]||[],this.nextEventHandlers[e].push(t),t}off(e,t){const n=this.eventHandlers[e]||[];if(t){const s=n.indexOf(t);if(-1===s)throw new Error(`Could not turn off specified event listener for "${e}": not found as a listener`);n.splice(s,1)}else delete this.eventHandlers[e];return!0}offNext(e,t){const n=this.nextEventHandlers[e]||[];if(t){const s=n.indexOf(t);if(-1===s)throw new Error(`Could not turn off specified next event listener for "${e}": not found as a listener`);n.splice(s,1)}else delete this.nextEventHandlers[e];return!0}async waitForNext(t,n=null){const s=Date.now();let r;for(this.onNext(t,(e=>r=e));!r;){if(n){if(Date.now()-s>n)return null}await e(1)}return r}dispatch(e,t){const n=[].concat(this.eventHandlers[e]||[]);for(const e of n)e(t);const s=[].concat(this.nextEventHandlers[e]||[]);for(const e of s)e(t);return delete this.nextEventHandlers[e],!0}}export{t as RealtimeEventHandler};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const t=globalThis.atob,r=globalThis.btoa;class e{static floatTo16BitPCM(t){const r=new ArrayBuffer(2*t.length),e=new DataView(r);let n=0;for(let r=0;r<t.length;r++,n+=2){let a=Math.max(-1,Math.min(1,t[r]));e.setInt16(n,a<0?32768*a:32767*a,!0)}return r}static base64ToArrayBuffer(r){const e=t(r),n=e.length,a=new Uint8Array(n);for(let t=0;t<n;t++)a[t]=e.charCodeAt(t);return a.buffer}static arrayBufferToBase64(t){t instanceof Float32Array?t=this.floatTo16BitPCM(t):t instanceof Int16Array&&(t=t.buffer);let e="",n=new Uint8Array(t);for(let t=0;t<n.length;t+=32768){let r=n.subarray(t,t+32768);e+=String.fromCharCode.apply(null,r)}return r(e)}static mergeInt16Arrays(t,r){if(t instanceof ArrayBuffer&&(t=new Int16Array(t)),r instanceof ArrayBuffer&&(r=new Int16Array(r)),!(t instanceof Int16Array&&r instanceof Int16Array))throw new Error("Both items must be Int16Array");const e=new Int16Array(t.length+r.length);for(let r=0;r<t.length;r++)e[r]=t[r];for(let n=0;n<r.length;n++)e[t.length+n]=r[n];return e}static generateId(t,r=21){const e="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";return`${t}${Array(r-t.length).fill(0).map((t=>e[Math.floor(58*Math.random())])).join("")}`}}export{e as RealtimeUtils};
|