@d-id/client-sdk 1.1.0-beta.5 → 1.1.0-beta.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +962 -807
- package/dist/index.umd.cjs +1 -1
- package/dist/src/services/analytics/timestamp-tracker.d.ts +6 -1
- package/dist/src/services/chat/index.d.ts +2 -1
- package/dist/src/services/interrupt/index.d.ts +4 -0
- package/dist/src/services/streaming-manager/index.d.ts +6 -1
- package/dist/src/services/streaming-manager/stats/report.d.ts +3 -0
- package/dist/src/types/entities/agents/chat.d.ts +8 -1
- package/dist/src/types/entities/agents/manager.d.ts +16 -1
- package/dist/src/types/index.d.ts +1 -1
- package/dist/src/types/stream/rtc.d.ts +1 -0
- package/dist/src/types/stream/stream.d.ts +12 -1
- package/dist/src/utils/chat.d.ts +3 -0
- package/dist/src/utils/index.d.ts +1 -1
- package/package.json +3 -3
package/dist/index.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(f,I){typeof exports=="object"&&typeof module<"u"?I(exports):typeof define=="function"&&define.amd?define(["exports"],I):(f=typeof globalThis<"u"?globalThis:f||self,I(f.index={}))})(this,function(f){"use strict";var ht=Object.defineProperty;var wt=(f,I,F)=>I in f?ht(f,I,{enumerable:!0,configurable:!0,writable:!0,value:F}):f[I]=F;var Y=(f,I,F)=>(wt(f,typeof I!="symbol"?I+"":I,F),F);class I extends Error{constructor({kind:r,description:a,error:o}){super(JSON.stringify({kind:r,description:a}));Y(this,"kind");Y(this,"description");Y(this,"error");this.kind=r,this.description=a,this.error=o}}class F extends I{constructor(t,r){super({kind:"ChatCreationFailed",description:`Failed to create ${r?"persistent":""} chat, mode: ${t}`})}}class re extends I{constructor(t){super({kind:"ChatModeDowngraded",description:`Chat mode downgraded to ${t}`})}}class H extends I{constructor(r,a){super({kind:"ValidationError",description:r});Y(this,"key");this.key=a}}class ae extends I{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||{}),j=(e=>(e.Functional="Functional",e.TextOnly="TextOnly",e.Maintenance="Maintenance",e.Playground="Playground",e.DirectPlayback="DirectPlayback",e))(j||{}),K=(e=>(e.Embed="embed",e.Query="query",e.Partial="partial",e.Answer="answer",e.Complete="done",e))(K||{}),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||{}),q=(e=>(e.Strong="STRONG",e.Weak="WEAK",e.Unknown="UNKNOWN",e))(q||{}),x=(e=>(e.Idle="IDLE",e.Talking="TALKING",e))(x||{});const Z={"stream/started":"START","stream/done":"STOP"};var V=(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))(V||{}),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||{}),N=(e=>(e.Legacy="legacy",e.Fluent="fluent",e))(N||{}),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",je="wss://notifications.d-id.com",be="79f81a83a67430be2bc0fd61042b8faa",he=e=>new Promise(t=>setTimeout(t,e)),Q=()=>Math.random().toString(16).slice(2);function Pe(e,t){let r;return{promise:new Promise((o,s)=>{r=setTimeout(()=>s(new Error(t)),e)}),clear:()=>clearTimeout(r)}}async function O(e,t){const r={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 a;for(let o=1;o<=r.limit;o++)try{if(!r.timeout)return await e();const{promise:s,clear:n}=Pe(r.timeout,r.timeoutErrorMessage),i=e().finally(n);return await Promise.race([i,s])}catch(s){if(a=s,!r.shouldRetryFn(s)||o>=r.limit)throw s;await he(r.delayMs),r.onRetry(s)}throw a}function we(){let e=window.localStorage.getItem("did_external_key_id");return e||(e=Math.random().toString(16).slice(2),window.localStorage.setItem("did_external_key_id",e)),e}let Ae=Q();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()}_${Ae}`;throw new Error(`Unknown auth type: ${e}`)}const Be=e=>O(e,{limit:3,delayMs:1e3,timeout:0,shouldRetryFn:t=>t.status===429});function ee(e,t=X,r){const a=async(o,s)=>{const{skipErrorHandler:n,...i}=s||{},c=await Be(()=>fetch(t+(o!=null&&o.startsWith("/")?o:`/${o}`),{...i,headers:{...i.headers,Authorization:ye(e),"Content-Type":"application/json"}}));if(!c.ok){let l=await c.text().catch(()=>`Failed to fetch with status ${c.status}`);const m=new Error(l);throw r&&!n&&r(m,{url:o,options:i,headers:c.headers}),m}return c.json()};return{get(o,s){return a(o,{...s,method:"GET"})},post(o,s,n){return a(o,{...n,body:JSON.stringify(s),method:"POST"})},delete(o,s,n){return a(o,{...n,body:JSON.stringify(s),method:"DELETE"})},patch(o,s,n){return a(o,{...n,body:JSON.stringify(s),method:"PATCH"})}}}function pe(e,t=X,r){const a=ee(e,`${t}/agents`,r);return{create(o,s){return a.post("/",o,s)},getAgents(o,s){return a.get(`/${o?`?tag=${o}`:""}`,s).then(n=>n??[])},getById(o,s){return a.get(`/${o}`,s)},delete(o,s){return a.delete(`/${o}`,void 0,s)},update(o,s,n){return a.patch(`/${o}`,s,n)},newChat(o,s,n){return a.post(`/${o}/chat`,s,n)},chat(o,s,n,i){return a.post(`/${o}/chat/${s}`,n,i)},createRating(o,s,n,i){return a.post(`/${o}/chat/${s}/ratings`,n,i)},updateRating(o,s,n,i,c){return a.patch(`/${o}/chat/${s}/ratings/${n}`,i,c)},deleteRating(o,s,n,i){return a.delete(`/${o}/chat/${s}/ratings/${n}`,i)},getSTTToken(o,s){return a.get(`/${o}/stt-token`,s)}}}const ve=e=>e.type==="clip"&&e.presenter_id.startsWith("v2_")?"clip_v2":e.type;function $e(e){var o,s,n,i;const t=()=>/Mobi|Android/i.test(navigator.userAgent)?"Mobile":"Desktop",r=()=>{const c=navigator.platform;return c.toLowerCase().includes("win")?"Windows":c.toLowerCase().includes("mac")?"Mac OS X":c.toLowerCase().includes("linux")?"Linux":"Unknown"},a=e.presenter;return{$os:`${r()}`,isMobile:`${t()=="Mobile"}`,browser:navigator.userAgent,origin:window.location.origin,agentType:ve(a),agentVoice:{voiceId:(s=(o=e.presenter)==null?void 0:o.voice)==null?void 0:s.voice_id,provider:(i=(n=e.presenter)==null?void 0:n.voice)==null?void 0:i.type}}}const Le=e=>e.reduce((t,r)=>t+r,0),ze=e=>Le(e)/e.length;function Fe(e,t,r){var c,l,m;const{event:a,...o}=e,{template:s}=(t==null?void 0:t.llm)||{},{language:n}=((c=t==null?void 0:t.presenter)==null?void 0:c.voice)||{};return{...o,llm:{...o.llm,template:s},script:{...o.script,provider:{...(l=o==null?void 0:o.script)==null?void 0:l.provider,language:n}},stitch:(t==null?void 0:t.presenter.type)==="talk"?(m=t==null?void 0:t.presenter)==null?void 0:m.stitch:void 0,...r}}let te={};const Ne="https://api-js.mixpanel.com/track/?verbose=1&ip=1";function Je(e){var s,n,i,c,l,m;const t=window!=null&&window.hasOwnProperty("DID_AGENTS_API")?"agents-ui":"agents-sdk",r=e.agent.presenter,a=(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(r),owner_id:e.agent.owner_id??"",promptVersion:(n=e.agent.llm)==null?void 0:n.prompt_version,behavior:{role:a==null?void 0:a.role,personality:a==null?void 0:a.personality,instructions:(i=e.agent.llm)==null?void 0:i.instructions},temperature:(c=e.agent.llm)==null?void 0:c.temperature,knowledgeSource:a==null?void 0:a.knowledge_source,starterQuestionsCount:(m=(l=e.agent.knowledge)==null?void 0:l.starter_message)==null?void 0:m.length,topicsToAvoid:a==null?void 0:a.topics_to_avoid,maxResponseLength:a==null?void 0:a.max_response_length};return{...o,additionalProperties:{},isEnabled:e.isEnabled??!0,getRandom:()=>Math.random().toString(16).slice(2),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(B=>S.resolvedDependencies.includes(B))){const B=R.reduce((d,h)=>S.events[h]?{...d,...S.events[h].props}:d,{});this.track(g,B),S.resolvedDependencies=S.resolvedDependencies.filter(d=>!R.includes(d)),R.forEach(d=>{delete S.events[d]})}}}}function We(){let e=0;return{reset:()=>e=0,update:()=>e=Date.now(),get:(t=!1)=>t?Date.now()-e:e}}const J=We();function Ce(e){return e===j.Playground?{headers:{[Te]:"true"}}:{}}async function ke(e,t,r,a,o=!1,s){try{return!s&&a!==j.DirectPlayback&&(s=await t.newChat(e.id,{persist:o},Ce(a)),r.track("agent-chat",{event:"created",chat_id:s.id,agent_id:e.id,mode:a})),{chat:s,chatMode:(s==null?void 0:s.chat_mode)??a}}catch(n){try{const i=JSON.parse(n.message);if((i==null?void 0:i.kind)==="InsufficientCreditsError")throw new Error("InsufficientCreditsError")}catch(i){console.error("Error parsing the error message:",i)}throw new Error("Cannot create new chat")}}function Ue(e){return e&&e.length>0?e:[]}function He(e){return new Promise((t,r)=>{const{callbacks:a,host:o,auth:s}=e,{onMessage:n=null,onOpen:i=null,onClose:c=null,onError:l=null}=a||{},m=new WebSocket(`${o}?authorization=${ye(s)}`);m.onmessage=n,m.onclose=c,m.onerror=g=>{console.error(g),l==null||l("Websocket failed to connect",g),r(g)},m.onopen=g=>{i==null||i(g),t(m)}})}async function Ke(e){const{retries:t=1}=e;let r=null;for(let a=0;(r==null?void 0:r.readyState)!==WebSocket.OPEN;a++)try{r=await He(e)}catch(o){if(a===t)throw o;await he(a*500)}return r}async function qe(e,t,r){const a=r!=null&&r.onMessage?[r.onMessage]:[],o=await Ke({auth:e,host:t,callbacks:{onError:s=>{var n;return(n=r.onError)==null?void 0:n.call(r,new ae(s))},onMessage(s){const n=JSON.parse(s.data);a.forEach(i=>i(n.event,n))}}});return{socket:o,disconnect:()=>o.close(),subscribeToEvents:s=>a.push(s)}}function xe(e){if(e.answer!==void 0)return e.answer;let t=0,r="";for(;t in e;)r+=e[t++];return r}function Ve(e,t,r,a,o){const s=a.messages[a.messages.length-1];if(!(e===K.Partial||e===K.Answer)||(s==null?void 0:s.role)!=="assistant")return;const{content:n,sequence:i}=t;e===K.Partial?r[i]=n:r.answer=n;const c=xe(r);(s.content!==c||e===K.Answer)&&(s.content=c,o==null||o([...a.messages],e))}function Xe(e,t,r,a,o){let s={};return{clearQueue:()=>s={},onMessage:(n,i)=>{var c,l;if("content"in i)Ve(n,i,s,t,r.callbacks.onNewMessage),n===K.Answer&&e.track("agent-message-received",{messages:t.messages.length,mode:t.chatMode});else{const m=V,g=[m.StreamVideoDone,m.StreamVideoError,m.StreamVideoRejected],D=[m.StreamFailed,m.StreamVideoError,m.StreamVideoRejected],p=Fe(i,a,{mode:t.chatMode});if(n=n,n===m.StreamVideoCreated)e.linkTrack("agent-video",p,m.StreamVideoCreated,["start"]);else if(g.includes(n)){const R=n.split("/")[1];D.includes(n)?e.track("agent-video",{...p,event:R}):e.linkTrack("agent-video",{...p,event:R},n,["done"])}D.includes(n)&&((l=(c=r.callbacks).onError)==null||l.call(c,new Error(`Stream failed with event ${n}`),{data:i})),i.event===m.StreamDone&&o()}}}}function Ye(e,t,r,a){const o=ee(e,`${t}/agents/${r}`,a);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,i){return o.post(`/streams/${s}/sdp`,{session_id:i,answer:n})},addIceCandidate(s,n,i){return o.post(`/streams/${s}/ice`,{session_id:i,...n})},sendStreamRequest(s,n,i){return o.post(`/streams/${s}`,{session_id:n,...i})},close(s,n){return o.delete(`/streams/${s}`,{session_id:n})}}}function Qe(e,t,r,a){const o=ee(e,`${t}/agents/${r}`,a);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,i,c){return o.post(`/streams/${s}/sdp`,{session_id:i,answer:n},c)},addIceCandidate(s,n,i,c){return o.post(`/streams/${s}/ice`,{session_id:i,...n},c)},sendStreamRequest(s,n,i,c){return o.post(`/streams/${s}`,{session_id:n,...i},c)},close(s,n,i){return o.delete(`/streams/${s}`,{session_id:n},i)}}}function Ge(e,t,r){const a=(t.timestamp-e.timestamp)/1e3;return{duration:a,bytesReceived:t.bytesReceived-e.bytesReceived,bitrate:Math.round((t.bytesReceived-e.bytesReceived)*8/a),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)/a,framesPerSecond:t.framesPerSecond,freezeCount:t.freezeCount-e.freezeCount,freezeDuration:t.freezeDuration-e.freezeDuration,lowFpsCount:r}}function Ze(e){return e.filter(t=>t.freezeCount>0||t.framesPerSecond<21||t.framesDropped>0||t.packetsLost>0).map(t=>{const{timestamp:r,...a}=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"),{...a,causes:o}})}function Oe(e){let t="";for(const r of e.values())if(r&&r.type==="codec"&&r.mimeType.startsWith("video")&&(t=r.mimeType.split("/")[1]),r&&r.type==="inbound-rtp"&&r.kind==="video")return{codec:t,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 et(e,t,r){const a=e.map((i,c)=>c===0?r?{timestamp:i.timestamp,duration:0,bytesReceived:i.bytesReceived-r.bytesReceived,bitrate:(i.bytesReceived-r.bytesReceived)*8/(t/1e3),packetsReceived:i.packetsReceived-r.packetsReceived,packetsLost:i.packetsLost-r.packetsLost,framesDropped:i.framesDropped-r.framesDropped,framesDecoded:i.framesDecoded-r.framesDecoded,jitter:i.jitter,jitterBufferDelay:i.jitterBufferDelay-r.jitterBufferDelay,jitterBufferEmittedCount:i.jitterBufferEmittedCount-r.jitterBufferEmittedCount,avgJitterDelayInInterval:(i.jitterBufferDelay-r.jitterBufferDelay)/(i.jitterBufferEmittedCount-r.jitterBufferEmittedCount),framesPerSecond:i.framesPerSecond,freezeCount:i.freezeCount-r.freezeCount,freezeDuration:i.freezeDuration-r.freezeDuration}:{timestamp:i.timestamp,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*c/1e3,bytesReceived:i.bytesReceived-e[c-1].bytesReceived,bitrate:(i.bytesReceived-e[c-1].bytesReceived)*8/(t/1e3),packetsReceived:i.packetsReceived-e[c-1].packetsReceived,packetsLost:i.packetsLost-e[c-1].packetsLost,framesDropped:i.framesDropped-e[c-1].framesDropped,framesDecoded:i.framesDecoded-e[c-1].framesDecoded,jitter:i.jitter,jitterBufferDelay:i.jitterBufferDelay-e[c-1].jitterBufferDelay,jitterBufferEmittedCount:i.jitterBufferEmittedCount-e[c-1].jitterBufferEmittedCount,avgJitterDelayInInterval:(i.jitterBufferDelay-e[c-1].jitterBufferDelay)/(i.jitterBufferEmittedCount-e[c-1].jitterBufferEmittedCount),framesPerSecond:i.framesPerSecond,freezeCount:i.freezeCount-e[c-1].freezeCount,freezeDuration:i.freezeDuration-e[c-1].freezeDuration}),o=Ze(a),s=o.reduce((i,c)=>i+(c.causes.includes("low fps")?1:0),0),n=a.map(i=>i.avgJitterDelayInInterval);return{webRTCStats:{anomalies:o,aggregateReport:Ge(e[0],e[e.length-1],s),minJitterDelayInInterval:Math.min(...n),maxJitterDelayInInterval:Math.max(...n),avgJitterDelayInInterval:ze(n)},codec:e[0].codec,resolution:`${e[0].frameWidth}x${e[0].frameHeight}`}}const ne=100,tt=Math.max(Math.ceil(400/ne),1),nt=.25,rt=.28;function at(){let e=0,t,r,a=0;return o=>{for(const s of o.values())if(s&&s.type==="inbound-rtp"&&s.kind==="video"){const n=s.jitterBufferDelay,i=s.jitterBufferEmittedCount;if(r&&i>r){const m=n-t,g=i-r;a=m/g}t=n,r=i;const c=s.framesDecoded,l=c-e>0;return e=c,{isReceiving:l,avgJitterDelayInInterval:a,freezeCount:s.freezeCount}}return{isReceiving:!1,avgJitterDelayInInterval:a}}}function it(e,t,r,a,o,s=!1){let n=[],i,c=0,l=!1,m=q.Unknown,g=q.Unknown,D=0,p=0;const R=at();return setInterval(async()=>{const S=await e.getStats(),{isReceiving:_,avgJitterDelayInInterval:B,freezeCount:d}=R(S),h=Oe(S);if(_)c=0,D=d-p,g=B<nt?q.Strong:B>rt&&D>1?q.Weak:m,g!==m&&(o==null||o(g),m=g,p+=D,D=0),l||(a==null||a(y.Start),i=n[n.length-1],n=[],l=!0),n.push(h);else if(l&&(c++,c>=tt)){const C=et(n,ne,i);a==null||a(y.Stop,C),t()||r(),l=!1}},ne)}let De=!1;const W=(e,t)=>De&&console.log(e,t),st=(window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection).bind(window);function Re(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:r,report:a}){e===y.Start&&t===y.Start?r==null||r(y.Start):e===y.Stop&&t===y.Stop&&(r==null||r(y.Stop,a))}function ct({statsSignal:e,dataChannelSignal:t,onVideoStateChange:r,onAgentActivityStateChange:a,report:o}){e===y.Start?r==null||r(y.Start):e===y.Stop&&(r==null||r(y.Stop,o)),t===y.Start?a==null||a(x.Talking):t===y.Stop&&(a==null||a(x.Idle))}function Se({statsSignal:e,dataChannelSignal:t,onVideoStateChange:r,onAgentActivityStateChange:a,streamType:o,report:s}){o===N.Legacy?ot({statsSignal:e,dataChannelSignal:t,onVideoStateChange:r,report:s}):o===N.Fluent&&ct({statsSignal:e,dataChannelSignal:t,onVideoStateChange:r,onAgentActivityStateChange:a,report:s})}async function dt(e,t,{debug:r=!1,callbacks:a,auth:o,baseURL:s=X}){De=r;let n=!1,i=!1,c=y.Stop,l=y.Stop,m=q.Unknown;const{startConnection:g,sendStreamRequest:D,close:p,createStream:R,addIceCandidate:S}=t.videoType===G.Clip?Ye(o,s,e,a.onError):Qe(o,s,e,a.onError),{id:_,offer:B,ice_servers:d,session_id:h,fluent:C}=await R(t),w=new st({iceServers:d}),b=w.createDataChannel("JanusDataChannel");if(!h)throw new Error("Could not create session_id");const k=C?N.Fluent:N.Legacy,P=t.stream_warmup&&!C,L=()=>n,$=()=>{var u;n=!0,i&&((u=a.onConnectionStateChange)==null||u.call(a,M.Connected))},E=it(w,L,$,(u,v)=>Se({statsSignal:l=u,dataChannelSignal:k===N.Legacy?c:void 0,onVideoStateChange:a.onVideoStateChange,onAgentActivityStateChange:a.onAgentActivityStateChange,report:v,streamType:k}),u=>{var v;return(v=a.onConnectivityStateChange)==null?void 0:v.call(a,m)},P);w.onicecandidate=u=>{var v;W("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(A){(v=a.onError)==null||v.call(a,A,{streamId:_})}},b.onopen=()=>{i=!0,(!P||n)&&$()},b.onmessage=u=>{u.data in Z&&(c=Z[u.data],Se({statsSignal:k===N.Legacy?l:void 0,dataChannelSignal:c,onVideoStateChange:a.onVideoStateChange,onAgentActivityStateChange:a.onAgentActivityStateChange,streamType:k}))},w.oniceconnectionstatechange=()=>{var v;W("peerConnection.oniceconnectionstatechange => "+w.iceConnectionState);const u=Re(w.iceConnectionState);u!==M.Connected&&((v=a.onConnectionStateChange)==null||v.call(a,u))},w.ontrack=u=>{var v;W("peerConnection.ontrack",u),(v=a.onSrcObjectReady)==null||v.call(a,u.streams[0])},await w.setRemoteDescription(B),W("set remote description OK");const T=await w.createAnswer();return W("create answer OK"),await w.setLocalDescription(T),W("set local description OK"),await g(_,T,h),W("start connection OK"),{speak(u){return D(_,h,u)},async disconnect(){var u,v,A;if(_){const z=Re(w.iceConnectionState);if(w){if(z===M.New){(u=a.onVideoStateChange)==null||u.call(a,y.Stop),clearInterval(E);return}w.close(),w.oniceconnectionstatechange=null,w.onnegotiationneeded=null,w.onicecandidate=null,w.ontrack=null}try{z===M.Connected&&await p(_,h).catch(U=>{})}catch(U){W("Error on close stream connection",U)}(v=a.onVideoStateChange)==null||v.call(a,y.Stop),(A=a.onAgentActivityStateChange)==null||A.call(a,x.Idle),clearInterval(E)}},sessionId:h,streamId:_,streamType:k}}function lt(e,t){const{streamOptions:r}=t??{};return{videoType:fe(e.presenter.type),output_resolution:r==null?void 0:r.outputResolution,session_timeout:r==null?void 0:r.sessionTimeout,stream_warmup:r==null?void 0:r.streamWarmup,compatibility_mode:r==null?void 0:r.compatibilityMode,fluent:r==null?void 0:r.fluent}}function Ee(e,t,r,a,o){J.get()>0&&(e===y.Start?a.linkTrack("agent-video",{event:"start",latency:J.get(!0),"stream-type":o},"start",[V.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":o,...r},"done",[V.StreamVideoDone]))}function ut(e,t,r){return J.reset(),new Promise(async(a,o)=>{try{const s=await dt(e.id,lt(e,t),{...t,analytics:r,callbacks:{...t.callbacks,onConnectionStateChange:n=>{var i,c;(c=(i=t.callbacks).onConnectionStateChange)==null||c.call(i,n),n===M.Connected&&a(s)},onVideoStateChange:(n,i)=>{var c,l;(l=(c=t.callbacks).onVideoStateChange)==null||l.call(c,n),Ee(n,e,i,r,s.streamType)},onAgentActivityStateChange:n=>{var i,c;(c=(i=t.callbacks).onAgentActivityStateChange)==null||c.call(i,n),Ee(n===x.Talking?y.Start:y.Stop,e,void 0,r,s.streamType)}}})}catch(s){o(s)}})}async function ft(e,t,r,a,o){var c,l,m,g;const{chat:s,chatMode:n}=await ke(e,r,a,t.mode,t.persistentChat,o);if(n&&n!==t.mode&&(t.mode=n,(l=(c=t.callbacks).onModeChange)==null||l.call(c,n),n===j.TextOnly))return(g=(m=t.callbacks).onError)==null||g.call(m,new re(n)),{chat:s};const i=await ut(e,t,a);return{chat:s,streamingManager:i}}async function mt(e,t){var S,_,B;let r=!0;const a=t.mixpanelKey||be,o=t.wsURL||je,s=t.baseURL||X,n={messages:[],chatMode:t.mode||j.Functional},i=pe(t.auth,s,t.callbacks.onError),c=await i.getById(e),l=Je({token:a,agent:c,isEnabled:t.enableAnalitics,distinctId:t.distinctId}),{onMessage:m,clearQueue:g}=Xe(l,n,t,c,()=>{var d;return(d=n.socketManager)==null?void 0:d.disconnect()});n.messages=Ue(t.initialMessages),(_=(S=t.callbacks).onNewMessage)==null||_.call(S,[...n.messages],"answer"),l.track("agent-sdk",{event:"loaded",...$e(c)});async function D(d){var P,L,$,E,T,u,v;(L=(P=t.callbacks).onConnectionStateChange)==null||L.call(P,M.Connecting),J.reset(),d&&!r&&(delete n.chat,(E=($=t.callbacks).onNewMessage)==null||E.call($,[...n.messages],"answer"));const h=t.mode===j.DirectPlayback?Promise.resolve(void 0):qe(t.auth,o,{onMessage:m,onError:t.callbacks.onError}),C=O(()=>ft(c,t,i,l,n.chat),{limit:3,timeout:Ie,timeoutErrorMessage:"Timeout initializing the stream",shouldRetryFn:A=>(A==null?void 0:A.message)!=="Could not connect"&&A.status!==429,delayMs:1e3}).catch(A=>{var z,U;throw R(j.Maintenance),(U=(z=t.callbacks).onConnectionStateChange)==null||U.call(z,M.Fail),A}),[w,{streamingManager:b,chat:k}]=await Promise.all([h,C]);k&&k.id!==((T=n.chat)==null?void 0:T.id)&&((v=(u=t.callbacks).onNewChat)==null||v.call(u,k.id)),n.streamingManager=b,n.socketManager=w,n.chat=k,r=!1,R((k==null?void 0:k.chat_mode)??t.mode??j.Functional)}async function p(){var d,h,C,w;(d=n.socketManager)==null||d.disconnect(),await((h=n.streamingManager)==null?void 0:h.disconnect()),delete n.streamingManager,delete n.socketManager,(w=(C=t.callbacks).onConnectionStateChange)==null||w.call(C,M.Disconnected)}async function R(d){var h,C;d!==n.chatMode&&(l.track("agent-mode-change",{mode:d}),n.chatMode=d,n.chatMode!==j.Functional&&await p(),(C=(h=t.callbacks).onModeChange)==null||C.call(h,d))}return{agent:c,getStreamType:()=>{var d;return(d=n.streamingManager)==null?void 0:d.streamType},starterMessages:((B=c.knowledge)==null?void 0:B.starter_message)||[],getSTTToken:()=>i.getSTTToken(c.id),changeMode:R,enrichAnalytics:l.enrich,async connect(){var d;await D(!0),l.track("agent-chat",{event:"connect",chatId:(d=n.chat)==null?void 0:d.id,agentId:c.id,mode:n.chatMode})},async reconnect(){var d;await p(),await D(!1),l.track("agent-chat",{event:"reconnect",chatId:(d=n.chat)==null?void 0:d.id,agentId:c.id,mode:n.chatMode})},async disconnect(){var d;await p(),l.track("agent-chat",{event:"disconnect",chatId:(d=n.chat)==null?void 0:d.id,agentId:c.id,mode:n.chatMode})},async chat(d){var b,k,P,L,$;const h=()=>{if(t.mode===j.DirectPlayback)throw new H("Direct playback is enabled, chat is disabled");if(d.length>=800)throw new H("Message cannot be more than 800 characters");if(d.length===0)throw new H("Message cannot be empty");if(n.chatMode===j.Maintenance)throw new H("Chat is in maintenance mode");if(![j.TextOnly,j.Playground].includes(n.chatMode)){if(!n.streamingManager)throw new H("Streaming manager is not initialized");if(!n.chat)throw new H("Chat is not initialized")}},C=async()=>{var E,T;if(!n.chat){const u=await ke(c,i,l,n.chatMode,t.persistentChat);if(!u.chat)throw new F(n.chatMode,!!t.persistentChat);n.chat=u.chat,(T=(E=t.callbacks).onNewChat)==null||T.call(E,n.chat.id)}return n.chat.id},w=async(E,T)=>O(()=>{var u,v;return i.chat(c.id,T,{chatMode:n.chatMode,streamId:(u=n.streamingManager)==null?void 0:u.streamId,sessionId:(v=n.streamingManager)==null?void 0:v.sessionId,messages:E.map(({matches:A,...z})=>z)},{...Ce(n.chatMode),skipErrorHandler:!0})},{limit:2,shouldRetryFn:u=>{var z,U,Me,_e;const v=(z=u==null?void 0:u.message)==null?void 0:z.includes("missing or invalid session_id");return!((U=u==null?void 0:u.message)==null?void 0:U.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(),n.messages.push({id:Q(),role:"user",content:d,created_at:new Date(J.update()).toISOString()}),(k=(b=t.callbacks).onNewMessage)==null||k.call(b,[...n.messages],"user");const E=await C(),T=await w([...n.messages],E);return n.messages.push({id:Q(),role:"assistant",content:T.result||"",created_at:new Date().toISOString(),context:T.context,matches:T.matches}),l.track("agent-message-send",{event:"success",mode:n.chatMode,messages:n.messages.length+1}),T.result&&((L=(P=t.callbacks).onNewMessage)==null||L.call(P,[...n.messages],"answer"),l.track("agent-message-received",{latency:J.get(!0),mode:n.chatMode,messages:n.messages.length})),T}catch(E){throw(($=n.messages[n.messages.length-1])==null?void 0:$.role)==="assistant"&&n.messages.pop(),l.track("agent-message-send",{event:"error",mode:n.chatMode,messages:n.messages.length}),E}},rate(d,h,C){var k,P,L,$;const w=n.messages.find(E=>E.id===d);if(n.chat){if(!w)throw new Error("Message not found")}else throw new Error("Chat is not initialized");const b=((k=w.matches)==null?void 0:k.map(E=>[E.document_id,E.id]))??[];return l.track("agent-rate",{event:C?"update":"create",thumb:h===1?"up":"down",knowledge_id:((P=c.knowledge)==null?void 0:P.id)??"",mode:n.chatMode,matches:b,score:h}),C?i.updateRating(c.id,n.chat.id,C,{knowledge_id:((L=c.knowledge)==null?void 0:L.id)??"",message_id:d,matches:b,score:h}):i.createRating(c.id,n.chat.id,{knowledge_id:(($=c.knowledge)==null?void 0:$.id)??"",message_id:d,matches:b,score:h})},deleteRate(d){var h;if(!n.chat)throw new Error("Chat is not initialized");return l.track("agent-rate-delete",{type:"text",chat_id:(h=n.chat)==null?void 0:h.id,id:d,mode:n.chatMode}),i.deleteRating(c.id,n.chat.id,d)},speak(d){var w,b,k,P;if(!n.streamingManager)throw new Error("Please connect to the agent first");function h(){if(typeof d=="string"){if(!c.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:c.presenter.voice,input:d,ssml:!1}}if(d.type==="text"&&!d.provider){if(!c.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:c.presenter.voice,input:d.input,ssml:d.ssml}}return d}const C=h();return l.track("agent-speak",C),J.update(),(w=n.chat)!=null&&w.id&&C.type==="text"&&(n.messages.push({id:Q(),role:"assistant",content:C.input,created_at:new Date(J.get(!0)).toISOString()}),(k=(b=t.callbacks).onNewMessage)==null||k.call(b,[...n.messages],"answer")),n.streamingManager.speak({script:C,metadata:{chat_id:(P=n.chat)==null?void 0:P.id,agent_id:c.id}})}}}function gt(e,t,r){const{getById:a}=pe(t,r||X);return a(e)}f.AgentActivityState=x,f.AgentStatus=oe,f.ChatCreationFailed=F,f.ChatMode=j,f.ChatModeDowngraded=re,f.ChatProgress=K,f.ConnectionState=M,f.ConnectivityState=q,f.DataChannelSignalMap=Z,f.DocumentType=ue,f.KnowledgeType=le,f.PlanGroup=se,f.Providers=me,f.RateState=ce,f.StreamEvents=V,f.StreamType=N,f.StreamingState=y,f.Subject=de,f.UserPlan=ie,f.ValidationError=H,f.VideoType=G,f.VoiceAccess=ge,f.WsError=ae,f.createAgentManager=mt,f.getAgent=gt,f.mapVideoType=fe,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
|
|
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 Et=Object.defineProperty;var _t=(m,b,q)=>b in m?Et(m,b,{enumerable:!0,configurable:!0,writable:!0,value:q}):m[b]=q;var ee=(m,b,q)=>(_t(m,typeof b!="symbol"?b+"":b,q),q);class b extends Error{constructor({kind:a,description:r,error:s}){super(JSON.stringify({kind:a,description:r}));ee(this,"kind");ee(this,"description");ee(this,"error");this.kind=a,this.description=r,this.error=s}}class q extends b{constructor(t,a){super({kind:"ChatCreationFailed",description:`Failed to create ${a?"persistent":""} chat, mode: ${t}`})}}class ce extends b{constructor(t){super({kind:"ChatModeDowngraded",description:`Chat mode downgraded to ${t}`})}}class V extends b{constructor(a,r){super({kind:"ValidationError",description:a});ee(this,"key");this.key=r}}class de extends b{constructor(t){super({kind:"WSError",description:t})}}var ue=(e=>(e.TRIAL="trial",e.BASIC="basic",e.ENTERPRISE="enterprise",e.LITE="lite",e.ADVANCED="advanced",e))(ue||{}),le=(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))(le||{}),fe=(e=>(e.Created="created",e.Started="started",e.Done="done",e.Error="error",e.Rejected="rejected",e.Ready="ready",e))(fe||{}),me=(e=>(e.Unrated="Unrated",e.Positive="Positive",e.Negative="Negative",e))(me||{}),A=(e=>(e.Functional="Functional",e.TextOnly="TextOnly",e.Maintenance="Maintenance",e.Playground="Playground",e.DirectPlayback="DirectPlayback",e.Off="Off",e))(A||{}),X=(e=>(e.Embed="embed",e.Query="query",e.Partial="partial",e.Answer="answer",e.Complete="done",e))(X||{}),ge=(e=>(e.KnowledgeProcessing="knowledge/processing",e.KnowledgeIndexing="knowledge/indexing",e.KnowledgeFailed="knowledge/error",e.KnowledgeDone="knowledge/done",e))(ge||{}),he=(e=>(e.Knowledge="knowledge",e.Document="document",e.Record="record",e))(he||{}),we=(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))(we||{}),te=(e=>(e.Clip="clip",e.Talk="talk",e))(te||{});const pe=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||{}),O=(e=>(e.Strong="STRONG",e.Weak="WEAK",e.Unknown="UNKNOWN",e))(O||{}),Y=(e=>(e.Idle="IDLE",e.Talking="TALKING",e))(Y||{}),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||{}),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||{}),H=(e=>(e.Legacy="legacy",e.Fluent="fluent",e))(H||{}),ye=(e=>(e.Amazon="amazon",e.Microsoft="microsoft",e.Afflorithmics="afflorithmics",e.Elevenlabs="elevenlabs",e))(ye||{}),ve=(e=>(e.Public="public",e.Premium="premium",e.Private="private",e))(ve||{});const Pe=45*1e3,$e="X-Playground-Chat",G="https://api.d-id.com",Be="wss://notifications.d-id.com",Le="79f81a83a67430be2bc0fd61042b8faa",ke=e=>new Promise(t=>setTimeout(t,e)),Q=(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)},ze=e=>[A.TextOnly,A.Playground,A.Maintenance].includes(e),re=e=>e&&[A.DirectPlayback,A.Off].includes(e);function Fe(e,t){let a;return{promise:new Promise((s,i)=>{a=setTimeout(()=>i(new Error(t)),e)}),clear:()=>clearTimeout(a)}}async function ne(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}=Fe(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 ke(a.delayMs),a.onRetry(i)}throw r}function Ce(){let e=window.localStorage.getItem("did_external_key_id");if(!e){let t=Q();window.localStorage.setItem("did_external_key_id",t),e=t}return e}let Ne=Q();function De(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}.${Ce()}_${Ne}`;throw new Error(`Unknown auth type: ${e}`)}const Je=e=>ne(e,{limit:3,delayMs:1e3,timeout:0,shouldRetryFn:t=>t.status===429});function ae(e,t=G,a){const r=async(s,i)=>{const{skipErrorHandler:c,...n}=i||{},o=await Je(()=>fetch(t+(s!=null&&s.startsWith("/")?s:`/${s}`),{...n,headers:{...n.headers,Authorization:De(e),"Content-Type":"application/json"}}));if(!o.ok){let d=await o.text().catch(()=>`Failed to fetch with status ${o.status}`);const l=new Error(d);throw a&&!c&&a(l,{url:s,options:n,headers:o.headers}),l}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 Re(e,t=G,a){const r=ae(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 Se=e=>e.type==="clip"&&e.presenter_id.startsWith("v2_")?"clip_v2":e.type;function We(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:Se(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 Ue=e=>e.reduce((t,a)=>t+a,0),Ee=e=>Ue(e)/e.length;function Ke(e,t,a){var o,d,l;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"?(l=t==null?void 0:t.presenter)==null?void 0:l.stitch:void 0,...a}}let ie={};const He="https://api-js.mixpanel.com/track/?verbose=1&ip=1";function xe(e){var i,c,n,o,d,l;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||Ce(),agentId:e.agent.id,agentType:Se(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:(l=(d=e.agent.knowledge)==null?void 0:d.starter_message)==null?void 0:l.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:Q,enrich(p){this.additionalProperties={...this.additionalProperties,...p}},async track(p,P){if(!this.isEnabled)return Promise.resolve();const{audioPath:S,...D}=P||{},R={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({data:JSON.stringify([{event:p,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(He,R).then(C=>C.json())}catch(C){return console.error(C)}},linkTrack(p,P,S,D){ie[p]||(ie[p]={events:{},resolvedDependencies:[]}),D.includes(S)||D.push(S);const R=ie[p];if(R.events[S]={props:P},R.resolvedDependencies.push(S),D.every(J=>R.resolvedDependencies.includes(J))){const J=D.reduce((B,u)=>R.events[u]?{...B,...R.events[u].props}:B,{});this.track(p,J),R.resolvedDependencies=R.resolvedDependencies.filter(B=>!D.includes(B)),D.forEach(B=>{delete R.events[B]})}}}}function _e(){let e=0;return{reset:()=>e=0,update:()=>e=Date.now(),get:(t=!1)=>t?Date.now()-e:e}}const N=_e(),se=_e();function Ie(e){return e===A.Playground?{headers:{[$e]:"true"}}:{}}async function Me(e,t,a,r,s=!1,i){try{return!i&&!re(r)&&(i=await t.newChat(e.id,{persist:s},Ie(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 qe(e){return e&&e.length>0?e:[]}function Ve(e,t,a,r,s){if(!e||!t)throw new Error("Please connect to the agent first");if(!e.interruptAvailable)throw new Error("Interrupt is not enabled for this stream");if(a!==H.Fluent)throw new Error("Interrupt only available for Fluent streams");if(!r&&!s)throw new Error("No active video to interrupt")}async function Te(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||{},l=new WebSocket(`${s}?authorization=${De(i)}`);l.onmessage=c,l.onclose=o,l.onerror=p=>{console.error(p),d==null||d("Websocket failed to connect",p),a(p)},l.onopen=p=>{n==null||n(p),t(l)}})}async function Ye(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 ke(r*500)}return a}async function Oe(e,t,a){const r=a!=null&&a.onMessage?[a.onMessage]:[],s=await Ye({auth:e,host:t,callbacks:{onError:i=>{var c;return(c=a.onError)==null?void 0:c.call(a,new de(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 Qe(e){if(e.answer!==void 0)return e.answer;let t=0,a="";for(;t in e;)a+=e[t++];return a}function Ge(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=Qe(a);(i.content!==o||e===X.Answer)&&(i.content=o,s==null||s([...r.messages],e))}function Ze(e,t,a,r,s){let i={};return{clearQueue:()=>i={},onMessage:(c,n)=>{var o,d;if("content"in n)Ge(c,n,i,t,a.callbacks.onNewMessage),c===X.Answer&&e.track("agent-message-received",{messages:t.messages.length,mode:t.chatMode});else{const l=z,p=[l.StreamVideoDone,l.StreamVideoError,l.StreamVideoRejected],P=[l.StreamFailed,l.StreamVideoError,l.StreamVideoRejected],S=Ke(n,r,{mode:t.chatMode});if(c=c,c===l.StreamVideoCreated)e.linkTrack("agent-video",S,l.StreamVideoCreated,["start"]);else if(p.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===l.StreamDone&&s()}}}}function et(e,t,a,r){const s=ae(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 tt(e,t,a,r){const s=ae(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 rt(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 nt(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 at(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 it(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=nt(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:Ee(n),maxRtt:Math.max(...n),aggregateReport:rt(e[0],e[e.length-1],i),minJitterDelayInInterval:Math.min(...c),maxJitterDelayInInterval:Math.max(...c),avgJitterDelayInInterval:Ee(c)},codec:e[0].codec,resolution:`${e[0].frameWidth}x${e[0].frameHeight}`}}const oe=100,st=Math.max(Math.ceil(400/oe),1),ot=.25,ct=.28;function dt(){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 l=c-t,p=n-a;r=l/p}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 ut(e,t,a,r,s,i=!1){let c=[],n,o=0,d=!1,l=O.Unknown,p=O.Unknown,P=0,S=0;const D=dt();return setInterval(async()=>{const R=await e.getStats(),{isReceiving:C,avgJitterDelayInInterval:J,freezeCount:B}=D(R),u=at(R);if(C)o=0,P=B-S,p=J<ot?O.Strong:J>ct&&P>1?O.Weak:l,p!==l&&(s==null||s(p),l=p,S+=P,P=0),d||(r==null||r(y.Start),n=c[c.length-1],c=[],d=!0),c.push(u);else if(d&&(o++,o>=st)){const g=it(c,oe,n);r==null||r(y.Stop,g),t()||a(),S=B,d=!1}},oe)}let je=!1;const F=(e,t)=>je&&console.log(e,t),lt=(window.RTCPeerConnection||window.webkitRTCPeerConnection||window.mozRTCPeerConnection).bind(window);function be(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 ft(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 mt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:r}){e===y.Start&&t===y.Start?a==null||a(y.Start):e===y.Stop&&t===y.Stop&&(a==null||a(y.Stop,r))}function gt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,report:s}){e===y.Start?a==null||a(y.Start):e===y.Stop&&(a==null||a(y.Stop,s)),t===y.Start?r==null||r(Y.Talking):t===y.Stop&&(r==null||r(Y.Idle))}function Ae({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,streamType:s,report:i}){s===H.Legacy?mt({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,report:i}):s===H.Fluent&>({statsSignal:e,dataChannelSignal:t,onVideoStateChange:a,onAgentActivityStateChange:r,report:i})}async function ht(e,t,{debug:a=!1,callbacks:r,auth:s,baseURL:i=G,analytics:c}){var x;je=a;let n=!1,o=!1,d=y.Stop,l=y.Stop;const{startConnection:p,sendStreamRequest:P,close:S,createStream:D,addIceCandidate:R}=t.videoType===te.Clip?et(s,i,e,r.onError):tt(s,i,e,r.onError),{id:C,offer:J,ice_servers:B,session_id:u,fluent:g,interrupt_enabled:k}=await D(t);(x=r.onStreamCreated)==null||x.call(r,{stream_id:C,session_id:u,agent_id:e});const h=new lt({iceServers:B}),E=h.createDataChannel("JanusDataChannel");if(!u)throw new Error("Could not create session_id");const v=g?H.Fluent:H.Legacy;c.enrich({"stream-type":v});const j=t.stream_warmup&&!g,L=()=>n,W=()=>{var f;n=!0,o&&((f=r.onConnectionStateChange)==null||f.call(r,M.Connected))},_=ut(h,L,W,(f,w)=>Ae({statsSignal:l=f,dataChannelSignal:v===H.Legacy?d:void 0,onVideoStateChange:r.onVideoStateChange,onAgentActivityStateChange:r.onAgentActivityStateChange,report:w,streamType:v}),f=>{var w;return(w=r.onConnectivityStateChange)==null?void 0:w.call(r,f)},j);h.onicecandidate=f=>{var w;F("peerConnection.onicecandidate",f);try{f.candidate&&f.candidate.sdpMid&&f.candidate.sdpMLineIndex!==null?R(C,{candidate:f.candidate.candidate,sdpMid:f.candidate.sdpMid,sdpMLineIndex:f.candidate.sdpMLineIndex},u):R(C,{candidate:null},u)}catch($){(w=r.onError)==null||w.call(r,$,{streamId:C})}},E.onopen=()=>{o=!0,(!j||n)&&W()};function I(f){d=f===z.StreamStarted?y.Start:y.Stop,Ae({statsSignal:v===H.Legacy?l:void 0,dataChannelSignal:d,onVideoStateChange:r.onVideoStateChange,onAgentActivityStateChange:r.onAgentActivityStateChange,streamType:v})}function T(f,w){const $=typeof w=="string"?w:w==null?void 0:w.metadata;$&&c.enrich({streamMetadata:$}),c.track("agent-chat",{event:"ready"})}const U={[z.StreamStarted]:I,[z.StreamDone]:I,[z.StreamReady]:T};E.onmessage=f=>{var Z;const{subject:w,data:$}=ft(f.data);(Z=U[w])==null||Z.call(U,w,$)},h.oniceconnectionstatechange=()=>{var w;F("peerConnection.oniceconnectionstatechange => "+h.iceConnectionState);const f=be(h.iceConnectionState);f!==M.Connected&&((w=r.onConnectionStateChange)==null||w.call(r,f))},h.ontrack=f=>{var w;F("peerConnection.ontrack",f),(w=r.onSrcObjectReady)==null||w.call(r,f.streams[0])},await h.setRemoteDescription(J),F("set remote description OK");const K=await h.createAnswer();return F("create answer OK"),await h.setLocalDescription(K),F("set local description OK"),await p(C,K,u),F("start connection OK"),{speak(f){return P(C,u,f)},async disconnect(){var f;if(C){const w=be(h.iceConnectionState);if(h){if(w===M.New){clearInterval(_);return}h.close(),h.oniceconnectionstatechange=null,h.onnegotiationneeded=null,h.onicecandidate=null,h.ontrack=null}try{w===M.Connected&&await S(C,u).catch($=>{})}catch($){F("Error on close stream connection",$)}(f=r.onAgentActivityStateChange)==null||f.call(r,Y.Idle),clearInterval(_)}},sendDataChannelMessage(f){var w,$;if(!n||E.readyState!=="open"){F("Data channel is not ready for sending messages"),(w=r.onError)==null||w.call(r,new Error("Data channel is not ready for sending messages"),{streamId:C});return}try{E.send(f)}catch(Z){F("Error sending data channel message",Z),($=r.onError)==null||$.call(r,Z,{streamId:C})}},sessionId:u,streamId:C,streamType:v,interruptAvailable:k}}function wt(e,t){const{streamOptions:a}=t??{};return{videoType:pe(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 pt(e,t,a,r,s){s===H.Fluent?yt(e,t,a,r,s):kt(e,t,a,r,s)}function yt(e,t,a,r,s){e===y.Start?r.track("stream-session",{event:"start","stream-type":s}):e===y.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 vt(e,t,a,r){N.get()<=0||(e===y.Start?a.linkTrack("agent-video",{event:"start",latency:N.get(!0),"stream-type":r},"start",[z.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":r},"done",[z.StreamVideoDone]))}function kt(e,t,a,r,s){N.get()<=0||(e===y.Start?r.linkTrack("agent-video",{event:"start",latency:N.get(!0),"stream-type":s},"start",[z.StreamVideoCreated]):e===y.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 Ct(e,t,a){return N.reset(),new Promise(async(r,s)=>{try{const i=await ht(e.id,wt(e,t),{...t,analytics:a,callbacks:{...t.callbacks,onConnectionStateChange:c=>{var n,o;(o=(n=t.callbacks).onConnectionStateChange)==null||o.call(n,c),c===M.Connected&&r(i)},onVideoStateChange:(c,n)=>{var o,d;(d=(o=t.callbacks).onVideoStateChange)==null||d.call(o,c),pt(c,e,n,a,i.streamType)},onAgentActivityStateChange:c=>{var n,o;(o=(n=t.callbacks).onAgentActivityStateChange)==null||o.call(n,c),c===Y.Talking?se.update():se.reset(),vt(c===Y.Talking?y.Start:y.Stop,e,a,i.streamType)}}})}catch(i){s(i)}})}async function Dt(e,t,a,r,s){var o,d,l,p;const{chat:i,chatMode:c}=await Me(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===A.TextOnly))return(p=(l=t.callbacks).onError)==null||p.call(l,new ce(c)),{chat:i};const n=await Ct(e,t,r);return{chat:i,streamingManager:n}}async function Rt(e,t){var C,J,B;let a=!0,r=!1;const s=t.mixpanelKey||Le,i=t.wsURL||Be,c=t.baseURL||G,n={messages:[],chatMode:t.mode||A.Functional},o=Re(t.auth,c,t.callbacks.onError),d=await o.getById(e),l=xe({token:s,agent:d,isEnabled:t.enableAnalitics,distinctId:t.distinctId}),{onMessage:p,clearQueue:P}=Ze(l,n,t,d,()=>{var u;return(u=n.socketManager)==null?void 0:u.disconnect()});n.messages=qe(t.initialMessages),(J=(C=t.callbacks).onNewMessage)==null||J.call(C,[...n.messages],"answer"),l.track("agent-sdk",{event:"loaded",...We(d)});async function S(u){var j,L,W,_,I,T,U;(L=(j=t.callbacks).onConnectionStateChange)==null||L.call(j,M.Connecting),N.reset(),r=!1,u&&!a&&(delete n.chat,(_=(W=t.callbacks).onNewMessage)==null||_.call(W,[...n.messages],"answer"));const g=re(t.mode)?Promise.resolve(void 0):Oe(t.auth,i,{onMessage:p,onError:t.callbacks.onError}),k=ne(()=>Dt(d,t,o,l,n.chat),{limit:3,timeout:Pe,timeoutErrorMessage:"Timeout initializing the stream",shouldRetryFn:K=>(K==null?void 0:K.message)!=="Could not connect"&&K.status!==429,delayMs:1e3}).catch(K=>{var x,f;throw R(A.Maintenance),(f=(x=t.callbacks).onConnectionStateChange)==null||f.call(x,M.Fail),K}),[h,{streamingManager:E,chat:v}]=await Promise.all([g,k]);v&&v.id!==((I=n.chat)==null?void 0:I.id)&&((U=(T=t.callbacks).onNewChat)==null||U.call(T,v.id)),n.streamingManager=E,n.socketManager=h,n.chat=v,a=!1,R((v==null?void 0:v.chat_mode)??t.mode??A.Functional)}async function D(){var u,g,k,h;(u=n.socketManager)==null||u.disconnect(),await((g=n.streamingManager)==null?void 0:g.disconnect()),r=!1,delete n.streamingManager,delete n.socketManager,(h=(k=t.callbacks).onConnectionStateChange)==null||h.call(k,M.Disconnected)}async function R(u){var g,k;u!==n.chatMode&&(l.track("agent-mode-change",{mode:u}),n.chatMode=u,n.chatMode!==A.Functional&&await D(),(k=(g=t.callbacks).onModeChange)==null||k.call(g,u))}return{agent:d,getStreamType:()=>{var u;return(u=n.streamingManager)==null?void 0:u.streamType},getIsInterruptAvailable:()=>{var u;return((u=n.streamingManager)==null?void 0:u.interruptAvailable)??!1},starterMessages:((B=d.knowledge)==null?void 0:B.starter_message)||[],getSTTToken:()=>o.getSTTToken(d.id),changeMode:R,enrichAnalytics:l.enrich,async connect(){var u;await S(!0),l.track("agent-chat",{event:"connect",chatId:(u=n.chat)==null?void 0:u.id,agentId:d.id,mode:n.chatMode})},async reconnect(){var u;await D(),await S(!1),l.track("agent-chat",{event:"reconnect",chatId:(u=n.chat)==null?void 0:u.id,agentId:d.id,mode:n.chatMode})},async disconnect(){var u;await D(),l.track("agent-chat",{event:"disconnect",chatId:(u=n.chat)==null?void 0:u.id,agentId:d.id,mode:n.chatMode})},async chat(u){var E,v,j,L,W;const g=()=>{if(re(t.mode))throw new V(`${t.mode} is enabled, chat is disabled`);if(u.length>=800)throw new V("Message cannot be more than 800 characters");if(u.length===0)throw new V("Message cannot be empty");if(n.chatMode===A.Maintenance)throw new V("Chat is in maintenance mode");if(![A.TextOnly,A.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")}},k=async()=>{var _,I;if(!n.chat){const T=await Me(d,o,l,n.chatMode,t.persistentChat);if(!T.chat)throw new q(n.chatMode,!!t.persistentChat);n.chat=T.chat,(I=(_=t.callbacks).onNewChat)==null||I.call(_,n.chat.id)}return n.chat.id},h=async(_,I)=>ne(()=>{var T,U;return o.chat(d.id,I,{chatMode:n.chatMode,streamId:(T=n.streamingManager)==null?void 0:T.streamId,sessionId:(U=n.streamingManager)==null?void 0:U.sessionId,messages:_.map(({matches:K,...x})=>x)},{...Ie(n.chatMode),skipErrorHandler:!0})},{limit:2,shouldRetryFn:T=>{var x,f,w,$;const U=(x=T==null?void 0:T.message)==null?void 0:x.includes("missing or invalid session_id");return!((f=T==null?void 0:T.message)==null?void 0:f.includes("Stream Error"))&&!U?(($=(w=t.callbacks).onError)==null||$.call(w,T),!1):!0},onRetry:async()=>{await D(),await S(!1)}});try{P(),g(),n.messages.push({id:Q(),role:"user",content:u,created_at:new Date(N.update()).toISOString()}),(v=(E=t.callbacks).onNewMessage)==null||v.call(E,[...n.messages],"user");const _=await k(),I=await h([...n.messages],_);return n.messages.push({id:Q(),role:"assistant",content:I.result||"",created_at:new Date().toISOString(),context:I.context,matches:I.matches,videoId:I.videoId}),r&&I.videoId&&n.streamingManager&&(r=!1,n.messages[n.messages.length-1].interrupted=!0,await Te(n.streamingManager,I.videoId)),l.track("agent-message-send",{event:"success",mode:n.chatMode,messages:n.messages.length+1}),I.result&&((L=(j=t.callbacks).onNewMessage)==null||L.call(j,[...n.messages],"answer"),l.track("agent-message-received",{latency:N.get(!0),mode:n.chatMode,messages:n.messages.length})),I}catch(_){throw r=!1,((W=n.messages[n.messages.length-1])==null?void 0:W.role)==="assistant"&&n.messages.pop(),l.track("agent-message-send",{event:"error",mode:n.chatMode,messages:n.messages.length}),_}},rate(u,g,k){var v,j,L,W;const h=n.messages.find(_=>_.id===u);if(n.chat){if(!h)throw new Error("Message not found")}else throw new Error("Chat is not initialized");const E=((v=h.matches)==null?void 0:v.map(_=>[_.document_id,_.id]))??[];return l.track("agent-rate",{event:k?"update":"create",thumb:g===1?"up":"down",knowledge_id:((j=d.knowledge)==null?void 0:j.id)??"",mode:n.chatMode,matches:E,score:g}),k?o.updateRating(d.id,n.chat.id,k,{knowledge_id:((L=d.knowledge)==null?void 0:L.id)??"",message_id:u,matches:E,score:g}):o.createRating(d.id,n.chat.id,{knowledge_id:((W=d.knowledge)==null?void 0:W.id)??"",message_id:u,matches:E,score:g})},deleteRate(u){var g;if(!n.chat)throw new Error("Chat is not initialized");return l.track("agent-rate-delete",{type:"text",chat_id:(g=n.chat)==null?void 0:g.id,id:u,mode:n.chatMode}),o.deleteRating(d.id,n.chat.id,u)},async speak(u){var E,v,j;function g(){if(typeof u=="string"){if(!d.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:d.presenter.voice,input:u,ssml:!1}}if(u.type==="text"&&!u.provider){if(!d.presenter.voice)throw new Error("Presenter voice is not initialized");return{type:"text",provider:d.presenter.voice,input:u.input,ssml:u.ssml}}return u}const k=g();if(l.track("agent-speak",k),N.update(),n.messages&&k.type==="text"&&(n.messages.push({id:Q(),role:"assistant",content:k.input,created_at:new Date(N.get(!0)).toISOString()}),(v=(E=t.callbacks).onNewMessage)==null||v.call(E,[...n.messages],"answer")),ze(n.chatMode))return{duration:0,status:"success"};if(!n.streamingManager)throw new Error("Please connect to the agent first");return n.streamingManager.speak({script:k,metadata:{chat_id:(j=n.chat)==null?void 0:j.id,agent_id:d.id}})},async interrupt({type:u}){var h,E,v,j,L;const g=n.messages[n.messages.length-1],k=(g==null?void 0:g.role)==="user";if(Ve(n.streamingManager,n.chat,(h=n.streamingManager)==null?void 0:h.streamType,k,!!(g!=null&&g.videoId)),l.track("agent-video-interrupt",{type:u||"click",stream_id:(E=n.streamingManager)==null?void 0:E.streamId,agent_id:d.id,owner_id:d.owner_id,video_duration_to_interrupt:se.get(!0),message_duration_to_interrupt:N.get(!0),chat_id:(v=n.chat)==null?void 0:v.id,mode:n.chatMode,queued_interrupt:k}),k){r=!0;return}g.interrupted=!0,(L=(j=t.callbacks).onNewMessage)==null||L.call(j,[...n.messages],"answer"),Te(n.streamingManager,g.videoId)}}}function St(e,t,a){const{getById:r}=Re(t,a||G);return r(e)}m.AgentActivityState=Y,m.AgentStatus=fe,m.ChatCreationFailed=q,m.ChatMode=A,m.ChatModeDowngraded=ce,m.ChatProgress=X,m.ConnectionState=M,m.ConnectivityState=O,m.DocumentType=we,m.KnowledgeType=he,m.PlanGroup=le,m.Providers=ye,m.RateState=me,m.StreamEvents=z,m.StreamType=H,m.StreamingState=y,m.Subject=ge,m.UserPlan=ue,m.ValidationError=V,m.VideoType=te,m.VoiceAccess=ve,m.WsError=de,m.createAgentManager=Rt,m.getAgent=St,m.mapVideoType=pe,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const latencyTimestampTracker: {
|
|
2
|
+
reset: () => number;
|
|
3
|
+
update: () => number;
|
|
4
|
+
get: (delta?: boolean) => number;
|
|
5
|
+
};
|
|
6
|
+
export declare const interruptTimestampTracker: {
|
|
2
7
|
reset: () => number;
|
|
3
8
|
update: () => number;
|
|
4
9
|
get: (delta?: boolean) => number;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Agent, AgentsAPI, Chat
|
|
1
|
+
import type { Agent, AgentsAPI, Chat } from '../../types';
|
|
2
|
+
import { ChatMode } from '../../types';
|
|
2
3
|
import { Analytics } from '../analytics/mixpanel';
|
|
3
4
|
export declare function getRequestHeaders(chatMode?: ChatMode): Record<string, Record<string, string>>;
|
|
4
5
|
export declare function createChat(agent: Agent, agentsApi: AgentsAPI, analytics: Analytics, chatMode?: ChatMode, persist?: boolean, chat?: Chat): Promise<{
|
|
@@ -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>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CreateStreamOptions, PayloadType, StreamType, StreamingManagerOptions } from '../../types/index';
|
|
2
|
-
export declare function createStreamingManager<T extends CreateStreamOptions>(agentId: string, agent: T, { debug, callbacks, auth, baseURL }: StreamingManagerOptions): Promise<{
|
|
2
|
+
export declare function createStreamingManager<T extends CreateStreamOptions>(agentId: string, agent: T, { debug, callbacks, auth, baseURL, analytics }: StreamingManagerOptions): Promise<{
|
|
3
3
|
/**
|
|
4
4
|
* Method to send request to server to get clip or talk depend on you payload
|
|
5
5
|
* @param payload
|
|
@@ -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
|
+
interruptAvailable: boolean | undefined;
|
|
21
26
|
}>;
|
|
22
27
|
export type StreamingManager<T extends CreateStreamOptions> = Awaited<ReturnType<typeof createStreamingManager<T>>>;
|
|
@@ -3,6 +3,9 @@ export interface VideoRTCStatsReport {
|
|
|
3
3
|
webRTCStats: {
|
|
4
4
|
anomalies: AnalyticsRTCStatsReport[];
|
|
5
5
|
aggregateReport: AnalyticsRTCStatsReport;
|
|
6
|
+
minRtt: number;
|
|
7
|
+
maxRtt: number;
|
|
8
|
+
avgRtt: number;
|
|
6
9
|
minJitterDelayInInterval: number;
|
|
7
10
|
maxJitterDelayInInterval: number;
|
|
8
11
|
avgJitterDelayInInterval: number;
|
|
@@ -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[];
|
|
@@ -45,7 +47,8 @@ export declare enum ChatMode {
|
|
|
45
47
|
TextOnly = "TextOnly",
|
|
46
48
|
Maintenance = "Maintenance",
|
|
47
49
|
Playground = "Playground",
|
|
48
|
-
DirectPlayback = "DirectPlayback"
|
|
50
|
+
DirectPlayback = "DirectPlayback",
|
|
51
|
+
Off = "Off"
|
|
49
52
|
}
|
|
50
53
|
export interface ChatResponse {
|
|
51
54
|
result?: string;
|
|
@@ -53,6 +56,7 @@ export interface ChatResponse {
|
|
|
53
56
|
matches?: IRetrivalMetadata[];
|
|
54
57
|
chatMode?: ChatMode;
|
|
55
58
|
context?: string;
|
|
59
|
+
videoId?: string;
|
|
56
60
|
}
|
|
57
61
|
export interface Chat {
|
|
58
62
|
id: string;
|
|
@@ -65,3 +69,6 @@ export interface Chat {
|
|
|
65
69
|
agent_id__modified_at: string;
|
|
66
70
|
chat_mode?: ChatMode;
|
|
67
71
|
}
|
|
72
|
+
export interface Interrupt {
|
|
73
|
+
type: 'text' | 'audio' | 'click';
|
|
74
|
+
}
|
|
@@ -2,8 +2,9 @@ import { STTTokenResponse } from '../..';
|
|
|
2
2
|
import { Auth } from '../../auth';
|
|
3
3
|
import { AgentActivityState, CompatibilityMode, ConnectionState, ConnectivityState, SendStreamPayloadResponse, StreamEvents, StreamType, StreamingState } from '../../stream';
|
|
4
4
|
import { SupportedStreamScript } from '../../stream-script';
|
|
5
|
+
import type { ManagerCallbacks as StreamManagerCallbacks } from '../../stream/stream';
|
|
5
6
|
import { Agent } from './agent';
|
|
6
|
-
import { ChatMode, ChatResponse, Message, RatingEntity } from './chat';
|
|
7
|
+
import { ChatMode, ChatResponse, Interrupt, Message, RatingEntity } from './chat';
|
|
7
8
|
/**
|
|
8
9
|
* Types of events provided in Chat Progress Callback
|
|
9
10
|
*/
|
|
@@ -81,6 +82,11 @@ interface ManagerCallbacks {
|
|
|
81
82
|
* @param state - AgentActivityState
|
|
82
83
|
*/
|
|
83
84
|
onAgentActivityStateChange?(state: AgentActivityState): void;
|
|
85
|
+
/**
|
|
86
|
+
* Optional callback function that will be triggered each time a new stream is created
|
|
87
|
+
* @param stream - object containing stream_id, session_id and agent_id
|
|
88
|
+
*/
|
|
89
|
+
onStreamCreated?: StreamManagerCallbacks['onStreamCreated'];
|
|
84
90
|
}
|
|
85
91
|
interface StreamOptions {
|
|
86
92
|
/**
|
|
@@ -144,6 +150,10 @@ export interface AgentManager {
|
|
|
144
150
|
* Get the current stream type of the agent
|
|
145
151
|
*/
|
|
146
152
|
getStreamType: () => StreamType | undefined;
|
|
153
|
+
/**
|
|
154
|
+
* Get if the stream supports interrupt
|
|
155
|
+
*/
|
|
156
|
+
getIsInterruptAvailable: () => boolean;
|
|
147
157
|
/**
|
|
148
158
|
* Array of starter messages that will be sent to the agent when the chat starts
|
|
149
159
|
*/
|
|
@@ -197,5 +207,10 @@ export interface AgentManager {
|
|
|
197
207
|
* @param properties flat json object with properties that will be added to analytics events fired from the sdk
|
|
198
208
|
*/
|
|
199
209
|
enrichAnalytics: (properties: Record<string, any>) => void;
|
|
210
|
+
/**
|
|
211
|
+
* Method to interrupt the current video stream
|
|
212
|
+
* Only available for Fluent streams and when there's an active video to interrupt
|
|
213
|
+
*/
|
|
214
|
+
interrupt: (interrupt: Interrupt) => void;
|
|
200
215
|
}
|
|
201
216
|
export {};
|
|
@@ -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",
|
|
@@ -53,6 +53,11 @@ export interface ManagerCallbacks {
|
|
|
53
53
|
onError?: (error: Error, errorData: object) => void;
|
|
54
54
|
onConnectivityStateChange?: (state: ConnectivityState) => void;
|
|
55
55
|
onAgentActivityStateChange?: (state: AgentActivityState) => void;
|
|
56
|
+
onStreamCreated?: (stream: {
|
|
57
|
+
stream_id: string;
|
|
58
|
+
session_id: string;
|
|
59
|
+
agent_id: string;
|
|
60
|
+
}) => void;
|
|
56
61
|
}
|
|
57
62
|
export type ManagerCallbackKeys = keyof ManagerCallbacks;
|
|
58
63
|
export interface TalkStreamOptions extends CreateTalkStreamRequest {
|
|
@@ -82,6 +87,7 @@ export interface StreamingManagerOptions {
|
|
|
82
87
|
export interface SlimRTCStatsReport {
|
|
83
88
|
index: number;
|
|
84
89
|
codec: string;
|
|
90
|
+
rtt: number;
|
|
85
91
|
duration?: number;
|
|
86
92
|
bitrate?: number;
|
|
87
93
|
timestamp: any;
|
|
@@ -119,3 +125,8 @@ export interface AnalyticsRTCStatsReport {
|
|
|
119
125
|
lowFpsCount?: number;
|
|
120
126
|
causes?: string[];
|
|
121
127
|
}
|
|
128
|
+
export interface StreamInterruptPayload {
|
|
129
|
+
type: StreamEvents.StreamInterrupt;
|
|
130
|
+
videoId: string;
|
|
131
|
+
timestamp: number;
|
|
132
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const sleep: (ms: number) => Promise<unknown>;
|
|
2
|
-
export declare const getRandom: () => string;
|
|
2
|
+
export declare const getRandom: (length?: number) => string;
|
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.
|
|
4
|
+
"version": "1.1.0-beta.50",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "d-id client sdk",
|
|
7
7
|
"repository": {
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@preact/preset-vite": "^2.8.1",
|
|
36
36
|
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
|
|
37
|
-
"@types/node": "^
|
|
37
|
+
"@types/node": "^22.15.0",
|
|
38
38
|
"commander": "^11.1.0",
|
|
39
39
|
"glob": "^10.3.10",
|
|
40
40
|
"preact": "^10.19.6",
|
|
@@ -45,4 +45,4 @@
|
|
|
45
45
|
"vite": "^5.1.4",
|
|
46
46
|
"vite-plugin-dts": "^3.7.3"
|
|
47
47
|
}
|
|
48
|
-
}
|
|
48
|
+
}
|