llm-simple-router 0.6.1 → 0.6.2

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.
@@ -6,5 +6,6 @@
6
6
  { "name": "ZAI 操作失败 (code 500)", "status_code": 400, "body_pattern": "\"type\"\\s*:\\s*\"error\".*\"code\"\\s*:\\s*\"500\"", "retry_strategy": "exponential", "retry_delay_ms": 5000, "max_retries": 10, "max_delay_ms": 60000 },
7
7
  { "name": "ZAI 速率限制 (HTTP 200, code 1302)", "status_code": 200, "body_pattern": "\"error\".*\"code\"\\s*:\\s*\"1302\"", "retry_strategy": "exponential", "retry_delay_ms": 5000, "max_retries": 10, "max_delay_ms": 60000 },
8
8
  { "name": "ZAI SSE 错误 (HTTP 200, code 500)", "status_code": 200, "body_pattern": "\"error\".*\"code\"\\s*:\\s*\"500\"", "retry_strategy": "exponential", "retry_delay_ms": 5000, "max_retries": 10, "max_delay_ms": 60000 },
9
- { "name": "ZAI SSE 错误 (HTTP 200, code 1234)", "status_code": 200, "body_pattern": "\"error\".*\"code\"\\s*:\\s*\"1234\"", "retry_strategy": "exponential", "retry_delay_ms": 5000, "max_retries": 10, "max_delay_ms": 60000 }
9
+ { "name": "ZAI SSE 错误 (HTTP 200, code 1234)", "status_code": 200, "body_pattern": "\"error\".*\"code\"\\s*:\\s*\"1234\"", "retry_strategy": "exponential", "retry_delay_ms": 5000, "max_retries": 10, "max_delay_ms": 60000 },
10
+ { "name": "ZAI 过载限流 (HTTP 200, code 1305)", "status_code": 200, "body_pattern": "\"error\".*\"code\"\\s*:\\s*\"1305\"", "retry_strategy": "exponential", "retry_delay_ms": 5000, "max_retries": 10, "max_delay_ms": 60000 }
10
11
  ]
@@ -1 +1 @@
1
- import{A as e,Dt as t,F as n,G as r,H as i,It as a,J as o,K as s,M as c,N as l,Pt as u,U as d,V as f,W as p,at as ee,ct as te,dt as ne,gt as m,it as re,j as h,k as g,n as _,ot as v,q as y,r as b,tt as x,ut as S,yt as C,z as w,zt as T}from"./button-BLX8zWc1.js";import{i as ie}from"./format-Dln15Luw.js";import{b as E}from"./Teleport-BGbwtNTD.js";import{a as ae,i as D,n as oe,r as O,t as se}from"./SelectValue-TvIOOalu.js";import{t as k}from"./file-text-CqJ33eWr.js";import{t as A}from"./loader-circle-CnEL8ILi.js";import{t as j}from"./x-DMAovOe-.js";import{a as M,c as N,i as P,n as F,o as I,r as L,s as R,t as z}from"./alert-dialog-DgtxmV7t.js";import{n as ce,r as le,t as ue}from"./PopoverTrigger-BVsxIE2L.js";import{t as B}from"./badge-NUBqZBxu.js";import{n as V,t as H}from"./lib-DQotd1d8.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var U=E(`activity`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]),de=E(`arrow-left-right`,[[`path`,{d:`M8 3 4 7l4 4`,key:`9rb6wj`}],[`path`,{d:`M4 7h16`,key:`6tx8e3`}],[`path`,{d:`m16 21 4-4-4-4`,key:`siv7j2`}],[`path`,{d:`M20 17H4`,key:`h6l3hr`}]]),fe=E(`arrow-up-right`,[[`path`,{d:`M7 7h10v10`,key:`1tivn9`}],[`path`,{d:`M7 17 17 7`,key:`1vkiza`}]]),pe=E(`calendar-clock`,[[`path`,{d:`M16 14v2.2l1.6 1`,key:`fo4ql5`}],[`path`,{d:`M16 2v4`,key:`4m81vk`}],[`path`,{d:`M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5`,key:`1osxxc`}],[`path`,{d:`M3 10h5`,key:`r794hk`}],[`path`,{d:`M8 2v4`,key:`1cmpym`}],[`circle`,{cx:`16`,cy:`16`,r:`6`,key:`qoo3c4`}]]),W=E(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),G=E(`info`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]),me=E(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]),he=E(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),ge=E(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),K=E(`octagon-x`,[[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z`,key:`2d38gg`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]),_e=E(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),ve=E(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),q=E(`server`,[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]),ye=E(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),be=E(`sparkles`,[[`path`,{d:`M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z`,key:`1s2grr`}],[`path`,{d:`M20 2v4`,key:`1rf3ol`}],[`path`,{d:`M22 4h-4`,key:`gwowj6`}],[`circle`,{cx:`4`,cy:`20`,r:`2`,key:`6kqj1y`}]]),J=E(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),xe={class:`w-56 bg-sidebar text-sidebar-foreground flex-shrink-0 flex flex-col`},Se={class:`p-4 border-b border-sidebar-border`},Ce={class:`flex items-center gap-2`},we={key:0,class:`p-3 border-b border-border`},Te={class:`flex items-center gap-2 mb-2`},Ee={class:`w-4 h-4 rounded-full bg-primary flex items-center justify-center text-primary-foreground`},De={class:`text-xs text-muted-foreground mb-2`},Oe={class:`text-primary font-medium`},ke={key:1,class:`text-xs text-warning bg-warning-light p-2 rounded`},Ae={key:1,class:`p-3 border-b border-border`},je={class:`flex items-center gap-2 mb-2`},Me={class:`w-4 h-4 rounded-full bg-primary flex items-center justify-center text-primary-foreground`},Ne={class:`flex items-center gap-2 mb-2`},Pe={key:2,class:`p-3`},Fe={class:`px-3 py-2 flex justify-between items-center text-xs text-muted-foreground`},Ie={class:`flex-1 p-2 space-y-1`},Le={class:`p-3 border-t border-sidebar-border`},Re={class:`bg-muted px-1 py-0.5 rounded text-xs`},ze=300*1e3,Y=o({__name:`Sidebar`,setup(n){let o=t(null),m=t(!1),h=t(!1),b=t(!1),x=t(!1),E=t(!1),A=null;async function j(){try{o.value=await g.getUpgradeStatus()}catch{o.value=null}}async function H(){try{await g.triggerUpgradeCheck(),await j()}catch(t){V.error(e(t,`检查失败`))}}async function W(){if(o.value?.npm.latestVersion){b.value=!0;try{await g.executeUpgrade(o.value.npm.latestVersion),V.success(`升级成功`),m.value=!1,h.value=!0,await j()}catch(t){V.error(e(t,`升级失败`))}finally{b.value=!1}}}async function G(){let t=o.value?.syncSource??`github`;x.value=!0;try{await g.syncConfig(t),V.success(`配置同步成功`),await j()}catch(t){V.error(e(t,`同步失败`))}finally{x.value=!1}}async function K(t){if(typeof t==`string`)try{await g.setSyncSource(t),await j()}catch(t){V.error(e(t,`保存失败`))}}let J=f(()=>{if(!o.value)return 0;let e=0;return o.value.npm.hasUpdate&&e++,o.value.config.hasUpdate&&e++,e});re(()=>{j(),A=setInterval(j,ze)}),ee(()=>{A&&clearInterval(A)});let Y=[{path:`/`,label:`仪表盘`,icon:he},{path:`/providers`,label:`供应商`,icon:q},{path:`/mappings`,label:`模型映射`,icon:de},{path:`/schedules`,label:`调度管理`,icon:pe},{path:`/router-keys`,label:`API 密钥`,icon:me},{path:`/retry-rules`,label:`重试规则`,icon:_e},{path:`/proxy-enhancement`,label:`代理增强(实验性)`,icon:be},{path:`/monitor`,label:`实时监控`,icon:U},{path:`/logs`,label:`请求日志`,icon:k},{path:`/settings`,label:`系统设置`,icon:ye}],X=c(),Z=l();function Q(e){return e===`/`?X.path===`/`:X.path.startsWith(e)}function $(){window.location.reload()}async function Be(){try{await g.logout()}finally{Z.push(`/login`)}}return(e,t)=>{let n=S(`router-link`);return v(),r(`aside`,xe,[i(`div`,Se,[i(`div`,Ce,[t[15]||=i(`div`,{class:`w-8 h-8 bg-sidebar-primary rounded-lg flex items-center justify-center`},[i(`svg`,{class:`w-5 h-5 text-sidebar-primary-foreground`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[i(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z`})])],-1),y(u(le),{open:E.value,"onUpdate:open":t[1]||=e=>E.value=e},{default:C(()=>[y(u(ue),{"as-child":``},{default:C(()=>[y(u(_),{variant:`ghost`,class:`flex items-center gap-2 px-0 h-auto`},{default:C(()=>[t[5]||=i(`span`,{class:`font-semibold text-sm`},`LLM Router`,-1),y(u(B),{variant:`secondary`,class:`text-[10px] px-1.5 py-0 h-4 leading-none`},{default:C(()=>[s(`v`+T(u(`0.6.1`)),1)]),_:1}),J.value>0?(v(),d(u(B),{key:0,variant:`destructive`,class:`text-[10px] px-1.5 h-4 leading-none bg-destructive text-destructive-foreground font-semibold`},{default:C(()=>[s(T(J.value),1)]),_:1})):p(``,!0)]),_:1})]),_:1}),y(u(ce),{side:`right`,align:`start`,class:`w-80 p-0`},{default:C(()=>[o.value?.npm.hasUpdate?(v(),r(`div`,we,[i(`div`,Te,[i(`div`,Ee,[y(u(fe),{class:`w-3 h-3`})]),t[6]||=i(`span`,{class:`text-sm font-medium`},`新版本可用`,-1)]),i(`p`,De,[s(T(o.value.npm.currentVersion)+` → `,1),i(`span`,Oe,T(o.value.npm.latestVersion),1)]),o.value.deployment===`npm`?(v(),d(u(_),{key:0,size:`sm`,class:`w-full text-xs`,disabled:b.value,onClick:t[0]||=e=>m.value=!0},{default:C(()=>[s(T(b.value?`升级中...`:`一键升级`),1)]),_:1},8,[`disabled`])):(v(),r(`div`,ke,[s(` 检测到 `+T(o.value.deployment===`docker`?`Docker`:`未知`)+` 部署,请手动更新: `,1),t[7]||=i(`code`,{class:`block mt-1 text-warning bg-warning-dark/10 p-1 rounded`},`docker pull ghcr.io/zhushanwen321/llm-simple-router:latest`,-1)]))])):p(``,!0),o.value?.config.hasUpdate?(v(),r(`div`,Ae,[i(`div`,je,[i(`div`,Me,[y(u(ve),{class:`w-3 h-3`})]),t[8]||=i(`span`,{class:`text-sm font-medium`},`推荐配置已更新`,-1)]),t[12]||=i(`p`,{class:`text-xs text-muted-foreground mb-2`},` 供应商或重试规则有新版本 `,-1),i(`div`,Ne,[t[11]||=i(`span`,{class:`text-xs text-muted-foreground`},`来源`,-1),y(u(ae),{"model-value":o.value?.syncSource,"onUpdate:modelValue":K},{default:C(()=>[y(u(oe),{class:`h-7 text-xs flex-1`},{default:C(()=>[y(u(se))]),_:1}),y(u(D),null,{default:C(()=>[y(u(O),{value:`github`},{default:C(()=>[...t[9]||=[s(`GitHub`,-1)]]),_:1}),y(u(O),{value:`gitee`},{default:C(()=>[...t[10]||=[s(`Gitee`,-1)]]),_:1})]),_:1})]),_:1},8,[`model-value`])]),y(u(_),{size:`sm`,variant:`secondary`,class:`w-full text-xs`,disabled:x.value,onClick:G},{default:C(()=>[s(T(x.value?`同步中...`:`同步配置`),1)]),_:1},8,[`disabled`])])):p(``,!0),!o.value?.npm.hasUpdate&&!o.value?.config.hasUpdate?(v(),r(`div`,Pe,[...t[13]||=[i(`p`,{class:`text-xs text-muted-foreground`},`当前已是最新版本,配置也是最新的`,-1)]])):p(``,!0),i(`div`,Fe,[i(`span`,null,T(o.value?.lastCheckedAt?`检查于 ${u(ie)(o.value.lastCheckedAt).toLocaleTimeString(`zh-CN`,{timeZone:`Asia/Shanghai`})}`:`未检查`),1),y(u(_),{variant:`link`,class:`text-primary h-auto p-0`,onClick:H},{default:C(()=>[...t[14]||=[s(`立即检查`,-1)]]),_:1})])]),_:1})]),_:1},8,[`open`])])]),i(`nav`,Ie,[(v(),r(w,null,te(Y,e=>y(n,{key:e.path,to:e.path,class:a([`flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors`,Q(e.path)?`bg-sidebar-accent text-sidebar-primary`:`text-sidebar-foreground hover:bg-sidebar-accent`])},{default:C(()=>[(v(),d(ne(e.icon),{class:`w-4 h-4`})),s(` `+T(e.label),1)]),_:2},1032,[`to`,`class`])),64))]),i(`div`,Le,[y(u(_),{variant:`ghost`,class:`w-full justify-start text-sidebar-foreground hover:text-sidebar-foreground hover:bg-sidebar-accent`,onClick:Be},{default:C(()=>[y(u(ge),{class:`w-4 h-4`}),t[16]||=s(` 登出 `,-1)]),_:1})]),y(u(N),{open:m.value,"onUpdate:open":t[2]||=e=>m.value=e},{default:C(()=>[y(u(M),null,{default:C(()=>[y(u(F),null,{default:C(()=>[y(u(z),null,{default:C(()=>[s(`确认升级到 `+T(o.value?.npm.latestVersion)+`?`,1)]),_:1}),y(u(P),null,{default:C(()=>[t[17]||=s(` 将执行 `,-1),i(`code`,Re,`npm install -g llm-simple-router@`+T(o.value?.npm.latestVersion),1),t[18]||=s(`,升级完成后需要重启服务才能生效。 `,-1)]),_:1})]),_:1}),y(u(L),null,{default:C(()=>[y(u(I),null,{default:C(()=>[...t[19]||=[s(`取消`,-1)]]),_:1}),y(u(R),{onClick:W,disabled:b.value},{default:C(()=>[s(T(b.value?`升级中...`:`确认升级`),1)]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`open`]),y(u(N),{open:h.value,"onUpdate:open":t[4]||=e=>h.value=e},{default:C(()=>[y(u(M),null,{default:C(()=>[y(u(F),null,{default:C(()=>[y(u(z),null,{default:C(()=>[...t[20]||=[s(`升级成功`,-1)]]),_:1}),y(u(P),null,{default:C(()=>[s(` 已升级到 `+T(o.value?.npm.latestVersion)+`。需要重启服务才能生效。 `,1)]),_:1})]),_:1}),y(u(L),null,{default:C(()=>[y(u(I),{onClick:t[3]||=e=>h.value=!1},{default:C(()=>[...t[21]||=[s(`稍后重启`,-1)]]),_:1}),y(u(R),{onClick:$},{default:C(()=>[...t[22]||=[s(`立即重启`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`])])}}}),X=o({__name:`Sonner`,props:{id:{},invert:{type:Boolean},theme:{},position:{},closeButtonPosition:{},hotkey:{},richColors:{type:Boolean},expand:{type:Boolean},duration:{},gap:{},visibleToasts:{},closeButton:{type:Boolean},toastOptions:{},class:{},style:{},offset:{},mobileOffset:{},dir:{},swipeDirections:{},icons:{},containerAriaLabel:{}},setup(e){let t=e;return(e,n)=>(v(),d(u(H),x({class:u(b)(`toaster group`,t.class),style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`}},t),{"success-icon":C(()=>[y(u(W),{class:`size-4`})]),"info-icon":C(()=>[y(u(G),{class:`size-4`})]),"warning-icon":C(()=>[y(u(J),{class:`size-4`})]),"error-icon":C(()=>[y(u(K),{class:`size-4`})]),"loading-icon":C(()=>[i(`div`,null,[y(u(A),{class:`size-4 animate-spin`})])]),"close-icon":C(()=>[y(u(j),{class:`size-4`})]),_:1},16,[`class`]))}}),Z={key:0,class:`min-h-screen flex`},Q={class:`flex-1 overflow-auto bg-muted`},$=n(o({__name:`App`,setup(e){let n=l(),a=c(),o=t(!1),s=[`/login`,`/setup`];async function f(){if(s.includes(a.path)){o.value=!1;return}try{await g.getStats(),o.value=!0}catch{o.value=!1,n.push(`/login`)}}return f(),m(()=>a.path,f),(e,t)=>{let n=S(`router-view`);return v(),r(w,null,[o.value?(v(),r(`div`,Z,[y(Y),i(`main`,Q,[y(n)])])):(v(),d(n,{key:1})),y(u(X),{richColors:``,position:`top-center`})],64)}}}));$.use(h),$.mount(`#app`);
1
+ import{A as e,Dt as t,F as n,G as r,H as i,It as a,J as o,K as s,M as c,N as l,Pt as u,U as d,V as f,W as p,at as ee,ct as te,dt as ne,gt as m,it as re,j as h,k as g,n as _,ot as v,q as y,r as b,tt as x,ut as S,yt as C,z as w,zt as T}from"./button-BLX8zWc1.js";import{i as ie}from"./format-Dln15Luw.js";import{b as E}from"./Teleport-BGbwtNTD.js";import{a as ae,i as D,n as oe,r as O,t as se}from"./SelectValue-TvIOOalu.js";import{t as k}from"./file-text-CqJ33eWr.js";import{t as A}from"./loader-circle-CnEL8ILi.js";import{t as j}from"./x-DMAovOe-.js";import{a as M,c as N,i as P,n as F,o as I,r as L,s as R,t as z}from"./alert-dialog-DgtxmV7t.js";import{n as ce,r as le,t as ue}from"./PopoverTrigger-BVsxIE2L.js";import{t as B}from"./badge-NUBqZBxu.js";import{n as V,t as H}from"./lib-DQotd1d8.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var U=E(`activity`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]),de=E(`arrow-left-right`,[[`path`,{d:`M8 3 4 7l4 4`,key:`9rb6wj`}],[`path`,{d:`M4 7h16`,key:`6tx8e3`}],[`path`,{d:`m16 21 4-4-4-4`,key:`siv7j2`}],[`path`,{d:`M20 17H4`,key:`h6l3hr`}]]),fe=E(`arrow-up-right`,[[`path`,{d:`M7 7h10v10`,key:`1tivn9`}],[`path`,{d:`M7 17 17 7`,key:`1vkiza`}]]),pe=E(`calendar-clock`,[[`path`,{d:`M16 14v2.2l1.6 1`,key:`fo4ql5`}],[`path`,{d:`M16 2v4`,key:`4m81vk`}],[`path`,{d:`M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5`,key:`1osxxc`}],[`path`,{d:`M3 10h5`,key:`r794hk`}],[`path`,{d:`M8 2v4`,key:`1cmpym`}],[`circle`,{cx:`16`,cy:`16`,r:`6`,key:`qoo3c4`}]]),W=E(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),G=E(`info`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]),me=E(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]),he=E(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),ge=E(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),K=E(`octagon-x`,[[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z`,key:`2d38gg`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]),_e=E(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),ve=E(`refresh-cw`,[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]),q=E(`server`,[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]),ye=E(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),be=E(`sparkles`,[[`path`,{d:`M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z`,key:`1s2grr`}],[`path`,{d:`M20 2v4`,key:`1rf3ol`}],[`path`,{d:`M22 4h-4`,key:`gwowj6`}],[`circle`,{cx:`4`,cy:`20`,r:`2`,key:`6kqj1y`}]]),J=E(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),xe={class:`w-56 bg-sidebar text-sidebar-foreground flex-shrink-0 flex flex-col`},Se={class:`p-4 border-b border-sidebar-border`},Ce={class:`flex items-center gap-2`},we={key:0,class:`p-3 border-b border-border`},Te={class:`flex items-center gap-2 mb-2`},Ee={class:`w-4 h-4 rounded-full bg-primary flex items-center justify-center text-primary-foreground`},De={class:`text-xs text-muted-foreground mb-2`},Oe={class:`text-primary font-medium`},ke={key:1,class:`text-xs text-warning bg-warning-light p-2 rounded`},Ae={key:1,class:`p-3 border-b border-border`},je={class:`flex items-center gap-2 mb-2`},Me={class:`w-4 h-4 rounded-full bg-primary flex items-center justify-center text-primary-foreground`},Ne={class:`flex items-center gap-2 mb-2`},Pe={key:2,class:`p-3`},Fe={class:`px-3 py-2 flex justify-between items-center text-xs text-muted-foreground`},Ie={class:`flex-1 p-2 space-y-1`},Le={class:`p-3 border-t border-sidebar-border`},Re={class:`bg-muted px-1 py-0.5 rounded text-xs`},ze=300*1e3,Y=o({__name:`Sidebar`,setup(n){let o=t(null),m=t(!1),h=t(!1),b=t(!1),x=t(!1),E=t(!1),A=null;async function j(){try{o.value=await g.getUpgradeStatus()}catch{o.value=null}}async function H(){try{await g.triggerUpgradeCheck(),await j()}catch(t){V.error(e(t,`检查失败`))}}async function W(){if(o.value?.npm.latestVersion){b.value=!0;try{await g.executeUpgrade(o.value.npm.latestVersion),V.success(`升级成功`),m.value=!1,h.value=!0,await j()}catch(t){V.error(e(t,`升级失败`))}finally{b.value=!1}}}async function G(){let t=o.value?.syncSource??`github`;x.value=!0;try{await g.syncConfig(t),V.success(`配置同步成功`),await j()}catch(t){V.error(e(t,`同步失败`))}finally{x.value=!1}}async function K(t){if(typeof t==`string`)try{await g.setSyncSource(t),await j()}catch(t){V.error(e(t,`保存失败`))}}let J=f(()=>{if(!o.value)return 0;let e=0;return o.value.npm.hasUpdate&&e++,o.value.config.hasUpdate&&e++,e});re(()=>{j(),A=setInterval(j,ze)}),ee(()=>{A&&clearInterval(A)});let Y=[{path:`/`,label:`仪表盘`,icon:he},{path:`/providers`,label:`供应商`,icon:q},{path:`/mappings`,label:`模型映射`,icon:de},{path:`/schedules`,label:`调度管理`,icon:pe},{path:`/router-keys`,label:`API 密钥`,icon:me},{path:`/retry-rules`,label:`重试规则`,icon:_e},{path:`/proxy-enhancement`,label:`代理增强(实验性)`,icon:be},{path:`/monitor`,label:`实时监控`,icon:U},{path:`/logs`,label:`请求日志`,icon:k},{path:`/settings`,label:`系统设置`,icon:ye}],X=c(),Z=l();function Q(e){return e===`/`?X.path===`/`:X.path.startsWith(e)}function $(){window.location.reload()}async function Be(){try{await g.logout()}finally{Z.push(`/login`)}}return(e,t)=>{let n=S(`router-link`);return v(),r(`aside`,xe,[i(`div`,Se,[i(`div`,Ce,[t[15]||=i(`div`,{class:`w-8 h-8 bg-sidebar-primary rounded-lg flex items-center justify-center`},[i(`svg`,{class:`w-5 h-5 text-sidebar-primary-foreground`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[i(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z`})])],-1),y(u(le),{open:E.value,"onUpdate:open":t[1]||=e=>E.value=e},{default:C(()=>[y(u(ue),{"as-child":``},{default:C(()=>[y(u(_),{variant:`ghost`,class:`flex items-center gap-2 px-0 h-auto`},{default:C(()=>[t[5]||=i(`span`,{class:`font-semibold text-sm`},`LLM Router`,-1),y(u(B),{variant:`secondary`,class:`text-[10px] px-1.5 py-0 h-4 leading-none`},{default:C(()=>[s(`v`+T(u(`0.6.2`)),1)]),_:1}),J.value>0?(v(),d(u(B),{key:0,variant:`destructive`,class:`text-[10px] px-1.5 h-4 leading-none bg-destructive text-destructive-foreground font-semibold`},{default:C(()=>[s(T(J.value),1)]),_:1})):p(``,!0)]),_:1})]),_:1}),y(u(ce),{side:`right`,align:`start`,class:`w-80 p-0`},{default:C(()=>[o.value?.npm.hasUpdate?(v(),r(`div`,we,[i(`div`,Te,[i(`div`,Ee,[y(u(fe),{class:`w-3 h-3`})]),t[6]||=i(`span`,{class:`text-sm font-medium`},`新版本可用`,-1)]),i(`p`,De,[s(T(o.value.npm.currentVersion)+` → `,1),i(`span`,Oe,T(o.value.npm.latestVersion),1)]),o.value.deployment===`npm`?(v(),d(u(_),{key:0,size:`sm`,class:`w-full text-xs`,disabled:b.value,onClick:t[0]||=e=>m.value=!0},{default:C(()=>[s(T(b.value?`升级中...`:`一键升级`),1)]),_:1},8,[`disabled`])):(v(),r(`div`,ke,[s(` 检测到 `+T(o.value.deployment===`docker`?`Docker`:`未知`)+` 部署,请手动更新: `,1),t[7]||=i(`code`,{class:`block mt-1 text-warning bg-warning-dark/10 p-1 rounded`},`docker pull ghcr.io/zhushanwen321/llm-simple-router:latest`,-1)]))])):p(``,!0),o.value?.config.hasUpdate?(v(),r(`div`,Ae,[i(`div`,je,[i(`div`,Me,[y(u(ve),{class:`w-3 h-3`})]),t[8]||=i(`span`,{class:`text-sm font-medium`},`推荐配置已更新`,-1)]),t[12]||=i(`p`,{class:`text-xs text-muted-foreground mb-2`},` 供应商或重试规则有新版本 `,-1),i(`div`,Ne,[t[11]||=i(`span`,{class:`text-xs text-muted-foreground`},`来源`,-1),y(u(ae),{"model-value":o.value?.syncSource,"onUpdate:modelValue":K},{default:C(()=>[y(u(oe),{class:`h-7 text-xs flex-1`},{default:C(()=>[y(u(se))]),_:1}),y(u(D),null,{default:C(()=>[y(u(O),{value:`github`},{default:C(()=>[...t[9]||=[s(`GitHub`,-1)]]),_:1}),y(u(O),{value:`gitee`},{default:C(()=>[...t[10]||=[s(`Gitee`,-1)]]),_:1})]),_:1})]),_:1},8,[`model-value`])]),y(u(_),{size:`sm`,variant:`secondary`,class:`w-full text-xs`,disabled:x.value,onClick:G},{default:C(()=>[s(T(x.value?`同步中...`:`同步配置`),1)]),_:1},8,[`disabled`])])):p(``,!0),!o.value?.npm.hasUpdate&&!o.value?.config.hasUpdate?(v(),r(`div`,Pe,[...t[13]||=[i(`p`,{class:`text-xs text-muted-foreground`},`当前已是最新版本,配置也是最新的`,-1)]])):p(``,!0),i(`div`,Fe,[i(`span`,null,T(o.value?.lastCheckedAt?`检查于 ${u(ie)(o.value.lastCheckedAt).toLocaleTimeString(`zh-CN`,{timeZone:`Asia/Shanghai`})}`:`未检查`),1),y(u(_),{variant:`link`,class:`text-primary h-auto p-0`,onClick:H},{default:C(()=>[...t[14]||=[s(`立即检查`,-1)]]),_:1})])]),_:1})]),_:1},8,[`open`])])]),i(`nav`,Ie,[(v(),r(w,null,te(Y,e=>y(n,{key:e.path,to:e.path,class:a([`flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors`,Q(e.path)?`bg-sidebar-accent text-sidebar-primary`:`text-sidebar-foreground hover:bg-sidebar-accent`])},{default:C(()=>[(v(),d(ne(e.icon),{class:`w-4 h-4`})),s(` `+T(e.label),1)]),_:2},1032,[`to`,`class`])),64))]),i(`div`,Le,[y(u(_),{variant:`ghost`,class:`w-full justify-start text-sidebar-foreground hover:text-sidebar-foreground hover:bg-sidebar-accent`,onClick:Be},{default:C(()=>[y(u(ge),{class:`w-4 h-4`}),t[16]||=s(` 登出 `,-1)]),_:1})]),y(u(N),{open:m.value,"onUpdate:open":t[2]||=e=>m.value=e},{default:C(()=>[y(u(M),null,{default:C(()=>[y(u(F),null,{default:C(()=>[y(u(z),null,{default:C(()=>[s(`确认升级到 `+T(o.value?.npm.latestVersion)+`?`,1)]),_:1}),y(u(P),null,{default:C(()=>[t[17]||=s(` 将执行 `,-1),i(`code`,Re,`npm install -g llm-simple-router@`+T(o.value?.npm.latestVersion),1),t[18]||=s(`,升级完成后需要重启服务才能生效。 `,-1)]),_:1})]),_:1}),y(u(L),null,{default:C(()=>[y(u(I),null,{default:C(()=>[...t[19]||=[s(`取消`,-1)]]),_:1}),y(u(R),{onClick:W,disabled:b.value},{default:C(()=>[s(T(b.value?`升级中...`:`确认升级`),1)]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`open`]),y(u(N),{open:h.value,"onUpdate:open":t[4]||=e=>h.value=e},{default:C(()=>[y(u(M),null,{default:C(()=>[y(u(F),null,{default:C(()=>[y(u(z),null,{default:C(()=>[...t[20]||=[s(`升级成功`,-1)]]),_:1}),y(u(P),null,{default:C(()=>[s(` 已升级到 `+T(o.value?.npm.latestVersion)+`。需要重启服务才能生效。 `,1)]),_:1})]),_:1}),y(u(L),null,{default:C(()=>[y(u(I),{onClick:t[3]||=e=>h.value=!1},{default:C(()=>[...t[21]||=[s(`稍后重启`,-1)]]),_:1}),y(u(R),{onClick:$},{default:C(()=>[...t[22]||=[s(`立即重启`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`open`])])}}}),X=o({__name:`Sonner`,props:{id:{},invert:{type:Boolean},theme:{},position:{},closeButtonPosition:{},hotkey:{},richColors:{type:Boolean},expand:{type:Boolean},duration:{},gap:{},visibleToasts:{},closeButton:{type:Boolean},toastOptions:{},class:{},style:{},offset:{},mobileOffset:{},dir:{},swipeDirections:{},icons:{},containerAriaLabel:{}},setup(e){let t=e;return(e,n)=>(v(),d(u(H),x({class:u(b)(`toaster group`,t.class),style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`}},t),{"success-icon":C(()=>[y(u(W),{class:`size-4`})]),"info-icon":C(()=>[y(u(G),{class:`size-4`})]),"warning-icon":C(()=>[y(u(J),{class:`size-4`})]),"error-icon":C(()=>[y(u(K),{class:`size-4`})]),"loading-icon":C(()=>[i(`div`,null,[y(u(A),{class:`size-4 animate-spin`})])]),"close-icon":C(()=>[y(u(j),{class:`size-4`})]),_:1},16,[`class`]))}}),Z={key:0,class:`min-h-screen flex`},Q={class:`flex-1 overflow-auto bg-muted`},$=n(o({__name:`App`,setup(e){let n=l(),a=c(),o=t(!1),s=[`/login`,`/setup`];async function f(){if(s.includes(a.path)){o.value=!1;return}try{await g.getStats(),o.value=!0}catch{o.value=!1,n.push(`/login`)}}return f(),m(()=>a.path,f),(e,t)=>{let n=S(`router-view`);return v(),r(w,null,[o.value?(v(),r(`div`,Z,[y(Y),i(`main`,Q,[y(n)])])):(v(),d(n,{key:1})),y(u(X),{richColors:``,position:`top-center`})],64)}}}));$.use(h),$.mount(`#app`);
@@ -5,7 +5,7 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/admin/favicon.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>LLM Simple Router</title>
8
- <script type="module" crossorigin src="/admin/assets/index-BEKWug0p.js"></script>
8
+ <script type="module" crossorigin src="/admin/assets/index-D0rWQKkW.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/admin/assets/button-BLX8zWc1.js">
10
10
  <link rel="modulepreload" crossorigin href="/admin/assets/Teleport-BGbwtNTD.js">
11
11
  <link rel="modulepreload" crossorigin href="/admin/assets/PopperContent-B23SzU9H.js">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llm-simple-router",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "LLM API proxy router with OpenAI/Anthropic support, model mapping, retry strategies, and admin dashboard",
5
5
  "license": "MIT",
6
6
  "author": "ZZzzswszzZZ",