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.
Files changed (62) hide show
  1. package/README.md +8 -0
  2. package/bin/ezllm.js +3 -0
  3. package/dist/cli.js +41 -24512
  4. package/dist/daemon.js +25 -0
  5. package/dist/server.js +196 -41916
  6. package/dist/web-ui/assets/DashboardView-DOwvAtq-.js +1 -0
  7. package/dist/web-ui/assets/LayoutView-B4fUaz9C.js +1 -0
  8. package/dist/web-ui/assets/LayoutView-Cx9vUqeZ.css +1 -0
  9. package/dist/web-ui/assets/LoginView-BQEkBw8e.css +1 -0
  10. package/dist/web-ui/assets/LoginView-G89QGoG0.js +1 -0
  11. package/dist/web-ui/assets/LogsView--ahw0k4u.js +9 -0
  12. package/dist/web-ui/assets/LogsView-C5nwx_hg.css +1 -0
  13. package/dist/web-ui/assets/ProvidersView-Bfb6bLjb.js +14 -0
  14. package/dist/web-ui/assets/ProvidersView-CLtKgvo_.css +1 -0
  15. package/dist/web-ui/assets/ServiceStatusView-Bkg3N6YJ.css +1 -0
  16. package/dist/web-ui/assets/ServiceStatusView-DAFz0O6i.js +2 -0
  17. package/dist/web-ui/assets/SettingsView-0a5M4naA.css +1 -0
  18. package/dist/web-ui/assets/SettingsView-DNTvqQlE.js +1 -0
  19. package/dist/web-ui/assets/SetupView-BA06j75c.js +1 -0
  20. package/dist/web-ui/assets/SetupView-BDyHouba.css +1 -0
  21. package/dist/web-ui/assets/clipboard-JYWVdyjq.js +1 -0
  22. package/dist/web-ui/assets/config-B6AvsVNP.js +1 -0
  23. package/dist/web-ui/assets/format-OBe8peUU.js +1 -0
  24. package/dist/web-ui/assets/index-kwJNWvLc.js +49 -0
  25. package/dist/web-ui/assets/{index-BNieAChJ.css → index-wQvjidwN.css} +1 -1
  26. package/dist/web-ui/assets/message-CYCqk4yf.js +2 -0
  27. package/dist/web-ui/assets/providers-C9CHuG_i.js +1 -0
  28. package/dist/web-ui/assets/router-Oh7GPjpX.js +6 -0
  29. package/dist/web-ui/assets/useCopyToast-5I0bBbzu.js +1 -0
  30. package/dist/web-ui/assets/{useManagerApi-fVrRDZkc.js → useManagerApi-LTdyIrJc.js} +1 -1
  31. package/dist/web-ui/assets/useToast-C4nXu2HZ.js +1 -0
  32. package/dist/web-ui/assets/{version-quqH5oMc.js → version-DegxwpkG.js} +1 -1
  33. package/dist/web-ui/index.html +4 -4
  34. package/package.json +13 -5
  35. package/bin/ellm-proxy.js +0 -3
  36. package/dist/web-ui/assets/DashboardView-ChJpgKis.js +0 -1
  37. package/dist/web-ui/assets/DashboardView-DOtZtkUN.css +0 -1
  38. package/dist/web-ui/assets/LayoutView-C8YPw0x2.js +0 -1
  39. package/dist/web-ui/assets/LayoutView-DMNmIelM.css +0 -1
  40. package/dist/web-ui/assets/LoginView-BZnxf_XD.css +0 -1
  41. package/dist/web-ui/assets/LoginView-C4hkT-3T.js +0 -1
  42. package/dist/web-ui/assets/LogsView-D7xJOKSv.css +0 -1
  43. package/dist/web-ui/assets/LogsView-DdS8qKEs.js +0 -9
  44. package/dist/web-ui/assets/ProvidersView-BD33caY8.js +0 -14
  45. package/dist/web-ui/assets/ProvidersView-DNqX_AWw.css +0 -1
  46. package/dist/web-ui/assets/ServiceStatusView-BtF40E0V.js +0 -2
  47. package/dist/web-ui/assets/ServiceStatusView-DXbn--55.css +0 -1
  48. package/dist/web-ui/assets/SettingsView-BY2QIyXL.css +0 -1
  49. package/dist/web-ui/assets/SettingsView-SdL8ednl.js +0 -1
  50. package/dist/web-ui/assets/SetupView-B3SahEFi.css +0 -1
  51. package/dist/web-ui/assets/SetupView-BZFBBRSd.js +0 -1
  52. package/dist/web-ui/assets/clipboard-CorU9X8e.js +0 -1
  53. package/dist/web-ui/assets/config-Dbms19Et.js +0 -1
  54. package/dist/web-ui/assets/format-DrbP4_cY.js +0 -1
  55. package/dist/web-ui/assets/index-C6wv4UB9.js +0 -49
  56. package/dist/web-ui/assets/message-CEBSyhlN.js +0 -2
  57. package/dist/web-ui/assets/providers-DkujdEZ8.js +0 -1
  58. package/dist/web-ui/assets/router-BqkHX02I.js +0 -6
  59. package/dist/web-ui/assets/useLoadError-Yu7YH4ZH.js +0 -1
  60. package/dist/web-ui/assets/useToast-DJwG-33L.js +0 -1
  61. package/docs/DESIGN.md +0 -98
  62. /package/{hook.example.js → hook.example.cjs} +0 -0
@@ -1,9 +0,0 @@
1
- import{A as e,Et as t,F as n,Ft as r,Gt as i,H as a,I as o,L as s,M as c,N as l,Q as u,S as d,T as f,a as p,at as m,d as h,gt as ee,h as g,ht as _,j as v,k as y,ot as b,pn as x,rt as S,tt as C,yt as w}from"./router-BqkHX02I.js";import{t as T}from"./index-C6wv4UB9.js";import{t as E}from"./providers-DkujdEZ8.js";import{t as D}from"./useToast-DJwG-33L.js";import{t as O}from"./useLoadError-Yu7YH4ZH.js";import{t as k}from"./latestRequest-Dk21IcrH.js";import{t as A}from"./clipboard-CorU9X8e.js";import{c as j,l as M,n as N,o as P,r as te,s as F}from"./format-DrbP4_cY.js";a(),w(),i();var I={key:1,class:`detail-content`},L={key:0,class:`ip-link`},R={class:`ip-pop`},z={class:`ip-pop-row`},B={key:0,class:`ip-pop-row`},V={key:1,class:`ip-pop-error`},H={key:2},U=[`href`],W={key:1},G={key:1},ne={class:`error-text`},re={class:`pane-bar`},ie={class:`json-block`},K={class:`pane-bar`},q={class:`json-block`},J={class:`pane-bar`},ae={class:`json-block`},Y={class:`pane-bar`},oe={class:`json-block`},X={class:`pane-bar`},Z={class:`json-block`},se={class:`pane-bar`},Q={class:`json-block`},ce={class:`pane-bar`},le={class:`json-block`},ue={class:`pane-bar`},de={class:`json-block`},fe=h(s({__name:`LogDetailDialog`,setup(i,{expose:a}){let{toast:s}=D(),{loadError:u,run:d}=O(),h=t(!1),g=t(null),y=t(`info`),S=t(!1),w=t(null),T=k(),E=e=>{w.value=e,h.value=!0,g.value=null,y.value=`info`;let t=T();d(async()=>{try{let n=e.id?`?id=${e.id}`:`?_file=${encodeURIComponent(e._file)}`,r=await p.get(`/api/logs/detail`+n);if(!t())return;r&&r.detail?g.value={...r.detail,...r.meta}:g.value=r}catch(e){if(!t())return;throw e}})},fe=()=>{w.value&&E(w.value)};a({open:E});let $=async e=>{await A(e)?s(`已复制到剪贴板`,`success`):s(`复制失败`,`error`)},pe=async e=>{if(!(e._ipInfo||e._ipInfoError)){S.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{S.value=!1}}},me=e=>[e.country,e.region,e.city].filter(Boolean).join(` · `)||`-`;return(t,i)=>{let a=m(`el-button`),s=m(`el-alert`),d=m(`el-descriptions-item`),p=m(`el-tag`),w=m(`el-divider`),T=m(`el-popover`),E=m(`el-descriptions`),D=m(`el-tab-pane`),O=m(`el-tabs`),k=m(`el-dialog`),A=b(`loading`);return C(),v(k,{modelValue:h.value,"onUpdate:modelValue":i[11]||=e=>h.value=e,title:`日志详情`,width:`80%`,top:`5vh`,"destroy-on-close":``},{default:_(()=>[r(u)?(C(),v(s,{key:0,title:r(u),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:_(()=>[o(a,{size:`small`,onClick:fe},{default:_(()=>[...i[12]||=[n(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):c(``,!0),g.value?(C(),l(`div`,I,[o(O,{modelValue:y.value,"onUpdate:modelValue":i[10]||=e=>y.value=e},{default:_(()=>[o(D,{label:`基本信息`,name:`info`},{default:_(()=>[o(E,{column:2,border:``},{default:_(()=>[o(d,{label:`时间`},{default:_(()=>[n(x(r(j)(g.value.time)),1)]),_:1}),o(d,{label:`模型`},{default:_(()=>[n(x(g.value.model),1)]),_:1}),o(d,{label:`方法`},{default:_(()=>[n(x(g.value.method),1)]),_:1}),o(d,{label:`路径`},{default:_(()=>[n(x(g.value.path),1)]),_:1}),o(d,{label:`状态码`},{default:_(()=>[n(x(g.value.status),1)]),_:1}),o(d,{label:`流式`},{default:_(()=>[o(p,{type:g.value.stream?`warning`:`info`},{default:_(()=>[n(x(g.value.stream?`是`:`否`),1)]),_:1},8,[`type`])]),_:1}),o(d,{label:`IP`},{default:_(()=>[g.value.ip?(C(),l(`span`,L,[o(T,{placement:`right`,width:`240`,trigger:`click`,onShow:i[0]||=e=>pe(g.value)},{reference:_(()=>[e(`span`,null,x(g.value.ip),1)]),default:_(()=>[ee((C(),l(`div`,R,[g.value._ipInfo?(C(),l(f,{key:0},[e(`div`,z,[i[13]||=e(`span`,{class:`ip-pop-label`},`归属地`,-1),e(`span`,null,x(me(g.value._ipInfo)),1)]),g.value._ipInfo.isp?(C(),l(`div`,B,[i[14]||=e(`span`,{class:`ip-pop-label`},`运营商`,-1),e(`span`,null,x(g.value._ipInfo.isp),1)])):c(``,!0)],64)):g.value._ipInfoError?(C(),l(`div`,V,x(g.value._ipInfoError),1)):(C(),l(`span`,H,`查询中...`)),o(w,{style:{margin:`8px 0`}}),e(`a`,{class:`ip-pop-link`,href:`https://m.ip138.com/iplookup.php?ip=${encodeURIComponent(g.value.ip)}`,target:`_blank`},`在 ip138 查看`,8,U)])),[[A,S.value]])]),_:1})])):(C(),l(`span`,W,`-`))]),_:1}),o(d,{label:`Session`},{default:_(()=>[n(x(g.value.session_id||`-`),1)]),_:1}),o(d,{label:`Request ID`},{default:_(()=>[g.value.request_id?(C(),l(`span`,{key:0,class:`request-id`,title:`点击复制(可用于关联控制台日志与检索)`,onClick:i[1]||=e=>$(g.value.request_id)},x(g.value.request_id),1)):(C(),l(`span`,G,`-`))]),_:1}),o(d,{label:`输入 Token(含缓存读取)`},{default:_(()=>[n(x(r(P)(g.value.input_tokens??0)),1)]),_:1}),o(d,{label:`输出 Token`},{default:_(()=>[n(x(r(P)(g.value.output_tokens??0)),1)]),_:1}),o(d,{label:`缓存读取`},{default:_(()=>[n(x(r(P)(g.value.cache_read_tokens??0)),1)]),_:1}),o(d,{label:`请求耗时`},{default:_(()=>[n(x(r(te)(g.value.duration)),1)]),_:1}),o(d,{label:`缓存命中率`},{default:_(()=>[n(x(r(N)(g.value)),1)]),_:1}),g.value.error?(C(),v(d,{key:0,label:`错误`,span:2},{default:_(()=>[e(`span`,ne,x(g.value.error),1)]),_:1})):c(``,!0)]),_:1}),g.value.response?.truncated?(C(),v(s,{key:0,class:`mt-16`,type:`warning`,closable:!1,title:`内容超过单请求捕获上限,已截断`})):c(``,!0)]),_:1}),g.value.response?._capture?(C(),l(f,{key:0},[o(D,{label:`客户端请求`,name:`inbound`},{default:_(()=>[e(`div`,re,[o(a,{size:`small`,class:`copy-btn`,onClick:i[2]||=e=>$(r(F)(g.value.response.inbound_request))},{default:_(()=>[...i[15]||=[n(` 复制 `,-1)]]),_:1})]),e(`pre`,ie,x(r(F)(g.value.response.inbound_request)),1)]),_:1}),o(D,{label:`转发上游的请求`,name:`upstreamReq`},{default:_(()=>[e(`div`,K,[o(a,{size:`small`,class:`copy-btn`,onClick:i[3]||=e=>$(r(F)(g.value.response.upstream_request))},{default:_(()=>[...i[16]||=[n(` 复制 `,-1)]]),_:1})]),e(`pre`,q,x(r(F)(g.value.response.upstream_request)),1)]),_:1}),g.value.response.upstream_response_text?(C(),v(D,{key:0,label:`上游响应(原始)`,name:`upstreamRes`},{default:_(()=>[e(`div`,J,[o(a,{size:`small`,class:`copy-btn`,onClick:i[4]||=e=>$(g.value.response.upstream_response_text)},{default:_(()=>[...i[17]||=[n(` 复制 `,-1)]]),_:1})]),e(`pre`,ae,x(r(M)(g.value.response.upstream_response_text)),1)]),_:1})):g.value.response.upstream_stream_frames?.length?(C(),v(D,{key:1,label:`上游响应(原始流,${g.value.response.upstream_stream_frames.length} 帧)`,name:`upstreamStream`},{default:_(()=>[e(`div`,Y,[o(a,{size:`small`,class:`copy-btn`,onClick:i[5]||=e=>$(g.value.response.upstream_stream_frames.join(`
2
-
3
- `))},{default:_(()=>[...i[18]||=[n(` 复制 `,-1)]]),_:1})]),e(`pre`,oe,x(g.value.response.upstream_stream_frames.join(`
4
-
5
- `)),1)]),_:1},8,[`label`])):c(``,!0),g.value.response.client_response!==void 0&&g.value.response.client_response!==null?(C(),v(D,{key:2,label:`回写客户端(转换后)`,name:`clientRes`},{default:_(()=>[e(`div`,X,[o(a,{size:`small`,class:`copy-btn`,onClick:i[6]||=e=>$(r(F)(g.value.response.client_response))},{default:_(()=>[...i[19]||=[n(` 复制 `,-1)]]),_:1})]),e(`pre`,Z,x(r(F)(g.value.response.client_response)),1)]),_:1})):g.value.response.client_stream_frames?.length?(C(),v(D,{key:3,label:`回写客户端(${g.value.response.client_stream_frames.length} 帧)`,name:`clientStream`},{default:_(()=>[e(`div`,se,[o(a,{size:`small`,class:`copy-btn`,onClick:i[7]||=e=>$(g.value.response.client_stream_frames.join(`
6
-
7
- `))},{default:_(()=>[...i[20]||=[n(` 复制 `,-1)]]),_:1})]),e(`pre`,Q,x(g.value.response.client_stream_frames.join(`
8
-
9
- `)),1)]),_:1},8,[`label`])):c(``,!0)],64)):(C(),l(f,{key:1},[o(D,{label:`请求体`,name:`request`},{default:_(()=>[e(`div`,ce,[o(a,{size:`small`,class:`copy-btn`,onClick:i[8]||=e=>$(r(F)(g.value.request))},{default:_(()=>[...i[21]||=[n(` 复制 `,-1)]]),_:1})]),e(`pre`,le,x(r(F)(g.value.request)),1)]),_:1}),o(D,{label:`响应体`,name:`response`},{default:_(()=>[e(`div`,ue,[o(a,{size:`small`,class:`copy-btn`,onClick:i[9]||=e=>$(r(F)(g.value.response))},{default:_(()=>[...i[22]||=[n(` 复制 `,-1)]]),_:1})]),e(`pre`,de,x(r(F)(g.value.response)),1)]),_:1})],64))]),_:1},8,[`modelValue`])])):c(``,!0)]),_:1},8,[`modelValue`])}}}),[[`__scopeId`,`data-v-5ad7e42a`]]);function $(e){if(e.truncated!==!0)return null;let t=e.scanLimit;return`结果可能不完整:${typeof t==`number`&&Number.isFinite(t)&&t>0?`仅扫描了最近 ${t} 条有详情的记录`:`仅扫描了最近的部分记录`},建议缩小时间范围或更换关键词`}function pe(e,t){let n=e.trim();return t>0||n.length!==1?null:`未找到匹配记录:单字符关键字仅按摘要列(模型、路径等)匹配,不会回退搜索请求/响应内容,建议补充至 2 个字符以上`}a(),w(),g(),i();var me={class:`logs-page`},he={class:`filter-bar`},ge={class:`table-wrap`},_e=[`onClick`],ve={key:1},ye={class:`pagination-bar`},be=h(s({__name:`LogsView`,setup(i){let a=E(),{toast:s}=D(),{loadError:h,run:g}=O(),w=t(``),M=t(null),F=t(`2xx`),I=t(`model`),L=t(``),R=t(``),z=t([]),B=t(0),V=t(1),H=t(50),U=t(!1),W=t(null),G=t(null),ne=e=>{G.value?.open(e)},re=y(()=>{let e=new Set;for(let t of a.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()}),ie=async e=>{await A(e)?s(`已复制到剪贴板`,`success`):s(`复制失败`,`error`)},K=e=>{let t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}`},q=e=>{w.value=e;let t=new Date,n=new Date(t);if(e===`today`)n.setDate(t.getDate());else if(e===`yesterday`)n.setDate(t.getDate()-1),t.setDate(t.getDate()-1);else if(e===`beforeYesterday`)n.setDate(t.getDate()-2),t.setDate(t.getDate()-2);else if(e===`last3days`)n.setDate(t.getDate()-2);else if(e===`week`){let e=(t.getDay()+6)%7;n.setDate(t.getDate()-e)}else n.setDate(1);M.value=[K(n),K(t)],Q()},J=e=>{e?q(e):(w.value=``,M.value=null,Q())},ae=e=>{w.value=``,M.value=e||null,Q()},Y=()=>{let e={};return M.value&&M.value.length===2&&(e.startDate=M.value[0],e.endDate=M.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},oe=k(),X=()=>g(async()=>{let e=oe();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 p.get(`/api/logs?`+n);if(!e())return;z.value=r.items||[],B.value=r.total||0,W.value=$(r)??pe(R.value,r.total||0)}catch(t){if(!e())return;throw t}finally{e()&&(U.value=!1)}}),Z=t(!1),se=async()=>{if(!(Z.value||B.value===0)){try{await T.confirm(`将永久清理当前筛选条件下的 ${B.value} 条日志,清理后不可恢复,请谨慎操作!`,`清理确认`,{confirmButtonText:`确认清理`,cancelButtonText:`取消`,type:`warning`})}catch{return}Z.value=!0;try{let e=new URLSearchParams(Y()).toString(),t=await p.post(`/api/logs/clear?`+e,{});s(`已清理 ${t.deleted??0} 条日志`,`success`),V.value>1&&(V.value=1),X()}catch(e){s(e.message||`清理失败`,`error`)}finally{Z.value=!1}}},Q=()=>{V.value=1,X()},ce=()=>{w.value=`today`,M.value=null,F.value=`2xx`,I.value=`model`,L.value=``,R.value=``,V.value=1,H.value=50,q(`today`)};return u(()=>{a.loadProviders().catch(()=>{}),q(`today`)}),(t,i)=>{let a=m(`el-button`),s=m(`el-alert`),u=m(`el-option`),p=m(`el-select`),g=m(`el-date-picker`),y=m(`el-input`),T=m(`el-card`),E=m(`el-table-column`),D=m(`el-tag`),O=m(`el-table`),k=m(`el-pagination`),A=b(`loading`);return C(),l(`div`,me,[r(h)?(C(),v(s,{key:0,title:r(h),type:`error`,"show-icon":``,closable:!1,class:`mb-16`},{default:_(()=>[o(a,{size:`small`,onClick:X},{default:_(()=>[...i[9]||=[n(`重试`,-1)]]),_:1})]),_:1},8,[`title`])):c(``,!0),W.value?(C(),v(s,{key:1,title:W.value,type:`warning`,"show-icon":``,closable:``,class:`mb-16`,onClose:i[0]||=e=>W.value=null},null,8,[`title`])):c(``,!0),o(T,{shadow:`never`},{default:_(()=>[e(`div`,he,[o(p,{modelValue:w.value,"onUpdate:modelValue":i[1]||=e=>w.value=e,placeholder:`时间范围`,clearable:``,style:{width:`130px`},onChange:J},{default:_(()=>[o(u,{label:`今天`,value:`today`}),o(u,{label:`昨天`,value:`yesterday`}),o(u,{label:`前天`,value:`beforeYesterday`}),o(u,{label:`近三天`,value:`last3days`}),o(u,{label:`本周`,value:`week`}),o(u,{label:`本月`,value:`month`})]),_:1},8,[`modelValue`]),o(g,{modelValue:M.value,"onUpdate:modelValue":i[2]||=e=>M.value=e,type:`daterange`,"value-format":`YYYY-MM-DD`,"range-separator":`至`,"start-placeholder":`开始日期`,"end-placeholder":`结束日期`,style:{width:`260px`},onChange:ae},null,8,[`modelValue`]),o(p,{modelValue:F.value,"onUpdate:modelValue":i[3]||=e=>F.value=e,placeholder:`全部状态`,clearable:``,style:{width:`120px`},onChange:Q},{default:_(()=>[o(u,{label:`成功 (2xx)`,value:`2xx`}),o(u,{label:`3xx`,value:`3xx`}),o(u,{label:`4xx`,value:`4xx`}),o(u,{label:`5xx`,value:`5xx`}),o(u,{label:`错误 (4xx+)`,value:`err`})]),_:1},8,[`modelValue`]),o(p,{modelValue:I.value,"onUpdate:modelValue":i[4]||=e=>I.value=e,placeholder:`全部路径`,clearable:``,style:{width:`130px`},onChange:Q},{default:_(()=>[o(u,{label:`模型接口`,value:`model`}),o(u,{label:`其他`,value:`other`})]),_:1},8,[`modelValue`]),o(p,{modelValue:L.value,"onUpdate:modelValue":i[5]||=e=>L.value=e,placeholder:`全部模型`,clearable:``,filterable:``,style:{width:`220px`},onChange:Q},{default:_(()=>[(C(!0),l(f,null,S(re.value,e=>(C(),v(u,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`]),o(y,{modelValue:R.value,"onUpdate:modelValue":i[6]||=e=>R.value=e,class:`keyword-input`,placeholder:`关键字搜索(请求/响应内容)`,clearable:``,onKeyup:d(Q,[`enter`])},null,8,[`modelValue`]),o(a,{type:`primary`,class:`push-right`,onClick:Q},{default:_(()=>[...i[10]||=[n(`搜索`,-1)]]),_:1}),o(a,{onClick:ce},{default:_(()=>[...i[11]||=[n(`重置`,-1)]]),_:1})])]),_:1}),o(T,{shadow:`never`,class:`mt-16 table-card`},{default:_(()=>[e(`div`,ge,[ee((C(),v(O,{data:z.value,border:``,stripe:``,height:`100%`},{default:_(()=>[o(E,{prop:`request_id`,label:`请求ID`,"min-width":`140`},{default:_(({row:e})=>[e.request_id?(C(),l(`span`,{key:0,class:`request-id`,title:`点击复制(可用于关联控制台日志与检索)`,onClick:t=>ie(e.request_id)},x(e.request_id),9,_e)):(C(),l(`span`,ve,`-`))]),_:1}),o(E,{prop:`time`,label:`时间`,width:`180`},{default:_(({row:e})=>[n(x(r(j)(e.time)),1)]),_:1}),o(E,{prop:`model`,label:`模型`,"min-width":`180`}),o(E,{prop:`status`,label:`状态`,width:`70`,align:`center`},{default:_(({row:e})=>[o(D,{type:e.status>=400?`danger`:e.status>=300?`warning`:`success`},{default:_(()=>[n(x(e.status),1)]),_:2},1032,[`type`])]),_:1}),o(E,{label:`输入`,width:`110`,align:`center`},{default:_(({row:e})=>[n(x(r(P)(e.input_tokens??0)),1)]),_:1}),o(E,{label:`输出`,width:`110`,align:`center`},{default:_(({row:e})=>[n(x(r(P)(e.output_tokens??0)),1)]),_:1}),o(E,{label:`缓存读取`,width:`90`,align:`center`},{default:_(({row:e})=>[n(x(r(P)(e.cache_read_tokens??0)),1)]),_:1}),o(E,{label:`缓存命中率`,width:`105`,align:`center`},{default:_(({row:t})=>[e(`span`,null,x(r(N)(t)),1)]),_:1}),o(E,{label:`请求耗时`,width:`90`,align:`center`},{default:_(({row:e})=>[n(x(r(te)(e.duration)),1)]),_:1}),o(E,{label:`详情`,width:`70`,align:`center`},{default:_(({row:e})=>[o(a,{link:``,type:`primary`,onClick:t=>ne(e)},{default:_(()=>[...i[12]||=[n(`查看`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])),[[A,U.value]])]),e(`div`,ye,[o(a,{type:`danger`,plain:``,size:`small`,loading:Z.value,disabled:B.value===0,onClick:se},{default:_(()=>[...i[13]||=[n(`清理已筛选日志`,-1)]]),_:1},8,[`loading`,`disabled`]),o(k,{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:X,onSizeChange:X},null,8,[`current-page`,`page-size`,`total`])])]),_:1}),o(fe,{ref_key:`logDetailRef`,ref:G},null,512)])}}}),[[`__scopeId`,`data-v-5b05299d`]]);export{be as default};