@d-id/client-sdk 1.1.0-beta.11 → 1.1.0-beta.13

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,T){typeof exports=="object"&&typeof module<"u"?T(exports):typeof define=="function"&&define.amd?define(["exports"],T):(m=typeof globalThis<"u"?globalThis:m||self,T(m.index={}))})(this,function(m){"use strict";var vt=Object.defineProperty;var kt=(m,T,N)=>T in m?vt(m,T,{enumerable:!0,configurable:!0,writable:!0,value:N}):m[T]=N;var Q=(m,T,N)=>(kt(m,typeof T!="symbol"?T+"":T,N),N);class T extends Error{constructor({kind:a,description:n,error:o}){super(JSON.stringify({kind:a,description:n}));Q(this,"kind");Q(this,"description");Q(this,"error");this.kind=a,this.description=n,this.error=o}}class N extends T{constructor(t,a){super({kind:"ChatCreationFailed",description:`Failed to create ${a?"persistent":""} chat, mode: ${t}`})}}class ne extends T{constructor(t){super({kind:"ChatModeDowngraded",description:`Chat mode downgraded to ${t}`})}}class W extends T{constructor(a,n){super({kind:"ValidationError",description:a});Q(this,"key");this.key=n}}class ae extends T{constructor(t){super({kind:"WSError",description:t})}}var ie=(e=>(e.TRIAL="trial",e.BASIC="basic",e.ENTERPRISE="enterprise",e.LITE="lite",e.ADVANCED="advanced",e))(ie||{}),se=(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))(se||{}),oe=(e=>(e.Created="created",e.Started="started",e.Done="done",e.Error="error",e.Rejected="rejected",e.Ready="ready",e))(oe||{}),ce=(e=>(e.Unrated="Unrated",e.Positive="Positive",e.Negative="Negative",e))(ce||{}),I=(e=>(e.Functional="Functional",e.TextOnly="TextOnly",e.Maintenance="Maintenance",e.Playground="Playground",e.DirectPlayback="DirectPlayback",e))(I||{}),U=(e=>(e.Embed="embed",e.Query="query",e.Partial="partial",e.Answer="answer",e.Complete="done",e))(U||{}),de=(e=>(e.KnowledgeProcessing="knowledge/processing",e.KnowledgeIndexing="knowledge/indexing",e.KnowledgeFailed="knowledge/error",e.KnowledgeDone="knowledge/done",e))(de||{}),le=(e=>(e.Knowledge="knowledge",e.Document="document",e.Record="record",e))(le||{}),ue=(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))(ue||{}),G=(e=>(e.Clip="clip",e.Talk="talk",e))(G||{});const fe=e=>{switch(e){case"clip":return"clip";case"talk":return"talk";default:throw new Error(`Unknown video type: ${e}`)}};var y=(e=>(e.Start="START",e.Stop="STOP",e))(y||{}),x=(e=>(e.Strong="STRONG",e.Weak="WEAK",e.Unknown="UNKNOWN",e))(x||{}),q=(e=>(e.Idle="IDLE",e.Talking="TALKING",e))(q||{});const Z={"stream/started":"START","stream/done":"STOP"};var K=(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))(K||{}),M=(e=>(e.New="new",e.Fail="fail",e.Connected="connected",e.Connecting="connecting",e.Closed="closed",e.Completed="completed",e.Disconnected="disconnected",e))(M||{}),F=(e=>(e.Legacy="legacy",e.Fluent="fluent",e))(F||{}),me=(e=>(e.Amazon="amazon",e.Microsoft="microsoft",e.Afflorithmics="afflorithmics",e.Elevenlabs="elevenlabs",e))(me||{}),ge=(e=>(e.Public="public",e.Premium="premium",e.Private="private",e))(ge||{});const Ie=45*1e3,Te="X-Playground-Chat",X="https://api.d-id.com",be="wss://notifications.d-id.com",je="79f81a83a67430be2bc0fd61042b8faa",he=e=>new Promise(t=>setTimeout(t,e)),V=(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)},Pe=e=>[I.TextOnly,I.Playground,I.Maintenance].includes(e);function Ae(e,t){let a;return{promise:new Promise((o,s)=>{a=setTimeout(()=>s(new Error(t)),e)}),clear:()=>clearTimeout(a)}}async function O(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 n;for(let o=1;o<=a.limit;o++)try{if(!a.timeout)return await e();const{promise:s,clear:r}=Ae(a.timeout,a.timeoutErrorMessage),c=e().finally(r);return await Promise.race([c,s])}catch(s){if(n=s,!a.shouldRetryFn(s)||o>=a.limit)throw s;await he(a.delayMs),a.onRetry(s)}throw n}function we(){let e=window.localStorage.getItem("did_external_key_id");if(!e){let t=V();window.localStorage.setItem("did_external_key_id",t),e=t}return e}let Be=V();function ye(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}.${we()}_${Be}`;throw new Error(`Unknown auth type: ${e}`)}const $e=e=>O(e,{limit:3,delayMs:1e3,timeout:0,shouldRetryFn:t=>t.status===429});function ee(e,t=X,a){const n=async(o,s)=>{const{skipErrorHandler:r,...c}=s||{},i=await $e(()=>fetch(t+(o!=null&&o.startsWith("/")?o:`/${o}`),{...c,headers:{...c.headers,Authorization:ye(e),"Content-Type":"application/json"}}));if(!i.ok){let d=await i.text().catch(()=>`Failed to fetch with status ${i.status}`);const f=new Error(d);throw a&&!r&&a(f,{url:o,options:c,headers:i.headers}),f}return i.json()};return{get(o,s){return n(o,{...s,method:"GET"})},post(o,s,r){return n(o,{...r,body:JSON.stringify(s),method:"POST"})},delete(o,s,r){return n(o,{...r,body:JSON.stringify(s),method:"DELETE"})},patch(o,s,r){return n(o,{...r,body:JSON.stringify(s),method:"PATCH"})}}}function pe(e,t=X,a){const n=ee(e,`${t}/agents`,a);return{create(o,s){return n.post("/",o,s)},getAgents(o,s){return n.get(`/${o?`?tag=${o}`:""}`,s).then(r=>r??[])},getById(o,s){return n.get(`/${o}`,s)},delete(o,s){return n.delete(`/${o}`,void 0,s)},update(o,s,r){return n.patch(`/${o}`,s,r)},newChat(o,s,r){return n.post(`/${o}/chat`,s,r)},chat(o,s,r,c){return n.post(`/${o}/chat/${s}`,r,c)},createRating(o,s,r,c){return n.post(`/${o}/chat/${s}/ratings`,r,c)},updateRating(o,s,r,c,i){return n.patch(`/${o}/chat/${s}/ratings/${r}`,c,i)},deleteRating(o,s,r,c){return n.delete(`/${o}/chat/${s}/ratings/${r}`,c)},getSTTToken(o,s){return n.get(`/${o}/stt-token`,s)}}}const ve=e=>e.type==="clip"&&e.presenter_id.startsWith("v2_")?"clip_v2":e.type;function Le(e){var o,s,r,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"},n=e.presenter;return{$os:`${a()}`,isMobile:`${t()=="Mobile"}`,browser:navigator.userAgent,origin:window.location.origin,agentType:ve(n),agentVoice:{voiceId:(s=(o=e.presenter)==null?void 0:o.voice)==null?void 0:s.voice_id,provider:(c=(r=e.presenter)==null?void 0:r.voice)==null?void 0:c.type}}}const ze=e=>e.reduce((t,a)=>t+a,0),ke=e=>ze(e)/e.length;function Fe(e,t,a){var i,d,f;const{event:n,...o}=e,{template:s}=(t==null?void 0:t.llm)||{},{language:r}=((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:r}},stitch:(t==null?void 0:t.presenter.type)==="talk"?(f=t==null?void 0:t.presenter)==null?void 0:f.stitch:void 0,...a}}let te={};const Ne="https://api-js.mixpanel.com/track/?verbose=1&ip=1";function Je(e){var s,r,c,i,d,f;const t=window!=null&&window.hasOwnProperty("DID_AGENTS_API")?"agents-ui":"agents-sdk",a=e.agent.presenter,n=(s=e.agent.llm)==null?void 0:s.prompt_customization,o={token:e.token||"testKey",distinct_id:e.distinctId||we(),agentId:e.agent.id,agentType:ve(a),owner_id:e.agent.owner_id??"",promptVersion:(r=e.agent.llm)==null?void 0:r.prompt_version,behavior:{role:n==null?void 0:n.role,personality:n==null?void 0:n.personality,instructions:(c=e.agent.llm)==null?void 0:c.instructions},temperature:(i=e.agent.llm)==null?void 0:i.temperature,knowledgeSource:n==null?void 0:n.knowledge_source,starterQuestionsCount:(f=(d=e.agent.knowledge)==null?void 0:d.starter_message)==null?void 0:f.length,topicsToAvoid:n==null?void 0:n.topics_to_avoid,maxResponseLength:n==null?void 0:n.max_response_length};return{...o,additionalProperties:{},isEnabled:e.isEnabled??!0,getRandom:V,enrich(g){const D={};if(g&&typeof g!="object")throw new Error("properties must be a flat json object");for(let p in g)(typeof g[p]=="string"||typeof g[p]=="number")&&(D[p]=g[p]);this.additionalProperties={...this.additionalProperties,...D}},async track(g,D){if(!this.isEnabled)return Promise.resolve();const{audioPath:p,...R}=D||{},S={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({data:JSON.stringify([{event:g,properties:{...this.additionalProperties,...R,...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(Ne,S).then(_=>_.json())}catch(_){return console.error(_)}},linkTrack(g,D,p,R){te[g]||(te[g]={events:{},resolvedDependencies:[]}),R.includes(p)||R.push(p);const S=te[g];if(S.events[p]={props:D},S.resolvedDependencies.push(p),R.every($=>S.resolvedDependencies.includes($))){const $=R.reduce((l,h)=>S.events[h]?{...l,...S.events[h].props}:l,{});this.track(g,$),S.resolvedDependencies=S.resolvedDependencies.filter(l=>!R.includes(l)),R.forEach(l=>{delete S.events[l]})}}}}function We(){let e=0;return{reset:()=>e=0,update:()=>e=Date.now(),get:(t=!1)=>t?Date.now()-e:e}}const z=We();function Ce(e){return e===I.Playground?{headers:{[Te]:"true"}}:{}}async function De(e,t,a,n,o=!1,s){try{return!s&&n!==I.DirectPlayback&&(s=await t.newChat(e.id,{persist:o},Ce(n)),a.track("agent-chat",{event:"created",chat_id:s.id,agent_id:e.id,mode:n})),{chat:s,chatMode:(s==null?void 0:s.chat_mode)??n}}catch(r){try{const c=JSON.parse(r.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 Ue(e){return e&&e.length>0?e:[]}function Ke(e){return new Promise((t,a)=>{const{callbacks:n,host:o,auth:s}=e,{onMessage:r=null,onOpen:c=null,onClose:i=null,onError:d=null}=n||{},f=new WebSocket(`${o}?authorization=${ye(s)}`);f.onmessage=r,f.onclose=i,f.onerror=g=>{console.error(g),d==null||d("Websocket failed to connect",g),a(g)},f.onopen=g=>{c==null||c(g),t(f)}})}async function He(e){const{retries:t=1}=e;let a=null;for(let n=0;(a==null?void 0:a.readyState)!==WebSocket.OPEN;n++)try{a=await Ke(e)}catch(o){if(n===t)throw o;await he(n*500)}return a}async function xe(e,t,a){const n=a!=null&&a.onMessage?[a.onMessage]:[],o=await He({auth:e,host:t,callbacks:{onError:s=>{var r;return(r=a.onError)==null?void 0:r.call(a,new ae(s))},onMessage(s){const r=JSON.parse(s.data);n.forEach(c=>c(r.event,r))}}});return{socket:o,disconnect:()=>o.close(),subscribeToEvents:s=>n.push(s)}}function qe(e){if(e.answer!==void 0)return e.answer;let t=0,a="";for(;t in e;)a+=e[t++];return a}function Ve(e,t,a,n,o){const s=n.messages[n.messages.length-1];if(!(e===U.Partial||e===U.Answer)||(s==null?void 0:s.role)!=="assistant")return;const{content:r,sequence:c}=t;e===U.Partial?a[c]=r:a.answer=r;const i=qe(a);(s.content!==i||e===U.Answer)&&(s.content=i,o==null||o([...n.messages],e))}function Xe(e,t,a,n,o){let s={};return{clearQueue:()=>s={},onMessage:(r,c)=>{var i,d;if("content"in c)Ve(r,c,s,t,a.callbacks.onNewMessage),r===U.Answer&&e.track("agent-message-received",{messages:t.messages.length,mode:t.chatMode});else{const f=K,g=[f.StreamVideoDone,f.StreamVideoError,f.StreamVideoRejected],D=[f.StreamFailed,f.StreamVideoError,f.StreamVideoRejected],p=Fe(c,n,{mode:t.chatMode});if(r=r,r===f.StreamVideoCreated)e.linkTrack("agent-video",p,f.StreamVideoCreated,["start"]);else if(g.includes(r)){const R=r.split("/")[1];D.includes(r)?e.track("agent-video",{...p,event:R}):e.linkTrack("agent-video",{...p,event:R},r,["done"])}D.includes(r)&&((d=(i=a.callbacks).onError)==null||d.call(i,new Error(`Stream failed with event ${r}`),{data:c})),c.event===f.StreamDone&&o()}}}}function Ye(e,t,a,n){const o=ee(e,`${t}/agents/${a}`,n);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,r,c){return o.post(`/streams/${s}/sdp`,{session_id:c,answer:r})},addIceCandidate(s,r,c){return o.post(`/streams/${s}/ice`,{session_id:c,...r})},sendStreamRequest(s,r,c){return o.post(`/streams/${s}`,{session_id:r,...c})},close(s,r){return o.delete(`/streams/${s}`,{session_id:r})}}}function Qe(e,t,a,n){const o=ee(e,`${t}/agents/${a}`,n);return{createStream(s,r){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},r)},startConnection(s,r,c,i){return o.post(`/streams/${s}/sdp`,{session_id:c,answer:r},i)},addIceCandidate(s,r,c,i){return o.post(`/streams/${s}/ice`,{session_id:c,...r},i)},sendStreamRequest(s,r,c,i){return o.post(`/streams/${s}`,{session_id:r,...c},i)},close(s,r,c){return o.delete(`/streams/${s}`,{session_id:r},c)}}}function Ge(e,t,a){const n=(t.timestamp-e.timestamp)/1e3;return{duration:n,bytesReceived:t.bytesReceived-e.bytesReceived,bitrate:Math.round((t.bytesReceived-e.bytesReceived)*8/n),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)/n,framesPerSecond:t.framesPerSecond,freezeCount:t.freezeCount-e.freezeCount,freezeDuration:t.freezeDuration-e.freezeDuration,lowFpsCount:a}}function Ze(e){return e.filter(t=>t.freezeCount>0||t.framesPerSecond<21||t.framesDropped>0||t.packetsLost>0).map(t=>{const{timestamp:a,...n}=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"),{...n,causes:o}})}function Oe(e){let t="",a=0;for(const n of e.values())if(n&&n.type==="codec"&&n.mimeType.startsWith("video")&&(t=n.mimeType.split("/")[1]),n&&n.type==="candidate-pair"&&(a=n.currentRoundTripTime),n&&n.type==="inbound-rtp"&&n.kind==="video")return{codec:t,rtt:a,timestamp:n.timestamp,bytesReceived:n.bytesReceived,packetsReceived:n.packetsReceived,packetsLost:n.packetsLost,framesDropped:n.framesDropped,framesDecoded:n.framesDecoded,jitter:n.jitter,jitterBufferDelay:n.jitterBufferDelay,jitterBufferEmittedCount:n.jitterBufferEmittedCount,avgJitterDelayInInterval:n.jitterBufferDelay/n.jitterBufferEmittedCount,frameWidth:n.frameWidth,frameHeight:n.frameHeight,framesPerSecond:n.framesPerSecond,freezeCount:n.freezeCount,freezeDuration:n.totalFreezesDuration};return{}}function et(e,t,a){const n=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=Ze(n),s=o.reduce((i,d)=>i+(d.causes.includes("low fps")?1:0),0),r=n.filter(i=>!!i.avgJitterDelayInInterval).map(i=>i.avgJitterDelayInInterval),c=n.filter(i=>!!i.rtt).map(i=>i.rtt);return{webRTCStats:{anomalies:o,minRtt:Math.min(...c),avgRtt:ke(c),maxRtt:Math.max(...c),aggregateReport:Ge(e[0],e[e.length-1],s),minJitterDelayInInterval:Math.min(...r),maxJitterDelayInInterval:Math.max(...r),avgJitterDelayInInterval:ke(r)},codec:e[0].codec,resolution:`${e[0].frameWidth}x${e[0].frameHeight}`}}const re=100,tt=Math.max(Math.ceil(400/re),1),rt=.25,nt=.28;function at(){let e=0,t,a,n=0;return o=>{for(const s of o.values())if(s&&s.type==="inbound-rtp"&&s.kind==="video"){const r=s.jitterBufferDelay,c=s.jitterBufferEmittedCount;if(a&&c>a){const f=r-t,g=c-a;n=f/g}t=r,a=c;const i=s.framesDecoded,d=i-e>0;return e=i,{isReceiving:d,avgJitterDelayInInterval:n,freezeCount:s.freezeCount}}return{isReceiving:!1,avgJitterDelayInInterval:n}}}function it(e,t,a,n,o,s=!1){let r=[],c,i=0,d=!1,f=x.Unknown,g=x.Unknown,D=0,p=0;const R=at();return setInterval(async()=>{const S=await e.getStats(),{isReceiving:_,avgJitterDelayInInterval:$,freezeCount:l}=R(S),h=Oe(S);if(_)i=0,D=l-p,g=$<rt?x.Strong:$>nt&&D>1?x.Weak:f,g!==f&&(o==null||o(g),f=g,p+=D,D=0),d||(n==null||n(y.Start),c=r[r.length-1],r=[],d=!0),r.push(h);else if(d&&(i++,i>=tt)){const k=et(r,re,c);n==null||n(y.Stop,k),t()||a(),p=l,d=!1}},re)}let Re=!1;const J=(e,t)=>Re&&console.log(e,t),st=(window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection).bind(window);function Se(e){switch(e){case"connected":return M.Connected;case"checking":return M.Connecting;case"failed":return M.Fail;case"new":return M.New;case"closed":return M.Closed;case"disconnected":return M.Disconnected;case"completed":return M.Completed;default:return M.New}}function ot({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:n}){e===y.Start&&t===y.Start?a==null||a(y.Start):e===y.Stop&&t===y.Stop&&(a==null||a(y.Stop,n))}function ct({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:n,report:o}){e===y.Start?a==null||a(y.Start):e===y.Stop&&(a==null||a(y.Stop,o)),t===y.Start?n==null||n(q.Talking):t===y.Stop&&(n==null||n(q.Idle))}function Ee({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:n,streamType:o,report:s}){o===F.Legacy?ot({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:s}):o===F.Fluent&&ct({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:n,report:s})}async function dt(e,t,{debug:a=!1,callbacks:n,auth:o,baseURL:s=X,analytics:r}){Re=a;let c=!1,i=!1,d=y.Stop,f=y.Stop;const{startConnection:g,sendStreamRequest:D,close:p,createStream:R,addIceCandidate:S}=t.videoType===G.Clip?Ye(o,s,e,n.onError):Qe(o,s,e,n.onError),{id:_,offer:$,ice_servers:l,session_id:h,fluent:k}=await R(t),w=new st({iceServers:l}),j=w.createDataChannel("JanusDataChannel");if(!h)throw new Error("Could not create session_id");const C=k?F.Fluent:F.Legacy;r.enrich({"stream-type":C});const P=t.stream_warmup&&!k,A=()=>c,L=()=>{var u;c=!0,i&&((u=n.onConnectionStateChange)==null||u.call(n,M.Connected))},E=it(w,A,L,(u,v)=>Ee({statsSignal:f=u,dataChannelSignal:C===F.Legacy?d:void 0,onVideoStateChange:n.onVideoStateChange,onAgentActivityStateChange:n.onAgentActivityStateChange,report:v,streamType:C}),u=>{var v;return(v=n.onConnectivityStateChange)==null?void 0:v.call(n,u)},P);w.onicecandidate=u=>{var v;J("peerConnection.onicecandidate",u);try{u.candidate&&u.candidate.sdpMid&&u.candidate.sdpMLineIndex!==null?S(_,{candidate:u.candidate.candidate,sdpMid:u.candidate.sdpMid,sdpMLineIndex:u.candidate.sdpMLineIndex},h):S(_,{candidate:null},h)}catch(B){(v=n.onError)==null||v.call(n,B,{streamId:_})}},j.onopen=()=>{i=!0,(!P||c)&&L()},j.onmessage=u=>{u.data in Z&&(d=Z[u.data],Ee({statsSignal:C===F.Legacy?f:void 0,dataChannelSignal:d,onVideoStateChange:n.onVideoStateChange,onAgentActivityStateChange:n.onAgentActivityStateChange,streamType:C}))},w.oniceconnectionstatechange=()=>{var v;J("peerConnection.oniceconnectionstatechange => "+w.iceConnectionState);const u=Se(w.iceConnectionState);u!==M.Connected&&((v=n.onConnectionStateChange)==null||v.call(n,u))},w.ontrack=u=>{var v;J("peerConnection.ontrack",u),(v=n.onSrcObjectReady)==null||v.call(n,u.streams[0])},await w.setRemoteDescription($),J("set remote description OK");const b=await w.createAnswer();return J("create answer OK"),await w.setLocalDescription(b),J("set local description OK"),await g(_,b,h),J("start connection OK"),{speak(u){return D(_,h,u)},async disconnect(){var u;if(_){const v=Se(w.iceConnectionState);if(w){if(v===M.New){clearInterval(E);return}w.close(),w.oniceconnectionstatechange=null,w.onnegotiationneeded=null,w.onicecandidate=null,w.ontrack=null}try{v===M.Connected&&await p(_,h).catch(B=>{})}catch(B){J("Error on close stream connection",B)}(u=n.onAgentActivityStateChange)==null||u.call(n,q.Idle),clearInterval(E)}},sessionId:h,streamId:_,streamType:C}}function lt(e,t){const{streamOptions:a}=t??{};return{videoType:fe(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,n,o){o===F.Fluent?ft(e,t,a,n,o):gt(e,t,a,n,o)}function ft(e,t,a,n,o){e===y.Start?n.track("stream-session",{event:"start","stream-type":o}):e===y.Stop&&n.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,n){z.get()<=0||(e===y.Start?a.linkTrack("agent-video",{event:"start",latency:z.get(!0),"stream-type":n},"start",[K.StreamVideoCreated]):e===y.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":n},"done",[K.StreamVideoDone]))}function gt(e,t,a,n,o){z.get()<=0||(e===y.Start?n.linkTrack("agent-video",{event:"start",latency:z.get(!0),"stream-type":o},"start",[K.StreamVideoCreated]):e===y.Stop&&n.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",[K.StreamVideoDone]))}function ht(e,t,a){return z.reset(),new Promise(async(n,o)=>{try{const s=await dt(e.id,lt(e,t),{...t,analytics:a,callbacks:{...t.callbacks,onConnectionStateChange:r=>{var c,i;(i=(c=t.callbacks).onConnectionStateChange)==null||i.call(c,r),r===M.Connected&&n(s)},onVideoStateChange:(r,c)=>{var i,d;(d=(i=t.callbacks).onVideoStateChange)==null||d.call(i,r),ut(r,e,c,a,s.streamType)},onAgentActivityStateChange:r=>{var c,i;(i=(c=t.callbacks).onAgentActivityStateChange)==null||i.call(c,r),mt(r===q.Talking?y.Start:y.Stop,e,a,s.streamType)}}})}catch(s){o(s)}})}async function wt(e,t,a,n,o){var i,d,f,g;const{chat:s,chatMode:r}=await De(e,a,n,t.mode,t.persistentChat,o);if(r&&r!==t.mode&&(t.mode=r,(d=(i=t.callbacks).onModeChange)==null||d.call(i,r),r===I.TextOnly))return(g=(f=t.callbacks).onError)==null||g.call(f,new ne(r)),{chat:s};const c=await ht(e,t,n);return{chat:s,streamingManager:c}}async function yt(e,t){var S,_,$;let a=!0;const n=t.mixpanelKey||je,o=t.wsURL||be,s=t.baseURL||X,r={messages:[],chatMode:t.mode||I.Functional},c=pe(t.auth,s,t.callbacks.onError),i=await c.getById(e),d=Je({token:n,agent:i,isEnabled:t.enableAnalitics,distinctId:t.distinctId}),{onMessage:f,clearQueue:g}=Xe(d,r,t,i,()=>{var l;return(l=r.socketManager)==null?void 0:l.disconnect()});r.messages=Ue(t.initialMessages),(_=(S=t.callbacks).onNewMessage)==null||_.call(S,[...r.messages],"answer"),d.track("agent-sdk",{event:"loaded",...Le(i)});async function D(l){var P,A,L,E,b,u,v;(A=(P=t.callbacks).onConnectionStateChange)==null||A.call(P,M.Connecting),z.reset(),l&&!a&&(delete r.chat,(E=(L=t.callbacks).onNewMessage)==null||E.call(L,[...r.messages],"answer"));const h=t.mode===I.DirectPlayback?Promise.resolve(void 0):xe(t.auth,o,{onMessage:f,onError:t.callbacks.onError}),k=O(()=>wt(i,t,c,d,r.chat),{limit:3,timeout:Ie,timeoutErrorMessage:"Timeout initializing the stream",shouldRetryFn:B=>(B==null?void 0:B.message)!=="Could not connect"&&B.status!==429,delayMs:1e3}).catch(B=>{var H,Y;throw R(I.Maintenance),(Y=(H=t.callbacks).onConnectionStateChange)==null||Y.call(H,M.Fail),B}),[w,{streamingManager:j,chat:C}]=await Promise.all([h,k]);C&&C.id!==((b=r.chat)==null?void 0:b.id)&&((v=(u=t.callbacks).onNewChat)==null||v.call(u,C.id)),r.streamingManager=j,r.socketManager=w,r.chat=C,a=!1,R((C==null?void 0:C.chat_mode)??t.mode??I.Functional)}async function p(){var l,h,k,w;(l=r.socketManager)==null||l.disconnect(),await((h=r.streamingManager)==null?void 0:h.disconnect()),delete r.streamingManager,delete r.socketManager,(w=(k=t.callbacks).onConnectionStateChange)==null||w.call(k,M.Disconnected)}async function R(l){var h,k;l!==r.chatMode&&(d.track("agent-mode-change",{mode:l}),r.chatMode=l,r.chatMode!==I.Functional&&await p(),(k=(h=t.callbacks).onModeChange)==null||k.call(h,l))}return{agent:i,getStreamType:()=>{var l;return(l=r.streamingManager)==null?void 0:l.streamType},starterMessages:(($=i.knowledge)==null?void 0:$.starter_message)||[],getSTTToken:()=>c.getSTTToken(i.id),changeMode:R,enrichAnalytics:d.enrich,async connect(){var l;await D(!0),d.track("agent-chat",{event:"connect",chatId:(l=r.chat)==null?void 0:l.id,agentId:i.id,mode:r.chatMode})},async reconnect(){var l;await p(),await D(!1),d.track("agent-chat",{event:"reconnect",chatId:(l=r.chat)==null?void 0:l.id,agentId:i.id,mode:r.chatMode})},async disconnect(){var l;await p(),d.track("agent-chat",{event:"disconnect",chatId:(l=r.chat)==null?void 0:l.id,agentId:i.id,mode:r.chatMode})},async chat(l){var j,C,P,A,L;const h=()=>{if(t.mode===I.DirectPlayback)throw new W("Direct playback is enabled, chat is disabled");if(l.length>=800)throw new W("Message cannot be more than 800 characters");if(l.length===0)throw new W("Message cannot be empty");if(r.chatMode===I.Maintenance)throw new W("Chat is in maintenance mode");if(![I.TextOnly,I.Playground].includes(r.chatMode)){if(!r.streamingManager)throw new W("Streaming manager is not initialized");if(!r.chat)throw new W("Chat is not initialized")}},k=async()=>{var E,b;if(!r.chat){const u=await De(i,c,d,r.chatMode,t.persistentChat);if(!u.chat)throw new N(r.chatMode,!!t.persistentChat);r.chat=u.chat,(b=(E=t.callbacks).onNewChat)==null||b.call(E,r.chat.id)}return r.chat.id},w=async(E,b)=>O(()=>{var u,v;return c.chat(i.id,b,{chatMode:r.chatMode,streamId:(u=r.streamingManager)==null?void 0:u.streamId,sessionId:(v=r.streamingManager)==null?void 0:v.sessionId,messages:E.map(({matches:B,...H})=>H)},{...Ce(r.chatMode),skipErrorHandler:!0})},{limit:2,shouldRetryFn:u=>{var H,Y,Me,_e;const v=(H=u==null?void 0:u.message)==null?void 0:H.includes("missing or invalid session_id");return!((Y=u==null?void 0:u.message)==null?void 0:Y.includes("Stream Error"))&&!v?((_e=(Me=t.callbacks).onError)==null||_e.call(Me,u),!1):!0},onRetry:async()=>{await p(),await D(!1)}});try{g(),h(),r.messages.push({id:V(),role:"user",content:l,created_at:new Date(z.update()).toISOString()}),(C=(j=t.callbacks).onNewMessage)==null||C.call(j,[...r.messages],"user");const E=await k(),b=await w([...r.messages],E);return r.messages.push({id:V(),role:"assistant",content:b.result||"",created_at:new Date().toISOString(),context:b.context,matches:b.matches}),d.track("agent-message-send",{event:"success",mode:r.chatMode,messages:r.messages.length+1}),b.result&&((A=(P=t.callbacks).onNewMessage)==null||A.call(P,[...r.messages],"answer"),d.track("agent-message-received",{latency:z.get(!0),mode:r.chatMode,messages:r.messages.length})),b}catch(E){throw((L=r.messages[r.messages.length-1])==null?void 0:L.role)==="assistant"&&r.messages.pop(),d.track("agent-message-send",{event:"error",mode:r.chatMode,messages:r.messages.length}),E}},rate(l,h,k){var C,P,A,L;const w=r.messages.find(E=>E.id===l);if(r.chat){if(!w)throw new Error("Message not found")}else throw new Error("Chat is not initialized");const j=((C=w.matches)==null?void 0:C.map(E=>[E.document_id,E.id]))??[];return d.track("agent-rate",{event:k?"update":"create",thumb:h===1?"up":"down",knowledge_id:((P=i.knowledge)==null?void 0:P.id)??"",mode:r.chatMode,matches:j,score:h}),k?c.updateRating(i.id,r.chat.id,k,{knowledge_id:((A=i.knowledge)==null?void 0:A.id)??"",message_id:l,matches:j,score:h}):c.createRating(i.id,r.chat.id,{knowledge_id:((L=i.knowledge)==null?void 0:L.id)??"",message_id:l,matches:j,score:h})},deleteRate(l){var h;if(!r.chat)throw new Error("Chat is not initialized");return d.track("agent-rate-delete",{type:"text",chat_id:(h=r.chat)==null?void 0:h.id,id:l,mode:r.chatMode}),c.deleteRating(i.id,r.chat.id,l)},async speak(l){var j,C,P,A;if(!r.streamingManager)throw new Error("Please connect to the agent first");function h(){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 k=h();d.track("agent-speak",k),z.update(),(j=r.chat)!=null&&j.id&&k.type==="text"&&(r.messages.push({id:V(),role:"assistant",content:k.input,created_at:new Date(z.get(!0)).toISOString()}),(P=(C=t.callbacks).onNewMessage)==null||P.call(C,[...r.messages],"answer"));const w=Pe(r.chatMode);return r.chat&&w?{duration:0,status:"success"}:r.streamingManager.speak({script:k,metadata:{chat_id:(A=r.chat)==null?void 0:A.id,agent_id:i.id}})}}}function pt(e,t,a){const{getById:n}=pe(t,a||X);return n(e)}m.AgentActivityState=q,m.AgentStatus=oe,m.ChatCreationFailed=N,m.ChatMode=I,m.ChatModeDowngraded=ne,m.ChatProgress=U,m.ConnectionState=M,m.ConnectivityState=x,m.DataChannelSignalMap=Z,m.DocumentType=ue,m.KnowledgeType=le,m.PlanGroup=se,m.Providers=me,m.RateState=ce,m.StreamEvents=K,m.StreamType=F,m.StreamingState=y,m.Subject=de,m.UserPlan=ie,m.ValidationError=W,m.VideoType=G,m.VoiceAccess=ge,m.WsError=ae,m.createAgentManager=yt,m.getAgent=pt,m.mapVideoType=fe,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||{}),z=(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))(z||{}),_=(e=>(e.New="new",e.Fail="fail",e.Connected="connected",e.Connecting="connecting",e.Closed="closed",e.Completed="completed",e.Disconnected="disconnected",e))(_||{}),K=(e=>(e.Legacy="legacy",e.Fluent="fluent",e))(K||{}),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(N=>C.resolvedDependencies.includes(N))){const N=D.reduce((B,l)=>C.events[l]?{...B,...C.events[l].props}:B,{});this.track(w,N),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 H=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!==K.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:z.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=z,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:N,freezeCount:B}=D(C),l=tt(C);if(R)o=0,P=B-S,w=N<at?Y.Strong:N>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 F=(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 F("parsed data channel message",{subject:t,data:r}),{subject:t,data:r}}catch(r){return F("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===K.Legacy?lt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:i}):s===K.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:N,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?K.Fluent:K.Legacy;c.enrich({"stream-type":k});const $=t.stream_warmup&&!y,L=()=>n,J=()=>{var f;n=!0,o&&((f=r.onConnectionStateChange)==null||f.call(r,_.Connected))},I=ot(h,L,J,(f,g)=>_e({statsSignal:u=f,dataChannelSignal:k===K.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;F("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)&&J()};function M(f){d=f===z.StreamStarted?p.Start:p.Stop,_e({statsSignal:k===K.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 W={[z.StreamStarted]:M,[z.StreamDone]:M,[z.StreamReady]:T};E.onmessage=f=>{var q;const{subject:g,data:A}=dt(f.data);(q=W[g])==null||q.call(W,g,A)},h.oniceconnectionstatechange=()=>{var g;F("peerConnection.oniceconnectionstatechange => "+h.iceConnectionState);const f=Me(h.iceConnectionState);f!==_.Connected&&((g=r.onConnectionStateChange)==null||g.call(r,f))},h.ontrack=f=>{var g;F("peerConnection.ontrack",f),(g=r.onSrcObjectReady)==null||g.call(r,f.streams[0])},await h.setRemoteDescription(N),F("set remote description OK");const U=await h.createAnswer();return F("create answer OK"),await h.setLocalDescription(U),F("set local description OK"),await w(R,U,l),F("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){F("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"){F("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){F("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===K.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){H.get()<=0||(e===p.Start?a.linkTrack("agent-video",{event:"start",latency:H.get(!0),"stream-type":r},"start",[z.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",[z.StreamVideoDone]))}function pt(e,t,a,r,s){H.get()<=0||(e===p.Start?r.linkTrack("agent-video",{event:"start",latency:H.get(!0),"stream-type":s},"start",[z.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",[z.StreamVideoDone]))}function yt(e,t,a){return H.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,N,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),(N=(R=t.callbacks).onNewMessage)==null||N.call(R,[...n.messages],"answer"),u.track("agent-sdk",{event:"loaded",...ze(d)});async function S(l){var $,L,J,I,M,T,W;(L=($=t.callbacks).onConnectionStateChange)==null||L.call($,_.Connecting),H.reset(),r=!1,l&&!a&&(delete n.chat,(I=(J=t.callbacks).onNewMessage)==null||I.call(J,[...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:U=>(U==null?void 0:U.message)!=="Could not connect"&&U.status!==429,delayMs:1e3}).catch(U=>{var f,g;throw C(b.Maintenance),(g=(f=t.callbacks).onConnectionStateChange)==null||g.call(f,_.Fail),U}),[h,{streamingManager:E,chat:k}]=await Promise.all([y,v]);k&&k.id!==((M=n.chat)==null?void 0:M.id)&&((W=(T=t.callbacks).onNewChat)==null||W.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,$,L,J;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,W;return o.chat(d.id,M,{chatMode:n.chatMode,streamId:(T=n.streamingManager)==null?void 0:T.streamId,sessionId:(W=n.streamingManager)==null?void 0:W.sessionId,messages:I.map(({matches:U,...f})=>f)},{...Re(n.chatMode),skipErrorHandler:!0})},{limit:2,shouldRetryFn:T=>{var f,g,A,q;const W=(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"))&&!W?((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(H.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&&((L=($=t.callbacks).onNewMessage)==null||L.call($,[...n.messages],"answer"),u.track("agent-message-received",{latency:H.get(!0),mode:n.chatMode,messages:n.messages.length})),M}catch(I){throw r=!1,((J=n.messages[n.messages.length-1])==null?void 0:J.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,$,L,J;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:((L=d.knowledge)==null?void 0:L.id)??"",message_id:l,matches:E,score:y}):o.createRating(d.id,n.chat.id,{knowledge_id:((J=d.knowledge)==null?void 0:J.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,$,L;if(!n.streamingManager)throw new Error("Please connect to the agent first");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();u.track("agent-speak",v),H.update(),(E=n.chat)!=null&&E.id&&v.type==="text"&&(n.messages.push({id:G(),role:"assistant",content:v.input,created_at:new Date(H.get(!0)).toISOString()}),($=(k=t.callbacks).onNewMessage)==null||$.call(k,[...n.messages],"answer"));const h=Ae(n.chatMode);return n.chat&&h?{duration:0,status:"success"}:n.streamingManager.speak({script:v,metadata:{chat_id:(L=n.chat)==null?void 0:L.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=z,m.StreamType=K,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
  /**
@@ -18,7 +18,6 @@ export declare enum AgentActivityState {
18
18
  Idle = "IDLE",
19
19
  Talking = "TALKING"
20
20
  }
21
- export declare const DataChannelSignalMap: Record<string, StreamingState>;
22
21
  export declare enum StreamEvents {
23
22
  ChatAnswer = "chat/answer",
24
23
  ChatPartial = "chat/partial",
@@ -27,6 +26,7 @@ export declare enum StreamEvents {
27
26
  StreamFailed = "stream/error",
28
27
  StreamReady = "stream/ready",
29
28
  StreamCreated = "stream/created",
29
+ StreamInterrupt = "stream/interrupt",
30
30
  StreamVideoCreated = "stream-video/started",
31
31
  StreamVideoDone = "stream-video/done",
32
32
  StreamVideoError = "stream-video/error",
@@ -120,3 +120,8 @@ export interface AnalyticsRTCStatsReport {
120
120
  lowFpsCount?: number;
121
121
  causes?: string[];
122
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.11",
4
+ "version": "1.1.0-beta.13",
5
5
  "type": "module",
6
6
  "description": "d-id client sdk",
7
7
  "repository": {