ezllm 0.0.36 → 0.0.37
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 +16 -11
- package/dist/server.js +60 -54
- package/dist/web-ui/assets/DashboardView-BzKKC4LZ.js +1 -0
- package/dist/web-ui/assets/{LayoutView-DjpChErJ.js → LayoutView-BzBSYjz8.js} +1 -1
- package/dist/web-ui/assets/{LoginView-Dh-JvmGC.js → LoginView-Bzngu7qF.js} +1 -1
- package/dist/web-ui/assets/LogsView-C2cZgB5T.js +5 -0
- package/dist/web-ui/assets/LogsView-u-0B5Xpc.css +1 -0
- package/dist/web-ui/assets/{ManagedServicesView-C5ZROVtT.js → ManagedServicesView-5QT_g-5a.js} +2 -2
- package/dist/web-ui/assets/ProvidersView-BPOzev6x.js +14 -0
- package/dist/web-ui/assets/ServiceStatusView--D1wfNAZ.js +2 -0
- package/dist/web-ui/assets/{SettingsView-MrcC_nr9.js → SettingsView-XXHJh2h8.js} +1 -1
- package/dist/web-ui/assets/SetupView-CSBKlfcJ.css +1 -0
- package/dist/web-ui/assets/SetupView-DcThD5bd.js +1 -0
- package/dist/web-ui/assets/{config-DXHhKDw-.js → config-B8sfBKCc.js} +1 -1
- package/dist/web-ui/assets/format-CO5kjbrg.js +1 -0
- package/dist/web-ui/assets/{index-BKnCp9qM.js → index-CZeCUjra.js} +1 -1
- package/dist/web-ui/assets/{index-wQvjidwN.css → index-s_h6GEbv.css} +1 -1
- package/dist/web-ui/assets/{message-C1fkA9sE.js → message-sILMvZIb.js} +1 -1
- package/dist/web-ui/assets/{providers-BHK2eZZc.js → providers-dvoMyAle.js} +1 -1
- package/dist/web-ui/assets/{router-DI9ZLaCn.js → router-BUuAm5No.js} +2 -2
- package/dist/web-ui/assets/{useManagerApi-l9V9LoLa.js → useManagerApi-XPGaswMw.js} +1 -1
- package/dist/web-ui/assets/{useQuickRangeFilter-Crb6MDvU.js → useQuickRangeFilter-Bg2q_vMO.js} +1 -1
- package/dist/web-ui/assets/useToast-BscapoHF.js +1 -0
- package/dist/web-ui/index.html +4 -4
- package/package.json +1 -1
- package/dist/web-ui/assets/DashboardView-4pju0xUn.js +0 -1
- package/dist/web-ui/assets/LogsView-BLOCTdb6.js +0 -5
- package/dist/web-ui/assets/LogsView-D7FTeaYQ.css +0 -1
- package/dist/web-ui/assets/ProvidersView-Dwc7I6G0.js +0 -14
- package/dist/web-ui/assets/ServiceStatusView-fiaEQZNp.js +0 -2
- package/dist/web-ui/assets/SetupView-BLl-ZFOA.css +0 -1
- package/dist/web-ui/assets/SetupView-vTCaewVk.js +0 -1
- package/dist/web-ui/assets/format-DbT9vkcP.js +0 -1
- package/dist/web-ui/assets/useToast-PFDoTWpf.js +0 -1
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{A as e,Ct as t,F as n,I as r,M as i,O as a,P as o,Pt as s,S as c,Tt as l,V as u,Wt as d,Z as f,a as p,at as ee,bt as m,et as h,fn as g,ft as _,ht as v,it as y,j as b,k as x,m as S,mt as C,nt as w,vt as T,w as E,x as D,xt as O}from"./router-DI9ZLaCn.js";import{R as k,S as te}from"./message-C1fkA9sE.js";import{n as A,t as j}from"./index-BKnCp9qM.js";import{t as M}from"./providers-BHK2eZZc.js";import{_ as N,a as P,c as F,d as I,f as L,g as R,i as ne,l as z,n as re,o as ie,r as B,u as V,v as H,y as ae}from"./format-DbT9vkcP.js";import{t as oe}from"./useToast-PFDoTWpf.js";import{n as se,t as ce}from"./useQuickRangeFilter-Crb6MDvU.js";u(),T(),d();var U={class:`detail-content`},le={key:0,class:`ip-link`},ue={class:`ip-pop`},W={class:`ip-pop-row`},de={key:0,class:`ip-pop-row`},G={key:1,class:`ip-pop-error`},K={key:2},q=[`href`],fe={key:1},pe={key:1},me={class:`error-text`},J={class:`pane-bar`},he={class:`json-block`},ge={class:`pane-bar`},_e={class:`json-block`},Y={class:`pane-bar`},ve={class:`json-block`},ye={class:`pane-bar`},X={class:`json-block`},be={class:`pane-bar`},Z={class:`json-block`},Q={class:`pane-bar`},xe={class:`json-block`},$={class:`pane-bar`},Se={class:`json-block`},Ce={class:`pane-bar`},we={class:`json-block`},Te=j(r({__name:`LogDetailDialog`,setup(t,{expose:r}){let{copyWithToast:c}=H(),{loadError:u,run:d}=ae(),f=l(!1),m=l(null),_=l(!1),S=l(`info`),w=l(!1),T=l(null),D=se(),k=e=>{T.value=e,f.value=!0,m.value=null,S.value=`info`;let t=D();_.value=!0,d(async()=>{try{let n=`?id=${String(e.id)}`,r=await p.get(`/api/logs/detail`+n);if(!t())return;if(r&&r.detail){let e={...r.detail,...r.meta};e.response&&=O(e.response),e.request&&=O(e.request),m.value=e}else m.value=r}catch(e){if(!t())return;throw e}finally{t()&&(_.value=!1)}})},te=()=>{T.value&&k(T.value)};r({open:k});let A=a(()=>z(m.value?.response?.inbound_request)),j=a(()=>z(m.value?.response?.upstream_request)),M=a(()=>I(m.value?.response?.upstream_response_text)),P=a(()=>(m.value?.response?.upstream_stream_frames||[]).join(`
|
|
2
|
-
|
|
3
|
-
`)),L=a(()=>z(m.value?.response?.client_response)),R=a(()=>(m.value?.response?.client_stream_frames||[]).join(`
|
|
4
|
-
|
|
5
|
-
`)),ne=a(()=>z(m.value?.request)),B=a(()=>z(m.value?.response)),oe=async e=>{if(!(e._ipInfo||e._ipInfoError)){w.value=!0;try{let t=await p.get(`/api/logs/ipinfo?ip=${encodeURIComponent(e.ip)}`);t.error?e._ipInfoError=t.error:e._ipInfo=t}catch{e._ipInfoError=`查询失败`}finally{w.value=!1}}},ce=e=>[e.country,e.region,e.city].filter(Boolean).join(` · `)||`-`;return(t,r)=>{let a=y(`el-button`),l=y(`el-alert`),d=y(`el-descriptions-item`),p=y(`el-tag`),T=y(`el-divider`),D=y(`el-popover`),O=y(`el-descriptions`),k=y(`el-tab-pane`),I=y(`el-tabs`),z=y(`el-dialog`),H=ee(`loading`);return h(),e(z,{modelValue:f.value,"onUpdate:modelValue":r[11]||=e=>f.value=e,title:`日志详情`,width:`80%`,top:`5vh`,"destroy-on-close":``},{default:C(()=>[s(u)?(h(),e(l,{key:0,title:s(u),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:C(()=>[n(a,{size:`small`,onClick:te},{default:C(()=>[...r[12]||=[o(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):b(``,!0),v((h(),i(`div`,U,[m.value?(h(),e(I,{key:0,modelValue:S.value,"onUpdate:modelValue":r[10]||=e=>S.value=e},{default:C(()=>[n(k,{lazy:``,label:`基本信息`,name:`info`},{default:C(()=>[n(O,{column:2,border:``},{default:C(()=>[n(d,{label:`时间`},{default:C(()=>[o(g(s(V)(m.value.time)),1)]),_:1}),n(d,{label:`模型`},{default:C(()=>[o(g(m.value.model),1)]),_:1}),n(d,{label:`方法`},{default:C(()=>[o(g(m.value.method),1)]),_:1}),n(d,{label:`路径`},{default:C(()=>[o(g(m.value.path),1)]),_:1}),n(d,{label:`状态码`},{default:C(()=>[o(g(m.value.status),1)]),_:1}),n(d,{label:`流式`},{default:C(()=>[n(p,{type:m.value.stream?`warning`:`info`},{default:C(()=>[o(g(m.value.stream?`是`:`否`),1)]),_:1},8,[`type`])]),_:1}),n(d,{label:`IP`},{default:C(()=>[m.value.ip?(h(),i(`span`,le,[n(D,{placement:`right`,width:`240`,trigger:`click`,onShow:r[0]||=e=>oe(m.value)},{reference:C(()=>[x(`span`,null,g(m.value.ip),1)]),default:C(()=>[v((h(),i(`div`,ue,[m.value._ipInfo?(h(),i(E,{key:0},[x(`div`,W,[r[13]||=x(`span`,{class:`ip-pop-label`},`归属地`,-1),x(`span`,null,g(ce(m.value._ipInfo)),1)]),m.value._ipInfo.isp?(h(),i(`div`,de,[r[14]||=x(`span`,{class:`ip-pop-label`},`运营商`,-1),x(`span`,null,g(m.value._ipInfo.isp),1)])):b(``,!0)],64)):m.value._ipInfoError?(h(),i(`div`,G,g(m.value._ipInfoError),1)):(h(),i(`span`,K,`查询中...`)),n(T,{style:{margin:`8px 0`}}),x(`a`,{class:`ip-pop-link`,href:`https://m.ip138.com/iplookup.php?ip=${encodeURIComponent(m.value.ip)}`,target:`_blank`},`在 ip138 查看`,8,q)])),[[H,w.value]])]),_:1})])):(h(),i(`span`,fe,`-`))]),_:1}),n(d,{label:`Session`},{default:C(()=>[o(g(m.value.session_id||`-`),1)]),_:1}),n(d,{label:`ID`},{default:C(()=>[m.value._id==null?(h(),i(`span`,pe,`-`)):(h(),i(`span`,{key:0,class:`request-id`,title:`点击复制(日志 id 同时是响应头 x-request-id)`,onClick:r[1]||=e=>s(c)(String(m.value._id))},g(m.value._id),1))]),_:1}),n(d,{label:`输入 Token(含缓存读取)`},{default:C(()=>[o(g(s(F)(m.value.input_tokens??0)),1)]),_:1}),n(d,{label:`输出 Token`},{default:C(()=>[o(g(s(F)(m.value.output_tokens??0)),1)]),_:1}),n(d,{label:`缓存读取`},{default:C(()=>[o(g(s(F)(m.value.cache_read_tokens??0)),1)]),_:1}),n(d,{label:`请求耗时`},{default:C(()=>[o(g(s(ie)(m.value.duration)),1)]),_:1}),n(d,{label:`缓存命中率`},{default:C(()=>[o(g(s(re)(m.value)),1)]),_:1}),m.value.error?(h(),e(d,{key:0,label:`错误`,span:2},{default:C(()=>[x(`span`,me,g(m.value.error),1)]),_:1})):b(``,!0)]),_:1}),m.value.response?.truncated?(h(),e(l,{key:0,class:`mt-16`,type:`warning`,closable:!1,title:`内容超过单请求捕获上限,已截断`})):b(``,!0)]),_:1}),m.value.response?._capture?(h(),i(E,{key:0},[n(k,{lazy:``,label:`客户端请求`,name:`inbound`},{default:C(()=>[x(`div`,J,[n(a,{size:`small`,class:`copy-btn`,onClick:r[2]||=e=>s(c)(A.value)},{default:C(()=>[...r[15]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,he,g(s(N)(A.value)),1)]),_:1}),n(k,{lazy:``,label:`转发上游的请求`,name:`upstreamReq`},{default:C(()=>[x(`div`,ge,[n(a,{size:`small`,class:`copy-btn`,onClick:r[3]||=e=>s(c)(j.value)},{default:C(()=>[...r[16]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,_e,g(s(N)(j.value)),1)]),_:1}),m.value.response.upstream_response_text?(h(),e(k,{key:0,lazy:``,label:`上游响应(原始)`,name:`upstreamRes`},{default:C(()=>[x(`div`,Y,[n(a,{size:`small`,class:`copy-btn`,onClick:r[4]||=e=>s(c)(m.value.response.upstream_response_text)},{default:C(()=>[...r[17]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,ve,g(s(N)(M.value)),1)]),_:1})):m.value.response.upstream_stream_frames?.length?(h(),e(k,{key:1,lazy:``,label:`上游响应(原始流,${m.value.response.upstream_stream_frames.length} 帧)`,name:`upstreamStream`},{default:C(()=>[x(`div`,ye,[n(a,{size:`small`,class:`copy-btn`,onClick:r[5]||=e=>s(c)(P.value)},{default:C(()=>[...r[18]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,X,g(s(N)(P.value)),1)]),_:1},8,[`label`])):b(``,!0),m.value.response.client_response!==void 0&&m.value.response.client_response!==null?(h(),e(k,{key:2,lazy:``,label:`回写客户端(转换后)`,name:`clientRes`},{default:C(()=>[x(`div`,be,[n(a,{size:`small`,class:`copy-btn`,onClick:r[6]||=e=>s(c)(L.value)},{default:C(()=>[...r[19]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,Z,g(s(N)(L.value)),1)]),_:1})):m.value.response.client_stream_frames?.length?(h(),e(k,{key:3,lazy:``,label:`回写客户端(${m.value.response.client_stream_frames.length} 帧)`,name:`clientStream`},{default:C(()=>[x(`div`,Q,[n(a,{size:`small`,class:`copy-btn`,onClick:r[7]||=e=>s(c)(R.value)},{default:C(()=>[...r[20]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,xe,g(s(N)(R.value)),1)]),_:1},8,[`label`])):b(``,!0)],64)):(h(),i(E,{key:1},[n(k,{lazy:``,label:`请求体`,name:`request`},{default:C(()=>[x(`div`,$,[n(a,{size:`small`,class:`copy-btn`,onClick:r[8]||=e=>s(c)(ne.value)},{default:C(()=>[...r[21]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,Se,g(s(N)(ne.value)),1)]),_:1}),n(k,{lazy:``,label:`响应体`,name:`response`},{default:C(()=>[x(`div`,Ce,[n(a,{size:`small`,class:`copy-btn`,onClick:r[9]||=e=>s(c)(B.value)},{default:C(()=>[...r[22]||=[o(` 复制 `,-1)]]),_:1})]),x(`pre`,we,g(s(N)(B.value)),1)]),_:1})],64))]),_:1},8,[`modelValue`])):b(``,!0)])),[[H,_.value]])]),_:1},8,[`modelValue`])}}}),[[`__scopeId`,`data-v-9c192d20`]]);u(),T(),d(),S();var Ee={class:`session-table`},De={class:`group-detail`},Oe=[`title`],ke={key:0,class:`detail-error`},Ae={class:`detail-footer`},je={class:`detail-count`},Me=[`title`,`onClick`],Ne=[`title`],Pe=[`title`],Fe=50,Ie=j(r({__name:`SessionGroupTable`,props:{groups:{},noSession:{},loading:{type:Boolean},filterParams:{}},emits:[`open-detail`],setup(r,{emit:u}){let d=r,f=u,{copyWithToast:m}=H(),S=a(()=>d.noSession?[...d.groups,d.noSession]:d.groups),w=e=>e.session_id||`__no_session__`,T=l(null),E=t(new Map),D={loading:!1,items:[],total:0,nextPage:1,error:null},O=e=>E.get(w(e))??D,k=async(e,t)=>{let n=(e=>(E.has(e)||E.set(e,{loading:!1,items:[],total:0,nextPage:1,error:null}),E.get(e)))(w(e));if(!n.loading){n.loading=!0,n.error=null;try{let r={...d.filterParams,sort:`time`,order:`desc`,page:String(t),pageSize:String(Fe)};e.session_id?r.sessionId=e.session_id:r.noSession=`1`;let i=await p.get(`/api/logs?`+new URLSearchParams(r).toString()),a=i.items||[];n.items=t===1?a:[...n.items,...a],n.total=i.total||0,n.nextPage=t+1}catch(e){n.error=e?.message||`加载失败`}finally{n.loading=!1}}},te=(e,t)=>{t.some(t=>w(t)===w(e))&&O(e).items.length===0&&k(e,1)},A=e=>{let t=O(e);t.loading||t.items.length>=t.total||k(e,t.nextPage)},j=e=>{T.value?.toggleRowExpansion(e)};return _(()=>S.value.map(w),e=>{let t=new Set(e);for(let e of[...E.keys()])t.has(e)||E.delete(e)}),(t,a)=>{let l=y(`el-table-column`),u=y(`el-tag`),d=y(`el-button`),p=y(`el-table`),_=y(`el-empty`),E=ee(`loading`);return h(),i(`div`,Ee,[S.value.length>0||r.loading?v((h(),e(p,{key:0,ref_key:`tableRef`,ref:T,data:S.value,height:`100%`,"row-key":w,stripe:``,onExpandChange:te,onRowClick:j},{default:C(()=>[n(l,{type:`expand`},{default:C(({row:t})=>[x(`div`,De,[v((h(),e(p,{data:O(t).items,size:`small`,stripe:``},{default:C(()=>[n(l,{label:`时间`,width:`165`},{default:C(({row:e})=>[o(g(s(V)(e.time)),1)]),_:1}),n(l,{prop:`model`,label:`模型`,"min-width":`150`}),n(l,{label:`客户端`,"min-width":`130`},{default:C(({row:e})=>[x(`span`,{title:e.user_agent||``},g(s(B)(e)),9,Oe)]),_:1}),n(l,{label:`状态`,width:`80`,align:`center`},{default:C(({row:e})=>[n(u,{size:`small`,type:e.status>=400?`danger`:e.status>=300?`warning`:`success`},{default:C(()=>[o(g(e.status),1)]),_:2},1032,[`type`])]),_:1}),n(l,{label:`输入`,width:`100`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.input_tokens??0)),1)]),_:1}),n(l,{label:`输出`,width:`100`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.output_tokens??0)),1)]),_:1}),n(l,{label:`缓存读取`,width:`100`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.cache_read_tokens??0)),1)]),_:1}),n(l,{label:`缓存命中率`,width:`105`,align:`center`},{default:C(({row:e})=>[o(g(s(re)(e)),1)]),_:1}),n(l,{label:`请求耗时`,width:`90`,align:`center`},{default:C(({row:e})=>[o(g(s(ie)(e.duration)),1)]),_:1}),n(l,{label:`详情`,width:`70`,align:`center`},{default:C(({row:e})=>[n(d,{link:``,type:`primary`,onClick:t=>f(`open-detail`,e)},{default:C(()=>[...a[0]||=[o(`查看`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[E,O(t).loading]]),O(t).error?(h(),i(`div`,ke,[o(g(O(t).error)+` `,1),n(d,{link:``,type:`primary`,size:`small`,onClick:e=>k(t,1)},{default:C(()=>[...a[1]||=[o(`重试`,-1)]]),_:1},8,[`onClick`])])):b(``,!0),x(`div`,Ae,[x(`span`,je,`已显示 `+g(O(t).items.length)+` / `+g(O(t).total)+` 条`,1),O(t).items.length<O(t).total?(h(),e(d,{key:0,size:`small`,loading:O(t).loading,onClick:e=>A(t)},{default:C(()=>[...a[2]||=[o(` 加载更多 `,-1)]]),_:1},8,[`loading`,`onClick`])):b(``,!0)])])]),_:1}),n(l,{label:`Session`,width:`140`},{default:C(({row:t})=>[t.session_id?(h(),i(`span`,{key:0,class:`session-id`,title:`${t.session_id}(点击复制)`,onClick:c(e=>s(m)(t.session_id),[`stop`])},g(s(R)(t.session_id)),9,Me)):(h(),e(u,{key:1,size:`small`,type:`info`,title:`未携带会话标识的请求(NULL / 空串 session_id)`},{default:C(()=>[...a[3]||=[o(` 无 Session `,-1)]]),_:1}))]),_:1}),n(l,{label:`请求数`,width:`80`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.calls)),1)]),_:1}),n(l,{label:`模型`,"min-width":`150`},{default:C(({row:e})=>[x(`span`,{title:e.models||``},g(s(L)(e.models)),9,Ne)]),_:1}),n(l,{label:`客户端`,"min-width":`140`},{default:C(({row:e})=>[x(`span`,{title:e.clients||``},g(s(P)(e.clients)),9,Pe)]),_:1}),n(l,{label:`输入`,width:`105`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.input_tokens)),1)]),_:1}),n(l,{label:`输出`,width:`105`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.output_tokens)),1)]),_:1}),n(l,{label:`缓存读取`,width:`120`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.cache_read_tokens)),1)]),_:1}),n(l,{label:`首次请求`,width:`165`},{default:C(({row:e})=>[o(g(s(V)(e.first_time)),1)]),_:1}),n(l,{label:`最后请求`,width:`165`},{default:C(({row:e})=>[o(g(s(V)(e.last_time)),1)]),_:1})]),_:1},8,[`data`])),[[E,r.loading]]):(h(),e(_,{key:1,description:`当前筛选下没有日志`}))])}}}),[[`__scopeId`,`data-v-2ff0b8c0`]]);u(),T(),S(),d();var Le={class:`logs-page`},Re={class:`filter-bar`},ze={class:`table-wrap`},Be=[`onClick`],Ve={key:1},He=[`title`,`onClick`],Ue={key:1},We=[`title`,`onClick`],Ge={key:1},Ke={class:`pagination-bar`},qe=j(r({__name:`LogsView`,setup(t){let r=M(),{toast:c}=oe(),{copyWithToast:u}=H(),{loadError:d,run:_}=ae(),{rangeKey:S,dateRange:T,setRange:O,onRangeChange:j}=ce(()=>$()),N=l(`2xx`),P=l(``),I=l(``),L=l(``),z=l(`session`),U=l([]),le=l([]),ue=l(null),W=l(0),de=l(0),G=l(1),K=l(20),q=l(!1),fe=l(null),pe=e=>{fe.value?.open(e)},me=a(()=>{let e=new Set;for(let t of r.suppliers)for(let n of t.models)e.add(n.modelName);for(let t of U.value)t.model&&e.add(t.model);return[...e].sort()}),J=l([]),he=a(()=>{let e=new Set(J.value);for(let t of U.value)t.client&&e.add(t.client);return[...e].sort()}),ge=async()=>{try{let e=await p.get(`/api/logs/clients`);J.value=e.clients||[]}catch{J.value=[]}},_e=e=>{S.value=``,T.value=e||null,$()},Y=()=>{let e={};T.value&&T.value.length===2&&(e.startDate=T.value[0],e.endDate=T.value[1]),N.value&&(e.status=N.value),P.value&&(e.model=P.value),I.value&&(e.client=I.value);let t=L.value.trim();return t&&(e.sessionId=t),e},ve=a(()=>Y()),ye=se(),X=()=>_(async()=>{let e=ye();q.value=!0;try{let t={...Y(),page:String(G.value),pageSize:String(K.value)};if(z.value===`session`){let n=new URLSearchParams(t).toString(),r=await p.get(`/api/logs/sessions?`+n);if(!e())return;le.value=r.groups||[],ue.value=r.noSession??null,W.value=r.total||0,de.value=r.rowsTotal||0}else{let n=new URLSearchParams({...t,sort:`time`,order:`desc`}).toString(),r=await p.get(`/api/logs?`+n);if(!e())return;U.value=r.items||[],W.value=r.total||0}}catch(t){if(!e())return;throw t}finally{e()&&(q.value=!1)}}),be=e=>{z.value!==e&&(z.value=e,G.value=1,K.value=z.value===`session`?20:50,X())},Z=l(!1),Q=a(()=>z.value===`session`?de.value:W.value),xe=async()=>{if(Z.value||Q.value===0)return;let e=z.value===`session`?`(按筛选行数计,含「无 Session」组)`:``;try{await A.confirm(`将永久清理当前筛选条件下的 ${Q.value} 条日志${e},清理后不可恢复,请谨慎操作!`,`清理确认`,{confirmButtonText:`确认清理`,cancelButtonText:`取消`,type:`warning`})}catch{return}Z.value=!0;try{let e=new URLSearchParams(Y()).toString(),t=await p.post(`/api/logs/clear?`+e,{});c(`已清理 ${t.deleted??0} 条日志`,`success`),G.value>1&&(G.value=1),X()}catch(e){c(e.message||`清理失败`,`error`)}finally{Z.value=!1}},$=()=>{G.value=1,ge(),X()},Se=()=>{S.value=`today`,T.value=null,N.value=`2xx`,P.value=``,I.value=``,L.value=``,G.value=1,K.value=z.value===`session`?20:50,O(`today`)};return f(()=>{r.loadProviders().catch(()=>{}),ge(),O(`today`)}),(t,r)=>{let a=y(`el-button`),c=y(`el-alert`),l=y(`el-option`),f=y(`el-select`),p=y(`el-date-picker`),_=y(`el-input`),O=y(`el-tooltip`),A=y(`el-button-group`),M=y(`el-card`),H=y(`el-table-column`),ae=y(`el-tag`),oe=y(`el-table`),se=y(`el-pagination`),ce=ee(`loading`);return h(),i(`div`,Le,[s(d)?(h(),e(c,{key:0,title:s(d),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:C(()=>[n(a,{size:`small`,onClick:X},{default:C(()=>[...r[10]||=[o(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):b(``,!0),n(M,{shadow:`never`},{default:C(()=>[x(`div`,Re,[n(f,{modelValue:s(S),"onUpdate:modelValue":r[0]||=e=>m(S)?S.value=e:null,placeholder:`时间范围`,clearable:``,style:{width:`114px`},onChange:s(j)},{default:C(()=>[n(l,{label:`今天`,value:`today`}),n(l,{label:`昨天`,value:`yesterday`}),n(l,{label:`前天`,value:`beforeYesterday`}),n(l,{label:`近三天`,value:`last3days`}),n(l,{label:`本周`,value:`week`}),n(l,{label:`本月`,value:`month`})]),_:1},8,[`modelValue`,`onChange`]),n(p,{modelValue:s(T),"onUpdate:modelValue":r[1]||=e=>m(T)?T.value=e:null,type:`daterange`,"value-format":`YYYY-MM-DD`,"range-separator":`至`,"start-placeholder":`开始日期`,"end-placeholder":`结束日期`,style:{width:`240px`},onChange:_e},null,8,[`modelValue`]),n(f,{modelValue:N.value,"onUpdate:modelValue":r[2]||=e=>N.value=e,placeholder:`全部状态`,clearable:``,style:{width:`106px`},onChange:$},{default:C(()=>[n(l,{label:`成功 (2xx)`,value:`2xx`}),n(l,{label:`3xx`,value:`3xx`}),n(l,{label:`4xx`,value:`4xx`}),n(l,{label:`5xx`,value:`5xx`}),n(l,{label:`错误 (4xx+)`,value:`err`})]),_:1},8,[`modelValue`]),n(f,{modelValue:P.value,"onUpdate:modelValue":r[3]||=e=>P.value=e,placeholder:`全部模型`,clearable:``,filterable:``,style:{width:`176px`},onChange:$},{default:C(()=>[(h(!0),i(E,null,w(me.value,t=>(h(),e(l,{key:t,label:t,value:t},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`]),n(f,{modelValue:I.value,"onUpdate:modelValue":r[4]||=e=>I.value=e,placeholder:`全部客户端`,clearable:``,filterable:``,style:{width:`130px`},onChange:$},{default:C(()=>[(h(!0),i(E,null,w(he.value,t=>(h(),e(l,{key:t,label:t,value:t},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`]),n(_,{modelValue:L.value,"onUpdate:modelValue":r[5]||=e=>L.value=e,class:`session-input`,placeholder:`Session ID(前缀匹配)`,clearable:``,onKeyup:D($,[`enter`])},null,8,[`modelValue`]),n(A,{class:`view-switch push-right`},{default:C(()=>[n(O,{content:`按会话分组`,placement:`top`,"show-after":300},{default:C(()=>[n(a,{type:z.value===`session`?`primary`:`default`,icon:s(te),"aria-label":`按会话分组`,onClick:r[6]||=e=>be(`session`)},null,8,[`type`,`icon`])]),_:1}),n(O,{content:`列表`,placement:`top`,"show-after":300},{default:C(()=>[n(a,{type:z.value===`list`?`primary`:`default`,icon:s(k),"aria-label":`列表视图`,onClick:r[7]||=e=>be(`list`)},null,8,[`type`,`icon`])]),_:1})]),_:1}),n(a,{type:`primary`,onClick:$},{default:C(()=>[...r[11]||=[o(`搜索`,-1)]]),_:1}),n(a,{onClick:Se},{default:C(()=>[...r[12]||=[o(`重置`,-1)]]),_:1})])]),_:1}),n(M,{shadow:`never`,class:`mt-16 table-card`},{default:C(()=>[x(`div`,ze,[z.value===`list`?v((h(),e(oe,{key:0,data:U.value,stripe:``,height:`100%`},{default:C(()=>[n(H,{prop:`id`,label:`ID`,"min-width":`80`},{default:C(({row:e})=>[e.id==null?(h(),i(`span`,Ve,`-`)):(h(),i(`span`,{key:0,class:`request-id`,title:`点击复制(日志 id 同时是响应头 x-request-id,可用于关联控制台日志与检索)`,onClick:t=>s(u)(String(e.id))},g(e.id),9,Be))]),_:1}),n(H,{prop:`time`,label:`时间`,width:`180`},{default:C(({row:e})=>[o(g(s(V)(e.time)),1)]),_:1}),n(H,{prop:`model`,label:`模型`,"min-width":`180`}),n(H,{label:`客户端`,"min-width":`150`},{default:C(({row:e})=>[e.client||e.user_agent?(h(),i(`span`,{key:0,class:`request-id`,title:s(ne)(e),onClick:t=>s(u)(e.user_agent||e.client)},g(s(B)(e)),9,He)):(h(),i(`span`,Ue,`-`))]),_:1}),n(H,{label:`Session`,width:`140`},{default:C(({row:e})=>[e.session_id?(h(),i(`span`,{key:0,class:`request-id`,title:`${e.session_id}(点击复制)`,onClick:t=>s(u)(e.session_id)},g(s(R)(e.session_id)),9,We)):(h(),i(`span`,Ge,`-`))]),_:1}),n(H,{label:`输入`,"min-width":`110`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.input_tokens??0)),1)]),_:1}),n(H,{label:`输出`,"min-width":`110`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.output_tokens??0)),1)]),_:1}),n(H,{label:`缓存读取`,"min-width":`90`,align:`center`},{default:C(({row:e})=>[o(g(s(F)(e.cache_read_tokens??0)),1)]),_:1}),n(H,{label:`缓存命中率`,"min-width":`105`,align:`center`},{default:C(({row:e})=>[x(`span`,null,g(s(re)(e)),1)]),_:1}),n(H,{label:`请求耗时`,"min-width":`90`,align:`center`},{default:C(({row:e})=>[o(g(s(ie)(e.duration)),1)]),_:1}),n(H,{prop:`status`,label:`状态`,width:`80`,align:`center`},{default:C(({row:e})=>[n(ae,{size:`small`,type:e.status>=400?`danger`:e.status>=300?`warning`:`success`},{default:C(()=>[o(g(e.status),1)]),_:2},1032,[`type`])]),_:1}),n(H,{label:`详情`,width:`70`,align:`center`},{default:C(({row:e})=>[n(a,{link:``,type:`primary`,onClick:t=>pe(e)},{default:C(()=>[...r[13]||=[o(`查看`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[ce,q.value]]):b(``,!0),z.value===`session`?(h(),e(Ie,{key:1,groups:le.value,"no-session":ue.value,loading:q.value,"filter-params":ve.value,onOpenDetail:pe},null,8,[`groups`,`no-session`,`loading`,`filter-params`])):b(``,!0)]),x(`div`,Ke,[n(a,{type:`danger`,plain:``,size:`small`,loading:Z.value,disabled:Q.value===0,onClick:xe},{default:C(()=>[...r[14]||=[o(`清理已筛选日志`,-1)]]),_:1},8,[`loading`,`disabled`]),n(se,{class:`push-right`,"current-page":G.value,"onUpdate:currentPage":r[8]||=e=>G.value=e,"page-size":K.value,"onUpdate:pageSize":r[9]||=e=>K.value=e,total:W.value,"page-sizes":[20,50,100,200],layout:`total, sizes, prev, pager, next`,onCurrentChange:X,onSizeChange:X},null,8,[`current-page`,`page-size`,`total`])])]),_:1}),n(Te,{ref_key:`logDetailRef`,ref:fe},null,512)])}}}),[[`__scopeId`,`data-v-9b1602a9`]]);export{qe as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.ip-link[data-v-9c192d20]{color:#409eff;cursor:pointer}.ip-link[data-v-9c192d20]:hover{text-decoration:underline}.ip-pop[data-v-9c192d20]{min-height:20px;font-size:13px}.ip-pop-row[data-v-9c192d20]{gap:8px;margin-bottom:4px;display:flex}.ip-pop-label[data-v-9c192d20]{color:#909399;flex-shrink:0}.ip-pop-error[data-v-9c192d20]{color:#f56c6c}.ip-pop-link[data-v-9c192d20]{color:#409eff;font-size:13px}.error-text[data-v-9c192d20]{color:#f56c6c}.pane-bar[data-v-9c192d20]{flex-shrink:0;justify-content:flex-end;margin-bottom:8px;display:flex}.json-block[data-v-9c192d20]{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-9c192d20]{flex-direction:column;height:78vh;display:flex;overflow:hidden}.detail-content[data-v-9c192d20] .el-tabs{flex-direction:column;flex:1;min-height:0;display:flex}.detail-content[data-v-9c192d20] .el-tabs__content{flex:1;min-height:0}.detail-content[data-v-9c192d20] .el-tab-pane{flex-direction:column;height:100%;display:flex;overflow:auto}.copy-btn[data-v-9c192d20]{margin-left:8px;padding:2px 10px;font-size:12px}.session-table[data-v-2ff0b8c0]{height:100%}.session-id[data-v-2ff0b8c0]{cursor:pointer;white-space:nowrap;text-overflow:ellipsis;font-family:ui-monospace,Consolas,monospace;display:block;overflow:hidden}.session-id[data-v-2ff0b8c0]:hover{color:var(--el-color-primary)}.group-detail[data-v-2ff0b8c0]{padding:4px 16px 8px 48px}.detail-error[data-v-2ff0b8c0]{color:var(--el-color-danger);margin-top:8px;font-size:12px}.detail-footer[data-v-2ff0b8c0]{justify-content:flex-end;align-items:center;gap:12px;margin-top:8px;display:flex}.detail-count[data-v-2ff0b8c0]{color:var(--el-text-color-secondary);font-size:12px}.logs-page[data-v-9b1602a9]{flex-direction:column;height:calc(100vh - 124px);display:flex;overflow:hidden}.request-id[data-v-9b1602a9]{cursor:pointer;white-space:nowrap;text-overflow:ellipsis;font-family:ui-monospace,Consolas,monospace;display:block;overflow:hidden}.request-id[data-v-9b1602a9]:hover{color:var(--el-color-primary)}.filter-bar[data-v-9b1602a9]{flex-wrap:nowrap;align-items:center;gap:12px;display:flex}.filter-bar[data-v-9b1602a9]>*{flex:none}.filter-bar .session-input[data-v-9b1602a9]{flex:160px;min-width:100px}.filter-bar .push-right[data-v-9b1602a9]{margin-left:auto}.filter-bar .view-switch[data-v-9b1602a9]{flex:none}.filter-bar[data-v-9b1602a9] .el-button+.el-button{margin-left:0}@media (width<=900px){.filter-bar[data-v-9b1602a9]{flex-wrap:wrap}.filter-bar .session-input[data-v-9b1602a9]{flex-basis:100%;min-width:0}.filter-bar .push-right[data-v-9b1602a9]{margin-left:auto}}.mt-16[data-v-9b1602a9]{margin-top:16px}.table-card[data-v-9b1602a9]{flex:1;min-height:0;overflow:hidden}.table-card[data-v-9b1602a9] .el-card__body{flex-direction:column;height:100%;display:flex}.table-wrap[data-v-9b1602a9]{flex:1;min-height:0}.pagination-bar[data-v-9b1602a9]{flex-shrink:0;justify-content:space-between;align-items:center;margin-top:16px;display:flex}
|