ezllm 0.0.28 → 0.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/bin/ezllm.js +3 -0
- package/dist/cli.js +41 -24512
- package/dist/daemon.js +25 -0
- package/dist/server.js +196 -41916
- package/dist/web-ui/assets/DashboardView-DOwvAtq-.js +1 -0
- package/dist/web-ui/assets/LayoutView-B4fUaz9C.js +1 -0
- package/dist/web-ui/assets/LayoutView-Cx9vUqeZ.css +1 -0
- package/dist/web-ui/assets/LoginView-BQEkBw8e.css +1 -0
- package/dist/web-ui/assets/LoginView-G89QGoG0.js +1 -0
- package/dist/web-ui/assets/LogsView--ahw0k4u.js +9 -0
- package/dist/web-ui/assets/LogsView-C5nwx_hg.css +1 -0
- package/dist/web-ui/assets/ProvidersView-Bfb6bLjb.js +14 -0
- package/dist/web-ui/assets/ProvidersView-CLtKgvo_.css +1 -0
- package/dist/web-ui/assets/ServiceStatusView-Bkg3N6YJ.css +1 -0
- package/dist/web-ui/assets/ServiceStatusView-DAFz0O6i.js +2 -0
- package/dist/web-ui/assets/SettingsView-0a5M4naA.css +1 -0
- package/dist/web-ui/assets/SettingsView-DNTvqQlE.js +1 -0
- package/dist/web-ui/assets/SetupView-BA06j75c.js +1 -0
- package/dist/web-ui/assets/SetupView-BDyHouba.css +1 -0
- package/dist/web-ui/assets/clipboard-JYWVdyjq.js +1 -0
- package/dist/web-ui/assets/config-B6AvsVNP.js +1 -0
- package/dist/web-ui/assets/format-OBe8peUU.js +1 -0
- package/dist/web-ui/assets/index-kwJNWvLc.js +49 -0
- package/dist/web-ui/assets/{index-BNieAChJ.css → index-wQvjidwN.css} +1 -1
- package/dist/web-ui/assets/message-CYCqk4yf.js +2 -0
- package/dist/web-ui/assets/providers-C9CHuG_i.js +1 -0
- package/dist/web-ui/assets/router-Oh7GPjpX.js +6 -0
- package/dist/web-ui/assets/useCopyToast-5I0bBbzu.js +1 -0
- package/dist/web-ui/assets/{useManagerApi-fVrRDZkc.js → useManagerApi-LTdyIrJc.js} +1 -1
- package/dist/web-ui/assets/useToast-C4nXu2HZ.js +1 -0
- package/dist/web-ui/assets/{version-quqH5oMc.js → version-DegxwpkG.js} +1 -1
- package/dist/web-ui/index.html +4 -4
- package/package.json +13 -5
- package/bin/ellm-proxy.js +0 -3
- package/dist/web-ui/assets/DashboardView-ChJpgKis.js +0 -1
- package/dist/web-ui/assets/DashboardView-DOtZtkUN.css +0 -1
- package/dist/web-ui/assets/LayoutView-C8YPw0x2.js +0 -1
- package/dist/web-ui/assets/LayoutView-DMNmIelM.css +0 -1
- package/dist/web-ui/assets/LoginView-BZnxf_XD.css +0 -1
- package/dist/web-ui/assets/LoginView-C4hkT-3T.js +0 -1
- package/dist/web-ui/assets/LogsView-D7xJOKSv.css +0 -1
- package/dist/web-ui/assets/LogsView-DdS8qKEs.js +0 -9
- package/dist/web-ui/assets/ProvidersView-BD33caY8.js +0 -14
- package/dist/web-ui/assets/ProvidersView-DNqX_AWw.css +0 -1
- package/dist/web-ui/assets/ServiceStatusView-BtF40E0V.js +0 -2
- package/dist/web-ui/assets/ServiceStatusView-DXbn--55.css +0 -1
- package/dist/web-ui/assets/SettingsView-BY2QIyXL.css +0 -1
- package/dist/web-ui/assets/SettingsView-SdL8ednl.js +0 -1
- package/dist/web-ui/assets/SetupView-B3SahEFi.css +0 -1
- package/dist/web-ui/assets/SetupView-BZFBBRSd.js +0 -1
- package/dist/web-ui/assets/clipboard-CorU9X8e.js +0 -1
- package/dist/web-ui/assets/config-Dbms19Et.js +0 -1
- package/dist/web-ui/assets/format-DrbP4_cY.js +0 -1
- package/dist/web-ui/assets/index-C6wv4UB9.js +0 -49
- package/dist/web-ui/assets/message-CEBSyhlN.js +0 -2
- package/dist/web-ui/assets/providers-DkujdEZ8.js +0 -1
- package/dist/web-ui/assets/router-BqkHX02I.js +0 -6
- package/dist/web-ui/assets/useLoadError-Yu7YH4ZH.js +0 -1
- package/dist/web-ui/assets/useToast-DJwG-33L.js +0 -1
- package/docs/DESIGN.md +0 -98
- /package/{hook.example.js → hook.example.cjs} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Q as s,Tt as c,V as l,Wt as u,Z as d,a as f,at as ee,et as p,fn as m,ht as te,it as h,j as g,k as _,mt as v,nt as ne,vt as y,w as b}from"./router-Oh7GPjpX.js";import{t as x}from"./useManagerApi-LTdyIrJc.js";import{t as S}from"./providers-C9CHuG_i.js";import{n as C,t as w}from"./useCopyToast-5I0bBbzu.js";import{t as T}from"./latestRequest-Dk21IcrH.js";import{a as re,d as E,o as D,r as ie,t as ae}from"./format-OBe8peUU.js";y();function oe(e){let{loadError:t,run:n}=C(e),r=c(null);function i(e){let t=async()=>{let i=await n(e);return i?r.value===t&&(r.value=null):r.value=t,i};return t}function a(e){n(r.value??e)}return{loadError:t,track:i,retry:a}}l(),y(),u();var se={class:`flex-col-gap`},ce={class:`kv-grid`},le={class:`kv-item kv-span-2`},ue={class:`kv-value`},de={class:`kv-item`},fe={class:`kv-value`},pe={class:`kv-item`},me={class:`kv-value`},he={class:`kv-unit`},ge={class:`kv-item`},_e={class:`kv-value`},O={class:`kv-item`},k={class:`kv-value`},A={class:`flex-between card-header-wrap`},j={class:`flex-gap-8`},M={class:`usage-grid`},N={class:`usage-cell`},P={class:`usage-num orange`},F={class:`usage-cell`},I={class:`usage-num blue`},ve={class:`usage-cell`},ye={class:`usage-num green`},be={class:`usage-cell`},xe={class:`usage-num purple`},Se={class:`usage-cell`},Ce={class:`usage-num purple`},we={key:0,class:`usage-cell`},Te={class:`usage-num gray`},L={key:0},Ee=[`onClick`],R=n({__name:`DashboardView`,setup(n){let l=S(),{copyWithToast:u}=w(),{loadError:y,track:C,retry:R}=oe(),z=c(null),B=c(!0),V=c(``),H=c(`today`),De=E(`today`),U=c([...De]),Oe=e=>{let t=E(e);t&&(H.value=e,U.value=t,W())},ke=e=>{e?Oe(e):(H.value=``,U.value=null,W())},Ae=()=>{H.value=``,W()},je=i(()=>{let e=new Set;for(let t of l.suppliers)for(let n of t.models)e.add(n.modelName);if(z.value?.models)for(let t of z.value.models)e.add(t.model);return[...e].sort()}),Me=T(),W=C(async()=>{let e=Me();B.value=!0;try{let t=new URLSearchParams;V.value&&t.set(`model`,V.value),U.value?.length===2&&(t.set(`startDate`,U.value[0]),t.set(`endDate`,U.value[1]));let n=t.toString(),r=await f.get(`/api/usage${n?`?${n}`:``}`);if(!e())return;z.value=r}catch(t){if(!e())return;throw t}finally{e()&&(B.value=!1)}}),Ne=T(),G=C(async()=>{let e=Ne();try{await Promise.all([W(),l.loadProviders()])}catch(t){if(!e())return;throw t}finally{e()&&(B.value=!1)}}),Pe=()=>R(G),Fe=window.location.hostname,Ie=Number(window.location.port)||null,K=i(()=>ae({protocol:window.location.protocol,hostname:Fe,port:Ie})),q=c(null),J=c(null),Y=c(!1),X=c(!0),Z=c(Date.now()),Q=async()=>{let[e,t]=await Promise.allSettled([x.processes(),f.get(`/api/status`)]);if(X.value=!1,e.status===`fulfilled`&&(q.value=e.value[0]??null),t.status===`rejected`){J.value=null,Y.value=!0;return}let n=t.value?.masterKeySet;J.value=typeof n==`boolean`?n:null,Y.value=typeof n!=`boolean`,Z.value=Date.now()},Le=e=>{if(!e.startedAt)return`-`;let t=Math.max(0,Math.floor((Z.value-e.startedAt)/1e3)),n=Math.floor(t/86400);t-=n*86400;let r=Math.floor(t/3600);t-=r*3600;let i=Math.floor(t/60);return t-=i*60,[n?`${n}天`:``,r?`${r}时`:``,i?`${i}分`:``,`${t}秒`].filter(Boolean).join(` `)},Re=i(()=>Y.value?`获取失败,请刷新重试`:J.value===null?`-`:J.value?`已设置(/v1 需 Bearer 认证)`:`未设置(/v1 免鉴权)`),$;return d(()=>{G(),Q(),$=window.setInterval(Q,1e4)}),s(()=>window.clearInterval($)),(n,i)=>{let s=h(`el-button`),c=h(`el-alert`),l=h(`el-card`),d=h(`el-option`),f=h(`el-select`),x=h(`el-date-picker`),S=h(`el-table-column`),C=h(`el-table`),w=h(`el-empty`),T=ee(`loading`);return p(),r(`div`,se,[o(y)?(p(),e(c,{key:0,title:o(y),type:`error`,"show-icon":``,closable:!1},{default:v(()=>[t(s,{size:`small`,onClick:Pe},{default:v(()=>[...i[4]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):g(``,!0),t(l,{shadow:`never`},{header:v(()=>[...i[5]||=[_(`span`,{class:`fw-600`},`服务信息`,-1)]]),default:v(()=>[te((p(),r(`div`,ce,[_(`div`,le,[i[6]||=_(`div`,{class:`kv-label`},`API 地址`,-1),_(`div`,ue,[_(`span`,{class:`copy-text`,onClick:i[0]||=e=>o(u)(K.value)},m(K.value),1)])]),_(`div`,de,[i[7]||=_(`div`,{class:`kv-label`},`API 密钥`,-1),_(`div`,fe,m(Re.value),1)]),_(`div`,pe,[i[10]||=_(`div`,{class:`kv-label`},`运行状态`,-1),_(`div`,me,[q.value?(p(),r(b,{key:0},[i[8]||=_(`span`,{class:`status-dot running`},null,-1),i[9]||=a(`运行中 `,-1),_(`span`,he,`PID `+m(q.value.pid??`-`),1)],64)):(p(),r(b,{key:1},[a(`-`)],64))])]),_(`div`,ge,[i[11]||=_(`div`,{class:`kv-label`},`运行时长`,-1),_(`div`,_e,m(q.value?Le(q.value):`-`),1)]),_(`div`,O,[i[12]||=_(`div`,{class:`kv-label`},`内存占用`,-1),_(`div`,k,m(q.value?o(re)(q.value.memory):`-`),1)])])),[[T,B.value||X.value]])]),_:1}),z.value?(p(),e(l,{key:1,shadow:`never`},{header:v(()=>[_(`div`,A,[i[14]||=_(`span`,{class:`fw-600`},`用量统计`,-1),_(`div`,j,[t(f,{modelValue:V.value,"onUpdate:modelValue":i[1]||=e=>V.value=e,placeholder:`全部模型`,clearable:``,filterable:``,style:{width:`220px`},onChange:o(W)},{default:v(()=>[(p(!0),r(b,null,ne(je.value,t=>(p(),e(d,{key:t,label:t,value:t},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`onChange`]),t(f,{modelValue:H.value,"onUpdate:modelValue":i[2]||=e=>H.value=e,placeholder:`时间范围`,clearable:``,style:{width:`130px`},onChange:ke},{default:v(()=>[t(d,{label:`今天`,value:`today`}),t(d,{label:`昨天`,value:`yesterday`}),t(d,{label:`前天`,value:`beforeYesterday`}),t(d,{label:`近三天`,value:`last3days`}),t(d,{label:`本周`,value:`week`}),t(d,{label:`本月`,value:`month`})]),_:1},8,[`modelValue`]),t(x,{modelValue:U.value,"onUpdate:modelValue":i[3]||=e=>U.value=e,type:`daterange`,"range-separator":`至`,"start-placeholder":`开始日期`,"end-placeholder":`结束日期`,"value-format":`YYYY-MM-DD`,style:{width:`260px`},onChange:Ae},null,8,[`modelValue`]),t(s,{loading:B.value,onClick:o(W)},{default:v(()=>[...i[13]||=[a(`刷新`,-1)]]),_:1},8,[`loading`,`onClick`])])])]),default:v(()=>[_(`div`,M,[_(`div`,N,[_(`div`,P,m(o(D)(z.value.total.total_tokens)),1),i[15]||=_(`div`,{class:`usage-label`},`总 Token`,-1)]),_(`div`,F,[_(`div`,I,m(o(D)(z.value.total.input_tokens)),1),i[16]||=_(`div`,{class:`usage-label`},`输入 Token`,-1)]),_(`div`,ve,[_(`div`,ye,m(o(D)(z.value.total.output_tokens)),1),i[17]||=_(`div`,{class:`usage-label`},`输出 Token`,-1)]),_(`div`,be,[_(`div`,xe,m(o(D)(z.value.total.cache_read_tokens)),1),i[18]||=_(`div`,{class:`usage-label`},`缓存读取`,-1)]),_(`div`,Se,[_(`div`,Ce,m(z.value.total.cache_rate==null?`-`:z.value.total.cache_rate+`%`),1),i[19]||=_(`div`,{class:`usage-label`},`缓存命中率`,-1)]),z.value.logStorageMB==null?g(``,!0):(p(),r(`div`,we,[_(`div`,Te,m(z.value.logStorageMB),1),i[20]||=_(`div`,{class:`usage-label`},`数据目录占用 (MB)`,-1)]))]),z.value.models?.length?(p(),r(`div`,L,[i[21]||=_(`div`,{class:`section-title`},`模型用量`,-1),t(C,{data:z.value.models,stripe:``,class:`full-width`},{default:v(()=>[t(S,{prop:`model`,label:`模型`,"min-width":`200`},{default:v(({row:e})=>[_(`span`,{class:`copy-text`,onClick:t=>o(u)(e.model)},m(e.model),9,Ee)]),_:1}),t(S,{label:`调用次数`,width:`90`,align:`center`},{default:v(({row:e})=>[a(m(e.calls),1)]),_:1}),t(S,{label:`平均耗时`,width:`110`,align:`center`},{default:v(({row:e})=>[a(m(o(ie)(e.avg_duration)),1)]),_:1}),t(S,{label:`总 Token`,width:`140`,align:`center`},{default:v(({row:e})=>[a(m(o(D)(e.total_tokens)),1)]),_:1}),t(S,{label:`输入 Token`,width:`140`,align:`center`},{default:v(({row:e})=>[a(m(o(D)(e.input_tokens)),1)]),_:1}),t(S,{label:`输出 Token`,width:`140`,align:`center`},{default:v(({row:e})=>[a(m(o(D)(e.output_tokens)),1)]),_:1}),t(S,{label:`缓存读取`,width:`130`,align:`center`},{default:v(({row:e})=>[a(m(o(D)(e.cache_read_tokens)),1)]),_:1}),t(S,{label:`缓存命中率`,width:`110`,align:`center`},{default:v(({row:e})=>[a(m(e.cache_rate==null?`-`:e.cache_rate+`%`),1)]),_:1})]),_:1},8,[`data`])])):(p(),e(w,{key:1,description:`暂无调用记录`,"image-size":60}))]),_:1})):g(``,!0)])}}});export{R as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Tt as s,V as c,Wt as l,Z as u,at as d,et as f,fn as p,ht as m,i as h,it as g,j as _,k as v,l as y,lt as b,mt as x,n as S,o as C,u as w,vt as T,w as E}from"./router-Oh7GPjpX.js";import{m as D}from"./message-CYCqk4yf.js";import{n as O,t as k}from"./index-kwJNWvLc.js";import{n as A,t as j}from"./useManagerApi-LTdyIrJc.js";import{t as M}from"./useToast-C4nXu2HZ.js";import{n as N,t as P}from"./version-DegxwpkG.js";c(),l(),T();var F={class:`check-body`},I={class:`version-row`},L={class:`version-row`},R={class:`muted-sm`},z=k(n({__name:`UpdateCheckDialog`,props:{modelValue:{type:Boolean,default:!1},modelModifiers:{}},emits:[`update:modelValue`],setup(n){let{toast:i}=M(),c=b(n,`modelValue`),l=s(!1),u=s(!1),h=s(null),y=s(null),S=s(null),C=s(null),w=null,T=()=>w?.abort(),D=e=>new Date(e).toLocaleString(),k=e=>`https://www.npmjs.com/package/ezllm/v/${e}`,z=async()=>{y.value=null,S.value=null,C.value=null,l.value=!0;try{let e=await j.update();if(h.value=e,!e.supported)return;y.value=await j.checkUpdate()}catch(e){S.value=e.message||`检查更新失败`}finally{l.value=!1}},B=async()=>{if(!y.value)return;let e=y.value.latestVersion;try{await O.confirm(`确定更新到 ${e}?服务会自动重启并在启动时安装新版本:重启期间管理台短暂不可访问(预计 1~3 分钟),更新完成后自动恢复。`,`更新确认`,{confirmButtonText:`立即更新`,cancelButtonText:`取消`,type:`warning`})}catch{return}u.value=!0;let t=new AbortController;w=t;try{let e=await j.update(),n=await j.applyUpdate();if(!n.updated){C.value=`已是最新版本 ${n.toVersion}`,y.value={hasUpdate:!1,currentVersion:n.toVersion,latestVersion:n.toVersion,checkedAt:Date.now()};return}C.value=`正在重启服务并安装 ${n.toVersion}(预计 1~3 分钟):重启期间管理台短暂不可访问,完成后这里会自动显示结果。`;let r=await A({targetVersion:n.toVersion,sinceAppliedAt:e.lastApply?.appliedAt??null,signal:t.signal});if(t.signal.aborted)return;r&&!r.error?(i(`已更新到 ${r.toVersion}`,`success`),C.value=`已更新 ${r.fromVersion} → ${r.toVersion},服务已在新版本上运行。`,y.value={hasUpdate:!1,currentVersion:r.toVersion,latestVersion:r.toVersion,checkedAt:Date.now()}):r?.error?(i(`更新失败:${r.error}`,`error`),C.value=N(r.error)):C.value=`更新仍在进行(安装耗时较长):稍后刷新页面查看最新状态。`}catch(e){i(e.message||`更新失败`,`error`)}finally{u.value=!1,w===t&&(w=null)}};return(n,i)=>{let s=g(`el-alert`),b=g(`el-tag`),w=g(`el-link`),O=g(`el-button`),A=g(`el-dialog`),j=d(`loading`);return f(),e(A,{modelValue:c.value,"onUpdate:modelValue":i[2]||=e=>c.value=e,title:`检查更新`,width:`420px`,"close-on-click-modal":!u.value,onOpen:z,onClose:T},{footer:x(()=>[y.value?.hasUpdate?(f(),e(O,{key:0,type:`primary`,loading:u.value,onClick:B},{default:x(()=>[a(p(u.value?`更新中...`:`立即更新`),1)]),_:1},8,[`loading`])):_(``,!0),t(O,{onClick:i[1]||=e=>c.value=!1},{default:x(()=>[...i[11]||=[a(`关闭`,-1)]]),_:1})]),default:x(()=>[m((f(),r(`div`,F,[h.value&&!h.value.supported?(f(),e(s,{key:0,title:`当前为源码运行模式,更新功能不可用`,type:`info`,"show-icon":``,closable:!1},{default:x(()=>[...i[3]||=[v(`div`,{class:`alert-hint`},[a(` 仅 npm 全局安装的包支持自动更新。本地开发用仓库里的 `),v(`code`,null,`pnpm upgrade:local`),a(` 更新运行中的服务。 `)],-1)]]),_:1})):y.value?(f(),r(E,{key:1},[v(`div`,I,[i[5]||=v(`span`,{class:`version-label`},`当前版本`,-1),t(b,{size:`small`},{default:x(()=>[a(p(y.value.currentVersion),1)]),_:1}),o(P)(y.value.currentVersion)?(f(),e(b,{key:0,type:`warning`,size:`small`,"disable-transitions":``},{default:x(()=>[...i[4]||=[a(`本地构建`,-1)]]),_:1})):_(``,!0)]),v(`div`,L,[i[6]||=v(`span`,{class:`version-label`},`最新版本`,-1),t(b,{type:y.value.hasUpdate?`warning`:`success`,size:`small`,"disable-transitions":``},{default:x(()=>[a(p(y.value.latestVersion),1)]),_:1},8,[`type`])]),t(s,{title:y.value.hasUpdate?`发现新版本 ${y.value.latestVersion}(当前 ${y.value.currentVersion})`:`已是最新版本 ${y.value.currentVersion}`,type:y.value.hasUpdate?`warning`:`success`,"show-icon":``,closable:!1,class:`mt-12`},null,8,[`title`,`type`]),v(`div`,R,[a(` 检查时间:`+p(D(y.value.checkedAt))+` `,1),y.value.hasUpdate?(f(),r(E,{key:0},[i[8]||=a(` · `,-1),t(w,{type:`primary`,href:k(y.value.latestVersion),target:`_blank`},{default:x(()=>[...i[7]||=[a(`在 npm 查看该版本`,-1)]]),_:1},8,[`href`])],64)):_(``,!0)])],64)):!l.value&&S.value?(f(),e(s,{key:2,title:S.value,type:`error`,"show-icon":``,closable:!1},{default:x(()=>[i[10]||=v(`div`,{class:`alert-hint`},` 检查需访问 npm 源,可能是网络不可达或版本号解析失败;稍后重试即可。 `,-1),t(O,{size:`small`,class:`mt-8`,onClick:z},{default:x(()=>[...i[9]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):_(``,!0)])),[[j,l.value]]),C.value?(f(),e(s,{key:0,title:C.value,type:`info`,"show-icon":``,class:`mt-12`,onClose:i[0]||=e=>C.value=null},null,8,[`title`])):_(``,!0)]),_:1},8,[`modelValue`,`close-on-click-modal`])}}}),[[`__scopeId`,`data-v-ea1efda8`]]);c(),l(),T();var B={class:`layout`},V=[`title`],H={key:0,class:`header-version-tag`},U={class:`header-nav`},W={class:`header-actions`},G={class:`user-chip`},K={class:`user-avatar`},q={class:`user-name`},J={class:`main`},Y={class:`page`},X=k(n({__name:`LayoutView`,setup(n){let c=y(),l=w(),d=s(!1);u(()=>{S()});let m=i(()=>h.value?.version||``),b=i(()=>P(h.value?.version)),T=i(()=>b.value?`本地构建版本(upgrade:local 产物)`:`当前运行版本`),E=i(()=>h.value?.authRequired!==!1),O=i(()=>{if(!E.value)return`免登录`;let e=localStorage.getItem(`webui_token`)||``;try{return atob(e).split(`:`)[0]||`用户`}catch{return`用户`}}),k=i(()=>{let e=c.path;return e===`/`?`/`:e.startsWith(`/providers`)?`/providers`:e.startsWith(`/service-status`)?`/service-status`:e.startsWith(`/settings`)?`/settings`:e.startsWith(`/logs`)?`/logs`:`/`}),A=()=>{C(),l.push(`/login`)},j=e=>{e===`logout`&&A(),e===`check-update`&&(d.value=!0)};return(n,i)=>{let s=g(`el-menu-item`),c=g(`el-menu`),l=g(`el-icon`),u=g(`el-dropdown-item`),h=g(`el-dropdown-menu`),y=g(`el-dropdown`),S=g(`el-header`),C=g(`router-view`);return f(),r(`div`,B,[t(S,{class:`header`},{default:x(()=>[i[8]||=v(`div`,{class:`brand`},[v(`span`,{class:`brand-mark`},`EZ`),v(`h1`,null,`LLM`)],-1),m.value?(f(),r(`span`,{key:0,class:`header-version`,title:T.value},[a(` v`+p(m.value),1),b.value?(f(),r(`span`,H,`本地构建`)):_(``,!0)],8,V)):_(``,!0),v(`nav`,U,[t(c,{mode:`horizontal`,"default-active":k.value,ellipsis:!1,router:``,class:`header-menu`},{default:x(()=>[t(s,{index:`/`},{default:x(()=>[...i[1]||=[a(`首页`,-1)]]),_:1}),t(s,{index:`/providers`},{default:x(()=>[...i[2]||=[a(`供应商管理`,-1)]]),_:1}),t(s,{index:`/service-status`},{default:x(()=>[...i[3]||=[a(`服务状态`,-1)]]),_:1}),t(s,{index:`/logs`},{default:x(()=>[...i[4]||=[a(`日志`,-1)]]),_:1}),t(s,{index:`/settings`},{default:x(()=>[...i[5]||=[a(`设置`,-1)]]),_:1})]),_:1},8,[`default-active`])]),v(`div`,W,[t(y,{trigger:`click`,onCommand:j,class:`ml-12`},{dropdown:x(()=>[t(h,null,{default:x(()=>[t(u,{command:`check-update`},{default:x(()=>[...i[6]||=[a(`检查更新`,-1)]]),_:1}),E.value?(f(),e(u,{key:0,command:`logout`,divided:``},{default:x(()=>[...i[7]||=[a(`退出`,-1)]]),_:1})):_(``,!0)]),_:1})]),default:x(()=>[v(`div`,G,[v(`span`,K,p(O.value.charAt(0).toUpperCase()),1),v(`span`,q,p(O.value),1),t(l,{class:`el-icon--right`},{default:x(()=>[t(o(D))]),_:1})])]),_:1})])]),_:1}),v(`main`,J,[v(`div`,Y,[t(C)])]),t(z,{modelValue:d.value,"onUpdate:modelValue":i[0]||=e=>d.value=e},null,8,[`modelValue`])])}}}),[[`__scopeId`,`data-v-db5cd7ca`]]);export{X as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.mt-8[data-v-ea1efda8]{margin-top:8px}.mt-12[data-v-ea1efda8]{margin-top:12px}.check-body[data-v-ea1efda8]{min-height:80px}.alert-hint[data-v-ea1efda8]{margin-top:4px;font-size:12px;line-height:1.6}.alert-hint code[data-v-ea1efda8]{background:var(--el-fill-color-light);border-radius:4px;padding:1px 6px;font-size:12px}.version-row[data-v-ea1efda8]{align-items:center;gap:8px;margin-bottom:8px;display:flex}.version-label[data-v-ea1efda8]{color:var(--el-text-color-secondary);font-size:13px}.muted-sm[data-v-ea1efda8]{color:var(--el-text-color-secondary);margin-top:8px;font-size:12px}.user-chip[data-v-db5cd7ca]{cursor:pointer;border-radius:999px;outline:none;align-items:center;gap:8px;padding:4px 8px 4px 4px;transition:background .15s;display:flex}.user-chip[data-v-db5cd7ca]:hover{background:var(--el-fill-color-light)}.user-avatar[data-v-db5cd7ca]{color:#fff;background:linear-gradient(135deg,#4f8df9 0%,#2563eb 100%);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;font-size:13px;font-weight:600;display:inline-flex}.user-name[data-v-db5cd7ca]{color:var(--el-text-color-primary);text-overflow:ellipsis;white-space:nowrap;max-width:120px;font-size:13px;overflow:hidden}.user-chip .el-icon--right[data-v-db5cd7ca]{color:var(--el-text-color-secondary);font-size:12px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.login-card[data-v-b3e448fa]{border-radius:16px;width:100%;max-width:400px;box-shadow:0 12px 40px #1f23291a}.login-brand[data-v-b3e448fa]{justify-content:center;align-items:center;gap:10px;margin-top:8px;display:flex}.login-title[data-v-b3e448fa]{letter-spacing:.3px;color:var(--el-text-color-primary);font-size:20px;font-weight:700}.login-sub[data-v-b3e448fa]{text-align:center;color:var(--el-text-color-secondary);margin:6px 0 28px;font-size:13px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,F as t,I as n,M as r,P as i,S as a,Tt as o,V as s,a as c,c as l,et as u,it as d,j as f,k as p,m,mt as h,u as g,vt as _,x as v}from"./router-Oh7GPjpX.js";import{t as y}from"./index-kwJNWvLc.js";s(),m(),_();var b={class:`login-wrap`},x=y(n({__name:`LoginView`,setup(n){let s=g(),m=o(``),_=o(``),y=o(``),x=o(!1);async function S(){if(!m.value){y.value=`请输入用户名`;return}if(!_.value){y.value=`请输入密码`;return}x.value=!0,y.value=``;try{let e=await c.post(`/api/auth/login`,{username:m.value.trim(),password:_.value});l(e.token),s.push(`/`)}catch(e){y.value=e.message||`登录失败`}finally{x.value=!1}}return(n,o)=>{let s=d(`el-input`),c=d(`el-form-item`),l=d(`el-alert`),g=d(`el-button`),C=d(`el-form`),w=d(`el-card`);return u(),r(`div`,b,[t(w,{shadow:`never`,class:`login-card`},{default:h(()=>[o[3]||=p(`div`,{class:`login-brand`},[p(`span`,{class:`brand-mark`},`EZ`),p(`span`,{class:`login-title`},`LLM`)],-1),o[4]||=p(`p`,{class:`login-sub`},`本地 LLM 网关 · 管理台登录`,-1),t(C,{"label-position":`top`,onSubmit:a(S,[`prevent`])},{default:h(()=>[t(c,{label:`用户名`},{default:h(()=>[t(s,{modelValue:m.value,"onUpdate:modelValue":o[0]||=e=>m.value=e,placeholder:`请输入用户名`,onKeyup:v(S,[`enter`])},null,8,[`modelValue`])]),_:1}),t(c,{label:`密码`},{default:h(()=>[t(s,{modelValue:_.value,"onUpdate:modelValue":o[1]||=e=>_.value=e,type:`password`,placeholder:`请输入密码`,"show-password":``,onKeyup:v(S,[`enter`])},null,8,[`modelValue`])]),_:1}),y.value?(u(),e(l,{key:0,title:y.value,type:`error`,"show-icon":``,class:`mb-16`},null,8,[`title`])):f(``,!0),t(g,{type:`primary`,class:`full-width`,loading:x.value,onClick:S},{default:h(()=>[...o[2]||=[i(` 登录 `,-1)]]),_:1},8,[`loading`])]),_:1})]),_:1})])}}}),[[`__scopeId`,`data-v-b3e448fa`]]);export{x as default};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{A as e,F as t,I as n,M as r,O as i,P as a,Pt as o,Tt as s,V as c,Wt as l,Z as u,a as d,at as ee,et as f,fn as p,ht as te,it as m,j as h,k as g,m as _,mt as v,nt as y,vt as b,w as x,x as S}from"./router-Oh7GPjpX.js";import{n as C,t as w}from"./index-kwJNWvLc.js";import{t as T}from"./providers-C9CHuG_i.js";import{n as E,t as D}from"./useCopyToast-5I0bBbzu.js";import{t as O}from"./useToast-C4nXu2HZ.js";import{t as k}from"./latestRequest-Dk21IcrH.js";import{c as A,d as j,l as M,n as ne,o as N,r as re,s as P}from"./format-OBe8peUU.js";c(),b(),l();var F={key:1,class:`detail-content`},I={key:0,class:`ip-link`},L={class:`ip-pop`},R={class:`ip-pop-row`},z={key:0,class:`ip-pop-row`},B={key:1,class:`ip-pop-error`},V={key:2},H=[`href`],U={key:1},W={key:1},G={class:`error-text`},ie={class:`pane-bar`},K={class:`json-block`},q={class:`pane-bar`},J={class:`json-block`},ae={class:`pane-bar`},Y={class:`json-block`},X={class:`pane-bar`},Z={class:`json-block`},Q={class:`pane-bar`},oe={class:`json-block`},$={class:`pane-bar`},se={class:`json-block`},ce={class:`pane-bar`},le={class:`json-block`},ue={class:`pane-bar`},de={class:`json-block`},fe=w(n({__name:`LogDetailDialog`,setup(n,{expose:i}){let{copyWithToast:c}=D(),{loadError:l,run:u}=E(),_=s(!1),y=s(null),b=s(`info`),S=s(!1),C=s(null),w=k(),T=e=>{C.value=e,_.value=!0,y.value=null,b.value=`info`;let t=w();u(async()=>{try{let n=`?id=${String(e.id)}`,r=await d.get(`/api/logs/detail`+n);if(!t())return;r&&r.detail?y.value={...r.detail,...r.meta}:y.value=r}catch(e){if(!t())return;throw e}})},O=()=>{C.value&&T(C.value)};i({open:T});let j=async e=>{if(!(e._ipInfo||e._ipInfoError)){S.value=!0;try{let t=await d.get(`/api/logs/ipinfo?ip=${encodeURIComponent(e.ip)}`);t.error?e._ipInfoError=t.error:e._ipInfo=t}catch{e._ipInfoError=`查询失败`}finally{S.value=!1}}},fe=e=>[e.country,e.region,e.city].filter(Boolean).join(` · `)||`-`;return(n,i)=>{let s=m(`el-button`),u=m(`el-alert`),d=m(`el-descriptions-item`),C=m(`el-tag`),w=m(`el-divider`),T=m(`el-popover`),E=m(`el-descriptions`),D=m(`el-tab-pane`),k=m(`el-tabs`),pe=m(`el-dialog`),me=ee(`loading`);return f(),e(pe,{modelValue:_.value,"onUpdate:modelValue":i[11]||=e=>_.value=e,title:`日志详情`,width:`80%`,top:`5vh`,"destroy-on-close":``},{default:v(()=>[o(l)?(f(),e(u,{key:0,title:o(l),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:v(()=>[t(s,{size:`small`,onClick:O},{default:v(()=>[...i[12]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):h(``,!0),y.value?(f(),r(`div`,F,[t(k,{modelValue:b.value,"onUpdate:modelValue":i[10]||=e=>b.value=e},{default:v(()=>[t(D,{label:`基本信息`,name:`info`},{default:v(()=>[t(E,{column:2,border:``},{default:v(()=>[t(d,{label:`时间`},{default:v(()=>[a(p(o(A)(y.value.time)),1)]),_:1}),t(d,{label:`模型`},{default:v(()=>[a(p(y.value.model),1)]),_:1}),t(d,{label:`方法`},{default:v(()=>[a(p(y.value.method),1)]),_:1}),t(d,{label:`路径`},{default:v(()=>[a(p(y.value.path),1)]),_:1}),t(d,{label:`状态码`},{default:v(()=>[a(p(y.value.status),1)]),_:1}),t(d,{label:`流式`},{default:v(()=>[t(C,{type:y.value.stream?`warning`:`info`},{default:v(()=>[a(p(y.value.stream?`是`:`否`),1)]),_:1},8,[`type`])]),_:1}),t(d,{label:`IP`},{default:v(()=>[y.value.ip?(f(),r(`span`,I,[t(T,{placement:`right`,width:`240`,trigger:`click`,onShow:i[0]||=e=>j(y.value)},{reference:v(()=>[g(`span`,null,p(y.value.ip),1)]),default:v(()=>[te((f(),r(`div`,L,[y.value._ipInfo?(f(),r(x,{key:0},[g(`div`,R,[i[13]||=g(`span`,{class:`ip-pop-label`},`归属地`,-1),g(`span`,null,p(fe(y.value._ipInfo)),1)]),y.value._ipInfo.isp?(f(),r(`div`,z,[i[14]||=g(`span`,{class:`ip-pop-label`},`运营商`,-1),g(`span`,null,p(y.value._ipInfo.isp),1)])):h(``,!0)],64)):y.value._ipInfoError?(f(),r(`div`,B,p(y.value._ipInfoError),1)):(f(),r(`span`,V,`查询中...`)),t(w,{style:{margin:`8px 0`}}),g(`a`,{class:`ip-pop-link`,href:`https://m.ip138.com/iplookup.php?ip=${encodeURIComponent(y.value.ip)}`,target:`_blank`},`在 ip138 查看`,8,H)])),[[me,S.value]])]),_:1})])):(f(),r(`span`,U,`-`))]),_:1}),t(d,{label:`Session`},{default:v(()=>[a(p(y.value.session_id||`-`),1)]),_:1}),t(d,{label:`ID`},{default:v(()=>[y.value._id==null?(f(),r(`span`,W,`-`)):(f(),r(`span`,{key:0,class:`request-id`,title:`点击复制(日志 id 同时是响应头 x-request-id)`,onClick:i[1]||=e=>o(c)(String(y.value._id))},p(y.value._id),1))]),_:1}),t(d,{label:`输入 Token(含缓存读取)`},{default:v(()=>[a(p(o(N)(y.value.input_tokens??0)),1)]),_:1}),t(d,{label:`输出 Token`},{default:v(()=>[a(p(o(N)(y.value.output_tokens??0)),1)]),_:1}),t(d,{label:`缓存读取`},{default:v(()=>[a(p(o(N)(y.value.cache_read_tokens??0)),1)]),_:1}),t(d,{label:`请求耗时`},{default:v(()=>[a(p(o(re)(y.value.duration)),1)]),_:1}),t(d,{label:`缓存命中率`},{default:v(()=>[a(p(o(ne)(y.value)),1)]),_:1}),y.value.error?(f(),e(d,{key:0,label:`错误`,span:2},{default:v(()=>[g(`span`,G,p(y.value.error),1)]),_:1})):h(``,!0)]),_:1}),y.value.response?.truncated?(f(),e(u,{key:0,class:`mt-16`,type:`warning`,closable:!1,title:`内容超过单请求捕获上限,已截断`})):h(``,!0)]),_:1}),y.value.response?._capture?(f(),r(x,{key:0},[t(D,{label:`客户端请求`,name:`inbound`},{default:v(()=>[g(`div`,ie,[t(s,{size:`small`,class:`copy-btn`,onClick:i[2]||=e=>o(c)(o(P)(y.value.response.inbound_request))},{default:v(()=>[...i[15]||=[a(` 复制 `,-1)]]),_:1})]),g(`pre`,K,p(o(P)(y.value.response.inbound_request)),1)]),_:1}),t(D,{label:`转发上游的请求`,name:`upstreamReq`},{default:v(()=>[g(`div`,q,[t(s,{size:`small`,class:`copy-btn`,onClick:i[3]||=e=>o(c)(o(P)(y.value.response.upstream_request))},{default:v(()=>[...i[16]||=[a(` 复制 `,-1)]]),_:1})]),g(`pre`,J,p(o(P)(y.value.response.upstream_request)),1)]),_:1}),y.value.response.upstream_response_text?(f(),e(D,{key:0,label:`上游响应(原始)`,name:`upstreamRes`},{default:v(()=>[g(`div`,ae,[t(s,{size:`small`,class:`copy-btn`,onClick:i[4]||=e=>o(c)(y.value.response.upstream_response_text)},{default:v(()=>[...i[17]||=[a(` 复制 `,-1)]]),_:1})]),g(`pre`,Y,p(o(M)(y.value.response.upstream_response_text)),1)]),_:1})):y.value.response.upstream_stream_frames?.length?(f(),e(D,{key:1,label:`上游响应(原始流,${y.value.response.upstream_stream_frames.length} 帧)`,name:`upstreamStream`},{default:v(()=>[g(`div`,X,[t(s,{size:`small`,class:`copy-btn`,onClick:i[5]||=e=>o(c)(y.value.response.upstream_stream_frames.join(`
|
|
2
|
+
|
|
3
|
+
`))},{default:v(()=>[...i[18]||=[a(` 复制 `,-1)]]),_:1})]),g(`pre`,Z,p(y.value.response.upstream_stream_frames.join(`
|
|
4
|
+
|
|
5
|
+
`)),1)]),_:1},8,[`label`])):h(``,!0),y.value.response.client_response!==void 0&&y.value.response.client_response!==null?(f(),e(D,{key:2,label:`回写客户端(转换后)`,name:`clientRes`},{default:v(()=>[g(`div`,Q,[t(s,{size:`small`,class:`copy-btn`,onClick:i[6]||=e=>o(c)(o(P)(y.value.response.client_response))},{default:v(()=>[...i[19]||=[a(` 复制 `,-1)]]),_:1})]),g(`pre`,oe,p(o(P)(y.value.response.client_response)),1)]),_:1})):y.value.response.client_stream_frames?.length?(f(),e(D,{key:3,label:`回写客户端(${y.value.response.client_stream_frames.length} 帧)`,name:`clientStream`},{default:v(()=>[g(`div`,$,[t(s,{size:`small`,class:`copy-btn`,onClick:i[7]||=e=>o(c)(y.value.response.client_stream_frames.join(`
|
|
6
|
+
|
|
7
|
+
`))},{default:v(()=>[...i[20]||=[a(` 复制 `,-1)]]),_:1})]),g(`pre`,se,p(y.value.response.client_stream_frames.join(`
|
|
8
|
+
|
|
9
|
+
`)),1)]),_:1},8,[`label`])):h(``,!0)],64)):(f(),r(x,{key:1},[t(D,{label:`请求体`,name:`request`},{default:v(()=>[g(`div`,ce,[t(s,{size:`small`,class:`copy-btn`,onClick:i[8]||=e=>o(c)(o(P)(y.value.request))},{default:v(()=>[...i[21]||=[a(` 复制 `,-1)]]),_:1})]),g(`pre`,le,p(o(P)(y.value.request)),1)]),_:1}),t(D,{label:`响应体`,name:`response`},{default:v(()=>[g(`div`,ue,[t(s,{size:`small`,class:`copy-btn`,onClick:i[9]||=e=>o(c)(o(P)(y.value.response))},{default:v(()=>[...i[22]||=[a(` 复制 `,-1)]]),_:1})]),g(`pre`,de,p(o(P)(y.value.response)),1)]),_:1})],64))]),_:1},8,[`modelValue`])])):h(``,!0)]),_:1},8,[`modelValue`])}}}),[[`__scopeId`,`data-v-2e1cbd0d`]]);function pe(e){if(e.truncated!==!0)return null;let t=e.scanLimit;return`结果可能不完整:${typeof t==`number`&&Number.isFinite(t)&&t>0?`仅扫描了最近 ${t} 条有详情的记录`:`仅扫描了最近的部分记录`},建议缩小时间范围或更换关键词`}function me(e,t){let n=e.trim();return t>0||n.length!==1?null:`未找到匹配记录:单字符关键字仅按摘要列(模型、路径等)匹配,不会回退搜索请求/响应内容,建议补充至 2 个字符以上`}c(),b(),_(),l();var he={class:`logs-page`},ge={class:`filter-bar`},_e={class:`table-wrap`},ve=[`onClick`],ye={key:1},be={class:`pagination-bar`},xe=w(n({__name:`LogsView`,setup(n){let c=T(),{toast:l}=O(),{copyWithToast:_}=D(),{loadError:b,run:w}=E(),M=s(``),P=s(null),F=s(`2xx`),I=s(`model`),L=s(``),R=s(``),z=s([]),B=s(0),V=s(1),H=s(50),U=s(!1),W=s(null),G=s(null),ie=e=>{G.value?.open(e)},K=i(()=>{let e=new Set;for(let t of c.suppliers)for(let n of t.models)e.add(n.modelName);for(let t of z.value)t.model&&e.add(t.model);return[...e].sort()}),q=e=>{let t=j(e);t&&(M.value=e,P.value=t,$())},J=e=>{e?q(e):(M.value=``,P.value=null,$())},ae=e=>{M.value=``,P.value=e||null,$()},Y=()=>{let e={};return P.value&&P.value.length===2&&(e.startDate=P.value[0],e.endDate=P.value[1]),F.value&&(e.status=F.value),I.value&&(e.pathGroup=I.value),L.value&&(e.model=L.value),R.value&&(e.keyword=R.value),e},X=k(),Z=()=>w(async()=>{let e=X();U.value=!0;try{let t={...Y(),page:String(V.value),pageSize:String(H.value),sort:`time`,order:`desc`},n=new URLSearchParams(t).toString(),r=await d.get(`/api/logs?`+n);if(!e())return;z.value=r.items||[],B.value=r.total||0,W.value=pe(r)??me(R.value,r.total||0)}catch(t){if(!e())return;throw t}finally{e()&&(U.value=!1)}}),Q=s(!1),oe=async()=>{if(!(Q.value||B.value===0)){try{await C.confirm(`将永久清理当前筛选条件下的 ${B.value} 条日志,清理后不可恢复,请谨慎操作!`,`清理确认`,{confirmButtonText:`确认清理`,cancelButtonText:`取消`,type:`warning`})}catch{return}Q.value=!0;try{let e=new URLSearchParams(Y()).toString(),t=await d.post(`/api/logs/clear?`+e,{});l(`已清理 ${t.deleted??0} 条日志`,`success`),V.value>1&&(V.value=1),Z()}catch(e){l(e.message||`清理失败`,`error`)}finally{Q.value=!1}}},$=()=>{V.value=1,Z()},se=()=>{M.value=`today`,P.value=null,F.value=`2xx`,I.value=`model`,L.value=``,R.value=``,V.value=1,H.value=50,q(`today`)};return u(()=>{c.loadProviders().catch(()=>{}),q(`today`)}),(n,i)=>{let s=m(`el-button`),c=m(`el-alert`),l=m(`el-option`),u=m(`el-select`),d=m(`el-date-picker`),C=m(`el-input`),w=m(`el-card`),T=m(`el-table-column`),E=m(`el-tag`),D=m(`el-table`),O=m(`el-pagination`),k=ee(`loading`);return f(),r(`div`,he,[o(b)?(f(),e(c,{key:0,title:o(b),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:v(()=>[t(s,{size:`small`,onClick:Z},{default:v(()=>[...i[9]||=[a(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):h(``,!0),W.value?(f(),e(c,{key:1,title:W.value,type:`warning`,"show-icon":``,closable:``,class:`mb-16`,onClose:i[0]||=e=>W.value=null},null,8,[`title`])):h(``,!0),t(w,{shadow:`never`},{default:v(()=>[g(`div`,ge,[t(u,{modelValue:M.value,"onUpdate:modelValue":i[1]||=e=>M.value=e,placeholder:`时间范围`,clearable:``,style:{width:`130px`},onChange:J},{default:v(()=>[t(l,{label:`今天`,value:`today`}),t(l,{label:`昨天`,value:`yesterday`}),t(l,{label:`前天`,value:`beforeYesterday`}),t(l,{label:`近三天`,value:`last3days`}),t(l,{label:`本周`,value:`week`}),t(l,{label:`本月`,value:`month`})]),_:1},8,[`modelValue`]),t(d,{modelValue:P.value,"onUpdate:modelValue":i[2]||=e=>P.value=e,type:`daterange`,"value-format":`YYYY-MM-DD`,"range-separator":`至`,"start-placeholder":`开始日期`,"end-placeholder":`结束日期`,style:{width:`260px`},onChange:ae},null,8,[`modelValue`]),t(u,{modelValue:F.value,"onUpdate:modelValue":i[3]||=e=>F.value=e,placeholder:`全部状态`,clearable:``,style:{width:`120px`},onChange:$},{default:v(()=>[t(l,{label:`成功 (2xx)`,value:`2xx`}),t(l,{label:`3xx`,value:`3xx`}),t(l,{label:`4xx`,value:`4xx`}),t(l,{label:`5xx`,value:`5xx`}),t(l,{label:`错误 (4xx+)`,value:`err`})]),_:1},8,[`modelValue`]),t(u,{modelValue:I.value,"onUpdate:modelValue":i[4]||=e=>I.value=e,placeholder:`全部路径`,clearable:``,style:{width:`130px`},onChange:$},{default:v(()=>[t(l,{label:`模型接口`,value:`model`}),t(l,{label:`其他`,value:`other`})]),_:1},8,[`modelValue`]),t(u,{modelValue:L.value,"onUpdate:modelValue":i[5]||=e=>L.value=e,placeholder:`全部模型`,clearable:``,filterable:``,style:{width:`220px`},onChange:$},{default:v(()=>[(f(!0),r(x,null,y(K.value,t=>(f(),e(l,{key:t,label:t,value:t},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`]),t(C,{modelValue:R.value,"onUpdate:modelValue":i[6]||=e=>R.value=e,class:`keyword-input`,placeholder:`关键字搜索(请求/响应内容)`,clearable:``,onKeyup:S($,[`enter`])},null,8,[`modelValue`]),t(s,{type:`primary`,class:`push-right`,onClick:$},{default:v(()=>[...i[10]||=[a(`搜索`,-1)]]),_:1}),t(s,{onClick:se},{default:v(()=>[...i[11]||=[a(`重置`,-1)]]),_:1})])]),_:1}),t(w,{shadow:`never`,class:`mt-16 table-card`},{default:v(()=>[g(`div`,_e,[te((f(),e(D,{data:z.value,stripe:``,height:`100%`},{default:v(()=>[t(T,{prop:`id`,label:`ID`,"min-width":`110`},{default:v(({row:e})=>[e.id==null?(f(),r(`span`,ye,`-`)):(f(),r(`span`,{key:0,class:`request-id`,title:`点击复制(日志 id 同时是响应头 x-request-id,可用于关联控制台日志与检索)`,onClick:t=>o(_)(String(e.id))},p(e.id),9,ve))]),_:1}),t(T,{prop:`time`,label:`时间`,width:`180`},{default:v(({row:e})=>[a(p(o(A)(e.time)),1)]),_:1}),t(T,{prop:`model`,label:`模型`,"min-width":`180`}),t(T,{prop:`status`,label:`状态`,width:`80`,align:`center`},{default:v(({row:e})=>[t(E,{size:`small`,type:e.status>=400?`danger`:e.status>=300?`warning`:`success`},{default:v(()=>[a(p(e.status),1)]),_:2},1032,[`type`])]),_:1}),t(T,{label:`输入`,width:`110`,align:`center`},{default:v(({row:e})=>[a(p(o(N)(e.input_tokens??0)),1)]),_:1}),t(T,{label:`输出`,width:`110`,align:`center`},{default:v(({row:e})=>[a(p(o(N)(e.output_tokens??0)),1)]),_:1}),t(T,{label:`缓存读取`,width:`90`,align:`center`},{default:v(({row:e})=>[a(p(o(N)(e.cache_read_tokens??0)),1)]),_:1}),t(T,{label:`缓存命中率`,width:`105`,align:`center`},{default:v(({row:e})=>[g(`span`,null,p(o(ne)(e)),1)]),_:1}),t(T,{label:`请求耗时`,width:`90`,align:`center`},{default:v(({row:e})=>[a(p(o(re)(e.duration)),1)]),_:1}),t(T,{label:`详情`,width:`70`,align:`center`},{default:v(({row:e})=>[t(s,{link:``,type:`primary`,onClick:t=>ie(e)},{default:v(()=>[...i[12]||=[a(`查看`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[k,U.value]])]),g(`div`,be,[t(s,{type:`danger`,plain:``,size:`small`,loading:Q.value,disabled:B.value===0,onClick:oe},{default:v(()=>[...i[13]||=[a(`清理已筛选日志`,-1)]]),_:1},8,[`loading`,`disabled`]),t(O,{class:`push-right`,"current-page":V.value,"onUpdate:currentPage":i[7]||=e=>V.value=e,"page-size":H.value,"onUpdate:pageSize":i[8]||=e=>H.value=e,total:B.value,"page-sizes":[20,50,100,200],layout:`total, sizes, prev, pager, next`,onCurrentChange:Z,onSizeChange:Z},null,8,[`current-page`,`page-size`,`total`])])]),_:1}),t(fe,{ref_key:`logDetailRef`,ref:G},null,512)])}}}),[[`__scopeId`,`data-v-b10fdcb7`]]);export{xe as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.ip-link[data-v-2e1cbd0d]{color:#409eff;cursor:pointer}.ip-link[data-v-2e1cbd0d]:hover{text-decoration:underline}.ip-pop[data-v-2e1cbd0d]{min-height:20px;font-size:13px}.ip-pop-row[data-v-2e1cbd0d]{gap:8px;margin-bottom:4px;display:flex}.ip-pop-label[data-v-2e1cbd0d]{color:#909399;flex-shrink:0}.ip-pop-error[data-v-2e1cbd0d]{color:#f56c6c}.ip-pop-link[data-v-2e1cbd0d]{color:#409eff;font-size:13px}.error-text[data-v-2e1cbd0d]{color:#f56c6c}.pane-bar[data-v-2e1cbd0d]{flex-shrink:0;justify-content:flex-end;margin-bottom:8px;display:flex}.json-block[data-v-2e1cbd0d]{white-space:pre-wrap;word-break:break-all;background:#f5f7fa;border:1px solid #e4e7ed;border-radius:4px;flex:1;min-height:0;padding:12px;font-size:13px;line-height:1.5;overflow:auto}.detail-content[data-v-2e1cbd0d]{flex-direction:column;height:78vh;display:flex;overflow:hidden}.detail-content[data-v-2e1cbd0d] .el-tabs{flex-direction:column;flex:1;min-height:0;display:flex}.detail-content[data-v-2e1cbd0d] .el-tabs__content{flex:1;min-height:0}.detail-content[data-v-2e1cbd0d] .el-tab-pane{flex-direction:column;height:100%;display:flex;overflow:auto}.copy-btn[data-v-2e1cbd0d]{margin-left:8px;padding:2px 10px;font-size:12px}.logs-page[data-v-b10fdcb7]{flex-direction:column;height:calc(100vh - 124px);display:flex;overflow:hidden}.request-id[data-v-b10fdcb7]{cursor:pointer;white-space:nowrap;text-overflow:ellipsis;font-family:ui-monospace,Consolas,monospace;display:block;overflow:hidden}.request-id[data-v-b10fdcb7]:hover{color:var(--el-color-primary)}.filter-bar[data-v-b10fdcb7]{flex-wrap:nowrap;align-items:center;gap:12px;display:flex}.filter-bar .keyword-input[data-v-b10fdcb7]{flex:1;min-width:160px}.filter-bar .push-right[data-v-b10fdcb7]{margin-left:auto}.filter-bar[data-v-b10fdcb7] .el-button+.el-button{margin-left:0}@media (width<=900px){.filter-bar[data-v-b10fdcb7]{flex-wrap:wrap}.filter-bar .keyword-input[data-v-b10fdcb7]{flex-basis:100%}.filter-bar .push-right[data-v-b10fdcb7]{margin-left:auto}}.mt-16[data-v-b10fdcb7]{margin-top:16px}.table-card[data-v-b10fdcb7]{flex:1;min-height:0;overflow:hidden}.table-card[data-v-b10fdcb7] .el-card__body{flex-direction:column;height:100%;display:flex}.table-wrap[data-v-b10fdcb7]{flex:1;min-height:0}.pagination-bar[data-v-b10fdcb7]{flex-shrink:0;justify-content:space-between;align-items:center;margin-top:16px;display:flex}
|