@d-id/client-sdk 1.1.0-beta.12 → 1.1.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- (function(m,b){typeof exports=="object"&&typeof module<"u"?b(exports):typeof define=="function"&&define.amd?define(["exports"],b):(m=typeof globalThis<"u"?globalThis:m||self,b(m.index={}))})(this,function(m){"use strict";var vt=Object.defineProperty;var kt=(m,b,H)=>b in m?vt(m,b,{enumerable:!0,configurable:!0,writable:!0,value:H}):m[b]=H;var Z=(m,b,H)=>(kt(m,typeof b!="symbol"?b+"":b,H),H);class b extends Error{constructor({kind:a,description:r,error:o}){super(JSON.stringify({kind:a,description:r}));Z(this,"kind");Z(this,"description");Z(this,"error");this.kind=a,this.description=r,this.error=o}}class H extends b{constructor(t,a){super({kind:"ChatCreationFailed",description:`Failed to create ${a?"persistent":""} chat, mode: ${t}`})}}class ae extends b{constructor(t){super({kind:"ChatModeDowngraded",description:`Chat mode downgraded to ${t}`})}}class x extends b{constructor(a,r){super({kind:"ValidationError",description:a});Z(this,"key");this.key=r}}class ie extends b{constructor(t){super({kind:"WSError",description:t})}}var se=(e=>(e.TRIAL="trial",e.BASIC="basic",e.ENTERPRISE="enterprise",e.LITE="lite",e.ADVANCED="advanced",e))(se||{}),oe=(e=>(e.TRIAL="deid-trial",e.PRO="deid-pro",e.ENTERPRISE="deid-enterprise",e.LITE="deid-lite",e.ADVANCED="deid-advanced",e.BUILD="deid-api-build",e.LAUNCH="deid-api-launch",e.SCALE="deid-api-scale",e))(oe||{}),ce=(e=>(e.Created="created",e.Started="started",e.Done="done",e.Error="error",e.Rejected="rejected",e.Ready="ready",e))(ce||{}),de=(e=>(e.Unrated="Unrated",e.Positive="Positive",e.Negative="Negative",e))(de||{}),I=(e=>(e.Functional="Functional",e.TextOnly="TextOnly",e.Maintenance="Maintenance",e.Playground="Playground",e.DirectPlayback="DirectPlayback",e))(I||{}),q=(e=>(e.Embed="embed",e.Query="query",e.Partial="partial",e.Answer="answer",e.Complete="done",e))(q||{}),le=(e=>(e.KnowledgeProcessing="knowledge/processing",e.KnowledgeIndexing="knowledge/indexing",e.KnowledgeFailed="knowledge/error",e.KnowledgeDone="knowledge/done",e))(le||{}),ue=(e=>(e.Knowledge="knowledge",e.Document="document",e.Record="record",e))(ue||{}),fe=(e=>(e.Pdf="pdf",e.Text="text",e.Html="html",e.Word="word",e.Json="json",e.Markdown="markdown",e.Csv="csv",e.Excel="excel",e.Powerpoint="powerpoint",e.Archive="archive",e.Image="image",e.Audio="audio",e.Video="video",e))(fe||{}),O=(e=>(e.Clip="clip",e.Talk="talk",e))(O||{});const me=e=>{switch(e){case"clip":return"clip";case"talk":return"talk";default:throw new Error(`Unknown video type: ${e}`)}};var p=(e=>(e.Start="START",e.Stop="STOP",e))(p||{}),V=(e=>(e.Strong="STRONG",e.Weak="WEAK",e.Unknown="UNKNOWN",e))(V||{}),X=(e=>(e.Idle="IDLE",e.Talking="TALKING",e))(X||{}),L=(e=>(e.ChatAnswer="chat/answer",e.ChatPartial="chat/partial",e.StreamDone="stream/done",e.StreamStarted="stream/started",e.StreamFailed="stream/error",e.StreamReady="stream/ready",e.StreamCreated="stream/created",e.StreamVideoCreated="stream-video/started",e.StreamVideoDone="stream-video/done",e.StreamVideoError="stream-video/error",e.StreamVideoRejected="stream-video/rejected",e))(L||{}),E=(e=>(e.New="new",e.Fail="fail",e.Connected="connected",e.Connecting="connecting",e.Closed="closed",e.Completed="completed",e.Disconnected="disconnected",e))(E||{}),K=(e=>(e.Legacy="legacy",e.Fluent="fluent",e))(K||{}),ge=(e=>(e.Amazon="amazon",e.Microsoft="microsoft",e.Afflorithmics="afflorithmics",e.Elevenlabs="elevenlabs",e))(ge||{}),he=(e=>(e.Public="public",e.Premium="premium",e.Private="private",e))(he||{});const _e=45*1e3,Ie="X-Playground-Chat",Q="https://api.d-id.com",Te="wss://notifications.d-id.com",be="79f81a83a67430be2bc0fd61042b8faa",we=e=>new Promise(t=>setTimeout(t,e)),Y=(e=16)=>{const t=new Uint8Array(e);return window.crypto.getRandomValues(t),Array.from(t,a=>a.toString(16).padStart(2,"0")).join("").slice(0,13)},je=e=>[I.TextOnly,I.Playground,I.Maintenance].includes(e);function Pe(e,t){let a;return{promise:new Promise((o,s)=>{a=setTimeout(()=>s(new Error(t)),e)}),clear:()=>clearTimeout(a)}}async function ee(e,t){const a={limit:(t==null?void 0:t.limit)??3,delayMs:(t==null?void 0:t.delayMs)??0,timeout:(t==null?void 0:t.timeout)??3e4,timeoutErrorMessage:(t==null?void 0:t.timeoutErrorMessage)||"Timeout error",shouldRetryFn:(t==null?void 0:t.shouldRetryFn)??(()=>!0),onRetry:(t==null?void 0:t.onRetry)??(()=>{})};let r;for(let o=1;o<=a.limit;o++)try{if(!a.timeout)return await e();const{promise:s,clear:n}=Pe(a.timeout,a.timeoutErrorMessage),c=e().finally(n);return await Promise.race([c,s])}catch(s){if(r=s,!a.shouldRetryFn(s)||o>=a.limit)throw s;await we(a.delayMs),a.onRetry(s)}throw r}function ye(){let e=window.localStorage.getItem("did_external_key_id");if(!e){let t=Y();window.localStorage.setItem("did_external_key_id",t),e=t}return e}let Ae=Y();function pe(e){if(e.type==="bearer")return`Bearer ${e.token}`;if(e.type==="basic")return`Basic ${btoa(`${e.username}:${e.password}`)}`;if(e.type==="key")return`Client-Key ${e.clientKey}.${ye()}_${Ae}`;throw new Error(`Unknown auth type: ${e}`)}const Be=e=>ee(e,{limit:3,delayMs:1e3,timeout:0,shouldRetryFn:t=>t.status===429});function te(e,t=Q,a){const r=async(o,s)=>{const{skipErrorHandler:n,...c}=s||{},i=await Be(()=>fetch(t+(o!=null&&o.startsWith("/")?o:`/${o}`),{...c,headers:{...c.headers,Authorization:pe(e),"Content-Type":"application/json"}}));if(!i.ok){let d=await i.text().catch(()=>`Failed to fetch with status ${i.status}`);const u=new Error(d);throw a&&!n&&a(u,{url:o,options:c,headers:i.headers}),u}return i.json()};return{get(o,s){return r(o,{...s,method:"GET"})},post(o,s,n){return r(o,{...n,body:JSON.stringify(s),method:"POST"})},delete(o,s,n){return r(o,{...n,body:JSON.stringify(s),method:"DELETE"})},patch(o,s,n){return r(o,{...n,body:JSON.stringify(s),method:"PATCH"})}}}function ve(e,t=Q,a){const r=te(e,`${t}/agents`,a);return{create(o,s){return r.post("/",o,s)},getAgents(o,s){return r.get(`/${o?`?tag=${o}`:""}`,s).then(n=>n??[])},getById(o,s){return r.get(`/${o}`,s)},delete(o,s){return r.delete(`/${o}`,void 0,s)},update(o,s,n){return r.patch(`/${o}`,s,n)},newChat(o,s,n){return r.post(`/${o}/chat`,s,n)},chat(o,s,n,c){return r.post(`/${o}/chat/${s}`,n,c)},createRating(o,s,n,c){return r.post(`/${o}/chat/${s}/ratings`,n,c)},updateRating(o,s,n,c,i){return r.patch(`/${o}/chat/${s}/ratings/${n}`,c,i)},deleteRating(o,s,n,c){return r.delete(`/${o}/chat/${s}/ratings/${n}`,c)},getSTTToken(o,s){return r.get(`/${o}/stt-token`,s)}}}const ke=e=>e.type==="clip"&&e.presenter_id.startsWith("v2_")?"clip_v2":e.type;function $e(e){var o,s,n,c;const t=()=>/Mobi|Android/i.test(navigator.userAgent)?"Mobile":"Desktop",a=()=>{const i=navigator.platform;return i.toLowerCase().includes("win")?"Windows":i.toLowerCase().includes("mac")?"Mac OS X":i.toLowerCase().includes("linux")?"Linux":"Unknown"},r=e.presenter;return{$os:`${a()}`,isMobile:`${t()=="Mobile"}`,browser:navigator.userAgent,origin:window.location.origin,agentType:ke(r),agentVoice:{voiceId:(s=(o=e.presenter)==null?void 0:o.voice)==null?void 0:s.voice_id,provider:(c=(n=e.presenter)==null?void 0:n.voice)==null?void 0:c.type}}}const Le=e=>e.reduce((t,a)=>t+a,0),Ce=e=>Le(e)/e.length;function ze(e,t,a){var i,d,u;const{event:r,...o}=e,{template:s}=(t==null?void 0:t.llm)||{},{language:n}=((i=t==null?void 0:t.presenter)==null?void 0:i.voice)||{};return{...o,llm:{...o.llm,template:s},script:{...o.script,provider:{...(d=o==null?void 0:o.script)==null?void 0:d.provider,language:n}},stitch:(t==null?void 0:t.presenter.type)==="talk"?(u=t==null?void 0:t.presenter)==null?void 0:u.stitch:void 0,...a}}let re={};const Fe="https://api-js.mixpanel.com/track/?verbose=1&ip=1";function Ne(e){var s,n,c,i,d,u;const t=window!=null&&window.hasOwnProperty("DID_AGENTS_API")?"agents-ui":"agents-sdk",a=e.agent.presenter,r=(s=e.agent.llm)==null?void 0:s.prompt_customization,o={token:e.token||"testKey",distinct_id:e.distinctId||ye(),agentId:e.agent.id,agentType:ke(a),owner_id:e.agent.owner_id??"",promptVersion:(n=e.agent.llm)==null?void 0:n.prompt_version,behavior:{role:r==null?void 0:r.role,personality:r==null?void 0:r.personality,instructions:(c=e.agent.llm)==null?void 0:c.instructions},temperature:(i=e.agent.llm)==null?void 0:i.temperature,knowledgeSource:r==null?void 0:r.knowledge_source,starterQuestionsCount:(u=(d=e.agent.knowledge)==null?void 0:d.starter_message)==null?void 0:u.length,topicsToAvoid:r==null?void 0:r.topics_to_avoid,maxResponseLength:r==null?void 0:r.max_response_length};return{...o,additionalProperties:{},isEnabled:e.isEnabled??!0,getRandom:Y,enrich(w){this.additionalProperties={...this.additionalProperties,...w}},async track(w,T){if(!this.isEnabled)return Promise.resolve();const{audioPath:C,...D}=T||{},R={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({data:JSON.stringify([{event:w,properties:{...this.additionalProperties,...D,...o,source:t,time:Date.now(),$insert_id:this.getRandom(),origin:window.location.href,"Screen Height":window.screen.height||window.innerWidth,"Screen Width":window.screen.width||window.innerHeight,"User Agent":navigator.userAgent}}])})};try{return await fetch(Fe,R).then(M=>M.json())}catch(M){return console.error(M)}},linkTrack(w,T,C,D){re[w]||(re[w]={events:{},resolvedDependencies:[]}),D.includes(C)||D.push(C);const R=re[w];if(R.events[C]={props:T},R.resolvedDependencies.push(C),D.every(z=>R.resolvedDependencies.includes(z))){const z=D.reduce((l,g)=>R.events[g]?{...l,...R.events[g].props}:l,{});this.track(w,z),R.resolvedDependencies=R.resolvedDependencies.filter(l=>!D.includes(l)),D.forEach(l=>{delete R.events[l]})}}}}function Je(){let e=0;return{reset:()=>e=0,update:()=>e=Date.now(),get:(t=!1)=>t?Date.now()-e:e}}const W=Je();function De(e){return e===I.Playground?{headers:{[Ie]:"true"}}:{}}async function Re(e,t,a,r,o=!1,s){try{return!s&&r!==I.DirectPlayback&&(s=await t.newChat(e.id,{persist:o},De(r)),a.track("agent-chat",{event:"created",chat_id:s.id,agent_id:e.id,mode:r})),{chat:s,chatMode:(s==null?void 0:s.chat_mode)??r}}catch(n){try{const c=JSON.parse(n.message);if((c==null?void 0:c.kind)==="InsufficientCreditsError")throw new Error("InsufficientCreditsError")}catch(c){console.error("Error parsing the error message:",c)}throw new Error("Cannot create new chat")}}function We(e){return e&&e.length>0?e:[]}function Ue(e){return new Promise((t,a)=>{const{callbacks:r,host:o,auth:s}=e,{onMessage:n=null,onOpen:c=null,onClose:i=null,onError:d=null}=r||{},u=new WebSocket(`${o}?authorization=${pe(s)}`);u.onmessage=n,u.onclose=i,u.onerror=w=>{console.error(w),d==null||d("Websocket failed to connect",w),a(w)},u.onopen=w=>{c==null||c(w),t(u)}})}async function Ke(e){const{retries:t=1}=e;let a=null;for(let r=0;(a==null?void 0:a.readyState)!==WebSocket.OPEN;r++)try{a=await Ue(e)}catch(o){if(r===t)throw o;await we(r*500)}return a}async function He(e,t,a){const r=a!=null&&a.onMessage?[a.onMessage]:[],o=await Ke({auth:e,host:t,callbacks:{onError:s=>{var n;return(n=a.onError)==null?void 0:n.call(a,new ie(s))},onMessage(s){const n=JSON.parse(s.data);r.forEach(c=>c(n.event,n))}}});return{socket:o,disconnect:()=>o.close(),subscribeToEvents:s=>r.push(s)}}function xe(e){if(e.answer!==void 0)return e.answer;let t=0,a="";for(;t in e;)a+=e[t++];return a}function qe(e,t,a,r,o){const s=r.messages[r.messages.length-1];if(!(e===q.Partial||e===q.Answer)||(s==null?void 0:s.role)!=="assistant")return;const{content:n,sequence:c}=t;e===q.Partial?a[c]=n:a.answer=n;const i=xe(a);(s.content!==i||e===q.Answer)&&(s.content=i,o==null||o([...r.messages],e))}function Ve(e,t,a,r,o){let s={};return{clearQueue:()=>s={},onMessage:(n,c)=>{var i,d;if("content"in c)qe(n,c,s,t,a.callbacks.onNewMessage),n===q.Answer&&e.track("agent-message-received",{messages:t.messages.length,mode:t.chatMode});else{const u=L,w=[u.StreamVideoDone,u.StreamVideoError,u.StreamVideoRejected],T=[u.StreamFailed,u.StreamVideoError,u.StreamVideoRejected],C=ze(c,r,{mode:t.chatMode});if(n=n,n===u.StreamVideoCreated)e.linkTrack("agent-video",C,u.StreamVideoCreated,["start"]);else if(w.includes(n)){const D=n.split("/")[1];T.includes(n)?e.track("agent-video",{...C,event:D}):e.linkTrack("agent-video",{...C,event:D},n,["done"])}T.includes(n)&&((d=(i=a.callbacks).onError)==null||d.call(i,new Error(`Stream failed with event ${n}`),{data:c})),c.event===u.StreamDone&&o()}}}}function Xe(e,t,a,r){const o=te(e,`${t}/agents/${a}`,r);return{createStream(s){return o.post("/streams",{output_resolution:s.output_resolution,compatibility_mode:s.compatibility_mode,stream_warmup:s.stream_warmup,session_timeout:s.session_timeout,fluent:s.fluent})},startConnection(s,n,c){return o.post(`/streams/${s}/sdp`,{session_id:c,answer:n})},addIceCandidate(s,n,c){return o.post(`/streams/${s}/ice`,{session_id:c,...n})},sendStreamRequest(s,n,c){return o.post(`/streams/${s}`,{session_id:n,...c})},close(s,n){return o.delete(`/streams/${s}`,{session_id:n})}}}function Ye(e,t,a,r){const o=te(e,`${t}/agents/${a}`,r);return{createStream(s,n){return o.post("/streams",{driver_url:s.driver_url,face:s.face,config:s.config,output_resolution:s.output_resolution,compatibility_mode:s.compatibility_mode,stream_warmup:s.stream_warmup,session_timeout:s.session_timeout,fluent:s.fluent},n)},startConnection(s,n,c,i){return o.post(`/streams/${s}/sdp`,{session_id:c,answer:n},i)},addIceCandidate(s,n,c,i){return o.post(`/streams/${s}/ice`,{session_id:c,...n},i)},sendStreamRequest(s,n,c,i){return o.post(`/streams/${s}`,{session_id:n,...c},i)},close(s,n,c){return o.delete(`/streams/${s}`,{session_id:n},c)}}}function Qe(e,t,a){const r=(t.timestamp-e.timestamp)/1e3;return{duration:r,bytesReceived:t.bytesReceived-e.bytesReceived,bitrate:Math.round((t.bytesReceived-e.bytesReceived)*8/r),packetsReceived:t.packetsReceived-e.packetsReceived,packetsLost:t.packetsLost-e.packetsLost,framesDropped:t.framesDropped-e.framesDropped,framesDecoded:t.framesDecoded-e.framesDecoded,jitter:t.jitter,avgJitterDelayInInterval:(t.jitterBufferDelay-e.jitterBufferDelay)/(t.jitterBufferEmittedCount-e.jitterBufferEmittedCount),jitterBufferEmittedCount:t.jitterBufferEmittedCount-e.jitterBufferEmittedCount,jitterBufferDelay:(t.jitterBufferDelay-e.jitterBufferDelay)/r,framesPerSecond:t.framesPerSecond,freezeCount:t.freezeCount-e.freezeCount,freezeDuration:t.freezeDuration-e.freezeDuration,lowFpsCount:a}}function Ge(e){return e.filter(t=>t.freezeCount>0||t.framesPerSecond<21||t.framesDropped>0||t.packetsLost>0).map(t=>{const{timestamp:a,...r}=t,o=[];return t.freezeCount>0&&o.push("freeze"),t.framesPerSecond<21&&o.push("low fps"),t.framesDropped>0&&o.push("frames dropped"),t.packetsLost>0&&o.push("packet loss"),{...r,causes:o}})}function Ze(e){let t="",a=0;for(const r of e.values())if(r&&r.type==="codec"&&r.mimeType.startsWith("video")&&(t=r.mimeType.split("/")[1]),r&&r.type==="candidate-pair"&&(a=r.currentRoundTripTime),r&&r.type==="inbound-rtp"&&r.kind==="video")return{codec:t,rtt:a,timestamp:r.timestamp,bytesReceived:r.bytesReceived,packetsReceived:r.packetsReceived,packetsLost:r.packetsLost,framesDropped:r.framesDropped,framesDecoded:r.framesDecoded,jitter:r.jitter,jitterBufferDelay:r.jitterBufferDelay,jitterBufferEmittedCount:r.jitterBufferEmittedCount,avgJitterDelayInInterval:r.jitterBufferDelay/r.jitterBufferEmittedCount,frameWidth:r.frameWidth,frameHeight:r.frameHeight,framesPerSecond:r.framesPerSecond,freezeCount:r.freezeCount,freezeDuration:r.totalFreezesDuration};return{}}function Oe(e,t,a){const r=e.map((i,d)=>d===0?a?{timestamp:i.timestamp,duration:0,rtt:i.rtt,bytesReceived:i.bytesReceived-a.bytesReceived,bitrate:(i.bytesReceived-a.bytesReceived)*8/(t/1e3),packetsReceived:i.packetsReceived-a.packetsReceived,packetsLost:i.packetsLost-a.packetsLost,framesDropped:i.framesDropped-a.framesDropped,framesDecoded:i.framesDecoded-a.framesDecoded,jitter:i.jitter,jitterBufferDelay:i.jitterBufferDelay-a.jitterBufferDelay,jitterBufferEmittedCount:i.jitterBufferEmittedCount-a.jitterBufferEmittedCount,avgJitterDelayInInterval:(i.jitterBufferDelay-a.jitterBufferDelay)/(i.jitterBufferEmittedCount-a.jitterBufferEmittedCount),framesPerSecond:i.framesPerSecond,freezeCount:i.freezeCount-a.freezeCount,freezeDuration:i.freezeDuration-a.freezeDuration}:{timestamp:i.timestamp,rtt:i.rtt,duration:0,bytesReceived:i.bytesReceived,bitrate:i.bytesReceived*8/(t/1e3),packetsReceived:i.packetsReceived,packetsLost:i.packetsLost,framesDropped:i.framesDropped,framesDecoded:i.framesDecoded,jitter:i.jitter,jitterBufferDelay:i.jitterBufferDelay,jitterBufferEmittedCount:i.jitterBufferEmittedCount,avgJitterDelayInInterval:i.jitterBufferDelay/i.jitterBufferEmittedCount,framesPerSecond:i.framesPerSecond,freezeCount:i.freezeCount,freezeDuration:i.freezeDuration}:{timestamp:i.timestamp,duration:t*d/1e3,rtt:i.rtt,bytesReceived:i.bytesReceived-e[d-1].bytesReceived,bitrate:(i.bytesReceived-e[d-1].bytesReceived)*8/(t/1e3),packetsReceived:i.packetsReceived-e[d-1].packetsReceived,packetsLost:i.packetsLost-e[d-1].packetsLost,framesDropped:i.framesDropped-e[d-1].framesDropped,framesDecoded:i.framesDecoded-e[d-1].framesDecoded,jitter:i.jitter,jitterBufferDelay:i.jitterBufferDelay-e[d-1].jitterBufferDelay,jitterBufferEmittedCount:i.jitterBufferEmittedCount-e[d-1].jitterBufferEmittedCount,avgJitterDelayInInterval:(i.jitterBufferDelay-e[d-1].jitterBufferDelay)/(i.jitterBufferEmittedCount-e[d-1].jitterBufferEmittedCount),framesPerSecond:i.framesPerSecond,freezeCount:i.freezeCount-e[d-1].freezeCount,freezeDuration:i.freezeDuration-e[d-1].freezeDuration}),o=Ge(r),s=o.reduce((i,d)=>i+(d.causes.includes("low fps")?1:0),0),n=r.filter(i=>!!i.avgJitterDelayInInterval).map(i=>i.avgJitterDelayInInterval),c=r.filter(i=>!!i.rtt).map(i=>i.rtt);return{webRTCStats:{anomalies:o,minRtt:Math.min(...c),avgRtt:Ce(c),maxRtt:Math.max(...c),aggregateReport:Qe(e[0],e[e.length-1],s),minJitterDelayInInterval:Math.min(...n),maxJitterDelayInInterval:Math.max(...n),avgJitterDelayInInterval:Ce(n)},codec:e[0].codec,resolution:`${e[0].frameWidth}x${e[0].frameHeight}`}}const ne=100,et=Math.max(Math.ceil(400/ne),1),tt=.25,rt=.28;function nt(){let e=0,t,a,r=0;return o=>{for(const s of o.values())if(s&&s.type==="inbound-rtp"&&s.kind==="video"){const n=s.jitterBufferDelay,c=s.jitterBufferEmittedCount;if(a&&c>a){const u=n-t,w=c-a;r=u/w}t=n,a=c;const i=s.framesDecoded,d=i-e>0;return e=i,{isReceiving:d,avgJitterDelayInInterval:r,freezeCount:s.freezeCount}}return{isReceiving:!1,avgJitterDelayInInterval:r}}}function at(e,t,a,r,o,s=!1){let n=[],c,i=0,d=!1,u=V.Unknown,w=V.Unknown,T=0,C=0;const D=nt();return setInterval(async()=>{const R=await e.getStats(),{isReceiving:M,avgJitterDelayInInterval:z,freezeCount:l}=D(R),g=Ze(R);if(M)i=0,T=l-C,w=z<tt?V.Strong:z>rt&&T>1?V.Weak:u,w!==u&&(o==null||o(w),u=w,C+=T,T=0),d||(r==null||r(p.Start),c=n[n.length-1],n=[],d=!0),n.push(g);else if(d&&(i++,i>=et)){const v=Oe(n,ne,c);r==null||r(p.Stop,v),t()||a(),C=l,d=!1}},ne)}let Se=!1;const U=(e,t)=>Se&&console.log(e,t),it=(window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection).bind(window);function Ee(e){switch(e){case"connected":return E.Connected;case"checking":return E.Connecting;case"failed":return E.Fail;case"new":return E.New;case"closed":return E.Closed;case"disconnected":return E.Disconnected;case"completed":return E.Completed;default:return E.New}}function st(e){const[t,a=""]=e.split(/:(.+)/);try{const r=JSON.parse(a);return U("parsed data channel message",{subject:t,data:r}),{subject:t,data:r}}catch(r){return U("Failed to parse data channel message, returning data as string",{subject:t,rawData:a,error:r}),{subject:t,data:a}}}function ot({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:r}){e===p.Start&&t===p.Start?a==null||a(p.Start):e===p.Stop&&t===p.Stop&&(a==null||a(p.Stop,r))}function ct({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,report:o}){e===p.Start?a==null||a(p.Start):e===p.Stop&&(a==null||a(p.Stop,o)),t===p.Start?r==null||r(X.Talking):t===p.Stop&&(r==null||r(X.Idle))}function Me({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,streamType:o,report:s}){o===K.Legacy?ot({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:s}):o===K.Fluent&&ct({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,report:s})}async function dt(e,t,{debug:a=!1,callbacks:r,auth:o,baseURL:s=Q,analytics:n}){Se=a;let c=!1,i=!1,d=p.Stop,u=p.Stop;const{startConnection:w,sendStreamRequest:T,close:C,createStream:D,addIceCandidate:R}=t.videoType===O.Clip?Xe(o,s,e,r.onError):Ye(o,s,e,r.onError),{id:M,offer:z,ice_servers:l,session_id:g,fluent:v}=await D(t),y=new it({iceServers:l}),P=y.createDataChannel("JanusDataChannel");if(!g)throw new Error("Could not create session_id");const k=v?K.Fluent:K.Legacy;n.enrich({"stream-type":k});const A=t.stream_warmup&&!v,B=()=>c,F=()=>{var f;c=!0,i&&((f=r.onConnectionStateChange)==null||f.call(r,E.Connected))},S=at(y,B,F,(f,h)=>Me({statsSignal:u=f,dataChannelSignal:k===K.Legacy?d:void 0,onVideoStateChange:r.onVideoStateChange,onAgentActivityStateChange:r.onAgentActivityStateChange,report:h,streamType:k}),f=>{var h;return(h=r.onConnectivityStateChange)==null?void 0:h.call(r,f)},A);y.onicecandidate=f=>{var h;U("peerConnection.onicecandidate",f);try{f.candidate&&f.candidate.sdpMid&&f.candidate.sdpMLineIndex!==null?R(M,{candidate:f.candidate.candidate,sdpMid:f.candidate.sdpMid,sdpMLineIndex:f.candidate.sdpMLineIndex},g):R(M,{candidate:null},g)}catch($){(h=r.onError)==null||h.call(r,$,{streamId:M})}},P.onopen=()=>{i=!0,(!A||c)&&F()};function j(f){d=f===L.StreamStarted?p.Start:p.Stop,Me({statsSignal:k===K.Legacy?u:void 0,dataChannelSignal:d,onVideoStateChange:r.onVideoStateChange,onAgentActivityStateChange:r.onAgentActivityStateChange,streamType:k})}function _(f,h){const $=typeof h=="string"?h:h==null?void 0:h.metadata;$&&n.enrich({streamMetadata:$}),n.track("agent-chat",{event:"ready"})}const N={[L.StreamStarted]:j,[L.StreamDone]:j,[L.StreamReady]:_};P.onmessage=f=>{var G;const{subject:h,data:$}=st(f.data);(G=N[h])==null||G.call(N,h,$)},y.oniceconnectionstatechange=()=>{var h;U("peerConnection.oniceconnectionstatechange => "+y.iceConnectionState);const f=Ee(y.iceConnectionState);f!==E.Connected&&((h=r.onConnectionStateChange)==null||h.call(r,f))},y.ontrack=f=>{var h;U("peerConnection.ontrack",f),(h=r.onSrcObjectReady)==null||h.call(r,f.streams[0])},await y.setRemoteDescription(z),U("set remote description OK");const J=await y.createAnswer();return U("create answer OK"),await y.setLocalDescription(J),U("set local description OK"),await w(M,J,g),U("start connection OK"),{speak(f){return T(M,g,f)},async disconnect(){var f;if(M){const h=Ee(y.iceConnectionState);if(y){if(h===E.New){clearInterval(S);return}y.close(),y.oniceconnectionstatechange=null,y.onnegotiationneeded=null,y.onicecandidate=null,y.ontrack=null}try{h===E.Connected&&await C(M,g).catch($=>{})}catch($){U("Error on close stream connection",$)}(f=r.onAgentActivityStateChange)==null||f.call(r,X.Idle),clearInterval(S)}},sessionId:g,streamId:M,streamType:k}}function lt(e,t){const{streamOptions:a}=t??{};return{videoType:me(e.presenter.type),output_resolution:a==null?void 0:a.outputResolution,session_timeout:a==null?void 0:a.sessionTimeout,stream_warmup:a==null?void 0:a.streamWarmup,compatibility_mode:a==null?void 0:a.compatibilityMode,fluent:a==null?void 0:a.fluent}}function ut(e,t,a,r,o){o===K.Fluent?ft(e,t,a,r,o):gt(e,t,a,r,o)}function ft(e,t,a,r,o){e===p.Start?r.track("stream-session",{event:"start","stream-type":o}):e===p.Stop&&r.track("stream-session",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,"stream-type":o,...a})}function mt(e,t,a,r){W.get()<=0||(e===p.Start?a.linkTrack("agent-video",{event:"start",latency:W.get(!0),"stream-type":r},"start",[L.StreamVideoCreated]):e===p.Stop&&a.linkTrack("agent-video",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,"stream-type":r},"done",[L.StreamVideoDone]))}function gt(e,t,a,r,o){W.get()<=0||(e===p.Start?r.linkTrack("agent-video",{event:"start",latency:W.get(!0),"stream-type":o},"start",[L.StreamVideoCreated]):e===p.Stop&&r.linkTrack("agent-video",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,"stream-type":o,...a},"done",[L.StreamVideoDone]))}function ht(e,t,a){return W.reset(),new Promise(async(r,o)=>{try{const s=await dt(e.id,lt(e,t),{...t,analytics:a,callbacks:{...t.callbacks,onConnectionStateChange:n=>{var c,i;(i=(c=t.callbacks).onConnectionStateChange)==null||i.call(c,n),n===E.Connected&&r(s)},onVideoStateChange:(n,c)=>{var i,d;(d=(i=t.callbacks).onVideoStateChange)==null||d.call(i,n),ut(n,e,c,a,s.streamType)},onAgentActivityStateChange:n=>{var c,i;(i=(c=t.callbacks).onAgentActivityStateChange)==null||i.call(c,n),mt(n===X.Talking?p.Start:p.Stop,e,a,s.streamType)}}})}catch(s){o(s)}})}async function wt(e,t,a,r,o){var i,d,u,w;const{chat:s,chatMode:n}=await Re(e,a,r,t.mode,t.persistentChat,o);if(n&&n!==t.mode&&(t.mode=n,(d=(i=t.callbacks).onModeChange)==null||d.call(i,n),n===I.TextOnly))return(w=(u=t.callbacks).onError)==null||w.call(u,new ae(n)),{chat:s};const c=await ht(e,t,r);return{chat:s,streamingManager:c}}async function yt(e,t){var R,M,z;let a=!0;const r=t.mixpanelKey||be,o=t.wsURL||Te,s=t.baseURL||Q,n={messages:[],chatMode:t.mode||I.Functional},c=ve(t.auth,s,t.callbacks.onError),i=await c.getById(e),d=Ne({token:r,agent:i,isEnabled:t.enableAnalitics,distinctId:t.distinctId}),{onMessage:u,clearQueue:w}=Ve(d,n,t,i,()=>{var l;return(l=n.socketManager)==null?void 0:l.disconnect()});n.messages=We(t.initialMessages),(M=(R=t.callbacks).onNewMessage)==null||M.call(R,[...n.messages],"answer"),d.track("agent-sdk",{event:"loaded",...$e(i)});async function T(l){var A,B,F,S,j,_,N;(B=(A=t.callbacks).onConnectionStateChange)==null||B.call(A,E.Connecting),W.reset(),l&&!a&&(delete n.chat,(S=(F=t.callbacks).onNewMessage)==null||S.call(F,[...n.messages],"answer"));const g=t.mode===I.DirectPlayback?Promise.resolve(void 0):He(t.auth,o,{onMessage:u,onError:t.callbacks.onError}),v=ee(()=>wt(i,t,c,d,n.chat),{limit:3,timeout:_e,timeoutErrorMessage:"Timeout initializing the stream",shouldRetryFn:J=>(J==null?void 0:J.message)!=="Could not connect"&&J.status!==429,delayMs:1e3}).catch(J=>{var f,h;throw D(I.Maintenance),(h=(f=t.callbacks).onConnectionStateChange)==null||h.call(f,E.Fail),J}),[y,{streamingManager:P,chat:k}]=await Promise.all([g,v]);k&&k.id!==((j=n.chat)==null?void 0:j.id)&&((N=(_=t.callbacks).onNewChat)==null||N.call(_,k.id)),n.streamingManager=P,n.socketManager=y,n.chat=k,a=!1,D((k==null?void 0:k.chat_mode)??t.mode??I.Functional)}async function C(){var l,g,v,y;(l=n.socketManager)==null||l.disconnect(),await((g=n.streamingManager)==null?void 0:g.disconnect()),delete n.streamingManager,delete n.socketManager,(y=(v=t.callbacks).onConnectionStateChange)==null||y.call(v,E.Disconnected)}async function D(l){var g,v;l!==n.chatMode&&(d.track("agent-mode-change",{mode:l}),n.chatMode=l,n.chatMode!==I.Functional&&await C(),(v=(g=t.callbacks).onModeChange)==null||v.call(g,l))}return{agent:i,getStreamType:()=>{var l;return(l=n.streamingManager)==null?void 0:l.streamType},starterMessages:((z=i.knowledge)==null?void 0:z.starter_message)||[],getSTTToken:()=>c.getSTTToken(i.id),changeMode:D,enrichAnalytics:d.enrich,async connect(){var l;await T(!0),d.track("agent-chat",{event:"connect",chatId:(l=n.chat)==null?void 0:l.id,agentId:i.id,mode:n.chatMode})},async reconnect(){var l;await C(),await T(!1),d.track("agent-chat",{event:"reconnect",chatId:(l=n.chat)==null?void 0:l.id,agentId:i.id,mode:n.chatMode})},async disconnect(){var l;await C(),d.track("agent-chat",{event:"disconnect",chatId:(l=n.chat)==null?void 0:l.id,agentId:i.id,mode:n.chatMode})},async chat(l){var P,k,A,B,F;const g=()=>{if(t.mode===I.DirectPlayback)throw new x("Direct playback is enabled, chat is disabled");if(l.length>=800)throw new x("Message cannot be more than 800 characters");if(l.length===0)throw new x("Message cannot be empty");if(n.chatMode===I.Maintenance)throw new x("Chat is in maintenance mode");if(![I.TextOnly,I.Playground].includes(n.chatMode)){if(!n.streamingManager)throw new x("Streaming manager is not initialized");if(!n.chat)throw new x("Chat is not initialized")}},v=async()=>{var S,j;if(!n.chat){const _=await Re(i,c,d,n.chatMode,t.persistentChat);if(!_.chat)throw new H(n.chatMode,!!t.persistentChat);n.chat=_.chat,(j=(S=t.callbacks).onNewChat)==null||j.call(S,n.chat.id)}return n.chat.id},y=async(S,j)=>ee(()=>{var _,N;return c.chat(i.id,j,{chatMode:n.chatMode,streamId:(_=n.streamingManager)==null?void 0:_.streamId,sessionId:(N=n.streamingManager)==null?void 0:N.sessionId,messages:S.map(({matches:J,...f})=>f)},{...De(n.chatMode),skipErrorHandler:!0})},{limit:2,shouldRetryFn:_=>{var f,h,$,G;const N=(f=_==null?void 0:_.message)==null?void 0:f.includes("missing or invalid session_id");return!((h=_==null?void 0:_.message)==null?void 0:h.includes("Stream Error"))&&!N?((G=($=t.callbacks).onError)==null||G.call($,_),!1):!0},onRetry:async()=>{await C(),await T(!1)}});try{w(),g(),n.messages.push({id:Y(),role:"user",content:l,created_at:new Date(W.update()).toISOString()}),(k=(P=t.callbacks).onNewMessage)==null||k.call(P,[...n.messages],"user");const S=await v(),j=await y([...n.messages],S);return n.messages.push({id:Y(),role:"assistant",content:j.result||"",created_at:new Date().toISOString(),context:j.context,matches:j.matches}),d.track("agent-message-send",{event:"success",mode:n.chatMode,messages:n.messages.length+1}),j.result&&((B=(A=t.callbacks).onNewMessage)==null||B.call(A,[...n.messages],"answer"),d.track("agent-message-received",{latency:W.get(!0),mode:n.chatMode,messages:n.messages.length})),j}catch(S){throw((F=n.messages[n.messages.length-1])==null?void 0:F.role)==="assistant"&&n.messages.pop(),d.track("agent-message-send",{event:"error",mode:n.chatMode,messages:n.messages.length}),S}},rate(l,g,v){var k,A,B,F;const y=n.messages.find(S=>S.id===l);if(n.chat){if(!y)throw new Error("Message not found")}else throw new Error("Chat is not initialized");const P=((k=y.matches)==null?void 0:k.map(S=>[S.document_id,S.id]))??[];return d.track("agent-rate",{event:v?"update":"create",thumb:g===1?"up":"down",knowledge_id:((A=i.knowledge)==null?void 0:A.id)??"",mode:n.chatMode,matches:P,score:g}),v?c.updateRating(i.id,n.chat.id,v,{knowledge_id:((B=i.knowledge)==null?void 0:B.id)??"",message_id:l,matches:P,score:g}):c.createRating(i.id,n.chat.id,{knowledge_id:((F=i.knowledge)==null?void 0:F.id)??"",message_id:l,matches:P,score:g})},deleteRate(l){var g;if(!n.chat)throw new Error("Chat is not initialized");return d.track("agent-rate-delete",{type:"text",chat_id:(g=n.chat)==null?void 0:g.id,id:l,mode:n.chatMode}),c.deleteRating(i.id,n.chat.id,l)},async speak(l){var P,k,A,B;if(!n.streamingManager)throw new Error("Please connect to the agent first");function g(){if(typeof l=="string"){if(!i.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:i.presenter.voice,input:l,ssml:!1}}if(l.type==="text"&&!l.provider){if(!i.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:i.presenter.voice,input:l.input,ssml:l.ssml}}return l}const v=g();d.track("agent-speak",v),W.update(),(P=n.chat)!=null&&P.id&&v.type==="text"&&(n.messages.push({id:Y(),role:"assistant",content:v.input,created_at:new Date(W.get(!0)).toISOString()}),(A=(k=t.callbacks).onNewMessage)==null||A.call(k,[...n.messages],"answer"));const y=je(n.chatMode);return n.chat&&y?{duration:0,status:"success"}:n.streamingManager.speak({script:v,metadata:{chat_id:(B=n.chat)==null?void 0:B.id,agent_id:i.id}})}}}function pt(e,t,a){const{getById:r}=ve(t,a||Q);return r(e)}m.AgentActivityState=X,m.AgentStatus=ce,m.ChatCreationFailed=H,m.ChatMode=I,m.ChatModeDowngraded=ae,m.ChatProgress=q,m.ConnectionState=E,m.ConnectivityState=V,m.DocumentType=fe,m.KnowledgeType=ue,m.PlanGroup=oe,m.Providers=ge,m.RateState=de,m.StreamEvents=L,m.StreamType=K,m.StreamingState=p,m.Subject=le,m.UserPlan=se,m.ValidationError=x,m.VideoType=O,m.VoiceAccess=he,m.WsError=ie,m.createAgentManager=yt,m.getAgent=pt,m.mapVideoType=me,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
1
+ (function(m,j){typeof exports=="object"&&typeof module<"u"?j(exports):typeof define=="function"&&define.amd?define(["exports"],j):(m=typeof globalThis<"u"?globalThis:m||self,j(m.index={}))})(this,function(m){"use strict";var Ct=Object.defineProperty;var Rt=(m,j,x)=>j in m?Ct(m,j,{enumerable:!0,configurable:!0,writable:!0,value:x}):m[j]=x;var O=(m,j,x)=>(Rt(m,typeof j!="symbol"?j+"":j,x),x);class j extends Error{constructor({kind:a,description:r,error:s}){super(JSON.stringify({kind:a,description:r}));O(this,"kind");O(this,"description");O(this,"error");this.kind=a,this.description=r,this.error=s}}class x extends j{constructor(t,a){super({kind:"ChatCreationFailed",description:`Failed to create ${a?"persistent":""} chat, mode: ${t}`})}}class ie extends j{constructor(t){super({kind:"ChatModeDowngraded",description:`Chat mode downgraded to ${t}`})}}class V extends j{constructor(a,r){super({kind:"ValidationError",description:a});O(this,"key");this.key=r}}class se extends j{constructor(t){super({kind:"WSError",description:t})}}var oe=(e=>(e.TRIAL="trial",e.BASIC="basic",e.ENTERPRISE="enterprise",e.LITE="lite",e.ADVANCED="advanced",e))(oe||{}),ce=(e=>(e.TRIAL="deid-trial",e.PRO="deid-pro",e.ENTERPRISE="deid-enterprise",e.LITE="deid-lite",e.ADVANCED="deid-advanced",e.BUILD="deid-api-build",e.LAUNCH="deid-api-launch",e.SCALE="deid-api-scale",e))(ce||{}),de=(e=>(e.Created="created",e.Started="started",e.Done="done",e.Error="error",e.Rejected="rejected",e.Ready="ready",e))(de||{}),le=(e=>(e.Unrated="Unrated",e.Positive="Positive",e.Negative="Negative",e))(le||{}),b=(e=>(e.Functional="Functional",e.TextOnly="TextOnly",e.Maintenance="Maintenance",e.Playground="Playground",e.DirectPlayback="DirectPlayback",e))(b||{}),X=(e=>(e.Embed="embed",e.Query="query",e.Partial="partial",e.Answer="answer",e.Complete="done",e))(X||{}),ue=(e=>(e.KnowledgeProcessing="knowledge/processing",e.KnowledgeIndexing="knowledge/indexing",e.KnowledgeFailed="knowledge/error",e.KnowledgeDone="knowledge/done",e))(ue||{}),fe=(e=>(e.Knowledge="knowledge",e.Document="document",e.Record="record",e))(fe||{}),me=(e=>(e.Pdf="pdf",e.Text="text",e.Html="html",e.Word="word",e.Json="json",e.Markdown="markdown",e.Csv="csv",e.Excel="excel",e.Powerpoint="powerpoint",e.Archive="archive",e.Image="image",e.Audio="audio",e.Video="video",e))(me||{}),ee=(e=>(e.Clip="clip",e.Talk="talk",e))(ee||{});const ge=e=>{switch(e){case"clip":return"clip";case"talk":return"talk";default:throw new Error(`Unknown video type: ${e}`)}};var p=(e=>(e.Start="START",e.Stop="STOP",e))(p||{}),Y=(e=>(e.Strong="STRONG",e.Weak="WEAK",e.Unknown="UNKNOWN",e))(Y||{}),Q=(e=>(e.Idle="IDLE",e.Talking="TALKING",e))(Q||{}),L=(e=>(e.ChatAnswer="chat/answer",e.ChatPartial="chat/partial",e.StreamDone="stream/done",e.StreamStarted="stream/started",e.StreamFailed="stream/error",e.StreamReady="stream/ready",e.StreamCreated="stream/created",e.StreamInterrupt="stream/interrupt",e.StreamVideoCreated="stream-video/started",e.StreamVideoDone="stream-video/done",e.StreamVideoError="stream-video/error",e.StreamVideoRejected="stream-video/rejected",e))(L||{}),_=(e=>(e.New="new",e.Fail="fail",e.Connected="connected",e.Connecting="connecting",e.Closed="closed",e.Completed="completed",e.Disconnected="disconnected",e))(_||{}),U=(e=>(e.Legacy="legacy",e.Fluent="fluent",e))(U||{}),he=(e=>(e.Amazon="amazon",e.Microsoft="microsoft",e.Afflorithmics="afflorithmics",e.Elevenlabs="elevenlabs",e))(he||{}),we=(e=>(e.Public="public",e.Premium="premium",e.Private="private",e))(we||{});const Te=45*1e3,be="X-Playground-Chat",Z="https://api.d-id.com",je="wss://notifications.d-id.com",Pe="79f81a83a67430be2bc0fd61042b8faa",pe=e=>new Promise(t=>setTimeout(t,e)),G=(e=16)=>{const t=new Uint8Array(e);return window.crypto.getRandomValues(t),Array.from(t,a=>a.toString(16).padStart(2,"0")).join("").slice(0,13)},Ae=e=>[b.TextOnly,b.Playground,b.Maintenance].includes(e);function Be(e,t){let a;return{promise:new Promise((s,i)=>{a=setTimeout(()=>i(new Error(t)),e)}),clear:()=>clearTimeout(a)}}async function te(e,t){const a={limit:(t==null?void 0:t.limit)??3,delayMs:(t==null?void 0:t.delayMs)??0,timeout:(t==null?void 0:t.timeout)??3e4,timeoutErrorMessage:(t==null?void 0:t.timeoutErrorMessage)||"Timeout error",shouldRetryFn:(t==null?void 0:t.shouldRetryFn)??(()=>!0),onRetry:(t==null?void 0:t.onRetry)??(()=>{})};let r;for(let s=1;s<=a.limit;s++)try{if(!a.timeout)return await e();const{promise:i,clear:c}=Be(a.timeout,a.timeoutErrorMessage),n=e().finally(c);return await Promise.race([n,i])}catch(i){if(r=i,!a.shouldRetryFn(i)||s>=a.limit)throw i;await pe(a.delayMs),a.onRetry(i)}throw r}function ye(){let e=window.localStorage.getItem("did_external_key_id");if(!e){let t=G();window.localStorage.setItem("did_external_key_id",t),e=t}return e}let $e=G();function ve(e){if(e.type==="bearer")return`Bearer ${e.token}`;if(e.type==="basic")return`Basic ${btoa(`${e.username}:${e.password}`)}`;if(e.type==="key")return`Client-Key ${e.clientKey}.${ye()}_${$e}`;throw new Error(`Unknown auth type: ${e}`)}const Le=e=>te(e,{limit:3,delayMs:1e3,timeout:0,shouldRetryFn:t=>t.status===429});function re(e,t=Z,a){const r=async(s,i)=>{const{skipErrorHandler:c,...n}=i||{},o=await Le(()=>fetch(t+(s!=null&&s.startsWith("/")?s:`/${s}`),{...n,headers:{...n.headers,Authorization:ve(e),"Content-Type":"application/json"}}));if(!o.ok){let d=await o.text().catch(()=>`Failed to fetch with status ${o.status}`);const u=new Error(d);throw a&&!c&&a(u,{url:s,options:n,headers:o.headers}),u}return o.json()};return{get(s,i){return r(s,{...i,method:"GET"})},post(s,i,c){return r(s,{...c,body:JSON.stringify(i),method:"POST"})},delete(s,i,c){return r(s,{...c,body:JSON.stringify(i),method:"DELETE"})},patch(s,i,c){return r(s,{...c,body:JSON.stringify(i),method:"PATCH"})}}}function ke(e,t=Z,a){const r=re(e,`${t}/agents`,a);return{create(s,i){return r.post("/",s,i)},getAgents(s,i){return r.get(`/${s?`?tag=${s}`:""}`,i).then(c=>c??[])},getById(s,i){return r.get(`/${s}`,i)},delete(s,i){return r.delete(`/${s}`,void 0,i)},update(s,i,c){return r.patch(`/${s}`,i,c)},newChat(s,i,c){return r.post(`/${s}/chat`,i,c)},chat(s,i,c,n){return r.post(`/${s}/chat/${i}`,c,n)},createRating(s,i,c,n){return r.post(`/${s}/chat/${i}/ratings`,c,n)},updateRating(s,i,c,n,o){return r.patch(`/${s}/chat/${i}/ratings/${c}`,n,o)},deleteRating(s,i,c,n){return r.delete(`/${s}/chat/${i}/ratings/${c}`,n)},getSTTToken(s,i){return r.get(`/${s}/stt-token`,i)}}}const De=e=>e.type==="clip"&&e.presenter_id.startsWith("v2_")?"clip_v2":e.type;function ze(e){var s,i,c,n;const t=()=>/Mobi|Android/i.test(navigator.userAgent)?"Mobile":"Desktop",a=()=>{const o=navigator.platform;return o.toLowerCase().includes("win")?"Windows":o.toLowerCase().includes("mac")?"Mac OS X":o.toLowerCase().includes("linux")?"Linux":"Unknown"},r=e.presenter;return{$os:`${a()}`,isMobile:`${t()=="Mobile"}`,browser:navigator.userAgent,origin:window.location.origin,agentType:De(r),agentVoice:{voiceId:(i=(s=e.presenter)==null?void 0:s.voice)==null?void 0:i.voice_id,provider:(n=(c=e.presenter)==null?void 0:c.voice)==null?void 0:n.type}}}const Fe=e=>e.reduce((t,a)=>t+a,0),Ce=e=>Fe(e)/e.length;function Ne(e,t,a){var o,d,u;const{event:r,...s}=e,{template:i}=(t==null?void 0:t.llm)||{},{language:c}=((o=t==null?void 0:t.presenter)==null?void 0:o.voice)||{};return{...s,llm:{...s.llm,template:i},script:{...s.script,provider:{...(d=s==null?void 0:s.script)==null?void 0:d.provider,language:c}},stitch:(t==null?void 0:t.presenter.type)==="talk"?(u=t==null?void 0:t.presenter)==null?void 0:u.stitch:void 0,...a}}let ne={};const Je="https://api-js.mixpanel.com/track/?verbose=1&ip=1";function We(e){var i,c,n,o,d,u;const t=window!=null&&window.hasOwnProperty("DID_AGENTS_API")?"agents-ui":"agents-sdk",a=e.agent.presenter,r=(i=e.agent.llm)==null?void 0:i.prompt_customization,s={token:e.token||"testKey",distinct_id:e.distinctId||ye(),agentId:e.agent.id,agentType:De(a),owner_id:e.agent.owner_id??"",promptVersion:(c=e.agent.llm)==null?void 0:c.prompt_version,behavior:{role:r==null?void 0:r.role,personality:r==null?void 0:r.personality,instructions:(n=e.agent.llm)==null?void 0:n.instructions},temperature:(o=e.agent.llm)==null?void 0:o.temperature,knowledgeSource:r==null?void 0:r.knowledge_source,starterQuestionsCount:(u=(d=e.agent.knowledge)==null?void 0:d.starter_message)==null?void 0:u.length,topicsToAvoid:r==null?void 0:r.topics_to_avoid,maxResponseLength:r==null?void 0:r.max_response_length};return{...s,additionalProperties:{},isEnabled:e.isEnabled??!0,getRandom:G,enrich(w){this.additionalProperties={...this.additionalProperties,...w}},async track(w,P){if(!this.isEnabled)return Promise.resolve();const{audioPath:S,...D}=P||{},C={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({data:JSON.stringify([{event:w,properties:{...this.additionalProperties,...D,...s,source:t,time:Date.now(),$insert_id:this.getRandom(),origin:window.location.href,"Screen Height":window.screen.height||window.innerWidth,"Screen Width":window.screen.width||window.innerHeight,"User Agent":navigator.userAgent}}])})};try{return await fetch(Je,C).then(R=>R.json())}catch(R){return console.error(R)}},linkTrack(w,P,S,D){ne[w]||(ne[w]={events:{},resolvedDependencies:[]}),D.includes(S)||D.push(S);const C=ne[w];if(C.events[S]={props:P},C.resolvedDependencies.push(S),D.every(F=>C.resolvedDependencies.includes(F))){const F=D.reduce((B,l)=>C.events[l]?{...B,...C.events[l].props}:B,{});this.track(w,F),C.resolvedDependencies=C.resolvedDependencies.filter(B=>!D.includes(B)),D.forEach(B=>{delete C.events[B]})}}}}function Ue(){let e=0;return{reset:()=>e=0,update:()=>e=Date.now(),get:(t=!1)=>t?Date.now()-e:e}}const K=Ue();function Re(e){return e===b.Playground?{headers:{[be]:"true"}}:{}}async function Se(e,t,a,r,s=!1,i){try{return!i&&r!==b.DirectPlayback&&(i=await t.newChat(e.id,{persist:s},Re(r)),a.track("agent-chat",{event:"created",chat_id:i.id,agent_id:e.id,mode:r})),{chat:i,chatMode:(i==null?void 0:i.chat_mode)??r}}catch(c){try{const n=JSON.parse(c.message);if((n==null?void 0:n.kind)==="InsufficientCreditsError")throw new Error("InsufficientCreditsError")}catch(n){console.error("Error parsing the error message:",n)}throw new Error("Cannot create new chat")}}function Ke(e){return e&&e.length>0?e:[]}function He(e,t,a,r,s){if(!e||!t)throw new Error("Please connect to the agent first");if(!e.interruptEnabled)throw new Error("Interrupt is not enabled for this stream");if(a!==U.Fluent)throw new Error("Interrupt only available for Fluent streams");if(!r&&!s)throw new Error("No active video to interrupt")}async function Ee(e,t){const a={type:L.StreamInterrupt,videoId:t,timestamp:Date.now()};e.sendDataChannelMessage(JSON.stringify(a))}function xe(e){return new Promise((t,a)=>{const{callbacks:r,host:s,auth:i}=e,{onMessage:c=null,onOpen:n=null,onClose:o=null,onError:d=null}=r||{},u=new WebSocket(`${s}?authorization=${ve(i)}`);u.onmessage=c,u.onclose=o,u.onerror=w=>{console.error(w),d==null||d("Websocket failed to connect",w),a(w)},u.onopen=w=>{n==null||n(w),t(u)}})}async function qe(e){const{retries:t=1}=e;let a=null;for(let r=0;(a==null?void 0:a.readyState)!==WebSocket.OPEN;r++)try{a=await xe(e)}catch(s){if(r===t)throw s;await pe(r*500)}return a}async function Ve(e,t,a){const r=a!=null&&a.onMessage?[a.onMessage]:[],s=await qe({auth:e,host:t,callbacks:{onError:i=>{var c;return(c=a.onError)==null?void 0:c.call(a,new se(i))},onMessage(i){const c=JSON.parse(i.data);r.forEach(n=>n(c.event,c))}}});return{socket:s,disconnect:()=>s.close(),subscribeToEvents:i=>r.push(i)}}function Xe(e){if(e.answer!==void 0)return e.answer;let t=0,a="";for(;t in e;)a+=e[t++];return a}function Ye(e,t,a,r,s){const i=r.messages[r.messages.length-1];if(!(e===X.Partial||e===X.Answer)||(i==null?void 0:i.role)!=="assistant")return;const{content:c,sequence:n}=t;e===X.Partial?a[n]=c:a.answer=c;const o=Xe(a);(i.content!==o||e===X.Answer)&&(i.content=o,s==null||s([...r.messages],e))}function Qe(e,t,a,r,s){let i={};return{clearQueue:()=>i={},onMessage:(c,n)=>{var o,d;if("content"in n)Ye(c,n,i,t,a.callbacks.onNewMessage),c===X.Answer&&e.track("agent-message-received",{messages:t.messages.length,mode:t.chatMode});else{const u=L,w=[u.StreamVideoDone,u.StreamVideoError,u.StreamVideoRejected],P=[u.StreamFailed,u.StreamVideoError,u.StreamVideoRejected],S=Ne(n,r,{mode:t.chatMode});if(c=c,c===u.StreamVideoCreated)e.linkTrack("agent-video",S,u.StreamVideoCreated,["start"]);else if(w.includes(c)){const D=c.split("/")[1];P.includes(c)?e.track("agent-video",{...S,event:D}):e.linkTrack("agent-video",{...S,event:D},c,["done"])}P.includes(c)&&((d=(o=a.callbacks).onError)==null||d.call(o,new Error(`Stream failed with event ${c}`),{data:n})),n.event===u.StreamDone&&s()}}}}function Ge(e,t,a,r){const s=re(e,`${t}/agents/${a}`,r);return{createStream(i){return s.post("/streams",{output_resolution:i.output_resolution,compatibility_mode:i.compatibility_mode,stream_warmup:i.stream_warmup,session_timeout:i.session_timeout,fluent:i.fluent})},startConnection(i,c,n){return s.post(`/streams/${i}/sdp`,{session_id:n,answer:c})},addIceCandidate(i,c,n){return s.post(`/streams/${i}/ice`,{session_id:n,...c})},sendStreamRequest(i,c,n){return s.post(`/streams/${i}`,{session_id:c,...n})},close(i,c){return s.delete(`/streams/${i}`,{session_id:c})}}}function Ze(e,t,a,r){const s=re(e,`${t}/agents/${a}`,r);return{createStream(i,c){return s.post("/streams",{driver_url:i.driver_url,face:i.face,config:i.config,output_resolution:i.output_resolution,compatibility_mode:i.compatibility_mode,stream_warmup:i.stream_warmup,session_timeout:i.session_timeout,fluent:i.fluent},c)},startConnection(i,c,n,o){return s.post(`/streams/${i}/sdp`,{session_id:n,answer:c},o)},addIceCandidate(i,c,n,o){return s.post(`/streams/${i}/ice`,{session_id:n,...c},o)},sendStreamRequest(i,c,n,o){return s.post(`/streams/${i}`,{session_id:c,...n},o)},close(i,c,n){return s.delete(`/streams/${i}`,{session_id:c},n)}}}function Oe(e,t,a){const r=(t.timestamp-e.timestamp)/1e3;return{duration:r,bytesReceived:t.bytesReceived-e.bytesReceived,bitrate:Math.round((t.bytesReceived-e.bytesReceived)*8/r),packetsReceived:t.packetsReceived-e.packetsReceived,packetsLost:t.packetsLost-e.packetsLost,framesDropped:t.framesDropped-e.framesDropped,framesDecoded:t.framesDecoded-e.framesDecoded,jitter:t.jitter,avgJitterDelayInInterval:(t.jitterBufferDelay-e.jitterBufferDelay)/(t.jitterBufferEmittedCount-e.jitterBufferEmittedCount),jitterBufferEmittedCount:t.jitterBufferEmittedCount-e.jitterBufferEmittedCount,jitterBufferDelay:(t.jitterBufferDelay-e.jitterBufferDelay)/r,framesPerSecond:t.framesPerSecond,freezeCount:t.freezeCount-e.freezeCount,freezeDuration:t.freezeDuration-e.freezeDuration,lowFpsCount:a}}function et(e){return e.filter(t=>t.freezeCount>0||t.framesPerSecond<21||t.framesDropped>0||t.packetsLost>0).map(t=>{const{timestamp:a,...r}=t,s=[];return t.freezeCount>0&&s.push("freeze"),t.framesPerSecond<21&&s.push("low fps"),t.framesDropped>0&&s.push("frames dropped"),t.packetsLost>0&&s.push("packet loss"),{...r,causes:s}})}function tt(e){let t="",a=0;for(const r of e.values())if(r&&r.type==="codec"&&r.mimeType.startsWith("video")&&(t=r.mimeType.split("/")[1]),r&&r.type==="candidate-pair"&&(a=r.currentRoundTripTime),r&&r.type==="inbound-rtp"&&r.kind==="video")return{codec:t,rtt:a,timestamp:r.timestamp,bytesReceived:r.bytesReceived,packetsReceived:r.packetsReceived,packetsLost:r.packetsLost,framesDropped:r.framesDropped,framesDecoded:r.framesDecoded,jitter:r.jitter,jitterBufferDelay:r.jitterBufferDelay,jitterBufferEmittedCount:r.jitterBufferEmittedCount,avgJitterDelayInInterval:r.jitterBufferDelay/r.jitterBufferEmittedCount,frameWidth:r.frameWidth,frameHeight:r.frameHeight,framesPerSecond:r.framesPerSecond,freezeCount:r.freezeCount,freezeDuration:r.totalFreezesDuration};return{}}function rt(e,t,a){const r=e.map((o,d)=>d===0?a?{timestamp:o.timestamp,duration:0,rtt:o.rtt,bytesReceived:o.bytesReceived-a.bytesReceived,bitrate:(o.bytesReceived-a.bytesReceived)*8/(t/1e3),packetsReceived:o.packetsReceived-a.packetsReceived,packetsLost:o.packetsLost-a.packetsLost,framesDropped:o.framesDropped-a.framesDropped,framesDecoded:o.framesDecoded-a.framesDecoded,jitter:o.jitter,jitterBufferDelay:o.jitterBufferDelay-a.jitterBufferDelay,jitterBufferEmittedCount:o.jitterBufferEmittedCount-a.jitterBufferEmittedCount,avgJitterDelayInInterval:(o.jitterBufferDelay-a.jitterBufferDelay)/(o.jitterBufferEmittedCount-a.jitterBufferEmittedCount),framesPerSecond:o.framesPerSecond,freezeCount:o.freezeCount-a.freezeCount,freezeDuration:o.freezeDuration-a.freezeDuration}:{timestamp:o.timestamp,rtt:o.rtt,duration:0,bytesReceived:o.bytesReceived,bitrate:o.bytesReceived*8/(t/1e3),packetsReceived:o.packetsReceived,packetsLost:o.packetsLost,framesDropped:o.framesDropped,framesDecoded:o.framesDecoded,jitter:o.jitter,jitterBufferDelay:o.jitterBufferDelay,jitterBufferEmittedCount:o.jitterBufferEmittedCount,avgJitterDelayInInterval:o.jitterBufferDelay/o.jitterBufferEmittedCount,framesPerSecond:o.framesPerSecond,freezeCount:o.freezeCount,freezeDuration:o.freezeDuration}:{timestamp:o.timestamp,duration:t*d/1e3,rtt:o.rtt,bytesReceived:o.bytesReceived-e[d-1].bytesReceived,bitrate:(o.bytesReceived-e[d-1].bytesReceived)*8/(t/1e3),packetsReceived:o.packetsReceived-e[d-1].packetsReceived,packetsLost:o.packetsLost-e[d-1].packetsLost,framesDropped:o.framesDropped-e[d-1].framesDropped,framesDecoded:o.framesDecoded-e[d-1].framesDecoded,jitter:o.jitter,jitterBufferDelay:o.jitterBufferDelay-e[d-1].jitterBufferDelay,jitterBufferEmittedCount:o.jitterBufferEmittedCount-e[d-1].jitterBufferEmittedCount,avgJitterDelayInInterval:(o.jitterBufferDelay-e[d-1].jitterBufferDelay)/(o.jitterBufferEmittedCount-e[d-1].jitterBufferEmittedCount),framesPerSecond:o.framesPerSecond,freezeCount:o.freezeCount-e[d-1].freezeCount,freezeDuration:o.freezeDuration-e[d-1].freezeDuration}),s=et(r),i=s.reduce((o,d)=>o+(d.causes.includes("low fps")?1:0),0),c=r.filter(o=>!!o.avgJitterDelayInInterval).map(o=>o.avgJitterDelayInInterval),n=r.filter(o=>!!o.rtt).map(o=>o.rtt);return{webRTCStats:{anomalies:s,minRtt:Math.min(...n),avgRtt:Ce(n),maxRtt:Math.max(...n),aggregateReport:Oe(e[0],e[e.length-1],i),minJitterDelayInInterval:Math.min(...c),maxJitterDelayInInterval:Math.max(...c),avgJitterDelayInInterval:Ce(c)},codec:e[0].codec,resolution:`${e[0].frameWidth}x${e[0].frameHeight}`}}const ae=100,nt=Math.max(Math.ceil(400/ae),1),at=.25,it=.28;function st(){let e=0,t,a,r=0;return s=>{for(const i of s.values())if(i&&i.type==="inbound-rtp"&&i.kind==="video"){const c=i.jitterBufferDelay,n=i.jitterBufferEmittedCount;if(a&&n>a){const u=c-t,w=n-a;r=u/w}t=c,a=n;const o=i.framesDecoded,d=o-e>0;return e=o,{isReceiving:d,avgJitterDelayInInterval:r,freezeCount:i.freezeCount}}return{isReceiving:!1,avgJitterDelayInInterval:r}}}function ot(e,t,a,r,s,i=!1){let c=[],n,o=0,d=!1,u=Y.Unknown,w=Y.Unknown,P=0,S=0;const D=st();return setInterval(async()=>{const C=await e.getStats(),{isReceiving:R,avgJitterDelayInInterval:F,freezeCount:B}=D(C),l=tt(C);if(R)o=0,P=B-S,w=F<at?Y.Strong:F>it&&P>1?Y.Weak:u,w!==u&&(s==null||s(w),u=w,S+=P,P=0),d||(r==null||r(p.Start),n=c[c.length-1],c=[],d=!0),c.push(l);else if(d&&(o++,o>=nt)){const y=rt(c,ae,n);r==null||r(p.Stop,y),t()||a(),S=B,d=!1}},ae)}let Ie=!1;const z=(e,t)=>Ie&&console.log(e,t),ct=(window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection).bind(window);function Me(e){switch(e){case"connected":return _.Connected;case"checking":return _.Connecting;case"failed":return _.Fail;case"new":return _.New;case"closed":return _.Closed;case"disconnected":return _.Disconnected;case"completed":return _.Completed;default:return _.New}}function dt(e){const[t,a=""]=e.split(/:(.+)/);try{const r=JSON.parse(a);return z("parsed data channel message",{subject:t,data:r}),{subject:t,data:r}}catch(r){return z("Failed to parse data channel message, returning data as string",{subject:t,rawData:a,error:r}),{subject:t,data:a}}}function lt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:r}){e===p.Start&&t===p.Start?a==null||a(p.Start):e===p.Stop&&t===p.Stop&&(a==null||a(p.Stop,r))}function ut({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,report:s}){e===p.Start?a==null||a(p.Start):e===p.Stop&&(a==null||a(p.Stop,s)),t===p.Start?r==null||r(Q.Talking):t===p.Stop&&(r==null||r(Q.Idle))}function _e({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,streamType:s,report:i}){s===U.Legacy?lt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:i}):s===U.Fluent&&ut({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,report:i})}async function ft(e,t,{debug:a=!1,callbacks:r,auth:s,baseURL:i=Z,analytics:c}){Ie=a;let n=!1,o=!1,d=p.Stop,u=p.Stop;const{startConnection:w,sendStreamRequest:P,close:S,createStream:D,addIceCandidate:C}=t.videoType===ee.Clip?Ge(s,i,e,r.onError):Ze(s,i,e,r.onError),{id:R,offer:F,ice_servers:B,session_id:l,fluent:y,interrupt_enabled:v}=await D(t),h=new ct({iceServers:B}),E=h.createDataChannel("JanusDataChannel");if(!l)throw new Error("Could not create session_id");const k=y?U.Fluent:U.Legacy;c.enrich({"stream-type":k});const $=t.stream_warmup&&!y,H=()=>n,N=()=>{var f;n=!0,o&&((f=r.onConnectionStateChange)==null||f.call(r,_.Connected))},I=ot(h,H,N,(f,g)=>_e({statsSignal:u=f,dataChannelSignal:k===U.Legacy?d:void 0,onVideoStateChange:r.onVideoStateChange,onAgentActivityStateChange:r.onAgentActivityStateChange,report:g,streamType:k}),f=>{var g;return(g=r.onConnectivityStateChange)==null?void 0:g.call(r,f)},$);h.onicecandidate=f=>{var g;z("peerConnection.onicecandidate",f);try{f.candidate&&f.candidate.sdpMid&&f.candidate.sdpMLineIndex!==null?C(R,{candidate:f.candidate.candidate,sdpMid:f.candidate.sdpMid,sdpMLineIndex:f.candidate.sdpMLineIndex},l):C(R,{candidate:null},l)}catch(A){(g=r.onError)==null||g.call(r,A,{streamId:R})}},E.onopen=()=>{o=!0,(!$||n)&&N()};function M(f){d=f===L.StreamStarted?p.Start:p.Stop,_e({statsSignal:k===U.Legacy?u:void 0,dataChannelSignal:d,onVideoStateChange:r.onVideoStateChange,onAgentActivityStateChange:r.onAgentActivityStateChange,streamType:k})}function T(f,g){const A=typeof g=="string"?g:g==null?void 0:g.metadata;A&&c.enrich({streamMetadata:A}),c.track("agent-chat",{event:"ready"})}const J={[L.StreamStarted]:M,[L.StreamDone]:M,[L.StreamReady]:T};E.onmessage=f=>{var q;const{subject:g,data:A}=dt(f.data);(q=J[g])==null||q.call(J,g,A)},h.oniceconnectionstatechange=()=>{var g;z("peerConnection.oniceconnectionstatechange => "+h.iceConnectionState);const f=Me(h.iceConnectionState);f!==_.Connected&&((g=r.onConnectionStateChange)==null||g.call(r,f))},h.ontrack=f=>{var g;z("peerConnection.ontrack",f),(g=r.onSrcObjectReady)==null||g.call(r,f.streams[0])},await h.setRemoteDescription(F),z("set remote description OK");const W=await h.createAnswer();return z("create answer OK"),await h.setLocalDescription(W),z("set local description OK"),await w(R,W,l),z("start connection OK"),{speak(f){return P(R,l,f)},async disconnect(){var f;if(R){const g=Me(h.iceConnectionState);if(h){if(g===_.New){clearInterval(I);return}h.close(),h.oniceconnectionstatechange=null,h.onnegotiationneeded=null,h.onicecandidate=null,h.ontrack=null}try{g===_.Connected&&await S(R,l).catch(A=>{})}catch(A){z("Error on close stream connection",A)}(f=r.onAgentActivityStateChange)==null||f.call(r,Q.Idle),clearInterval(I)}},sendDataChannelMessage(f){var g,A;if(!n||E.readyState!=="open"){z("Data channel is not ready for sending messages"),(g=r.onError)==null||g.call(r,new Error("Data channel is not ready for sending messages"),{streamId:R});return}try{E.send(f)}catch(q){z("Error sending data channel message",q),(A=r.onError)==null||A.call(r,q,{streamId:R})}},sessionId:l,streamId:R,streamType:k,interruptEnabled:v}}function mt(e,t){const{streamOptions:a}=t??{};return{videoType:ge(e.presenter.type),output_resolution:a==null?void 0:a.outputResolution,session_timeout:a==null?void 0:a.sessionTimeout,stream_warmup:a==null?void 0:a.streamWarmup,compatibility_mode:a==null?void 0:a.compatibilityMode,fluent:a==null?void 0:a.fluent}}function gt(e,t,a,r,s){s===U.Fluent?ht(e,t,a,r,s):pt(e,t,a,r,s)}function ht(e,t,a,r,s){e===p.Start?r.track("stream-session",{event:"start","stream-type":s}):e===p.Stop&&r.track("stream-session",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,"stream-type":s,...a})}function wt(e,t,a,r){K.get()<=0||(e===p.Start?a.linkTrack("agent-video",{event:"start",latency:K.get(!0),"stream-type":r},"start",[L.StreamVideoCreated]):e===p.Stop&&a.linkTrack("agent-video",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,"stream-type":r},"done",[L.StreamVideoDone]))}function pt(e,t,a,r,s){K.get()<=0||(e===p.Start?r.linkTrack("agent-video",{event:"start",latency:K.get(!0),"stream-type":s},"start",[L.StreamVideoCreated]):e===p.Stop&&r.linkTrack("agent-video",{event:"stop",is_greenscreen:t.presenter.type==="clip"&&t.presenter.is_greenscreen,background:t.presenter.type==="clip"&&t.presenter.background,"stream-type":s,...a},"done",[L.StreamVideoDone]))}function yt(e,t,a){return K.reset(),new Promise(async(r,s)=>{try{const i=await ft(e.id,mt(e,t),{...t,analytics:a,callbacks:{...t.callbacks,onConnectionStateChange:c=>{var n,o;(o=(n=t.callbacks).onConnectionStateChange)==null||o.call(n,c),c===_.Connected&&r(i)},onVideoStateChange:(c,n)=>{var o,d;(d=(o=t.callbacks).onVideoStateChange)==null||d.call(o,c),gt(c,e,n,a,i.streamType)},onAgentActivityStateChange:c=>{var n,o;(o=(n=t.callbacks).onAgentActivityStateChange)==null||o.call(n,c),wt(c===Q.Talking?p.Start:p.Stop,e,a,i.streamType)}}})}catch(i){s(i)}})}async function vt(e,t,a,r,s){var o,d,u,w;const{chat:i,chatMode:c}=await Se(e,a,r,t.mode,t.persistentChat,s);if(c&&c!==t.mode&&(t.mode=c,(d=(o=t.callbacks).onModeChange)==null||d.call(o,c),c===b.TextOnly))return(w=(u=t.callbacks).onError)==null||w.call(u,new ie(c)),{chat:i};const n=await yt(e,t,r);return{chat:i,streamingManager:n}}async function kt(e,t){var R,F,B;let a=!0,r=!1;const s=t.mixpanelKey||Pe,i=t.wsURL||je,c=t.baseURL||Z,n={messages:[],chatMode:t.mode||b.Functional},o=ke(t.auth,c,t.callbacks.onError),d=await o.getById(e),u=We({token:s,agent:d,isEnabled:t.enableAnalitics,distinctId:t.distinctId}),{onMessage:w,clearQueue:P}=Qe(u,n,t,d,()=>{var l;return(l=n.socketManager)==null?void 0:l.disconnect()});n.messages=Ke(t.initialMessages),(F=(R=t.callbacks).onNewMessage)==null||F.call(R,[...n.messages],"answer"),u.track("agent-sdk",{event:"loaded",...ze(d)});async function S(l){var $,H,N,I,M,T,J;(H=($=t.callbacks).onConnectionStateChange)==null||H.call($,_.Connecting),K.reset(),r=!1,l&&!a&&(delete n.chat,(I=(N=t.callbacks).onNewMessage)==null||I.call(N,[...n.messages],"answer"));const y=t.mode===b.DirectPlayback?Promise.resolve(void 0):Ve(t.auth,i,{onMessage:w,onError:t.callbacks.onError}),v=te(()=>vt(d,t,o,u,n.chat),{limit:3,timeout:Te,timeoutErrorMessage:"Timeout initializing the stream",shouldRetryFn:W=>(W==null?void 0:W.message)!=="Could not connect"&&W.status!==429,delayMs:1e3}).catch(W=>{var f,g;throw C(b.Maintenance),(g=(f=t.callbacks).onConnectionStateChange)==null||g.call(f,_.Fail),W}),[h,{streamingManager:E,chat:k}]=await Promise.all([y,v]);k&&k.id!==((M=n.chat)==null?void 0:M.id)&&((J=(T=t.callbacks).onNewChat)==null||J.call(T,k.id)),n.streamingManager=E,n.socketManager=h,n.chat=k,a=!1,C((k==null?void 0:k.chat_mode)??t.mode??b.Functional)}async function D(){var l,y,v,h;(l=n.socketManager)==null||l.disconnect(),await((y=n.streamingManager)==null?void 0:y.disconnect()),r=!1,delete n.streamingManager,delete n.socketManager,(h=(v=t.callbacks).onConnectionStateChange)==null||h.call(v,_.Disconnected)}async function C(l){var y,v;l!==n.chatMode&&(u.track("agent-mode-change",{mode:l}),n.chatMode=l,n.chatMode!==b.Functional&&await D(),(v=(y=t.callbacks).onModeChange)==null||v.call(y,l))}return{agent:d,getStreamType:()=>{var l;return(l=n.streamingManager)==null?void 0:l.streamType},getIsInterruptEnabled:()=>{var l;return((l=n.streamingManager)==null?void 0:l.interruptEnabled)??!1},starterMessages:((B=d.knowledge)==null?void 0:B.starter_message)||[],getSTTToken:()=>o.getSTTToken(d.id),changeMode:C,enrichAnalytics:u.enrich,async connect(){var l;await S(!0),u.track("agent-chat",{event:"connect",chatId:(l=n.chat)==null?void 0:l.id,agentId:d.id,mode:n.chatMode})},async reconnect(){var l;await D(),await S(!1),u.track("agent-chat",{event:"reconnect",chatId:(l=n.chat)==null?void 0:l.id,agentId:d.id,mode:n.chatMode})},async disconnect(){var l;await D(),u.track("agent-chat",{event:"disconnect",chatId:(l=n.chat)==null?void 0:l.id,agentId:d.id,mode:n.chatMode})},async chat(l){var E,k,$,H,N;const y=()=>{if(t.mode===b.DirectPlayback)throw new V("Direct playback is enabled, chat is disabled");if(l.length>=800)throw new V("Message cannot be more than 800 characters");if(l.length===0)throw new V("Message cannot be empty");if(n.chatMode===b.Maintenance)throw new V("Chat is in maintenance mode");if(![b.TextOnly,b.Playground].includes(n.chatMode)){if(!n.streamingManager)throw new V("Streaming manager is not initialized");if(!n.chat)throw new V("Chat is not initialized")}},v=async()=>{var I,M;if(!n.chat){const T=await Se(d,o,u,n.chatMode,t.persistentChat);if(!T.chat)throw new x(n.chatMode,!!t.persistentChat);n.chat=T.chat,(M=(I=t.callbacks).onNewChat)==null||M.call(I,n.chat.id)}return n.chat.id},h=async(I,M)=>te(()=>{var T,J;return o.chat(d.id,M,{chatMode:n.chatMode,streamId:(T=n.streamingManager)==null?void 0:T.streamId,sessionId:(J=n.streamingManager)==null?void 0:J.sessionId,messages:I.map(({matches:W,...f})=>f)},{...Re(n.chatMode),skipErrorHandler:!0})},{limit:2,shouldRetryFn:T=>{var f,g,A,q;const J=(f=T==null?void 0:T.message)==null?void 0:f.includes("missing or invalid session_id");return!((g=T==null?void 0:T.message)==null?void 0:g.includes("Stream Error"))&&!J?((q=(A=t.callbacks).onError)==null||q.call(A,T),!1):!0},onRetry:async()=>{await D(),await S(!1)}});try{P(),y(),n.messages.push({id:G(),role:"user",content:l,created_at:new Date(K.update()).toISOString()}),(k=(E=t.callbacks).onNewMessage)==null||k.call(E,[...n.messages],"user");const I=await v(),M=await h([...n.messages],I);return n.messages.push({id:G(),role:"assistant",content:M.result||"",created_at:new Date().toISOString(),context:M.context,matches:M.matches,videoId:M.videoId}),r&&M.videoId&&n.streamingManager&&(r=!1,n.messages[n.messages.length-1].interrupted=!0,await Ee(n.streamingManager,M.videoId)),u.track("agent-message-send",{event:"success",mode:n.chatMode,messages:n.messages.length+1}),M.result&&((H=($=t.callbacks).onNewMessage)==null||H.call($,[...n.messages],"answer"),u.track("agent-message-received",{latency:K.get(!0),mode:n.chatMode,messages:n.messages.length})),M}catch(I){throw r=!1,((N=n.messages[n.messages.length-1])==null?void 0:N.role)==="assistant"&&n.messages.pop(),u.track("agent-message-send",{event:"error",mode:n.chatMode,messages:n.messages.length}),I}},rate(l,y,v){var k,$,H,N;const h=n.messages.find(I=>I.id===l);if(n.chat){if(!h)throw new Error("Message not found")}else throw new Error("Chat is not initialized");const E=((k=h.matches)==null?void 0:k.map(I=>[I.document_id,I.id]))??[];return u.track("agent-rate",{event:v?"update":"create",thumb:y===1?"up":"down",knowledge_id:(($=d.knowledge)==null?void 0:$.id)??"",mode:n.chatMode,matches:E,score:y}),v?o.updateRating(d.id,n.chat.id,v,{knowledge_id:((H=d.knowledge)==null?void 0:H.id)??"",message_id:l,matches:E,score:y}):o.createRating(d.id,n.chat.id,{knowledge_id:((N=d.knowledge)==null?void 0:N.id)??"",message_id:l,matches:E,score:y})},deleteRate(l){var y;if(!n.chat)throw new Error("Chat is not initialized");return u.track("agent-rate-delete",{type:"text",chat_id:(y=n.chat)==null?void 0:y.id,id:l,mode:n.chatMode}),o.deleteRating(d.id,n.chat.id,l)},async speak(l){var E,k,$;function y(){if(typeof l=="string"){if(!d.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:d.presenter.voice,input:l,ssml:!1}}if(l.type==="text"&&!l.provider){if(!d.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:d.presenter.voice,input:l.input,ssml:l.ssml}}return l}const v=y();if(u.track("agent-speak",v),K.update(),n.messages&&v.type==="text"&&(n.messages.push({id:G(),role:"assistant",content:v.input,created_at:new Date(K.get(!0)).toISOString()}),(k=(E=t.callbacks).onNewMessage)==null||k.call(E,[...n.messages],"answer")),Ae(n.chatMode))return{duration:0,status:"success"};if(!n.streamingManager)throw new Error("Please connect to the agent first");return n.streamingManager.speak({script:v,metadata:{chat_id:($=n.chat)==null?void 0:$.id,agent_id:d.id}})},async interrupt(){var v,h,E;const l=n.messages[n.messages.length-1],y=(l==null?void 0:l.role)==="user";if(He(n.streamingManager,n.chat,(v=n.streamingManager)==null?void 0:v.streamType,y,!!(l!=null&&l.videoId)),y){r=!0;return}l.interrupted=!0,(E=(h=t.callbacks).onNewMessage)==null||E.call(h,[...n.messages],"answer"),Ee(n.streamingManager,l==null?void 0:l.videoId)}}}function Dt(e,t,a){const{getById:r}=ke(t,a||Z);return r(e)}m.AgentActivityState=Q,m.AgentStatus=de,m.ChatCreationFailed=x,m.ChatMode=b,m.ChatModeDowngraded=ie,m.ChatProgress=X,m.ConnectionState=_,m.ConnectivityState=Y,m.DocumentType=me,m.KnowledgeType=fe,m.PlanGroup=ce,m.Providers=he,m.RateState=le,m.StreamEvents=L,m.StreamType=U,m.StreamingState=p,m.Subject=ue,m.UserPlan=oe,m.ValidationError=V,m.VideoType=ee,m.VoiceAccess=we,m.WsError=se,m.createAgentManager=kt,m.getAgent=Dt,m.mapVideoType=ge,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
@@ -0,0 +1,4 @@
1
+ import { Chat, CreateStreamOptions, StreamType } from '../../types';
2
+ import { StreamingManager } from '../streaming-manager';
3
+ export declare function validateInterrupt(streamingManager: StreamingManager<CreateStreamOptions> | undefined, chat: Chat | undefined, streamType: StreamType | undefined, hasChatPending: boolean, hasVideoId: boolean): void;
4
+ export declare function sendInterrupt(streamingManager: StreamingManager<CreateStreamOptions>, videoId: string): Promise<void>;
@@ -9,6 +9,10 @@ export declare function createStreamingManager<T extends CreateStreamOptions>(ag
9
9
  * Method to close RTC connection
10
10
  */
11
11
  disconnect(): Promise<void>;
12
+ /**
13
+ * Method to send data channel messages to the server
14
+ */
15
+ sendDataChannelMessage(payload: string): void;
12
16
  /**
13
17
  * Session identifier information, should be returned in the body of all streaming requests
14
18
  */
@@ -18,5 +22,6 @@ export declare function createStreamingManager<T extends CreateStreamOptions>(ag
18
22
  */
19
23
  streamId: string;
20
24
  streamType: StreamType;
25
+ interruptEnabled: boolean | undefined;
21
26
  }>;
22
27
  export type StreamingManager<T extends CreateStreamOptions> = Awaited<ReturnType<typeof createStreamingManager<T>>>;
@@ -25,6 +25,8 @@ export interface Message {
25
25
  created_at?: string;
26
26
  matches?: ChatResponse['matches'];
27
27
  context?: string;
28
+ videoId?: string;
29
+ interrupted?: boolean;
28
30
  }
29
31
  export interface ChatPayload {
30
32
  messages: Message[];
@@ -53,6 +55,7 @@ export interface ChatResponse {
53
55
  matches?: IRetrivalMetadata[];
54
56
  chatMode?: ChatMode;
55
57
  context?: string;
58
+ videoId?: string;
56
59
  }
57
60
  export interface Chat {
58
61
  id: string;
@@ -144,6 +144,10 @@ export interface AgentManager {
144
144
  * Get the current stream type of the agent
145
145
  */
146
146
  getStreamType: () => StreamType | undefined;
147
+ /**
148
+ * Get if the stream supports interrupt
149
+ */
150
+ getIsInterruptEnabled: () => boolean;
147
151
  /**
148
152
  * Array of starter messages that will be sent to the agent when the chat starts
149
153
  */
@@ -197,5 +201,10 @@ export interface AgentManager {
197
201
  * @param properties flat json object with properties that will be added to analytics events fired from the sdk
198
202
  */
199
203
  enrichAnalytics: (properties: Record<string, any>) => void;
204
+ /**
205
+ * Method to interrupt the current video stream
206
+ * Only available for Fluent streams and when there's an active video to interrupt
207
+ */
208
+ interrupt: () => void;
200
209
  }
201
210
  export {};
@@ -1,6 +1,6 @@
1
- export * from './stream-script';
2
1
  export * from './auth';
3
2
  export * from './entities';
4
3
  export * from './stream';
4
+ export * from './stream-script';
5
5
  export * from './voice/stt';
6
6
  export * from './voice/tts';
@@ -34,6 +34,7 @@ export interface ICreateStreamRequestResponse extends StickyRequest {
34
34
  offer: any;
35
35
  ice_servers: IceServer[];
36
36
  fluent?: boolean;
37
+ interrupt_enabled?: boolean;
37
38
  }
38
39
  export interface IceCandidate {
39
40
  /**
@@ -26,6 +26,7 @@ export declare enum StreamEvents {
26
26
  StreamFailed = "stream/error",
27
27
  StreamReady = "stream/ready",
28
28
  StreamCreated = "stream/created",
29
+ StreamInterrupt = "stream/interrupt",
29
30
  StreamVideoCreated = "stream-video/started",
30
31
  StreamVideoDone = "stream-video/done",
31
32
  StreamVideoError = "stream-video/error",
@@ -119,3 +120,8 @@ export interface AnalyticsRTCStatsReport {
119
120
  lowFpsCount?: number;
120
121
  causes?: string[];
121
122
  }
123
+ export interface StreamInterruptPayload {
124
+ type: StreamEvents.StreamInterrupt;
125
+ videoId: string;
126
+ timestamp: number;
127
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@d-id/client-sdk",
3
3
  "private": false,
4
- "version": "1.1.0-beta.12",
4
+ "version": "1.1.0-beta.14",
5
5
  "type": "module",
6
6
  "description": "d-id client sdk",
7
7
  "repository": {