manifest
Version:
Self-hosted Manifest LLM router with embedded server, SQLite database, and dashboard
2 lines (1 loc) • 14 kB
JavaScript
import{a as F,p as M,o as ve,i as t,g as d,S as b,F as j,h as A,s as T,m as re,t as m,l as le,d as ie,k as he,f as fe,C as _e,T as pe,M as ge}from"./vendor-C-Y5oNOq.js";import{E as $e}from"./index-C4Qw7vZo.js";import{g as H,p as ye,I as ne}from"./model-display-DHwvDtl4.js";import{p as ae,r as de,e as xe}from"./routing-utils-CHapjwyd.js";import{P as we}from"./Pagination-D8BOkffh.js";import"./auth-CU91cd7V.js";var be=m("<span class=model-filter__provider-icon aria-hidden=true>"),ke=m('<svg class=model-filter__provider-icon viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><rect x=3 y=3 width=18 height=18 rx=3></rect><circle cx=12 cy=12 r=3>'),Ce=m("<div class=model-filter__dropdown-group><div class=model-filter__dropdown-label>Providers"),Me=m("<div class=model-filter__dropdown-group><div class=model-filter__dropdown-label>Models"),Pe=m("<div class=model-filter__dropdown role=listbox>"),Se=m("<span> of <!> models"),Ie=m("<button class=model-filter__clear-all type=button>Clear filters"),Le=m("<div class=model-filter__tags>"),De=m('<div class=model-filter><div class=model-filter__row><div class=model-filter__combobox><div class=model-filter__input-wrapper><svg class=model-filter__search-icon width=15 height=15 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><circle cx=11 cy=11 r=8></circle><path d="m21 21-4.3-4.3"></path></svg><input type=text class=model-filter__search placeholder="Search models or providers..."role=combobox aria-autocomplete=list aria-label="Search models or providers"></div></div><div class=model-filter__summary>'),ze=m("<button class=model-filter__dropdown-item type=button role=option><span class=model-filter__dropdown-item-name></span><span class=model-filter__dropdown-item-type>Provider"),Fe=m("<button class=model-filter__dropdown-item type=button role=option><span class=model-filter__dropdown-item-name></span><span class=model-filter__dropdown-item-type>Model"),Ne=m("<span> models"),Re=m("<span class=model-filter__tag-type>Model:"),Ee=m('<span class=model-filter__tag><span class=model-filter__tag-value></span><button class=model-filter__tag-remove type=button><svg width=10 height=10 viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2.5 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M18 6 6 18"></path><path d="m6 6 12 12">');const oe=n=>{const x=()=>n.size??16,P=()=>de(n.provider),S=()=>{const v=P();return v?ae(v,x()):null};return d(b,{get when(){return S()},get fallback(){return(()=>{var v=ke();return A(_=>{var p=x(),k=x();return p!==_.e&&T(v,"width",_.e=p),k!==_.t&&T(v,"height",_.t=k),_},{e:void 0,t:void 0}),v})()},get children(){var v=be();return t(v,S),v}})},Ae=n=>{const[x,P]=F(""),[S,v]=F(!1),[_,p]=F(-1);let k,z;const w=()=>n.selectedModels.size>0||n.selectedProviders.size>0,I=M(()=>{const r=[];for(const u of n.selectedProviders)r.push({type:"Provider",value:u});for(const u of n.selectedModels)r.push({type:"Model",value:u});return r}),q=M(()=>{const r=x().toLowerCase().trim();return r.length<2?[]:n.allProviders.filter(u=>!n.selectedProviders.has(u)&&u.toLowerCase().includes(r)).slice(0,5)}),B=M(()=>{const r=x().toLowerCase().trim();return r.length<2?[]:n.allModels.filter(u=>!n.selectedModels.has(u)&&u.toLowerCase().includes(r)).slice(0,5)}),N=M(()=>{const r=[];for(const u of q())r.push({type:"Provider",value:u});for(const u of B())r.push({type:"Model",value:u});return r}),E=r=>{r.type==="Provider"?n.onAddProvider(r.value):n.onAddModel(r.value),P(""),v(!1),p(-1),z?.focus()},K=r=>{r.type==="Provider"?n.onRemoveProvider(r.value):n.onRemoveModel(r.value)},L=r=>{const u=r.currentTarget.value;P(u),p(-1),v(u.trim().length>=2)},R=r=>{const u=N();if(r.key==="ArrowDown")r.preventDefault(),!S()&&x().trim().length>=2&&v(!0),p(g=>Math.min(g+1,u.length-1));else if(r.key==="ArrowUp")r.preventDefault(),p(g=>Math.max(g-1,0));else if(r.key==="Enter"){r.preventDefault();const g=_();g>=0&&g<u.length&&E(u[g])}else if(r.key==="Escape")v(!1),p(-1);else if(r.key==="Backspace"&&x()===""){const g=I();g.length>0&&K(g[g.length-1])}},O=r=>{k&&!k.contains(r.target)&&(v(!1),p(-1))};return typeof document<"u"&&(document.addEventListener("click",O),ve(()=>{document.removeEventListener("click",O)})),(()=>{var r=De(),u=r.firstChild,g=u.firstChild,U=g.firstChild,Q=U.firstChild,e=Q.nextSibling,c=g.nextSibling,l=k;typeof l=="function"?le(l,g):k=g,e.$$keydown=R,e.$$input=L;var h=z;return typeof h=="function"?le(h,e):z=e,t(g,d(b,{get when(){return re(()=>!!S())()&&N().length>0},get children(){var a=Pe();return t(a,d(b,{get when(){return q().length>0},get children(){var o=Ce();return o.firstChild,t(o,d(j,{get each(){return q()},children:s=>{const f=()=>N().findIndex(i=>i.type==="Provider"&&i.value===s);return(()=>{var i=ze(),y=i.firstChild;return i.addEventListener("mouseenter",()=>p(f())),i.$$click=()=>E({type:"Provider",value:s}),t(y,d(oe,{provider:s,size:16}),null),t(y,s,null),A($=>{var D=_()===f(),C=_()===f();return D!==$.e&&i.classList.toggle("model-filter__dropdown-item--highlighted",$.e=D),C!==$.t&&T(i,"aria-selected",$.t=C),$},{e:void 0,t:void 0}),i})()}}),null),o}}),null),t(a,d(b,{get when(){return B().length>0},get children(){var o=Me();return o.firstChild,t(o,d(j,{get each(){return B()},children:s=>{const f=()=>N().findIndex(i=>i.type==="Model"&&i.value===s);return(()=>{var i=Fe(),y=i.firstChild;return i.addEventListener("mouseenter",()=>p(f())),i.$$click=()=>E({type:"Model",value:s}),t(y,()=>H(s)),A($=>{var D=_()===f(),C=_()===f();return D!==$.e&&i.classList.toggle("model-filter__dropdown-item--highlighted",$.e=D),C!==$.t&&T(i,"aria-selected",$.t=C),$},{e:void 0,t:void 0}),i})()}}),null),o}}),null),a}}),null),t(c,d(b,{get when(){return w()},get fallback(){return(()=>{var a=Ne(),o=a.firstChild;return t(a,()=>n.totalCount,o),a})()},get children(){return[(()=>{var a=Se(),o=a.firstChild,s=o.nextSibling;return s.nextSibling,t(a,()=>n.filteredCount,o),t(a,()=>n.totalCount,s),a})(),(()=>{var a=Ie();return a.$$click=()=>{n.onClearFilters(),P(""),v(!1)},a})()]}})),t(r,d(b,{get when(){return I().length>0},get children(){var a=Le();return t(a,d(j,{get each(){return I()},children:o=>(()=>{var s=Ee(),f=s.firstChild,i=f.nextSibling;return t(s,d(b,{get when(){return o.type==="Provider"},get children(){return d(oe,{get provider(){return o.value},size:16})}}),f),t(s,d(b,{get when(){return o.type==="Model"},get children(){return Re()}}),f),t(f,(()=>{var y=re(()=>o.type==="Model");return()=>y()?H(o.value):o.value})()),i.$$click=()=>K(o),A(y=>{var $=o.type==="Provider",D=`Remove ${o.type} ${o.value}`;return $!==y.e&&s.classList.toggle("model-filter__tag--provider",y.e=$),D!==y.t&&T(i,"aria-label",y.t=D),y},{e:void 0,t:void 0}),s})()})),a}}),null),A(()=>T(e,"aria-expanded",S())),A(()=>e.value=x()),r})()};ie(["input","keydown","click"]);function Te(n,x=25){const[P,S]=F(1),v=M(()=>n().length),_=M(()=>Math.max(1,Math.ceil(v()/x))),p=M(()=>{const w=P(),I=_();return Math.min(Math.max(1,w),I)}),k=M(()=>{const w=(p()-1)*x;return n().slice(w,w+x)}),z=M(()=>p()<_());return{currentPage:p,pageItems:k,totalItems:v,totalPages:_,hasNextPage:z,previousPage:()=>S(w=>Math.max(1,w-1)),nextPage:()=>S(w=>w<_()?w+1:w),resetPage:()=>S(1),pageSize:x}}var qe=m("<span style=font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))>Last updated: "),Be=m("<table class=data-table><thead><tr><th class=data-table__sortable>Model</th><th class=data-table__sortable>Model ID</th><th class=data-table__sortable>Provider</th><th class=data-table__sortable>Cost to send / 1M tokens</th><th class=data-table__sortable>Cost to receive / 1M tokens</th></tr></thead><tbody>"),je=m("<div class=panel>"),Ke=m("<div class=container--full><div class=page-header><div><h1>Model Prices</h1><span class=breadcrumb>Compare per-token pricing across all supported LLM providers and models"),Oe=m('<div class=panel style=min-height:600px><div class=model-filter><div class=model-filter__row><div class="skeleton skeleton--text"style=width:280px;height:36px;border-radius:var(--radius)></div><div class=model-filter__summary><div class="skeleton skeleton--text"style=width:80px></div></div></div></div><table class=data-table style=width:100%><thead><tr><th>Model</th><th>Model ID</th><th>Provider</th><th>Cost to send / 1M tokens</th><th>Cost to receive / 1M tokens</th></tr></thead><tbody>'),Ue=m('<tr><td><div class="skeleton skeleton--text"style=width:70%></div></td><td><div class="skeleton skeleton--text"style=width:60%></div></td><td><div class="skeleton skeleton--text"style=width:60%></div></td><td><div class="skeleton skeleton--text"style=width:50%></div></td><td><div class="skeleton skeleton--text"style=width:50%>'),He=m('<div class=model-filter__empty><p class=model-filter__empty-title>No models match your filters</p><p class=model-filter__empty-hint>Try selecting a different provider or model, or clear all filters to see every model.</p><button class="btn btn--outline btn--sm"type=button>Clear filters'),Qe=m("<span class=free-tag>Free"),Ge=m("<span style=display:inline-flex;flex-shrink:0>"),Je=m("<tr><td style=font-size:var(--font-size-sm)></td><td style=font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))></td><td><span style=display:inline-flex;align-items:center;gap:6px></span></td><td style=font-family:var(--font-mono)></td><td style=font-family:var(--font-mono)>");function se(n){return n==null?"—":n<.01?`$${n.toFixed(4)}`:n<1?`$${n.toFixed(3)}`:`$${n.toFixed(2)}`}const tt=()=>{ye();const[n,{refetch:x}]=he(()=>xe()),[P,S]=F("provider"),[v,_]=F("asc"),[p,k]=F(new Set),[z,w]=F(new Set),I=e=>{P()===e?_(c=>c==="asc"?"desc":"asc"):(S(e),_("asc"))},q=M(()=>{const e=n()?.models;return e?[...new Set(e.map(l=>l.provider))].sort((l,h)=>l.localeCompare(h)):[]}),B=M(()=>{const e=n()?.models;return e?[...new Set(e.map(l=>l.model_name))].sort((l,h)=>l.localeCompare(h)):[]}),N=M(()=>{const e=n()?.models;if(!e)return[];const c=p(),l=z();return e.filter(h=>!(c.size>0&&!c.has(h.model_name)||l.size>0&&!l.has(h.provider)))}),E=e=>(e.display_name||H(e.model_name)).replace(/\s*\(free\)/i,""),K=M(()=>{const e=N();if(!e.length)return[];const c=P(),l=v();return[...e].sort((h,a)=>{if(c==="display_name"){const f=E(h),i=E(a);return l==="asc"?f.localeCompare(i):i.localeCompare(f)}const o=h[c],s=a[c];return typeof o=="string"&&typeof s=="string"?l==="asc"?o.localeCompare(s):s.localeCompare(o):o==null&&s==null?0:o==null?1:s==null?-1:l==="asc"?o-s:s-o})}),L=Te(K,25);fe(_e([p,z,P,v],()=>L.resetPage(),{defer:!0}));const R=e=>P()!==e?"":v()==="asc"?" ▲":" ▼",O=e=>{k(c=>{const l=new Set(c);return l.add(e),l})},r=e=>{k(c=>{const l=new Set(c);return l.delete(e),l})},u=e=>{w(c=>{const l=new Set(c);return l.add(e),l})},g=e=>{w(c=>{const l=new Set(c);return l.delete(e),l})},U=()=>{k(new Set),w(new Set)},Q=e=>e?new Date(e).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"}):"Never";return(()=>{var e=Ke(),c=e.firstChild;return c.firstChild,t(e,d(pe,{children:"Model Prices - Manifest"}),c),t(e,d(ge,{name:"description",content:"Compare per-token pricing across all major LLM providers."}),c),t(c,d(b,{get when(){return n()?.lastSyncedAt},get children(){var l=qe();return l.firstChild,t(l,()=>Q(n().lastSyncedAt),null),l}}),null),t(e,d(b,{get when(){return!n.loading},get fallback(){return(()=>{var l=Oe(),h=l.firstChild,a=h.nextSibling,o=a.firstChild,s=o.nextSibling;return t(s,d(j,{each:[1,2,3,4,5,6,7,8,9,10],children:()=>Ue()})),l})()},get children(){return d(b,{get when(){return!n.error},get fallback(){return d($e,{get error(){return n.error},onRetry:x})},get children(){var l=je();return t(l,d(Ae,{get allModels(){return B()},get allProviders(){return q()},get selectedModels(){return p()},get selectedProviders(){return z()},onAddModel:O,onRemoveModel:r,onAddProvider:u,onRemoveProvider:g,onClearFilters:U,get totalCount(){return n()?.models?.length??0},get filteredCount(){return N().length}}),null),t(l,d(b,{get when(){return L.totalItems()>0},get fallback(){return(()=>{var h=He(),a=h.firstChild,o=a.nextSibling,s=o.nextSibling;return s.$$click=U,h})()},get children(){return[(()=>{var h=Be(),a=h.firstChild,o=a.firstChild,s=o.firstChild;s.firstChild;var f=s.nextSibling;f.firstChild;var i=f.nextSibling;i.firstChild;var y=i.nextSibling;y.firstChild;var $=y.nextSibling;$.firstChild;var D=a.nextSibling;return s.$$click=()=>I("display_name"),t(s,()=>R("display_name"),null),f.$$click=()=>I("model_name"),t(f,()=>R("model_name"),null),i.$$click=()=>I("provider"),t(i,()=>R("provider"),null),y.$$click=()=>I("input_price_per_million"),t(y,()=>R("input_price_per_million"),null),t(y,d(ne,{text:"Tokens are small chunks of text. Send cost is what you pay for the input you give the model."}),null),$.$$click=()=>I("output_price_per_million"),t($,()=>R("output_price_per_million"),null),t($,d(ne,{text:"Tokens are small chunks of text. Receive cost is what you pay for the output the model returns."}),null),t(D,d(j,{get each(){return L.pageItems()},children:C=>{const J=()=>C.display_name||H(C.model_name),ce=()=>/\(free\)/i.test(J()),ue=()=>J().replace(/\s*\(free\)/i,""),V=()=>de(C.provider);return(()=>{var W=Je(),G=W.firstChild,X=G.nextSibling,Y=X.nextSibling,Z=Y.firstChild,ee=Y.nextSibling,me=ee.nextSibling;return t(G,ue,null),t(G,d(b,{get when(){return ce()},get children(){return[" ",Qe()]}}),null),t(X,()=>C.model_name),t(Z,d(b,{get when(){return V()},get children(){var te=Ge();return t(te,()=>ae(V(),16)),te}}),null),t(Z,()=>C.provider,null),t(ee,()=>se(C.input_price_per_million)),t(me,()=>se(C.output_price_per_million)),W})()}})),h})(),d(we,{get currentPage(){return L.currentPage},get totalItems(){return L.totalItems},get pageSize(){return L.pageSize},get hasNextPage(){return L.hasNextPage},get onPrevious(){return L.previousPage},get onNext(){return L.nextPage}})]}}),null),l}})}}),null),e})()};ie(["click"]);export{tt as default};