mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 09:38:02 +00:00
2 lines
38 KiB
JavaScript
2 lines
38 KiB
JavaScript
import{E as $t}from"./element-plus-CMedNaYf.js";import{aR as Rt,r as $,c as wt,aW as Tt,o as st,q as At,D as Z,V as Pt,x as k,z as t,P as y,u as a,L as I,O as P,Q as Ct,ac as _t,C as j,R as It,K as Bt,al as Ut,y as D}from"./vue-vendor-DfnFpxGJ.js";import{b as J,_ as Mt,a as Kt}from"./index-BdtiivzQ.js";import{s as bt}from"./toast-BvwA7Mwb.js";import{C as vt}from"./chart-Cor9iTVD.js";import"./vendor-BDiMbLwQ.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},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"}}}),W=$([]),o=$([]),X=$([]),L=$({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([J.get("/admin/dashboard"),J.get(`/admin/usage-costs?period=${r.today}`),J.get(`/admin/usage-costs?period=${r.all}`)]);if(i.success){const s=i.data.overview||{},u=i.data.recentActivity||{},m=i.data.systemAverages||{},C=i.data.realtimeMetrics||{},_=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},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:C.rpm||0,realtimeTPM:C.tpm||0,metricsWindow:C.windowMinutes||5,isHistoricalMetrics:C.isHistorical||!1,systemStatus:_.redisConnected?"正常":"异常",uptime:_.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,C]=s.split(" "),[_,x,v]=m.split("-").map(Number),[M,K,O]=C.split(":").map(Number);return new Date(Date.UTC(_,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 J.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 J.get(r);i.success&&(X.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,C]=s.split(" "),[_,x,v]=m.split("-").map(Number),[M,K,O]=C.split(":").map(Number);return new Date(Date.UTC(_,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 J.get(r);d.success&&(L.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"),C=String(s.getDate()).padStart(2,"0");n.value.customRange=[`${u}-${m}-${C} 00:00:00`,`${u}-${m}-${C} 23:59:59`]}else{const s=u=>{const _=new Date(u.getTime()+288e5),x=_.getUTCFullYear(),v=String(_.getUTCMonth()+1).padStart(2,"0"),M=String(_.getUTCDate()).padStart(2,"0"),K=String(_.getUTCHours()).padStart(2,"0"),O=String(_.getUTCMinutes()).padStart(2,"0"),z=String(_.getUTCSeconds()).padStart(2,"0");return`${x}-${v}-${M} ${K}:${O}:${z}`};n.value.customRange=[s(d),s(l)]}}G()}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,C-1,_,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}G()}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}G()}async function G(){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:W,trendData:o,dashboardModelStats:X,apiKeysTrendData:L,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:G,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"},Lt={class:"stat-card"},zt={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"},Wt={key:0,class:"flex items-center gap-2"},Gt=["title"],Qt={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},Zt=["title"],Jt={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},Xt=["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={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},le={key:0,class:"text-red-600"},re={key:1,class:"text-gray-600 dark:text-gray-400"},ie={key:2,class:"text-yellow-600"},de={class:"stat-card"},ce={class:"flex items-center justify-between"},ue={class:"text-2xl font-bold text-gray-900 dark:text-gray-100 sm:text-3xl"},me={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},ye={class:"stat-card"},pe={class:"flex items-center justify-between"},ge={class:"text-2xl font-bold text-green-600 sm:text-3xl"},fe={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},xe={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"},be={class:"stat-card"},ve={class:"flex items-center justify-between"},he={class:"mr-8 flex-1"},ke={class:"mb-2 flex flex-wrap items-baseline gap-2"},De={class:"text-xl font-bold text-blue-600 sm:text-2xl md:text-3xl"},Te={class:"text-sm font-medium text-green-600"},Ce={class:"text-xs text-gray-500 dark:text-gray-400"},_e={class:"flex flex-wrap items-center justify-between gap-x-4"},we={class:"font-medium"},Se={class:"font-medium"},$e={key:0,class:"text-purple-600"},Re={class:"font-medium"},Ae={key:1,class:"text-purple-600"},Pe={class:"font-medium"},Ie={class:"stat-card"},Be={class:"flex items-center justify-between"},Ue={class:"mr-8 flex-1"},Me={class:"mb-2 flex flex-wrap items-baseline gap-2"},Ke={class:"text-xl font-bold text-emerald-600 sm:text-2xl md:text-3xl"},Oe={class:"text-sm font-medium text-green-600"},Fe={class:"text-xs text-gray-500 dark:text-gray-400"},Le={class:"flex flex-wrap items-center justify-between gap-x-4"},ze={class:"font-medium"},He={class:"font-medium"},qe={key:0,class:"text-purple-600"},Ee={class:"font-medium"},Ne={key:1,class:"text-purple-600"},Ve={class:"font-medium"},je={class:"stat-card"},Ye={class:"flex items-center justify-between"},We={class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"},Ge={class:"text-xs text-gray-400"},Qe={class:"text-2xl font-bold text-orange-600 sm:text-3xl"},Ze={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},Je={key:0,class:"text-yellow-600"},Xe={class:"stat-card"},ta={class:"flex items-center justify-between"},ea={class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"},aa={class:"text-xs text-gray-400"},sa={class:"text-2xl font-bold text-rose-600 sm:text-3xl"},oa={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},na={key:0,class:"text-yellow-600"},la={class:"mb-8"},ra={class:"mb-4 flex flex-col gap-4 sm:mb-6"},ia={class:"flex flex-col gap-2 lg:flex-row lg:items-center lg:justify-end"},da={class:"flex flex-shrink-0 gap-1 overflow-x-auto rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},ca=["onClick"],ua={class:"flex gap-1 rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},ma={class:"flex items-center gap-2"},ya={key:0,class:"text-xs text-orange-600"},pa={class:"flex items-center gap-2"},ga={class:"flex items-center rounded-lg bg-gray-100 px-3 py-1 dark:bg-gray-700"},fa={class:"relative inline-flex cursor-pointer items-center"},xa={class:"ml-2.5 flex select-none items-center gap-1 text-sm font-medium text-gray-600 dark:text-gray-300"},ba=["disabled"],va={class:"hidden sm:inline"},ha={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},ka={class:"card p-4 sm:p-6"},Da={class:"relative",style:{height:"250px"}},Ta={class:"card p-4 sm:p-6"},Ca={key:0,class:"py-8 text-center"},_a={key:1,class:"max-h-[250px] overflow-auto sm:max-h-[300px]"},wa={class:"min-w-full"},Sa={class:"divide-y divide-gray-200 dark:divide-gray-600"},$a={class:"px-2 py-2 text-xs text-gray-900 dark:text-gray-100 sm:px-4 sm:text-sm"},Ra=["title"],Aa={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"},Pa={class:"px-2 py-2 text-right text-xs text-gray-600 dark:text-gray-400 sm:px-4 sm:text-sm"},Ia={class:"px-2 py-2 text-right text-xs font-medium text-green-600 sm:px-4 sm:text-sm"},Ba={class:"hidden px-2 py-2 text-right text-xs font-medium sm:table-cell sm:px-4 sm:text-sm"},Ua={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"},Ma={class:"mb-4 sm:mb-6 md:mb-8"},Ka={class:"card p-4 sm:p-6"},Oa={class:"sm:h-[300px]",style:{height:"250px"}},Fa={class:"mb-4 sm:mb-6 md:mb-8"},La={class:"card p-4 sm:p-6"},za={class:"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"},Ha={class:"flex gap-1 rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},qa={class:"mb-4 text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},Ea={key:0},Na={key:1},Va={class:"sm:h-[350px]",style:{height:"300px"}},ja={__name:"DashboardView",setup(ot){const Y=Ot(),nt=Kt(),{isDarkMode:W}=Tt(nt),{dashboardData:o,costsData:X,dashboardModelStats:L,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:G}=Y,Q=$(null),tt=$(null),c=$(null);let r=null,i=null,d=null;const l=$(!1),s=$(30),u=$(null),m=$(0),C=$(null),_=$(!1),x=wt(()=>({text:W.value?"#e5e7eb":"#374151",grid:W.value?"rgba(75, 85, 99, 0.3)":"rgba(0, 0, 0, 0.1)",legend:W.value?"#e5e7eb":"#374151"}));function v(h){return h>=1e6?(h/1e6).toFixed(2)+"M":h>=1e3?(h/1e3).toFixed(2)+"K":h.toString()}function M(h,e){if(!e||e.length===0)return 0;const R=e.reduce((g,H)=>g+H.allTokens,0);return R===0?0:(h/R*100).toFixed(1)}function K(){if(!Q.value)return;r&&r.destroy();const h=L.value||[],e={labels:h.map(R=>R.model),datasets:[{data:h.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,h);return`${g}: ${H} (${et}%)`}}}}}})}function O(){var A;if(!tt.value)return;i&&i.destroy();const h=n.value||[],e=h.map(p=>p.inputTokens||0),R=h.map(p=>p.outputTokens||0),g=h.map(p=>p.cacheCreateTokens||0),H=h.map(p=>p.cacheReadTokens||0),et=h.map(p=>p.requests||0),ut=h.map(p=>p.cost||0),mt=(A=h[0])!=null&&A.date?"date":"hour",U={labels:h.map(p=>{if(p.label)return p.label;if(mt==="hour"){const b=new Date(p.hour),B=String(b.getMonth()+1).padStart(2,"0"),V=String(b.getDate()).padStart(2,"0"),yt=String(b.getHours()).padStart(2,"0");return`${B}/${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||"",B=S.dataset.label||"";return b==="费用 (USD)"||B==="费用 (USD)"?b==="费用 (USD)"?-1:1:b==="请求数"||B==="请求数"?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 z(){var ut,mt;if(!c.value)return;d&&d.destroy();const h=T.value.data||[],e=f,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(B=>!B.apiKeys||!B.apiKeys[w]?0:e==="tokens"?B.apiKeys[w].tokens:B.apiKeys[w].requests||0);return{label:((b=(S=T.value.data.find(B=>B.apiKeys&&B.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=h[0])!=null&&mt.date?"date":"hour",et={labels:h.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],B=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(B===1?V="🥇 ":B===2?V="🥈 ":B===3&&(V="🥉 "),f==="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==="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),await Z(),z()}st(L,()=>{Z(()=>K())}),st(n,()=>{Z(()=>O())}),st(T,()=>{Z(()=>z())});async function ft(){if(!_.value){_.value=!0;try{await Promise.all([rt(),gt()])}finally{_.value=!1}}}function kt(){l.value&&(m.value=s.value,C.value&&clearInterval(C.value),u.value&&clearTimeout(u.value),C.value=setInterval(()=>{m.value--,m.value<=0&&clearInterval(C.value)},1e3),u.value=setTimeout(async()=>{await ft(),l.value&&kt()},s.value*1e3))}function Dt(){C.value&&(clearInterval(C.value),C.value=null),u.value&&(clearTimeout(u.value),u.value=null),m.value=0}return st(l,h=>{h?kt():Dt()}),st(W,()=>{Z(()=>{K(),O(),z()})}),At(async()=>{await ft(),await Z(),K(),O(),z()}),Pt(()=>{Dt(),r&&r.destroy(),i&&i.destroy(),d&&d.destroy()}),(h,e)=>{const R=$t;return D(),k("div",null,[t("div",Ft,[t("div",Lt,[t("div",zt,[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[14]||(e[14]=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?(D(),k("div",Wt,[a(o).accountsByPlatform.claude&&a(o).accountsByPlatform.claude.total>0?(D(),k("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,Gt)):I("",!0),a(o).accountsByPlatform["claude-console"]&&a(o).accountsByPlatform["claude-console"].total>0?(D(),k("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",Jt,y(a(o).accountsByPlatform["claude-console"].total),1)],8,Zt)):I("",!0),a(o).accountsByPlatform.gemini&&a(o).accountsByPlatform.gemini.total>0?(D(),k("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,Xt)):I("",!0),a(o).accountsByPlatform.bedrock&&a(o).accountsByPlatform.bedrock.total>0?(D(),k("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)):I("",!0),a(o).accountsByPlatform.openai&&a(o).accountsByPlatform.openai.total>0?(D(),k("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)):I("",!0)])):I("",!0)]),t("p",ne,[P(" 正常: "+y(a(o).normalAccounts||0)+" ",1),a(o).abnormalAccounts>0?(D(),k("span",le," | 异常: "+y(a(o).abnormalAccounts),1)):I("",!0),a(o).pausedAccounts>0?(D(),k("span",re," | 停止调度: "+y(a(o).pausedAccounts),1)):I("",!0),a(o).rateLimitedAccounts>0?(D(),k("span",ie," | 限流: "+y(a(o).rateLimitedAccounts),1)):I("",!0)])]),e[15]||(e[15]=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",de,[t("div",ce,[t("div",null,[e[16]||(e[16]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 今日请求 ",-1)),t("p",ue,y(a(o).todayRequests),1),t("p",me," 总请求: "+y(v(a(o).totalRequests||0)),1)]),e[17]||(e[17]=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",ye,[t("div",pe,[t("div",null,[e[18]||(e[18]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 系统状态 ",-1)),t("p",ge,y(a(o).systemStatus),1),t("p",fe," 运行时间: "+y(a(lt)),1)]),e[19]||(e[19]=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",xe,[t("div",be,[t("div",ve,[t("div",he,[e[24]||(e[24]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 今日Token ",-1)),t("div",ke,[t("p",De,y(v((a(o).todayInputTokens||0)+(a(o).todayOutputTokens||0)+(a(o).todayCacheCreateTokens||0)+(a(o).todayCacheReadTokens||0))),1),t("span",Te,"/ "+y(a(X).todayCosts.formatted.totalCost),1)]),t("div",Ce,[t("div",_e,[t("span",null,[e[20]||(e[20]=P("输入: ",-1)),t("span",we,y(v(a(o).todayInputTokens||0)),1)]),t("span",null,[e[21]||(e[21]=P("输出: ",-1)),t("span",Se,y(v(a(o).todayOutputTokens||0)),1)]),(a(o).todayCacheCreateTokens||0)>0?(D(),k("span",$e,[e[22]||(e[22]=P("缓存创建: ",-1)),t("span",Re,y(v(a(o).todayCacheCreateTokens||0)),1)])):I("",!0),(a(o).todayCacheReadTokens||0)>0?(D(),k("span",Ae,[e[23]||(e[23]=P("缓存读取: ",-1)),t("span",Pe,y(v(a(o).todayCacheReadTokens||0)),1)])):I("",!0)])])]),e[25]||(e[25]=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",Ie,[t("div",Be,[t("div",Ue,[e[30]||(e[30]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 总Token消耗 ",-1)),t("div",Me,[t("p",Ke,y(v((a(o).totalInputTokens||0)+(a(o).totalOutputTokens||0)+(a(o).totalCacheCreateTokens||0)+(a(o).totalCacheReadTokens||0))),1),t("span",Oe,"/ "+y(a(X).totalCosts.formatted.totalCost),1)]),t("div",Fe,[t("div",Le,[t("span",null,[e[26]||(e[26]=P("输入: ",-1)),t("span",ze,y(v(a(o).totalInputTokens||0)),1)]),t("span",null,[e[27]||(e[27]=P("输出: ",-1)),t("span",He,y(v(a(o).totalOutputTokens||0)),1)]),(a(o).totalCacheCreateTokens||0)>0?(D(),k("span",qe,[e[28]||(e[28]=P("缓存创建: ",-1)),t("span",Ee,y(v(a(o).totalCacheCreateTokens||0)),1)])):I("",!0),(a(o).totalCacheReadTokens||0)>0?(D(),k("span",Ne,[e[29]||(e[29]=P("缓存读取: ",-1)),t("span",Ve,y(v(a(o).totalCacheReadTokens||0)),1)])):I("",!0)])])]),e[31]||(e[31]=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",je,[t("div",Ye,[t("div",null,[t("p",We,[e[32]||(e[32]=P(" 实时RPM ",-1)),t("span",Ge,"("+y(a(o).metricsWindow)+"分钟)",1)]),t("p",Qe,y(a(o).realtimeRPM||0),1),t("p",Ze,[e[34]||(e[34]=P(" 每分钟请求数 ",-1)),a(o).isHistoricalMetrics?(D(),k("span",Je,e[33]||(e[33]=[t("i",{class:"fas fa-exclamation-circle"},null,-1),P(" 历史数据 ",-1)]))):I("",!0)])]),e[35]||(e[35]=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",Xe,[t("div",ta,[t("div",null,[t("p",ea,[e[36]||(e[36]=P(" 实时TPM ",-1)),t("span",aa,"("+y(a(o).metricsWindow)+"分钟)",1)]),t("p",sa,y(v(a(o).realtimeTPM||0)),1),t("p",oa,[e[38]||(e[38]=P(" 每分钟Token数 ",-1)),a(o).isHistoricalMetrics?(D(),k("span",na,e[37]||(e[37]=[t("i",{class:"fas fa-exclamation-circle"},null,-1),P(" 历史数据 ",-1)]))):I("",!0)])]),e[39]||(e[39]=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",la,[t("div",ra,[e[46]||(e[46]=t("h3",{class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"}," 模型使用分布与Token使用趋势 ",-1)),t("div",ia,[t("div",da,[(D(!0),k(Ct,null,_t(a(q).presetOptions,g=>(D(),k("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,ca))),128))]),t("div",ua,[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[40]||(e[40]=[t("i",{class:"fas fa-calendar-day mr-1"},null,-1),P("按天 ",-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[41]||(e[41]=[t("i",{class:"fas fa-clock mr-1"},null,-1),P("按小时 ",-1)]),2)]),t("div",ma,[It(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(G),"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"?(D(),k("span",ya,e[42]||(e[42]=[t("i",{class:"fas fa-info-circle"},null,-1),P(" 最多24小时 ",-1)]))):I("",!0)]),t("div",pa,[t("div",ga,[t("label",fa,[Bt(t("input",{"onUpdate:modelValue":e[3]||(e[3]=g=>l.value=g),class:"peer sr-only",type:"checkbox"},null,512),[[Ut,l.value]]),e[45]||(e[45]=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",xa,[e[43]||(e[43]=t("i",{class:"fas fa-redo-alt text-xs text-gray-500 dark:text-gray-400"},null,-1)),e[44]||(e[44]=t("span",null,"自动刷新",-1)),l.value?(D(),k("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)):I("",!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:_.value,title:"立即刷新数据",onClick:e[4]||(e[4]=g=>ft())},[t("i",{class:j(["fas fa-sync-alt text-xs",{"animate-spin":_.value}])},null,2),t("span",va,y(_.value?"刷新中":"刷新"),1)],8,ba)])])]),t("div",ha,[t("div",ka,[e[47]||(e[47]=t("h4",{class:"mb-4 text-base font-semibold text-gray-800 dark:text-gray-200 sm:text-lg"}," Token使用分布 ",-1)),t("div",Da,[t("canvas",{ref_key:"modelUsageChart",ref:Q},null,512)])]),t("div",Ta,[e[50]||(e[50]=t("h4",{class:"mb-4 text-base font-semibold text-gray-800 dark:text-gray-200 sm:text-lg"}," 详细统计数据 ",-1)),a(L).length===0?(D(),k("div",Ca,e[48]||(e[48]=[t("p",{class:"text-sm text-gray-500 sm:text-base"},"暂无模型使用数据",-1)]))):(D(),k("div",_a,[t("table",wa,[e[49]||(e[49]=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",Sa,[(D(!0),k(Ct,null,_t(a(L),g=>(D(),k("tr",{key:g.model,class:"hover:bg-gray-50 dark:hover:bg-gray-700"},[t("td",$a,[t("span",{class:"block max-w-[100px] truncate sm:max-w-none",title:g.model},y(g.model),9,Ra)]),t("td",Aa,y(v(g.requests)),1),t("td",Pa,y(v(g.allTokens)),1),t("td",Ia,y(g.formatted?g.formatted.total:"$0.000000"),1),t("td",Ba,[t("span",Ua,y(M(g.allTokens,a(L)))+"% ",1)])]))),128))])])]))])])]),t("div",Ma,[t("div",Ka,[t("div",Oa,[t("canvas",{ref_key:"usageTrendChart",ref:tt},null,512)])])]),t("div",Fa,[t("div",La,[t("div",za,[e[53]||(e[53]=t("h3",{class:"text-base font-semibold text-gray-900 dark:text-gray-100 sm:text-lg"}," API Keys 使用趋势 ",-1)),t("div",Ha,[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[51]||(e[51]=[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[52]||(e[52]=[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",qa,[a(T).totalApiKeys>10?(D(),k("span",Ea," 共 "+y(a(T).totalApiKeys)+" 个 API Key,显示使用量前 10 个 ",1)):(D(),k("span",Na," 共 "+y(a(T).totalApiKeys)+" 个 API Key ",1))]),t("div",Va,[t("canvas",{ref_key:"apiKeysUsageTrendChart",ref:c},null,512)])])])])}}},Xa=Mt(ja,[["__scopeId","data-v-6534b251"]]);export{Xa as default};
|