Files
claude-relay-service/assets/DashboardView-B2ksavjK.js
2025-09-01 03:45:29 +00:00

2 lines
39 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{E as $t}from"./element-plus-Bq6mBxnk.js";import{aR as Rt,r as $,c as wt,aV as Tt,o as st,q as At,D as Z,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-Ig-GgGwA.js";import{b as J,_ as Mt,a as Kt}from"./index-BOKTkHbB.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},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=$([]),X=$([]),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([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||{},_=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 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,_]=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 J.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:X,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"},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=["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"},Ze={class:"text-xs text-gray-400"},Je={class:"text-2xl font-bold text-orange-600 sm:text-3xl"},Xe={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:X,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 Z(),L()}st(z,()=>{Z(()=>K())}),st(n,()=>{Z(()=>O())}),st(T,()=>{Z(()=>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,()=>{Z(()=>{K(),O(),L()})}),At(async()=>{await ft(),await Z(),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",Jt,y(a(o).accountsByPlatform["claude-console"].total),1)],8,Zt)):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,Xt)):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(X).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(X).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",Ze,"("+y(a(o).metricsWindow)+"分钟)",1)]),t("p",Je,y(a(o).realtimeRPM||0),1),t("p",Xe,[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)])])])])}}},es=Mt(Ga,[["__scopeId","data-v-e71abcc3"]]);export{es as default};