mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-22 16:43:35 +00:00
7 lines
71 KiB
JavaScript
7 lines
71 KiB
JavaScript
import{aP as bt,r as N,c as U,aX as at,x as o,y as r,z as t,O as w,L,P as i,u as e,C as O,K as ut,aq as ct,aa as mt,f as gt,Y as vt,Q as Z,ac as et,B as lt,R as Y,o as xt,V as yt,I as ot,a5 as kt,aZ as ht,a_ as _t,q as wt,aW as $t,J as ft,av as St}from"./vue-vendor-BVUySZOn.js";import{_ as st,A as Ct,u as pt,a as Tt}from"./index-BAse2XU9.js";import{L as Kt}from"./LogoTitle-BKx-1OIz.js";import{T as At}from"./ThemeToggle-Btdau4yo.js";import{b as Pt}from"./vendor-Dr8jvgFu.js";import{_ as Lt}from"./WindowCountdown-Cb_iHkvc.js";import Mt from"./TutorialView-C0wjIk1C.js";import{C as It,a as Dt,b as Ot,P as jt,c as Rt,A as qt,p as Ut,d as Nt,e as Et,i as Ft}from"./chart-ChB167Jv.js";import"./element-plus-CKhypU-Q.js";class Wt{constructor(){this.baseURL=window.location.origin,this.isDev=!1}async request(f,s={}){try{this.isDev&&f.startsWith("/admin")&&(f="/webapi"+f);const k=await fetch(`${this.baseURL}${f}`,{headers:{"Content-Type":"application/json",...s.headers},...s}),u=await k.json();if(!k.ok)throw new Error(u.message||`请求失败: ${k.status}`);return u}catch(k){throw console.error("API Stats request error:",k),k}}async getKeyId(f){return this.request("/apiStats/api/get-key-id",{method:"POST",body:JSON.stringify({apiKey:f})})}async getUserStats(f){return this.request("/apiStats/api/user-stats",{method:"POST",body:JSON.stringify({apiId:f})})}async getUserModelStats(f,s="daily"){return this.request("/apiStats/api/user-model-stats",{method:"POST",body:JSON.stringify({apiId:f,period:s})})}async getOemSettings(){try{return await this.request("/admin/oem-settings")}catch(f){return console.error("Failed to load OEM settings:",f),{success:!0,data:{siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}}}async getBatchStats(f){return this.request("/apiStats/api/batch-stats",{method:"POST",body:JSON.stringify({apiIds:f})})}async getBatchModelStats(f,s="daily"){return this.request("/apiStats/api/batch-model-stats",{method:"POST",body:JSON.stringify({apiIds:f,period:s})})}}const tt=new Wt,rt=bt("apistats",()=>{const W=N(""),f=N(null),s=N(!1),k=N(!1),u=N(!0),x=N(""),y=N("daily"),b=N(null),T=N([]),M=N(null),v=N(null),A=N({siteName:"",siteIcon:"",siteIconData:""}),B=N(!1),C=N([]),K=N([]),c=N(null),n=N([]),R=N([]),a=U(()=>{const g={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};return B.value&&c.value?y.value==="daily"?c.value.dailyUsage||g:c.value.monthlyUsage||g:y.value==="daily"?M.value||g:v.value||g}),m=U(()=>{if(!b.value||!a.value)return{tokenUsage:0,costUsage:0,requestUsage:0};const g=a.value,$=b.value.limits;return{tokenUsage:$.tokenLimit>0?Math.min(g.allTokens/$.tokenLimit*100,100):0,costUsage:$.dailyCostLimit>0?Math.min(g.cost/$.dailyCostLimit*100,100):0,requestUsage:$.rateLimitRequests>0?Math.min(g.requests/$.rateLimitRequests*100,100):0}});async function D(){if(B.value)return Q();const g=W.value.trim();if(!g){x.value="请输入 API Key";return}if(g.length<10||g.length>512){x.value="API Key 格式无效:长度应在 10-512 个字符之间";return}s.value=!0,x.value="",b.value=null,T.value=[],f.value=null;try{const $=await tt.getKeyId(g);if($.success){f.value=$.data.id;const q=await tt.getUserStats(f.value);if(q.success)b.value=q.data,await S(),x.value="",h();else throw new Error(q.message||"查询失败")}else throw new Error($.message||"获取 API Key ID 失败")}catch($){console.error("Query stats error:",$),x.value=$.message||"查询统计数据失败,请检查您的 API Key 是否正确",b.value=null,T.value=[],f.value=null}finally{s.value=!1}}async function S(){f.value&&(await Promise.all([j("daily"),j("monthly")]),await P(y.value))}async function j(g){try{const $=await tt.getUserModelStats(f.value,g);if($.success){const q=$.data||[],J={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};q.forEach(E=>{var G;J.requests+=E.requests||0,J.inputTokens+=E.inputTokens||0,J.outputTokens+=E.outputTokens||0,J.cacheCreateTokens+=E.cacheCreateTokens||0,J.cacheReadTokens+=E.cacheReadTokens||0,J.allTokens+=E.allTokens||0,J.cost+=((G=E.costs)==null?void 0:G.total)||0}),J.formattedCost=F(J.cost),g==="daily"?M.value=J:v.value=J}else console.warn(`Failed to load ${g} stats:`,$.message)}catch($){console.error(`Load ${g} stats error:`,$)}}async function P(g="daily"){if(f.value){k.value=!0;try{const $=await tt.getUserModelStats(f.value,g);if($.success)T.value=$.data||[];else throw new Error($.message||"加载模型统计失败")}catch($){console.error("Load model stats error:",$),T.value=[]}finally{k.value=!1}}}async function _(g){if(!(y.value===g||k.value)){if(y.value=g,B.value&&K.value.length>0){await X(g);return}(g==="daily"&&!M.value||g==="monthly"&&!v.value)&&await j(g),await P(g)}}async function z(){var g,$;if(f.value){s.value=!0,x.value="",b.value=null,T.value=[];try{const q=await tt.getUserStats(f.value);if(q.success)b.value=q.data,console.log("API Stats - Full response:",q.data),console.log("API Stats - limits data:",q.data.limits),console.log("API Stats - weeklyOpusCostLimit:",(g=q.data.limits)==null?void 0:g.weeklyOpusCostLimit),console.log("API Stats - weeklyOpusCost:",($=q.data.limits)==null?void 0:$.weeklyOpusCost),await S(),x.value="";else throw new Error(q.message||"查询失败")}catch(q){console.error("Load stats with apiId error:",q),x.value=q.message||"查询统计数据失败",b.value=null,T.value=[]}finally{s.value=!1}}}async function H(){u.value=!0;try{const g=await tt.getOemSettings();g&&g.success&&g.data&&(A.value={...A.value,...g.data})}catch(g){console.error("Error loading OEM settings:",g),A.value={siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}finally{u.value=!1}}function F(g){return typeof g!="number"||g===0?"$0.000000":g>=1?"$"+g.toFixed(2):g>=.01?"$"+g.toFixed(4):"$"+g.toFixed(6)}function h(){if(f.value){const g=new URL(window.location);g.searchParams.set("apiId",f.value),window.history.pushState({},"",g)}}async function Q(){const g=d();if(g.length===0){x.value="请输入至少一个有效的 API Key";return}s.value=!0,x.value="",c.value=null,n.value=[],R.value=[],T.value=[],C.value=g,K.value=[];try{const $=await Promise.allSettled(g.map(G=>tt.getKeyId(G))),q=[],J=[];if($.forEach((G,it)=>{G.status==="fulfilled"&&G.value.success?(q.push(G.value.data.id),J.push(g[it])):R.value.push(g[it])}),q.length===0)throw new Error("所有 API Key 都无效");K.value=q,C.value=J;const E=await tt.getBatchStats(q);if(E.success)c.value=E.data.aggregated,n.value=E.data.individual,b.value=E.data.aggregated,M.value=E.data.aggregated.dailyUsage||null,v.value=E.data.aggregated.monthlyUsage||null,await X(y.value),l();else throw new Error(E.message||"批量查询失败")}catch($){console.error("Batch query error:",$),x.value=$.message||"批量查询统计数据失败",c.value=null,n.value=[]}finally{s.value=!1}}async function X(g="daily"){if(K.value.length!==0){k.value=!0;try{const $=await tt.getBatchModelStats(K.value,g);if($.success)T.value=$.data||[];else throw new Error($.message||"加载批量模型统计失败")}catch($){console.error("Load batch model stats error:",$),T.value=[]}finally{k.value=!1}}}function d(){if(!W.value)return[];const g=W.value.split(/[,\n]+/).map(q=>q.trim()).filter(q=>q.length>=10&&q.length<=512);return[...new Set(g)].slice(0,30)}function l(){if(K.value.length>0){const g=new URL(window.location);g.searchParams.set("apiIds",K.value.join(",")),g.searchParams.set("batch","true"),window.history.pushState({},"",g)}}function p(){W.value=""}function I(){b.value=null,T.value=[],M.value=null,v.value=null,x.value="",y.value="daily",f.value=null,C.value=[],K.value=[],c.value=null,n.value=[],R.value=[]}function V(){W.value="",B.value=!1,I()}return{apiKey:W,apiId:f,loading:s,modelStatsLoading:k,oemLoading:u,error:x,statsPeriod:y,statsData:b,modelStats:T,dailyStats:M,monthlyStats:v,oemSettings:A,multiKeyMode:B,apiKeys:C,apiIds:K,aggregatedStats:c,individualStats:n,invalidKeys:R,currentPeriodData:a,usagePercentages:m,queryStats:D,queryBatchStats:Q,loadAllPeriodStats:S,loadPeriodStats:j,loadModelStats:P,loadBatchModelStats:X,switchPeriod:_,loadStatsWithApiId:z,loadOemSettings:H,clearData:I,clearInput:p,reset:V}}),Bt={class:"api-input-wide-card mb-8 rounded-3xl p-6 shadow-xl"},Vt={class:"mx-auto max-w-4xl"},zt={class:"control-bar mb-4 flex flex-wrap items-center justify-between gap-3"},Jt={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Ht={class:"button-group flex items-center gap-2"},Yt={class:"mode-switch-group flex items-center rounded-lg bg-gray-100 p-1 dark:bg-gray-800"},Gt={key:0,class:"ml-1 rounded-full bg-white/20 px-1.5 py-0.5 text-xs font-semibold"},Zt={class:"api-input-grid grid grid-cols-1 gap-4 lg:grid-cols-4"},Qt={class:"lg:col-span-3"},Xt=["disabled"],te={key:1,class:"relative"},ee=["disabled"],se={class:"lg:col-span-1"},ae=["disabled"],re={key:0,class:"fas fa-spinner loading-spinner"},le={key:1,class:"fas fa-search"},ie={class:"security-notice mt-4"},oe={key:0,class:"mt-2 rounded-lg bg-blue-50 p-3 text-sm text-blue-700 dark:bg-blue-900/20 dark:text-blue-400"},ne={__name:"ApiKeyInput",setup(W){const f=rt(),{apiKey:s,loading:k,multiKeyMode:u}=at(f),{queryStats:x,clearInput:y}=f,b=U(()=>{if(!u.value||!s.value)return[];const M=s.value.split(/[,\n]+/).map(A=>A.trim()).filter(A=>A.length>0);return[...new Set(M)].slice(0,30)}),T=U(()=>u.value?b.value.length>0:s.value&&s.value.trim().length>0);return(M,v)=>(r(),o("div",Bt,[v[15]||(v[15]=t("div",{class:"wide-card-title mb-6"},[t("h2",{class:"mb-2 text-2xl font-bold text-gray-900 dark:text-gray-200"},[t("i",{class:"fas fa-chart-line mr-3"}),w(" 使用统计查询 ")]),t("p",{class:"text-base text-gray-600 dark:text-gray-400"},"查询您的 API Key 使用情况和统计数据")],-1)),t("div",Vt,[t("div",zt,[t("label",Jt,[v[8]||(v[8]=t("i",{class:"fas fa-key mr-2"},null,-1)),w(" "+i(e(u)?"输入您的 API Keys(每行一个或用逗号分隔)":"输入您的 API Key"),1)]),t("div",Ht,[t("div",Yt,[t("button",{class:O(["mode-switch-btn",{active:!e(u)}]),title:"单一模式",onClick:v[0]||(v[0]=A=>u.value=!1)},v[9]||(v[9]=[t("i",{class:"fas fa-key"},null,-1),t("span",{class:"ml-2 hidden sm:inline"},"单一",-1)]),2),t("button",{class:O(["mode-switch-btn",{active:e(u)}]),title:"聚合模式",onClick:v[1]||(v[1]=A=>u.value=!0)},[v[10]||(v[10]=t("i",{class:"fas fa-layer-group"},null,-1)),v[11]||(v[11]=t("span",{class:"ml-2 hidden sm:inline"},"聚合",-1)),e(u)&&b.value.length>0?(r(),o("span",Gt,i(b.value.length),1)):L("",!0)],2)])])]),t("div",Zt,[t("div",Qt,[e(u)?(r(),o("div",te,[ut(t("textarea",{"onUpdate:modelValue":v[4]||(v[4]=A=>gt(s)?s.value=A:null),class:"wide-card-input w-full resize-y",disabled:e(k),placeholder:`请输入您的 API Keys,支持以下格式:
|
||
cr_xxx
|
||
cr_yyy
|
||
或
|
||
cr_xxx, cr_yyy`,rows:"4",onKeyup:v[5]||(v[5]=mt(vt((...A)=>e(x)&&e(x)(...A),["ctrl"]),["enter"]))},null,40,ee),[[ct,e(s)]]),e(s)&&!e(k)?(r(),o("button",{key:0,class:"absolute right-2 top-2 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300",title:"清空输入",onClick:v[6]||(v[6]=(...A)=>e(y)&&e(y)(...A))},v[12]||(v[12]=[t("i",{class:"fas fa-times-circle"},null,-1)]))):L("",!0)])):ut((r(),o("input",{key:0,"onUpdate:modelValue":v[2]||(v[2]=A=>gt(s)?s.value=A:null),class:"wide-card-input w-full",disabled:e(k),placeholder:"请输入您的 API Key (cr_...)",type:"password",onKeyup:v[3]||(v[3]=mt((...A)=>e(x)&&e(x)(...A),["enter"]))},null,40,Xt)),[[ct,e(s)]])]),t("div",se,[t("button",{class:"btn btn-primary btn-query flex h-full w-full items-center justify-center gap-2",disabled:e(k)||!T.value,onClick:v[7]||(v[7]=(...A)=>e(x)&&e(x)(...A))},[e(k)?(r(),o("i",re)):(r(),o("i",le)),w(" "+i(e(k)?"查询中...":"查询统计"),1)],8,ae)])]),t("div",ie,[v[13]||(v[13]=t("i",{class:"fas fa-shield-alt mr-2"},null,-1)),w(" "+i(e(u)?"您的 API Keys 仅用于查询统计数据,不会被存储。聚合模式下部分个体化信息将不显示。":"您的 API Key 仅用于查询自己的统计数据,不会被存储或用于其他用途"),1)]),e(u)?(r(),o("div",oe,v[14]||(v[14]=[t("i",{class:"fas fa-lightbulb mr-2"},null,-1),t("span",null,"提示:最多支持同时查询 30 个 API Keys。使用 Ctrl+Enter 快速查询。",-1)]))):L("",!0)])]))}},de=st(ne,[["__scopeId","data-v-11e74200"]]),ue={class:"space-y-6 md:space-y-8"},ce={class:"grid grid-cols-1 items-stretch gap-4 md:gap-6 xl:grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)]"},me={class:"card-section"},ge={class:"section-header"},fe={class:"header-title"},xe={key:0,class:"info-grid"},ye={class:"info-item"},pe={class:"info-value"},be={class:"info-item"},ve={class:"info-value text-green-600 dark:text-emerald-400"},ke={key:0,class:"info-item"},he={class:"info-value text-red-500 dark:text-red-400"},_e={class:"info-item"},we={class:"info-value"},$e={class:"info-item"},Se={class:"info-value"},Ce={class:"info-item"},Te={class:"info-value text-indigo-600 dark:text-indigo-300"},Ke={key:1,class:"info-item xl:col-span-2"},Ae={class:"space-y-2"},Pe={class:"truncate"},Le={class:"font-semibold"},Me={key:1,class:"info-grid"},Ie={class:"info-item"},De={class:"info-value break-all"},Oe={class:"info-item"},je={class:"info-item"},Re={class:"info-value"},qe={class:"info-item"},Ue={class:"info-value break-all"},Ne={class:"info-item xl:col-span-2"},Ee={class:"info-value"},Fe={class:"ml-2 text-xs text-gray-500 dark:text-gray-400"},We={key:0,class:"text-red-500 dark:text-red-400"},Be={key:1,class:"text-orange-500 dark:text-orange-400"},Ve={key:2},ze={key:2,class:"text-gray-400 dark:text-gray-500"},Je={class:"card-section"},He={class:"section-header"},Ye={class:"header-tag"},Ge={class:"metric-grid"},Ze={class:"metric-card"},Qe={class:"metric-value text-green-600 dark:text-emerald-300"},Xe={class:"metric-label"},ts={class:"metric-card"},es={class:"metric-value text-blue-600 dark:text-sky-300"},ss={class:"metric-label"},as={class:"metric-card"},rs={class:"metric-value text-purple-600 dark:text-violet-300"},ls={class:"metric-label"},is={class:"metric-card"},os={class:"metric-value text-amber-500 dark:text-amber-300"},ns={class:"metric-label"},ds={key:0,class:"card-section"},us={class:"flex items-center justify-between gap-3"},cs={class:"flex items-center gap-3"},ms={class:"account-name"},gs={class:"account-sub"},fs={key:0,class:"mt-3 space-y-2"},xs={class:"progress-row"},ys={class:"progress-track"},ps={class:"progress-value"},bs={class:"flex flex-wrap items-center gap-2 text-xs text-gray-600 dark:text-gray-300"},vs={key:0,class:"font-medium text-indigo-600 dark:text-indigo-400"},ks={key:1,class:"mt-3"},hs={key:0,class:"space-y-2"},_s={class:"quota-header"},ws={class:"quota-percent"},$s={class:"progress-track"},Ss={class:"quota-foot"},Cs={key:1,class:"rounded-xl bg-slate-100 px-3 py-2 text-xs text-slate-500 dark:bg-slate-800 dark:text-slate-300"},Ts={__name:"StatsOverview",setup(W){const f=rt(),{statsData:s,statsPeriod:k,currentPeriodData:u,multiKeyMode:x,aggregatedStats:y,individualStats:b,invalidKeys:T}=at(f),M=U(()=>!b.value||b.value.length===0?[]:[...b.value].sort((d,l)=>{var p,I;return(((p=l.usage)==null?void 0:p.allTokens)||0)-(((I=d.usage)==null?void 0:I.allTokens)||0)}).slice(0,3)),v=d=>{var p;return!y.value||!y.value.usage.allTokens?0:((((p=d.usage)==null?void 0:p.allTokens)||0)/y.value.usage.allTokens*100).toFixed(1)},A=d=>{if(!d)return"无";try{return Pt(d).format("YYYY年MM月DD日 HH:mm")}catch{return"格式错误"}},B=d=>d?new Date(d).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",C=d=>d?new Date(d)<new Date:!1,K=d=>{if(!d)return!1;const I=(new Date(d)-new Date)/(1e3*60*60*24);return I>0&&I<=7},c=d=>(typeof d!="number"&&(d=parseInt(d)||0),d===0?"0":d>=1e6?(d/1e6).toFixed(1)+"M":d>=1e3?(d/1e3).toFixed(1)+"K":d.toLocaleString()),n=d=>({claude:"Claude",gemini:"Gemini",all:"全部模型"})[d]||d||"未知",R=U(()=>{var p,I;const d=(I=(p=s.value)==null?void 0:p.accounts)==null?void 0:I.details;if(!d)return[];const l=[];return d.claude&&d.claude.accountType==="dedicated"&&l.push({key:"claude",...d.claude}),d.openai&&d.openai.accountType==="dedicated"&&l.push({key:"openai",...d.openai}),l}),a=U(()=>{const d=R.value.length;return d<=1?"md:grid-cols-1 lg:grid-cols-1":d===2?"md:grid-cols-2":"md:grid-cols-2 xl:grid-cols-3"}),m=d=>d?d.platform==="openai"?"OpenAI 专属账号":"Claude 专属账号":"专属账号",D=d=>{if(!d||d<=0)return"";const l=Math.floor(d),p=Math.floor(l/1440),I=Math.floor(l%1440/60),V=l%60;return p>0?I>0?`${p}天${I}小时`:`${p}天`:I>0?V>0?`${I}小时${V}分钟`:`${I}小时`:`${V}分钟`},S=d=>{if(!d)return{text:"状态未知",class:"text-gray-400"};if(d.isRateLimited){const l=D(d.minutesRemaining);return{text:`限流中${l?` · 剩余约 ${l}`:""}`,class:"text-red-500 dark:text-red-400"}}return{text:"未限流",class:"text-green-600 dark:text-emerald-400"}},j=(d,l)=>{if(!d||!l)return"暂无时间窗口信息";const p=new Date(d),I=new Date(l),V=g=>`${`${g.getHours()}`.padStart(2,"0")}:${`${g.getMinutes()}`.padStart(2,"0")}`;return`${V(p)} - ${V(I)}`},P=d=>{if(!d||d<=0)return"";const l=Math.floor(d/60),p=d%60;return l>0?`${l}小时${p}分钟`:`${p}分钟`},_=(d,l)=>{var I;if(!d)return"bg-gradient-to-r from-blue-500 to-indigo-500";if((I=l==null?void 0:l.rateLimitStatus)!=null&&I.isRateLimited)return"bg-gradient-to-r from-red-500 to-red-600";const p=String(d).toLowerCase();return p==="rejected"?"bg-gradient-to-r from-red-500 to-red-600":p==="allowed_warning"?"bg-gradient-to-r from-yellow-500 to-orange-500":"bg-gradient-to-r from-blue-500 to-indigo-500"},z=d=>{if(!d)return null;const l=typeof d.usedPercent=="number"&&!Number.isNaN(d.usedPercent)?d.usedPercent:null,p=typeof d.resetAfterSeconds=="number"&&!Number.isNaN(d.resetAfterSeconds)?d.resetAfterSeconds:null,I=typeof d.remainingSeconds=="number"?d.remainingSeconds:null,V=d.resetAt?Date.parse(d.resetAt):null;return p!==null&&(I!==null&&I<=0||V!==null&&!Number.isNaN(V)&&Date.now()>=V)?0:l===null?null:Math.max(0,Math.min(100,l))},H=d=>{const l=z(d);return l===null?"bg-gradient-to-r from-gray-300 to-gray-400":l>=90?"bg-gradient-to-r from-red-500 to-red-600":l>=75?"bg-gradient-to-r from-yellow-500 to-orange-500":"bg-gradient-to-r from-emerald-500 to-teal-500"},F=d=>{const l=z(d);return l===null?"0%":`${l}%`},h=d=>{const l=z(d);return l===null?"--":`${l.toFixed(1)}%`},Q=d=>{if(!d)return"--";let l=d.remainingSeconds;if(l==null&&(l=d.resetAfterSeconds),l==null||Number.isNaN(Number(l)))return"--";l=Math.max(0,Math.floor(Number(l)));const p=Math.floor(l/86400),I=Math.floor(l%86400/3600),V=Math.floor(l%3600/60),g=l%60;return p>0?I>0?`${p}天${I}小时`:`${p}天`:I>0?V>0?`${I}小时${V}分钟`:`${I}小时`:V>0?`${V}分钟`:`${g}秒`},X=d=>d==="secondary"?"周限":"5h";return(d,l)=>(r(),o("div",ue,[t("div",ce,[t("div",me,[t("header",ge,[t("i",{class:O(["header-icon",e(x)?"fas fa-layer-group text-purple-500":"fas fa-info-circle text-blue-500"])},null,2),t("h3",fe,i(e(x)?"批量查询概要":"API Key 信息"),1)]),e(x)&&e(y)?(r(),o("div",xe,[t("div",ye,[l[0]||(l[0]=t("p",{class:"info-label"},"查询 Keys 数",-1)),t("p",pe,i(e(y).totalKeys)+" 个",1)]),t("div",be,[l[2]||(l[2]=t("p",{class:"info-label"},"有效 Keys 数",-1)),t("p",ve,[l[1]||(l[1]=t("i",{class:"fas fa-check-circle mr-1"},null,-1)),w(i(e(y).activeKeys)+" 个 ",1)])]),e(T).length>0?(r(),o("div",ke,[l[4]||(l[4]=t("p",{class:"info-label"},"无效 Keys 数",-1)),t("p",he,[l[3]||(l[3]=t("i",{class:"fas fa-times-circle mr-1"},null,-1)),w(i(e(T).length)+" 个 ",1)])])):L("",!0),t("div",_e,[l[5]||(l[5]=t("p",{class:"info-label"},"总请求数",-1)),t("p",we,i(c(e(y).usage.requests)),1)]),t("div",$e,[l[6]||(l[6]=t("p",{class:"info-label"},"总 Token 数",-1)),t("p",Se,i(c(e(y).usage.allTokens)),1)]),t("div",Ce,[l[7]||(l[7]=t("p",{class:"info-label"},"总费用",-1)),t("p",Te,i(e(y).usage.formattedCost),1)]),e(b).length>1?(r(),o("div",Ke,[l[8]||(l[8]=t("p",{class:"info-label"},"Top 3 贡献占比",-1)),t("div",Ae,[(r(!0),o(Z,null,et(M.value,p=>(r(),o("div",{key:p.apiId,class:"contributor-item"},[t("span",Pe,i(p.name),1),t("span",Le,i(v(p))+"%",1)]))),128))])])):L("",!0)])):(r(),o("div",Me,[t("div",Ie,[l[9]||(l[9]=t("p",{class:"info-label"},"名称",-1)),t("p",De,i(e(s).name),1)]),t("div",Oe,[l[10]||(l[10]=t("p",{class:"info-label"},"状态",-1)),t("p",{class:O(["info-value font-semibold",e(s).isActive?"text-green-600 dark:text-emerald-400":"text-red-500 dark:text-red-400"])},[t("i",{class:O(["mr-1",e(s).isActive?"fas fa-check-circle":"fas fa-times-circle"])},null,2),w(" "+i(e(s).isActive?"活跃":"已停用"),1)],2)]),t("div",je,[l[11]||(l[11]=t("p",{class:"info-label"},"权限",-1)),t("p",Re,i(n(e(s).permissions)),1)]),t("div",qe,[l[12]||(l[12]=t("p",{class:"info-label"},"创建时间",-1)),t("p",Ue,i(A(e(s).createdAt)),1)]),t("div",Ne,[l[17]||(l[17]=t("p",{class:"info-label"},"过期时间",-1)),t("div",Ee,[e(s).expirationMode==="activation"&&!e(s).isActivated?(r(),o(Z,{key:0},[l[13]||(l[13]=t("span",{class:"text-amber-600 dark:text-amber-400"},[t("i",{class:"fas fa-pause-circle mr-1"}),w("未激活 ")],-1)),t("span",Fe," 首次使用后 "+i(e(s).activationDays||(e(s).activationUnit==="hours"?24:30))+" "+i(e(s).activationUnit==="hours"?"小时":"天")+"过期 ",1)],64)):e(s).expiresAt?(r(),o(Z,{key:1},[C(e(s).expiresAt)?(r(),o("span",We,l[14]||(l[14]=[t("i",{class:"fas fa-exclamation-circle mr-1"},null,-1),w("已过期 ",-1)]))):K(e(s).expiresAt)?(r(),o("span",Be,[l[15]||(l[15]=t("i",{class:"fas fa-clock mr-1"},null,-1)),w(i(B(e(s).expiresAt)),1)])):(r(),o("span",Ve,i(B(e(s).expiresAt)),1))],64)):(r(),o("span",ze,l[16]||(l[16]=[t("i",{class:"fas fa-infinity mr-1"},null,-1),w("永不过期 ",-1)])))])])]))]),t("div",Je,[t("header",He,[l[18]||(l[18]=t("i",{class:"header-icon fas fa-chart-bar text-green-500"},null,-1)),l[19]||(l[19]=t("h3",{class:"header-title"},"使用统计概览",-1)),t("span",Ye,i(e(k)==="daily"?"今日":"本月"),1)]),t("div",Ge,[t("div",Ze,[t("p",Qe,i(c(e(u).requests)),1),t("p",Xe,i(e(k)==="daily"?"今日":"本月")+"请求数",1)]),t("div",ts,[t("p",es,i(c(e(u).allTokens)),1),t("p",ss,i(e(k)==="daily"?"今日":"本月")+"Token 数",1)]),t("div",as,[t("p",rs,i(e(u).formattedCost||"$0.000000"),1),t("p",ls,i(e(k)==="daily"?"今日":"本月")+"费用",1)]),t("div",is,[t("p",os,i(c(e(u).inputTokens)),1),t("p",ns,i(e(k)==="daily"?"今日":"本月")+"输入 Token",1)])])])]),!e(x)&&R.value.length>0?(r(),o("div",ds,[l[21]||(l[21]=t("header",{class:"section-header"},[t("i",{class:"header-icon fas fa-plug text-indigo-500"}),t("h3",{class:"header-title"},"专属账号运行状态"),t("span",{class:"header-tag"},"实时更新")],-1)),t("div",{class:O(["grid grid-cols-1 gap-4",a.value])},[(r(!0),o(Z,null,et(R.value,p=>{var I,V,g,$,q,J;return r(),o("div",{key:p.id||p.key,class:"account-card"},[t("div",us,[t("div",cs,[t("span",{class:O(["account-icon",p.platform==="claude"?"icon-claude":"icon-openai"])},[t("i",{class:O(p.platform==="claude"?"fas fa-meteor":"fas fa-robot")},null,2)],2),t("div",null,[t("p",ms,i(m(p)),1),t("p",gs,i(p.platform==="claude"?"会话窗口":"额度窗口"),1)])]),S(p.rateLimitStatus)?(r(),o("div",{key:0,class:O(["rate-badge",S(p.rateLimitStatus).class])},[l[20]||(l[20]=t("i",{class:"fas fa-tachometer-alt mr-1"},null,-1)),w(" "+i(S(p.rateLimitStatus).text),1)],2)):L("",!0)]),p.platform==="claude"?(r(),o("div",fs,[t("div",xs,[t("div",ys,[t("div",{class:O(["progress-bar",_((I=p.sessionWindow)==null?void 0:I.sessionWindowStatus,p)]),style:lt({width:`${Math.min(100,Math.max(0,((V=p.sessionWindow)==null?void 0:V.progress)||0))}%`})},null,6)]),t("span",ps,i(Math.min(100,Math.max(0,Math.round(((g=p.sessionWindow)==null?void 0:g.progress)||0))))+"% ",1)]),t("div",bs,[t("span",null,i(j(($=p.sessionWindow)==null?void 0:$.windowStart,(q=p.sessionWindow)==null?void 0:q.windowEnd)),1),((J=p.sessionWindow)==null?void 0:J.remainingTime)>0?(r(),o("span",vs," 剩余 "+i(P(p.sessionWindow.remainingTime)),1)):L("",!0)])])):p.platform==="openai"?(r(),o("div",ks,[p.codexUsage?(r(),o("div",hs,[(r(),o(Z,null,et(["primary","secondary"],E=>{var G,it,nt,dt;return t("div",{key:`${p.key}-${E}`,class:"quota-row"},[t("div",_s,[t("span",{class:O(["quota-tag",E==="primary"?"tag-indigo":"tag-blue"])},i(X(E)),3),t("span",ws,i(h((G=p.codexUsage)==null?void 0:G[E])),1)]),t("div",$s,[t("div",{class:O(["progress-bar",H((it=p.codexUsage)==null?void 0:it[E])]),style:lt({width:F((nt=p.codexUsage)==null?void 0:nt[E])})},null,6)]),t("div",Ss," 重置剩余 "+i(Q((dt=p.codexUsage)==null?void 0:dt[E])),1)])}),64))])):(r(),o("p",Cs," 暂无额度使用数据 "))])):L("",!0)])}),128))],2)])):L("",!0)]))}},Ks=st(Ts,[["__scopeId","data-v-b72df2cd"]]),As={class:"card p-4 md:p-6"},Ps={class:"mb-3 flex flex-col text-lg font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center md:mb-4 md:text-xl"},Ls={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Ms={class:"space-y-2 md:space-y-3"},Is={class:"flex items-center justify-between"},Ds={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},Os={class:"flex items-center justify-between"},js={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},Rs={class:"flex items-center justify-between"},qs={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},Us={class:"flex items-center justify-between"},Ns={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},Es={class:"mt-3 border-t border-gray-200 pt-3 dark:border-gray-700 md:mt-4 md:pt-4"},Fs={class:"flex items-center justify-between font-bold text-gray-900 dark:text-gray-100"},Ws={class:"text-sm md:text-base"},Bs={class:"text-lg md:text-xl"},Vs={__name:"TokenDistribution",setup(W){const f=rt(),{statsPeriod:s,currentPeriodData:k}=at(f),u=x=>(typeof x!="number"&&(x=parseInt(x)||0),x===0?"0":x>=1e6?(x/1e6).toFixed(1)+"M":x>=1e3?(x/1e3).toFixed(1)+"K":x.toLocaleString());return(x,y)=>(r(),o("div",As,[t("h3",Ps,[y[0]||(y[0]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-coins mr-2 text-sm text-yellow-500 md:mr-3 md:text-base"}),w(" Token 使用分布 ")],-1)),t("span",Ls,"("+i(e(s)==="daily"?"今日":"本月")+")",1)]),t("div",Ms,[t("div",Is,[y[1]||(y[1]=t("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[t("i",{class:"fas fa-arrow-right mr-1 text-xs text-green-500 md:mr-2 md:text-sm"}),w(" 输入 Token ")],-1)),t("span",Ds,i(u(e(k).inputTokens)),1)]),t("div",Os,[y[2]||(y[2]=t("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[t("i",{class:"fas fa-arrow-left mr-1 text-xs text-blue-500 md:mr-2 md:text-sm"}),w(" 输出 Token ")],-1)),t("span",js,i(u(e(k).outputTokens)),1)]),t("div",Rs,[y[3]||(y[3]=t("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[t("i",{class:"fas fa-save mr-1 text-xs text-purple-500 md:mr-2 md:text-sm"}),w(" 缓存创建 Token ")],-1)),t("span",qs,i(u(e(k).cacheCreateTokens)),1)]),t("div",Us,[y[4]||(y[4]=t("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[t("i",{class:"fas fa-download mr-1 text-xs text-orange-500 md:mr-2 md:text-sm"}),w(" 缓存读取 Token ")],-1)),t("span",Ns,i(u(e(k).cacheReadTokens)),1)])]),t("div",Es,[t("div",Fs,[t("span",Ws,i(e(s)==="daily"?"今日":"本月")+"总计",1),t("span",Bs,i(u(e(k).allTokens)),1)])])]))}},zs=st(Vs,[["__scopeId","data-v-d9e5c1dd"]]),Js={class:"flex h-full flex-col gap-4 md:gap-6"},Hs={class:"card flex h-full flex-col p-4 md:p-6"},Ys={class:"mb-3 flex items-center text-lg font-bold text-gray-900 dark:text-gray-100 md:mb-4 md:text-xl"},Gs={key:0,class:"space-y-4"},Zs={class:"rounded-lg bg-gradient-to-r from-blue-50 to-indigo-50 p-4 dark:from-blue-900/20 dark:to-indigo-900/20"},Qs={class:"mb-3 flex items-center justify-between"},Xs={class:"rounded-full bg-blue-100 px-2 py-1 text-xs font-semibold text-blue-700 dark:bg-blue-800 dark:text-blue-200"},ta={class:"grid grid-cols-2 gap-3"},ea={class:"text-center"},sa={class:"text-lg font-bold text-gray-900 dark:text-gray-100"},aa={class:"text-center"},ra={class:"text-lg font-bold text-green-600"},la={class:"rounded-lg bg-gradient-to-r from-purple-50 to-pink-50 p-4 dark:from-purple-900/20 dark:to-pink-900/20"},ia={class:"space-y-2"},oa={class:"flex items-center justify-between"},na={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},da={class:"flex items-center justify-between"},ua={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},ca={class:"flex items-center justify-between"},ma={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},ga={key:0,class:"rounded-lg bg-red-50 p-3 text-sm dark:bg-red-900/20"},fa={class:"text-red-700 dark:text-red-300"},xa={key:1,class:"space-y-4 md:space-y-5"},ya={class:"mb-2 flex items-center justify-between"},pa={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},ba={key:0},va={key:1,class:"flex items-center gap-1"},ka={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},ha={key:1,class:"h-2 w-full rounded-full bg-gray-200"},_a={class:"mb-2 flex items-center justify-between"},wa={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},$a={key:0},Sa={key:1,class:"flex items-center gap-1"},Ca={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Ta={key:1,class:"h-2 w-full rounded-full bg-gray-200"},Ka={key:0},Aa={class:"mb-2 flex items-center justify-between"},Pa={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},La={class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Ma={key:1},Ia={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},Da={key:0},Oa={key:1},ja={key:2},Ra={class:"space-y-4 border-t border-gray-100 pt-3 dark:border-gray-700"},qa={class:"flex items-center justify-between"},Ua={class:"text-sm font-medium text-gray-900 md:text-base"},Na={key:0},Ea={key:1,class:"flex items-center gap-1"},Fa={class:"flex items-center justify-between"},Wa={class:"text-sm font-medium text-gray-900 md:text-base"},Ba={key:0,class:"text-orange-600"},Va={key:1,class:"text-green-600"},za={class:"space-y-2"},Ja={class:"flex items-center justify-between"},Ha={class:"text-sm font-medium text-gray-900 md:text-base"},Ya={key:0,class:"text-orange-600"},Ga={key:1,class:"text-green-600"},Za={key:0,class:"flex flex-wrap gap-2 rounded-lg bg-blue-50 p-2 dark:bg-blue-900/20 md:p-3"},Qa={key:0,class:"card !overflow-visible p-4 md:p-6"},Xa={class:"rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20 md:p-4"},tr={class:"max-h-64 space-y-1 overflow-y-auto pr-1 md:max-h-80 md:space-y-2"},er={class:"break-all text-gray-800 dark:text-gray-200"},sr={__name:"LimitConfig",setup(W){const f=rt(),{statsData:s,multiKeyMode:k,aggregatedStats:u,invalidKeys:x}=at(f),y=U(()=>{var n;const c=(n=s.value)==null?void 0:n.restrictions;return c?c.enableModelRestriction===!0&&Array.isArray(c.restrictedModels)&&c.restrictedModels.length>0:!1}),b=U(()=>{var n;const c=(n=s.value)==null?void 0:n.restrictions;return c?c.enableClientRestriction===!0&&Array.isArray(c.allowedClients)&&c.allowedClients.length>0:!1}),T=()=>{if(!s.value.limits.dailyCostLimit||s.value.limits.dailyCostLimit===0)return 0;const c=s.value.limits.currentDailyCost/s.value.limits.dailyCostLimit*100;return Math.min(c,100)},M=()=>{const c=T();return c>=100?"bg-red-500":c>=80?"bg-yellow-500":"bg-green-500"},v=()=>{if(!s.value.limits.totalCostLimit||s.value.limits.totalCostLimit===0)return 0;const c=s.value.limits.currentTotalCost/s.value.limits.totalCostLimit*100;return Math.min(c,100)},A=()=>{const c=v();return c>=100?"bg-red-500":c>=80?"bg-yellow-500":"bg-blue-500"},B=()=>{if(!s.value.limits.weeklyOpusCostLimit||s.value.limits.weeklyOpusCostLimit===0)return 0;const c=s.value.limits.weeklyOpusCost/s.value.limits.weeklyOpusCostLimit*100;return Math.min(c,100)},C=()=>{const c=B();return c>=100?"bg-red-500":c>=80?"bg-yellow-500":"bg-indigo-500"},K=c=>(typeof c!="number"&&(c=parseInt(c)||0),c===0?"0":c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(1)+"K":c.toLocaleString());return(c,n)=>(r(),o("div",Js,[t("div",Hs,[t("h3",Ys,[n[0]||(n[0]=t("i",{class:"fas fa-shield-alt mr-2 text-sm text-red-500 md:mr-3 md:text-base"},null,-1)),w(" "+i(e(k)?"限制配置(聚合查询模式)":"限制配置"),1)]),e(k)&&e(u)?(r(),o("div",Gs,[t("div",Zs,[t("div",Qs,[n[1]||(n[1]=t("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},[t("i",{class:"fas fa-layer-group mr-2 text-blue-500"}),w(" API Keys 概况 ")],-1)),t("span",Xs,i(e(u).activeKeys)+"/"+i(e(u).totalKeys),1)]),t("div",ta,[t("div",ea,[t("div",sa,i(e(u).totalKeys),1),n[2]||(n[2]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400"},"总计 Keys",-1))]),t("div",aa,[t("div",ra,i(e(u).activeKeys),1),n[3]||(n[3]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400"},"激活 Keys",-1))])])]),t("div",la,[n[7]||(n[7]=t("div",{class:"mb-3 flex items-center"},[t("i",{class:"fas fa-chart-pie mr-2 text-purple-500"}),t("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},"聚合统计摘要")],-1)),t("div",ia,[t("div",oa,[n[4]||(n[4]=t("span",{class:"text-xs text-gray-600 dark:text-gray-400"},[t("i",{class:"fas fa-database mr-1 text-gray-400"}),w(" 总请求数 ")],-1)),t("span",na,i(K(e(u).usage.requests)),1)]),t("div",da,[n[5]||(n[5]=t("span",{class:"text-xs text-gray-600 dark:text-gray-400"},[t("i",{class:"fas fa-coins mr-1 text-yellow-500"}),w(" 总 Tokens ")],-1)),t("span",ua,i(K(e(u).usage.allTokens)),1)]),t("div",ca,[n[6]||(n[6]=t("span",{class:"text-xs text-gray-600 dark:text-gray-400"},[t("i",{class:"fas fa-dollar-sign mr-1 text-green-500"}),w(" 总费用 ")],-1)),t("span",ma,i(e(u).usage.formattedCost),1)])])]),e(x)&&e(x).length>0?(r(),o("div",ga,[n[8]||(n[8]=t("i",{class:"fas fa-exclamation-triangle mr-2 text-red-600 dark:text-red-400"},null,-1)),t("span",fa,i(e(x).length)+" 个无效的 API Key ",1)])):L("",!0),n[9]||(n[9]=t("div",{class:"rounded-lg bg-gray-50 p-3 text-xs text-gray-600 dark:bg-gray-800 dark:text-gray-400"},[t("i",{class:"fas fa-info-circle mr-1"}),w(" 每个 API Key 有独立的限制设置,聚合模式下不显示单个限制配置 ")],-1))])):L("",!0),e(k)?L("",!0):(r(),o("div",xa,[t("div",null,[t("div",ya,[n[11]||(n[11]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"每日费用限制",-1)),t("span",pa,[e(s).limits.dailyCostLimit>0?(r(),o("span",ba," $"+i(e(s).limits.currentDailyCost.toFixed(4))+" / $"+i(e(s).limits.dailyCostLimit.toFixed(2)),1)):(r(),o("span",va,[w(" $"+i(e(s).limits.currentDailyCost.toFixed(4))+" / ",1),n[10]||(n[10]=t("i",{class:"fas fa-infinity"},null,-1))]))])]),e(s).limits.dailyCostLimit>0?(r(),o("div",ka,[t("div",{class:O(["h-2 rounded-full transition-all duration-300",M()]),style:lt({width:T()+"%"})},null,6)])):(r(),o("div",ha,n[12]||(n[12]=[t("div",{class:"h-2 rounded-full bg-green-500",style:{width:"0%"}},null,-1)])))]),t("div",null,[t("div",_a,[n[14]||(n[14]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"总费用限制",-1)),t("span",wa,[e(s).limits.totalCostLimit>0?(r(),o("span",$a," $"+i(e(s).limits.currentTotalCost.toFixed(4))+" / $"+i(e(s).limits.totalCostLimit.toFixed(2)),1)):(r(),o("span",Sa,[w(" $"+i(e(s).limits.currentTotalCost.toFixed(4))+" / ",1),n[13]||(n[13]=t("i",{class:"fas fa-infinity"},null,-1))]))])]),e(s).limits.totalCostLimit>0?(r(),o("div",Ca,[t("div",{class:O(["h-2 rounded-full transition-all duration-300",A()]),style:lt({width:v()+"%"})},null,6)])):(r(),o("div",Ta,n[15]||(n[15]=[t("div",{class:"h-2 rounded-full bg-blue-500",style:{width:"0%"}},null,-1)])))]),e(s).limits.weeklyOpusCostLimit>0?(r(),o("div",Ka,[t("div",Aa,[n[16]||(n[16]=t("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"Opus 模型周费用限制",-1)),t("span",Pa," $"+i(e(s).limits.weeklyOpusCost.toFixed(4))+" / $"+i(e(s).limits.weeklyOpusCostLimit.toFixed(2)),1)]),t("div",La,[t("div",{class:O(["h-2 rounded-full transition-all duration-300",C()]),style:lt({width:B()+"%"})},null,6)])])):L("",!0),e(s).limits.rateLimitWindow>0&&(e(s).limits.rateLimitRequests>0||e(s).limits.tokenLimit>0||e(s).limits.rateLimitCost>0)?(r(),o("div",Ma,[Y(Lt,{"cost-limit":e(s).limits.rateLimitCost,"current-cost":e(s).limits.currentWindowCost,"current-requests":e(s).limits.currentWindowRequests,"current-tokens":e(s).limits.currentWindowTokens,label:"时间窗口限制","rate-limit-window":e(s).limits.rateLimitWindow,"request-limit":e(s).limits.rateLimitRequests,"show-progress":!0,"show-tooltip":!0,"token-limit":e(s).limits.tokenLimit,"window-end-time":e(s).limits.windowEndTime,"window-remaining-seconds":e(s).limits.windowRemainingSeconds,"window-start-time":e(s).limits.windowStartTime},null,8,["cost-limit","current-cost","current-requests","current-tokens","rate-limit-window","request-limit","token-limit","window-end-time","window-remaining-seconds","window-start-time"]),t("div",Ia,[n[17]||(n[17]=t("i",{class:"fas fa-info-circle mr-1"},null,-1)),e(s).limits.rateLimitCost>0?(r(),o("span",Da,' 请求次数和费用限制为"或"的关系,任一达到限制即触发限流 ')):e(s).limits.tokenLimit>0?(r(),o("span",Oa,' 请求次数和Token使用量为"或"的关系,任一达到限制即触发限流 ')):(r(),o("span",ja," 仅限制请求次数 "))])])):L("",!0),t("div",Ra,[t("div",qa,[n[19]||(n[19]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"并发限制",-1)),t("span",Ua,[e(s).limits.concurrencyLimit>0?(r(),o("span",Na,i(e(s).limits.concurrencyLimit),1)):(r(),o("span",Ea,n[18]||(n[18]=[t("i",{class:"fas fa-infinity text-gray-400"},null,-1)])))])]),t("div",Fa,[n[22]||(n[22]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"模型限制",-1)),t("span",Wa,[y.value?(r(),o("span",Ba,[n[20]||(n[20]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),w(" 限制 "+i(e(s).restrictions.restrictedModels.length)+" 个模型 ",1)])):(r(),o("span",Va,n[21]||(n[21]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),w(" 允许所有模型 ",-1)])))])]),t("div",za,[t("div",Ja,[n[25]||(n[25]=t("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"客户端限制",-1)),t("span",Ha,[b.value?(r(),o("span",Ya,[n[23]||(n[23]=t("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),w(" 限 "+i(e(s).restrictions.allowedClients.length)+" 种客户端使用 ",1)])):(r(),o("span",Ga,n[24]||(n[24]=[t("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),w(" 允许所有客户端 ",-1)])))])]),b.value?(r(),o("div",Za,[(r(!0),o(Z,null,et(e(s).restrictions.allowedClients,R=>(r(),o("span",{key:R,class:"flex items-center gap-1 rounded-full bg-white px-2 py-1 text-xs text-blue-700 shadow-sm dark:bg-slate-900 dark:text-blue-300 md:text-sm"},[n[26]||(n[26]=t("i",{class:"fas fa-id-badge"},null,-1)),w(" "+i(R),1)]))),128))])):L("",!0)])])]))]),y.value?(r(),o("div",Qa,[n[30]||(n[30]=t("h3",{class:"mb-3 flex items-center text-lg font-bold text-gray-900 dark:text-gray-100 md:mb-4 md:text-xl"},[t("i",{class:"fas fa-list-alt mr-2 text-sm text-amber-500 md:mr-3 md:text-base"}),w(" 详细限制信息 ")],-1)),t("div",Xa,[n[28]||(n[28]=t("h4",{class:"mb-2 flex items-center text-sm font-bold text-amber-800 dark:text-amber-300 md:mb-3 md:text-base"},[t("i",{class:"fas fa-robot mr-1 text-xs md:mr-2 md:text-sm"}),w(" 受限模型列表 ")],-1)),t("div",tr,[(r(!0),o(Z,null,et(e(s).restrictions.restrictedModels,R=>(r(),o("div",{key:R,class:"rounded border border-amber-200 bg-white px-2 py-1 text-xs dark:border-amber-700 dark:bg-gray-800 md:px-3 md:py-2 md:text-sm"},[n[27]||(n[27]=t("i",{class:"fas fa-ban mr-1 text-xs text-red-500 md:mr-2"},null,-1)),t("span",er,i(R),1)]))),128))]),n[29]||(n[29]=t("p",{class:"mt-2 text-xs text-amber-700 dark:text-amber-400 md:mt-3"},[t("i",{class:"fas fa-info-circle mr-1"}),w(" 此 API Key 不能访问以上列出的模型 ")],-1))])])):L("",!0)]))}},ar=st(sr,[["__scopeId","data-v-9bba2ba4"]]),rr={class:"card h-full p-4 md:p-6"},lr={class:"mb-3 flex flex-col text-lg font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center md:mb-4 md:text-xl"},ir={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},or={key:0,class:"space-y-2 md:space-y-3"},nr={class:"mb-1 flex items-center justify-between text-sm"},dr={class:"truncate font-medium text-gray-700 dark:text-gray-300"},ur={class:"text-xs text-gray-600 dark:text-gray-400"},cr={class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},mr={class:"mt-1 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},gr={key:0,class:"border-t border-gray-200 pt-2 dark:border-gray-700"},fr={class:"flex items-center justify-between text-sm text-gray-600 dark:text-gray-400"},xr={key:1,class:"flex h-32 items-center justify-center text-sm text-gray-500 dark:text-gray-400"},yr={key:2,class:"flex h-32 items-center justify-center text-sm text-gray-500 dark:text-gray-400"},pr={__name:"AggregatedStatsCard",setup(W){const f=rt(),{aggregatedStats:s,individualStats:k,statsPeriod:u,multiKeyMode:x}=at(f),y=C=>C?u.value==="daily"?C.dailyUsage||C.usage:C.monthlyUsage||C.usage:null,b=U(()=>!k.value||k.value.length===0?[]:[...k.value].sort((C,K)=>{const c=y(C),n=y(K);return((n==null?void 0:n.cost)||0)-((c==null?void 0:c.cost)||0)}).slice(0,5)),T=U(()=>k.value?Math.max(0,k.value.length-5):0),M=U(()=>{var n,R;if(!k.value||!s.value)return 0;const C=b.value.reduce((a,m)=>{const D=y(m);return a+((D==null?void 0:D.cost)||0)},0),K=u.value==="daily"?((n=s.value.dailyUsage)==null?void 0:n.cost)||0:((R=s.value.monthlyUsage)==null?void 0:R.cost)||0;if(K===0)return 0;const c=K-C;return Math.max(0,Math.round(c/K*100))}),v=C=>{var R,a;if(!s.value)return 0;const K=u.value==="daily"?((R=s.value.dailyUsage)==null?void 0:R.cost)||0:((a=s.value.monthlyUsage)==null?void 0:a.cost)||0;if(K===0)return 0;const c=y(C),n=((c==null?void 0:c.cost)||0)/K*100;return Math.round(n)},A=C=>["bg-blue-500","bg-green-500","bg-purple-500","bg-yellow-500","bg-pink-500"][C]||"bg-gray-400",B=C=>(typeof C!="number"&&(C=parseInt(C)||0),C===0?"0":C>=1e6?(C/1e6).toFixed(1)+"M":C>=1e3?(C/1e3).toFixed(1)+"K":C.toLocaleString());return(C,K)=>(r(),o("div",rr,[t("h3",lr,[K[0]||(K[0]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-chart-pie mr-2 text-sm text-orange-500 md:mr-3 md:text-base"}),w(" 使用占比 ")],-1)),t("span",ir,"("+i(e(u)==="daily"?"今日":"本月")+")",1)]),e(s)&&e(k).length>0?(r(),o("div",or,[(r(!0),o(Z,null,et(b.value,(c,n)=>{var R,a;return r(),o("div",{key:c.apiId,class:"relative"},[t("div",nr,[t("span",dr,i(c.name||`Key ${n+1}`),1),t("span",ur,i(v(c))+"% ",1)]),t("div",cr,[t("div",{class:O(["h-2 rounded-full transition-all duration-300",A(n)]),style:lt({width:v(c)+"%"})},null,6)]),t("div",mr,[t("span",null,i(B(((R=y(c))==null?void 0:R.requests)||0))+"次",1),t("span",null,i(((a=y(c))==null?void 0:a.formattedCost)||"$0.00"),1)])])}),128)),T.value>0?(r(),o("div",gr,[t("div",fr,[t("span",null,"其他 "+i(T.value)+" 个Keys",1),t("span",null,i(M.value)+"%",1)])])):L("",!0)])):e(x)?(r(),o("div",yr,K[2]||(K[2]=[t("i",{class:"fas fa-chart-pie mr-2"},null,-1),w(" 暂无数据 ",-1)]))):(r(),o("div",xr,K[1]||(K[1]=[t("div",{class:"text-center"},[t("i",{class:"fas fa-chart-pie mb-2 text-2xl"}),t("p",null,"使用占比仅在多Key查询时显示")],-1)])))]))}},br=st(pr,[["__scopeId","data-v-39572a8e"]]),vr={class:"card p-4 md:p-6"},kr={class:"mb-4 md:mb-6"},hr={class:"flex flex-col text-lg font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center md:text-xl"},_r={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},wr={key:0,class:"py-6 text-center md:py-8"},$r={key:1,class:"space-y-3 md:space-y-4"},Sr={class:"mb-2 flex items-start justify-between md:mb-3"},Cr={class:"min-w-0 flex-1"},Tr={class:"break-all text-base font-bold text-gray-900 dark:text-gray-100 md:text-lg"},Kr={class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},Ar={class:"ml-3 flex-shrink-0 text-right"},Pr={class:"text-base font-bold text-green-600 md:text-lg"},Lr={class:"grid grid-cols-2 gap-2 text-xs md:grid-cols-4 md:gap-3 md:text-sm"},Mr={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},Ir={class:"font-medium text-gray-900 dark:text-gray-100"},Dr={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},Or={class:"font-medium text-gray-900 dark:text-gray-100"},jr={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},Rr={class:"font-medium text-gray-900 dark:text-gray-100"},qr={class:"rounded bg-gray-50 p-2 dark:bg-gray-700"},Ur={class:"font-medium text-gray-900 dark:text-gray-100"},Nr={key:2,class:"py-6 text-center text-gray-500 dark:text-gray-400 md:py-8"},Er={class:"text-sm md:text-base"},Fr={__name:"ModelUsageStats",setup(W){const f=rt(),{statsPeriod:s,modelStats:k,modelStatsLoading:u}=at(f),x=y=>(typeof y!="number"&&(y=parseInt(y)||0),y===0?"0":y>=1e6?(y/1e6).toFixed(1)+"M":y>=1e3?(y/1e3).toFixed(1)+"K":y.toLocaleString());return(y,b)=>(r(),o("div",vr,[t("div",kr,[t("h3",hr,[b[0]||(b[0]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-robot mr-2 text-sm text-indigo-500 md:mr-3 md:text-base"}),w(" 模型使用统计 ")],-1)),t("span",_r,"("+i(e(s)==="daily"?"今日":"本月")+")",1)])]),e(u)?(r(),o("div",wr,b[1]||(b[1]=[t("i",{class:"fas fa-spinner loading-spinner mb-2 text-xl text-gray-600 dark:text-gray-400 md:text-2xl"},null,-1),t("p",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"加载模型统计数据中...",-1)]))):e(k).length>0?(r(),o("div",$r,[(r(!0),o(Z,null,et(e(k),(T,M)=>{var v;return r(),o("div",{key:M,class:"model-usage-item"},[t("div",Sr,[t("div",Cr,[t("h4",Tr,i(T.model),1),t("p",Kr,i(T.requests)+" 次请求 ",1)]),t("div",Ar,[t("div",Pr,i(((v=T.formatted)==null?void 0:v.total)||"$0.000000"),1),b[2]||(b[2]=t("div",{class:"text-xs text-gray-600 dark:text-gray-400 md:text-sm"},"总费用",-1))])]),t("div",Lr,[t("div",Mr,[b[3]||(b[3]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输入 Token",-1)),t("div",Ir,i(x(T.inputTokens)),1)]),t("div",Dr,[b[4]||(b[4]=t("div",{class:"text-gray-600 dark:text-gray-400"},"输出 Token",-1)),t("div",Or,i(x(T.outputTokens)),1)]),t("div",jr,[b[5]||(b[5]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存创建",-1)),t("div",Rr,i(x(T.cacheCreateTokens)),1)]),t("div",qr,[b[6]||(b[6]=t("div",{class:"text-gray-600 dark:text-gray-400"},"缓存读取",-1)),t("div",Ur,i(x(T.cacheReadTokens)),1)])])])}),128))])):(r(),o("div",Nr,[b[7]||(b[7]=t("i",{class:"fas fa-chart-pie mb-3 text-2xl md:text-3xl"},null,-1)),t("p",Er," 暂无"+i(e(s)==="daily"?"今日":"本月")+"模型使用数据 ",1)]))]))}},Wr=st(Fr,[["__scopeId","data-v-b3b8dc5f"]]),Br={key:0,class:"fixed inset-0 z-[1050] flex items-center justify-center bg-gray-900/40 backdrop-blur-sm"},Vr={class:"relative z-10 mx-3 flex w-full max-w-lg flex-col overflow-hidden rounded-2xl border border-gray-200/70 bg-white/95 shadow-2xl ring-1 ring-black/5 transition-all dark:border-gray-700/60 dark:bg-gray-900/95 dark:ring-white/10 sm:mx-4"},zr={class:"flex items-center justify-between border-b border-gray-100 bg-white/80 px-5 py-4 backdrop-blur dark:border-gray-800 dark:bg-gray-900/80"},Jr={class:"flex items-center gap-3"},Hr={class:"text-xs text-gray-500 dark:text-gray-400"},Yr=["disabled"],Gr={class:"max-h-[70vh] overflow-y-auto px-5 py-4"},Zr={class:"mb-4"},Qr={class:"relative"},Xr=["value"],tl={class:"mb-4 space-y-2"},el={class:"flex items-center justify-between text-sm"},sl={class:"font-medium text-gray-700 dark:text-gray-300"},al={class:"flex items-center gap-3"},rl={class:"text-xs text-gray-500 dark:text-gray-400"},ll={key:0,class:"mb-4 overflow-hidden rounded-xl border border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"},il={class:"flex items-center justify-between border-b border-gray-200 bg-gray-100 px-3 py-2 dark:border-gray-700 dark:bg-gray-800"},ol={key:0,class:"text-xs text-gray-500 dark:text-gray-500"},nl={class:"max-h-40 overflow-y-auto p-3"},dl={key:0,class:"whitespace-pre-wrap text-sm text-gray-700 dark:text-gray-300"},ul={key:0,class:"inline-block h-4 w-1 animate-pulse bg-blue-500"},cl={key:1,class:"flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400"},ml={key:2,class:"text-sm text-red-600 dark:text-red-400"},gl={key:1,class:"mb-4 flex items-center justify-center gap-2 text-xs text-gray-500 dark:text-gray-400"},fl={class:"flex items-center justify-end gap-3 border-t border-gray-100 bg-gray-50/80 px-5 py-3 dark:border-gray-800 dark:bg-gray-900/50"},xl=["disabled"],yl=["disabled"],pl={__name:"ApiKeyTestModal",props:{show:{type:Boolean,default:!1},apiKeyValue:{type:String,default:""},apiKeyName:{type:String,default:""}},emits:["close"],setup(W,{emit:f}){const s=W,k=f,u=N("idle"),x=N(""),y=N(""),b=N(0),T=N(null),M=N(null),v=N("claude-sonnet-4-5-20250929"),A=U(()=>s.apiKeyName||"当前 API Key"),B=U(()=>{const P=s.apiKeyValue;return P?P.length<=10?"****":P.substring(0,6)+"****"+P.substring(P.length-4):""}),C=U(()=>{switch(u.value){case"idle":return"准备就绪";case"testing":return"正在测试...";case"success":return"测试成功";case"error":return"测试失败";default:return"未知状态"}}),K=U(()=>{switch(u.value){case"idle":return"点击下方按钮开始测试 API Key 连通性";case"testing":return"正在通过 /api 端点发送测试请求";case"success":return"API Key 可以正常访问服务";case"error":return y.value||"无法通过 API Key 访问服务";default:return""}}),c=U(()=>{switch(u.value){case"idle":return"border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50";case"testing":return"border-blue-200 bg-blue-50 dark:border-blue-500/30 dark:bg-blue-900/20";case"success":return"border-green-200 bg-green-50 dark:border-green-500/30 dark:bg-green-900/20";case"error":return"border-red-200 bg-red-50 dark:border-red-500/30 dark:bg-red-900/20";default:return"border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800/50"}}),n=U(()=>{switch(u.value){case"idle":return"bg-gray-200 dark:bg-gray-700";case"testing":return"bg-blue-100 dark:bg-blue-500/30";case"success":return"bg-green-100 dark:bg-green-500/30";case"error":return"bg-red-100 dark:bg-red-500/30";default:return"bg-gray-200 dark:bg-gray-700"}}),R=U(()=>{switch(u.value){case"idle":return"fa-hourglass-start";case"testing":return"fa-spinner fa-spin";case"success":return"fa-check-circle";case"error":return"fa-exclamation-circle";default:return"fa-question-circle"}}),a=U(()=>{switch(u.value){case"idle":return"text-gray-500 dark:text-gray-400";case"testing":return"text-blue-500 dark:text-blue-400";case"success":return"text-green-500 dark:text-green-400";case"error":return"text-red-500 dark:text-red-400";default:return"text-gray-500 dark:text-gray-400"}}),m=U(()=>{switch(u.value){case"idle":return"text-gray-700 dark:text-gray-300";case"testing":return"text-blue-700 dark:text-blue-300";case"success":return"text-green-700 dark:text-green-300";case"error":return"text-red-700 dark:text-red-300";default:return"text-gray-700 dark:text-gray-300"}});async function D(){if(!s.apiKeyValue)return;u.value="testing",x.value="",y.value="",b.value=0,T.value=Date.now(),M.value&&M.value.abort(),M.value=new AbortController;const P=`${Ct}/apiStats/api-key/test`;try{const _=await fetch(P,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:s.apiKeyValue,model:v.value}),signal:M.value.signal});if(!_.ok){const h=await _.json().catch(()=>({}));throw new Error(h.message||h.error||`HTTP ${_.status}`)}const z=_.body.getReader(),H=new TextDecoder;let F=!1;for(;!F;){const{done:h,value:Q}=await z.read();if(h){F=!0;continue}const d=H.decode(Q).split(`
|
||
`);for(const l of d)if(l.startsWith("data: "))try{const p=JSON.parse(l.substring(6));S(p)}catch{}}}catch(_){if(_.name==="AbortError")return;u.value="error",y.value=_.message||"连接失败",b.value=Date.now()-T.value}}function S(P){switch(P.type){case"test_start":break;case"content":x.value+=P.text;break;case"message_stop":break;case"test_complete":b.value=Date.now()-T.value,P.success?u.value="success":(u.value="error",y.value=P.error||"测试失败");break;case"error":u.value="error",y.value=P.error||"未知错误",b.value=Date.now()-T.value;break}}function j(){u.value!=="testing"&&(M.value&&(M.value.abort(),M.value=null),u.value="idle",x.value="",y.value="",b.value=0,k("close"))}return xt(()=>s.show,P=>{P&&(u.value="idle",x.value="",y.value="",b.value=0)}),yt(()=>{M.value&&M.value.abort()}),(P,_)=>(r(),ot(kt,{to:"body"},[W.show?(r(),o("div",Br,[t("div",{class:"absolute inset-0",onClick:j}),t("div",Vr,[t("div",zr,[t("div",Jr,[t("div",{class:O(["flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-xl text-white shadow-lg",u.value==="success"?"bg-gradient-to-br from-green-500 to-emerald-500":u.value==="error"?"bg-gradient-to-br from-red-500 to-pink-500":"bg-gradient-to-br from-blue-500 to-indigo-500"])},[t("i",{class:O(["fas",u.value==="idle"?"fa-vial":u.value==="testing"?"fa-spinner fa-spin":u.value==="success"?"fa-check":"fa-times"])},null,2)],2),t("div",null,[_[0]||(_[0]=t("h3",{class:"text-lg font-semibold text-gray-900 dark:text-gray-100"}," API Key 端点测试 ",-1)),t("p",Hr,i(A.value),1)])]),t("button",{class:"flex h-9 w-9 items-center justify-center rounded-full bg-gray-100 text-gray-500 transition hover:bg-gray-200 hover:text-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-gray-200",disabled:u.value==="testing",onClick:j},_[1]||(_[1]=[t("i",{class:"fas fa-times text-sm"},null,-1)]),8,Yr)]),t("div",Gr,[t("div",Zr,[_[3]||(_[3]=t("label",{class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"}," API Key ",-1)),t("div",Qr,[t("input",{class:"w-full rounded-lg border border-gray-200 bg-gray-50 px-3 py-2 pr-10 text-sm text-gray-700 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",readonly:"",type:"text",value:B.value},null,8,Xr),_[2]||(_[2]=t("div",{class:"absolute right-2 top-1/2 -translate-y-1/2 text-gray-400"},[t("i",{class:"fas fa-lock text-xs"})],-1))]),_[4]||(_[4]=t("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 测试将使用此 API Key 调用当前服务的 /api 端点 ",-1))]),t("div",tl,[_[6]||(_[6]=t("div",{class:"flex items-center justify-between text-sm"},[t("span",{class:"text-gray-500 dark:text-gray-400"},"测试端点"),t("span",{class:"inline-flex items-center gap-1.5 rounded-full bg-blue-100 px-2.5 py-0.5 text-xs font-medium text-blue-700 dark:bg-blue-500/20 dark:text-blue-300"},[t("i",{class:"fas fa-link"}),w(" /api/v1/messages ")])],-1)),t("div",el,[_[5]||(_[5]=t("span",{class:"text-gray-500 dark:text-gray-400"},"测试模型",-1)),t("span",sl,i(v.value),1)]),_[7]||(_[7]=t("div",{class:"flex items-center justify-between text-sm"},[t("span",{class:"text-gray-500 dark:text-gray-400"},"模拟客户端"),t("span",{class:"font-medium text-gray-700 dark:text-gray-300"},"Claude Code")],-1))]),t("div",{class:O(["mb-4 rounded-xl border p-4 transition-all duration-300",c.value])},[t("div",al,[t("div",{class:O(["flex h-8 w-8 items-center justify-center rounded-lg",n.value])},[t("i",{class:O(["fas text-sm",R.value,a.value])},null,2)],2),t("div",null,[t("p",{class:O(["font-medium",m.value])},i(C.value),3),t("p",rl,i(K.value),1)])])],2),u.value!=="idle"?(r(),o("div",ll,[t("div",il,[_[8]||(_[8]=t("span",{class:"text-xs font-medium text-gray-600 dark:text-gray-400"},"AI 响应",-1)),x.value?(r(),o("span",ol,i(x.value.length)+" 字符 ",1)):L("",!0)]),t("div",nl,[x.value?(r(),o("p",dl,[w(i(x.value)+" ",1),u.value==="testing"?(r(),o("span",ul)):L("",!0)])):u.value==="testing"?(r(),o("p",cl,_[9]||(_[9]=[t("i",{class:"fas fa-circle-notch fa-spin"},null,-1),w(" 等待响应中... ",-1)]))):u.value==="error"&&y.value?(r(),o("p",ml,i(y.value),1)):L("",!0)])])):L("",!0),b.value>0?(r(),o("div",gl,[_[10]||(_[10]=t("i",{class:"fas fa-clock"},null,-1)),t("span",null,"耗时 "+i((b.value/1e3).toFixed(2))+" 秒",1)])):L("",!0)]),t("div",fl,[t("button",{class:"rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm transition hover:bg-gray-50 hover:shadow dark:border-gray-700 dark:bg-gray-800 dark:text-gray-300 dark:hover:bg-gray-700",disabled:u.value==="testing",onClick:j}," 关闭 ",8,xl),t("button",{class:O(["flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium shadow-sm transition",u.value==="testing"||!W.apiKeyValue?"cursor-not-allowed bg-gray-200 text-gray-400 dark:bg-gray-700 dark:text-gray-500":"bg-gradient-to-r from-blue-500 to-indigo-500 text-white hover:from-blue-600 hover:to-indigo-600 hover:shadow-md"]),disabled:u.value==="testing"||!W.apiKeyValue,onClick:D},[t("i",{class:O(["fas",u.value==="testing"?"fa-spinner fa-spin":"fa-play"])},null,2),w(" "+i(u.value==="testing"?"测试中...":u.value==="idle"?"开始测试":"重新测试"),1)],10,yl)])])])):L("",!0)]))}},bl={key:0,class:"public-stats-overview"},vl={class:"header-section"},kl={class:"flex items-center gap-2"},hl={class:"status-text"},_l={class:"text-xs text-gray-500 dark:text-gray-400"},wl={class:"flex flex-wrap justify-center gap-2 md:justify-end"},$l={class:"main-content"},Sl={class:"stats-section"},Cl={class:"stats-grid"},Tl={class:"stat-item"},Kl={class:"stat-value"},Al={class:"stat-item"},Pl={class:"stat-value"},Ll={class:"stat-item"},Ml={class:"stat-value"},Il={class:"stat-item"},Dl={class:"stat-value"},Ol={key:0,class:"model-section"},jl={class:"section-title-left"},Rl={class:"period-label"},ql={class:"model-chart-container"},Ul={key:0,class:"chart-section"},Nl={class:"chart-container"},El={class:"chart-legend"},Fl={key:0,class:"legend-item"},Wl={key:1,class:"legend-item"},Bl={key:2,class:"legend-item"},Vl={key:1,class:"empty-state"},zl={key:1,class:"public-stats-loading"},Jl={key:2,class:"public-stats-empty"},Hl={__name:"PublicStatsOverview",setup(W){It.register(Dt,Ot,jt,Rt,qt,Ut,Nt,Et,Ft);const f=pt(),s=U(()=>{var m;const a=(m=f.publicStats)==null?void 0:m.showOptions;return(a==null?void 0:a.tokenTrends)||(a==null?void 0:a.apiKeysTrends)||(a==null?void 0:a.accountTrends)}),k=U(()=>{var P,_,z;const a=f.publicStats;if(!a)return!1;const m=a.showOptions||{},D=m.tokenTrends&&((P=a.tokenTrends)==null?void 0:P.length)>0,S=m.apiKeysTrends&&((_=a.apiKeysTrends)==null?void 0:_.length)>0,j=m.accountTrends&&((z=a.accountTrends)==null?void 0:z.length)>0;return D||S||j}),u=["rgb(99, 102, 241)","rgb(59, 130, 246)","rgb(16, 185, 129)","rgb(245, 158, 11)","rgb(239, 68, 68)","rgb(139, 92, 246)","rgb(236, 72, 153)","rgb(20, 184, 166)"],x=U(()=>{var D;const a=f.publicStats;if(!((D=a==null?void 0:a.modelDistribution)!=null&&D.length))return{labels:[],datasets:[]};const m=a.modelDistribution;return{labels:m.map(S=>n(S.model)),datasets:[{data:m.map(S=>S.percentage),backgroundColor:m.map((S,j)=>u[j%u.length]),borderColor:"transparent",borderWidth:0,hoverOffset:4}]}}),y=U(()=>{const a=document.documentElement.classList.contains("dark");return{responsive:!0,maintainAspectRatio:!1,cutout:"60%",plugins:{legend:{position:"right",labels:{color:a?"rgb(156, 163, 175)":"rgb(107, 114, 128)",padding:12,usePointStyle:!0,pointStyle:"circle",font:{size:11},generateLabels:D=>{const S=D.data;return S.labels.length&&S.datasets.length?S.labels.map((j,P)=>({text:`${j} ${S.datasets[0].data[P]}%`,fillStyle:S.datasets[0].backgroundColor[P],strokeStyle:"transparent",lineWidth:0,pointStyle:"circle",hidden:!1,index:P})):[]}}},tooltip:{backgroundColor:a?"rgba(31, 41, 55, 0.95)":"rgba(255, 255, 255, 0.95)",titleColor:a?"rgb(243, 244, 246)":"rgb(17, 24, 39)",bodyColor:a?"rgb(209, 213, 219)":"rgb(75, 85, 99)",borderColor:a?"rgba(75, 85, 99, 0.3)":"rgba(209, 213, 219, 0.5)",borderWidth:1,padding:10,cornerRadius:8,callbacks:{label:D=>` ${D.label}: ${D.parsed}%`}}}}}),b=U(()=>{var j,P,_,z,H,F;const a=f.publicStats;if(!a)return{labels:[],datasets:[]};const m=a.showOptions||{},D=((j=a.tokenTrends)==null?void 0:j.map(h=>R(h.date)))||((P=a.apiKeysTrends)==null?void 0:P.map(h=>R(h.date)))||((_=a.accountTrends)==null?void 0:_.map(h=>R(h.date)))||[],S=[];return m.tokenTrends&&((z=a.tokenTrends)==null?void 0:z.length)>0&&S.push({label:"Tokens",data:a.tokenTrends.map(h=>h.tokens),borderColor:"rgb(59, 130, 246)",backgroundColor:"rgba(59, 130, 246, 0.1)",yAxisID:"y",tension:.3,fill:!0,pointRadius:3,pointHoverRadius:5}),m.apiKeysTrends&&((H=a.apiKeysTrends)==null?void 0:H.length)>0&&S.push({label:"活跃 Keys",data:a.apiKeysTrends.map(h=>h.activeKeys),borderColor:"rgb(34, 197, 94)",backgroundColor:"rgba(34, 197, 94, 0.1)",yAxisID:"y1",tension:.3,fill:!1,pointRadius:3,pointHoverRadius:5}),m.accountTrends&&((F=a.accountTrends)==null?void 0:F.length)>0&&S.push({label:"活跃账号",data:a.accountTrends.map(h=>h.activeAccounts),borderColor:"rgb(168, 85, 247)",backgroundColor:"rgba(168, 85, 247, 0.1)",yAxisID:"y1",tension:.3,fill:!1,pointRadius:3,pointHoverRadius:5}),{labels:D,datasets:S}}),T=U(()=>{const a=document.documentElement.classList.contains("dark"),m=a?"rgba(156, 163, 175, 1)":"rgba(107, 114, 128, 1)",D=a?"rgba(75, 85, 99, 0.3)":"rgba(229, 231, 235, 0.8)";return{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{legend:{display:!1},tooltip:{backgroundColor:a?"rgba(31, 41, 55, 0.9)":"rgba(255, 255, 255, 0.9)",titleColor:a?"#e5e7eb":"#1f2937",bodyColor:a?"#d1d5db":"#4b5563",borderColor:a?"rgba(75, 85, 99, 0.5)":"rgba(229, 231, 235, 1)",borderWidth:1,padding:10,displayColors:!0,callbacks:{label:function(S){let j=S.dataset.label||"";return j&&(j+=": "),S.dataset.yAxisID==="y"?j+=A(S.parsed.y):j+=S.parsed.y,j}}}},scales:{x:{grid:{color:D,drawBorder:!1},ticks:{color:m,font:{size:10}}},y:{type:"linear",display:!0,position:"left",min:0,beginAtZero:!0,title:{display:!0,text:"Tokens",color:"rgb(59, 130, 246)",font:{size:10}},grid:{color:D,drawBorder:!1},ticks:{color:m,font:{size:10},callback:function(S){return B(S)}}},y1:{type:"linear",display:!0,position:"right",min:0,beginAtZero:!0,title:{display:!0,text:"数量",color:"rgb(34, 197, 94)",font:{size:10}},grid:{drawOnChartArea:!1},ticks:{color:m,font:{size:10},stepSize:1}}}}});function M(a){const m=Math.floor(a/86400),D=Math.floor(a%86400/3600),S=Math.floor(a%3600/60);return m>0?`${m}天 ${D}小时`:D>0?`${D}小时 ${S}分钟`:`${S}分钟`}function v(a){return a>=1e6?(a/1e6).toFixed(1)+"M":a>=1e3?(a/1e3).toFixed(1)+"K":a.toString()}function A(a){return a>=1e9?(a/1e9).toFixed(2)+"B":a>=1e6?(a/1e6).toFixed(2)+"M":a>=1e3?(a/1e3).toFixed(1)+"K":a.toString()}function B(a){return a>=1e9?(a/1e9).toFixed(0)+"B":a>=1e6?(a/1e6).toFixed(0)+"M":a>=1e3?(a/1e3).toFixed(0)+"K":a.toString()}function C(a){const m={today:"今天","24h":"过去24小时","7d":"过去7天","30d":"过去30天",all:"全部"};return m[a]||m.today}function K(a){return{claude:"fas fa-robot",gemini:"fas fa-gem",bedrock:"fab fa-aws",droid:"fas fa-microchip"}[a]||"fas fa-server"}function c(a){return{claude:"Claude",gemini:"Gemini",bedrock:"Bedrock",droid:"Droid"}[a]||a}function n(a){if(!a)return"Unknown";const m=a.split("-");return m.length>2?m.slice(0,2).join("-"):a}function R(a){if(!a)return"";const m=a.split("-");return m.length===3?`${m[1]}/${m[2]}`:a}return(a,m)=>{var D,S,j,P,_;return e(f).publicStats?(r(),o("div",bl,[t("div",vl,[t("div",kl,[t("div",{class:O(["status-badge",{"status-healthy":e(f).publicStats.serviceStatus==="healthy","status-degraded":e(f).publicStats.serviceStatus==="degraded"}])},[m[0]||(m[0]=t("span",{class:"status-dot"},null,-1)),t("span",hl,i(e(f).publicStats.serviceStatus==="healthy"?"服务正常":"服务降级"),1)],2),t("span",_l," 运行 "+i(M(e(f).publicStats.uptime)),1)]),t("div",wl,[(r(!0),o(Z,null,et(e(f).publicStats.platforms,(z,H)=>(r(),o("div",{key:H,class:O(["platform-badge",{available:z,unavailable:!z}])},[t("i",{class:O(["mr-1",K(H)])},null,2),t("span",null,i(c(H)),1)],2))),128))])]),t("div",$l,[t("div",Sl,[m[5]||(m[5]=t("div",{class:"section-title-left"},"今日统计",-1)),t("div",Cl,[t("div",Tl,[t("div",Kl,i(v(e(f).publicStats.todayStats.requests)),1),m[1]||(m[1]=t("div",{class:"stat-label"},"请求数",-1))]),t("div",Al,[t("div",Pl,i(A(e(f).publicStats.todayStats.tokens)),1),m[2]||(m[2]=t("div",{class:"stat-label"},"Tokens",-1))]),t("div",Ll,[t("div",Ml,i(A(e(f).publicStats.todayStats.inputTokens)),1),m[3]||(m[3]=t("div",{class:"stat-label"},"输入",-1))]),t("div",Il,[t("div",Dl,i(A(e(f).publicStats.todayStats.outputTokens)),1),m[4]||(m[4]=t("div",{class:"stat-label"},"输出",-1))])])]),(D=e(f).publicStats.showOptions)!=null&&D.modelDistribution&&((S=e(f).publicStats.modelDistribution)==null?void 0:S.length)>0?(r(),o("div",Ol,[t("div",jl,[m[6]||(m[6]=w(" 模型使用分布 ",-1)),t("span",Rl,i(C(e(f).publicStats.modelDistributionPeriod)),1)]),t("div",ql,[Y(e(ht),{data:x.value,options:y.value},null,8,["data","options"])])])):L("",!0)]),k.value?(r(),o("div",Ul,[m[10]||(m[10]=t("div",{class:"section-title-left"},"使用趋势(近7天)",-1)),t("div",Nl,[Y(e(_t),{data:b.value,options:T.value},null,8,["data","options"])]),t("div",El,[(j=e(f).publicStats.showOptions)!=null&&j.tokenTrends?(r(),o("div",Fl,m[7]||(m[7]=[t("span",{class:"legend-dot legend-tokens"},null,-1),t("span",{class:"legend-text"},"Tokens",-1)]))):L("",!0),(P=e(f).publicStats.showOptions)!=null&&P.apiKeysTrends?(r(),o("div",Wl,m[8]||(m[8]=[t("span",{class:"legend-dot legend-keys"},null,-1),t("span",{class:"legend-text"},"活跃 Keys",-1)]))):L("",!0),(_=e(f).publicStats.showOptions)!=null&&_.accountTrends?(r(),o("div",Bl,m[9]||(m[9]=[t("span",{class:"legend-dot legend-accounts"},null,-1),t("span",{class:"legend-text"},"活跃账号",-1)]))):L("",!0)])])):s.value?(r(),o("div",Vl,m[11]||(m[11]=[t("i",{class:"fas fa-chart-line empty-icon"},null,-1),t("p",{class:"empty-text"},"暂无趋势数据",-1),t("p",{class:"empty-hint"},"数据将在有请求后自动更新",-1)]))):L("",!0)])):e(f).publicStatsLoading?(r(),o("div",zl,m[12]||(m[12]=[t("div",{class:"loading-spinner"},null,-1)]))):(r(),o("div",Jl,m[13]||(m[13]=[t("i",{class:"fas fa-chart-pie empty-icon"},null,-1),t("p",{class:"empty-text"},"暂无统计数据",-1)])))}}},Yl=st(Hl,[["__scopeId","data-v-4ed7dff1"]]),Gl={class:"glass-strong mb-6 rounded-3xl p-4 shadow-xl md:mb-8 md:p-6"},Zl={class:"flex flex-col items-center justify-between gap-4 md:flex-row"},Ql={class:"flex items-center gap-2 md:gap-4"},Xl={class:"flex items-center"},ti={key:0,class:"h-8 w-px bg-gradient-to-b from-transparent via-gray-300 to-transparent opacity-50 dark:via-gray-600"},ei={class:"mb-6 md:mb-8"},si={class:"flex justify-center"},ai={class:"inline-flex w-full max-w-md rounded-full border border-white/20 bg-white/10 p-1 shadow-lg backdrop-blur-xl md:w-auto"},ri={key:0,class:"tab-content"},li={key:1,class:"tab-content"},ii={key:0,class:"mb-6 md:mb-8"},oi={class:"rounded-xl border border-red-500/30 bg-red-500/20 p-3 text-sm text-red-800 backdrop-blur-sm dark:border-red-500/20 dark:bg-red-500/10 dark:text-red-200 md:p-4 md:text-base"},ni={key:1,class:"fade-in"},di={class:"glass-strong rounded-3xl p-4 shadow-xl md:p-6"},ui={class:"mb-4 border-b border-gray-200 pb-4 dark:border-gray-700 md:mb-6 md:pb-6"},ci={class:"flex flex-col items-start justify-between gap-3 md:flex-row md:items-center md:gap-4"},mi={class:"flex w-full items-center gap-2 md:w-auto"},gi=["disabled"],fi=["disabled"],xi=["disabled"],yi={class:"mb-6 mt-6 grid grid-cols-1 gap-4 md:mb-8 md:mt-8 md:gap-6 xl:grid-cols-2 xl:items-stretch"},pi={key:2,class:"tab-content"},bi={class:"glass-strong rounded-3xl shadow-xl"},vi={__name:"ApiStatsView",setup(W){const f=$t(),s=rt(),k=Tt(),u=pt(),x=N("overview"),y=U(()=>k.isDarkMode),{apiKey:b,apiId:T,loading:M,modelStatsLoading:v,oemLoading:A,error:B,statsPeriod:C,statsData:K,oemSettings:c,multiKeyMode:n}=at(s),{queryStats:R,switchPeriod:a,loadStatsWithApiId:m,loadOemSettings:D,reset:S}=s,j=N(!1),P=()=>{j.value=!0},_=()=>{j.value=!1},z=()=>{x.value="overview",u.loadPublicStats()},H=F=>{(F.ctrlKey||F.metaKey)&&F.key==="Enter"&&(!M.value&&b.value.trim()&&R(),F.preventDefault()),F.key==="Escape"&&S()};return wt(()=>{k.initTheme(),D(),u.loadPublicStats();const F=f.query.apiId,h=f.query.apiKey;F&&F.match(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i)?(T.value=F,m()):h&&h.length>10&&(b.value=h),document.addEventListener("keydown",H)}),yt(()=>{document.removeEventListener("keydown",H)}),xt(b,F=>{F||s.clearData()}),(F,h)=>{var X;const Q=St("router-link");return r(),o("div",{class:O(["min-h-screen p-4 md:p-6",y.value?"gradient-bg-dark":"gradient-bg"])},[t("div",Gl,[t("div",Zl,[Y(Kt,{loading:e(A),"logo-src":e(c).siteIconData||e(c).siteIcon,subtitle:x.value==="stats"?"API Key 使用统计":x.value==="overview"?"服务状态概览":"使用教程",title:e(c).siteName},null,8,["loading","logo-src","subtitle","title"]),t("div",Ql,[t("div",Xl,[Y(At,{mode:"dropdown"})]),e(c).ldapEnabled||e(c).showAdminButton!==!1?(r(),o("div",ti)):L("",!0),e(c).ldapEnabled?(r(),ot(Q,{key:1,class:"user-login-button flex items-center gap-2 rounded-2xl px-4 py-2 text-white transition-all duration-300 md:px-5 md:py-2.5",to:"/user-login"},{default:ft(()=>h[4]||(h[4]=[t("i",{class:"fas fa-user text-sm md:text-base"},null,-1),t("span",{class:"text-xs font-semibold tracking-wide md:text-sm"},"用户登录",-1)])),_:1,__:[4]})):L("",!0),e(c).showAdminButton!==!1?(r(),ot(Q,{key:2,class:"admin-button-refined flex items-center gap-2 rounded-2xl px-4 py-2 transition-all duration-300 md:px-5 md:py-2.5",to:"/dashboard"},{default:ft(()=>h[5]||(h[5]=[t("i",{class:"fas fa-shield-alt text-sm md:text-base"},null,-1),t("span",{class:"text-xs font-semibold tracking-wide md:text-sm"},"管理后台",-1)])),_:1,__:[5]})):L("",!0)])])]),t("div",ei,[t("div",si,[t("div",ai,[t("button",{class:O(["tab-pill-button",x.value==="overview"?"active":""]),onClick:z},h[6]||(h[6]=[t("i",{class:"fas fa-tachometer-alt mr-1 md:mr-2"},null,-1),t("span",{class:"text-sm md:text-base"},"状态概览",-1)]),2),t("button",{class:O(["tab-pill-button",x.value==="stats"?"active":""]),onClick:h[0]||(h[0]=d=>x.value="stats")},h[7]||(h[7]=[t("i",{class:"fas fa-chart-line mr-1 md:mr-2"},null,-1),t("span",{class:"text-sm md:text-base"},"统计查询",-1)]),2),t("button",{class:O(["tab-pill-button",x.value==="tutorial"?"active":""]),onClick:h[1]||(h[1]=d=>x.value="tutorial")},h[8]||(h[8]=[t("i",{class:"fas fa-graduation-cap mr-1 md:mr-2"},null,-1),t("span",{class:"text-sm md:text-base"},"使用教程",-1)]),2)])])]),x.value==="overview"?(r(),o("div",ri,[Y(Yl)])):L("",!0),x.value==="stats"?(r(),o("div",li,[Y(de),e(B)?(r(),o("div",ii,[t("div",oi,[h[9]||(h[9]=t("i",{class:"fas fa-exclamation-triangle mr-2"},null,-1)),w(" "+i(e(B)),1)])])):L("",!0),e(K)?(r(),o("div",ni,[t("div",di,[t("div",ui,[t("div",ci,[h[13]||(h[13]=t("div",{class:"flex items-center gap-2 md:gap-3"},[t("i",{class:"fas fa-clock text-base text-blue-500 md:text-lg"}),t("span",{class:"text-base font-medium text-gray-700 dark:text-gray-200 md:text-lg"},"统计时间范围")],-1)),t("div",mi,[t("button",{class:O(["flex flex-1 items-center justify-center gap-1 px-4 py-2 text-xs font-medium md:flex-none md:gap-2 md:px-6 md:text-sm",["period-btn",{active:e(C)==="daily"}]]),disabled:e(M)||e(v),onClick:h[2]||(h[2]=d=>e(a)("daily"))},h[10]||(h[10]=[t("i",{class:"fas fa-calendar-day text-xs md:text-sm"},null,-1),w(" 今日 ",-1)]),10,gi),t("button",{class:O(["flex flex-1 items-center justify-center gap-1 px-4 py-2 text-xs font-medium md:flex-none md:gap-2 md:px-6 md:text-sm",["period-btn",{active:e(C)==="monthly"}]]),disabled:e(M)||e(v),onClick:h[3]||(h[3]=d=>e(a)("monthly"))},h[11]||(h[11]=[t("i",{class:"fas fa-calendar-alt text-xs md:text-sm"},null,-1),w(" 本月 ",-1)]),10,fi),e(n)?L("",!0):(r(),o("button",{key:0,class:"test-btn flex items-center justify-center gap-1 px-4 py-2 text-xs font-medium md:gap-2 md:px-6 md:text-sm",disabled:e(M),onClick:P},h[12]||(h[12]=[t("i",{class:"fas fa-vial text-xs md:text-sm"},null,-1),w(" 测试 ",-1)]),8,xi))])])]),Y(Ks),t("div",yi,[Y(zs,{class:"h-full"}),e(n)?(r(),ot(br,{key:0,class:"h-full"})):(r(),ot(ar,{key:1,class:"h-full"}))]),Y(Wr)])])):L("",!0)])):L("",!0),x.value==="tutorial"?(r(),o("div",pi,[t("div",bi,[Y(Mt)])])):L("",!0),Y(pl,{"api-key-name":((X=e(K))==null?void 0:X.name)||"","api-key-value":e(b),show:j.value,onClose:_},null,8,["api-key-name","api-key-value","show"])],2)}}},Ai=st(vi,[["__scopeId","data-v-818f3fa5"]]);export{Ai as default};
|