murmur-rag 1.1.0 → 1.3.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 +28 -19
- package/dist/cdn/{anthropic-dc7h9prc.js → anthropic-tw416spz.js} +2 -2
- package/dist/cdn/chunk-xyp6nm65.js +1 -0
- package/dist/cdn/{embed-fd96s8qk.js → embed-3am76qfd.js} +9 -9
- package/dist/cdn/embed-50pfy67v.js +83 -0
- package/dist/cdn/{embed-z32y952f.js → embed-cx1r66ch.js} +6 -6
- package/dist/cdn/{embed-ssqsb38w.js → embed-g0p6yc29.js} +2 -2
- package/dist/cdn/{embed-krrjjyf5.js → embed-q81wdr1z.js} +4 -4
- package/dist/cdn/embed-rjpq8psf.js +10 -0
- package/dist/cdn/{embed-acjpjh6t.js → embed-yz75savs.js} +3 -3
- package/dist/cdn/{google-yywkqdph.js → google-556tp13p.js} +8 -8
- package/dist/cdn/index-8r44b2wt.js +1 -0
- package/dist/cdn/index-a5j4aat5.js +1 -0
- package/dist/cdn/index-ft8r539a.js +1 -0
- package/dist/cdn/index-pjxy71n5.js +1 -0
- package/dist/cdn/{index-gyd02jvt.js → index-qpy1k923.js} +2 -2
- package/dist/cdn/mistral-25w1nsx5.js +3 -0
- package/dist/cdn/{murmur-j1ky5vmr.js → murmur-1a55et82.js} +3 -3
- package/dist/cdn/murmur.js +7 -7
- package/dist/cdn/openai-bjrbem49.js +18 -0
- package/dist/cdn/{openai-compatible-zhaj1r43.js → openai-compatible-sg25g0vj.js} +6 -6
- package/dist/cdn/retriever-06ybegpd.js +1 -0
- package/dist/cdn/{transformers.web-3kmbvcbt.js → transformers.web-49m0ht4a.js} +9 -9
- package/dist/lib/chunks/{index-92w507gk.js → index-4ftk20yq.js} +164 -50
- package/dist/lib/embed.js +10 -4
- package/dist/lib/llm/index.js +23 -0
- package/dist/lib/local/index.js +38 -2
- package/dist/lib/widget/index.js +2 -2
- package/dist/types/llm/index.d.ts +8 -0
- package/dist/types/local/index.d.ts +12 -0
- package/dist/types/widget/element.d.ts +4 -0
- package/dist/types/widget/i18n.d.ts +1 -0
- package/dist/types/widget/session.d.ts +56 -8
- package/dist/types/widget/styles.d.ts +1 -1
- package/package.json +1 -1
- package/dist/cdn/chunk-hpx6rpea.js +0 -1
- package/dist/cdn/embed-6gef7ym5.js +0 -10
- package/dist/cdn/embed-jdraznwg.js +0 -83
- package/dist/cdn/index-bq0x71h1.js +0 -1
- package/dist/cdn/index-jt6n0d28.js +0 -1
- package/dist/cdn/index-nesgnf2n.js +0 -1
- package/dist/cdn/index-wgzgvzaf.js +0 -1
- package/dist/cdn/mistral-0mg4kk7s.js +0 -3
- package/dist/cdn/openai-g1685z9v.js +0 -18
- package/dist/cdn/retriever-dqxzjaqk.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{N}from"./embed-cx1r66ch.js";var l={id:"onnx-community/LFM3-1.7B-ONNX",dtype:"q4f16",name:"LFM3 1.7B",sizeMB:1090};async function L(){let e=globalThis.navigator?.gpu;if(!e)return!1;try{return!!await e.requestAdapter()}catch{return!1}}function M(e){return e.flatMap((t)=>{if(t.role==="system")return[{role:"system",content:t.content}];if(t.role==="tool")return[];let o=t.content.map((n)=>n.type==="text"?n.text:"").join("").trim();return o?[{role:t.role,content:o}]:[]})}var d=new Map,x=new Set,y=new Map,_=(e)=>`${e.id}@${e.dtype}`,h="transformers-cache";async function S(e=l){try{if(typeof caches>"u"||!await caches.has(h))return!1;let t=await caches.open(h),o=`/${e.id}/resolve/`,n=`model_${e.dtype}.onnx`;return(await t.keys()).some((a)=>a.url.includes(o)&&a.url.includes(n))}catch{return!1}}async function P(){try{let e=globalThis.navigator?.storage;if(!e?.persist)return!1;return await e.persisted?.()||await e.persist()}catch{return!1}}function v(e=l,t){let o=_(e),n=y.get(o)??new Set;if(y.set(o,n),t)n.add(t);let a=d.get(o);if(!a)a=(async()=>{if(!await L())throw new p("webgpu","This browser has no WebGPU.");if(!await S(e))P();let{pipeline:r}=await (N("49m0ht4a"),import("./transformers.web-49m0ht4a.js")),i=await r("text-generation",e.id,{dtype:e.dtype,device:"webgpu",progress_callback:(s)=>{if(s.status!=="progress_total")return;let u={loaded:s.loaded??0,total:s.total??0,progress:Math.min(1,(s.progress??0)/100)};for(let c of n)c(u)}}).catch((s)=>{throw new p("load",s instanceof Error?s.message:String(s))});return x.add(o),i})(),a.catch(()=>d.delete(o)),d.set(o,a);return a}class p extends Error{code;constructor(e,t){super(t);this.code=e;this.name="LocalModelError"}}var k=(e,t)=>({inputTokens:{total:e,noCache:e,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:t,text:t,reasoning:void 0}});function q(e={}){let t=e.spec??l;async function o(n,a){let r=await v(t,e.onProgress),{TextStreamer:i,InterruptableStoppingCriteria:s,StoppingCriteriaList:u}=await (N("49m0ht4a"),import("./transformers.web-49m0ht4a.js")),c=new s,g=new u;g.push(c);let m=()=>c.interrupt();n.abortSignal?.addEventListener("abort",m,{once:!0});let f=0,b=new i(r.tokenizer,{skip_prompt:!0,skip_special_tokens:!0,decode_kwargs:{clean_up_tokenization_spaces:!1},callback_function:(w)=>{if(w)a(w)},token_callback_function:()=>{f++}});try{await r(M(n.prompt),{max_new_tokens:n.maxOutputTokens??e.maxNewTokens??512,do_sample:!0,temperature:n.temperature??0.1,top_k:50,repetition_penalty:1.1,streamer:b,stopping_criteria:g,tokenizer_encode_kwargs:{enable_thinking:!1}})}finally{n.abortSignal?.removeEventListener("abort",m)}return{tokens:f,interrupted:c.interrupted}}return{specificationVersion:"v4",provider:"murmur-local",modelId:t.id,supportedUrls:{},async doGenerate(n){let a="",{tokens:r,interrupted:i}=await o(n,(s)=>{a+=s});return{content:[{type:"text",text:a}],finishReason:{unified:i?"other":"stop",raw:void 0},usage:k(0,r),warnings:[]}},async doStream(n){return{stream:new ReadableStream({start(r){r.enqueue({type:"stream-start",warnings:[]}),r.enqueue({type:"text-start",id:"0"}),o(n,(i)=>r.enqueue({type:"text-delta",id:"0",delta:i})).then(({tokens:i,interrupted:s})=>{r.enqueue({type:"text-end",id:"0"}),r.enqueue({type:"finish",finishReason:{unified:s?"other":"stop",raw:void 0},usage:k(0,i)}),r.close()},(i)=>{r.enqueue({type:"error",error:i}),r.close()})}})}}}}export{l as DEFAULT_LOCAL_MODEL,L as hasWebGPU,S as isLocalModelCached,v as loadLocalModel,q as localModel};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Re,Le,$e,_t,Ue,Ge,et,Ne,We,bn,wt,vt}from"./embed-rjpq8psf.js";export{Le as DEFAULT_RECOMMENDED,bn as ENDPOINT_PRESETS,vt as createLlmSettingsStore,Re as defaultModelOf,Ge as describeError,Ne as isConfigured,_t as liveCatalog,$e as loadCatalog,et as loadModel,Ue as providerMeta,wt as secureStorage,We as validateEndpoint};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Re,Le,$e,_t,Ue,Ge,et,Ne,We,wt,vt}from"./embed-rjpq8psf.js";var l="https://maxgfr.github.io/murmur/cdn/models.json";function d(e){let o=e.endpoint?We(e.endpoint):null;if(!o)return null;let r=e.model||"default",t={apiKey:"",model:r,customEndpoint:o,customModel:r};if(e.headers)t.headers=e.headers;return t}var s=!1;async function p(e,o=l){if(!e.apiKey)return null;if(!s&&typeof console<"u")s=!0,console.warn("murmur: the API key in this page can be read by anyone. Use a key with a spending limit, or a proxy (data-endpoint).");let r=e.provider||"openai",t=await $e(o),n=Ue(t,r);if(!n)throw Error(`murmur: unknown provider "${r}"`);let a=e.model||Re(t[r])||"",i={apiKey:e.apiKey,model:a,...n};if(e.headers)i.headers=e.headers;return i}function u(e,o={}){let r=o.storageKey??"murmur",t={};if(e.provider)t.providerId=e.provider;if(e.model)t.model=e.model;return vt({catalog:_t({fallbackUrl:o.catalogUrl??l}),storage:wt({prefsKey:`${r}-llm`,dbName:`${r}-secrets`}),recommended:e.provider?[e.provider,...Le.filter((n)=>n!==e.provider)]:Le,defaults:t})}async function g(e,o){let r=d(e);if(r)return r;let t=o?await o.load():null;return t&&Ne(t)?t:null}export{Ge as describeError,Ne as isConfigured,et as loadModel,p as ownerKeySettings,d as proxySettings,g as resolveSettings,u as visitorStore};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Mn,It}from"./embed-3am76qfd.js";export{Mn as generateText,It as streamText};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{St,gt,Ct}from"./embed-q81wdr1z.js";var E="script,style,noscript,template,svg,canvas,iframe,nav,header,footer,aside,form,button,dialog,[hidden],[aria-hidden='true'],[data-murmur-ignore],murmur-chat",O="main,article,[role='main'],body",D=/^(P|LI|DT|DD|PRE|BLOCKQUOTE|TABLE|TR|FIGCAPTION|DIV|SECTION|ARTICLE|UL|OL|DL|MAIN|H[1-6])$/;function g(o,{root:l=O,exclude:s=E}={}){let r=l.split(",").map((t)=>o.querySelector(t.trim())).find((t)=>!!t),p=r?.querySelector("h1")?.textContent?.replace(/\s+/g," ").trim()||o.querySelector("title")?.textContent?.trim()||"";if(!r)return{title:p,sections:[]};let u=[],e={heading:"",anchor:"",text:""},d=new Map,f=(t)=>{if(t.nodeType===3){e.text+=(t.textContent??"").replace(/\s+/g," ");return}if(t.nodeType!==1)return;let n=t;if(n.matches(s))return;let i=n.tagName.toUpperCase();if(/^H[1-3]$/.test(i)){u.push(e);let c=(n.textContent??"").replace(/\s+/g," ").trim(),m=n.id||n.closest("[id]")?.id||"";if(!m){let a=gt(c),x=d.get(a)??0;d.set(a,x+1),m=x?`${a}-${x}`:a}e={heading:c,anchor:m,text:""};return}if(i==="BR")e.text+=`
|
|
2
2
|
`;if((i==="TD"||i==="TH")&&!/(^|\n)\s*$/.test(e.text))e.text+=" | ";let h=D.test(i);if(h)e.text+=`
|
|
3
3
|
|
|
4
4
|
`;if(i==="LI")e.text+="- ";for(let c of Array.from(n.childNodes))f(c);if(h)e.text+=`
|
|
@@ -6,4 +6,4 @@ import{kt,mt,Tt}from"./embed-krrjjyf5.js";var E="script,style,noscript,template,
|
|
|
6
6
|
`};for(let t of Array.from(r.childNodes))f(t);return u.push(e),{title:p,sections:u.map((t)=>({...t,text:t.text.replace(/[ \t]+\n/g,`
|
|
7
7
|
`).replace(/\n{3,}/g,`
|
|
8
8
|
|
|
9
|
-
`).trim()})).filter((t)=>t.text)}}function L(o,l=o.location?.href??"",s={}){let r=g(o,s);return
|
|
9
|
+
`).trim()})).filter((t)=>t.text)}}function L(o,l=o.location?.href??"",s={}){let r=g(o,s);return Ct([{url:l,title:r.title,sections:r.sections}],s.maxChunk??St)}export{L as indexDocument};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{oe,Ie}from"./embed-rjpq8psf.js";import{b,He,me,u,e,r,c,ie,o,t,l,f,y,i,n,G,k,T,d,j,M,ee,te,le,F,z,C,Ft,he,W,Se,dt,a,s,h,g,ne,ve,S,O,I,D,p,E,Ce,Y}from"./embed-50pfy67v.js";var xe=t({messages:o(G()).nullish(),cached_tokens:r().nullish(),audio_tokens:r().nullish()}).catchall(G()),$e=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:$e.nullish()}).catchall(G());function pe(w){if(w==null)return te();let{prompt_tokens:m,completion_tokens:_}=w,H=w.num_cached_tokens??w.prompt_tokens_details?.cached_tokens??w.prompt_token_details?.cached_tokens??0;return{inputTokens:{total:m,noCache:m-H,cacheRead:H||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:H,content:L}=w[_],v=_===w.length-1;switch(H){case"system":m.push({role:"system",content:L});break;case"user":m.push({role:"user",content:L.map((q)=>{switch(q.type){case"text":return{type:"text",text:q.text};case"file":switch(q.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(q.mediaType)==="image")return{type:"image_url",image_url:ke({part:q})};else{if(q.data.type==="data"){if(O({part:q})!=="application/pdf")throw new u({functionality:"Only images and PDF file parts are supported"})}else if(q.mediaType!=="application/pdf")throw new u({functionality:"Only images and PDF file parts are supported"});return{type:"document_url",document_url:ke({part:q})}}}}})});break;case"assistant":{let q="",N=!1,x=[],R=[];for(let A of L)switch(A.type){case"text":q+=A.text,x.push({type:"text",text:A.text});break;case"tool-call":R.push({id:A.toolCallId,type:"function",function:{name:A.toolName,arguments:JSON.stringify(A.input)}});break;case"reasoning":N=!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:N?x:q,prefix:v?!0:void 0,tool_calls:R.length>0?R:void 0});break}case"tool":for(let q of L){if(q.type==="tool-approval-response")continue;let N=q.output,x;switch(N.type){case"text":case"error-text":x=N.value;break;case"execution-denied":x=N.reason??"Tool call execution denied.";break;case"content":case"json":case"error-json":x=JSON.stringify(N.value)}m.push({role:"tool",name:q.toolName,tool_call_id:q.toolCallId,content:x})}break;default:throw Error(`Unsupported role: ${H}`)}}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()}),De=a(()=>s(Ee())),Pe=a(()=>s(t({object:n("error"),message:e(),type:e(),param:e().nullable(),code:e().nullable()}))),ce=I({errorSchema:Pe,errorToMessage:(w)=>w.message});function Ve({tools:w,toolChoice:m}){w=w?.length?w:void 0;let _=[];if(w==null)return{tools:void 0,toolChoice:void 0,toolWarnings:_};let H=[];for(let v of w)if(v.type==="provider")_.push({type:"unsupported",feature:`provider-defined tool ${v.id}`});else H.push({type:"function",function:{name:v.name,description:v.description,parameters:v.inputSchema,...v.strict!=null?{strict:v.strict}:{}}});if(m==null)return{tools:H,toolChoice:void 0,toolWarnings:_};let L=m.type;switch(L){case"auto":case"none":return{tools:H,toolChoice:L,toolWarnings:_};case"required":return{tools:H,toolChoice:"any",toolWarnings:_};case"tool":return{tools:H.filter((v)=>v.function.name===m.toolName),toolChoice:"any",toolWarnings:_};default:throw new u({functionality:`tool choice type: ${L}`})}}var Je=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"]),ze=new Set(["zai-glm-5","zai-glm-5-3","zai-glm-5-3-flash","zai-glm-latest"]),Ke=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:H,topP:L,topK:v,frequencyPenalty:q,presencePenalty:N,reasoning:x,stopSequences:R,responseFormat:A,seed:U,providerOptions:X,tools:se,toolChoice:Q}){let Z=[],V=await h({provider:"mistral",providerOptions:X,schema:De})??{};if(v!=null)Z.push({type:"unsupported",feature:"topK"});let re=!Je.has(this.modelId),K;if(re){let de=ze.has(this.modelId);if(V.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".'});K=V.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 J=V.structuredOutputs??!0,P=V.strictJsonSchema??!1;if(A?.type==="json"&&(!J||A.schema==null))m=Ft({messages:m,schema:A.schema});let B={model:this.modelId,safe_prompt:V.safePrompt,max_tokens:_,temperature:H,top_p:L,...q!=null?{frequency_penalty:q}:{},...N!=null?{presence_penalty:N}:{},stop:R,random_seed:U,reasoning_effort:K,response_format:A?.type==="json"?J&&A?.schema!=null?{type:"json_schema",json_schema:{schema:A.schema,strict:P,name:A.name??"response",description:A.description}}:{type:"json_object"}:void 0,document_image_limit:V.documentImageLimit,document_page_limit:V.documentPageLimit,...V.promptCacheKey!==void 0?{prompt_cache_key:V.promptCacheKey}:{},messages:be(m)},{tools:ae,toolChoice:fe,toolWarnings:ye}=Ve({tools:se,toolChoice:Q});return{args:{...B,tools:ae,tool_choice:fe,...ae!=null&&V.parallelToolCalls!==void 0?{parallel_tool_calls:V.parallelToolCalls}:{}},warnings:[...Z,...ye]}}async doGenerate(m){let{args:_,warnings:H}=await this.getArgs(m),{responseHeaders:L,value:v,rawValue:q}=await g({url:`${this.config.baseURL}/chat/completions`,headers:d(this.config.headers?.(),m.headers),body:_,failedResponseHandler:ce,successfulResponseHandler:p(Be),abortSignal:m.abortSignal,fetch:this.config.fetch}),N=v.choices[0],x=[];if(N.message.content!=null&&Array.isArray(N.message.content)){for(let R of N.message.content)if(R.type==="thinking"){let A=Te(R.thinking);if(A.length>0)x.push({type:"reasoning",text:A})}else if(R.type==="text"){if(R.text.length>0)x.push({type:"text",text:R.text})}}else{let R=Me(N.message.content);if(R!=null&&R.length>0)x.push({type:"text",text:R})}if(N.message.tool_calls!=null)for(let R of N.message.tool_calls)x.push({type:"tool-call",toolCallId:R.id,toolName:R.function.name,input:R.function.arguments});return{content:x,finishReason:{unified:je(N.finish_reason),raw:N.finish_reason??void 0},usage:pe(v.usage),request:{body:_},response:{...ee(v),headers:L,body:q},warnings:H}}async doStream(m){let{args:_,warnings:H}=await this.getArgs(m),L={..._,stream:!0},{responseHeaders:v,value:q}=await g({url:`${this.config.baseURL}/chat/completions`,headers:d(this.config.headers?.(),m.headers),body:L,failedResponseHandler:ce,successfulResponseHandler:D(We),abortSignal:m.abortSignal,fetch:this.config.fetch}),N={unified:"interrupted",raw:void 0},x=void 0,R=!0,A=!1,U=null,X,se=this.generateId;return{stream:q.pipeThrough(new TransformStream({start(Q){X=new Ce(Q,{generateId:se}),Q.enqueue({type:"stream-start",warnings:H})},transform(Q,Z){if(m.includeRawChunks)Z.enqueue({type:"raw",rawValue:Q.rawValue});if(!Q.success){N={unified:"error",raw:void 0},Z.enqueue({type:"error",error:Q.error});return}let V=Q.value;if(R)R=!1,Z.enqueue({type:"response-metadata",...ee(V)});if(V.usage!=null)x=V.usage;let re=V.choices[0],K=re.delta,J=Me(K.content);if(K.content!=null&&Array.isArray(K.content)){for(let P of K.content)if(P.type==="thinking"){let B=Te(P.thinking);if(B.length>0){if(U==null){if(A)Z.enqueue({type:"text-end",id:"0"}),A=!1;U=se(),Z.enqueue({type:"reasoning-start",id:U})}Z.enqueue({type:"reasoning-delta",id:U,delta:B})}}}if(J!=null&&J.length>0){if(!A){if(U!=null)Z.enqueue({type:"reasoning-end",id:U}),U=null;Z.enqueue({type:"text-start",id:"0"}),A=!0}Z.enqueue({type:"text-delta",id:"0",delta:J})}if(K?.tool_calls!=null)for(let P of K.tool_calls)X.processDelta(P);if(re.finish_reason!=null)N={unified:je(re.finish_reason),raw:re.finish_reason}},flush(Q){if(U!=null)Q.enqueue({type:"reasoning-end",id:U});if(A)Q.enqueue({type:"text-end",id:"0"});X.flush(),Q.enqueue({type:"finish",finishReason:N,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:H}=_;switch(H){case"text":m.push(_.text);break;case"thinking":case"image_url":case"reference":break;default:throw Error(`Unsupported type: ${H}`)}}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(),Be=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}))),We=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 Ge(w,m){let _=[],H=[],L=new Set,v=(q)=>{if(L.has(q.toolCallId)){let x=null;if(q.output.type==="json"){let R=q.output.value,A=R!=null&&typeof R==="object"&&"info"in R?R.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:q.toolCallId,result:typeof x==="string"?x:JSON.stringify(x)});return}let N=be([{role:"tool",content:[q]}])[0];_.push({type:"function.result",tool_call_id:q.toolCallId,result:N.content})};for(let q of w)switch(q.role){case"system":H.push(q.content);break;case"user":{let N=be([q])[0];if(N.role==="user")_.push({type:"message.input",role:"user",content:N.content});break}case"assistant":{let N=[],x=()=>{if(N.length>0)_.push({type:"message.input",role:"assistant",content:N}),N=[]};for(let R of q.content)switch(R.type){case"text":N.push({type:"text",text:R.text});break;case"reasoning":N.push({type:"thinking",thinking:[{type:"text",text:R.text}],closed:!0});break;case"tool-call":if(x(),R.providerExecuted){let A=R.providerOptions?.mistral?.function??R.providerOptions?.mistral?.name,U=R.input;_.push({type:"function.call",tool_call_id:R.toolCallId,name:typeof A==="string"?A:m.toProviderToolName(R.toolName),arguments:typeof U?.arguments==="string"?U.arguments:JSON.stringify(R.input)}),L.add(R.toolCallId)}else _.push({type:"function.call",tool_call_id:R.toolCallId,name:R.toolName,arguments:JSON.stringify(R.input)});break;case"tool-result":x(),v(R);break;default:throw new u({functionality:`assistant content type: ${R.type}`})}x();break}case"tool":for(let N of q.content){if(N.type==="tool-approval-response")continue;v(N)}}return{inputs:_,instructions:H.length>0?H.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 H=[];for(let v of w)if(v.type==="provider"){if(v.id==="mistral.web_search"||v.id==="mistral.web_search_premium"){H.push({type:ge[v.id]});continue}_.push({type:"unsupported",feature:`provider-defined tool ${v.id}`})}else H.push({type:"function",function:{name:v.name,description:v.description,parameters:v.inputSchema,...v.strict!=null?{strict:v.strict}:{}}});if(m==null)return{tools:H,toolChoice:void 0,toolWarnings:_};let L=m.type;switch(L){case"auto":case"none":return{tools:H,toolChoice:L,toolWarnings:_};case"required":return{tools:H,toolChoice:"any",toolWarnings:_};case"tool":{let v=le({tools:w,providerToolNames:ge}).toProviderToolName(m.toolName);return{tools:H.filter((q)=>q.type==="function"?q.function.name===v:q.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:H,topP:L,topK:v,frequencyPenalty:q,presencePenalty:N,reasoning:x,stopSequences:R,responseFormat:A,seed:U,providerOptions:X,tools:se,toolChoice:Q}){let Z=[],V=await h({provider:"mistral",providerOptions:X,schema:Fe})??{};if(v!=null)Z.push({type:"unsupported",feature:"topK"});let re=Ye.has(this.modelId),K;if(re)K=V.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 J=V.structuredOutputs??!0,P=V.strictJsonSchema??!1;if(A?.type==="json"&&(!J||A.schema==null))m=Ft({messages:m,schema:A.schema});let B={max_tokens:_,temperature:H,top_p:L,...q!=null?{frequency_penalty:q}:{},...N!=null?{presence_penalty:N}:{},stop:R,random_seed:U,reasoning_effort:K,response_format:A?.type==="json"?J&&A?.schema!=null?{type:"json_schema",json_schema:{schema:A.schema,strict:P,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,Ue]of Object.entries({safePrompt:V.safePrompt,documentImageLimit:V.documentImageLimit,documentPageLimit:V.documentPageLimit,promptCacheKey:V.promptCacheKey,parallelToolCalls:V.parallelToolCalls}))if(Ue!=null)Z.push({type:"unsupported",feature:de,details:"Not supported by the Mistral Conversations API."});return{args:{model:this.modelId,store:!1,...Ge(m,le({tools:se,providerToolNames:ge})),tools:ae,completion_args:{...B,tool_choice:fe}},warnings:[...Z,...ye]}}async doGenerate(m){let{args:_,warnings:H}=await this.getArgs(m),{value:L,rawValue:v,responseHeaders:q}=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}),N=Re({tools:m.tools,generateId:this.generateId}),x=[],R=!1,A;for(let U of L.outputs)switch(U.type){case"tool.execution":x.push(...N.convertTool(U));break;case"function.call":R=!0,x.push({type:"tool-call",toolCallId:U.tool_call_id,toolName:U.name,input:typeof U.arguments==="string"?U.arguments:JSON.stringify(U.arguments)});break;case"message.output":A=U.model??A;for(let X of typeof U.content==="string"?[{type:"text",text:U.content}]:U.content)x.push(...N.convertChunk(X))}return{content:x,finishReason:{unified:R?"tool-calls":"stop",raw:void 0},usage:pe(L.usage),request:{body:_},response:{id:L.conversation_id,modelId:A,headers:q,body:v},warnings:H}}async doStream(m){let{args:_,warnings:H}=await this.getArgs(m),L={..._,stream:!0},{value:v,responseHeaders:q}=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}),N=Re({tools:m.tools,generateId:this.generateId}),x=new Map,R,A,U,X=!1,se=!1,Q=!1,Z=!1,V=(K)=>{if(A!=null)K.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(K){R=new Ce(K,{generateId:re}),K.enqueue({type:"stream-start",warnings:H})},transform(K,J){if(m.includeRawChunks)J.enqueue({type:"raw",rawValue:K.rawValue});if(!K.success){se=!0,J.enqueue({type:"error",error:K.error});return}let P=K.value;switch(P.type){case"conversation.response.started":J.enqueue({type:"response-metadata",id:P.conversation_id,...P.created_at!=null?{timestamp:new Date(P.created_at)}:{}});break;case"conversation.response.done":U=P.usage??void 0,Q=!0;break;case"conversation.response.error":se=!0,J.enqueue({type:"error",error:P});break;case"message.output.delta":if(!Z&&P.model!=null)Z=!0,J.enqueue({type:"response-metadata",modelId:P.model});for(let B of N.convertChunk(typeof P.content==="string"?{type:"text",text:P.content}:P.content))if(B.type==="text"||B.type==="reasoning"){let ae=`${P.id}-${P.content_index??0}`;if(A?.id!==ae||A.type!==B.type)V(J),A={id:ae,type:B.type},J.enqueue({type:B.type==="text"?"text-start":"reasoning-start",id:ae});J.enqueue({type:B.type==="text"?"text-delta":"reasoning-delta",id:ae,delta:B.text})}else if(B.type==="source")J.enqueue(B);break;case"function.call.delta":V(J),X=!0,R.processDelta({id:P.tool_call_id,index:P.output_index,function:{name:P.name,arguments:P.arguments}});break;case"tool.execution.started":case"tool.execution.delta":{V(J);let B=x.get(P.id);if(B==null)x.set(P.id,{name:P.name,arguments:P.arguments,function:P.function}),J.enqueue({type:"tool-input-start",id:P.id,toolName:N.toolNameMapping.toCustomToolName(P.name),providerExecuted:!0});else B.arguments+=P.arguments;break}case"tool.execution.done":{let B=x.get(P.id);if(B==null){se=!0,J.enqueue({type:"error",error:Error(`Missing tool execution start for ${P.id}`)});break}J.enqueue({type:"tool-input-delta",id:P.id,delta:JSON.stringify({arguments:B.arguments})}),J.enqueue({type:"tool-input-end",id:P.id});for(let ae of N.convertTool({type:"tool.execution",id:P.id,name:B.name,arguments:B.arguments,function:P.function??B.function,info:P.info}))J.enqueue(ae);x.delete(P.id);break}}},flush(K){V(K),R.flush(),K.enqueue({type:"finish",finishReason:{unified:se||!Q||x.size>0?"error":X?"tool-calls":"stop",raw:void 0},usage:pe(U)})}})),request:{body:L},response:{headers:q}}}};function Re({tools:w,generateId:m}){let _=le({tools:w,providerToolNames:ge}),H=new Set;return{toolNameMapping:_,convertChunk(L){switch(L.type){case"text":return L.text.length>0?[{type:"text",text:L.text}]:[];case"thinking":{let q=L.thinking.map((N)=>N.text).join("");return q.length>0?[{type:"reasoning",text:q}]:[]}case"tool_reference":if(L.url==null||H.has(L.url))return[];let v=m();return H.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:H,headers:L,providerOptions:v}){if(m.length>this.maxEmbeddingsPerCall)throw new me({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:m});let q=await h({provider:"mistral",providerOptions:v,schema:ot})??{},{responseHeaders:N,value:x,rawValue:R}=await g({url:`${this.config.baseURL}/embeddings`,headers:d(this.config.headers?.(),L),body:{model:this.modelId,input:m,metadata:q.metadata,output_dimension:q.outputDimension??_,output_dtype:q.outputDtype,encoding_format:"float"},failedResponseHandler:ce,successfulResponseHandler:p(it),abortSignal:H,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:N,body:R}}}},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()}))),lt=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:H="mp3",instructions:L,speed:v,language:q,providerOptions:N}){let x=[],R=await h({provider:"mistral",providerOptions:N,schema:rt}),A="mp3";if(["pcm","wav","mp3","flac","opus"].includes(H))A=H;else x.push({type:"unsupported",feature:"outputFormat",details:`Unsupported output format: ${H}. 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(q!=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 U=R?.refAudio,X={model:this.modelId,input:m,voice_id:U==null?_:void 0,ref_audio:U,expressiveness:R?.expressiveness,phoneme_hints:R?.phonemeHints,response_format:A,stream:!1};return{requestBody:X,requestBodyValues:{...X,ref_audio:U==null?void 0:"[redacted]"},warnings:x}}async doGenerate(m){let _=this.config._internal?.currentDate?.()??new Date,{requestBody:H,requestBodyValues:L,warnings:v}=await this.getArgs(m),{value:q,responseHeaders:N,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(H),values:L},failedResponseHandler:ce,successfulResponseHandler:p(ct),abortSignal:m.abortSignal,fetch:this.config.fetch});return{audio:q.audio_data,warnings:v,request:{body:JSON.stringify(L)},response:{timestamp:_,modelId:this.modelId,headers:N,body:x}}}},ct=a(()=>s(t({audio_data:e()}))),ut=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:H}){let L=[],v=await h({provider:"mistral",providerOptions:H,schema:ut});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 q=new FormData,N=m instanceof Uint8Array?new Blob([m]):new Blob([j(m)]);if(q.append("model",this.modelId),q.append("file",new File([N],"audio",{type:_}),`audio.${dt(_)}`),v!=null)ue(q,"language",v.language),ue(q,"return_language",v.returnLanguage),ue(q,"temperature",v.temperature),ue(q,"timestamp_granularities",v.timestampGranularities),ue(q,"diarize",v.diarize),ue(q,"context_bias",v.contextBias);return{formData:q,warnings:L}}async doGenerate(m){let _=this.config._internal?.currentDate?.()??new Date,{formData:H,warnings:L}=await this.getArgs(m),{value:v,responseHeaders:q,rawValue:N}=await ne({url:`${this.config.baseURL}/audio/transcriptions`,headers:d(this.config.headers?.(),m.headers),formData:H,failedResponseHandler:ce,successfulResponseHandler:p(mt),abortSignal:m.abortSignal,fetch:this.config.fetch}),x=v.segments?.map((U)=>({text:U.text,startSecond:U.start,endSecond:U.end}))??[],R={};if(v.usage!=null)R.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((U)=>U.type!=null||U.score!=null||U.speaker_id!=null).map((U)=>({text:U.text,startSecond:U.start,endSecond:U.end,...U.type!=null&&{type:U.type},...U.score!=null&&{score:U.score},...U.speaker_id!=null&&{speakerId:U.speaker_id}}));if(A!=null&&A.length>0)R.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:q,body:N},...Object.keys(R).length>0&&{providerMetadata:{mistral:R}}}}};function ue(w,m,_){if(_==null)return;if(Array.isArray(_)){for(let H of _)w.append(m,H);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",_=()=>F({Authorization:`Bearer ${he({apiKey:w.apiKey,environmentVariableName:"MISTRAL_API_KEY",description:"Mistral"})}`,...w.headers},`ai-sdk-mistral/${gt}`),H=(R)=>new Ke(R,{provider:"mistral.chat",baseURL:m,headers:_,fetch:w.fetch,generateId:w.generateId}),L=(R)=>new at(R,{provider:"mistral.embedding",baseURL:m,headers:_,fetch:w.fetch}),v=(R)=>new Qe(R,{provider:"mistral.conversation",baseURL:m,headers:_,fetch:w.fetch,generateId:w.generateId}),q=(R)=>new lt(R,{provider:"mistral.speech",baseURL:m,headers:_,fetch:w.fetch}),N=(R)=>new pt(R,{provider:"mistral.transcription",baseURL:m,headers:_,fetch:w.fetch}),x=function(R){if(new.target)throw Error("The Mistral model function cannot be called with the new keyword.");return H(R)};return x.specificationVersion="v4",x.languageModel=H,x.chat=H,x.conversation=v,x.tools=vt,x.embedding=L,x.embeddingModel=L,x.textEmbedding=L,x.textEmbeddingModel=L,x.speech=q,x.speechModel=q,x.transcription=N,x.transcriptionModel=N,x.imageModel=(R)=>{throw new He({modelId:R,modelType:"imageModel"})},x}var St=we();var _t=Ie(we);function Mt(){oe("mistral",_t)}export{Mt as register};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{It}from"./embed-3am76qfd.js";import{Et}from"./embed-g0p6yc29.js";import{tt,Bt,Ut,nt,Gt}from"./embed-cx1r66ch.js";function M(e,s){let t=[...s].reverse().find((o)=>o.role==="user");return tt(e)<12&&t?`${t.content} ${e}`:e}function T(e){let s=e.retriever??(e.index?Et(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(),Ut(e.language),i.length?`Sources:
|
|
2
2
|
|
|
3
|
-
${
|
|
3
|
+
${Bt(i)}`:"Sources: none matched this question. Say you could not find it on this site."].filter(Boolean).join(`
|
|
4
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=
|
|
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=It({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=nt(n),c({text:n,cited:Gt(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,9 +1,9 @@
|
|
|
1
|
-
import{
|
|
2
|
-
var
|
|
1
|
+
import{N,vn,nt,Rt}from"./embed-cx1r66ch.js";vn(import.meta.url,["e5y3vjha","ft8r539a","xyp6nm65","qpy1k923","1a55et82","06ybegpd","a5j4aat5","8r44b2wt","cx1r66ch","rjpq8psf","q81wdr1z","3am76qfd","g0p6yc29","49m0ht4a","sg25g0vj","pjxy71n5","t87kf8t0","bjrbem49","tw416spz","556tp13p","25w1nsx5","50pfy67v","yz75savs"],[["./murmur.js",8],["./index-ft8r539a.js",9],["./chunk-xyp6nm65.js",10],["./index-qpy1k923.js",10],["./murmur-1a55et82.js",11,12,8],["./retriever-06ybegpd.js",12],["./index-a5j4aat5.js",9],["./index-8r44b2wt.js",8],["./embed-cx1r66ch.js"],["./embed-rjpq8psf.js",8],["./embed-q81wdr1z.js"],["./embed-3am76qfd.js",8,21],["./embed-g0p6yc29.js",8],["./transformers.web-49m0ht4a.js",8],["./openai-compatible-sg25g0vj.js",9,21],["./index-pjxy71n5.js",11],["./browser-t87kf8t0.js"],["./openai-bjrbem49.js",9,8,21],["./anthropic-tw416spz.js",9,22,21],["./google-556tp13p.js",9,22,21],["./mistral-25w1nsx5.js",9,21],["./embed-50pfy67v.js"],["./embed-yz75savs.js",21]],0);
|
|
2
|
+
var X={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.",localNoWebGPUOnly:"This site answers with an AI model that runs in your browser, and this browser cannot run it (no WebGPU). Try a recent Chrome, Edge or Safari.",gigabytes:"GB",megabytes:"MB"},ce={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.",localNoWebGPUOnly:"Ce site répond avec un modèle d'IA qui tourne dans votre navigateur, et ce navigateur ne peut pas le faire tourner (pas de WebGPU). Essayez un Chrome, Edge ou Safari récent.",gigabytes:"Go",megabytes:"Mo"},ee={en:X,fr:ce};function te(...e){for(let n of e){let o=n?.toLowerCase().split(/[-_]/)[0];if(o&&o in ee)return o}return"en"}function B(e,n={}){return{...ee[e]??X,...n}}var de={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 U(e,n){let o=e.createElement("template");return o.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">${de[n]??""}</svg>`,o.content.firstElementChild}var pe=/^(https?:\/\/|\/|#|\.\/|mailto:)/i;function S(e,n,o,t){let s=/(`[^`]+`)|(\*\*[^*]+\*\*)|(\*[^*\s][^*]*\*|_[^_\s][^_]*_)|(\[[^\]]+\]\([^)\s]+\))|(\[\d{1,2}\])/g,i=0;for(let c of n.matchAll(s)){let p=c.index??0;if(p>i)t.appendChild(e.createTextNode(n.slice(i,p)));i=p+c[0].length;let r=c[0];if(c[1]){let d=e.createElement("code");d.textContent=r.slice(1,-1),t.appendChild(d)}else if(c[2]){let d=e.createElement("strong");S(e,r.slice(2,-2),o,d),t.appendChild(d)}else if(c[3]){let d=e.createElement("em");S(e,r.slice(1,-1),o,d),t.appendChild(d)}else if(c[4]){let d=r.indexOf("]("),a=r.slice(1,d),u=r.slice(d+2,-1);if(pe.test(u)){let h=e.createElement("a");if(h.href=u,h.textContent=a,/^https?:/i.test(u))h.target="_blank",h.rel="noopener noreferrer";t.appendChild(h)}else t.appendChild(e.createTextNode(a))}else{let d=o(Number(r.slice(1,-1)));t.appendChild(d??e.createTextNode(r))}}if(i<n.length)t.appendChild(e.createTextNode(n.slice(i)))}var ue=/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)*\|?\s*$/;function ne(e,n){return/ {2,}$|\\$/.test(n)?e.createElement("br"):e.createTextNode(" ")}function oe(e){return e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map((n)=>n.trim())}function W(e,n,o){let t=e.ownerDocument,s=t.createDocumentFragment(),i=n.replace(/\r\n?/g,`
|
|
3
3
|
`).split(`
|
|
4
|
-
`),
|
|
5
|
-
`),
|
|
6
|
-
`),
|
|
4
|
+
`),c=[],p=null,r=()=>{if(!c.length)return;let a=t.createElement("p");c.forEach((u,h)=>{if(h)a.appendChild(ne(t,c[h-1]??""));S(t,u.trim(),o,a)}),s.appendChild(a),c=[]},d=()=>{p=null};for(let a=0;a<i.length;a++){let u=i[a]??"",h=/^(\s*)```/.exec(u);if(h){r();let m=h[1]?.length??0,b=m>=2&&p?p.lastElementChild:null;if(!b)d();let y=[];for(a++;a<i.length&&!/^\s*```/.test(i[a]??"");a++){let w=i[a]??"";y.push(w.startsWith(" ".repeat(m))?w.slice(m):w.trimStart())}let E=t.createElement("pre");E.tabIndex=0;let C=t.createElement("code");C.textContent=y.join(`
|
|
5
|
+
`),E.appendChild(C),(b??s).appendChild(E);continue}if(/^\s*([-*_])(?:\s*\1){2,}\s*$/.test(u)){r(),d(),s.appendChild(t.createElement("hr"));continue}if(u.includes("|")&&ue.test(i[a+1]??"")){r(),d();let m=[oe(u)];for(a+=2;a<i.length&&(i[a]??"").includes("|");a++)m.push(oe(i[a]??""));a--;let b=t.createElement("div");b.className="table",b.tabIndex=0;let y=t.createElement("table");m.forEach((E,C)=>{let w=t.createElement("tr");for(let T of E){let A=t.createElement(C===0?"th":"td");S(t,T,o,A),w.appendChild(A)}y.appendChild(w)}),b.appendChild(y),s.appendChild(b);continue}let g=/^\s*>\s?(.*)$/.exec(u);if(g){r(),d();let m=[g[1]??""];for(;/^\s*>/.test(i[a+1]??"");a++)m.push((i[a+1]??"").replace(/^\s*>\s?/,""));let b=t.createElement("blockquote");W(b,m.join(`
|
|
6
|
+
`),o),s.appendChild(b);continue}let f=/^\s*(?:([-*+])|(\d+)[.)])\s+(.*)$/.exec(u);if(f){r();let m=f[1]?"ul":"ol";if(!p||p.tagName.toLowerCase()!==m){if(p=t.createElement(m),m==="ol"&&f[2]&&f[2]!=="1")p.setAttribute("start",f[2]);s.appendChild(p)}let b=t.createElement("li");S(t,(f[3]??"").trimEnd(),o,b),p.appendChild(b);continue}let k=/^\s*#{1,6}\s+(.*)$/.exec(u);if(k){r(),d();let m=t.createElement("p"),b=t.createElement("strong");S(t,k[1]??"",o,b),m.appendChild(b),s.appendChild(m);continue}if(!u.trim()){r();let m=i.slice(a+1).find((y)=>y.trim())??"",b=p?.tagName.toLowerCase()==="ol"?/^\s*\d+[.)]\s+/:/^\s*[-*+]\s+/;if(!p||!b.test(m))d();continue}if(p&&/^\s{2,}\S/.test(u)){let m=p.lastElementChild;if(m){m.appendChild(ne(t,i[a-1]??"")),S(t,u.trim(),o,m);continue}}d(),c.push(u)}r(),e.replaceChildren(s)}var he={limit:4,budgetTokens:1500};class q{options;turns=[];engine=null;storePromise=null;historyKey;key;local={status:"idle"};localListeners=new Set;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 configured(){return this.options.mode??"auto"}get mode(){let e=this.configured;if(this.options.model)return"custom";if(e==="proxy"||e==="auto"&&this.options.llm?.endpoint)return"proxy";if((e==="auto"||e==="key")&&this.options.llm?.apiKey)return"owner";if(e==="local")return"local";if(e==="key"||!this.localAllowed)return"visitor";return F(`${this.key}-local`)==="0"?"visitor":"local"}get localAllowed(){let e=this.configured;if(this.options.model||e==="proxy"||e==="key")return!1;if(e==="local")return!0;return!this.options.llm?.endpoint&&!this.options.llm?.apiKey&&this.options.local!==!1}get keyAllowed(){let e=this.configured;if(this.options.model||e==="proxy"||e==="local")return!1;return!this.options.llm?.endpoint&&!this.options.llm?.apiKey}get localState(){return this.local}onLocalState(e){return this.localListeners.add(e),()=>this.localListeners.delete(e)}setLocal(e){this.local=e;for(let n of this.localListeners)n(e)}async warmUp(){if(this.mode!=="local"||this.local.status!=="idle")return;if(!await this.canRunLocally())return;let{loadLocalModel:e}=await (N("8r44b2wt"),import("./index-8r44b2wt.js"));this.setLocal({status:"loading"});try{await e(await this.localSpec(),(n)=>this.setLocal({status:"loading",progress:n})),this.setLocal({status:"ready"})}catch{this.setLocal({status:"error"})}}async warmUpIfCached(){if(this.mode!=="local"||this.preload==="consent")return;let{isLocalModelCached:e}=await (N("8r44b2wt"),import("./index-8r44b2wt.js"));if(await e(await this.localSpec()))await this.warmUp()}get preload(){return this.options.preload??"question"}async settleChoice(){if(!this.localAllowed||!this.keyAllowed||F(`${this.key}-local`)!==null)return;let[{isConfigured:e},n]=await Promise.all([(N("ft8r539a"),import("./index-ft8r539a.js")),this.store()]),o=await n.load();if(o&&e(o))G(`${this.key}-local`,"0")}async localSpec(){let{local:e}=this.options;if(e&&typeof e==="object")return e;return(await (N("8r44b2wt"),import("./index-8r44b2wt.js"))).DEFAULT_LOCAL_MODEL}useLocal(e){G(`${this.key}-local`,e?"1":"0"),this.engine=null}get needsDownloadConsent(){return this.mode==="local"&&this.preload==="consent"&&this.local.status!=="ready"&&F(`${this.key}-local-consent`)!=="1"}agreeToDownload(){G(`${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??=(N("ft8r539a"),import("./index-ft8r539a.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(){let e=this.mode;if(e==="custom"||e==="local")return null;let n=await (N("ft8r539a"),import("./index-ft8r539a.js")),o=this.options.llm??{};if(e==="proxy")return n.proxySettings(o);if(e==="owner")return n.ownerKeySettings(o,this.options.catalogUrl);return n.resolveSettings({...o,endpoint:""},await this.store())}async needsSetup(){return this.mode==="visitor"&&!await this.settings()}async canRunLocally(){return(await (N("8r44b2wt"),import("./index-8r44b2wt.js"))).hasWebGPU()}async loadIndex(){let{index:e}=this.options;if(e&&typeof e!=="string")return e;let{isMurmurIndex:n}=await (N("xyp6nm65"),import("./chunk-xyp6nm65.js"));if(e){let t=await fetch(new URL(e,location.href));if(!t.ok)throw Error(`murmur: index ${t.status}`);let s=await t.json();if(!n(s))throw Error("murmur: not a murmur index");return s}let{indexDocument:o}=await (N("qpy1k923"),import("./index-qpy1k923.js"));return o(document,location.pathname+location.search)}createEngine(){return(async()=>{let[{createMurmur:e},n]=await Promise.all([(N("1a55et82"),import("./murmur-1a55et82.js")),this.options.retriever??(N("06ybegpd"),import("./retriever-06ybegpd.js")).then(async(i)=>i.bm25Retriever(await this.loadIndex()))]),o=this.mode==="local",t=this.options.model??(o?async()=>{let{localModel:i}=await (N("8r44b2wt"),import("./index-8r44b2wt.js"));return i({spec:await this.localSpec(),onProgress:(c)=>this.setLocal({status:"loading",progress:c})})}:async()=>{let i=await this.settings();if(!i)throw new H;let{loadModel:c}=await (N("ft8r539a"),import("./index-ft8r539a.js"));return c(i)}),s={retriever:n,model:t,...o?he:{}};if(this.options.instructions)s.instructions=this.options.instructions;if(this.options.lang)s.language=this.options.lang;return e(s)})()}async ask(e,n,o){let t=this.turns.filter((i)=>!i.error).map(({role:i,content:c})=>({role:i,content:c}));this.turns.push({role:"user",content:e});let s={role:"assistant",content:""};this.turns.push(s),this.persist();try{if(this.mode==="local")this.warmUp();this.engine??=this.createEngine();let c=await(await this.engine.catch((r)=>{throw this.engine=null,r})).ask(e,{history:t,signal:o});s.passages=c.passages.map(({url:r,anchor:d,title:a,heading:u})=>({url:r,anchor:d,title:a,heading:u}));for await(let r of c.textStream)s.content+=r,n(s.content,s);let p=await c.done;if(this.mode==="local")this.setLocal({status:"ready"});s.content=p.text,s.cited=p.cited}catch(i){if(o.aborted)s.cited=[];else if(i instanceof H)throw this.turns.splice(-2,2),i;else s.error=await this.describe(i)}finally{this.persist()}return s}async describe(e){if(e instanceof Error&&e.name==="LocalModelError")return`local-${e.code??"load"}|${e.message}`;try{let{describeError:n}=await (N("ft8r539a"),import("./index-ft8r539a.js")),o=this.mode==="custom"||this.mode==="local"?null:await this.settings(),t=n(e,o?.apiKey);return`${t.code}|${t.message}`}catch{return`unknown|${e instanceof Error?e.message:String(e)}`}}}function F(e){try{return localStorage.getItem(e)}catch{return null}}function G(e,n){try{if(n===null)localStorage.removeItem(e);else localStorage.setItem(e,n)}catch{}}class H extends Error{constructor(){super("murmur: no model set up")}}var se=`
|
|
7
7
|
:host {
|
|
8
8
|
--accent: var(--murmur-accent, #211c17);
|
|
9
9
|
--accent-ink: var(--murmur-accent-ink, #f6efe0);
|
|
@@ -208,7 +208,7 @@ footer a:hover { text-decoration: underline; }
|
|
|
208
208
|
p.or { margin: 0; color: var(--muted); font-size: 13px; text-align: center; }
|
|
209
209
|
.consent { display: grid; gap: 10px; padding: 14px; border-radius: 12px; background: var(--raised); }
|
|
210
210
|
.consent p { margin: 0; }
|
|
211
|
-
.
|
|
211
|
+
.loadbar { display: grid; gap: 6px; margin: 4px 12px 0; padding: 8px 12px; border-radius: 10px; background: var(--raised); color: var(--muted); font-size: 13px; }
|
|
212
212
|
progress { width: 100%; height: 6px; appearance: none; border: 0; border-radius: 3px; background: var(--line); overflow: hidden; }
|
|
213
213
|
progress::-webkit-progress-bar { background: var(--line); }
|
|
214
214
|
progress::-webkit-progress-value { background: var(--lamp); }
|
|
@@ -220,4 +220,4 @@ progress::-moz-progress-bar { background: var(--lamp); }
|
|
|
220
220
|
@media (prefers-reduced-motion: reduce) {
|
|
221
221
|
*, .panel { animation: none !important; transition: none !important; }
|
|
222
222
|
}
|
|
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};
|
|
223
|
+
`;var me={auth:"errorAuth","auth-or-network":"errorNetwork","rate-limit":"errorRate",overloaded:"errorRate","local-webgpu":"localNoWebGPU","local-load":"localLoadFailed"};function V(e,n,o){if(e>=1000)return`${(e/1000).toLocaleString(n,{maximumFractionDigits:1})} ${o.gigabytes}`;return`${Math.round(e).toLocaleString(n)} ${o.megabytes}`}var ge=typeof HTMLElement>"u"?class{}:HTMLElement;class Y extends ge{options={};session=null;t=B("en");uiLang="en";root;launcher;panel;log;chatView;setupView;input;sendBtn;settingsBtn;controller=null;built=!1;unsubscribe=null;unsubscribeLocal=null;loadbar;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?.(),this.unsubscribeLocal?.(),this.unsubscribeLocal?.()}async open(){if(!this.built)this.build();if(this.launcher.setAttribute("aria-expanded","true"),this.panel.hidden=!1,this.session?.preload==="open")this.session.warmUp();this.session?.persist(),j("set",this.openKey),this.input.focus()}close(){if(this.hasAttribute("inline"))return;this.launcher.setAttribute("aria-expanded","false"),this.panel.hidden=!0,j("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=te(e.lang,document.documentElement.lang,navigator.language);this.uiLang=n;let o={...e.messages};if(this.t=B(n,o),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=se,this.launcher=l(t,"button",{class:"launcher",type:"button","aria-expanded":"false"}),this.launcher.setAttribute("aria-controls","murmur-panel"),this.launcher.append(l(t,"span",{class:"lamp","aria-hidden":"true"}),x(t,"span",this.t.open)),this.launcher.addEventListener("click",()=>void this.open()),this.panel=l(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",(g)=>{if(g.key==="Escape")this.close()});let i=l(t,"header"),c=x(t,"h2",this.t.title),p=_(t,"reset",this.t.newChat);p.addEventListener("click",()=>{this.controller?.abort(),this.session?.clear(),this.renderChat(),this.input.focus()}),this.settingsBtn=_(t,"settings",this.t.settings),this.settingsBtn.hidden=!!e.model||!!e.llm?.endpoint,this.settingsBtn.addEventListener("click",()=>void this.showSetup());let r=_(t,"close",this.t.close);r.hidden=this.hasAttribute("inline"),r.addEventListener("click",()=>this.close()),i.append(c,p,this.settingsBtn,r),this.chatView=l(t,"div",{class:"chat"}),this.chatView.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0",this.log=l(t,"div",{class:"log",role:"log","aria-live":"polite","aria-relevant":"additions"});let d=l(t,"form",{class:"composer"});this.input=l(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",(g)=>{if(g.key==="Enter"&&!g.shiftKey&&!g.isComposing)g.preventDefault(),this.submit()}),this.sendBtn=l(t,"button",{class:"send",type:"submit"}),this.setSendMode("send"),d.addEventListener("submit",(g)=>{if(g.preventDefault(),this.controller)this.controller.abort();else this.submit()}),d.append(this.input,this.sendBtn),this.loadbar=l(t,"div",{class:"loadbar",role:"status"}),this.loadbar.hidden=!0;let a=l(t,"footer"),u=l(t,"a",{href:"https://maxgfr.github.io/murmur/",target:"_blank",rel:"noopener"});if(u.textContent=this.t.poweredBy,a.append(u),this.chatView.append(this.log,this.loadbar,d,a),this.setupView=l(t,"div",{class:"setup"}),this.setupView.hidden=!0,this.panel.append(i,this.chatView,this.setupView),this.root.replaceChildren(s,this.launcher,this.panel),this.hasAttribute("inline"))this.launcher.hidden=!0;this.built=!0;let h=new q({...e,lang:n});if(this.session=h,this.settingsBtn.hidden=!h.keyAllowed,this.unsubscribeLocal=h.onLocalState((g)=>this.drawLocal(g)),ve(()=>{if(h.preload==="idle")h.warmUp();else h.warmUpIfCached()}),this.renderChat(),e.open||!this.hasAttribute("inline")&&j("get",this.openKey))this.open()}drawLocal(e){let n=this.ownerDocument;if(this.launcher.querySelector(".lamp")?.classList.toggle("busy",e.status==="loading"),e.status!=="loading"){this.loadbar.hidden=!0;return}let t=e.progress,s=!t?this.t.localLoading:t.progress>=1?this.t.localPreparing:`${this.t.localLoading} ${Math.round(t.progress*100)} % · ${Math.round(t.loaded/1e6).toLocaleString(this.uiLang)} / ${V(t.total/1e6,this.uiLang,this.t)}`,i=l(n,"progress",{max:"1"});if(t&&t.progress<1)i.setAttribute("value",String(t.progress));i.setAttribute("aria-label",this.t.localLoadingLabel),this.loadbar.replaceChildren(x(n,"span",s),i),this.loadbar.hidden=!1}autosize(){this.input.style.height="auto",this.input.style.height=`${Math.min(this.input.scrollHeight,140)}px`}setSendMode(e){this.sendBtn.replaceChildren(U(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??[],o=[],t=l(e,"div",{class:"msg bot greeting"});t.append(x(e,"p",this.t.greeting)),o.push(t);for(let s of n)o.push(this.turnNode(s));this.log.replaceChildren(...o),this.log.scrollTop=this.log.scrollHeight}turnNode(e){let n=this.ownerDocument;if(e.role==="user"){let t=l(n,"div",{class:"msg user"});return t.textContent=e.content,t}let o=l(n,"div",{class:"msg bot"});return this.fillAnswer(o,e,!0),o}fillAnswer(e,n,o){let t=this.ownerDocument;if(n.error){let[r="unknown",...d]=n.error.split("|"),a=me[r],u=l(t,"div",{class:"error",role:"alert"});u.append(x(t,"p",a?this.t[a]:`${this.t.errorOther} ${d.join("|")}`));let h=l(t,"div",{class:"row"}),g=l(t,"button",{class:"text-btn",type:"button"});if(g.textContent=this.t.retry,g.addEventListener("click",()=>{let f=this.session?.turns??[],k=f.at(-2)?.content??"";if(f.splice(-2,2),this.renderChat(),k)this.ask(k)}),h.append(g),r==="auth"||r==="auth-or-network"){if(!this.settingsBtn.hidden){let f=l(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??[],i=l(t,"div");W(i,nt(n.content),(r)=>{let d=s[r-1];if(!d)return null;let a=l(t,"a",{class:"cite",href:Rt(d)});return a.textContent=String(r),a.setAttribute("aria-label",`${this.t.sources} ${r}: ${d.title}`),a});let c=[i];if(o&&!n.content.trim()&&!s.length){let r=l(t,"p",{class:"status"});r.append(l(t,"span",{class:"lamp off","aria-hidden":"true"}),t.createTextNode(this.t.notFound)),c.push(r)}let p=n.cited??[];if(o&&p.length){c.push(x(t,"p",this.t.sources,"sources-label"));let r=l(t,"ol",{class:"sources"});for(let d of p){let a=s[d-1];if(!a)continue;let u=l(t,"li"),h=l(t,"a",{href:Rt(a)}),g=x(t,"span",String(d),"cite");g.setAttribute("aria-hidden","true");let f=l(t,"span",{class:"where"});if(f.append(t.createTextNode(a.title||a.url)),a.heading&&a.heading!==a.title)f.append(x(t,"span",` › ${a.heading}`));h.append(g,f),u.append(h),r.append(u)}c.push(r)}e.replaceChildren(...c)}async submit(){let e=this.input.value.trim();if(!e||this.controller||!this.session)return;if(await this.session.settleChoice(),this.session.needsDownloadConsent||this.session.mode==="local"&&!await this.session.canRunLocally()){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 o=l(n,"div",{class:"msg bot"}),t=l(n,"p",{class:"status"});t.append(l(n,"span",{class:"lamp busy","aria-hidden":"true"}),n.createTextNode(this.t.thinking)),o.append(t),this.log.append(o),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 i=!1;try{let c=await this.session.ask(e,(p,r)=>{if(!i)i=!0,this.emit({state:"streaming",passages:r.passages??[]});let d=this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<40;if(this.fillAnswer(o,r,!1),d)this.log.scrollTop=this.log.scrollHeight},s.signal);this.fillAnswer(o,c,!0),this.emit(c.error?{state:"error"}:{state:"done",passages:c.passages??[],cited:c.cited??[]})}catch(c){if(o.remove(),this.log.lastElementChild?.remove(),this.emit({state:"idle"}),c instanceof H)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 showConsent(e){if(!this.session)return;let n=this.ownerDocument,o=this.t,t=this.session,s=await t.localSpec(),i=l(n,"div",{class:"msg bot consent"}),c=l(n,"div",{class:"row"}),p=()=>{i.remove(),t.useLocal(!1),this.showSetup(e)};if(!await t.canRunLocally()){if(i.append(x(n,"p",t.keyAllowed?o.localNoWebGPU:o.localNoWebGPUOnly)),t.keyAllowed){let r=l(n,"button",{class:"primary",type:"button"});r.textContent=o.useKey,r.addEventListener("click",p),c.append(r)}}else{i.append(x(n,"p",o.localConsent.replace("{name}",s.name).replace("{size}",V(s.sizeMB,this.uiLang,o))));let r=l(n,"button",{class:"primary",type:"button"});if(r.textContent=o.localDownload,r.addEventListener("click",()=>{t.agreeToDownload(),i.remove(),this.input.value=e,this.submit()}),c.append(r),t.keyAllowed){let d=l(n,"button",{class:"link-btn",type:"button"});d.textContent=o.useKey,d.addEventListener("click",p),c.append(d)}}i.append(c),this.log.append(i),this.log.scrollTop=this.log.scrollHeight,c.querySelector("button")?.focus()}async showSetup(e){if(!this.session)return;let n=this.ownerDocument,o=await this.session.store();await o.load(),o.open(),this.chatView.hidden=!0,this.setupView.hidden=!1;let t=this.t,s=l(n,"button",{class:"link-btn",type:"button"});s.textContent=t.back,s.addEventListener("click",()=>this.hideSetup());let i=x(n,"h3",t.setupTitle);i.style.cssText="margin:0;font-size:17px;font-weight:650";let c=x(n,"p",t.setupIntro,"intro"),p=this.session,r=await p.localSpec(),d=l(n,"div",{class:"local-choice"}),a=l(n,"button",{class:"primary",type:"button"});a.textContent=t.localOption;let u=x(n,"small",t.localOptionHint.replace("{name}",r.name).replace("{size}",V(r.sizeMB,this.uiLang,t)));d.append(a,u),a.addEventListener("click",()=>{if(p.useLocal(!0),this.hideSetup(),e)this.input.value=e,this.submit()});let h=l(n,"button",{class:"link-btn",type:"button"});if(h.textContent=t.useKey,h.addEventListener("click",()=>{p.useLocal(!1),a.textContent=t.localOption,a.disabled=!1,h.remove()}),p.mode==="local")a.textContent=t.localActive,a.disabled=!0,d.append(h);p.canRunLocally().then((v)=>{if(v)return;a.textContent=t.localOption,a.disabled=!0,u.textContent=t.localNoWebGPU,h.remove()});let g=x(n,"p",t.orKey,"or");d.hidden=g.hidden=!p.localAllowed;let f=ie(n,t.local),k=I(n,t.provider,l(n,"select")),m=k.control,b=I(n,t.model,l(n,"select")),y=b.control,E=I(n,t.endpoint,l(n,"input",{type:"url",inputmode:"url"}),t.localHint),C=E.control,w=I(n,t.model,l(n,"input",{type:"text",autocomplete:"off"})),T=w.control,A=l(n,"div",{class:"presets"});for(let v of["ollama","lmstudio"]){let L=l(n,"button",{class:"text-btn",type:"button"});L.textContent=v==="ollama"?"Ollama":"LM Studio",L.addEventListener("click",async()=>{let{ENDPOINT_PRESETS:M}=await (N("a5j4aat5"),import("./index-a5j4aat5.js"));o.applyPreset(M[v])}),A.append(L)}let Z=I(n,t.apiKey,l(n,"input",{type:"password",autocomplete:"off",spellcheck:"false"}),t.apiKeyHint),O=Z.control,R=ie(n,t.remember),P=l(n,"button",{class:"text-btn",type:"button"});P.textContent=t.test;let K=l(n,"p",{class:"result",role:"status"});K.style.margin="0";let z=l(n,"button",{class:"primary",type:"button"});z.textContent=t.save;let D=l(n,"button",{class:"link-btn",type:"button"});D.textContent=t.forget,f.input.addEventListener("change",()=>o.toggleCustom(f.input.checked)),m.addEventListener("change",()=>o.selectProvider(m.value)),y.addEventListener("change",()=>o.selectModel(y.value)),C.addEventListener("input",()=>o.setEndpoint(C.value)),T.addEventListener("input",()=>o.setCustomModel(T.value)),O.addEventListener("input",()=>o.setApiKey(O.value)),R.input.addEventListener("change",()=>o.setRememberKey(R.input.checked)),P.addEventListener("click",()=>void o.test()),z.addEventListener("click",async()=>{if(!(await o.save()).ok)return;if(p.useLocal(!1),this.hideSetup(),e)this.input.value=e,this.submit()}),D.addEventListener("click",()=>void o.clear());let Q=l(n,"div",{class:"row"});Q.append(P,K),this.setupView.replaceChildren(s,i,c,d,g,f.label,k.label,b.label,A,E.label,w.label,Z.label,R.label,Q,z,D);let le=(v)=>{let L=v.draft.custom;if(f.input.checked=L,k.label.hidden=L,b.label.hidden=L,A.hidden=!L,E.label.hidden=!L,w.label.hidden=!L,v.catalogStatus==="ready")fe(n,m,v,t),be(n,y,v);else m.replaceChildren(J(n,"",v.catalogStatus==="error"?t.catalogError:t.loadingCatalog)),y.replaceChildren();if(C!==this.root.activeElement)C.value=v.draft.customEndpoint;if(T!==this.root.activeElement)T.value=v.draft.customModel;if(O!==this.root.activeElement)O.value=v.apiKey;R.input.checked=v.draft.rememberKey,P.disabled=!v.canTest||v.testing,P.textContent=v.testing?t.testing:t.test,z.disabled=!v.canSave;let M=v.testResult;K.className=M?M.ok?"result ok":"result fail":"result",K.textContent=!M?"":M.ok?t.testOk:`${t.testFail} ${M.reason}${M.message?` (${M.message})`:""}`};this.unsubscribe?.(),this.unsubscribe=o.subscribe(le),this.setupView.scrollTop=0,s.focus()}hideSetup(){this.unsubscribe?.(),this.unsubscribe=null,this.setupView.hidden=!0,this.chatView.hidden=!1,this.input.focus()}}function fe(e,n,o,t){let s=[[t.recommended,o.providers.recommended],[t.otherProviders,o.providers.others]],i=`${o.draft.providerId}|${o.providers.recommended.length+o.providers.others.length}`;if(n.dataset.sig===i)return;n.dataset.sig=i,n.replaceChildren(...s.filter(([,c])=>c.length).map(([c,p])=>{let r=e.createElement("optgroup");return r.label=c,r.append(...p.map((d)=>J(e,d.id,d.name))),r})),n.value=o.draft.providerId}function be(e,n,o){let t=`${o.draft.providerId}|${o.draft.model}|${o.models.length}`;if(n.dataset.sig===t)return;n.dataset.sig=t;let s=o.recommendedModel?.id;n.replaceChildren(...o.models.map((i)=>J(e,i.id,i.id===s?`${i.name} ★`:i.name))),n.value=o.draft.model}function j(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 ve(e){let n=globalThis.requestIdleCallback;if(n)n(e,{timeout:4000});else setTimeout(e,1500)}function l(e,n,o={}){let t=e.createElement(n);for(let[s,i]of Object.entries(o))t.setAttribute(s,i);return t}function x(e,n,o,t){let s=e.createElement(n);if(s.textContent=o,t)s.className=t;return s}function J(e,n,o){let t=e.createElement("option");return t.value=n,t.textContent=o,t}function _(e,n,o){let t=l(e,"button",{class:"icon-btn",type:"button",title:o});return t.setAttribute("aria-label",o),t.append(U(e,n)),t}function I(e,n,o,t){let s=l(e,"label",{class:"field"});if(s.append(x(e,"span",n),o),t)s.append(x(e,"small",t));return{label:s,control:o}}function ie(e,n){let o=l(e,"label",{class:"check"}),t=l(e,"input",{type:"checkbox"});return o.append(t,e.createTextNode(n)),{label:o,input:t}}function xe(e="murmur-chat"){if(!customElements.get(e))customElements.define(e,class extends Y{});return customElements.get(e)}function re(e={}){xe();let{target:n,inline:o,...t}=e,s=document.createElement("murmur-chat");if(o)s.setAttribute("inline","");return s.configure(t),(n??document.body).append(s),s}function ye(e,n){let o={};if(e.index)o.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(e.apiKey)t.apiKey=e.apiKey;if(Object.keys(t).length)o.llm=t;if(e.instructions)o.instructions=e.instructions;if(e.lang)o.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)o.messages=s;if(e.position==="bottom-left"||e.position==="bottom-right")o.position=e.position;if(e.theme==="light"||e.theme==="dark"||e.theme==="auto")o.theme=e.theme;if(e.accent)o.accent=e.accent;if(e.catalog)o.catalogUrl=new URL(e.catalog,n).href;if(e.storageKey)o.storageKey=e.storageKey;if(e.open==="true")o.open=!0;if(e.local==="false")o.local=!1;if(e.mode==="auto"||e.mode==="proxy"||e.mode==="local"||e.mode==="key")o.mode=e.mode;if(e.preload==="question"||e.preload==="open"||e.preload==="idle"||e.preload==="consent")o.preload=e.preload;return o}function ae(){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 o=ye(n?.dataset??{},location.href);o.catalogUrl??=new URL("./models.json",e).href,re(o)}if(typeof document<"u"&&!document.querySelector("murmur-chat:not([inline])"))if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",ae,{once:!0});else ae();export{ye as optionsFromDataset};
|