murmur-rag 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -2
  3. package/dist/cdn/anthropic-w7nkjk5e.js +2 -0
  4. package/dist/cdn/browser-t87kf8t0.js +64 -0
  5. package/dist/cdn/chunk-e0j28zmb.js +1 -0
  6. package/dist/cdn/embed-2xm309sb.js +7 -0
  7. package/dist/cdn/embed-4mxwfy19.js +0 -0
  8. package/dist/cdn/embed-59r4jck6.js +6 -0
  9. package/dist/cdn/embed-hn0r8fmg.js +10 -0
  10. package/dist/cdn/embed-n7jskdxd.js +44 -0
  11. package/dist/cdn/embed-q6y6vgv1.js +5 -0
  12. package/dist/cdn/embed-sgjh2kg2.js +83 -0
  13. package/dist/cdn/embed-we24qtes.js +2 -0
  14. package/dist/cdn/google-qha5xyx4.js +14 -0
  15. package/dist/cdn/index-11c9cspb.js +1 -0
  16. package/dist/cdn/index-e5entetm.js +1 -0
  17. package/dist/cdn/index-kk9hgxdc.js +1 -0
  18. package/dist/cdn/index-zrmby2xc.js +9 -0
  19. package/dist/cdn/mistral-16bekg8b.js +3 -0
  20. package/dist/cdn/models.json +1 -0
  21. package/dist/cdn/murmur-5vkc01ns.js +5 -0
  22. package/dist/cdn/murmur.js +204 -0
  23. package/dist/cdn/openai-compatible-za7hc1fv.js +11 -0
  24. package/dist/cdn/openai-dhy4fp4c.js +18 -0
  25. package/dist/cdn/retriever-k9mmdcz5.js +1 -0
  26. package/dist/cli.js +272 -0
  27. package/dist/lib/chunks/chunk-kaeec41p.js +18 -0
  28. package/dist/lib/chunks/index-1zk822m5.js +72 -0
  29. package/dist/lib/chunks/index-6re28wc1.js +46 -0
  30. package/dist/lib/chunks/index-fp1p1byg.js +0 -0
  31. package/dist/lib/chunks/index-fs6gmhz9.js +81 -0
  32. package/dist/lib/chunks/index-v9expxwm.js +1151 -0
  33. package/dist/lib/chunks/index-z8pn9sdj.js +43 -0
  34. package/dist/lib/chunks/murmur-wq1d15n7.js +9 -0
  35. package/dist/lib/chunks/retriever-1rw4z2n6.js +8 -0
  36. package/dist/lib/embed.js +67 -0
  37. package/dist/lib/index.js +45 -0
  38. package/dist/lib/indexer/index.js +108 -0
  39. package/dist/lib/llm/index.js +55 -0
  40. package/dist/lib/rag/index.js +39 -0
  41. package/dist/lib/widget/index.js +22 -0
  42. package/dist/types/core/murmur.d.ts +48 -0
  43. package/dist/types/embed.d.ts +6 -0
  44. package/dist/types/index.d.ts +2 -0
  45. package/dist/types/indexer/extract.d.ts +16 -0
  46. package/dist/types/indexer/files.d.ts +4 -0
  47. package/dist/types/indexer/index.d.ts +33 -0
  48. package/dist/types/llm/index.d.ts +31 -0
  49. package/dist/types/rag/chunk.d.ts +28 -0
  50. package/dist/types/rag/ground.d.ts +12 -0
  51. package/dist/types/rag/index.d.ts +4 -0
  52. package/dist/types/rag/retriever.d.ts +18 -0
  53. package/dist/types/rag/types.d.ts +28 -0
  54. package/dist/types/widget/element.d.ts +54 -0
  55. package/dist/types/widget/i18n.d.ts +48 -0
  56. package/dist/types/widget/icons.d.ts +4 -0
  57. package/dist/types/widget/index.d.ts +13 -0
  58. package/dist/types/widget/markdown.d.ts +8 -0
  59. package/dist/types/widget/session.d.ts +66 -0
  60. package/dist/types/widget/styles.d.ts +6 -0
  61. package/package.json +114 -4
@@ -0,0 +1,5 @@
1
+ import{Ct}from"./embed-n7jskdxd.js";import{It}from"./embed-we24qtes.js";import{Ye,qt,Nt,Lt}from"./embed-2xm309sb.js";function M(e,n){let t=[...n].reverse().find((s)=>s.role==="user");return Ye(e)<12&&t?`${t.content} ${e}`:e}function w(e){let n=e.retriever??(e.index?It(e.index):null)??(()=>{throw Error("murmur: pass `index` or `retriever`.")})();return{retriever:n,async ask(t,{history:s=[],signal:u}={}){let i={};if(e.limit!==void 0)i.limit=e.limit;if(e.budgetTokens!==void 0)i.budgetTokens=e.budgetTokens;let o=await n.search(M(t,s),i),d=[e.instructions?.trim(),Nt(e.language),o.length?`Sources:
2
+
3
+ ${qt(o)}`:"Sources: none matched this question. Say you could not find it on this site."].filter(Boolean).join(`
4
+
5
+ `),g=[...s.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=Ct({model:f,instructions:d,messages:g,onError:()=>{},...u?{abortSignal:u}:{}}),a="",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;a+=r.text,yield r.text}c({text:a,cited:Lt(a,o.length)})}catch(r){throw m(r),r}}return{passages:o,textStream:y(),done:l}}}}export{w as createMurmur};
@@ -0,0 +1,204 @@
1
+ import{G,gn,kt}from"./embed-2xm309sb.js";gn(import.meta.url,["dehtcj0y","11c9cspb","e0j28zmb","zrmby2xc","5vkc01ns","k9mmdcz5","e5entetm","2xm309sb","hn0r8fmg","q6y6vgv1","n7jskdxd","we24qtes","t87kf8t0","dhy4fp4c","w7nkjk5e","qha5xyx4","16bekg8b","za7hc1fv","kk9hgxdc","sgjh2kg2","59r4jck6"],[["./murmur.js",7],["./index-11c9cspb.js",8],["./chunk-e0j28zmb.js",9],["./index-zrmby2xc.js",9],["./murmur-5vkc01ns.js",10,11,7],["./retriever-k9mmdcz5.js",11],["./index-e5entetm.js",8],["./embed-2xm309sb.js"],["./embed-hn0r8fmg.js",7],["./embed-q6y6vgv1.js"],["./embed-n7jskdxd.js",7,19],["./embed-we24qtes.js",7],["./browser-t87kf8t0.js"],["./openai-dhy4fp4c.js",8,7,19],["./anthropic-w7nkjk5e.js",8,20,19],["./google-qha5xyx4.js",8,20,19],["./mistral-16bekg8b.js",8,19],["./openai-compatible-za7hc1fv.js",8,19],["./index-kk9hgxdc.js",10],["./embed-sgjh2kg2.js"],["./embed-59r4jck6.js",19]],0);
2
+ var D={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:"This site lets you use your own AI key. It stays in your browser, encrypted, and is only sent 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"},J={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:"Ce site vous laisse utiliser votre propre clé d'IA. Elle reste dans votre navigateur, chiffrée, et n'est envoyée qu'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"},F={en:D,fr:J};function V(...e){for(let i of e){let n=i?.toLowerCase().split(/[-_]/)[0];if(n&&n in F)return n}return"en"}function P(e,i={}){return{...F[e]??D,...i}}var Z={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 R(e,i){let n=e.createElement("template");return n.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">${Z[i]??""}</svg>`,n.content.firstElementChild}var Q=/^(https?:\/\/|\/|#|\.\/|mailto:)/i;function k(e,i,n,t){let s=/(`[^`]+`)|(\*\*[^*]+\*\*)|(\*[^*\s][^*]*\*|_[^_\s][^_]*_)|(\[[^\]]+\]\([^)\s]+\))|(\[\d{1,2}\])/g,a=0;for(let c of i.matchAll(s)){let p=c.index??0;if(p>a)t.appendChild(e.createTextNode(i.slice(a,p)));a=p+c[0].length;let o=c[0];if(c[1]){let l=e.createElement("code");l.textContent=o.slice(1,-1),t.appendChild(l)}else if(c[2]){let l=e.createElement("strong");k(e,o.slice(2,-2),n,l),t.appendChild(l)}else if(c[3]){let l=e.createElement("em");k(e,o.slice(1,-1),n,l),t.appendChild(l)}else if(c[4]){let l=o.indexOf("]("),d=o.slice(1,l),u=o.slice(l+2,-1);if(Q.test(u)){let h=e.createElement("a");if(h.href=u,h.textContent=d,/^https?:/i.test(u))h.target="_blank",h.rel="noopener noreferrer";t.appendChild(h)}else t.appendChild(e.createTextNode(d))}else{let l=n(Number(o.slice(1,-1)));t.appendChild(l??e.createTextNode(o))}}if(a<i.length)t.appendChild(e.createTextNode(i.slice(a)))}function j(e,i,n){let t=e.ownerDocument,s=t.createDocumentFragment(),a=i.replace(/\r\n?/g,`
3
+ `).split(`
4
+ `),c=[],p=null,o=()=>{if(!c.length)return;let d=t.createElement("p");k(t,c.join(" "),n,d),s.appendChild(d),c=[]},l=()=>{p=null};for(let d=0;d<a.length;d++){let u=a[d]??"";if(/^\s*```/.exec(u)){o(),l();let m=[];for(d++;d<a.length&&!/^\s*```/.test(a[d]??"");d++)m.push(a[d]??"");let x=t.createElement("pre"),M=t.createElement("code");M.textContent=m.join(`
5
+ `),x.appendChild(M),s.appendChild(x);continue}let b=/^\s*(?:([-*+])|(\d+)[.)])\s+(.*)$/.exec(u);if(b){o();let m=b[1]?"ul":"ol";if(!p||p.tagName.toLowerCase()!==m)p=t.createElement(m),s.appendChild(p);let x=t.createElement("li");k(t,b[3]??"",n,x),p.appendChild(x);continue}let f=/^\s*#{1,6}\s+(.*)$/.exec(u);if(f){o(),l();let m=t.createElement("p"),x=t.createElement("strong");k(t,f[1]??"",n,x),m.appendChild(x),s.appendChild(m);continue}if(!u.trim()){o(),l();continue}if(p&&/^\s{2,}\S/.test(u)){let m=p.lastElementChild;if(m){m.appendChild(t.createTextNode(" ")),k(t,u.trim(),n,m);continue}}l(),c.push(u.trim())}o(),e.replaceChildren(s)}class O{options;turns=[];engine=null;storePromise=null;historyKey;constructor(e){this.options=e;this.historyKey=`${e.storageKey??"murmur"}-chat:${location.pathname.split("/")[1]??""}`;try{let i=sessionStorage.getItem(this.historyKey);if(i)this.turns=JSON.parse(i)}catch{this.turns=[]}}get mode(){if(this.options.model)return"custom";return this.options.llm?.endpoint?"proxy":"visitor"}persist(){try{sessionStorage.setItem(this.historyKey,JSON.stringify(this.turns.slice(-30)))}catch{}}clear(){this.turns=[],this.persist()}store(){return this.storePromise??=(G("11c9cspb"),import("./index-11c9cspb.js")).then((e)=>{let i={};if(this.options.catalogUrl)i.catalogUrl=this.options.catalogUrl;if(this.options.storageKey)i.storageKey=this.options.storageKey;return e.visitorStore(this.options.llm??{},i)}),this.storePromise}async settings(){if(this.mode==="custom")return null;let e=await (G("11c9cspb"),import("./index-11c9cspb.js"));return e.resolveSettings(this.options.llm??{},this.mode==="visitor"?await this.store():null)}async needsSetup(){return this.mode==="visitor"&&!await this.settings()}async loadIndex(){let{index:e}=this.options;if(e&&typeof e!=="string")return e;let{isMurmurIndex:i}=await (G("e0j28zmb"),import("./chunk-e0j28zmb.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(!i(s))throw Error("murmur: not a murmur index");return s}let{indexDocument:n}=await (G("zrmby2xc"),import("./index-zrmby2xc.js"));return n(document,location.pathname+location.search)}createEngine(){return(async()=>{let[{createMurmur:e},i]=await Promise.all([(G("5vkc01ns"),import("./murmur-5vkc01ns.js")),this.options.retriever??(G("k9mmdcz5"),import("./retriever-k9mmdcz5.js")).then(async(s)=>s.bm25Retriever(await this.loadIndex()))]),n=this.options.model??(async()=>{let s=await this.settings();if(!s)throw new C;let{loadModel:a}=await (G("11c9cspb"),import("./index-11c9cspb.js"));return a(s)}),t={retriever:i,model:n};if(this.options.instructions)t.instructions=this.options.instructions;if(this.options.lang)t.language=this.options.lang;return e(t)})()}async ask(e,i,n){let t=this.turns.filter((a)=>!a.error).map(({role:a,content:c})=>({role:a,content:c}));this.turns.push({role:"user",content:e});let s={role:"assistant",content:""};this.turns.push(s);try{this.engine??=this.createEngine();let c=await(await this.engine.catch((p)=>{throw this.engine=null,p})).ask(e,{history:t,signal:n});s.passages=c.passages.map(({url:p,anchor:o,title:l,heading:d})=>({url:p,anchor:o,title:l,heading:d}));for await(let p of c.textStream)s.content+=p,i(s.content,s);s.cited=(await c.done).cited}catch(a){if(n.aborted)s.cited=[];else if(a instanceof C)throw this.turns.splice(-2,2),a;else s.error=await this.describe(a)}finally{this.persist()}return s}async describe(e){try{let{describeError:i}=await (G("11c9cspb"),import("./index-11c9cspb.js")),n=this.mode==="custom"?null:await this.settings(),t=i(e,n?.apiKey);return`${t.code}|${t.message}`}catch{return`unknown|${e instanceof Error?e.message:String(e)}`}}}class C extends Error{constructor(){super("murmur: no model set up")}}var U=`
6
+ :host {
7
+ --accent: var(--murmur-accent, #211c17);
8
+ --accent-ink: var(--murmur-accent-ink, #f6efe0);
9
+ --lamp: var(--murmur-lamp, #e0a032);
10
+ --surface: #fbf8f1;
11
+ --raised: #f2ece0;
12
+ --ink: #211c17;
13
+ --muted: #675c4f;
14
+ --line: #e2d8c5;
15
+ --focus: #b4541d;
16
+ --danger: #a1301f;
17
+ --radius: var(--murmur-radius, 16px);
18
+ --shadow: 0 18px 48px -12px rgb(33 28 23 / 0.28), 0 4px 12px -4px rgb(33 28 23 / 0.16);
19
+ --ease: cubic-bezier(0.16, 1, 0.3, 1);
20
+ all: initial;
21
+ position: fixed;
22
+ z-index: var(--murmur-z, 2147483000);
23
+ inset: auto 20px 20px auto;
24
+ font-family: var(--murmur-font, inherit);
25
+ font-size: 15px;
26
+ line-height: 1.5;
27
+ color: var(--ink);
28
+ color-scheme: light;
29
+ -webkit-font-smoothing: antialiased;
30
+ }
31
+ :host([position="bottom-left"]) { inset: auto auto 20px 20px; }
32
+ :host([inline]) { position: relative; inset: auto; z-index: auto; display: block; height: 100%; }
33
+ :host([theme="dark"]) { --surface: #1c1814; --raised: #26211b; --ink: #f2ead9; --muted: #b8ab95; --line: #3b342b; --focus: #f0a35c; --danger: #f08a73; color-scheme: dark; }
34
+ @media (prefers-color-scheme: dark) {
35
+ :host(:not([theme="light"])) { --surface: #1c1814; --raised: #26211b; --ink: #f2ead9; --muted: #b8ab95; --line: #3b342b; --focus: #f0a35c; --danger: #f08a73; color-scheme: dark; }
36
+ :host(:not([theme="light"])) { --murmur-accent-default: #f2ead9; }
37
+ }
38
+ @media print { :host { display: none !important; } }
39
+ * { box-sizing: border-box; }
40
+ [hidden] { display: none !important; }
41
+ ::selection { background: color-mix(in oklab, var(--lamp) 45%, transparent); color: inherit; }
42
+ button, input, select, textarea { font: inherit; color: inherit; }
43
+ button { cursor: pointer; }
44
+ :focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
45
+ a { color: inherit; text-underline-offset: 0.2em; text-decoration-thickness: 1px; }
46
+
47
+ /* Launcher */
48
+ .launcher {
49
+ display: inline-flex; align-items: center; gap: 10px;
50
+ height: 52px; padding: 0 20px 0 16px; border: 0; border-radius: 26px;
51
+ background: var(--accent); color: var(--accent-ink);
52
+ box-shadow: var(--shadow); font-weight: 600; letter-spacing: 0.01em;
53
+ transition: transform 220ms var(--ease), box-shadow 220ms var(--ease);
54
+ }
55
+ .launcher:hover { transform: translateY(-2px); }
56
+ .launcher:active { transform: translateY(0); }
57
+ .launcher[aria-expanded="true"] { display: none; }
58
+ .lamp {
59
+ width: 8px; height: 8px; border-radius: 50%; flex: none;
60
+ background: var(--lamp); box-shadow: 0 0 0 3px color-mix(in oklab, var(--lamp) 28%, transparent);
61
+ }
62
+ .lamp.off { background: transparent; box-shadow: inset 0 0 0 1.5px var(--muted); }
63
+ .lamp.busy { animation: blink 1.1s steps(2, jump-none) infinite; }
64
+ @keyframes blink { 50% { opacity: 0.25; } }
65
+
66
+ /* Panel */
67
+ .panel {
68
+ position: absolute; right: 0; bottom: 0;
69
+ display: flex; flex-direction: column;
70
+ width: min(400px, calc(100vw - 40px)); height: min(640px, calc(100dvh - 40px));
71
+ background: var(--surface); border-radius: var(--radius); box-shadow: var(--shadow);
72
+ overflow: hidden; transform-origin: bottom right;
73
+ animation: rise 320ms var(--ease);
74
+ }
75
+ :host([position="bottom-left"]) .panel { right: auto; left: 0; transform-origin: bottom left; }
76
+ :host([inline]) .panel { position: static; width: 100%; height: 100%; box-shadow: none; animation: none; border-radius: inherit; }
77
+ @keyframes rise { from { opacity: 0; transform: translateY(12px) scale(0.98); } }
78
+ @media (max-width: 480px) {
79
+ :host(:not([inline])) { inset: auto 12px 12px auto; }
80
+ :host(:not([inline])[position="bottom-left"]) { inset: auto auto 12px 12px; }
81
+ :host(:not([inline])) .panel { position: fixed; inset: 0; width: 100%; height: 100dvh; border-radius: 0; }
82
+ }
83
+
84
+ header {
85
+ display: flex; align-items: center; gap: 10px;
86
+ padding: 14px 10px 14px 18px; background: var(--accent); color: var(--accent-ink);
87
+ }
88
+ header h2 { flex: 1; margin: 0; font-size: 16px; font-weight: 650; letter-spacing: 0.005em; line-height: 1.25; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
89
+ .icon-btn {
90
+ display: inline-grid; place-items: center; width: 36px; height: 36px; flex: none;
91
+ border: 0; border-radius: 10px; background: transparent; color: inherit;
92
+ transition: background 160ms;
93
+ }
94
+ .icon-btn:hover { background: color-mix(in oklab, currentColor 14%, transparent); }
95
+ header .icon-btn:focus-visible { outline-color: var(--accent-ink); }
96
+
97
+ /* Conversation */
98
+ .log {
99
+ flex: 1; overflow-y: auto; overscroll-behavior: contain;
100
+ padding: 18px 18px 8px; display: flex; flex-direction: column; gap: 16px;
101
+ scrollbar-width: thin; scrollbar-color: var(--line) transparent;
102
+ }
103
+ .msg { max-width: 100%; overflow-wrap: anywhere; }
104
+ .msg p { margin: 0 0 0.6em; }
105
+ .msg p:last-child { margin-bottom: 0; }
106
+ .msg ul, .msg ol { margin: 0 0 0.6em; padding-left: 1.3em; }
107
+ .msg li + li { margin-top: 0.2em; }
108
+ .msg code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.88em; background: var(--raised); padding: 0.1em 0.35em; border-radius: 5px; }
109
+ .msg pre { margin: 0 0 0.6em; padding: 10px 12px; background: var(--raised); border-radius: 10px; overflow-x: auto; }
110
+ .msg pre code { background: none; padding: 0; }
111
+ .user {
112
+ align-self: flex-end; max-width: 85%;
113
+ padding: 9px 14px; border-radius: 16px 16px 4px 16px;
114
+ background: var(--accent); color: var(--accent-ink); white-space: pre-wrap;
115
+ }
116
+ .bot { align-self: stretch; }
117
+ .greeting { color: var(--muted); }
118
+
119
+ .cite {
120
+ display: inline-grid; place-items: center; min-width: 1.45em; height: 1.45em; padding: 0 0.3em;
121
+ margin: 0 0.1em; vertical-align: 0.12em;
122
+ border-radius: 1em; box-shadow: inset 0 0 0 1.25px currentColor;
123
+ font-size: 0.72em; font-weight: 700; line-height: 1; text-decoration: none;
124
+ font-variant-numeric: tabular-nums; color: var(--muted);
125
+ transition: background 160ms, color 160ms;
126
+ }
127
+ .cite:hover, .cite:focus-visible { background: var(--lamp); color: #211c17; box-shadow: none; }
128
+
129
+ .sources { margin: 12px 0 0; padding: 0; list-style: none; display: grid; gap: 2px; }
130
+ .sources-label { margin: 18px 0 2px; font-size: 12px; font-weight: 650; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); }
131
+ .sources a {
132
+ display: grid; grid-template-columns: auto 1fr; align-items: baseline; gap: 10px;
133
+ padding: 7px 10px; margin: 0 -10px; border-radius: 10px; text-decoration: none;
134
+ }
135
+ .sources a:hover { background: var(--raised); }
136
+ .sources .cite { margin: 0; }
137
+ .sources .where { min-width: 0; font-size: 14px; line-height: 1.35; }
138
+ .sources .where span { color: var(--muted); }
139
+
140
+ .status { display: flex; align-items: center; gap: 10px; color: var(--muted); font-size: 14px; }
141
+ .error { color: var(--danger); }
142
+ .error p { margin: 0 0 8px; }
143
+ .text-btn {
144
+ display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; border-radius: 9px;
145
+ border: 0; background: var(--raised); color: var(--ink); font-size: 14px; font-weight: 600;
146
+ }
147
+ .text-btn:hover { background: var(--line); }
148
+
149
+ /* Composer */
150
+ form.composer {
151
+ display: flex; align-items: flex-end; gap: 8px; margin: 8px 12px 0; padding: 6px 6px 6px 14px;
152
+ border-radius: 14px; background: var(--raised);
153
+ box-shadow: inset 0 0 0 1px var(--line); transition: box-shadow 160ms;
154
+ }
155
+ form.composer:focus-within { box-shadow: inset 0 0 0 1.5px var(--focus); }
156
+ textarea {
157
+ flex: 1; min-height: 38px; max-height: 140px; padding: 8px 0; resize: none;
158
+ border: 0; background: transparent; outline: none; line-height: 1.4;
159
+ }
160
+ textarea:focus-visible { outline: none; }
161
+ textarea::placeholder, input::placeholder { color: var(--muted); opacity: 1; }
162
+ .send {
163
+ display: inline-grid; place-items: center; width: 38px; height: 38px; flex: none;
164
+ border: 0; border-radius: 10px; background: var(--accent); color: var(--accent-ink);
165
+ transition: opacity 160ms;
166
+ }
167
+ .send:disabled { opacity: 0.35; cursor: default; }
168
+ footer { padding: 8px 18px 12px; font-size: 12px; color: var(--muted); text-align: center; }
169
+ footer a { text-decoration: none; }
170
+ footer a:hover { text-decoration: underline; }
171
+
172
+ /* Settings */
173
+ .setup { flex: 1; overflow-y: auto; padding: 18px; display: grid; gap: 16px; align-content: start; }
174
+ .setup p.intro { margin: 0; color: var(--muted); font-size: 14px; }
175
+ .field { display: grid; gap: 6px; }
176
+ .field > span { font-size: 13px; font-weight: 650; }
177
+ .field small { color: var(--muted); font-size: 12.5px; }
178
+ .field input:not([type="checkbox"]), .field select {
179
+ width: 100%; height: 40px; padding: 0 12px; border-radius: 10px;
180
+ border: 0; background: var(--raised); box-shadow: inset 0 0 0 1px var(--line);
181
+ }
182
+ .field input:focus-visible, .field select:focus-visible { outline: none; box-shadow: inset 0 0 0 1.5px var(--focus); }
183
+ .check { display: flex; align-items: center; gap: 10px; font-size: 14px; }
184
+ .check input { width: 18px; height: 18px; accent-color: var(--accent); margin: 0; }
185
+ .presets { display: flex; gap: 8px; flex-wrap: wrap; }
186
+ .row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
187
+ .primary {
188
+ display: inline-flex; align-items: center; justify-content: center; gap: 8px;
189
+ height: 42px; padding: 0 18px; border: 0; border-radius: 11px;
190
+ background: var(--accent); color: var(--accent-ink); font-weight: 650;
191
+ }
192
+ .primary:disabled { opacity: 0.4; cursor: default; }
193
+ .result { font-size: 14px; }
194
+ .result.ok { color: inherit; }
195
+ .result.ok::before { content: ""; display: inline-block; width: 8px; height: 8px; margin-right: 8px; border-radius: 50%; background: var(--lamp); }
196
+ .result.fail { color: var(--danger); }
197
+ .link-btn { padding: 0; border: 0; background: none; color: var(--muted); font-size: 13px; text-decoration: underline; text-underline-offset: 0.2em; justify-self: start; }
198
+
199
+ .sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
200
+
201
+ @media (prefers-reduced-motion: reduce) {
202
+ *, .panel { animation: none !important; transition: none !important; }
203
+ }
204
+ `;var X={auth:"errorAuth","auth-or-network":"errorNetwork","rate-limit":"errorRate",overloaded:"errorRate"};class K extends HTMLElement{options={};session=null;t=P("en");root;launcher;panel;log;chatView;setupView;input;sendBtn;settingsBtn;controller=null;built=!1;unsubscribe=null;constructor(){super();this.root=this.attachShadow({mode:"open"})}configure(e){if(this.options={...this.options,...e},this.isConnected)this.build();return this}get isOpen(){return this.hasAttribute("inline")||this.launcher?.getAttribute("aria-expanded")==="true"}connectedCallback(){this.build()}disconnectedCallback(){this.controller?.abort(),this.unsubscribe?.()}async open(){if(!this.built)this.build();this.launcher.setAttribute("aria-expanded","true"),this.panel.hidden=!1,this.session?.persist(),sessionStorage.setItem(this.openKey,"1"),this.input.focus()}close(){if(this.hasAttribute("inline"))return;this.launcher.setAttribute("aria-expanded","false"),this.panel.hidden=!0,sessionStorage.removeItem(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,i=V(e.lang,document.documentElement.lang,navigator.language),n={...e.messages};if(this.t=P(i,n),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=U,this.launcher=r(t,"button",{class:"launcher",type:"button","aria-expanded":"false"}),this.launcher.setAttribute("aria-controls","murmur-panel"),this.launcher.append(r(t,"span",{class:"lamp","aria-hidden":"true"}),v(t,"span",this.t.open)),this.launcher.addEventListener("click",()=>void this.open()),this.panel=r(t,"section",{class:"panel",id:"murmur-panel",role:"dialog"}),this.panel.setAttribute("aria-label",this.t.title),this.panel.hidden=!this.hasAttribute("inline"),this.panel.addEventListener("keydown",(h)=>{if(h.key==="Escape")this.close()});let a=r(t,"header"),c=v(t,"h2",this.t.title),p=N(t,"reset",this.t.newChat);p.addEventListener("click",()=>{this.controller?.abort(),this.session?.clear(),this.renderChat(),this.input.focus()}),this.settingsBtn=N(t,"settings",this.t.settings),this.settingsBtn.hidden=!!e.model||!!e.llm?.endpoint,this.settingsBtn.addEventListener("click",()=>void this.showSetup());let o=N(t,"close",this.t.close);o.hidden=this.hasAttribute("inline"),o.addEventListener("click",()=>this.close()),a.append(c,p,this.settingsBtn,o),this.chatView=r(t,"div",{class:"chat"}),this.chatView.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0",this.log=r(t,"div",{class:"log",role:"log","aria-live":"polite","aria-relevant":"additions"});let l=r(t,"form",{class:"composer"});this.input=r(t,"textarea",{rows:"1",placeholder:this.t.placeholder}),this.input.setAttribute("aria-label",this.t.placeholder),this.input.addEventListener("input",()=>this.autosize()),this.input.addEventListener("keydown",(h)=>{if(h.key==="Enter"&&!h.shiftKey&&!h.isComposing)h.preventDefault(),this.submit()}),this.sendBtn=r(t,"button",{class:"send",type:"submit"}),this.setSendMode("send"),l.addEventListener("submit",(h)=>{if(h.preventDefault(),this.controller)this.controller.abort();else this.submit()}),l.append(this.input,this.sendBtn);let d=r(t,"footer"),u=r(t,"a",{href:"https://maxgfr.github.io/murmur/",target:"_blank",rel:"noopener"});if(u.textContent=this.t.poweredBy,d.append(u),this.chatView.append(this.log,l,d),this.setupView=r(t,"div",{class:"setup"}),this.setupView.hidden=!0,this.panel.append(a,this.chatView,this.setupView),this.root.replaceChildren(s,this.launcher,this.panel),this.hasAttribute("inline"))this.launcher.hidden=!0;if(this.built=!0,this.session=new O({...e,lang:i}),this.renderChat(),e.open||!this.hasAttribute("inline")&&sessionStorage.getItem(this.openKey))this.open()}autosize(){this.input.style.height="auto",this.input.style.height=`${Math.min(this.input.scrollHeight,140)}px`}setSendMode(e){this.sendBtn.replaceChildren(R(this.ownerDocument,e)),this.sendBtn.setAttribute("aria-label",e==="send"?this.t.send:this.t.stop)}emit(e){this.dispatchEvent(new CustomEvent("murmur:state",{detail:e,bubbles:!0,composed:!0}))}renderChat(){let e=this.ownerDocument,i=this.session?.turns??[],n=[],t=r(e,"div",{class:"msg bot greeting"});t.append(v(e,"p",this.t.greeting)),n.push(t);for(let s of i)n.push(this.turnNode(s));this.log.replaceChildren(...n),this.log.scrollTop=this.log.scrollHeight}turnNode(e){let i=this.ownerDocument;if(e.role==="user"){let t=r(i,"div",{class:"msg user"});return t.textContent=e.content,t}let n=r(i,"div",{class:"msg bot"});return this.fillAnswer(n,e,!0),n}fillAnswer(e,i,n){let t=this.ownerDocument;if(i.error){let[o="unknown",...l]=i.error.split("|"),d=X[o],u=r(t,"div",{class:"error",role:"alert"});u.append(v(t,"p",d?this.t[d]:`${this.t.errorOther} ${l.join("|")}`));let h=r(t,"div",{class:"row"}),b=r(t,"button",{class:"text-btn",type:"button"});if(b.textContent=this.t.retry,b.addEventListener("click",()=>{let f=this.session?.turns??[],m=f.at(-2)?.content??"";if(f.splice(-2,2),this.renderChat(),m)this.ask(m)}),h.append(b),o==="auth"||o==="auth-or-network"){if(!this.settingsBtn.hidden){let f=r(t,"button",{class:"text-btn",type:"button"});f.textContent=this.t.settings,f.addEventListener("click",()=>void this.showSetup()),h.append(f)}}u.append(h),e.replaceChildren(u);return}let s=i.passages??[],a=r(t,"div");j(a,i.content,(o)=>{let l=s[o-1];if(!l)return null;let d=r(t,"a",{class:"cite",href:kt(l)});return d.textContent=String(o),d.setAttribute("aria-label",`${this.t.sources} ${o}: ${l.title}`),d});let c=[a];if(n&&!i.content.trim()&&!s.length){let o=r(t,"p",{class:"status"});o.append(r(t,"span",{class:"lamp off","aria-hidden":"true"}),t.createTextNode(this.t.notFound)),c.push(o)}let p=i.cited??[];if(n&&p.length){c.push(v(t,"p",this.t.sources,"sources-label"));let o=r(t,"ol",{class:"sources"});for(let l of p){let d=s[l-1];if(!d)continue;let u=r(t,"li"),h=r(t,"a",{href:kt(d)}),b=v(t,"span",String(l),"cite");b.setAttribute("aria-hidden","true");let f=r(t,"span",{class:"where"});if(f.append(t.createTextNode(d.title||d.url)),d.heading&&d.heading!==d.title)f.append(v(t,"span",` › ${d.heading}`));h.append(b,f),u.append(h),o.append(u)}c.push(o)}e.replaceChildren(...c)}async submit(){let e=this.input.value.trim();if(!e||this.controller||!this.session)return;if(await this.session.needsSetup()){await this.showSetup(e);return}let i=this.ownerDocument;this.input.value="",this.autosize(),this.log.append(this.turnNode({role:"user",content:e}));let n=r(i,"div",{class:"msg bot"}),t=r(i,"p",{class:"status"});t.append(r(i,"span",{class:"lamp busy","aria-hidden":"true"}),i.createTextNode(this.t.thinking)),n.append(t),this.log.append(n),this.log.scrollTop=this.log.scrollHeight,this.log.setAttribute("aria-busy","true");let s=new AbortController;this.controller=s,this.setSendMode("stop"),this.emit({state:"searching"});let a=!1;try{let c=await this.session.ask(e,(p,o)=>{if(!a)a=!0,this.emit({state:"streaming",passages:o.passages??[]});let l=this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<40;if(this.fillAnswer(n,o,!1),l)this.log.scrollTop=this.log.scrollHeight},s.signal);this.fillAnswer(n,c,!0),this.emit(c.error?{state:"error"}:{state:"done",passages:c.passages??[],cited:c.cited??[]})}catch(c){if(n.remove(),this.log.lastElementChild?.remove(),this.emit({state:"idle"}),c instanceof C)await this.showSetup(e);else throw c}finally{this.controller=null,this.setSendMode("send"),this.log.setAttribute("aria-busy","false"),this.log.scrollTop=this.log.scrollHeight}}async showSetup(e){if(!this.session)return;let i=this.ownerDocument,n=await this.session.store();await n.load(),n.open(),this.chatView.hidden=!0,this.setupView.hidden=!1;let t=this.t,s=r(i,"button",{class:"link-btn",type:"button"});s.textContent=t.back,s.addEventListener("click",()=>this.hideSetup());let a=v(i,"h3",t.setupTitle);a.style.cssText="margin:0;font-size:17px;font-weight:650";let c=v(i,"p",t.setupIntro,"intro"),p=W(i,t.local),o=L(i,t.provider,r(i,"select")),l=o.control,d=L(i,t.model,r(i,"select")),u=d.control,h=L(i,t.endpoint,r(i,"input",{type:"url",inputmode:"url"}),t.localHint),b=h.control,f=L(i,t.model,r(i,"input",{type:"text",autocomplete:"off"})),m=f.control,x=r(i,"div",{class:"presets"});for(let g of["ollama","lmstudio"]){let y=r(i,"button",{class:"text-btn",type:"button"});y.textContent=g==="ollama"?"Ollama":"LM Studio",y.addEventListener("click",async()=>{let{ENDPOINT_PRESETS:w}=await (G("e5entetm"),import("./index-e5entetm.js"));n.applyPreset(w[g])}),x.append(y)}let M=L(i,t.apiKey,r(i,"input",{type:"password",autocomplete:"off",spellcheck:"false"}),t.apiKeyHint),S=M.control,T=W(i,t.remember),E=r(i,"button",{class:"text-btn",type:"button"});E.textContent=t.test;let H=r(i,"p",{class:"result",role:"status"});H.style.margin="0";let A=r(i,"button",{class:"primary",type:"button"});A.textContent=t.save;let I=r(i,"button",{class:"link-btn",type:"button"});I.textContent=t.forget,p.input.addEventListener("change",()=>n.toggleCustom(p.input.checked)),l.addEventListener("change",()=>n.selectProvider(l.value)),u.addEventListener("change",()=>n.selectModel(u.value)),b.addEventListener("input",()=>n.setEndpoint(b.value)),m.addEventListener("input",()=>n.setCustomModel(m.value)),S.addEventListener("input",()=>n.setApiKey(S.value)),T.input.addEventListener("change",()=>n.setRememberKey(T.input.checked)),E.addEventListener("click",()=>void n.test()),A.addEventListener("click",async()=>{if(!(await n.save()).ok)return;if(this.hideSetup(),e)this.input.value=e,this.submit()}),I.addEventListener("click",()=>void n.clear());let z=r(i,"div",{class:"row"});z.append(E,H),this.setupView.replaceChildren(s,a,c,p.label,o.label,d.label,x,h.label,f.label,M.label,T.label,z,A,I);let Y=(g)=>{let y=g.draft.custom;if(p.input.checked=y,o.label.hidden=y,d.label.hidden=y,x.hidden=!y,h.label.hidden=!y,f.label.hidden=!y,g.catalogStatus==="ready")ee(i,l,g,t),te(i,u,g);else l.replaceChildren(B(i,"",g.catalogStatus==="error"?t.catalogError:t.loadingCatalog)),u.replaceChildren();if(b!==this.root.activeElement)b.value=g.draft.customEndpoint;if(m!==this.root.activeElement)m.value=g.draft.customModel;if(S!==this.root.activeElement)S.value=g.apiKey;T.input.checked=g.draft.rememberKey,E.disabled=!g.canTest||g.testing,E.textContent=g.testing?t.testing:t.test,A.disabled=!g.canSave;let w=g.testResult;H.className=w?w.ok?"result ok":"result fail":"result",H.textContent=!w?"":w.ok?t.testOk:`${t.testFail} ${w.reason}${w.message?` (${w.message})`:""}`};this.unsubscribe?.(),this.unsubscribe=n.subscribe(Y),(n.getState().draft.custom?b:l).focus()}hideSetup(){this.unsubscribe?.(),this.unsubscribe=null,this.setupView.hidden=!0,this.chatView.hidden=!1,this.input.focus()}}function ee(e,i,n,t){let s=[[t.recommended,n.providers.recommended],[t.otherProviders,n.providers.others]],a=`${n.draft.providerId}|${n.providers.recommended.length+n.providers.others.length}`;if(i.dataset.sig===a)return;i.dataset.sig=a,i.replaceChildren(...s.filter(([,c])=>c.length).map(([c,p])=>{let o=e.createElement("optgroup");return o.label=c,o.append(...p.map((l)=>B(e,l.id,l.name))),o})),i.value=n.draft.providerId}function te(e,i,n){let t=`${n.draft.providerId}|${n.draft.model}|${n.models.length}`;if(i.dataset.sig===t)return;i.dataset.sig=t;let s=n.recommendedModel?.id;i.replaceChildren(...n.models.map((a)=>B(e,a.id,a.id===s?`${a.name} ★`:a.name))),i.value=n.draft.model}function r(e,i,n={}){let t=e.createElement(i);for(let[s,a]of Object.entries(n))t.setAttribute(s,a);return t}function v(e,i,n,t){let s=e.createElement(i);if(s.textContent=n,t)s.className=t;return s}function B(e,i,n){let t=e.createElement("option");return t.value=i,t.textContent=n,t}function N(e,i,n){let t=r(e,"button",{class:"icon-btn",type:"button",title:n});return t.setAttribute("aria-label",n),t.append(R(e,i)),t}function L(e,i,n,t){let s=r(e,"label",{class:"field"});if(s.append(v(e,"span",i),n),t)s.append(v(e,"small",t));return{label:s,control:n}}function W(e,i){let n=r(e,"label",{class:"check"}),t=r(e,"input",{type:"checkbox"});return n.append(t,e.createTextNode(i)),{label:n,input:t}}function ne(e="murmur-chat"){if(!customElements.get(e))customElements.define(e,class extends K{});return customElements.get(e)}function _(e={}){ne();let{target:i,inline:n,...t}=e,s=document.createElement("murmur-chat");if(n)s.setAttribute("inline","");return s.configure(t),(i??document.body).append(s),s}function ie(e,i){let n={};if(e.index)n.index=new URL(e.index,i).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)n.llm=t;if(e.instructions)n.instructions=e.instructions;if(e.lang)n.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)n.messages=s;if(e.position==="bottom-left"||e.position==="bottom-right")n.position=e.position;if(e.theme==="light"||e.theme==="dark"||e.theme==="auto")n.theme=e.theme;if(e.accent)n.accent=e.accent;if(e.catalog)n.catalogUrl=new URL(e.catalog,i).href;if(e.storageKey)n.storageKey=e.storageKey;if(e.open==="true")n.open=!0;return n}function q(){let e=import.meta.url,i=[...document.querySelectorAll("script[src]")].find((t)=>t.src===e&&!t.dataset.murmurReady);if(i)i.dataset.murmurReady="true";let n=ie(i?.dataset??{},location.href);n.catalogUrl??=new URL("./models.json",e).href,_(n)}if(typeof document<"u"&&!document.querySelector("murmur-chat:not([inline])"))if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",q,{once:!0});else q();export{ie as optionsFromDataset};
@@ -0,0 +1,11 @@
1
+ import{oe}from"./embed-hn0r8fmg.js";import{ye,A,me,u,e,r,c,ae,o,t,B,l,y,a,n,S,I,d,q,T,rt,ee,te,L,z,Te,C,P,H,i,s,h,g,ne,O,V,E,D,p,ut,rn,M,Ce,Y}from"./embed-sgjh2kg2.js";function ce(m){return m.replace(/[_-]([a-z])/g,(f)=>f[1].toUpperCase())}function Ne(m,f){let b=ce(m);if(b!==m&&f?.[b]!=null)return b;return m}function be({rawName:m,providerOptions:f,warnings:b}){let _=ce(m);if(_!==m&&f?.[m]!=null)b.push({type:"deprecated",setting:`providerOptions key '${m}'`,message:`Use '${_}' instead.`})}var ge={errorSchema:t({error:t({message:e(),type:e().nullish(),param:ae().nullish(),code:l([e(),r()]).nullish()})}),errorToMessage:(m)=>m.error.message};function $e(m){if(m==null)return te();let f=m.prompt_tokens??0,b=m.completion_tokens??0,_=m.prompt_tokens_details?.cached_tokens??0,w=m.completion_tokens_details?.reasoning_tokens??0;return{inputTokens:{total:f,noCache:f-_,cacheRead:_,cacheWrite:void 0},outputTokens:{total:b,text:Math.max(0,b-w),reasoning:w},raw:m}}function he(m){return m?.providerOptions?.openaiCompatible??{}}function Le(m){switch(m){case"audio/wav":return"wav";case"audio/mp3":case"audio/mpeg":return"mp3";default:return null}}function Ae(m,f){let b=he(m);switch(m.type){case"text":return{type:"text",text:m.text,...b};case"file":switch(m.data.type){case"reference":return{type:"file",file:{file_id:V({reference:m.data.reference,provider:f})},...b};case"text":throw new u({functionality:"text file parts"});case"url":case"data":{let _=z(m.mediaType);if(_==="image")return{type:"image_url",image_url:{url:m.data.type==="url"?m.data.url.toString():`data:${O({part:m})};base64,${T(m.data.data)}`},...b};if(_==="video")return{type:"video_url",video_url:{url:m.data.type==="url"?m.data.url.toString():`data:${O({part:m})};base64,${T(m.data.data)}`},...b};if(_==="audio"){if(m.data.type==="url")throw new u({functionality:"audio file parts with URLs"});let w=O({part:m}),R=Le(w);if(R===null)throw new u({functionality:`audio media type ${w}`});return{type:"input_audio",input_audio:{data:T(m.data.data),format:R},...b}}if(_==="application"){if(m.data.type==="url")throw new u({functionality:"PDF file parts with URLs"});let w=O({part:m});if(w!=="application/pdf")throw new u({functionality:`file part media type ${w}`});return{type:"file",file:{filename:m.filename??"document.pdf",file_data:`data:application/pdf;base64,${T(m.data.data)}`},...b}}if(_==="text")return{type:"text",text:m.data.type==="url"?m.data.url.toString():typeof m.data.data==="string"?new TextDecoder().decode(q(m.data.data)):new TextDecoder().decode(m.data.data),...b};throw new u({functionality:`file part media type ${m.mediaType}`})}}}}function Be(m,f){if(m.type==="custom")throw new u({functionality:"custom tool content parts"});return Ae(m,f)}function Ke(m,{provider:f="openaiCompatible",providerOptionsKey:b="google",supportsMultiPartToolContent:_=!1}={}){let w=[];for(let{role:R,content:U,...N}of m){let J=he({...N});switch(R){case"system":w.push({role:"system",content:U,...J});break;case"user":if(U.length===1&&U[0].type==="text"){w.push({role:"user",content:U[0].text,...he(U[0])});break}w.push({role:"user",content:U.map((j)=>Ae(j,f)),...J});break;case"assistant":{let j="",x="",v=[];for(let k of U){let Z=he(k);switch(k.type){case"text":j+=k.text;break;case"reasoning":x+=k.text;break;case"tool-call":{let W=k.providerOptions?.[b]?.thoughtSignature??k.providerOptions?.google?.thoughtSignature;v.push({id:k.toolCallId,type:"function",function:{name:k.toolName,arguments:JSON.stringify(k.input)},...Z,...W?{extra_content:{google:{thought_signature:String(W)}}}:{}});break}}}w.push({role:"assistant",content:v.length>0?j||null:j,...x.length>0?{reasoning_content:x}:{},tool_calls:v.length>0?v:void 0,...J});break}case"tool":for(let j of U){if(j.type==="tool-approval-response")continue;let x=j.output,v;switch(x.type){case"text":case"error-text":v=x.value;break;case"execution-denied":v=x.reason??"Tool call execution denied.";break;case"json":case"error-json":v=JSON.stringify(x.value);break;case"content":v=_?x.value.map((Z)=>Be(Z,f)):JSON.stringify(x.value)}let k=he(j);w.push({role:"tool",tool_call_id:j.toolCallId,content:v,...k})}break;default:throw Error(`Unsupported role: ${R}`)}}return w}function we({id:m,model:f,created:b}){return ee({id:m,model:f,created:b||void 0})}function xe(m){switch(m){case"stop":return"stop";case"length":return"length";case"content_filter":return"content-filter";case"function_call":case"tool_calls":return"tool-calls";default:return"other"}}var pe=t({user:e().optional(),reasoningEffort:e().optional(),textVerbosity:e().optional(),strictJsonSchema:c().optional()});function Ve({tools:m,toolChoice:f}){m=m?.length?m:void 0;let b=[];if(m==null)return{tools:void 0,toolChoice:void 0,toolWarnings:b};let _=[];for(let R of m)if(R.type==="provider")b.push({type:"unsupported",feature:`provider-defined tool ${R.id}`});else _.push({type:"function",function:{name:R.name,description:R.description,parameters:R.inputSchema,...R.strict!=null?{strict:R.strict}:{}}});if(f==null)return{tools:_,toolChoice:void 0,toolWarnings:b};let w=f.type;switch(w){case"auto":case"none":case"required":return{tools:_,toolChoice:w,toolWarnings:b};case"tool":return{tools:_,toolChoice:{type:"function",function:{name:f.toolName}},toolWarnings:b};default:throw new u({functionality:`tool choice type: ${w}`})}}var Je=class m{static[S](f){return M({modelId:f.modelId,config:f.config})}static[I](f){return new m(f.modelId,f.config)}constructor(f,b){this.specificationVersion="v4",this.modelId=f,this.config=b;let _=b.errorStructure??ge;this.chunkSchema=We(_.errorSchema),this.failedResponseHandler=E(_),this.supportsStructuredOutputs=b.supportsStructuredOutputs??!1}get provider(){return this.config.provider}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}get supportedUrls(){return this.config.supportedUrls?.()??{}}transformRequestBody(f,b){return this.config.transformRequestBody?.(f,b)??f}convertUsage(f){return this.config.convertUsage?.(f)??$e(f)}async getArgs({prompt:f,maxOutputTokens:b,temperature:_,topP:w,topK:R,frequencyPenalty:U,presencePenalty:N,reasoning:J,providerOptions:j,stopSequences:x,responseFormat:v,seed:k,toolChoice:Z,tools:W}){let G=[],se=await h({provider:"openai-compatible",providerOptions:j,schema:pe});if(se!=null)G.push({type:"deprecated",setting:"providerOptions key 'openai-compatible'",message:"Use 'openaiCompatible' instead."});be({rawName:this.providerOptionsName,providerOptions:j,warnings:G});let X=Object.assign(se??{},await h({provider:"openaiCompatible",providerOptions:j,schema:pe})??{},await h({provider:this.providerOptionsName,providerOptions:j,schema:pe})??{},await h({provider:ce(this.providerOptionsName),providerOptions:j,schema:pe})??{}),ie=X?.strictJsonSchema??!0;if(R!=null)G.push({type:"unsupported",feature:"topK"});if(v?.type==="json"&&v.schema!=null&&!this.supportsStructuredOutputs)G.push({type:"unsupported",feature:"responseFormat",details:"JSON response format schema is only supported with structuredOutputs"});let{tools:de,toolChoice:K,toolWarnings:F}=Ve({tools:W,toolChoice:Z}),Q=Ne(this.providerOptionsName,j);return{metadataKey:Q,args:{model:this.modelId,user:X.user,max_tokens:b,temperature:_,top_p:w,frequency_penalty:U,presence_penalty:N,response_format:v?.type==="json"?this.supportsStructuredOutputs===!0&&v.schema!=null?{type:"json_schema",json_schema:{schema:v.schema,strict:ie,name:v.name??"response",description:v.description}}:{type:"json_object"}:void 0,stop:x,seed:k,...Object.fromEntries(Object.entries({...j?.[this.providerOptionsName],...j?.[ce(this.providerOptionsName)]}).filter(([re])=>!Object.keys(pe.shape).includes(re))),reasoning_effort:X.reasoningEffort??(H(J)?J:void 0),verbosity:X.textVerbosity,messages:Ke(f,{provider:this.providerOptionsName,providerOptionsKey:Q,supportsMultiPartToolContent:this.config.supportsMultiPartToolContent}),tools:de,tool_choice:K},warnings:[...G,...F]}}async doGenerate(f){let{args:b,warnings:_,metadataKey:w}=await this.getArgs({...f}),R=this.transformRequestBody(b,_),U=JSON.stringify(R),{responseHeaders:N,value:J,rawValue:j}=await g({url:this.config.url({path:"/chat/completions",modelId:this.modelId}),headers:d(this.config.headers?.(),f.headers),body:R,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:p(De),abortSignal:f.abortSignal,fetch:this.config.fetch}),x=J.choices[0];if(x==null)throw new A({data:j,message:"Response did not contain any choices."});let v=[],k=x.message.reasoning_content??x.message.reasoning;if(k!=null&&k.length>0)v.push({type:"reasoning",text:k});if(v.push(...Ie(x.message.content)),x.message.tool_calls!=null)for(let G of x.message.tool_calls){let se=G.extra_content?.google?.thought_signature;v.push({type:"tool-call",toolCallId:G.id||C(),toolName:G.function.name,input:G.function.arguments,...se?{providerMetadata:{[w]:{thoughtSignature:se}}}:{}})}let Z={[w]:{},...await this.config.metadataExtractor?.extractMetadata?.({parsedBody:j})},W=J.usage?.completion_tokens_details;if(W?.accepted_prediction_tokens!=null)Z[w].acceptedPredictionTokens=W?.accepted_prediction_tokens;if(W?.rejected_prediction_tokens!=null)Z[w].rejectedPredictionTokens=W?.rejected_prediction_tokens;return{content:v,finishReason:{unified:xe(x.finish_reason),raw:x.finish_reason??void 0},usage:this.convertUsage(J.usage),providerMetadata:Z,request:{body:U},response:{...we(J),headers:N,body:j},warnings:_}}async doStream(f){let{args:b,warnings:_,metadataKey:w}=await this.getArgs({...f}),R=this.transformRequestBody({...b,stream:!0,stream_options:this.config.includeUsage?{include_usage:!0}:void 0},_),U=this.config.metadataExtractor?.createStreamExtractor(),{responseHeaders:N,value:J}=await g({url:this.config.url({path:"/chat/completions",modelId:this.modelId}),headers:d(this.config.headers?.(),f.headers),body:R,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:D(this.chunkSchema),abortSignal:f.abortSignal,fetch:this.config.fetch}),j=w,x,v=new Map,k=new Set,Z=(K)=>{let F=K.index;if(F==null||k.has(F)){x.processDelta(K);return}let Q=v.get(F);if(Q==null)Q={id:K.id??null,bufferedArguments:"",extraContent:K.extra_content??null},v.set(F,Q);else{if(Q.id==null&&K.id!=null)Q.id=K.id;if(Q.extraContent==null&&K.extra_content!=null)Q.extraContent=K.extra_content}let re=K.function?.arguments;if(re!=null)Q.bufferedArguments+=re;let ue=K.function?.name;if(ue!=null){let fe={index:F,id:Q.id,function:{name:ue,arguments:Q.bufferedArguments},extra_content:Q.extraContent??void 0};x.processDelta(fe),v.delete(F),k.add(F)}},W,G=void 0,se=!1,X=!1,ie=!1,de=(K)=>this.convertUsage(K);return{stream:J.pipeThrough(new TransformStream({start(K){x=new Ce(K,{generateId:C,extractMetadata:(F)=>{let Q=F.extra_content?.google?.thought_signature;return Q?{[j]:{thoughtSignature:Q}}:void 0},buildToolCallProviderMetadata:(F)=>F}),K.enqueue({type:"stream-start",warnings:_})},transform(K,F){if(f.includeRawChunks)F.enqueue({type:"raw",rawValue:K.rawValue});if(!K.success){W={unified:"error",raw:void 0},F.enqueue({type:"error",error:K.error});return}if(U?.processChunk(K.rawValue),"error"in K.value){W={unified:"error",raw:void 0},F.enqueue({type:"error",error:K.value.error});return}let Q=K.value;if(!se){let le=we(Q);if(Object.values(le).some(Boolean))se=!0,F.enqueue({type:"response-metadata",...le})}if(Q.usage!=null)G=Q.usage;let re=Q.choices[0];if(re?.finish_reason!=null)W={unified:xe(re.finish_reason),raw:re.finish_reason??void 0};if(re?.delta==null)return;let ue=re.delta,fe=(le)=>{if(ie)F.enqueue({type:"text-end",id:"txt-0"}),ie=!1;if(!X)F.enqueue({type:"reasoning-start",id:"reasoning-0"}),X=!0;F.enqueue({type:"reasoning-delta",id:"reasoning-0",delta:le})},Pe=(le)=>{if(X)F.enqueue({type:"reasoning-end",id:"reasoning-0"}),X=!1;if(!ie)F.enqueue({type:"text-start",id:"txt-0"}),ie=!0;F.enqueue({type:"text-delta",id:"txt-0",delta:le})},ve=ue.reasoning_content??ue.reasoning;if(ve)fe(ve);for(let le of Ie(ue.content))if(le.type==="reasoning")fe(le.text);else Pe(le.text);if(ue.tool_calls!=null&&ue.tool_calls.length>0){if(X)F.enqueue({type:"reasoning-end",id:"reasoning-0"}),X=!1;for(let le of ue.tool_calls)Z(le)}},flush(K){if(X)K.enqueue({type:"reasoning-end",id:"reasoning-0"});if(ie)K.enqueue({type:"text-end",id:"txt-0"});for(let[Q,re]of v)x.processDelta({index:Q,id:re.id,function:{arguments:re.bufferedArguments}});if(v.clear(),x.flush(),W==null)W={unified:"error",raw:void 0},K.enqueue({type:"error",error:new A({data:void 0,message:"Response stream ended without a finish reason."})});let F={[j]:{},...U?.buildMetadata()};if(G?.completion_tokens_details?.accepted_prediction_tokens!=null)F[j].acceptedPredictionTokens=G?.completion_tokens_details?.accepted_prediction_tokens;if(G?.completion_tokens_details?.rejected_prediction_tokens!=null)F[j].rejectedPredictionTokens=G?.completion_tokens_details?.rejected_prediction_tokens;K.enqueue({type:"finish",finishReason:W,usage:de(G),providerMetadata:F})}})),request:{body:R},response:{headers:N}}}},Ue=()=>B({prompt_tokens:r().nullish(),completion_tokens:r().nullish(),total_tokens:r().nullish(),prompt_tokens_details:B({cached_tokens:r().nullish()}).nullish(),completion_tokens_details:B({reasoning_tokens:r().nullish(),accepted_prediction_tokens:r().nullish(),rejected_prediction_tokens:r().nullish()}).nullish()}).nullish(),qe=()=>l([e(),o(B({type:e()}))]).nullish();function Ie(m){if(m==null)return[];if(typeof m==="string")return m.length>0?[{type:"text",text:m}]:[];let f=[];for(let b of m)if(b.type==="text"&&typeof b.text==="string"){if(b.text.length>0)f.push({type:"text",text:b.text})}else if(b.type==="thinking"&&Array.isArray(b.thinking)){let _=b.thinking.filter((w)=>w!=null&&typeof w==="object"&&("type"in w)&&w.type==="text"&&("text"in w)&&typeof w.text==="string").map((w)=>w.text).join("");if(_.length>0)f.push({type:"reasoning",text:_})}return f}var De=i(()=>s(B({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({message:t({role:n("assistant").nullish(),content:qe(),reasoning_content:e().nullish(),reasoning:e().nullish(),tool_calls:o(t({id:e().nullish(),function:t({name:e(),arguments:e()}),extra_content:t({google:t({thought_signature:e().nullish()}).nullish()}).nullish()})).nullish()}),finish_reason:e().nullish()})),usage:Ue()}))),Fe=()=>B({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({delta:t({role:a(["assistant",""]).nullish(),content:qe(),reasoning_content:e().nullish(),reasoning:e().nullish(),tool_calls:o(t({index:r().nullish(),id:e().nullish(),function:t({name:e().nullish(),arguments:e().nullish()}),extra_content:t({google:t({thought_signature:e().nullish()}).nullish()}).nullish()})).nullish()}).nullish(),finish_reason:e().nullish()})),usage:Ue()}),We=(m)=>l([Fe(),m]);function Oe(m){if(m==null)return te();let f=m.prompt_tokens??0,b=m.completion_tokens??0;return{inputTokens:{total:f,noCache:f,cacheRead:void 0,cacheWrite:void 0},outputTokens:{total:b,text:b,reasoning:void 0},raw:m}}function ze({prompt:m,user:f="user",assistant:b="assistant"}){let _="";if(m[0].role==="system")_+=`${m[0].content}
2
+
3
+ `,m=m.slice(1);for(let{role:w,content:R}of m)switch(w){case"system":throw new ye({message:`Unexpected system message in prompt: ${R}`,prompt:m});case"user":{let U=R.map((N)=>{switch(N.type){case"text":return N.text}}).filter(Boolean).join("");_+=`${f}:
4
+ ${U}
5
+
6
+ `;break}case"assistant":{let U=R.map((N)=>{switch(N.type){case"text":return N.text;case"tool-call":throw new u({functionality:"tool-call messages"})}}).join("");_+=`${b}:
7
+ ${U}
8
+
9
+ `;break}case"tool":throw new u({functionality:"tool messages"});default:throw Error(`Unsupported role: ${w}`)}return _+=`${b}:
10
+ `,{prompt:_,stopSequences:[`
11
+ ${f}:`]}}function ke(m){switch(m){case"stop":return"stop";case"length":return"length";case"content_filter":return"content-filter";case"function_call":case"tool_calls":return"tool-calls";default:return"other"}}var Se=i(()=>s(t({echo:c().optional(),logitBias:y(e(),r()).optional(),suffix:e().optional(),user:e().optional()}))),Ge=class m{static[S](f){return M({modelId:f.modelId,config:f.config})}static[I](f){return new m(f.modelId,f.config)}constructor(f,b){this.specificationVersion="v4",this.modelId=f,this.config=b;let _=b.errorStructure??ge;this.chunkSchema=Qe(_.errorSchema),this.failedResponseHandler=E(_)}get provider(){return this.config.provider}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}get supportedUrls(){return this.config.supportedUrls?.()??{}}async getArgs({prompt:f,maxOutputTokens:b,temperature:_,topP:w,topK:R,frequencyPenalty:U,presencePenalty:N,stopSequences:J,responseFormat:j,seed:x,providerOptions:v,tools:k,toolChoice:Z}){let W=[];be({rawName:this.providerOptionsName,providerOptions:v,warnings:W});let G=Object.assign(await h({provider:this.providerOptionsName,providerOptions:v,schema:Se})??{},await h({provider:ce(this.providerOptionsName),providerOptions:v,schema:Se})??{});if(R!=null)W.push({type:"unsupported",feature:"topK"});if(k?.length)W.push({type:"unsupported",feature:"tools"});if(Z!=null)W.push({type:"unsupported",feature:"toolChoice"});if(j!=null&&j.type!=="text")W.push({type:"unsupported",feature:"responseFormat",details:"JSON response format is not supported."});let{prompt:se,stopSequences:X}=ze({prompt:f}),ie=[...X??[],...J??[]];return{args:{model:this.modelId,echo:G.echo,logit_bias:G.logitBias,suffix:G.suffix,user:G.user,max_tokens:b,temperature:_,top_p:w,frequency_penalty:U,presence_penalty:N,seed:x,...v?.[this.providerOptionsName],...v?.[ce(this.providerOptionsName)],prompt:se,stop:ie.length>0?ie:void 0},warnings:W}}async doGenerate(f){let{args:b,warnings:_}=await this.getArgs(f),{responseHeaders:w,value:R,rawValue:U}=await g({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:d(this.config.headers?.(),f.headers),body:b,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:p(Ze),abortSignal:f.abortSignal,fetch:this.config.fetch}),N=R.choices[0],J=[];if(N.text!=null&&N.text.length>0)J.push({type:"text",text:N.text});return{content:J,usage:Oe(R.usage),finishReason:{unified:ke(N.finish_reason),raw:N.finish_reason},request:{body:b},response:{...ee(R),headers:w,body:U},warnings:_}}async doStream(f){let{args:b,warnings:_}=await this.getArgs(f),w={...b,stream:!0,stream_options:this.config.includeUsage?{include_usage:!0}:void 0},{responseHeaders:R,value:U}=await g({url:this.config.url({path:"/completions",modelId:this.modelId}),headers:d(this.config.headers?.(),f.headers),body:w,failedResponseHandler:this.failedResponseHandler,successfulResponseHandler:D(this.chunkSchema),abortSignal:f.abortSignal,fetch:this.config.fetch}),N={unified:"other",raw:void 0},J=void 0,j=!0;return{stream:U.pipeThrough(new TransformStream({start(x){x.enqueue({type:"stream-start",warnings:_})},transform(x,v){if(f.includeRawChunks)v.enqueue({type:"raw",rawValue:x.rawValue});if(!x.success){N={unified:"error",raw:void 0},v.enqueue({type:"error",error:x.error});return}let k=x.value;if("error"in k){N={unified:"error",raw:void 0},v.enqueue({type:"error",error:k.error});return}if(j)j=!1,v.enqueue({type:"response-metadata",...ee(k)}),v.enqueue({type:"text-start",id:"0"});if(k.usage!=null)J=k.usage;let Z=k.choices[0];if(Z?.finish_reason!=null)N={unified:ke(Z.finish_reason),raw:Z.finish_reason??void 0};if(Z?.text!=null)v.enqueue({type:"text-delta",id:"0",delta:Z.text})},flush(x){if(!j)x.enqueue({type:"text-end",id:"0"});x.enqueue({type:"finish",finishReason:N,usage:Oe(J)})}})),request:{body:w},response:{headers:R}}}},Ee=()=>B({prompt_tokens:r(),completion_tokens:r(),total_tokens:r()}),Ze=i(()=>s(t({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({text:e(),finish_reason:e()})),usage:Ee().nullish()}))),Qe=(m)=>l([t({id:e().nullish(),created:r().nullish(),model:e().nullish(),choices:o(t({text:e(),finish_reason:e().nullish(),index:r()})),usage:Ee().nullish()}),m]),_e=i(()=>s(t({dimensions:r().optional(),user:e().optional()}))),Xe=class m{get provider(){return this.config.provider}get maxEmbeddingsPerCall(){return this.config.maxEmbeddingsPerCall??2048}get supportsParallelCalls(){return this.config.supportsParallelCalls??!0}static[S](f){return M({modelId:f.modelId,config:f.config})}static[I](f){return new m(f.modelId,f.config)}constructor(f,b){this.specificationVersion="v4",this.modelId=f,this.config=b}get providerOptionsName(){return this.config.provider.split(".")[0].trim()}async doEmbed({values:f,dimensions:b,headers:_,abortSignal:w,providerOptions:R}){let U=[],N=await h({provider:"openai-compatible",providerOptions:R,schema:_e});if(N!=null)U.push({type:"deprecated",setting:"providerOptions key 'openai-compatible'",message:"Use 'openaiCompatible' instead."});be({rawName:this.providerOptionsName,providerOptions:R,warnings:U});let J=Object.assign(N??{},await h({provider:"openaiCompatible",providerOptions:R,schema:_e})??{},await h({provider:this.providerOptionsName,providerOptions:R,schema:_e})??{});if(f.length>this.maxEmbeddingsPerCall)throw new me({provider:this.provider,modelId:this.modelId,maxEmbeddingsPerCall:this.maxEmbeddingsPerCall,values:f});let{responseHeaders:j,value:x,rawValue:v}=await g({url:this.config.url({path:"/embeddings",modelId:this.modelId}),headers:d(this.config.headers?.(),_),body:{model:this.modelId,input:f,encoding_format:"float",dimensions:J.dimensions??b,user:J.user},failedResponseHandler:E(this.config.errorStructure??ge),successfulResponseHandler:p(Ye),abortSignal:w,fetch:this.config.fetch});return{warnings:U,embeddings:x.data.map((k)=>k.embedding),usage:x.usage?{tokens:x.usage.prompt_tokens}:void 0,providerMetadata:x.providerMetadata,response:{headers:j,body:v}}}},Ye=i(()=>s(t({data:o(t({embedding:o(r())})),usage:t({prompt_tokens:r()}).nullish(),providerMetadata:y(e(),y(e(),ae())).optional()}))),et=class m{get provider(){return this.config.provider}get providerOptionsKey(){return this.config.provider.split(".")[0].trim()}static[S](f){return M({modelId:f.modelId,config:f.config})}static[I](f){return new m(f.modelId,f.config)}constructor(f,b){this.modelId=f,this.config=b,this.specificationVersion="v4",this.maxImagesPerCall=10,this.supportsFileInputs=void 0,this.supportsMaskInputs=void 0}getArgs(f,b){return be({rawName:this.providerOptionsKey,providerOptions:f,warnings:b}),{...f[this.providerOptionsKey],...f[ce(this.providerOptionsKey)]}}async doGenerate({prompt:f,n:b,size:_,aspectRatio:w,seed:R,providerOptions:U,headers:N,abortSignal:J,files:j,mask:x}){let v=[];if(w!=null)v.push({type:"unsupported",feature:"aspectRatio",details:"This model does not support aspect ratio. Use `size` instead."});if(R!=null)v.push({type:"unsupported",feature:"seed"});let k=this.config._internal?.currentDate?.()??new Date,Z=this.getArgs(U,v),W=j!=null&&j.length>0,G=this.config.url({path:W?"/images/edits":"/images/generations",modelId:this.modelId}),se=d(this.config.headers?.(),N);if(W){let{value:de,responseHeaders:K}=await ne({url:G,headers:se,formData:rt({model:this.modelId,prompt:f,image:await Promise.all(j.map((F)=>Me(F))),mask:x!=null?await Me(x):void 0,n:b,size:_,...Z}),failedResponseHandler:E(this.config.errorStructure??ge),successfulResponseHandler:p(je),abortSignal:J,fetch:this.config.fetch});return{images:await this.getImages(de.data,{url:G,headers:se,abortSignal:J}),warnings:v,usage:Re(de.usage),response:{timestamp:k,modelId:this.modelId,headers:K}}}let{value:X,responseHeaders:ie}=await g({url:G,headers:se,body:{model:this.modelId,prompt:f,n:b,size:_,...Z},failedResponseHandler:E(this.config.errorStructure??ge),successfulResponseHandler:p(je),abortSignal:J,fetch:this.config.fetch});return{images:await this.getImages(X.data,{url:G,headers:se,abortSignal:J}),warnings:v,usage:Re(X.usage),response:{timestamp:k,modelId:this.modelId,headers:ie}}}async getImages(f,b){if(f.every((_)=>_.b64_json!=null))return f.map((_)=>_.b64_json);return Promise.all(f.map(async(_)=>{if(_.b64_json!=null)return q(_.b64_json);if(_.url==null)throw new A({data:_,message:"Expected url in the image response"});let{value:w}=await P({url:_.url,validateUrl:!0,trustedOrigin:b.url,credentialedOrigin:b.url,headers:b.headers,abortSignal:b.abortSignal,fetch:this.config.fetch,successfulResponseHandler:ut(),failedResponseHandler:rn()});return w}))}};function Re(m){return m==null?void 0:{inputTokens:m.input_tokens??void 0,outputTokens:m.output_tokens??void 0,totalTokens:m.total_tokens??void 0}}var je=i(()=>s(t({data:o(t({b64_json:e().nullish(),url:e().nullish()}).refine((m)=>m.b64_json!=null||m.url!=null,{message:"Expected b64_json or url in the image response"})),usage:t({input_tokens:r().nullish(),output_tokens:r().nullish(),total_tokens:r().nullish()}).nullish()})));async function Me(m){if(m.type==="url")return Te(m.url);let f=m.data instanceof Uint8Array?m.data:q(m.data);return new Blob([f],{type:m.mediaType})}var tt="3.0.80";function He(m){let f=Y(m.baseURL),b=m.name,_={...m.apiKey&&{Authorization:`Bearer ${m.apiKey}`},...m.headers},w=()=>L(_,`ai-sdk-openai-compatible/${tt}`),R=(k)=>({provider:`${b}.${k}`,url:({path:Z})=>{let W=new URL(`${f}${Z}`);if(m.queryParams)W.search=new URLSearchParams(m.queryParams).toString();return W.toString()},headers:w,fetch:m.fetch}),U=(k)=>N(k),N=(k)=>new Je(k,{...R("chat"),includeUsage:m.includeUsage,supportsStructuredOutputs:m.supportsStructuredOutputs,supportsMultiPartToolContent:m.supportsMultiPartToolContent,supportedUrls:m.supportedUrls,transformRequestBody:m.transformRequestBody,metadataExtractor:m.metadataExtractor,convertUsage:m.convertUsage}),J=(k)=>new Ge(k,{...R("completion"),includeUsage:m.includeUsage}),j=(k)=>new Xe(k,{...R("embedding")}),x=(k)=>new et(k,R("image")),v=(k)=>U(k);return v.specificationVersion="v4",v.languageModel=U,v.chatModel=N,v.completionModel=J,v.embeddingModel=j,v.textEmbeddingModel=j,v.imageModel=x,v}var nt=(m)=>{if(!m.baseURL)throw Error("This provider has no API URL. Select it again in the settings or configure a custom endpoint.");return He({name:"openai-compatible",baseURL:m.baseURL,apiKey:m.apiKey,headers:m.headers,...m.fetch&&{fetch:m.fetch},includeUsage:!0,supportsStructuredOutputs:!0,transformRequestBody:(f)=>{let b=f.response_format;if(b?.type!=="json_schema"||!b.json_schema)return f;return{...f,response_format:{type:"json_object"},messages:[{role:"system",content:`Return only a JSON object matching this JSON schema: ${JSON.stringify(b.json_schema.schema)}`},...f.messages]}}}).chatModel(m.model)};function pt(){oe("openai-compatible",nt)}export{pt as register};