murmur-rag 0.1.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -19
- package/dist/cdn/anthropic-dc7h9prc.js +2 -0
- package/dist/cdn/chunk-hpx6rpea.js +1 -0
- package/dist/cdn/{embed-hn0r8fmg.js → embed-6gef7ym5.js} +2 -2
- package/dist/cdn/{embed-59r4jck6.js → embed-acjpjh6t.js} +3 -3
- package/dist/cdn/embed-fd96s8qk.js +44 -0
- package/dist/cdn/embed-jdraznwg.js +83 -0
- package/dist/cdn/{embed-q6y6vgv1.js → embed-krrjjyf5.js} +4 -4
- package/dist/cdn/{embed-we24qtes.js → embed-ssqsb38w.js} +2 -2
- package/dist/cdn/embed-z32y952f.js +9 -0
- package/dist/cdn/google-yywkqdph.js +14 -0
- package/dist/cdn/index-bq0x71h1.js +1 -0
- package/dist/cdn/index-gyd02jvt.js +9 -0
- package/dist/cdn/index-jt6n0d28.js +1 -0
- package/dist/cdn/index-nesgnf2n.js +1 -0
- package/dist/cdn/index-wgzgvzaf.js +1 -0
- package/dist/cdn/mistral-0mg4kk7s.js +3 -0
- package/dist/cdn/murmur-j1ky5vmr.js +5 -0
- package/dist/cdn/murmur.js +24 -5
- package/dist/cdn/openai-compatible-zhaj1r43.js +11 -0
- package/dist/cdn/openai-g1685z9v.js +18 -0
- package/dist/cdn/retriever-dqxzjaqk.js +1 -0
- package/dist/cdn/transformers.web-3kmbvcbt.js +46 -0
- package/dist/cli.js +10 -5
- package/dist/lib/chunks/{index-fs6gmhz9.js → index-8h9c8ekq.js} +4 -2
- package/dist/lib/chunks/{index-0x7gav29.js → index-92w507gk.js} +304 -27
- package/dist/lib/chunks/{index-6re28wc1.js → index-b77xqap3.js} +13 -1
- package/dist/lib/chunks/{index-z8pn9sdj.js → index-p86sy3y4.js} +17 -4
- package/dist/lib/chunks/{murmur-wq1d15n7.js → murmur-t36hd4vt.js} +2 -2
- package/dist/lib/chunks/{retriever-1rw4z2n6.js → retriever-wxshtnm0.js} +1 -1
- package/dist/lib/embed.js +4 -2
- package/dist/lib/index.js +5 -3
- package/dist/lib/indexer/index.js +10 -5
- package/dist/lib/local/index.js +163 -0
- package/dist/lib/rag/index.js +13 -11
- package/dist/lib/widget/index.js +2 -2
- package/dist/types/local/index.d.ts +56 -0
- package/dist/types/rag/ground.d.ts +7 -0
- package/dist/types/rag/index.d.ts +1 -1
- package/dist/types/widget/element.d.ts +3 -0
- package/dist/types/widget/i18n.d.ts +14 -0
- package/dist/types/widget/session.d.ts +20 -1
- package/dist/types/widget/styles.d.ts +1 -1
- package/package.json +18 -3
- package/dist/cdn/anthropic-w7nkjk5e.js +0 -2
- package/dist/cdn/chunk-e0j28zmb.js +0 -1
- package/dist/cdn/embed-2xm309sb.js +0 -7
- package/dist/cdn/embed-n7jskdxd.js +0 -44
- package/dist/cdn/embed-sgjh2kg2.js +0 -83
- package/dist/cdn/google-qha5xyx4.js +0 -14
- package/dist/cdn/index-11c9cspb.js +0 -1
- package/dist/cdn/index-e5entetm.js +0 -1
- package/dist/cdn/index-kk9hgxdc.js +0 -1
- package/dist/cdn/index-zrmby2xc.js +0 -9
- package/dist/cdn/mistral-16bekg8b.js +0 -3
- package/dist/cdn/murmur-5vkc01ns.js +0 -5
- package/dist/cdn/openai-compatible-za7hc1fv.js +0 -11
- package/dist/cdn/openai-dhy4fp4c.js +0 -18
- package/dist/cdn/retriever-k9mmdcz5.js +0 -1
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{oe,Ie}from"./embed-6gef7ym5.js";import{b,Ge,me,u,e,r,c,ie,o,t,l,f,y,i,n,G,k,T,d,N,M,ee,te,le,q,z,C,Nt,he,W,Se,lt,a,s,h,g,ne,ve,S,O,I,D,p,E,Ce,Y}from"./embed-jdraznwg.js";var xe=t({messages:o(G()).nullish(),cached_tokens:r().nullish(),audio_tokens:r().nullish()}).catchall(G()),Ue=t({reasoning_tokens:r().nullish()}).catchall(G()),_e=t({prompt_tokens:r(),completion_tokens:r(),total_tokens:r(),prompt_audio_seconds:r().nullish(),request_count:r().nullish(),service_tier:e().nullish(),num_cached_tokens:r().nullish(),prompt_tokens_details:xe.nullish(),prompt_token_details:xe.nullish(),completion_tokens_details:Ue.nullish()}).catchall(G());function pe(w){if(w==null)return te();let{prompt_tokens:m,completion_tokens:_}=w,U=w.num_cached_tokens??w.prompt_tokens_details?.cached_tokens??w.prompt_token_details?.cached_tokens??0;return{inputTokens:{total:m,noCache:m-U,cacheRead:U||void 0,cacheWrite:void 0},outputTokens:{total:_,text:_,reasoning:void 0},raw:w}}function ke({part:w}){if(w.data.type==="url")return w.data.url.toString();if(w.data.type==="data")return`data:${O({part:w})};base64,${M(w.data.data)}`;throw new u({functionality:`file part data type ${w.data.type}`})}function be(w){let m=[];for(let _=0;_<w.length;_++){let{role:U,content:L}=w[_],v=_===w.length-1;switch(U){case"system":m.push({role:"system",content:L});break;case"user":m.push({role:"user",content:L.map((R)=>{switch(R.type){case"text":return{type:"text",text:R.text};case"file":switch(R.data.type){case"reference":throw new u({functionality:"file parts with provider references"});case"text":throw new u({functionality:"text file parts"});case"url":case"data":if(z(R.mediaType)==="image")return{type:"image_url",image_url:ke({part:R})};else{if(R.data.type==="data"){if(O({part:R})!=="application/pdf")throw new u({functionality:"Only images and PDF file parts are supported"})}else if(R.mediaType!=="application/pdf")throw new u({functionality:"Only images and PDF file parts are supported"});return{type:"document_url",document_url:ke({part:R})}}}}})});break;case"assistant":{let R="",H=!1,x=[],j=[];for(let A of L)switch(A.type){case"text":R+=A.text,x.push({type:"text",text:A.text});break;case"tool-call":j.push({id:A.toolCallId,type:"function",function:{name:A.toolName,arguments:JSON.stringify(A.input)}});break;case"reasoning":H=!0,x.push({type:"thinking",thinking:[{type:"text",text:A.text}],closed:!0});break;default:throw Error(`Unsupported content type in assistant message: ${A.type}`)}m.push({role:"assistant",content:H?x:R,prefix:v?!0:void 0,tool_calls:j.length>0?j:void 0});break}case"tool":for(let R of L){if(R.type==="tool-approval-response")continue;let H=R.output,x;switch(H.type){case"text":case"error-text":x=H.value;break;case"execution-denied":x=H.reason??"Tool call execution denied.";break;case"content":case"json":case"error-json":x=JSON.stringify(H.value)}m.push({role:"tool",name:R.toolName,tool_call_id:R.toolCallId,content:x})}break;default:throw Error(`Unsupported role: ${U}`)}}return m}function je(w){switch(w){case"stop":return"stop";case"length":case"model_length":return"length";case"tool_calls":return"tool-calls";case"error":return"error";default:return"other"}}var Ee=()=>t({safePrompt:c().optional(),documentImageLimit:r().optional(),documentPageLimit:r().optional(),structuredOutputs:c().optional(),strictJsonSchema:c().optional(),parallelToolCalls:c().optional(),promptCacheKey:e().optional(),reasoningEffort:i(["high","none","low","max"]).optional()}),$e=a(()=>s(Ee())),De=a(()=>s(t({object:n("error"),message:e(),type:e(),param:e().nullable(),code:e().nullable()}))),ce=I({errorSchema:De,errorToMessage:(w)=>w.message});function Pe({tools:w,toolChoice:m}){w=w?.length?w:void 0;let _=[];if(w==null)return{tools:void 0,toolChoice:void 0,toolWarnings:_};let U=[];for(let v of w)if(v.type==="provider")_.push({type:"unsupported",feature:`provider-defined tool ${v.id}`});else U.push({type:"function",function:{name:v.name,description:v.description,parameters:v.inputSchema,...v.strict!=null?{strict:v.strict}:{}}});if(m==null)return{tools:U,toolChoice:void 0,toolWarnings:_};let L=m.type;switch(L){case"auto":case"none":return{tools:U,toolChoice:L,toolWarnings:_};case"required":return{tools:U,toolChoice:"any",toolWarnings:_};case"tool":return{tools:U.filter((v)=>v.function.name===m.toolName),toolChoice:"any",toolWarnings:_};default:throw new u({functionality:`tool choice type: ${L}`})}}var Ve=new Set(["codestral-2508","codestral-latest","ministral-14b-2512","ministral-14b-latest","ministral-3b-2512","ministral-3b-latest","ministral-8b-2512","ministral-8b-latest","mistral-code-fim-latest","mistral-code-latest","mistral-large-latest","mistral-large-2512","voxtral-small-2507","voxtral-small-latest"]),Je=new Set(["zai-glm-5","zai-glm-5-3","zai-glm-5-3-flash","zai-glm-latest"]),ze=class w{static[k](m){return E({modelId:m.modelId,config:m.config})}static[T](m){return new w(m.modelId,m.config)}constructor(m,_){this.specificationVersion="v4",this.supportedUrls={"application/pdf":[/^https:\/\/.*$/]},this.modelId=m,this.config=_,this.generateId=_.generateId??C}get provider(){return this.config.provider}async getArgs({prompt:m,maxOutputTokens:_,temperature:U,topP:L,topK:v,frequencyPenalty:R,presencePenalty:H,reasoning:x,stopSequences:j,responseFormat:A,seed:P,providerOptions:X,tools:se,toolChoice:Q}){let Z=[],J=await h({provider:"mistral",providerOptions:X,schema:$e})??{};if(v!=null)Z.push({type:"unsupported",feature:"topK"});let re=!Ve.has(this.modelId),B;if(re){let de=Je.has(this.modelId);if(J.reasoningEffort==null&&x==="none"&&de)Z.push({type:"compatibility",feature:"reasoning",details:'reasoning "none" is not directly supported by this model. mapped to effort "low".'});B=J.reasoningEffort??(W(x)?x==="none"?de?"low":"none":Se({reasoning:x,effortMap:de?{minimal:"low",low:"low",medium:"high",high:"high",xhigh:"max",max:"max"}:{minimal:"high",low:"high",medium:"high",high:"high",xhigh:"high",max:"high"},warnings:Z}):void 0)}else if(W(x))Z.push({type:"unsupported",feature:"reasoning",details:"This model does not support reasoning configuration."});let K=J.structuredOutputs??!0,V=J.strictJsonSchema??!1;if(A?.type==="json"&&(!K||A.schema==null))m=Nt({messages:m,schema:A.schema});let F={model:this.modelId,safe_prompt:J.safePrompt,max_tokens:_,temperature:U,top_p:L,...R!=null?{frequency_penalty:R}:{},...H!=null?{presence_penalty:H}:{},stop:j,random_seed:P,reasoning_effort:B,response_format:A?.type==="json"?K&&A?.schema!=null?{type:"json_schema",json_schema:{schema:A.schema,strict:V,name:A.name??"response",description:A.description}}:{type:"json_object"}:void 0,document_image_limit:J.documentImageLimit,document_page_limit:J.documentPageLimit,...J.promptCacheKey!==void 0?{prompt_cache_key:J.promptCacheKey}:{},messages:be(m)},{tools:ae,toolChoice:fe,toolWarnings:ye}=Pe({tools:se,toolChoice:Q});return{args:{...F,tools:ae,tool_choice:fe,...ae!=null&&J.parallelToolCalls!==void 0?{parallel_tool_calls:J.parallelToolCalls}:{}},warnings:[...Z,...ye]}}async doGenerate(m){let{args:_,warnings:U}=await this.getArgs(m),{responseHeaders:L,value:v,rawValue:R}=await g({url:`${this.config.baseURL}/chat/completions`,headers:d(this.config.headers?.(),m.headers),body:_,failedResponseHandler:ce,successfulResponseHandler:p(Ke),abortSignal:m.abortSignal,fetch:this.config.fetch}),H=v.choices[0],x=[];if(H.message.content!=null&&Array.isArray(H.message.content)){for(let j of H.message.content)if(j.type==="thinking"){let A=Te(j.thinking);if(A.length>0)x.push({type:"reasoning",text:A})}else if(j.type==="text"){if(j.text.length>0)x.push({type:"text",text:j.text})}}else{let j=Me(H.message.content);if(j!=null&&j.length>0)x.push({type:"text",text:j})}if(H.message.tool_calls!=null)for(let j of H.message.tool_calls)x.push({type:"tool-call",toolCallId:j.id,toolName:j.function.name,input:j.function.arguments});return{content:x,finishReason:{unified:je(H.finish_reason),raw:H.finish_reason??void 0},usage:pe(v.usage),request:{body:_},response:{...ee(v),headers:L,body:R},warnings:U}}async doStream(m){let{args:_,warnings:U}=await this.getArgs(m),L={..._,stream:!0},{responseHeaders:v,value:R}=await g({url:`${this.config.baseURL}/chat/completions`,headers:d(this.config.headers?.(),m.headers),body:L,failedResponseHandler:ce,successfulResponseHandler:D(Be),abortSignal:m.abortSignal,fetch:this.config.fetch}),H={unified:"interrupted",raw:void 0},x=void 0,j=!0,A=!1,P=null,X,se=this.generateId;return{stream:R.pipeThrough(new TransformStream({start(Q){X=new Ce(Q,{generateId:se}),Q.enqueue({type:"stream-start",warnings:U})},transform(Q,Z){if(m.includeRawChunks)Z.enqueue({type:"raw",rawValue:Q.rawValue});if(!Q.success){H={unified:"error",raw:void 0},Z.enqueue({type:"error",error:Q.error});return}let J=Q.value;if(j)j=!1,Z.enqueue({type:"response-metadata",...ee(J)});if(J.usage!=null)x=J.usage;let re=J.choices[0],B=re.delta,K=Me(B.content);if(B.content!=null&&Array.isArray(B.content)){for(let V of B.content)if(V.type==="thinking"){let F=Te(V.thinking);if(F.length>0){if(P==null){if(A)Z.enqueue({type:"text-end",id:"0"}),A=!1;P=se(),Z.enqueue({type:"reasoning-start",id:P})}Z.enqueue({type:"reasoning-delta",id:P,delta:F})}}}if(K!=null&&K.length>0){if(!A){if(P!=null)Z.enqueue({type:"reasoning-end",id:P}),P=null;Z.enqueue({type:"text-start",id:"0"}),A=!0}Z.enqueue({type:"text-delta",id:"0",delta:K})}if(B?.tool_calls!=null)for(let V of B.tool_calls)X.processDelta(V);if(re.finish_reason!=null)H={unified:je(re.finish_reason),raw:re.finish_reason}},flush(Q){if(P!=null)Q.enqueue({type:"reasoning-end",id:P});if(A)Q.enqueue({type:"text-end",id:"0"});X.flush(),Q.enqueue({type:"finish",finishReason:H,usage:pe(x)})}})),request:{body:L},response:{headers:v}}}};function Te(w){return w.filter((m)=>m.type==="text").map((m)=>m.text).join("")}function Me(w){if(typeof w==="string")return w;if(w==null)return;let m=[];for(let _ of w){let{type:U}=_;switch(U){case"text":m.push(_.text);break;case"thinking":case"image_url":case"reference":break;default:throw Error(`Unsupported type: ${U}`)}}return m.length?m.join(""):void 0}var qe=()=>l([e(),o(f("type",[t({type:n("text"),text:e()}),t({type:n("image_url"),image_url:l([e(),t({url:e(),detail:e().nullable()})])}),t({type:n("reference"),reference_ids:o(l([e(),r()]))}),t({type:n("thinking"),thinking:o(t({type:n("text"),text:e()}))})]))]).nullish(),Ke=a(()=>s(t({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({message:t({role:n("assistant"),content:qe(),tool_calls:o(t({id:e(),function:t({name:e(),arguments:e()})})).nullish()}),index:r(),finish_reason:e().nullish()})),object:n("chat.completion"),usage:_e}))),Be=a(()=>s(t({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({delta:t({role:i(["assistant"]).optional(),content:qe(),tool_calls:o(t({index:r().nullish(),id:e().nullish(),function:t({name:e().nullish(),arguments:e().nullish()})})).nullish()}),finish_reason:e().nullish(),index:r()})),usage:_e.nullish()})));function We(w,m){let _=[],U=[],L=new Set,v=(R)=>{if(L.has(R.toolCallId)){let x=null;if(R.output.type==="json"){let j=R.output.value,A=j!=null&&typeof j==="object"&&"info"in j?j.info:void 0;if(A!=null&&typeof A==="object"&&!Array.isArray(A))x="result"in A?A.result??A:A}_.push({type:"function.result",tool_call_id:R.toolCallId,result:typeof x==="string"?x:JSON.stringify(x)});return}let H=be([{role:"tool",content:[R]}])[0];_.push({type:"function.result",tool_call_id:R.toolCallId,result:H.content})};for(let R of w)switch(R.role){case"system":U.push(R.content);break;case"user":{let H=be([R])[0];if(H.role==="user")_.push({type:"message.input",role:"user",content:H.content});break}case"assistant":{let H=[],x=()=>{if(H.length>0)_.push({type:"message.input",role:"assistant",content:H}),H=[]};for(let j of R.content)switch(j.type){case"text":H.push({type:"text",text:j.text});break;case"reasoning":H.push({type:"thinking",thinking:[{type:"text",text:j.text}],closed:!0});break;case"tool-call":if(x(),j.providerExecuted){let A=j.providerOptions?.mistral?.function??j.providerOptions?.mistral?.name,P=j.input;_.push({type:"function.call",tool_call_id:j.toolCallId,name:typeof A==="string"?A:m.toProviderToolName(j.toolName),arguments:typeof P?.arguments==="string"?P.arguments:JSON.stringify(j.input)}),L.add(j.toolCallId)}else _.push({type:"function.call",tool_call_id:j.toolCallId,name:j.toolName,arguments:JSON.stringify(j.input)});break;case"tool-result":x(),v(j);break;default:throw new u({functionality:`assistant content type: ${j.type}`})}x();break}case"tool":for(let H of R.content){if(H.type==="tool-approval-response")continue;v(H)}}return{inputs:_,instructions:U.length>0?U.join(`
|
|
2
|
+
|
|
3
|
+
`):void 0}}var Fe=a(()=>s(Ee())),ge={"mistral.web_search":"web_search","mistral.web_search_premium":"web_search_premium"};function Ze({tools:w,toolChoice:m}){w=w?.length?w:void 0;let _=[];if(w==null)return{tools:void 0,toolChoice:void 0,toolWarnings:_};let U=[];for(let v of w)if(v.type==="provider"){if(v.id==="mistral.web_search"||v.id==="mistral.web_search_premium"){U.push({type:ge[v.id]});continue}_.push({type:"unsupported",feature:`provider-defined tool ${v.id}`})}else U.push({type:"function",function:{name:v.name,description:v.description,parameters:v.inputSchema,...v.strict!=null?{strict:v.strict}:{}}});if(m==null)return{tools:U,toolChoice:void 0,toolWarnings:_};let L=m.type;switch(L){case"auto":case"none":return{tools:U,toolChoice:L,toolWarnings:_};case"required":return{tools:U,toolChoice:"any",toolWarnings:_};case"tool":{let v=le({tools:w,providerToolNames:ge}).toProviderToolName(m.toolName);return{tools:U.filter((R)=>R.type==="function"?R.function.name===v:R.type===v),toolChoice:"any",toolWarnings:_}}default:throw new u({functionality:`tool choice type: ${L}`})}}var Ye=new Set(["glm-5-2","labs-leanstral-1-5","labs-leanstral-1-5-1","magistral-medium-latest","magistral-small-latest","mistral-large-4","mistral-large-4-0","mistral-medium","mistral-medium-2604","mistral-medium-3","mistral-medium-3-5","mistral-medium-3.5","mistral-medium-latest","mistral-small-2603","mistral-small-latest","mistral-vibe-cli-fast","mistral-vibe-cli-latest","mistral-vibe-cli-with-tools","zai-glm-5-2"]),Qe=class w{static[k](m){return E({modelId:m.modelId,config:m.config})}static[T](m){return new w(m.modelId,m.config)}constructor(m,_){this.specificationVersion="v4",this.supportedUrls={"application/pdf":[/^https:\/\/.*$/]},this.modelId=m,this.config=_,this.generateId=_.generateId??C}get provider(){return this.config.provider}async getArgs({prompt:m,maxOutputTokens:_,temperature:U,topP:L,topK:v,frequencyPenalty:R,presencePenalty:H,reasoning:x,stopSequences:j,responseFormat:A,seed:P,providerOptions:X,tools:se,toolChoice:Q}){let Z=[],J=await h({provider:"mistral",providerOptions:X,schema:Fe})??{};if(v!=null)Z.push({type:"unsupported",feature:"topK"});let re=Ye.has(this.modelId),B;if(re)B=J.reasoningEffort??(W(x)?x==="none"?"none":Se({reasoning:x,effortMap:{minimal:"high",low:"high",medium:"high",high:"high",xhigh:"high",max:"high"},warnings:Z}):void 0);else if(W(x))Z.push({type:"unsupported",feature:"reasoning",details:"This model does not support reasoning configuration."});let K=J.structuredOutputs??!0,V=J.strictJsonSchema??!1;if(A?.type==="json"&&(!K||A.schema==null))m=Nt({messages:m,schema:A.schema});let F={max_tokens:_,temperature:U,top_p:L,...R!=null?{frequency_penalty:R}:{},...H!=null?{presence_penalty:H}:{},stop:j,random_seed:P,reasoning_effort:B,response_format:A?.type==="json"?K&&A?.schema!=null?{type:"json_schema",json_schema:{schema:A.schema,strict:V,name:A.name??"response",description:A.description}}:{type:"json_object"}:void 0},{tools:ae,toolChoice:fe,toolWarnings:ye}=Ze({tools:se,toolChoice:Q});for(let[de,He]of Object.entries({safePrompt:J.safePrompt,documentImageLimit:J.documentImageLimit,documentPageLimit:J.documentPageLimit,promptCacheKey:J.promptCacheKey,parallelToolCalls:J.parallelToolCalls}))if(He!=null)Z.push({type:"unsupported",feature:de,details:"Not supported by the Mistral Conversations API."});return{args:{model:this.modelId,store:!1,...We(m,le({tools:se,providerToolNames:ge})),tools:ae,completion_args:{...F,tool_choice:fe}},warnings:[...Z,...ye]}}async doGenerate(m){let{args:_,warnings:U}=await this.getArgs(m),{value:L,rawValue:v,responseHeaders:R}=await g({url:`${this.config.baseURL}/conversations`,headers:d(this.config.headers?.(),m.headers),body:_,failedResponseHandler:ce,successfulResponseHandler:p(nt),abortSignal:m.abortSignal,fetch:this.config.fetch}),H=Re({tools:m.tools,generateId:this.generateId}),x=[],j=!1,A;for(let P of L.outputs)switch(P.type){case"tool.execution":x.push(...H.convertTool(P));break;case"function.call":j=!0,x.push({type:"tool-call",toolCallId:P.tool_call_id,toolName:P.name,input:typeof P.arguments==="string"?P.arguments:JSON.stringify(P.arguments)});break;case"message.output":A=P.model??A;for(let X of typeof P.content==="string"?[{type:"text",text:P.content}]:P.content)x.push(...H.convertChunk(X))}return{content:x,finishReason:{unified:j?"tool-calls":"stop",raw:void 0},usage:pe(L.usage),request:{body:_},response:{id:L.conversation_id,modelId:A,headers:R,body:v},warnings:U}}async doStream(m){let{args:_,warnings:U}=await this.getArgs(m),L={..._,stream:!0},{value:v,responseHeaders:R}=await g({url:`${this.config.baseURL}/conversations`,headers:d(this.config.headers?.(),m.headers),body:L,failedResponseHandler:ce,successfulResponseHandler:D(st),abortSignal:m.abortSignal,fetch:this.config.fetch}),H=Re({tools:m.tools,generateId:this.generateId}),x=new Map,j,A,P,X=!1,se=!1,Q=!1,Z=!1,J=(B)=>{if(A!=null)B.enqueue({type:A.type==="text"?"text-end":"reasoning-end",id:A.id}),A=void 0},re=this.generateId;return{stream:v.pipeThrough(new TransformStream({start(B){j=new Ce(B,{generateId:re}),B.enqueue({type:"stream-start",warnings:U})},transform(B,K){if(m.includeRawChunks)K.enqueue({type:"raw",rawValue:B.rawValue});if(!B.success){se=!0,K.enqueue({type:"error",error:B.error});return}let V=B.value;switch(V.type){case"conversation.response.started":K.enqueue({type:"response-metadata",id:V.conversation_id,...V.created_at!=null?{timestamp:new Date(V.created_at)}:{}});break;case"conversation.response.done":P=V.usage??void 0,Q=!0;break;case"conversation.response.error":se=!0,K.enqueue({type:"error",error:V});break;case"message.output.delta":if(!Z&&V.model!=null)Z=!0,K.enqueue({type:"response-metadata",modelId:V.model});for(let F of H.convertChunk(typeof V.content==="string"?{type:"text",text:V.content}:V.content))if(F.type==="text"||F.type==="reasoning"){let ae=`${V.id}-${V.content_index??0}`;if(A?.id!==ae||A.type!==F.type)J(K),A={id:ae,type:F.type},K.enqueue({type:F.type==="text"?"text-start":"reasoning-start",id:ae});K.enqueue({type:F.type==="text"?"text-delta":"reasoning-delta",id:ae,delta:F.text})}else if(F.type==="source")K.enqueue(F);break;case"function.call.delta":J(K),X=!0,j.processDelta({id:V.tool_call_id,index:V.output_index,function:{name:V.name,arguments:V.arguments}});break;case"tool.execution.started":case"tool.execution.delta":{J(K);let F=x.get(V.id);if(F==null)x.set(V.id,{name:V.name,arguments:V.arguments,function:V.function}),K.enqueue({type:"tool-input-start",id:V.id,toolName:H.toolNameMapping.toCustomToolName(V.name),providerExecuted:!0});else F.arguments+=V.arguments;break}case"tool.execution.done":{let F=x.get(V.id);if(F==null){se=!0,K.enqueue({type:"error",error:Error(`Missing tool execution start for ${V.id}`)});break}K.enqueue({type:"tool-input-delta",id:V.id,delta:JSON.stringify({arguments:F.arguments})}),K.enqueue({type:"tool-input-end",id:V.id});for(let ae of H.convertTool({type:"tool.execution",id:V.id,name:F.name,arguments:F.arguments,function:V.function??F.function,info:V.info}))K.enqueue(ae);x.delete(V.id);break}}},flush(B){J(B),j.flush(),B.enqueue({type:"finish",finishReason:{unified:se||!Q||x.size>0?"error":X?"tool-calls":"stop",raw:void 0},usage:pe(P)})}})),request:{body:L},response:{headers:R}}}};function Re({tools:w,generateId:m}){let _=le({tools:w,providerToolNames:ge}),U=new Set;return{toolNameMapping:_,convertChunk(L){switch(L.type){case"text":return L.text.length>0?[{type:"text",text:L.text}]:[];case"thinking":{let R=L.thinking.map((H)=>H.text).join("");return R.length>0?[{type:"reasoning",text:R}]:[]}case"tool_reference":if(L.url==null||U.has(L.url))return[];let v=m();return U.add(L.url),[{type:"source",sourceType:"url",id:v,url:L.url,title:L.title??L.url}]}},convertTool(L){let v=_.toCustomToolName(L.name);return[{type:"tool-call",toolCallId:L.id,toolName:v,input:JSON.stringify({arguments:L.arguments}),providerExecuted:!0,providerMetadata:{mistral:{type:"tool.execution",name:L.name,...L.function!=null?{function:L.function}:{}}}},{type:"tool-result",toolCallId:L.id,toolName:v,result:{...L.info!=null?{info:L.info}:{}}}]}}}var Oe=()=>f("type",[t({type:n("text"),text:e()}),t({type:n("thinking"),thinking:o(t({type:n("text"),text:e()}))}),t({type:n("tool_reference"),tool:e().nullish(),title:e().nullish(),url:e().nullish()})]),Xe=()=>l([e(),o(Oe())]),et=()=>t({type:n("tool.execution"),id:e(),name:e(),arguments:e(),function:e().nullish(),info:y(e(),G()).nullish()}),tt=()=>t({type:n("function.call"),tool_call_id:e(),name:e(),arguments:l([e(),y(e(),G())])}),Le=()=>_e.extend({prompt_tokens:r().default(0),completion_tokens:r().default(0),total_tokens:r().default(0)}),nt=a(()=>s(t({conversation_id:e(),outputs:o(f("type",[et(),tt(),t({type:n("message.output"),content:Xe(),model:e().nullish()})])),usage:Le().nullish()}))),st=a(()=>s(f("type",[t({type:n("conversation.response.started"),conversation_id:e(),created_at:e().nullish()}),t({type:n("conversation.response.done"),usage:Le().nullish()}),t({type:n("conversation.response.error"),message:e(),code:r()}),t({type:n("message.output.delta"),id:e(),content_index:r().nullish(),content:l([e(),Oe()]),model:e().nullish()}),t({type:n("function.call.delta"),tool_call_id:e(),name:e(),arguments:e(),output_index:r().nullish()}),t({type:i(["tool.execution.started","tool.execution.delta"]),id:e(),name:e(),arguments:e(),function:e().nullish()}),t({type:n("tool.execution.done"),id:e(),name:e(),function:e().nullish(),info:y(e(),G()).nullish()})]))),ot=t({metadata:y(e(),ie()).optional(),outputDimension:r().int().positive().optional(),outputDtype:i(["float","int8","uint8","binary","ubinary"]).optional()}),at=class w{get provider(){return this.config.provider}static[k](m){return E({modelId:m.modelId,config:m.config})}static[T](m){return new w(m.modelId,m.config)}constructor(m,_){this.specificationVersion="v4",this.maxEmbeddingsPerCall=32,this.supportsParallelCalls=!1,this.modelId=m,this.config=_}async doEmbed({values:m,dimensions:_,abortSignal:U,headers:L,providerOptions:v}){if(m.length>this.maxEmbeddingsPerCall)throw new me({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:m});let R=await h({provider:"mistral",providerOptions:v,schema:ot})??{},{responseHeaders:H,value:x,rawValue:j}=await g({url:`${this.config.baseURL}/embeddings`,headers:d(this.config.headers?.(),L),body:{model:this.modelId,input:m,metadata:R.metadata,output_dimension:R.outputDimension??_,output_dtype:R.outputDtype,encoding_format:"float"},failedResponseHandler:ce,successfulResponseHandler:p(it),abortSignal:U,fetch:this.config.fetch});return{warnings:[],embeddings:x.data.map((A)=>A.embedding),usage:x.usage?{tokens:x.usage.prompt_tokens}:void 0,response:{headers:H,body:j}}}},it=a(()=>s(t({data:o(t({embedding:o(r())})),usage:t({prompt_tokens:r()}).nullish()}))),rt=a(()=>s(t({refAudio:e().min(1).optional(),expressiveness:r().min(1).max(5).optional(),phonemeHints:y(e().min(1),o(e().min(1)).min(1)).optional()}))),ct=class w{static[k](m){return E({modelId:m.modelId,config:m.config})}static[T](m){return new w(m.modelId,m.config)}get provider(){return this.config.provider}constructor(m,_){this.modelId=m,this.config=_,this.specificationVersion="v4"}async getArgs({text:m,voice:_,outputFormat:U="mp3",instructions:L,speed:v,language:R,providerOptions:H}){let x=[],j=await h({provider:"mistral",providerOptions:H,schema:rt}),A="mp3";if(["pcm","wav","mp3","flac","opus"].includes(U))A=U;else x.push({type:"unsupported",feature:"outputFormat",details:`Unsupported output format: ${U}. Using mp3 instead.`});if(L!=null)x.push({type:"unsupported",feature:"instructions",details:"Mistral speech models do not support the `instructions` option. Use a reference audio clip to guide delivery."});if(v!=null)x.push({type:"unsupported",feature:"speed",details:"Mistral speech models do not support the `speed` option. It was ignored."});if(R!=null)x.push({type:"unsupported",feature:"language",details:"Mistral speech models do not support the `language` option. Language is inferred from the input text and voice."});let P=j?.refAudio,X={model:this.modelId,input:m,voice_id:P==null?_:void 0,ref_audio:P,expressiveness:j?.expressiveness,phoneme_hints:j?.phonemeHints,response_format:A,stream:!1};return{requestBody:X,requestBodyValues:{...X,ref_audio:P==null?void 0:"[redacted]"},warnings:x}}async doGenerate(m){let _=this.config._internal?.currentDate?.()??new Date,{requestBody:U,requestBodyValues:L,warnings:v}=await this.getArgs(m),{value:R,responseHeaders:H,rawValue:x}=await ve({url:`${this.config.baseURL}/audio/speech`,headers:d({"Content-Type":"application/json"},this.config.headers?.(),m.headers),body:{content:JSON.stringify(U),values:L},failedResponseHandler:ce,successfulResponseHandler:p(ut),abortSignal:m.abortSignal,fetch:this.config.fetch});return{audio:R.audio_data,warnings:v,request:{body:JSON.stringify(L)},response:{timestamp:_,modelId:this.modelId,headers:H,body:x}}}},ut=a(()=>s(t({audio_data:e()}))),dt=a(()=>s(t({language:e().min(1).optional(),returnLanguage:c().optional(),temperature:r().optional(),timestampGranularities:o(i(["segment","word"])).min(1).optional(),diarize:c().optional(),contextBias:o(e().min(1)).optional()}))),pt=class w{static[k](m){return E({modelId:m.modelId,config:m.config})}static[T](m){return new w(m.modelId,m.config)}get provider(){return this.config.provider}constructor(m,_){this.modelId=m,this.config=_,this.specificationVersion="v4"}async getArgs({audio:m,mediaType:_,providerOptions:U}){let L=[],v=await h({provider:"mistral",providerOptions:U,schema:dt});if(["voxtral-mini-2507","voxtral-mini-2602","voxtral-mini-latest"].includes(this.modelId)&&v?.language!=null&&v.timestampGranularities!=null)throw new b({argument:"providerOptions",message:"providerOptions.mistral.language cannot be combined with providerOptions.mistral.timestampGranularities"});if(v?.language!=null&&v.returnLanguage)throw new b({argument:"providerOptions",message:"providerOptions.mistral.language cannot be combined with providerOptions.mistral.returnLanguage"});let R=new FormData,H=m instanceof Uint8Array?new Blob([m]):new Blob([N(m)]);if(R.append("model",this.modelId),R.append("file",new File([H],"audio",{type:_}),`audio.${lt(_)}`),v!=null)ue(R,"language",v.language),ue(R,"return_language",v.returnLanguage),ue(R,"temperature",v.temperature),ue(R,"timestamp_granularities",v.timestampGranularities),ue(R,"diarize",v.diarize),ue(R,"context_bias",v.contextBias);return{formData:R,warnings:L}}async doGenerate(m){let _=this.config._internal?.currentDate?.()??new Date,{formData:U,warnings:L}=await this.getArgs(m),{value:v,responseHeaders:R,rawValue:H}=await ne({url:`${this.config.baseURL}/audio/transcriptions`,headers:d(this.config.headers?.(),m.headers),formData:U,failedResponseHandler:ce,successfulResponseHandler:p(mt),abortSignal:m.abortSignal,fetch:this.config.fetch}),x=v.segments?.map((P)=>({text:P.text,startSecond:P.start,endSecond:P.end}))??[],j={};if(v.usage!=null)j.usage={...v.usage.prompt_tokens!=null&&{promptTokens:v.usage.prompt_tokens},...v.usage.completion_tokens!=null&&{completionTokens:v.usage.completion_tokens},...v.usage.total_tokens!=null&&{totalTokens:v.usage.total_tokens},...v.usage.prompt_audio_seconds!=null&&{promptAudioSeconds:v.usage.prompt_audio_seconds},...v.usage.request_count!=null&&{requestCount:v.usage.request_count}};let A=v.segments?.filter((P)=>P.type!=null||P.score!=null||P.speaker_id!=null).map((P)=>({text:P.text,startSecond:P.start,endSecond:P.end,...P.type!=null&&{type:P.type},...P.score!=null&&{score:P.score},...P.speaker_id!=null&&{speakerId:P.speaker_id}}));if(A!=null&&A.length>0)j.segments=A;return{text:v.text,segments:x,language:v.language??void 0,durationInSeconds:v.usage?.prompt_audio_seconds??x.at(-1)?.endSecond??void 0,warnings:L,...v.usage!=null&&{usage:v.usage},response:{timestamp:_,modelId:v.model,headers:R,body:H},...Object.keys(j).length>0&&{providerMetadata:{mistral:j}}}}};function ue(w,m,_){if(_==null)return;if(Array.isArray(_)){for(let U of _)w.append(m,U);return}w.append(m,String(_))}var mt=a(()=>s(t({model:e(),text:e(),language:e().nullish(),segments:o(t({type:n("transcription_segment").nullish(),text:e(),start:r(),end:r(),score:r().nullish(),speaker_id:e().nullish()})).nullish(),usage:t({prompt_tokens:r().nullish(),completion_tokens:r().nullish(),total_tokens:r().nullish(),prompt_audio_seconds:r().nullish(),request_count:r().nullish()}).nullish()}))),gt="4.0.74",Ae=a(()=>s(t({arguments:e()}))),Ne=a(()=>s(t({info:y(e(),G()).optional()}))),ht=S({id:"mistral.web_search",inputSchema:Ae,outputSchema:Ne}),ft=S({id:"mistral.web_search_premium",inputSchema:Ae,outputSchema:Ne}),yt=(w={})=>ht(w),bt=(w={})=>ft(w),vt={webSearch:yt,webSearchPremium:bt};function we(w={}){let m=Y(w.baseURL)??"https://api.mistral.ai/v1",_=()=>q({Authorization:`Bearer ${he({apiKey:w.apiKey,environmentVariableName:"MISTRAL_API_KEY",description:"Mistral"})}`,...w.headers},`ai-sdk-mistral/${gt}`),U=(j)=>new ze(j,{provider:"mistral.chat",baseURL:m,headers:_,fetch:w.fetch,generateId:w.generateId}),L=(j)=>new at(j,{provider:"mistral.embedding",baseURL:m,headers:_,fetch:w.fetch}),v=(j)=>new Qe(j,{provider:"mistral.conversation",baseURL:m,headers:_,fetch:w.fetch,generateId:w.generateId}),R=(j)=>new ct(j,{provider:"mistral.speech",baseURL:m,headers:_,fetch:w.fetch}),H=(j)=>new pt(j,{provider:"mistral.transcription",baseURL:m,headers:_,fetch:w.fetch}),x=function(j){if(new.target)throw Error("The Mistral model function cannot be called with the new keyword.");return U(j)};return x.specificationVersion="v4",x.languageModel=U,x.chat=U,x.conversation=v,x.tools=vt,x.embedding=L,x.embeddingModel=L,x.textEmbedding=L,x.textEmbeddingModel=L,x.speech=R,x.speechModel=R,x.transcription=H,x.transcriptionModel=H,x.imageModel=(j)=>{throw new Ge({modelId:j,modelType:"imageModel"})},x}var St=we();var _t=Ie(we);function Mt(){oe("mistral",_t)}export{Mt as register};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{Mt}from"./embed-fd96s8qk.js";import{St}from"./embed-ssqsb38w.js";import{Ye,Ft,zt,Xe,Dt}from"./embed-z32y952f.js";function M(e,s){let t=[...s].reverse().find((o)=>o.role==="user");return Ye(e)<12&&t?`${t.content} ${e}`:e}function T(e){let s=e.retriever??(e.index?St(e.index):null)??(()=>{throw Error("murmur: pass `index` or `retriever`.")})();return{retriever:s,async ask(t,{history:o=[],signal:u}={}){let a={};if(e.limit!==void 0)a.limit=e.limit;if(e.budgetTokens!==void 0)a.budgetTokens=e.budgetTokens;let i=await s.search(M(t,o),a),d=[e.instructions?.trim(),zt(e.language),i.length?`Sources:
|
|
2
|
+
|
|
3
|
+
${Ft(i)}`:"Sources: none matched this question. Say you could not find it on this site."].filter(Boolean).join(`
|
|
4
|
+
|
|
5
|
+
`),g=[...o.slice(-(e.historyTurns??6)*2).map((r)=>({role:r.role,content:r.content})),{role:"user",content:t}],f=typeof e.model==="function"?await e.model():e.model,x=Mt({model:f,instructions:d,messages:g,onError:()=>{},...u?{abortSignal:u}:{}}),n="",c=()=>{},m=()=>{},l=new Promise((r,b)=>{c=r,m=b});l.catch(()=>{});async function*y(){try{for await(let r of x.stream){if(r.type==="error")throw r.error;if(r.type!=="text-delta")continue;n+=r.text,yield r.text}n=Xe(n),c({text:n,cited:Dt(n,i.length)})}catch(r){throw m(r),r}}return{passages:i,textStream:y(),done:l}}}}export{T as createMurmur};
|
package/dist/cdn/murmur.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import{
|
|
2
|
-
var
|
|
1
|
+
import{F,yn,Xe,At}from"./embed-z32y952f.js";yn(import.meta.url,["cztxc0wh","bq0x71h1","hpx6rpea","gyd02jvt","j1ky5vmr","dqxzjaqk","nesgnf2n","jt6n0d28","z32y952f","6gef7ym5","krrjjyf5","fd96s8qk","ssqsb38w","3kmbvcbt","zhaj1r43","wgzgvzaf","t87kf8t0","g1685z9v","dc7h9prc","yywkqdph","0mg4kk7s","jdraznwg","acjpjh6t"],[["./murmur.js",8],["./index-bq0x71h1.js",9],["./chunk-hpx6rpea.js",10],["./index-gyd02jvt.js",10],["./murmur-j1ky5vmr.js",11,12,8],["./retriever-dqxzjaqk.js",12],["./index-nesgnf2n.js",9],["./index-jt6n0d28.js",8],["./embed-z32y952f.js"],["./embed-6gef7ym5.js",8],["./embed-krrjjyf5.js"],["./embed-fd96s8qk.js",8,21],["./embed-ssqsb38w.js",8],["./transformers.web-3kmbvcbt.js",8],["./openai-compatible-zhaj1r43.js",9,21],["./index-wgzgvzaf.js",11],["./browser-t87kf8t0.js"],["./openai-g1685z9v.js",9,8,21],["./anthropic-dc7h9prc.js",9,22,21],["./google-yywkqdph.js",9,22,21],["./mistral-0mg4kk7s.js",9,21],["./embed-jdraznwg.js"],["./embed-acjpjh6t.js",21]],0);
|
|
2
|
+
var J={open:"Ask a question",close:"Close",title:"Ask this site",greeting:"Hi! Ask me anything about this site. I answer from its pages and link to them.",placeholder:"Your question…",send:"Send",stop:"Stop",settings:"AI settings",back:"Back to chat",sources:"Sources",notFound:"Nothing on this site matched. Try other words?",thinking:"Looking through the site…",newChat:"New conversation",poweredBy:"Answers from this site's pages, by murmur",errorAuth:"The key was refused. Check it in the AI settings.",errorNetwork:"No answer from the AI provider: key refused or network down.",errorRate:"The AI provider is busy or rate-limited. Try again in a moment.",errorOther:"The answer failed:",retry:"Try again",setupTitle:"Connect an AI model",setupIntro:"Pick how this site answers you: a model that runs in your browser, or your own AI key, kept encrypted in your browser and sent only to the provider you pick.",provider:"Provider",model:"Model",apiKey:"API key",apiKeyHint:"Sent only to the provider, never to this site.",remember:"Remember on this device",local:"Local server (Ollama, LM Studio)",localHint:"The server must allow this site's origin (CORS).",endpoint:"Server URL",test:"Test",testing:"Testing…",testOk:"Connected.",testFail:"Connection failed:",save:"Save and chat",forget:"Forget my key",loadingCatalog:"Loading models…",catalogError:"Could not load the model list.",searchModels:"Search models",recommended:"Recommended",otherProviders:"Other providers",localOption:"Run a model in this browser",localOptionHint:"{name}, about {size} downloaded once, then kept in this browser. Needs WebGPU; nothing you type leaves your device.",localActive:"Running in this browser",orKey:"or connect a provider with your key",useKey:"Use an API key instead",localConsent:"This assistant can run entirely in your browser with {name}, an AI model of about {size}. It downloads once, then stays in this browser; your questions never leave your device.",localDownload:"Download and answer",localLoading:"Downloading the model…",localLoadingLabel:"Model download",localPreparing:"Preparing the model on your GPU…",localNoWebGPU:"This browser cannot run the model locally (no WebGPU). Try a recent Chrome, Edge or Safari, or use an API key.",localLoadFailed:"The model could not be loaded in this browser.",gigabytes:"GB",megabytes:"MB"},le={open:"Poser une question",close:"Fermer",title:"Demandez au site",greeting:"Bonjour ! Posez-moi une question sur ce site. Je réponds à partir de ses pages, avec les liens.",placeholder:"Votre question…",send:"Envoyer",stop:"Arrêter",settings:"Réglages IA",back:"Retour au chat",sources:"Sources",notFound:"Rien sur ce site ne correspond. Essayez d'autres mots ?",thinking:"Je cherche dans le site…",newChat:"Nouvelle conversation",poweredBy:"Réponses tirées des pages de ce site, par murmur",errorAuth:"La clé a été refusée. Vérifiez-la dans les réglages IA.",errorNetwork:"Pas de réponse du fournisseur d'IA : clé refusée ou réseau coupé.",errorRate:"Le fournisseur d'IA est saturé ou limite les appels. Réessayez dans un instant.",errorOther:"La réponse a échoué :",retry:"Réessayer",setupTitle:"Connecter un modèle d'IA",setupIntro:"Choisissez comment ce site vous répond : un modèle qui tourne dans votre navigateur, ou votre propre clé d'IA, gardée chiffrée dans votre navigateur et envoyée seulement au fournisseur choisi.",provider:"Fournisseur",model:"Modèle",apiKey:"Clé API",apiKeyHint:"Envoyée uniquement au fournisseur, jamais à ce site.",remember:"Mémoriser sur cet appareil",local:"Serveur local (Ollama, LM Studio)",localHint:"Le serveur doit autoriser l'origine de ce site (CORS).",endpoint:"URL du serveur",test:"Tester",testing:"Test…",testOk:"Connecté.",testFail:"Échec de la connexion :",save:"Enregistrer et discuter",forget:"Oublier ma clé",loadingCatalog:"Chargement des modèles…",catalogError:"Impossible de charger la liste des modèles.",searchModels:"Chercher un modèle",recommended:"Recommandés",otherProviders:"Autres fournisseurs",localOption:"Faire tourner un modèle dans ce navigateur",localOptionHint:"{name}, environ {size} téléchargés une fois puis gardés dans ce navigateur. Nécessite WebGPU ; rien de ce que vous tapez ne quitte votre appareil.",localActive:"Modèle actif dans ce navigateur",orKey:"ou connectez un fournisseur avec votre clé",useKey:"Utiliser une clé API à la place",localConsent:"Cet assistant peut fonctionner entièrement dans votre navigateur avec {name}, un modèle d'IA d'environ {size}. Il se télécharge une fois puis reste dans ce navigateur ; vos questions ne quittent jamais votre appareil.",localDownload:"Télécharger et répondre",localLoading:"Téléchargement du modèle…",localLoadingLabel:"Téléchargement du modèle",localPreparing:"Préparation du modèle sur votre GPU…",localNoWebGPU:"Ce navigateur ne peut pas faire tourner le modèle en local (pas de WebGPU). Essayez un Chrome, Edge ou Safari récent, ou utilisez une clé API.",localLoadFailed:"Le modèle n'a pas pu être chargé dans ce navigateur.",gigabytes:"Go",megabytes:"Mo"},Z={en:J,fr:le};function Q(...e){for(let n of e){let s=n?.toLowerCase().split(/[-_]/)[0];if(s&&s in Z)return s}return"en"}function K(e,n={}){return{...Z[e]??J,...n}}var ce={chat:'<path d="M4 6.5A2.5 2.5 0 0 1 6.5 4h11A2.5 2.5 0 0 1 20 6.5v7a2.5 2.5 0 0 1-2.5 2.5H10l-4.2 3.4c-.5.4-1.3 0-1.3-.6V6.5Z"/><path d="M8.5 9h7M8.5 12h4.5"/>',close:'<path d="M6 6l12 12M18 6 6 18"/>',send:'<path d="M12 19V5M6 11l6-6 6 6"/>',stop:'<rect x="7" y="7" width="10" height="10" rx="1.5"/>',settings:'<path d="M4 7h9M17 7h3M4 17h3M11 17h9"/><circle cx="15" cy="7" r="2"/><circle cx="9" cy="17" r="2"/>',reset:'<path d="M5 12a7 7 0 1 0 2.1-5"/><path d="M5 4.5V8h3.5"/>',back:'<path d="M14.5 6 8.5 12l6 6"/>',check:'<path d="m5.5 12.5 4 4 9-9"/>',key:'<circle cx="8" cy="15" r="3.5"/><path d="m10.5 12.5 8-8M16 7l2 2M14 9l1.5 1.5"/>'};function B(e,n){let s=e.createElement("template");return s.innerHTML=`<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">${ce[n]??""}</svg>`,s.content.firstElementChild}var de=/^(https?:\/\/|\/|#|\.\/|mailto:)/i;function S(e,n,s,t){let o=/(`[^`]+`)|(\*\*[^*]+\*\*)|(\*[^*\s][^*]*\*|_[^_\s][^_]*_)|(\[[^\]]+\]\([^)\s]+\))|(\[\d{1,2}\])/g,i=0;for(let l of n.matchAll(o)){let p=l.index??0;if(p>i)t.appendChild(e.createTextNode(n.slice(i,p)));i=p+l[0].length;let c=l[0];if(l[1]){let d=e.createElement("code");d.textContent=c.slice(1,-1),t.appendChild(d)}else if(l[2]){let d=e.createElement("strong");S(e,c.slice(2,-2),s,d),t.appendChild(d)}else if(l[3]){let d=e.createElement("em");S(e,c.slice(1,-1),s,d),t.appendChild(d)}else if(l[4]){let d=c.indexOf("]("),r=c.slice(1,d),u=c.slice(d+2,-1);if(de.test(u)){let h=e.createElement("a");if(h.href=u,h.textContent=r,/^https?:/i.test(u))h.target="_blank",h.rel="noopener noreferrer";t.appendChild(h)}else t.appendChild(e.createTextNode(r))}else{let d=s(Number(c.slice(1,-1)));t.appendChild(d??e.createTextNode(c))}}if(i<n.length)t.appendChild(e.createTextNode(n.slice(i)))}var pe=/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)*\|?\s*$/;function X(e,n){return/ {2,}$|\\$/.test(n)?e.createElement("br"):e.createTextNode(" ")}function ee(e){return e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map((n)=>n.trim())}function U(e,n,s){let t=e.ownerDocument,o=t.createDocumentFragment(),i=n.replace(/\r\n?/g,`
|
|
3
3
|
`).split(`
|
|
4
|
-
`),
|
|
5
|
-
`),
|
|
4
|
+
`),l=[],p=null,c=()=>{if(!l.length)return;let r=t.createElement("p");l.forEach((u,h)=>{if(h)r.appendChild(X(t,l[h-1]??""));S(t,u.trim(),s,r)}),o.appendChild(r),l=[]},d=()=>{p=null};for(let r=0;r<i.length;r++){let u=i[r]??"",h=/^(\s*)```/.exec(u);if(h){c();let m=h[1]?.length??0,f=m>=2&&p?p.lastElementChild:null;if(!f)d();let y=[];for(r++;r<i.length&&!/^\s*```/.test(i[r]??"");r++){let w=i[r]??"";y.push(w.startsWith(" ".repeat(m))?w.slice(m):w.trimStart())}let L=t.createElement("pre");L.tabIndex=0;let C=t.createElement("code");C.textContent=y.join(`
|
|
5
|
+
`),L.appendChild(C),(f??o).appendChild(L);continue}if(/^\s*([-*_])(?:\s*\1){2,}\s*$/.test(u)){c(),d(),o.appendChild(t.createElement("hr"));continue}if(u.includes("|")&&pe.test(i[r+1]??"")){c(),d();let m=[ee(u)];for(r+=2;r<i.length&&(i[r]??"").includes("|");r++)m.push(ee(i[r]??""));r--;let f=t.createElement("div");f.className="table",f.tabIndex=0;let y=t.createElement("table");m.forEach((L,C)=>{let w=t.createElement("tr");for(let T of L){let A=t.createElement(C===0?"th":"td");S(t,T,s,A),w.appendChild(A)}y.appendChild(w)}),f.appendChild(y),o.appendChild(f);continue}let x=/^\s*>\s?(.*)$/.exec(u);if(x){c(),d();let m=[x[1]??""];for(;/^\s*>/.test(i[r+1]??"");r++)m.push((i[r+1]??"").replace(/^\s*>\s?/,""));let f=t.createElement("blockquote");U(f,m.join(`
|
|
6
|
+
`),s),o.appendChild(f);continue}let b=/^\s*(?:([-*+])|(\d+)[.)])\s+(.*)$/.exec(u);if(b){c();let m=b[1]?"ul":"ol";if(!p||p.tagName.toLowerCase()!==m){if(p=t.createElement(m),m==="ol"&&b[2]&&b[2]!=="1")p.setAttribute("start",b[2]);o.appendChild(p)}let f=t.createElement("li");S(t,(b[3]??"").trimEnd(),s,f),p.appendChild(f);continue}let k=/^\s*#{1,6}\s+(.*)$/.exec(u);if(k){c(),d();let m=t.createElement("p"),f=t.createElement("strong");S(t,k[1]??"",s,f),m.appendChild(f),o.appendChild(m);continue}if(!u.trim()){c();let m=i.slice(r+1).find((y)=>y.trim())??"",f=p?.tagName.toLowerCase()==="ol"?/^\s*\d+[.)]\s+/:/^\s*[-*+]\s+/;if(!p||!f.test(m))d();continue}if(p&&/^\s{2,}\S/.test(u)){let m=p.lastElementChild;if(m){m.appendChild(X(t,i[r-1]??"")),S(t,u.trim(),s,m);continue}}d(),l.push(u)}c(),e.replaceChildren(o)}var ue={limit:4,budgetTokens:1500};class W{options;turns=[];engine=null;storePromise=null;historyKey;key;onProgress=null;constructor(e){this.options=e;this.key=e.storageKey??"murmur",this.historyKey=`${e.storageKey??"murmur"}-chat:${location.pathname.split("/")[1]??""}`;try{let n=sessionStorage.getItem(this.historyKey);if(n)this.turns=JSON.parse(n)}catch{this.turns=[]}}get mode(){if(this.options.model)return"custom";if(this.options.local||this.visitorChoseLocal)return"local";return this.options.llm?.endpoint?"proxy":"visitor"}async localSpec(){let{local:e}=this.options;if(e&&typeof e==="object")return e;return(await (F("jt6n0d28"),import("./index-jt6n0d28.js"))).DEFAULT_LOCAL_MODEL}get visitorChoseLocal(){return te(`${this.key}-local`)==="1"}useLocal(e){ne(`${this.key}-local`,e?"1":null),this.engine=null}get needsDownloadConsent(){return this.mode==="local"&&te(`${this.key}-local-consent`)!=="1"}agreeToDownload(){ne(`${this.key}-local-consent`,"1")}persist(){try{sessionStorage.setItem(this.historyKey,JSON.stringify(this.turns.slice(-30)))}catch{}}clear(){this.turns=[],this.persist()}store(){return this.storePromise??=(F("bq0x71h1"),import("./index-bq0x71h1.js")).then((e)=>{let n={};if(this.options.catalogUrl)n.catalogUrl=this.options.catalogUrl;if(this.options.storageKey)n.storageKey=this.options.storageKey;return e.visitorStore(this.options.llm??{},n)}),this.storePromise}async settings(){if(this.mode==="custom")return null;let e=await (F("bq0x71h1"),import("./index-bq0x71h1.js"));return e.resolveSettings(this.options.llm??{},this.mode==="visitor"?await this.store():null)}async needsSetup(){return this.mode==="visitor"&&!await this.settings()}async canRunLocally(){return(await (F("jt6n0d28"),import("./index-jt6n0d28.js"))).hasWebGPU()}async loadIndex(){let{index:e}=this.options;if(e&&typeof e!=="string")return e;let{isMurmurIndex:n}=await (F("hpx6rpea"),import("./chunk-hpx6rpea.js"));if(e){let t=await fetch(new URL(e,location.href));if(!t.ok)throw Error(`murmur: index ${t.status}`);let o=await t.json();if(!n(o))throw Error("murmur: not a murmur index");return o}let{indexDocument:s}=await (F("gyd02jvt"),import("./index-gyd02jvt.js"));return s(document,location.pathname+location.search)}createEngine(){return(async()=>{let[{createMurmur:e},n]=await Promise.all([(F("j1ky5vmr"),import("./murmur-j1ky5vmr.js")),this.options.retriever??(F("dqxzjaqk"),import("./retriever-dqxzjaqk.js")).then(async(i)=>i.bm25Retriever(await this.loadIndex()))]),s=this.mode==="local",t=this.options.model??(s?async()=>{let{localModel:i}=await (F("jt6n0d28"),import("./index-jt6n0d28.js"));return i({spec:await this.localSpec(),onProgress:(l)=>this.onProgress?.(l)})}:async()=>{let i=await this.settings();if(!i)throw new P;let{loadModel:l}=await (F("bq0x71h1"),import("./index-bq0x71h1.js"));return l(i)}),o={retriever:n,model:t,...s?ue:{}};if(this.options.instructions)o.instructions=this.options.instructions;if(this.options.lang)o.language=this.options.lang;return e(o)})()}async ask(e,n,s){let t=this.turns.filter((i)=>!i.error).map(({role:i,content:l})=>({role:i,content:l}));this.turns.push({role:"user",content:e});let o={role:"assistant",content:""};this.turns.push(o),this.persist();try{this.engine??=this.createEngine();let l=await(await this.engine.catch((c)=>{throw this.engine=null,c})).ask(e,{history:t,signal:s});o.passages=l.passages.map(({url:c,anchor:d,title:r,heading:u})=>({url:c,anchor:d,title:r,heading:u}));for await(let c of l.textStream)o.content+=c,n(o.content,o);let p=await l.done;o.content=p.text,o.cited=p.cited}catch(i){if(s.aborted)o.cited=[];else if(i instanceof P)throw this.turns.splice(-2,2),i;else o.error=await this.describe(i)}finally{this.persist()}return o}async describe(e){if(e instanceof Error&&e.name==="LocalModelError")return`local-${e.code??"load"}|${e.message}`;try{let{describeError:n}=await (F("bq0x71h1"),import("./index-bq0x71h1.js")),s=this.mode==="custom"||this.mode==="local"?null:await this.settings(),t=n(e,s?.apiKey);return`${t.code}|${t.message}`}catch{return`unknown|${e instanceof Error?e.message:String(e)}`}}}function te(e){try{return localStorage.getItem(e)}catch{return null}}function ne(e,n){try{if(n===null)localStorage.removeItem(e);else localStorage.setItem(e,n)}catch{}}class P extends Error{constructor(){super("murmur: no model set up")}}var se=`
|
|
6
7
|
:host {
|
|
7
8
|
--accent: var(--murmur-accent, #211c17);
|
|
8
9
|
--accent-ink: var(--murmur-accent-ink, #f6efe0);
|
|
@@ -108,6 +109,13 @@ header .icon-btn:focus-visible { outline-color: var(--accent-ink); }
|
|
|
108
109
|
.msg code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.88em; background: var(--raised); padding: 0.1em 0.35em; border-radius: 5px; }
|
|
109
110
|
.msg pre { margin: 0 0 0.6em; padding: 10px 12px; background: var(--raised); border-radius: 10px; overflow-x: auto; }
|
|
110
111
|
.msg pre code { background: none; padding: 0; }
|
|
112
|
+
.msg .table { margin: 0 0 0.6em; overflow-x: auto; border-radius: 10px; box-shadow: inset 0 0 0 1px var(--line); }
|
|
113
|
+
.msg table { width: 100%; border-collapse: collapse; font-size: 14px; }
|
|
114
|
+
.msg th, .msg td { padding: 6px 10px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--line); }
|
|
115
|
+
.msg tr:last-child td { border-bottom: 0; }
|
|
116
|
+
.msg th { font-weight: 650; background: var(--raised); }
|
|
117
|
+
.msg blockquote { margin: 0 0 0.6em; padding: 2px 0 2px 12px; color: var(--muted); box-shadow: inset 1px 0 0 var(--line); }
|
|
118
|
+
.msg hr { margin: 0.8em 0; border: 0; border-top: 1px solid var(--line); }
|
|
111
119
|
.user {
|
|
112
120
|
align-self: flex-end; max-width: 85%;
|
|
113
121
|
padding: 9px 14px; border-radius: 16px 16px 4px 16px;
|
|
@@ -194,6 +202,17 @@ footer a:hover { text-decoration: underline; }
|
|
|
194
202
|
.result.ok { color: inherit; }
|
|
195
203
|
.result.ok::before { content: ""; display: inline-block; width: 8px; height: 8px; margin-right: 8px; border-radius: 50%; background: var(--lamp); }
|
|
196
204
|
.result.fail { color: var(--danger); }
|
|
205
|
+
.local-choice { display: grid; gap: 6px; padding: 14px; border-radius: 12px; background: var(--raised); }
|
|
206
|
+
.local-choice small { color: var(--muted); font-size: 12.5px; }
|
|
207
|
+
.local-choice .link-btn { margin-top: 2px; }
|
|
208
|
+
p.or { margin: 0; color: var(--muted); font-size: 13px; text-align: center; }
|
|
209
|
+
.consent { display: grid; gap: 10px; padding: 14px; border-radius: 12px; background: var(--raised); }
|
|
210
|
+
.consent p { margin: 0; }
|
|
211
|
+
.status .grow { display: grid; gap: 6px; flex: 1; }
|
|
212
|
+
progress { width: 100%; height: 6px; appearance: none; border: 0; border-radius: 3px; background: var(--line); overflow: hidden; }
|
|
213
|
+
progress::-webkit-progress-bar { background: var(--line); }
|
|
214
|
+
progress::-webkit-progress-value { background: var(--lamp); }
|
|
215
|
+
progress::-moz-progress-bar { background: var(--lamp); }
|
|
197
216
|
.link-btn { padding: 0; border: 0; background: none; color: var(--muted); font-size: 13px; text-decoration: underline; text-underline-offset: 0.2em; justify-self: start; }
|
|
198
217
|
|
|
199
218
|
.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
|
|
@@ -201,4 +220,4 @@ footer a:hover { text-decoration: underline; }
|
|
|
201
220
|
@media (prefers-reduced-motion: reduce) {
|
|
202
221
|
*, .panel { animation: none !important; transition: none !important; }
|
|
203
222
|
}
|
|
204
|
-
`;var ee={auth:"errorAuth","auth-or-network":"errorNetwork","rate-limit":"errorRate",overloaded:"errorRate"},te=typeof HTMLElement>"u"?class{}:HTMLElement;class K extends te{options={};session=null;t=P("en");root;launcher;panel;log;chatView;setupView;input;sendBtn;settingsBtn;controller=null;built=!1;unsubscribe=null;constructor(){super();this.root=this.attachShadow({mode:"open"})}configure(e){if(this.options={...this.options,...e},this.isConnected)this.build();return this}get isOpen(){return this.hasAttribute("inline")||this.launcher?.getAttribute("aria-expanded")==="true"}connectedCallback(){this.build()}disconnectedCallback(){this.controller?.abort(),this.unsubscribe?.()}async open(){if(!this.built)this.build();this.launcher.setAttribute("aria-expanded","true"),this.panel.hidden=!1,this.session?.persist(),N("set",this.openKey),this.input.focus()}close(){if(this.hasAttribute("inline"))return;this.launcher.setAttribute("aria-expanded","false"),this.panel.hidden=!0,N("remove",this.openKey),this.launcher.focus()}async ask(e){if(!this.isOpen)await this.open();this.input.value=e,await this.submit()}get openKey(){return`${this.options.storageKey??"murmur"}-open`}build(){let e=this.options,n=j(e.lang,document.documentElement.lang,navigator.language),i={...e.messages};if(this.t=P(n,i),e.position)this.setAttribute("position",e.position);if(e.theme&&e.theme!=="auto")this.setAttribute("theme",e.theme);if(e.accent)this.style.setProperty("--murmur-accent",e.accent);this.controller?.abort(),this.unsubscribe?.();let t=this.ownerDocument,s=t.createElement("style");s.textContent=W,this.launcher=r(t,"button",{class:"launcher",type:"button","aria-expanded":"false"}),this.launcher.setAttribute("aria-controls","murmur-panel"),this.launcher.append(r(t,"span",{class:"lamp","aria-hidden":"true"}),v(t,"span",this.t.open)),this.launcher.addEventListener("click",()=>void this.open()),this.panel=r(t,"section",{class:"panel",id:"murmur-panel",role:"dialog"}),this.panel.setAttribute("aria-label",this.t.title),this.panel.hidden=!this.hasAttribute("inline"),this.panel.addEventListener("keydown",(h)=>{if(h.key==="Escape")this.close()});let a=r(t,"header"),c=v(t,"h2",this.t.title),p=B(t,"reset",this.t.newChat);p.addEventListener("click",()=>{this.controller?.abort(),this.session?.clear(),this.renderChat(),this.input.focus()}),this.settingsBtn=B(t,"settings",this.t.settings),this.settingsBtn.hidden=!!e.model||!!e.llm?.endpoint,this.settingsBtn.addEventListener("click",()=>void this.showSetup());let o=B(t,"close",this.t.close);o.hidden=this.hasAttribute("inline"),o.addEventListener("click",()=>this.close()),a.append(c,p,this.settingsBtn,o),this.chatView=r(t,"div",{class:"chat"}),this.chatView.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0",this.log=r(t,"div",{class:"log",role:"log","aria-live":"polite","aria-relevant":"additions"});let l=r(t,"form",{class:"composer"});this.input=r(t,"textarea",{rows:"1",placeholder:this.t.placeholder}),this.input.setAttribute("aria-label",this.t.placeholder),this.input.addEventListener("input",()=>this.autosize()),this.input.addEventListener("keydown",(h)=>{if(h.key==="Enter"&&!h.shiftKey&&!h.isComposing)h.preventDefault(),this.submit()}),this.sendBtn=r(t,"button",{class:"send",type:"submit"}),this.setSendMode("send"),l.addEventListener("submit",(h)=>{if(h.preventDefault(),this.controller)this.controller.abort();else this.submit()}),l.append(this.input,this.sendBtn);let d=r(t,"footer"),u=r(t,"a",{href:"https://maxgfr.github.io/murmur/",target:"_blank",rel:"noopener"});if(u.textContent=this.t.poweredBy,d.append(u),this.chatView.append(this.log,l,d),this.setupView=r(t,"div",{class:"setup"}),this.setupView.hidden=!0,this.panel.append(a,this.chatView,this.setupView),this.root.replaceChildren(s,this.launcher,this.panel),this.hasAttribute("inline"))this.launcher.hidden=!0;if(this.built=!0,this.session=new O({...e,lang:n}),this.renderChat(),e.open||!this.hasAttribute("inline")&&N("get",this.openKey))this.open()}autosize(){this.input.style.height="auto",this.input.style.height=`${Math.min(this.input.scrollHeight,140)}px`}setSendMode(e){this.sendBtn.replaceChildren(R(this.ownerDocument,e)),this.sendBtn.setAttribute("aria-label",e==="send"?this.t.send:this.t.stop)}emit(e){this.dispatchEvent(new CustomEvent("murmur:state",{detail:e,bubbles:!0,composed:!0}))}renderChat(){let e=this.ownerDocument,n=this.session?.turns??[],i=[],t=r(e,"div",{class:"msg bot greeting"});t.append(v(e,"p",this.t.greeting)),i.push(t);for(let s of n)i.push(this.turnNode(s));this.log.replaceChildren(...i),this.log.scrollTop=this.log.scrollHeight}turnNode(e){let n=this.ownerDocument;if(e.role==="user"){let t=r(n,"div",{class:"msg user"});return t.textContent=e.content,t}let i=r(n,"div",{class:"msg bot"});return this.fillAnswer(i,e,!0),i}fillAnswer(e,n,i){let t=this.ownerDocument;if(n.error){let[o="unknown",...l]=n.error.split("|"),d=ee[o],u=r(t,"div",{class:"error",role:"alert"});u.append(v(t,"p",d?this.t[d]:`${this.t.errorOther} ${l.join("|")}`));let h=r(t,"div",{class:"row"}),b=r(t,"button",{class:"text-btn",type:"button"});if(b.textContent=this.t.retry,b.addEventListener("click",()=>{let f=this.session?.turns??[],m=f.at(-2)?.content??"";if(f.splice(-2,2),this.renderChat(),m)this.ask(m)}),h.append(b),o==="auth"||o==="auth-or-network"){if(!this.settingsBtn.hidden){let f=r(t,"button",{class:"text-btn",type:"button"});f.textContent=this.t.settings,f.addEventListener("click",()=>void this.showSetup()),h.append(f)}}u.append(h),e.replaceChildren(u);return}let s=n.passages??[],a=r(t,"div");U(a,n.content,(o)=>{let l=s[o-1];if(!l)return null;let d=r(t,"a",{class:"cite",href:kt(l)});return d.textContent=String(o),d.setAttribute("aria-label",`${this.t.sources} ${o}: ${l.title}`),d});let c=[a];if(i&&!n.content.trim()&&!s.length){let o=r(t,"p",{class:"status"});o.append(r(t,"span",{class:"lamp off","aria-hidden":"true"}),t.createTextNode(this.t.notFound)),c.push(o)}let p=n.cited??[];if(i&&p.length){c.push(v(t,"p",this.t.sources,"sources-label"));let o=r(t,"ol",{class:"sources"});for(let l of p){let d=s[l-1];if(!d)continue;let u=r(t,"li"),h=r(t,"a",{href:kt(d)}),b=v(t,"span",String(l),"cite");b.setAttribute("aria-hidden","true");let f=r(t,"span",{class:"where"});if(f.append(t.createTextNode(d.title||d.url)),d.heading&&d.heading!==d.title)f.append(v(t,"span",` › ${d.heading}`));h.append(b,f),u.append(h),o.append(u)}c.push(o)}e.replaceChildren(...c)}async submit(){let e=this.input.value.trim();if(!e||this.controller||!this.session)return;if(await this.session.needsSetup()){await this.showSetup(e);return}let n=this.ownerDocument;this.input.value="",this.autosize(),this.log.append(this.turnNode({role:"user",content:e}));let i=r(n,"div",{class:"msg bot"}),t=r(n,"p",{class:"status"});t.append(r(n,"span",{class:"lamp busy","aria-hidden":"true"}),n.createTextNode(this.t.thinking)),i.append(t),this.log.append(i),this.log.scrollTop=this.log.scrollHeight,this.log.setAttribute("aria-busy","true");let s=new AbortController;this.controller=s,this.setSendMode("stop"),this.emit({state:"searching"});let a=!1;try{let c=await this.session.ask(e,(p,o)=>{if(!a)a=!0,this.emit({state:"streaming",passages:o.passages??[]});let l=this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<40;if(this.fillAnswer(i,o,!1),l)this.log.scrollTop=this.log.scrollHeight},s.signal);this.fillAnswer(i,c,!0),this.emit(c.error?{state:"error"}:{state:"done",passages:c.passages??[],cited:c.cited??[]})}catch(c){if(i.remove(),this.log.lastElementChild?.remove(),this.emit({state:"idle"}),c instanceof L)await this.showSetup(e);else throw c}finally{this.controller=null,this.setSendMode("send"),this.log.setAttribute("aria-busy","false"),this.log.scrollTop=this.log.scrollHeight}}async showSetup(e){if(!this.session)return;let n=this.ownerDocument,i=await this.session.store();await i.load(),i.open(),this.chatView.hidden=!0,this.setupView.hidden=!1;let t=this.t,s=r(n,"button",{class:"link-btn",type:"button"});s.textContent=t.back,s.addEventListener("click",()=>this.hideSetup());let a=v(n,"h3",t.setupTitle);a.style.cssText="margin:0;font-size:17px;font-weight:650";let c=v(n,"p",t.setupIntro,"intro"),p=_(n,t.local),o=C(n,t.provider,r(n,"select")),l=o.control,d=C(n,t.model,r(n,"select")),u=d.control,h=C(n,t.endpoint,r(n,"input",{type:"url",inputmode:"url"}),t.localHint),b=h.control,f=C(n,t.model,r(n,"input",{type:"text",autocomplete:"off"})),m=f.control,x=r(n,"div",{class:"presets"});for(let g of["ollama","lmstudio"]){let y=r(n,"button",{class:"text-btn",type:"button"});y.textContent=g==="ollama"?"Ollama":"LM Studio",y.addEventListener("click",async()=>{let{ENDPOINT_PRESETS:w}=await (G("e5entetm"),import("./index-e5entetm.js"));i.applyPreset(w[g])}),x.append(y)}let M=C(n,t.apiKey,r(n,"input",{type:"password",autocomplete:"off",spellcheck:"false"}),t.apiKeyHint),S=M.control,T=_(n,t.remember),E=r(n,"button",{class:"text-btn",type:"button"});E.textContent=t.test;let H=r(n,"p",{class:"result",role:"status"});H.style.margin="0";let A=r(n,"button",{class:"primary",type:"button"});A.textContent=t.save;let I=r(n,"button",{class:"link-btn",type:"button"});I.textContent=t.forget,p.input.addEventListener("change",()=>i.toggleCustom(p.input.checked)),l.addEventListener("change",()=>i.selectProvider(l.value)),u.addEventListener("change",()=>i.selectModel(u.value)),b.addEventListener("input",()=>i.setEndpoint(b.value)),m.addEventListener("input",()=>i.setCustomModel(m.value)),S.addEventListener("input",()=>i.setApiKey(S.value)),T.input.addEventListener("change",()=>i.setRememberKey(T.input.checked)),E.addEventListener("click",()=>void i.test()),A.addEventListener("click",async()=>{if(!(await i.save()).ok)return;if(this.hideSetup(),e)this.input.value=e,this.submit()}),I.addEventListener("click",()=>void i.clear());let D=r(n,"div",{class:"row"});D.append(E,H),this.setupView.replaceChildren(s,a,c,p.label,o.label,d.label,x,h.label,f.label,M.label,T.label,D,A,I);let J=(g)=>{let y=g.draft.custom;if(p.input.checked=y,o.label.hidden=y,d.label.hidden=y,x.hidden=!y,h.label.hidden=!y,f.label.hidden=!y,g.catalogStatus==="ready")ne(n,l,g,t),ie(n,u,g);else l.replaceChildren(z(n,"",g.catalogStatus==="error"?t.catalogError:t.loadingCatalog)),u.replaceChildren();if(b!==this.root.activeElement)b.value=g.draft.customEndpoint;if(m!==this.root.activeElement)m.value=g.draft.customModel;if(S!==this.root.activeElement)S.value=g.apiKey;T.input.checked=g.draft.rememberKey,E.disabled=!g.canTest||g.testing,E.textContent=g.testing?t.testing:t.test,A.disabled=!g.canSave;let w=g.testResult;H.className=w?w.ok?"result ok":"result fail":"result",H.textContent=!w?"":w.ok?t.testOk:`${t.testFail} ${w.reason}${w.message?` (${w.message})`:""}`};this.unsubscribe?.(),this.unsubscribe=i.subscribe(J),(i.getState().draft.custom?b:l).focus()}hideSetup(){this.unsubscribe?.(),this.unsubscribe=null,this.setupView.hidden=!0,this.chatView.hidden=!1,this.input.focus()}}function ne(e,n,i,t){let s=[[t.recommended,i.providers.recommended],[t.otherProviders,i.providers.others]],a=`${i.draft.providerId}|${i.providers.recommended.length+i.providers.others.length}`;if(n.dataset.sig===a)return;n.dataset.sig=a,n.replaceChildren(...s.filter(([,c])=>c.length).map(([c,p])=>{let o=e.createElement("optgroup");return o.label=c,o.append(...p.map((l)=>z(e,l.id,l.name))),o})),n.value=i.draft.providerId}function ie(e,n,i){let t=`${i.draft.providerId}|${i.draft.model}|${i.models.length}`;if(n.dataset.sig===t)return;n.dataset.sig=t;let s=i.recommendedModel?.id;n.replaceChildren(...i.models.map((a)=>z(e,a.id,a.id===s?`${a.name} ★`:a.name))),n.value=i.draft.model}function N(e,n){try{if(e==="set")sessionStorage.setItem(n,"1");else if(e==="remove")sessionStorage.removeItem(n);else return sessionStorage.getItem(n)!==null}catch{}return!1}function r(e,n,i={}){let t=e.createElement(n);for(let[s,a]of Object.entries(i))t.setAttribute(s,a);return t}function v(e,n,i,t){let s=e.createElement(n);if(s.textContent=i,t)s.className=t;return s}function z(e,n,i){let t=e.createElement("option");return t.value=n,t.textContent=i,t}function B(e,n,i){let t=r(e,"button",{class:"icon-btn",type:"button",title:i});return t.setAttribute("aria-label",i),t.append(R(e,n)),t}function C(e,n,i,t){let s=r(e,"label",{class:"field"});if(s.append(v(e,"span",n),i),t)s.append(v(e,"small",t));return{label:s,control:i}}function _(e,n){let i=r(e,"label",{class:"check"}),t=r(e,"input",{type:"checkbox"});return i.append(t,e.createTextNode(n)),{label:i,input:t}}function se(e="murmur-chat"){if(!customElements.get(e))customElements.define(e,class extends K{});return customElements.get(e)}function q(e={}){se();let{target:n,inline:i,...t}=e,s=document.createElement("murmur-chat");if(i)s.setAttribute("inline","");return s.configure(t),(n??document.body).append(s),s}function re(e,n){let i={};if(e.index)i.index=new URL(e.index,n).href;let t={};if(e.provider)t.provider=e.provider;if(e.model)t.model=e.model;if(e.endpoint)t.endpoint=e.endpoint;if(Object.keys(t).length)i.llm=t;if(e.instructions)i.instructions=e.instructions;if(e.lang)i.lang=e.lang;let s={};if(e.title)s.title=e.title;if(e.greeting)s.greeting=e.greeting;if(e.placeholder)s.placeholder=e.placeholder;if(e.button)s.open=e.button;if(Object.keys(s).length)i.messages=s;if(e.position==="bottom-left"||e.position==="bottom-right")i.position=e.position;if(e.theme==="light"||e.theme==="dark"||e.theme==="auto")i.theme=e.theme;if(e.accent)i.accent=e.accent;if(e.catalog)i.catalogUrl=new URL(e.catalog,n).href;if(e.storageKey)i.storageKey=e.storageKey;if(e.open==="true")i.open=!0;return i}function Y(){let e=import.meta.url,n=[...document.querySelectorAll("script[src]")].find((t)=>t.src===e&&!t.dataset.murmurReady);if(n)n.dataset.murmurReady="true";let i=re(n?.dataset??{},location.href);i.catalogUrl??=new URL("./models.json",e).href,q(i)}if(typeof document<"u"&&!document.querySelector("murmur-chat:not([inline])"))if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",Y,{once:!0});else Y();export{re as optionsFromDataset};
|
|
223
|
+
`;var he={auth:"errorAuth","auth-or-network":"errorNetwork","rate-limit":"errorRate",overloaded:"errorRate","local-webgpu":"localNoWebGPU","local-load":"localLoadFailed"};function V(e,n,s){if(e>=1000)return`${(e/1000).toLocaleString(n,{maximumFractionDigits:1})} ${s.gigabytes}`;return`${Math.round(e).toLocaleString(n)} ${s.megabytes}`}var me=typeof HTMLElement>"u"?class{}:HTMLElement;class j extends me{options={};session=null;t=K("en");uiLang="en";root;launcher;panel;log;chatView;setupView;input;sendBtn;settingsBtn;controller=null;built=!1;unsubscribe=null;constructor(){super();this.root=this.attachShadow({mode:"open"})}configure(e){if(this.options={...this.options,...e},this.isConnected)this.build();return this}get isOpen(){return this.hasAttribute("inline")||this.launcher?.getAttribute("aria-expanded")==="true"}connectedCallback(){this.build()}disconnectedCallback(){this.controller?.abort(),this.unsubscribe?.()}async open(){if(!this.built)this.build();this.launcher.setAttribute("aria-expanded","true"),this.panel.hidden=!1,this.session?.persist(),G("set",this.openKey),this.input.focus()}close(){if(this.hasAttribute("inline"))return;this.launcher.setAttribute("aria-expanded","false"),this.panel.hidden=!0,G("remove",this.openKey),this.launcher.focus()}async ask(e){if(!this.isOpen)await this.open();this.input.value=e,await this.submit()}get openKey(){return`${this.options.storageKey??"murmur"}-open`}build(){let e=this.options,n=Q(e.lang,document.documentElement.lang,navigator.language);this.uiLang=n;let s={...e.messages};if(this.t=K(n,s),e.position)this.setAttribute("position",e.position);if(e.theme&&e.theme!=="auto")this.setAttribute("theme",e.theme);if(e.accent)this.style.setProperty("--murmur-accent",e.accent);this.controller?.abort(),this.unsubscribe?.();let t=this.ownerDocument,o=t.createElement("style");o.textContent=se,this.launcher=a(t,"button",{class:"launcher",type:"button","aria-expanded":"false"}),this.launcher.setAttribute("aria-controls","murmur-panel"),this.launcher.append(a(t,"span",{class:"lamp","aria-hidden":"true"}),v(t,"span",this.t.open)),this.launcher.addEventListener("click",()=>void this.open()),this.panel=a(t,"section",{class:"panel",id:"murmur-panel",role:"dialog"}),this.panel.setAttribute("aria-label",this.t.title),this.panel.hidden=!this.hasAttribute("inline"),this.panel.addEventListener("keydown",(h)=>{if(h.key==="Escape")this.close()});let i=a(t,"header"),l=v(t,"h2",this.t.title),p=q(t,"reset",this.t.newChat);p.addEventListener("click",()=>{this.controller?.abort(),this.session?.clear(),this.renderChat(),this.input.focus()}),this.settingsBtn=q(t,"settings",this.t.settings),this.settingsBtn.hidden=!!e.model||!!e.llm?.endpoint||!!e.local,this.settingsBtn.addEventListener("click",()=>void this.showSetup());let c=q(t,"close",this.t.close);c.hidden=this.hasAttribute("inline"),c.addEventListener("click",()=>this.close()),i.append(l,p,this.settingsBtn,c),this.chatView=a(t,"div",{class:"chat"}),this.chatView.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0",this.log=a(t,"div",{class:"log",role:"log","aria-live":"polite","aria-relevant":"additions"});let d=a(t,"form",{class:"composer"});this.input=a(t,"textarea",{rows:"1",placeholder:this.t.placeholder}),this.input.setAttribute("aria-label",this.t.placeholder),this.input.addEventListener("input",()=>this.autosize()),this.input.addEventListener("keydown",(h)=>{if(h.key==="Enter"&&!h.shiftKey&&!h.isComposing)h.preventDefault(),this.submit()}),this.sendBtn=a(t,"button",{class:"send",type:"submit"}),this.setSendMode("send"),d.addEventListener("submit",(h)=>{if(h.preventDefault(),this.controller)this.controller.abort();else this.submit()}),d.append(this.input,this.sendBtn);let r=a(t,"footer"),u=a(t,"a",{href:"https://maxgfr.github.io/murmur/",target:"_blank",rel:"noopener"});if(u.textContent=this.t.poweredBy,r.append(u),this.chatView.append(this.log,d,r),this.setupView=a(t,"div",{class:"setup"}),this.setupView.hidden=!0,this.panel.append(i,this.chatView,this.setupView),this.root.replaceChildren(o,this.launcher,this.panel),this.hasAttribute("inline"))this.launcher.hidden=!0;if(this.built=!0,this.session=new W({...e,lang:n}),this.renderChat(),e.open||!this.hasAttribute("inline")&&G("get",this.openKey))this.open()}autosize(){this.input.style.height="auto",this.input.style.height=`${Math.min(this.input.scrollHeight,140)}px`}setSendMode(e){this.sendBtn.replaceChildren(B(this.ownerDocument,e)),this.sendBtn.setAttribute("aria-label",e==="send"?this.t.send:this.t.stop)}emit(e){this.dispatchEvent(new CustomEvent("murmur:state",{detail:e,bubbles:!0,composed:!0}))}renderChat(){let e=this.ownerDocument,n=this.session?.turns??[],s=[],t=a(e,"div",{class:"msg bot greeting"});t.append(v(e,"p",this.t.greeting)),s.push(t);for(let o of n)s.push(this.turnNode(o));this.log.replaceChildren(...s),this.log.scrollTop=this.log.scrollHeight}turnNode(e){let n=this.ownerDocument;if(e.role==="user"){let t=a(n,"div",{class:"msg user"});return t.textContent=e.content,t}let s=a(n,"div",{class:"msg bot"});return this.fillAnswer(s,e,!0),s}fillAnswer(e,n,s){let t=this.ownerDocument;if(n.error){let[c="unknown",...d]=n.error.split("|"),r=he[c],u=a(t,"div",{class:"error",role:"alert"});u.append(v(t,"p",r?this.t[r]:`${this.t.errorOther} ${d.join("|")}`));let h=a(t,"div",{class:"row"}),x=a(t,"button",{class:"text-btn",type:"button"});if(x.textContent=this.t.retry,x.addEventListener("click",()=>{let b=this.session?.turns??[],k=b.at(-2)?.content??"";if(b.splice(-2,2),this.renderChat(),k)this.ask(k)}),h.append(x),c==="auth"||c==="auth-or-network"){if(!this.settingsBtn.hidden){let b=a(t,"button",{class:"text-btn",type:"button"});b.textContent=this.t.settings,b.addEventListener("click",()=>void this.showSetup()),h.append(b)}}u.append(h),e.replaceChildren(u);return}let o=n.passages??[],i=a(t,"div");U(i,Xe(n.content),(c)=>{let d=o[c-1];if(!d)return null;let r=a(t,"a",{class:"cite",href:At(d)});return r.textContent=String(c),r.setAttribute("aria-label",`${this.t.sources} ${c}: ${d.title}`),r});let l=[i];if(s&&!n.content.trim()&&!o.length){let c=a(t,"p",{class:"status"});c.append(a(t,"span",{class:"lamp off","aria-hidden":"true"}),t.createTextNode(this.t.notFound)),l.push(c)}let p=n.cited??[];if(s&&p.length){l.push(v(t,"p",this.t.sources,"sources-label"));let c=a(t,"ol",{class:"sources"});for(let d of p){let r=o[d-1];if(!r)continue;let u=a(t,"li"),h=a(t,"a",{href:At(r)}),x=v(t,"span",String(d),"cite");x.setAttribute("aria-hidden","true");let b=a(t,"span",{class:"where"});if(b.append(t.createTextNode(r.title||r.url)),r.heading&&r.heading!==r.title)b.append(v(t,"span",` › ${r.heading}`));h.append(x,b),u.append(h),c.append(u)}l.push(c)}e.replaceChildren(...l)}async submit(){let e=this.input.value.trim();if(!e||this.controller||!this.session)return;if(this.session.needsDownloadConsent){await this.showConsent(e);return}if(await this.session.needsSetup()){await this.showSetup(e);return}let n=this.ownerDocument;this.input.value="",this.autosize(),this.log.append(this.turnNode({role:"user",content:e}));let s=a(n,"div",{class:"msg bot"}),t=a(n,"p",{class:"status"});t.append(a(n,"span",{class:"lamp busy","aria-hidden":"true"}),n.createTextNode(this.t.thinking)),s.append(t),this.log.append(s),this.log.scrollTop=this.log.scrollHeight,this.log.setAttribute("aria-busy","true"),this.session.onProgress=(l)=>{if(!t.isConnected)return;let p=a(n,"progress",{max:"1",value:String(l.progress)});p.setAttribute("aria-label",this.t.localLoadingLabel);let c=l.progress>=1?this.t.localPreparing:`${this.t.localLoading} ${Math.round(l.progress*100)} % · ${Math.round(l.loaded/1e6).toLocaleString(this.uiLang)} / ${V(l.total/1e6,this.uiLang,this.t)}`;t.replaceChildren(a(n,"span",{class:"lamp busy","aria-hidden":"true"}),a(n,"span",{class:"grow"})),t.lastElementChild?.append(n.createTextNode(c),p)};let o=new AbortController;this.controller=o,this.setSendMode("stop"),this.emit({state:"searching"});let i=!1;try{let l=await this.session.ask(e,(p,c)=>{if(!i)i=!0,this.emit({state:"streaming",passages:c.passages??[]});let d=this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<40;if(this.fillAnswer(s,c,!1),d)this.log.scrollTop=this.log.scrollHeight},o.signal);this.fillAnswer(s,l,!0),this.emit(l.error?{state:"error"}:{state:"done",passages:l.passages??[],cited:l.cited??[]})}catch(l){if(s.remove(),this.log.lastElementChild?.remove(),this.emit({state:"idle"}),l instanceof P)await this.showSetup(e);else throw l}finally{this.controller=null,this.setSendMode("send"),this.log.setAttribute("aria-busy","false"),this.log.scrollTop=this.log.scrollHeight}}async showConsent(e){if(!this.session)return;let n=this.ownerDocument,s=this.t,t=this.session,o=await t.localSpec(),i=a(n,"div",{class:"msg bot consent"}),l=a(n,"div",{class:"row"}),p=!!this.options.local,c=()=>{i.remove(),t.useLocal(!1),this.showSetup(e)};if(!await t.canRunLocally()){if(i.append(v(n,"p",s.localNoWebGPU)),!p){let d=a(n,"button",{class:"text-btn",type:"button"});d.textContent=s.useKey,d.addEventListener("click",c),l.append(d)}}else{i.append(v(n,"p",s.localConsent.replace("{name}",o.name).replace("{size}",V(o.sizeMB,this.uiLang,s))));let d=a(n,"button",{class:"primary",type:"button"});if(d.textContent=s.localDownload,d.addEventListener("click",()=>{t.agreeToDownload(),i.remove(),this.input.value=e,this.submit()}),l.append(d),!p){let r=a(n,"button",{class:"link-btn",type:"button"});r.textContent=s.useKey,r.addEventListener("click",c),l.append(r)}}i.append(l),this.log.append(i),this.log.scrollTop=this.log.scrollHeight,l.querySelector("button")?.focus()}async showSetup(e){if(!this.session)return;let n=this.ownerDocument,s=await this.session.store();await s.load(),s.open(),this.chatView.hidden=!0,this.setupView.hidden=!1;let t=this.t,o=a(n,"button",{class:"link-btn",type:"button"});o.textContent=t.back,o.addEventListener("click",()=>this.hideSetup());let i=v(n,"h3",t.setupTitle);i.style.cssText="margin:0;font-size:17px;font-weight:650";let l=v(n,"p",t.setupIntro,"intro"),p=this.session,c=await p.localSpec(),d=a(n,"div",{class:"local-choice"}),r=a(n,"button",{class:"primary",type:"button"});r.textContent=t.localOption;let u=v(n,"small",t.localOptionHint.replace("{name}",c.name).replace("{size}",V(c.sizeMB,this.uiLang,t)));if(d.append(r,u),r.addEventListener("click",()=>{if(p.useLocal(!0),this.hideSetup(),e)this.input.value=e,this.submit()}),p.canRunLocally().then((g)=>{if(r.disabled=!g,!g)u.textContent=t.localNoWebGPU}),p.mode==="local"){r.textContent=t.localActive,r.disabled=!0;let g=a(n,"button",{class:"link-btn",type:"button"});g.textContent=t.useKey,g.addEventListener("click",()=>{p.useLocal(!1),r.textContent=t.localOption,r.disabled=!1,g.remove()}),d.append(g)}let h=v(n,"p",t.orKey,"or"),x=oe(n,t.local),b=I(n,t.provider,a(n,"select")),k=b.control,m=I(n,t.model,a(n,"select")),f=m.control,y=I(n,t.endpoint,a(n,"input",{type:"url",inputmode:"url"}),t.localHint),L=y.control,C=I(n,t.model,a(n,"input",{type:"text",autocomplete:"off"})),w=C.control,T=a(n,"div",{class:"presets"});for(let g of["ollama","lmstudio"]){let E=a(n,"button",{class:"text-btn",type:"button"});E.textContent=g==="ollama"?"Ollama":"LM Studio",E.addEventListener("click",async()=>{let{ENDPOINT_PRESETS:M}=await (F("nesgnf2n"),import("./index-nesgnf2n.js"));s.applyPreset(M[g])}),T.append(E)}let A=I(n,t.apiKey,a(n,"input",{type:"password",autocomplete:"off",spellcheck:"false"}),t.apiKeyHint),O=A.control,R=oe(n,t.remember),H=a(n,"button",{class:"text-btn",type:"button"});H.textContent=t.test;let N=a(n,"p",{class:"result",role:"status"});N.style.margin="0";let z=a(n,"button",{class:"primary",type:"button"});z.textContent=t.save;let D=a(n,"button",{class:"link-btn",type:"button"});D.textContent=t.forget,x.input.addEventListener("change",()=>s.toggleCustom(x.input.checked)),k.addEventListener("change",()=>s.selectProvider(k.value)),f.addEventListener("change",()=>s.selectModel(f.value)),L.addEventListener("input",()=>s.setEndpoint(L.value)),w.addEventListener("input",()=>s.setCustomModel(w.value)),O.addEventListener("input",()=>s.setApiKey(O.value)),R.input.addEventListener("change",()=>s.setRememberKey(R.input.checked)),H.addEventListener("click",()=>void s.test()),z.addEventListener("click",async()=>{if(!(await s.save()).ok)return;if(p.useLocal(!1),this.hideSetup(),e)this.input.value=e,this.submit()}),D.addEventListener("click",()=>void s.clear());let Y=a(n,"div",{class:"row"});Y.append(H,N),this.setupView.replaceChildren(o,i,l,d,h,x.label,b.label,m.label,T,y.label,C.label,A.label,R.label,Y,z,D);let ae=(g)=>{let E=g.draft.custom;if(x.input.checked=E,b.label.hidden=E,m.label.hidden=E,T.hidden=!E,y.label.hidden=!E,C.label.hidden=!E,g.catalogStatus==="ready")ge(n,k,g,t),fe(n,f,g);else k.replaceChildren(_(n,"",g.catalogStatus==="error"?t.catalogError:t.loadingCatalog)),f.replaceChildren();if(L!==this.root.activeElement)L.value=g.draft.customEndpoint;if(w!==this.root.activeElement)w.value=g.draft.customModel;if(O!==this.root.activeElement)O.value=g.apiKey;R.input.checked=g.draft.rememberKey,H.disabled=!g.canTest||g.testing,H.textContent=g.testing?t.testing:t.test,z.disabled=!g.canSave;let M=g.testResult;N.className=M?M.ok?"result ok":"result fail":"result",N.textContent=!M?"":M.ok?t.testOk:`${t.testFail} ${M.reason}${M.message?` (${M.message})`:""}`};this.unsubscribe?.(),this.unsubscribe=s.subscribe(ae),this.setupView.scrollTop=0,o.focus()}hideSetup(){this.unsubscribe?.(),this.unsubscribe=null,this.setupView.hidden=!0,this.chatView.hidden=!1,this.input.focus()}}function ge(e,n,s,t){let o=[[t.recommended,s.providers.recommended],[t.otherProviders,s.providers.others]],i=`${s.draft.providerId}|${s.providers.recommended.length+s.providers.others.length}`;if(n.dataset.sig===i)return;n.dataset.sig=i,n.replaceChildren(...o.filter(([,l])=>l.length).map(([l,p])=>{let c=e.createElement("optgroup");return c.label=l,c.append(...p.map((d)=>_(e,d.id,d.name))),c})),n.value=s.draft.providerId}function fe(e,n,s){let t=`${s.draft.providerId}|${s.draft.model}|${s.models.length}`;if(n.dataset.sig===t)return;n.dataset.sig=t;let o=s.recommendedModel?.id;n.replaceChildren(...s.models.map((i)=>_(e,i.id,i.id===o?`${i.name} ★`:i.name))),n.value=s.draft.model}function G(e,n){try{if(e==="set")sessionStorage.setItem(n,"1");else if(e==="remove")sessionStorage.removeItem(n);else return sessionStorage.getItem(n)!==null}catch{}return!1}function a(e,n,s={}){let t=e.createElement(n);for(let[o,i]of Object.entries(s))t.setAttribute(o,i);return t}function v(e,n,s,t){let o=e.createElement(n);if(o.textContent=s,t)o.className=t;return o}function _(e,n,s){let t=e.createElement("option");return t.value=n,t.textContent=s,t}function q(e,n,s){let t=a(e,"button",{class:"icon-btn",type:"button",title:s});return t.setAttribute("aria-label",s),t.append(B(e,n)),t}function I(e,n,s,t){let o=a(e,"label",{class:"field"});if(o.append(v(e,"span",n),s),t)o.append(v(e,"small",t));return{label:o,control:s}}function oe(e,n){let s=a(e,"label",{class:"check"}),t=a(e,"input",{type:"checkbox"});return s.append(t,e.createTextNode(n)),{label:s,input:t}}function be(e="murmur-chat"){if(!customElements.get(e))customElements.define(e,class extends j{});return customElements.get(e)}function ie(e={}){be();let{target:n,inline:s,...t}=e,o=document.createElement("murmur-chat");if(s)o.setAttribute("inline","");return o.configure(t),(n??document.body).append(o),o}function ve(e,n){let s={};if(e.index)s.index=new URL(e.index,n).href;let t={};if(e.provider)t.provider=e.provider;if(e.model)t.model=e.model;if(e.endpoint)t.endpoint=e.endpoint;if(Object.keys(t).length)s.llm=t;if(e.instructions)s.instructions=e.instructions;if(e.lang)s.lang=e.lang;let o={};if(e.title)o.title=e.title;if(e.greeting)o.greeting=e.greeting;if(e.placeholder)o.placeholder=e.placeholder;if(e.button)o.open=e.button;if(Object.keys(o).length)s.messages=o;if(e.position==="bottom-left"||e.position==="bottom-right")s.position=e.position;if(e.theme==="light"||e.theme==="dark"||e.theme==="auto")s.theme=e.theme;if(e.accent)s.accent=e.accent;if(e.catalog)s.catalogUrl=new URL(e.catalog,n).href;if(e.storageKey)s.storageKey=e.storageKey;if(e.open==="true")s.open=!0;if(e.local==="true")s.local=!0;return s}function re(){let e=import.meta.url,n=[...document.querySelectorAll("script[src]")].find((t)=>t.src===e&&!t.dataset.murmurReady);if(n)n.dataset.murmurReady="true";let s=ve(n?.dataset??{},location.href);s.catalogUrl??=new URL("./models.json",e).href,ie(s)}if(typeof document<"u"&&!document.querySelector("murmur-chat:not([inline])"))if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",re,{once:!0});else re();export{ve as optionsFromDataset};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{oe}from"./embed-6gef7ym5.js";import{ye,P,me,u,e,r,c,ie,o,t,U,l,y,i,n,k,T,d,N,M,ot,ee,te,q,z,Me,C,R,W,a,s,h,g,ne,O,H,I,D,p,dt,an,E,Ce,Y}from"./embed-jdraznwg.js";function ce(m){return m.replace(/[_-]([a-z])/g,(f)=>f[1].toUpperCase())}function Ne(m,f){let b=ce(m);if(b!==m&&f?.[b]!=null)return b;return m}function be({rawName:m,providerOptions:f,warnings:b}){let _=ce(m);if(_!==m&&f?.[m]!=null)b.push({type:"deprecated",setting:`providerOptions key '${m}'`,message:`Use '${_}' instead.`})}var ge={errorSchema:t({error:t({message:e(),type:e().nullish(),param:ie().nullish(),code:l([e(),r()]).nullish()})}),errorToMessage:(m)=>m.error.message};function $e(m){if(m==null)return te();let f=m.prompt_tokens??0,b=m.completion_tokens??0,_=m.prompt_tokens_details?.cached_tokens??0,w=m.completion_tokens_details?.reasoning_tokens??0;return{inputTokens:{total:f,noCache:f-_,cacheRead:_,cacheWrite:void 0},outputTokens:{total:b,text:Math.max(0,b-w),reasoning:w},raw:m}}function he(m){return m?.providerOptions?.openaiCompatible??{}}function Le(m){switch(m){case"audio/wav":return"wav";case"audio/mp3":case"audio/mpeg":return"mp3";default:return null}}function Ae(m,f){let b=he(m);switch(m.type){case"text":return{type:"text",text:m.text,...b};case"file":switch(m.data.type){case"reference":return{type:"file",file:{file_id:H({reference:m.data.reference,provider:f})},...b};case"text":throw new u({functionality:"text file parts"});case"url":case"data":{let _=z(m.mediaType);if(_==="image")return{type:"image_url",image_url:{url:m.data.type==="url"?m.data.url.toString():`data:${O({part:m})};base64,${M(m.data.data)}`},...b};if(_==="video")return{type:"video_url",video_url:{url:m.data.type==="url"?m.data.url.toString():`data:${O({part:m})};base64,${M(m.data.data)}`},...b};if(_==="audio"){if(m.data.type==="url")throw new u({functionality:"audio file parts with URLs"});let w=O({part:m}),j=Le(w);if(j===null)throw new u({functionality:`audio media type ${w}`});return{type:"input_audio",input_audio:{data:M(m.data.data),format:j},...b}}if(_==="application"){if(m.data.type==="url")throw new u({functionality:"PDF file parts with URLs"});let w=O({part:m});if(w!=="application/pdf")throw new u({functionality:`file part media type ${w}`});return{type:"file",file:{filename:m.filename??"document.pdf",file_data:`data:application/pdf;base64,${M(m.data.data)}`},...b}}if(_==="text")return{type:"text",text:m.data.type==="url"?m.data.url.toString():typeof m.data.data==="string"?new TextDecoder().decode(N(m.data.data)):new TextDecoder().decode(m.data.data),...b};throw new u({functionality:`file part media type ${m.mediaType}`})}}}}function Be(m,f){if(m.type==="custom")throw new u({functionality:"custom tool content parts"});return Ae(m,f)}function Ke(m,{provider:f="openaiCompatible",providerOptionsKey:b="google",supportsMultiPartToolContent:_=!1}={}){let w=[];for(let{role:j,content:L,...B}of m){let V=he({...B});switch(j){case"system":w.push({role:"system",content:L,...V});break;case"user":if(L.length===1&&L[0].type==="text"){w.push({role:"user",content:L[0].text,...he(L[0])});break}w.push({role:"user",content:L.map((A)=>Ae(A,f)),...V});break;case"assistant":{let A="",x="",v=[];for(let S of L){let Z=he(S);switch(S.type){case"text":A+=S.text;break;case"reasoning":x+=S.text;break;case"tool-call":{let F=S.providerOptions?.[b]?.thoughtSignature??S.providerOptions?.google?.thoughtSignature;v.push({id:S.toolCallId,type:"function",function:{name:S.toolName,arguments:JSON.stringify(S.input)},...Z,...F?{extra_content:{google:{thought_signature:String(F)}}}:{}});break}}}w.push({role:"assistant",content:v.length>0?A||null:A,...x.length>0?{reasoning_content:x}:{},tool_calls:v.length>0?v:void 0,...V});break}case"tool":for(let A of L){if(A.type==="tool-approval-response")continue;let x=A.output,v;switch(x.type){case"text":case"error-text":v=x.value;break;case"execution-denied":v=x.reason??"Tool call execution denied.";break;case"json":case"error-json":v=JSON.stringify(x.value);break;case"content":v=_?x.value.map((Z)=>Be(Z,f)):JSON.stringify(x.value)}let S=he(A);w.push({role:"tool",tool_call_id:A.toolCallId,content:v,...S})}break;default:throw Error(`Unsupported role: ${j}`)}}return w}function we({id:m,model:f,created:b}){return ee({id:m,model:f,created:b||void 0})}function xe(m){switch(m){case"stop":return"stop";case"length":return"length";case"content_filter":return"content-filter";case"function_call":case"tool_calls":return"tool-calls";default:return"other"}}var pe=t({user:e().optional(),reasoningEffort:e().optional(),textVerbosity:e().optional(),strictJsonSchema:c().optional()});function Ve({tools:m,toolChoice:f}){m=m?.length?m:void 0;let b=[];if(m==null)return{tools:void 0,toolChoice:void 0,toolWarnings:b};let _=[];for(let j of m)if(j.type==="provider")b.push({type:"unsupported",feature:`provider-defined tool ${j.id}`});else _.push({type:"function",function:{name:j.name,description:j.description,parameters:j.inputSchema,...j.strict!=null?{strict:j.strict}:{}}});if(f==null)return{tools:_,toolChoice:void 0,toolWarnings:b};let w=f.type;switch(w){case"auto":case"none":case"required":return{tools:_,toolChoice:w,toolWarnings:b};case"tool":return{tools:_,toolChoice:{type:"function",function:{name:f.toolName}},toolWarnings:b};default:throw new u({functionality:`tool choice type: ${w}`})}}var Je=class m{static[k](f){return E({modelId:f.modelId,config:f.config})}static[T](f){return new m(f.modelId,f.config)}constructor(f,b){this.specificationVersion="v4",this.modelId=f,this.config=b;let _=b.errorStructure??ge;this.chunkSchema=We(_.errorSchema),this.failedResponseHandler=I(_),this.supportsStructuredOutputs=b.supportsStructuredOutputs??!1}get provider(){return this.config.provider}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}get supportedUrls(){return this.config.supportedUrls?.()??{}}transformRequestBody(f,b){return this.config.transformRequestBody?.(f,b)??f}convertUsage(f){return this.config.convertUsage?.(f)??$e(f)}async getArgs({prompt:f,maxOutputTokens:b,temperature:_,topP:w,topK:j,frequencyPenalty:L,presencePenalty:B,reasoning:V,providerOptions:A,stopSequences:x,responseFormat:v,seed:S,toolChoice:Z,tools:F}){let G=[],se=await h({provider:"openai-compatible",providerOptions:A,schema:pe});if(se!=null)G.push({type:"deprecated",setting:"providerOptions key 'openai-compatible'",message:"Use 'openaiCompatible' instead."});be({rawName:this.providerOptionsName,providerOptions:A,warnings:G});let X=Object.assign(se??{},await h({provider:"openaiCompatible",providerOptions:A,schema:pe})??{},await h({provider:this.providerOptionsName,providerOptions:A,schema:pe})??{},await h({provider:ce(this.providerOptionsName),providerOptions:A,schema:pe})??{}),ae=X?.strictJsonSchema??!0;if(j!=null)G.push({type:"unsupported",feature:"topK"});if(v?.type==="json"&&v.schema!=null&&!this.supportsStructuredOutputs)G.push({type:"unsupported",feature:"responseFormat",details:"JSON response format schema is only supported with structuredOutputs"});let{tools:de,toolChoice:K,toolWarnings:J}=Ve({tools:F,toolChoice:Z}),Q=Ne(this.providerOptionsName,A);return{metadataKey:Q,args:{model:this.modelId,user:X.user,max_tokens:b,temperature:_,top_p:w,frequency_penalty:L,presence_penalty:B,response_format:v?.type==="json"?this.supportsStructuredOutputs===!0&&v.schema!=null?{type:"json_schema",json_schema:{schema:v.schema,strict:ae,name:v.name??"response",description:v.description}}:{type:"json_object"}:void 0,stop:x,seed:S,...Object.fromEntries(Object.entries({...A?.[this.providerOptionsName],...A?.[ce(this.providerOptionsName)]}).filter(([re])=>!Object.keys(pe.shape).includes(re))),reasoning_effort:X.reasoningEffort??(W(V)?V:void 0),verbosity:X.textVerbosity,messages:Ke(f,{provider:this.providerOptionsName,providerOptionsKey:Q,supportsMultiPartToolContent:this.config.supportsMultiPartToolContent}),tools:de,tool_choice:K},warnings:[...G,...J]}}async doGenerate(f){let{args:b,warnings:_,metadataKey:w}=await this.getArgs({...f}),j=this.transformRequestBody(b,_),L=JSON.stringify(j),{responseHeaders:B,value:V,rawValue:A}=await g({url:this.config.url({path:"/chat/completions",modelId:this.modelId}),headers:d(this.config.headers?.(),f.headers),body:j,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:p(De),abortSignal:f.abortSignal,fetch:this.config.fetch}),x=V.choices[0];if(x==null)throw new P({data:A,message:"Response did not contain any choices."});let v=[],S=x.message.reasoning_content??x.message.reasoning;if(S!=null&&S.length>0)v.push({type:"reasoning",text:S});if(v.push(...Ie(x.message.content)),x.message.tool_calls!=null)for(let G of x.message.tool_calls){let se=G.extra_content?.google?.thought_signature;v.push({type:"tool-call",toolCallId:G.id||C(),toolName:G.function.name,input:G.function.arguments,...se?{providerMetadata:{[w]:{thoughtSignature:se}}}:{}})}let Z={[w]:{},...await this.config.metadataExtractor?.extractMetadata?.({parsedBody:A})},F=V.usage?.completion_tokens_details;if(F?.accepted_prediction_tokens!=null)Z[w].acceptedPredictionTokens=F?.accepted_prediction_tokens;if(F?.rejected_prediction_tokens!=null)Z[w].rejectedPredictionTokens=F?.rejected_prediction_tokens;return{content:v,finishReason:{unified:xe(x.finish_reason),raw:x.finish_reason??void 0},usage:this.convertUsage(V.usage),providerMetadata:Z,request:{body:L},response:{...we(V),headers:B,body:A},warnings:_}}async doStream(f){let{args:b,warnings:_,metadataKey:w}=await this.getArgs({...f}),j=this.transformRequestBody({...b,stream:!0,stream_options:this.config.includeUsage?{include_usage:!0}:void 0},_),L=this.config.metadataExtractor?.createStreamExtractor(),{responseHeaders:B,value:V}=await g({url:this.config.url({path:"/chat/completions",modelId:this.modelId}),headers:d(this.config.headers?.(),f.headers),body:j,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:D(this.chunkSchema),abortSignal:f.abortSignal,fetch:this.config.fetch}),A=w,x,v=new Map,S=new Set,Z=(K)=>{let J=K.index;if(J==null||S.has(J)){x.processDelta(K);return}let Q=v.get(J);if(Q==null)Q={id:K.id??null,bufferedArguments:"",extraContent:K.extra_content??null},v.set(J,Q);else{if(Q.id==null&&K.id!=null)Q.id=K.id;if(Q.extraContent==null&&K.extra_content!=null)Q.extraContent=K.extra_content}let re=K.function?.arguments;if(re!=null)Q.bufferedArguments+=re;let ue=K.function?.name;if(ue!=null){let fe={index:J,id:Q.id,function:{name:ue,arguments:Q.bufferedArguments},extra_content:Q.extraContent??void 0};x.processDelta(fe),v.delete(J),S.add(J)}},F,G=void 0,se=!1,X=!1,ae=!1,de=(K)=>this.convertUsage(K);return{stream:V.pipeThrough(new TransformStream({start(K){x=new Ce(K,{generateId:C,extractMetadata:(J)=>{let Q=J.extra_content?.google?.thought_signature;return Q?{[A]:{thoughtSignature:Q}}:void 0},buildToolCallProviderMetadata:(J)=>J}),K.enqueue({type:"stream-start",warnings:_})},transform(K,J){if(f.includeRawChunks)J.enqueue({type:"raw",rawValue:K.rawValue});if(!K.success){F={unified:"error",raw:void 0},J.enqueue({type:"error",error:K.error});return}if(L?.processChunk(K.rawValue),"error"in K.value){F={unified:"error",raw:void 0},J.enqueue({type:"error",error:K.value.error});return}let Q=K.value;if(!se){let le=we(Q);if(Object.values(le).some(Boolean))se=!0,J.enqueue({type:"response-metadata",...le})}if(Q.usage!=null)G=Q.usage;let re=Q.choices[0];if(re?.finish_reason!=null)F={unified:xe(re.finish_reason),raw:re.finish_reason??void 0};if(re?.delta==null)return;let ue=re.delta,fe=(le)=>{if(ae)J.enqueue({type:"text-end",id:"txt-0"}),ae=!1;if(!X)J.enqueue({type:"reasoning-start",id:"reasoning-0"}),X=!0;J.enqueue({type:"reasoning-delta",id:"reasoning-0",delta:le})},Pe=(le)=>{if(X)J.enqueue({type:"reasoning-end",id:"reasoning-0"}),X=!1;if(!ae)J.enqueue({type:"text-start",id:"txt-0"}),ae=!0;J.enqueue({type:"text-delta",id:"txt-0",delta:le})},ve=ue.reasoning_content??ue.reasoning;if(ve)fe(ve);for(let le of Ie(ue.content))if(le.type==="reasoning")fe(le.text);else Pe(le.text);if(ue.tool_calls!=null&&ue.tool_calls.length>0){if(X)J.enqueue({type:"reasoning-end",id:"reasoning-0"}),X=!1;for(let le of ue.tool_calls)Z(le)}},flush(K){if(X)K.enqueue({type:"reasoning-end",id:"reasoning-0"});if(ae)K.enqueue({type:"text-end",id:"txt-0"});for(let[Q,re]of v)x.processDelta({index:Q,id:re.id,function:{arguments:re.bufferedArguments}});if(v.clear(),x.flush(),F==null)F={unified:"error",raw:void 0},K.enqueue({type:"error",error:new P({data:void 0,message:"Response stream ended without a finish reason."})});let J={[A]:{},...L?.buildMetadata()};if(G?.completion_tokens_details?.accepted_prediction_tokens!=null)J[A].acceptedPredictionTokens=G?.completion_tokens_details?.accepted_prediction_tokens;if(G?.completion_tokens_details?.rejected_prediction_tokens!=null)J[A].rejectedPredictionTokens=G?.completion_tokens_details?.rejected_prediction_tokens;K.enqueue({type:"finish",finishReason:F,usage:de(G),providerMetadata:J})}})),request:{body:j},response:{headers:B}}}},Ue=()=>U({prompt_tokens:r().nullish(),completion_tokens:r().nullish(),total_tokens:r().nullish(),prompt_tokens_details:U({cached_tokens:r().nullish()}).nullish(),completion_tokens_details:U({reasoning_tokens:r().nullish(),accepted_prediction_tokens:r().nullish(),rejected_prediction_tokens:r().nullish()}).nullish()}).nullish(),qe=()=>l([e(),o(U({type:e()}))]).nullish();function Ie(m){if(m==null)return[];if(typeof m==="string")return m.length>0?[{type:"text",text:m}]:[];let f=[];for(let b of m)if(b.type==="text"&&typeof b.text==="string"){if(b.text.length>0)f.push({type:"text",text:b.text})}else if(b.type==="thinking"&&Array.isArray(b.thinking)){let _=b.thinking.filter((w)=>w!=null&&typeof w==="object"&&("type"in w)&&w.type==="text"&&("text"in w)&&typeof w.text==="string").map((w)=>w.text).join("");if(_.length>0)f.push({type:"reasoning",text:_})}return f}var De=a(()=>s(U({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({message:t({role:n("assistant").nullish(),content:qe(),reasoning_content:e().nullish(),reasoning:e().nullish(),tool_calls:o(t({id:e().nullish(),function:t({name:e(),arguments:e()}),extra_content:t({google:t({thought_signature:e().nullish()}).nullish()}).nullish()})).nullish()}),finish_reason:e().nullish()})),usage:Ue()}))),Fe=()=>U({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({delta:t({role:i(["assistant",""]).nullish(),content:qe(),reasoning_content:e().nullish(),reasoning:e().nullish(),tool_calls:o(t({index:r().nullish(),id:e().nullish(),function:t({name:e().nullish(),arguments:e().nullish()}),extra_content:t({google:t({thought_signature:e().nullish()}).nullish()}).nullish()})).nullish()}).nullish(),finish_reason:e().nullish()})),usage:Ue()}),We=(m)=>l([Fe(),m]);function Oe(m){if(m==null)return te();let f=m.prompt_tokens??0,b=m.completion_tokens??0;return{inputTokens:{total:f,noCache:f,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:b,text:b,reasoning:void 0},raw:m}}function ze({prompt:m,user:f="user",assistant:b="assistant"}){let _="";if(m[0].role==="system")_+=`${m[0].content}
|
|
2
|
+
|
|
3
|
+
`,m=m.slice(1);for(let{role:w,content:j}of m)switch(w){case"system":throw new ye({message:`Unexpected system message in prompt: ${j}`,prompt:m});case"user":{let L=j.map((B)=>{switch(B.type){case"text":return B.text}}).filter(Boolean).join("");_+=`${f}:
|
|
4
|
+
${L}
|
|
5
|
+
|
|
6
|
+
`;break}case"assistant":{let L=j.map((B)=>{switch(B.type){case"text":return B.text;case"tool-call":throw new u({functionality:"tool-call messages"})}}).join("");_+=`${b}:
|
|
7
|
+
${L}
|
|
8
|
+
|
|
9
|
+
`;break}case"tool":throw new u({functionality:"tool messages"});default:throw Error(`Unsupported role: ${w}`)}return _+=`${b}:
|
|
10
|
+
`,{prompt:_,stopSequences:[`
|
|
11
|
+
${f}:`]}}function ke(m){switch(m){case"stop":return"stop";case"length":return"length";case"content_filter":return"content-filter";case"function_call":case"tool_calls":return"tool-calls";default:return"other"}}var Se=a(()=>s(t({echo:c().optional(),logitBias:y(e(),r()).optional(),suffix:e().optional(),user:e().optional()}))),Ge=class m{static[k](f){return E({modelId:f.modelId,config:f.config})}static[T](f){return new m(f.modelId,f.config)}constructor(f,b){this.specificationVersion="v4",this.modelId=f,this.config=b;let _=b.errorStructure??ge;this.chunkSchema=Qe(_.errorSchema),this.failedResponseHandler=I(_)}get provider(){return this.config.provider}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}get supportedUrls(){return this.config.supportedUrls?.()??{}}async getArgs({prompt:f,maxOutputTokens:b,temperature:_,topP:w,topK:j,frequencyPenalty:L,presencePenalty:B,stopSequences:V,responseFormat:A,seed:x,providerOptions:v,tools:S,toolChoice:Z}){let F=[];be({rawName:this.providerOptionsName,providerOptions:v,warnings:F});let G=Object.assign(await h({provider:this.providerOptionsName,providerOptions:v,schema:Se})??{},await h({provider:ce(this.providerOptionsName),providerOptions:v,schema:Se})??{});if(j!=null)F.push({type:"unsupported",feature:"topK"});if(S?.length)F.push({type:"unsupported",feature:"tools"});if(Z!=null)F.push({type:"unsupported",feature:"toolChoice"});if(A!=null&&A.type!=="text")F.push({type:"unsupported",feature:"responseFormat",details:"JSON response format is not supported."});let{prompt:se,stopSequences:X}=ze({prompt:f}),ae=[...X??[],...V??[]];return{args:{model:this.modelId,echo:G.echo,logit_bias:G.logitBias,suffix:G.suffix,user:G.user,max_tokens:b,temperature:_,top_p:w,frequency_penalty:L,presence_penalty:B,seed:x,...v?.[this.providerOptionsName],...v?.[ce(this.providerOptionsName)],prompt:se,stop:ae.length>0?ae:void 0},warnings:F}}async doGenerate(f){let{args:b,warnings:_}=await this.getArgs(f),{responseHeaders:w,value:j,rawValue:L}=await g({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:d(this.config.headers?.(),f.headers),body:b,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:p(Ze),abortSignal:f.abortSignal,fetch:this.config.fetch}),B=j.choices[0],V=[];if(B.text!=null&&B.text.length>0)V.push({type:"text",text:B.text});return{content:V,usage:Oe(j.usage),finishReason:{unified:ke(B.finish_reason),raw:B.finish_reason},request:{body:b},response:{...ee(j),headers:w,body:L},warnings:_}}async doStream(f){let{args:b,warnings:_}=await this.getArgs(f),w={...b,stream:!0,stream_options:this.config.includeUsage?{include_usage:!0}:void 0},{responseHeaders:j,value:L}=await g({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:d(this.config.headers?.(),f.headers),body:w,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:D(this.chunkSchema),abortSignal:f.abortSignal,fetch:this.config.fetch}),B={unified:"other",raw:void 0},V=void 0,A=!0;return{stream:L.pipeThrough(new TransformStream({start(x){x.enqueue({type:"stream-start",warnings:_})},transform(x,v){if(f.includeRawChunks)v.enqueue({type:"raw",rawValue:x.rawValue});if(!x.success){B={unified:"error",raw:void 0},v.enqueue({type:"error",error:x.error});return}let S=x.value;if("error"in S){B={unified:"error",raw:void 0},v.enqueue({type:"error",error:S.error});return}if(A)A=!1,v.enqueue({type:"response-metadata",...ee(S)}),v.enqueue({type:"text-start",id:"0"});if(S.usage!=null)V=S.usage;let Z=S.choices[0];if(Z?.finish_reason!=null)B={unified:ke(Z.finish_reason),raw:Z.finish_reason??void 0};if(Z?.text!=null)v.enqueue({type:"text-delta",id:"0",delta:Z.text})},flush(x){if(!A)x.enqueue({type:"text-end",id:"0"});x.enqueue({type:"finish",finishReason:B,usage:Oe(V)})}})),request:{body:w},response:{headers:j}}}},Ee=()=>U({prompt_tokens:r(),completion_tokens:r(),total_tokens:r()}),Ze=a(()=>s(t({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({text:e(),finish_reason:e()})),usage:Ee().nullish()}))),Qe=(m)=>l([t({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({text:e(),finish_reason:e().nullish(),index:r()})),usage:Ee().nullish()}),m]),_e=a(()=>s(t({dimensions:r().optional(),user:e().optional()}))),Xe=class m{get provider(){return this.config.provider}get maxEmbeddingsPerCall(){return this.config.maxEmbeddingsPerCall??2048}get supportsParallelCalls(){return this.config.supportsParallelCalls??!0}static[k](f){return E({modelId:f.modelId,config:f.config})}static[T](f){return new m(f.modelId,f.config)}constructor(f,b){this.specificationVersion="v4",this.modelId=f,this.config=b}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}async doEmbed({values:f,dimensions:b,headers:_,abortSignal:w,providerOptions:j}){let L=[],B=await h({provider:"openai-compatible",providerOptions:j,schema:_e});if(B!=null)L.push({type:"deprecated",setting:"providerOptions key 'openai-compatible'",message:"Use 'openaiCompatible' instead."});be({rawName:this.providerOptionsName,providerOptions:j,warnings:L});let V=Object.assign(B??{},await h({provider:"openaiCompatible",providerOptions:j,schema:_e})??{},await h({provider:this.providerOptionsName,providerOptions:j,schema:_e})??{});if(f.length>this.maxEmbeddingsPerCall)throw new me({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:f});let{responseHeaders:A,value:x,rawValue:v}=await g({url:this.config.url({path:"/embeddings",modelId:this.modelId}),headers:d(this.config.headers?.(),_),body:{model:this.modelId,input:f,encoding_format:"float",dimensions:V.dimensions??b,user:V.user},failedResponseHandler:I(this.config.errorStructure??ge),successfulResponseHandler:p(Ye),abortSignal:w,fetch:this.config.fetch});return{warnings:L,embeddings:x.data.map((S)=>S.embedding),usage:x.usage?{tokens:x.usage.prompt_tokens}:void 0,providerMetadata:x.providerMetadata,response:{headers:A,body:v}}}},Ye=a(()=>s(t({data:o(t({embedding:o(r())})),usage:t({prompt_tokens:r()}).nullish(),providerMetadata:y(e(),y(e(),ie())).optional()}))),et=class m{get provider(){return this.config.provider}get providerOptionsKey(){return this.config.provider.split(".")[0].trim()}static[k](f){return E({modelId:f.modelId,config:f.config})}static[T](f){return new m(f.modelId,f.config)}constructor(f,b){this.modelId=f,this.config=b,this.specificationVersion="v4",this.maxImagesPerCall=10,this.supportsFileInputs=void 0,this.supportsMaskInputs=void 0}getArgs(f,b){return be({rawName:this.providerOptionsKey,providerOptions:f,warnings:b}),{...f[this.providerOptionsKey],...f[ce(this.providerOptionsKey)]}}async doGenerate({prompt:f,n:b,size:_,aspectRatio:w,seed:j,providerOptions:L,headers:B,abortSignal:V,files:A,mask:x}){let v=[];if(w!=null)v.push({type:"unsupported",feature:"aspectRatio",details:"This model does not support aspect ratio. Use `size` instead."});if(j!=null)v.push({type:"unsupported",feature:"seed"});let S=this.config._internal?.currentDate?.()??new Date,Z=this.getArgs(L,v),F=A!=null&&A.length>0,G=this.config.url({path:F?"/images/edits":"/images/generations",modelId:this.modelId}),se=d(this.config.headers?.(),B);if(F){let{value:de,responseHeaders:K}=await ne({url:G,headers:se,formData:ot({model:this.modelId,prompt:f,image:await Promise.all(A.map((J)=>Te(J))),mask:x!=null?await Te(x):void 0,n:b,size:_,...Z}),failedResponseHandler:I(this.config.errorStructure??ge),successfulResponseHandler:p(je),abortSignal:V,fetch:this.config.fetch});return{images:await this.getImages(de.data,{url:G,headers:se,abortSignal:V}),warnings:v,usage:Re(de.usage),response:{timestamp:S,modelId:this.modelId,headers:K}}}let{value:X,responseHeaders:ae}=await g({url:G,headers:se,body:{model:this.modelId,prompt:f,n:b,size:_,...Z},failedResponseHandler:I(this.config.errorStructure??ge),successfulResponseHandler:p(je),abortSignal:V,fetch:this.config.fetch});return{images:await this.getImages(X.data,{url:G,headers:se,abortSignal:V}),warnings:v,usage:Re(X.usage),response:{timestamp:S,modelId:this.modelId,headers:ae}}}async getImages(f,b){if(f.every((_)=>_.b64_json!=null))return f.map((_)=>_.b64_json);return Promise.all(f.map(async(_)=>{if(_.b64_json!=null)return N(_.b64_json);if(_.url==null)throw new P({data:_,message:"Expected url in the image response"});let{value:w}=await R({url:_.url,validateUrl:!0,trustedOrigin:b.url,credentialedOrigin:b.url,headers:b.headers,abortSignal:b.abortSignal,fetch:this.config.fetch,successfulResponseHandler:dt(),failedResponseHandler:an()});return w}))}};function Re(m){return m==null?void 0:{inputTokens:m.input_tokens??void 0,outputTokens:m.output_tokens??void 0,totalTokens:m.total_tokens??void 0}}var je=a(()=>s(t({data:o(t({b64_json:e().nullish(),url:e().nullish()}).refine((m)=>m.b64_json!=null||m.url!=null,{message:"Expected b64_json or url in the image response"})),usage:t({input_tokens:r().nullish(),output_tokens:r().nullish(),total_tokens:r().nullish()}).nullish()})));async function Te(m){if(m.type==="url")return Me(m.url);let f=m.data instanceof Uint8Array?m.data:N(m.data);return new Blob([f],{type:m.mediaType})}var tt="3.0.80";function He(m){let f=Y(m.baseURL),b=m.name,_={...m.apiKey&&{Authorization:`Bearer ${m.apiKey}`},...m.headers},w=()=>q(_,`ai-sdk-openai-compatible/${tt}`),j=(S)=>({provider:`${b}.${S}`,url:({path:Z})=>{let F=new URL(`${f}${Z}`);if(m.queryParams)F.search=new URLSearchParams(m.queryParams).toString();return F.toString()},headers:w,fetch:m.fetch}),L=(S)=>B(S),B=(S)=>new Je(S,{...j("chat"),includeUsage:m.includeUsage,supportsStructuredOutputs:m.supportsStructuredOutputs,supportsMultiPartToolContent:m.supportsMultiPartToolContent,supportedUrls:m.supportedUrls,transformRequestBody:m.transformRequestBody,metadataExtractor:m.metadataExtractor,convertUsage:m.convertUsage}),V=(S)=>new Ge(S,{...j("completion"),includeUsage:m.includeUsage}),A=(S)=>new Xe(S,{...j("embedding")}),x=(S)=>new et(S,j("image")),v=(S)=>L(S);return v.specificationVersion="v4",v.languageModel=L,v.chatModel=B,v.completionModel=V,v.embeddingModel=A,v.textEmbeddingModel=A,v.imageModel=x,v}var nt=(m)=>{if(!m.baseURL)throw Error("This provider has no API URL. Select it again in the settings or configure a custom endpoint.");return He({name:"openai-compatible",baseURL:m.baseURL,apiKey:m.apiKey,headers:m.headers,...m.fetch&&{fetch:m.fetch},includeUsage:!0,supportsStructuredOutputs:!0,transformRequestBody:(f)=>{let b=f.response_format;if(b?.type!=="json_schema"||!b.json_schema)return f;return{...f,response_format:{type:"json_object"},messages:[{role:"system",content:`Return only a JSON object matching this JSON schema: ${JSON.stringify(b.json_schema.schema)}`},...f.messages]}}}).chatModel(m.model)};function pt(){oe("openai-compatible",nt)}export{pt as register};
|