mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
2 lines
38 KiB
JavaScript
2 lines
38 KiB
JavaScript
import{E as $t}from"./element-plus-CqiD73Lu.js";import{aP as Rt,r as $,c as wt,aX as Tt,o as st,q as At,D as X,V as Pt,x as h,z as t,P as y,u as a,L as P,O as B,Q as _t,ac as Ct,C as j,R as Bt,K as It,al as Ut,y as k}from"./vue-vendor-Bsazo-x0.js";import{c as Z,s as bt,_ as Mt,a as Kt}from"./index-O5CKUX5p.js";import{C as vt}from"./chart-yFHxLHpB.js";import"./vendor-Dr8jvgFu.js";const Ot=Rt("dashboard",()=>{const ot=$(!1),Y=$({totalApiKeys:0,activeApiKeys:0,totalAccounts:0,normalAccounts:0,abnormalAccounts:0,pausedAccounts:0,activeAccounts:0,rateLimitedAccounts:0,accountsByPlatform:{claude:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},"claude-console":{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},gemini:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},openai:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},azure_openai:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},bedrock:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0}},todayRequests:0,totalRequests:0,todayTokens:0,todayInputTokens:0,todayOutputTokens:0,totalTokens:0,totalInputTokens:0,totalOutputTokens:0,totalCacheCreateTokens:0,totalCacheReadTokens:0,todayCacheCreateTokens:0,todayCacheReadTokens:0,systemRPM:0,systemTPM:0,realtimeRPM:0,realtimeTPM:0,metricsWindow:5,isHistoricalMetrics:!1,systemStatus:"正常",uptime:0,systemTimezone:8}),nt=$({todayCosts:{totalCost:0,formatted:{totalCost:"$0.000000"}},totalCosts:{totalCost:0,formatted:{totalCost:"$0.000000"}}}),G=$([]),o=$([]),J=$([]),z=$({data:[],topApiKeys:[],totalApiKeys:0}),n=$({type:"preset",preset:"7days",customStart:"",customEnd:"",customRange:null,presetOptions:[{value:"today",label:"今日",days:1},{value:"7days",label:"7天",days:7},{value:"30days",label:"30天",days:30}]}),T=$("day"),lt=$("requests"),q=$([new Date(2e3,1,1,0,0,0),new Date(2e3,2,1,23,59,59)]),E=wt(()=>{const c=Y.value.uptime,r=Math.floor(c/86400),i=Math.floor(c%86400/3600),d=Math.floor(c%3600/60);return r>0?`${r}天 ${i}小时`:i>0?`${i}小时 ${d}分钟`:`${d}分钟`});function f(c,r=!0){const i=c.getFullYear(),d=c.getMonth(),l=c.getDate();return r?new Date(Date.UTC(i,d,l-1,16,0,0,0)):new Date(Date.UTC(i,d,l,15,59,59,999))}async function pt(c=null){ot.value=!0;try{let r={today:"today",all:"all"};c&&(r={today:{today:"today",all:"today"},"7days":{today:"7days",all:"7days"},monthly:{today:"monthly",all:"monthly"},all:{today:"today",all:"all"}}[c]||r);const[i,d,l]=await Promise.all([Z.get("/admin/dashboard"),Z.get(`/admin/usage-costs?period=${r.today}`),Z.get(`/admin/usage-costs?period=${r.all}`)]);if(i.success){const s=i.data.overview||{},u=i.data.recentActivity||{},m=i.data.systemAverages||{},_=i.data.realtimeMetrics||{},C=i.data.systemHealth||{};Y.value={totalApiKeys:s.totalApiKeys||0,activeApiKeys:s.activeApiKeys||0,totalAccounts:s.totalAccounts||s.totalClaudeAccounts||0,normalAccounts:s.normalAccounts||0,abnormalAccounts:s.abnormalAccounts||0,pausedAccounts:s.pausedAccounts||0,activeAccounts:s.activeAccounts||s.activeClaudeAccounts||0,rateLimitedAccounts:s.rateLimitedAccounts||s.rateLimitedClaudeAccounts||0,accountsByPlatform:s.accountsByPlatform||{claude:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},"claude-console":{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},gemini:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},openai:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},azure_openai:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},bedrock:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0}},todayRequests:u.requestsToday||0,totalRequests:s.totalRequestsUsed||0,todayTokens:u.tokensToday||0,todayInputTokens:u.inputTokensToday||0,todayOutputTokens:u.outputTokensToday||0,totalTokens:s.totalTokensUsed||0,totalInputTokens:s.totalInputTokensUsed||0,totalOutputTokens:s.totalOutputTokensUsed||0,totalCacheCreateTokens:s.totalCacheCreateTokensUsed||0,totalCacheReadTokens:s.totalCacheReadTokensUsed||0,todayCacheCreateTokens:u.cacheCreateTokensToday||0,todayCacheReadTokens:u.cacheReadTokensToday||0,systemRPM:m.rpm||0,systemTPM:m.tpm||0,realtimeRPM:_.rpm||0,realtimeTPM:_.tpm||0,metricsWindow:_.windowMinutes||5,isHistoricalMetrics:_.isHistorical||!1,systemStatus:C.redisConnected?"正常":"异常",uptime:C.uptime||0,systemTimezone:i.data.systemTimezone||8}}d.success&&l.success&&(nt.value={todayCosts:d.data.totalCosts||{totalCost:0,formatted:{totalCost:"$0.000000"}},totalCosts:l.data.totalCosts||{totalCost:0,formatted:{totalCost:"$0.000000"}}})}catch(r){console.error("加载仪表板数据失败:",r)}finally{ot.value=!1}}async function rt(c=7,r="day"){try{let i="/admin/usage-trend?";if(r==="hour")if(i+="granularity=hour",n.value.customRange&&n.value.customRange.length===2){const l=s=>{const[m,_]=s.split(" "),[C,x,v]=m.split("-").map(Number),[M,K,O]=_.split(":").map(Number);return new Date(Date.UTC(C,x-1,v,M-8,K,O)).toISOString()};i+=`&startDate=${encodeURIComponent(l(n.value.customRange[0]))}`,i+=`&endDate=${encodeURIComponent(l(n.value.customRange[1]))}`}else{const l=new Date;let s,u;if(n.value.type==="preset")switch(n.value.preset){case"last24h":{u=new Date(l),s=new Date(l.getTime()-24*60*60*1e3);break}case"yesterday":{const m=new Date;m.setDate(m.getDate()-1),s=f(m,!0),u=f(m,!1);break}case"dayBefore":{const m=new Date;m.setDate(m.getDate()-2),s=f(m,!0),u=f(m,!1);break}default:s=new Date(l.getTime()-24*60*60*1e3),u=l}else s=new Date(l.getTime()-c*24*60*60*1e3),u=l;i+=`&startDate=${encodeURIComponent(s.toISOString())}`,i+=`&endDate=${encodeURIComponent(u.toISOString())}`}else i+=`granularity=day&days=${c}`;const d=await Z.get(i);d.success&&(o.value=d.data)}catch(i){console.error("加载使用趋势失败:",i)}}async function it(c="daily"){try{let r=`/admin/model-stats?period=${c}`;if(n.value.type==="custom"||T.value==="hour"){if(n.value.customRange&&n.value.customRange.length===2){const d=l=>{const[u,m]=l.split(" "),[_,C,x]=u.split("-").map(Number),[v,M,K]=m.split(":").map(Number);return new Date(Date.UTC(_,C-1,x,v-8,M,K)).toISOString()};r+=`&startDate=${encodeURIComponent(d(n.value.customRange[0]))}`,r+=`&endDate=${encodeURIComponent(d(n.value.customRange[1]))}`}else if(T.value==="hour"&&n.value.type==="preset"){const d=new Date;let l,s;switch(n.value.preset){case"last24h":{s=new Date(d),l=new Date(d.getTime()-24*60*60*1e3);break}case"yesterday":{const u=new Date;u.setDate(u.getDate()-1),l=f(u,!0),s=f(u,!1);break}case"dayBefore":{const u=new Date;u.setDate(u.getDate()-2),l=f(u,!0),s=f(u,!1);break}default:l=new Date(d.getTime()-24*60*60*1e3),s=d}r+=`&startDate=${encodeURIComponent(l.toISOString())}`,r+=`&endDate=${encodeURIComponent(s.toISOString())}`}}else if(n.value.type==="preset"&&T.value==="day"){const d=new Date;let l,s;const u=n.value.presetOptions.find(m=>m.value===n.value.preset);if(u){if(n.value.preset==="today")l=f(d,!0),s=f(d,!1);else{const m=new Date;m.setDate(m.getDate()-(u.days-1)),l=f(m,!0),s=f(d,!1)}r+=`&startDate=${encodeURIComponent(l.toISOString())}`,r+=`&endDate=${encodeURIComponent(s.toISOString())}`}}const i=await Z.get(r);i.success&&(J.value=i.data)}catch(r){console.error("加载模型统计失败:",r)}}async function dt(c="requests"){try{let r="/admin/api-keys-usage-trend?",i=7;if(T.value==="hour")if(r+="granularity=hour",n.value.customRange&&n.value.customRange.length===2){const l=s=>{const[m,_]=s.split(" "),[C,x,v]=m.split("-").map(Number),[M,K,O]=_.split(":").map(Number);return new Date(Date.UTC(C,x-1,v,M-8,K,O)).toISOString()};r+=`&startDate=${encodeURIComponent(l(n.value.customRange[0]))}`,r+=`&endDate=${encodeURIComponent(l(n.value.customRange[1]))}`}else{const l=new Date;let s,u;if(n.value.type==="preset")switch(n.value.preset){case"last24h":{u=new Date(l),s=new Date(l.getTime()-24*60*60*1e3);break}case"yesterday":{const m=new Date;m.setDate(m.getDate()-1),s=f(m,!0),u=f(m,!1);break}case"dayBefore":{const m=new Date;m.setDate(m.getDate()-2),s=f(m,!0),u=f(m,!1);break}default:s=new Date(l.getTime()-24*60*60*1e3),u=l}else s=new Date(l.getTime()-24*60*60*1e3),u=l;r+=`&startDate=${encodeURIComponent(s.toISOString())}`,r+=`&endDate=${encodeURIComponent(u.toISOString())}`}else i=n.value.type==="preset"?n.value.preset==="today"?1:n.value.preset==="7days"?7:30:Q(n.value.customStart,n.value.customEnd),r+=`granularity=day&days=${i}`;r+=`&metric=${c}`;const d=await Z.get(r);d.success&&(z.value={data:d.data||[],topApiKeys:d.topApiKeys||[],totalApiKeys:d.totalApiKeys||0})}catch(r){console.error("加载API Keys趋势失败:",r)}}function N(c){n.value.type="preset",n.value.preset=c;const r=n.value.presetOptions.find(i=>i.value===c);if(r){const i=new Date;let d,l;if(T.value==="hour")switch(c){case"last24h":{l=new Date(i),d=new Date(i.getTime()-24*60*60*1e3);break}case"yesterday":{const s=new Date;s.setDate(s.getDate()-1),d=f(s,!0),l=f(s,!1);break}case"dayBefore":{const s=new Date;s.setDate(s.getDate()-2),d=f(s,!0),l=f(s,!1);break}}else d=new Date(i),l=new Date(i),c==="today"?(d.setHours(0,0,0,0),l.setHours(23,59,59,999)):(d.setDate(i.getDate()-(r.days-1)),d.setHours(0,0,0,0),l.setHours(23,59,59,999));if(n.value.customStart=d.toISOString().split("T")[0],n.value.customEnd=l.toISOString().split("T")[0],T.value==="hour"&&(c==="yesterday"||c==="dayBefore")){const s=new Date;c==="yesterday"?s.setDate(s.getDate()-1):s.setDate(s.getDate()-2);const u=s.getFullYear(),m=String(s.getMonth()+1).padStart(2,"0"),_=String(s.getDate()).padStart(2,"0");n.value.customRange=[`${u}-${m}-${_} 00:00:00`,`${u}-${m}-${_} 23:59:59`]}else{const s=u=>{const C=new Date(u.getTime()+288e5),x=C.getUTCFullYear(),v=String(C.getUTCMonth()+1).padStart(2,"0"),M=String(C.getUTCDate()).padStart(2,"0"),K=String(C.getUTCHours()).padStart(2,"0"),O=String(C.getUTCMinutes()).padStart(2,"0"),L=String(C.getUTCSeconds()).padStart(2,"0");return`${x}-${v}-${M} ${K}:${O}:${L}`};n.value.customRange=[s(d),s(l)]}}W()}function ct(c){if(c&&c.length===2){n.value.type="custom",n.value.preset="",n.value.customRange=c,n.value.customStart=c[0].split(" ")[0],n.value.customEnd=c[1].split(" ")[0];const r=l=>{const[s,u]=l.split(" "),[m,_,C]=s.split("-").map(Number),[x,v,M]=u.split(":").map(Number);return new Date(m,_-1,C,x,v,M)},i=r(c[0]),d=r(c[1]);if(T.value==="hour"){if((d-i)/36e5>24){bt("小时粒度下日期范围不能超过24小时","warning");return}}else if(Math.ceil((d-i)/864e5)+1>31){bt("日期范围不能超过 31 天","warning");return}W()}else c===null&&N(T.value==="hour"?"last24h":"7days")}function gt(c){if(T.value=c,c==="hour"){if(n.value.presetOptions=[{value:"last24h",label:"近24小时",hours:24},{value:"yesterday",label:"昨天",hours:24},{value:"dayBefore",label:"前天",hours:24}],n.value.type==="custom"&&n.value.customRange&&n.value.customRange.length===2){const r=new Date(n.value.customRange[0]);if((new Date(n.value.customRange[1])-r)/(1e3*60*60)>24){bt("小时粒度下日期范围不能超过24小时,已切换到近24小时","warning"),N("last24h");return}}if(["today","7days","30days"].includes(n.value.preset)){N("last24h");return}}else if(n.value.presetOptions=[{value:"today",label:"今日",days:1},{value:"7days",label:"7天",days:7},{value:"30days",label:"30天",days:30}],["last24h","yesterday","dayBefore"].includes(n.value.preset)){N("7days");return}W()}async function W(){let c,r="monthly";if(n.value.type==="preset"){const i=n.value.presetOptions.find(d=>d.value===n.value.preset);T.value==="hour"?(c=1,r="daily"):(c=i?i.days:7,n.value.preset==="today"?r="daily":r="monthly")}else{if(T.value==="hour"){const i=new Date(n.value.customRange[0]),d=new Date(n.value.customRange[1]),l=Math.ceil((d-i)/(1e3*60*60));c=Math.ceil(l/24)||1}else c=Q(n.value.customStart,n.value.customEnd);r="daily"}await Promise.all([rt(c,T.value),it(r),dt(lt.value)])}function Q(c,r){if(!c||!r)return 7;const i=new Date(c),d=new Date(r),l=Math.abs(d-i);return Math.ceil(l/(1e3*60*60*24))||7}function tt(c){return c>new Date}return{loading:ot,dashboardData:Y,costsData:nt,modelStats:G,trendData:o,dashboardModelStats:J,apiKeysTrendData:z,dateFilter:n,trendGranularity:T,apiKeysTrendMetric:lt,defaultTime:q,formattedUptime:E,loadDashboardData:pt,loadUsageTrend:rt,loadModelStats:it,loadApiKeysTrend:dt,setDateFilterPreset:N,onCustomDateRangeChange:ct,setTrendGranularity:gt,refreshChartsData:W,disabledDate:tt}}),Ft={class:"mb-4 grid grid-cols-1 gap-3 sm:mb-6 sm:grid-cols-2 sm:gap-4 md:mb-8 md:gap-6 lg:grid-cols-4"},zt={class:"stat-card"},Lt={class:"flex items-center justify-between"},Ht={class:"text-2xl font-bold text-gray-900 dark:text-gray-100 sm:text-3xl"},qt={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},Et={class:"stat-card"},Nt={class:"flex items-center justify-between"},Vt={class:"flex-1"},jt={class:"flex flex-wrap items-baseline gap-x-2"},Yt={class:"text-2xl font-bold text-gray-900 dark:text-gray-100 sm:text-3xl"},Gt={key:0,class:"flex items-center gap-2"},Wt=["title"],Qt={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},Xt=["title"],Zt={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},Jt=["title"],te={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},ee=["title"],ae={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},se=["title"],oe={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},ne=["title"],le={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},re={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},ie={key:0,class:"text-red-600"},de={key:1,class:"text-gray-600 dark:text-gray-400"},ce={key:2,class:"text-yellow-600"},ue={class:"stat-card"},me={class:"flex items-center justify-between"},ye={class:"text-2xl font-bold text-gray-900 dark:text-gray-100 sm:text-3xl"},pe={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},ge={class:"stat-card"},fe={class:"flex items-center justify-between"},xe={class:"text-2xl font-bold text-green-600 sm:text-3xl"},be={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},ve={class:"mb-4 grid grid-cols-1 gap-3 sm:mb-6 sm:grid-cols-2 sm:gap-4 md:mb-8 md:gap-6 lg:grid-cols-4"},he={class:"stat-card"},ke={class:"flex items-center justify-between"},De={class:"mr-8 flex-1"},Te={class:"mb-2 flex flex-wrap items-baseline gap-2"},_e={class:"text-xl font-bold text-blue-600 sm:text-2xl md:text-3xl"},Ce={class:"text-sm font-medium text-green-600"},we={class:"text-xs text-gray-500 dark:text-gray-400"},Se={class:"flex flex-wrap items-center justify-between gap-x-4"},$e={class:"font-medium"},Re={class:"font-medium"},Ae={key:0,class:"text-purple-600"},Pe={class:"font-medium"},Be={key:1,class:"text-purple-600"},Ie={class:"font-medium"},Ue={class:"stat-card"},Me={class:"flex items-center justify-between"},Ke={class:"mr-8 flex-1"},Oe={class:"mb-2 flex flex-wrap items-baseline gap-2"},Fe={class:"text-xl font-bold text-emerald-600 sm:text-2xl md:text-3xl"},ze={class:"text-sm font-medium text-green-600"},Le={class:"text-xs text-gray-500 dark:text-gray-400"},He={class:"flex flex-wrap items-center justify-between gap-x-4"},qe={class:"font-medium"},Ee={class:"font-medium"},Ne={key:0,class:"text-purple-600"},Ve={class:"font-medium"},je={key:1,class:"text-purple-600"},Ye={class:"font-medium"},Ge={class:"stat-card"},We={class:"flex items-center justify-between"},Qe={class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"},Xe={class:"text-xs text-gray-400"},Ze={class:"text-2xl font-bold text-orange-600 sm:text-3xl"},Je={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},ta={key:0,class:"text-yellow-600"},ea={class:"stat-card"},aa={class:"flex items-center justify-between"},sa={class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"},oa={class:"text-xs text-gray-400"},na={class:"text-2xl font-bold text-rose-600 sm:text-3xl"},la={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},ra={key:0,class:"text-yellow-600"},ia={class:"mb-8"},da={class:"mb-4 flex flex-col gap-4 sm:mb-6"},ca={class:"flex flex-col gap-2 lg:flex-row lg:items-center lg:justify-end"},ua={class:"flex flex-shrink-0 gap-1 overflow-x-auto rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},ma=["onClick"],ya={class:"flex gap-1 rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},pa={class:"flex items-center gap-2"},ga={key:0,class:"text-xs text-orange-600"},fa={class:"flex items-center gap-2"},xa={class:"flex items-center rounded-lg bg-gray-100 px-3 py-1 dark:bg-gray-700"},ba={class:"relative inline-flex cursor-pointer items-center"},va={class:"ml-2.5 flex select-none items-center gap-1 text-sm font-medium text-gray-600 dark:text-gray-300"},ha=["disabled"],ka={class:"hidden sm:inline"},Da={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},Ta={class:"card p-4 sm:p-6"},_a={class:"relative",style:{height:"250px"}},Ca={class:"card p-4 sm:p-6"},wa={key:0,class:"py-8 text-center"},Sa={key:1,class:"max-h-[250px] overflow-auto sm:max-h-[300px]"},$a={class:"min-w-full"},Ra={class:"divide-y divide-gray-200 dark:divide-gray-600"},Aa={class:"px-2 py-2 text-xs text-gray-900 dark:text-gray-100 sm:px-4 sm:text-sm"},Pa=["title"],Ba={class:"hidden px-2 py-2 text-right text-xs text-gray-600 dark:text-gray-400 sm:table-cell sm:px-4 sm:text-sm"},Ia={class:"px-2 py-2 text-right text-xs text-gray-600 dark:text-gray-400 sm:px-4 sm:text-sm"},Ua={class:"px-2 py-2 text-right text-xs font-medium text-green-600 sm:px-4 sm:text-sm"},Ma={class:"hidden px-2 py-2 text-right text-xs font-medium sm:table-cell sm:px-4 sm:text-sm"},Ka={class:"inline-flex items-center rounded-full bg-blue-100 px-2 py-1 text-xs font-medium text-blue-800 dark:bg-blue-900/30 dark:text-blue-300"},Oa={class:"mb-4 sm:mb-6 md:mb-8"},Fa={class:"card p-4 sm:p-6"},za={class:"sm:h-[300px]",style:{height:"250px"}},La={class:"mb-4 sm:mb-6 md:mb-8"},Ha={class:"card p-4 sm:p-6"},qa={class:"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"},Ea={class:"flex gap-1 rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},Na={class:"mb-4 text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},Va={key:0},ja={key:1},Ya={class:"sm:h-[350px]",style:{height:"300px"}},Ga={__name:"DashboardView",setup(ot){const Y=Ot(),nt=Kt(),{isDarkMode:G}=Tt(nt),{dashboardData:o,costsData:J,dashboardModelStats:z,trendData:n,apiKeysTrendData:T,formattedUptime:lt,dateFilter:q,trendGranularity:E,apiKeysTrendMetric:f,defaultTime:pt}=Tt(Y),{loadDashboardData:rt,loadApiKeysTrend:it,setDateFilterPreset:dt,onCustomDateRangeChange:N,setTrendGranularity:ct,refreshChartsData:gt,disabledDate:W}=Y,Q=$(null),tt=$(null),c=$(null);let r=null,i=null,d=null;const l=$(!1),s=$(30),u=$(null),m=$(0),_=$(null),C=$(!1),x=wt(()=>({text:G.value?"#e5e7eb":"#374151",grid:G.value?"rgba(75, 85, 99, 0.3)":"rgba(0, 0, 0, 0.1)",legend:G.value?"#e5e7eb":"#374151"}));function v(D){return D>=1e6?(D/1e6).toFixed(2)+"M":D>=1e3?(D/1e3).toFixed(2)+"K":D.toString()}function M(D,e){if(!e||e.length===0)return 0;const R=e.reduce((g,H)=>g+H.allTokens,0);return R===0?0:(D/R*100).toFixed(1)}function K(){if(!Q.value)return;r&&r.destroy();const D=z.value||[],e={labels:D.map(R=>R.model),datasets:[{data:D.map(R=>R.allTokens),backgroundColor:["#3B82F6","#10B981","#F59E0B","#EF4444","#8B5CF6","#EC4899","#14B8A6","#F97316","#6366F1","#84CC16"],borderWidth:0}]};r=new vt(Q.value,{type:"doughnut",data:e,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{padding:15,usePointStyle:!0,font:{size:12},color:x.value.legend}},tooltip:{callbacks:{label:function(R){const g=R.label||"",H=v(R.parsed),et=M(R.parsed,D);return`${g}: ${H} (${et}%)`}}}}}})}function O(){var A;if(!tt.value)return;i&&i.destroy();const D=n.value||[],e=D.map(p=>p.inputTokens||0),R=D.map(p=>p.outputTokens||0),g=D.map(p=>p.cacheCreateTokens||0),H=D.map(p=>p.cacheReadTokens||0),et=D.map(p=>p.requests||0),ut=D.map(p=>p.cost||0),mt=(A=D[0])!=null&&A.date?"date":"hour",U={labels:D.map(p=>{if(p.label)return p.label;if(mt==="hour"){const b=new Date(p.hour),I=String(b.getMonth()+1).padStart(2,"0"),V=String(b.getDate()).padStart(2,"0"),yt=String(b.getHours()).padStart(2,"0");return`${I}/${V} ${yt}:00`}const S=p.date;if(S&&S.includes("-")){const b=S.split("-");if(b.length>=3)return`${b[1]}/${b[2]}`}return p.date}),datasets:[{label:"输入Token",data:e,borderColor:"rgb(102, 126, 234)",backgroundColor:"rgba(102, 126, 234, 0.1)",tension:.3},{label:"输出Token",data:R,borderColor:"rgb(240, 147, 251)",backgroundColor:"rgba(240, 147, 251, 0.1)",tension:.3},{label:"缓存创建Token",data:g,borderColor:"rgb(59, 130, 246)",backgroundColor:"rgba(59, 130, 246, 0.1)",tension:.3},{label:"缓存读取Token",data:H,borderColor:"rgb(147, 51, 234)",backgroundColor:"rgba(147, 51, 234, 0.1)",tension:.3},{label:"费用 (USD)",data:ut,borderColor:"rgb(34, 197, 94)",backgroundColor:"rgba(34, 197, 94, 0.1)",tension:.3,yAxisID:"y2"},{label:"请求数",data:et,borderColor:"rgb(16, 185, 129)",backgroundColor:"rgba(16, 185, 129, 0.1)",tension:.3,yAxisID:"y1"}]};i=new vt(tt.value,{type:"line",data:U,options:{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{title:{display:!0,text:"Token使用趋势",font:{size:16,weight:"bold"},color:x.value.text},legend:{position:"top",labels:{color:x.value.legend}},tooltip:{mode:"index",intersect:!1,itemSort:function(p,S){const b=p.dataset.label||"",I=S.dataset.label||"";return b==="费用 (USD)"||I==="费用 (USD)"?b==="费用 (USD)"?-1:1:b==="请求数"||I==="请求数"?b==="请求数"?1:-1:S.parsed.y-p.parsed.y},callbacks:{label:function(p){const S=p.dataset.label||"";let b=p.parsed.y;return S==="费用 (USD)"?b<.01?S+": $"+b.toFixed(6):S+": $"+b.toFixed(4):S==="请求数"?S+": "+b.toLocaleString()+" 次":b>=1e6?S+": "+(b/1e6).toFixed(2)+"M tokens":b>=1e3?S+": "+(b/1e3).toFixed(2)+"K tokens":S+": "+b.toLocaleString()+" tokens"}}}},scales:{x:{type:"category",display:!0,title:{display:!0,text:E==="hour"?"时间":"日期",color:x.value.text},ticks:{color:x.value.text},grid:{color:x.value.grid}},y:{type:"linear",display:!0,position:"left",title:{display:!0,text:"Token数量",color:x.value.text},ticks:{callback:function(p){return v(p)},color:x.value.text},grid:{color:x.value.grid}},y1:{type:"linear",display:!0,position:"right",title:{display:!0,text:"请求数",color:x.value.text},grid:{drawOnChartArea:!1},ticks:{callback:function(p){return p.toLocaleString()},color:x.value.text}},y2:{type:"linear",display:!1,position:"right"}}}})}function L(){var ut,mt;if(!c.value)return;d&&d.destroy();const D=T.value.data||[],e=f.value,R=["#3B82F6","#10B981","#F59E0B","#EF4444","#8B5CF6","#EC4899","#14B8A6","#F97316","#6366F1","#84CC16"],g=((ut=T.value.topApiKeys)==null?void 0:ut.map((w,U)=>{var S,b;const A=T.value.data.map(I=>!I.apiKeys||!I.apiKeys[w]?0:e==="tokens"?I.apiKeys[w].tokens:I.apiKeys[w].requests||0);return{label:((b=(S=T.value.data.find(I=>I.apiKeys&&I.apiKeys[w]))==null?void 0:S.apiKeys[w])==null?void 0:b.name)||`API Key ${w}`,data:A,borderColor:R[U%R.length],backgroundColor:R[U%R.length]+"20",tension:.4,fill:!1}}))||[],H=(mt=D[0])!=null&&mt.date?"date":"hour",et={labels:D.map(w=>{if(w.label)return w.label;if(H==="hour"){const A=new Date(w.hour),p=String(A.getMonth()+1).padStart(2,"0"),S=String(A.getDate()).padStart(2,"0"),b=String(A.getHours()).padStart(2,"0");return`${p}/${S} ${b}:00`}const U=w.date;if(U&&U.includes("-")){const A=U.split("-");if(A.length>=3)return`${A[1]}/${A[2]}`}return w.date}),datasets:g};d=new vt(c.value,{type:"line",data:et,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{padding:20,usePointStyle:!0,font:{size:12},color:x.value.legend}},tooltip:{mode:"index",intersect:!1,itemSort:function(w,U){return U.parsed.y-w.parsed.y},callbacks:{label:function(w){var yt;const U=w.dataset.label||"",A=w.parsed.y,p=w.dataIndex,S=T.value.data[p],I=w.chart.data.datasets.map((F,at)=>({value:F.data[p]||0,index:at})).sort((F,at)=>at.value-F.value).findIndex(F=>F.index===w.datasetIndex)+1;let V="";if(I===1?V="🥇 ":I===2?V="🥈 ":I===3&&(V="🥉 "),f.value==="tokens"){let F="";A>=1e6?F=(A/1e6).toFixed(2)+"M":A>=1e3?F=(A/1e3).toFixed(2)+"K":F=A.toLocaleString();const at=T.value.topApiKeys[w.datasetIndex],xt=(yt=S==null?void 0:S.apiKeys)==null?void 0:yt[at],St=(xt==null?void 0:xt.formattedCost)||"$0.00";return`${V}${U}: ${F} tokens (${St})`}else return`${V}${U}: ${A.toLocaleString()} 次`}}}},scales:{x:{type:"category",display:!0,title:{display:!0,text:E==="hour"?"时间":"日期",color:x.value.text},ticks:{color:x.value.text},grid:{color:x.value.grid}},y:{beginAtZero:!0,title:{display:!0,text:f.value==="tokens"?"Token 数量":"请求次数",color:x.value.text},ticks:{callback:function(w){return v(w)},color:x.value.text},grid:{color:x.value.grid}}}}})}async function ht(){await it(f.value),await X(),L()}st(z,()=>{X(()=>K())}),st(n,()=>{X(()=>O())}),st(T,()=>{X(()=>L())});async function ft(){if(!C.value){C.value=!0;try{await Promise.all([rt(),gt()])}finally{C.value=!1}}}function kt(){l.value&&(m.value=s.value,_.value&&clearInterval(_.value),u.value&&clearTimeout(u.value),_.value=setInterval(()=>{m.value--,m.value<=0&&clearInterval(_.value)},1e3),u.value=setTimeout(async()=>{await ft(),l.value&&kt()},s.value*1e3))}function Dt(){_.value&&(clearInterval(_.value),_.value=null),u.value&&(clearTimeout(u.value),u.value=null),m.value=0}return st(l,D=>{D?kt():Dt()}),st(G,()=>{X(()=>{K(),O(),L()})}),At(async()=>{await ft(),await X(),K(),O(),L()}),Pt(()=>{Dt(),r&&r.destroy(),i&&i.destroy(),d&&d.destroy()}),(D,e)=>{const R=$t;return k(),h("div",null,[t("div",Ft,[t("div",zt,[t("div",Lt,[t("div",null,[e[7]||(e[7]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 总API Keys ",-1)),t("p",Ht,y(a(o).totalApiKeys),1),t("p",qt," 活跃: "+y(a(o).activeApiKeys||0),1)]),e[8]||(e[8]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-blue-500 to-blue-600"},[t("i",{class:"fas fa-key"})],-1))])]),t("div",Et,[t("div",Nt,[t("div",Vt,[e[15]||(e[15]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 服务账户 ",-1)),t("div",jt,[t("p",Yt,y(a(o).totalAccounts),1),a(o).accountsByPlatform?(k(),h("div",Gt,[a(o).accountsByPlatform.claude&&a(o).accountsByPlatform.claude.total>0?(k(),h("div",{key:0,class:"inline-flex items-center gap-0.5",title:`Claude: ${a(o).accountsByPlatform.claude.total} 个 (正常: ${a(o).accountsByPlatform.claude.normal})`},[e[9]||(e[9]=t("i",{class:"fas fa-brain text-xs text-indigo-600"},null,-1)),t("span",Qt,y(a(o).accountsByPlatform.claude.total),1)],8,Wt)):P("",!0),a(o).accountsByPlatform["claude-console"]&&a(o).accountsByPlatform["claude-console"].total>0?(k(),h("div",{key:1,class:"inline-flex items-center gap-0.5",title:`Console: ${a(o).accountsByPlatform["claude-console"].total} 个 (正常: ${a(o).accountsByPlatform["claude-console"].normal})`},[e[10]||(e[10]=t("i",{class:"fas fa-terminal text-xs text-purple-600"},null,-1)),t("span",Zt,y(a(o).accountsByPlatform["claude-console"].total),1)],8,Xt)):P("",!0),a(o).accountsByPlatform.gemini&&a(o).accountsByPlatform.gemini.total>0?(k(),h("div",{key:2,class:"inline-flex items-center gap-0.5",title:`Gemini: ${a(o).accountsByPlatform.gemini.total} 个 (正常: ${a(o).accountsByPlatform.gemini.normal})`},[e[11]||(e[11]=t("i",{class:"fas fa-robot text-xs text-yellow-600"},null,-1)),t("span",te,y(a(o).accountsByPlatform.gemini.total),1)],8,Jt)):P("",!0),a(o).accountsByPlatform.bedrock&&a(o).accountsByPlatform.bedrock.total>0?(k(),h("div",{key:3,class:"inline-flex items-center gap-0.5",title:`Bedrock: ${a(o).accountsByPlatform.bedrock.total} 个 (正常: ${a(o).accountsByPlatform.bedrock.normal})`},[e[12]||(e[12]=t("i",{class:"fab fa-aws text-xs text-orange-600"},null,-1)),t("span",ae,y(a(o).accountsByPlatform.bedrock.total),1)],8,ee)):P("",!0),a(o).accountsByPlatform.openai&&a(o).accountsByPlatform.openai.total>0?(k(),h("div",{key:4,class:"inline-flex items-center gap-0.5",title:`OpenAI: ${a(o).accountsByPlatform.openai.total} 个 (正常: ${a(o).accountsByPlatform.openai.normal})`},[e[13]||(e[13]=t("i",{class:"fas fa-openai text-xs text-gray-100"},null,-1)),t("span",oe,y(a(o).accountsByPlatform.openai.total),1)],8,se)):P("",!0),a(o).accountsByPlatform.azure_openai&&a(o).accountsByPlatform.azure_openai.total>0?(k(),h("div",{key:5,class:"inline-flex items-center gap-0.5",title:`Azure OpenAI: ${a(o).accountsByPlatform.azure_openai.total} 个 (正常: ${a(o).accountsByPlatform.azure_openai.normal})`},[e[14]||(e[14]=t("i",{class:"fab fa-microsoft text-xs text-blue-600"},null,-1)),t("span",le,y(a(o).accountsByPlatform.azure_openai.total),1)],8,ne)):P("",!0)])):P("",!0)]),t("p",re,[B(" 正常: "+y(a(o).normalAccounts||0)+" ",1),a(o).abnormalAccounts>0?(k(),h("span",ie," | 异常: "+y(a(o).abnormalAccounts),1)):P("",!0),a(o).pausedAccounts>0?(k(),h("span",de," | 停止调度: "+y(a(o).pausedAccounts),1)):P("",!0),a(o).rateLimitedAccounts>0?(k(),h("span",ce," | 限流: "+y(a(o).rateLimitedAccounts),1)):P("",!0)])]),e[16]||(e[16]=t("div",{class:"stat-icon ml-2 flex-shrink-0 bg-gradient-to-br from-green-500 to-green-600"},[t("i",{class:"fas fa-user-circle"})],-1))])]),t("div",ue,[t("div",me,[t("div",null,[e[17]||(e[17]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 今日请求 ",-1)),t("p",ye,y(a(o).todayRequests),1),t("p",pe," 总请求: "+y(v(a(o).totalRequests||0)),1)]),e[18]||(e[18]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-purple-500 to-purple-600"},[t("i",{class:"fas fa-chart-line"})],-1))])]),t("div",ge,[t("div",fe,[t("div",null,[e[19]||(e[19]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 系统状态 ",-1)),t("p",xe,y(a(o).systemStatus),1),t("p",be," 运行时间: "+y(a(lt)),1)]),e[20]||(e[20]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-yellow-500 to-orange-500"},[t("i",{class:"fas fa-heartbeat"})],-1))])])]),t("div",ve,[t("div",he,[t("div",ke,[t("div",De,[e[25]||(e[25]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 今日Token ",-1)),t("div",Te,[t("p",_e,y(v((a(o).todayInputTokens||0)+(a(o).todayOutputTokens||0)+(a(o).todayCacheCreateTokens||0)+(a(o).todayCacheReadTokens||0))),1),t("span",Ce,"/ "+y(a(J).todayCosts.formatted.totalCost),1)]),t("div",we,[t("div",Se,[t("span",null,[e[21]||(e[21]=B("输入: ",-1)),t("span",$e,y(v(a(o).todayInputTokens||0)),1)]),t("span",null,[e[22]||(e[22]=B("输出: ",-1)),t("span",Re,y(v(a(o).todayOutputTokens||0)),1)]),(a(o).todayCacheCreateTokens||0)>0?(k(),h("span",Ae,[e[23]||(e[23]=B("缓存创建: ",-1)),t("span",Pe,y(v(a(o).todayCacheCreateTokens||0)),1)])):P("",!0),(a(o).todayCacheReadTokens||0)>0?(k(),h("span",Be,[e[24]||(e[24]=B("缓存读取: ",-1)),t("span",Ie,y(v(a(o).todayCacheReadTokens||0)),1)])):P("",!0)])])]),e[26]||(e[26]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-indigo-500 to-indigo-600"},[t("i",{class:"fas fa-coins"})],-1))])]),t("div",Ue,[t("div",Me,[t("div",Ke,[e[31]||(e[31]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 总Token消耗 ",-1)),t("div",Oe,[t("p",Fe,y(v((a(o).totalInputTokens||0)+(a(o).totalOutputTokens||0)+(a(o).totalCacheCreateTokens||0)+(a(o).totalCacheReadTokens||0))),1),t("span",ze,"/ "+y(a(J).totalCosts.formatted.totalCost),1)]),t("div",Le,[t("div",He,[t("span",null,[e[27]||(e[27]=B("输入: ",-1)),t("span",qe,y(v(a(o).totalInputTokens||0)),1)]),t("span",null,[e[28]||(e[28]=B("输出: ",-1)),t("span",Ee,y(v(a(o).totalOutputTokens||0)),1)]),(a(o).totalCacheCreateTokens||0)>0?(k(),h("span",Ne,[e[29]||(e[29]=B("缓存创建: ",-1)),t("span",Ve,y(v(a(o).totalCacheCreateTokens||0)),1)])):P("",!0),(a(o).totalCacheReadTokens||0)>0?(k(),h("span",je,[e[30]||(e[30]=B("缓存读取: ",-1)),t("span",Ye,y(v(a(o).totalCacheReadTokens||0)),1)])):P("",!0)])])]),e[32]||(e[32]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-emerald-500 to-emerald-600"},[t("i",{class:"fas fa-database"})],-1))])]),t("div",Ge,[t("div",We,[t("div",null,[t("p",Qe,[e[33]||(e[33]=B(" 实时RPM ",-1)),t("span",Xe,"("+y(a(o).metricsWindow)+"分钟)",1)]),t("p",Ze,y(a(o).realtimeRPM||0),1),t("p",Je,[e[35]||(e[35]=B(" 每分钟请求数 ",-1)),a(o).isHistoricalMetrics?(k(),h("span",ta,e[34]||(e[34]=[t("i",{class:"fas fa-exclamation-circle"},null,-1),B(" 历史数据 ",-1)]))):P("",!0)])]),e[36]||(e[36]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-orange-500 to-orange-600"},[t("i",{class:"fas fa-tachometer-alt"})],-1))])]),t("div",ea,[t("div",aa,[t("div",null,[t("p",sa,[e[37]||(e[37]=B(" 实时TPM ",-1)),t("span",oa,"("+y(a(o).metricsWindow)+"分钟)",1)]),t("p",na,y(v(a(o).realtimeTPM||0)),1),t("p",la,[e[39]||(e[39]=B(" 每分钟Token数 ",-1)),a(o).isHistoricalMetrics?(k(),h("span",ra,e[38]||(e[38]=[t("i",{class:"fas fa-exclamation-circle"},null,-1),B(" 历史数据 ",-1)]))):P("",!0)])]),e[40]||(e[40]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-rose-500 to-rose-600"},[t("i",{class:"fas fa-rocket"})],-1))])])]),t("div",ia,[t("div",da,[e[47]||(e[47]=t("h3",{class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"}," 模型使用分布与Token使用趋势 ",-1)),t("div",ca,[t("div",ua,[(k(!0),h(_t,null,Ct(a(q).presetOptions,g=>(k(),h("button",{key:g.value,class:j(["rounded-md px-3 py-1 text-sm font-medium transition-colors",a(q).preset===g.value&&a(q).type==="preset"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:H=>a(dt)(g.value)},y(g.label),11,ma))),128))]),t("div",ya,[t("button",{class:j(["rounded-md px-3 py-1 text-sm font-medium transition-colors",a(E)==="day"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:e[0]||(e[0]=g=>a(ct)("day"))},e[41]||(e[41]=[t("i",{class:"fas fa-calendar-day mr-1"},null,-1),B("按天 ",-1)]),2),t("button",{class:j(["rounded-md px-3 py-1 text-sm font-medium transition-colors",a(E)==="hour"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:e[1]||(e[1]=g=>a(ct)("hour"))},e[42]||(e[42]=[t("i",{class:"fas fa-clock mr-1"},null,-1),B("按小时 ",-1)]),2)]),t("div",pa,[Bt(R,{modelValue:a(q).customRange,"onUpdate:modelValue":e[2]||(e[2]=g=>a(q).customRange=g),class:"custom-date-picker w-full lg:w-auto","default-time":a(pt),"disabled-date":a(W),"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","range-separator":"至",size:"default","start-placeholder":"开始日期",style:{"max-width":"400px"},type:"datetimerange","value-format":"YYYY-MM-DD HH:mm:ss",onChange:a(N)},null,8,["modelValue","default-time","disabled-date","onChange"]),a(E)==="hour"?(k(),h("span",ga,e[43]||(e[43]=[t("i",{class:"fas fa-info-circle"},null,-1),B(" 最多24小时 ",-1)]))):P("",!0)]),t("div",fa,[t("div",xa,[t("label",ba,[It(t("input",{"onUpdate:modelValue":e[3]||(e[3]=g=>l.value=g),class:"peer sr-only",type:"checkbox"},null,512),[[Ut,l.value]]),e[46]||(e[46]=t("div",{class:"peer relative h-5 w-9 rounded-full bg-gray-300 transition-all duration-200 after:absolute after:left-[2px] after:top-0.5 after:h-4 after:w-4 after:rounded-full after:bg-white after:shadow-sm after:transition-transform after:duration-200 after:content-[''] peer-checked:bg-blue-500 peer-checked:after:translate-x-4 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-blue-300 dark:bg-gray-600 dark:after:bg-gray-300 dark:peer-focus:ring-blue-600"},null,-1)),t("span",va,[e[44]||(e[44]=t("i",{class:"fas fa-redo-alt text-xs text-gray-500 dark:text-gray-400"},null,-1)),e[45]||(e[45]=t("span",null,"自动刷新",-1)),l.value?(k(),h("span",{key:0,class:j(["ml-1 font-mono text-xs text-blue-600 transition-opacity",m.value>0?"opacity-100":"opacity-0"])},y(m.value)+"s ",3)):P("",!0)])])]),t("button",{class:"flex items-center gap-1 rounded-md border border-gray-300 bg-white px-3 py-1 text-sm font-medium text-blue-600 shadow-sm transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:hover:bg-gray-700 sm:gap-2",disabled:C.value,title:"立即刷新数据",onClick:e[4]||(e[4]=g=>ft())},[t("i",{class:j(["fas fa-sync-alt text-xs",{"animate-spin":C.value}])},null,2),t("span",ka,y(C.value?"刷新中":"刷新"),1)],8,ha)])])]),t("div",Da,[t("div",Ta,[e[48]||(e[48]=t("h4",{class:"mb-4 text-base font-semibold text-gray-800 dark:text-gray-200 sm:text-lg"}," Token使用分布 ",-1)),t("div",_a,[t("canvas",{ref_key:"modelUsageChart",ref:Q},null,512)])]),t("div",Ca,[e[51]||(e[51]=t("h4",{class:"mb-4 text-base font-semibold text-gray-800 dark:text-gray-200 sm:text-lg"}," 详细统计数据 ",-1)),a(z).length===0?(k(),h("div",wa,e[49]||(e[49]=[t("p",{class:"text-sm text-gray-500 sm:text-base"},"暂无模型使用数据",-1)]))):(k(),h("div",Sa,[t("table",$a,[e[50]||(e[50]=t("thead",{class:"sticky top-0 bg-gray-50 dark:bg-gray-700"},[t("tr",null,[t("th",{class:"px-2 py-2 text-left text-xs font-medium text-gray-700 dark:text-gray-300 sm:px-4"}," 模型 "),t("th",{class:"hidden px-2 py-2 text-right text-xs font-medium text-gray-700 dark:text-gray-300 sm:table-cell sm:px-4"}," 请求数 "),t("th",{class:"px-2 py-2 text-right text-xs font-medium text-gray-700 dark:text-gray-300 sm:px-4"}," 总Token "),t("th",{class:"px-2 py-2 text-right text-xs font-medium text-gray-700 dark:text-gray-300 sm:px-4"}," 费用 "),t("th",{class:"hidden px-2 py-2 text-right text-xs font-medium text-gray-700 dark:text-gray-300 sm:table-cell sm:px-4"}," 占比 ")])],-1)),t("tbody",Ra,[(k(!0),h(_t,null,Ct(a(z),g=>(k(),h("tr",{key:g.model,class:"hover:bg-gray-50 dark:hover:bg-gray-700"},[t("td",Aa,[t("span",{class:"block max-w-[100px] truncate sm:max-w-none",title:g.model},y(g.model),9,Pa)]),t("td",Ba,y(v(g.requests)),1),t("td",Ia,y(v(g.allTokens)),1),t("td",Ua,y(g.formatted?g.formatted.total:"$0.000000"),1),t("td",Ma,[t("span",Ka,y(M(g.allTokens,a(z)))+"% ",1)])]))),128))])])]))])])]),t("div",Oa,[t("div",Fa,[t("div",za,[t("canvas",{ref_key:"usageTrendChart",ref:tt},null,512)])])]),t("div",La,[t("div",Ha,[t("div",qa,[e[54]||(e[54]=t("h3",{class:"text-base font-semibold text-gray-900 dark:text-gray-100 sm:text-lg"}," API Keys 使用趋势 ",-1)),t("div",Ea,[t("button",{class:j(["rounded-md px-2 py-1 text-xs font-medium transition-colors sm:px-3 sm:text-sm",a(f)==="requests"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:e[5]||(e[5]=g=>(f.value="requests",ht()))},e[52]||(e[52]=[t("i",{class:"fas fa-exchange-alt mr-1"},null,-1),t("span",{class:"hidden sm:inline"},"请求次数",-1),t("span",{class:"sm:hidden"},"请求",-1)]),2),t("button",{class:j(["rounded-md px-2 py-1 text-xs font-medium transition-colors sm:px-3 sm:text-sm",a(f)==="tokens"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:e[6]||(e[6]=g=>(f.value="tokens",ht()))},e[53]||(e[53]=[t("i",{class:"fas fa-coins mr-1"},null,-1),t("span",{class:"hidden sm:inline"},"Token 数量",-1),t("span",{class:"sm:hidden"},"Token",-1)]),2)])]),t("div",Na,[a(T).totalApiKeys>10?(k(),h("span",Va," 共 "+y(a(T).totalApiKeys)+" 个 API Key,显示使用量前 10 个 ",1)):(k(),h("span",ja," 共 "+y(a(T).totalApiKeys)+" 个 API Key ",1))]),t("div",Ya,[t("canvas",{ref_key:"apiKeysUsageTrendChart",ref:c},null,512)])])])])}}},ts=Mt(Ga,[["__scopeId","data-v-e71abcc3"]]);export{ts as default};
|