Files
claude-relay-service/assets/ApiStatsView-D5wlfbRX.js
2026-01-22 13:58:01 +00:00

7 lines
84 KiB
JavaScript
Raw Permalink 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{aP as Oe,r as T,c as j,aY as ce,x as l,y as a,z as e,O as k,L as b,P as o,u as t,C as R,K as xe,aW as Fe,aa as $e,f as Me,aq as Se,Y as Ce,Q as X,ac as se,B as be,R as ee,q as De,o as Te,V as qe,I as ve,aV as Pe,a5 as Ue,aX as We,J as _e,T as Ve,av as ze,al as Be}from"./vue-vendor-DV7DYXbz.js";import{bf as Re,bg as Le,bh as ke,b1 as Ge,bi as He,bj as Je,bk as Qe,_ as me,f as O,Z as Ee,c as Ye,aH as Xe,aO as Ze,a as et,bl as tt,s as Ie,bm as st,bn as at}from"./index-BahP9Xx9.js";import{L as rt}from"./LogoTitle-DF7a1vCs.js";import{T as lt}from"./ThemeToggle-DROshBR1.js";import"./vendor-Dr8jvgFu.js";import{_ as nt}from"./WindowCountdown-Cz478C_V.js";import{T as ot}from"./TutorialView-Cpvhof5r.js";import"./element-plus-BSjV1f9S.js";const ge=Oe("apistats",()=>{const E=T(""),K=T(null),i=T(!1),_=T(!1),g=T(!0),v=T(""),h=T("daily"),$=T(null),M=T([]),L=T([]),w=T([]),u=T([]),x=T(null),f=T(null),c=T(null),n=T({siteName:"",siteIcon:"",siteIconData:""}),C=T(!1),P=T([]),D=T([]),U=T(null),F=T([]),Q=T([]),W=T(null),G=T({}),te=j(()=>{const y={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};return C.value&&U.value?h.value==="daily"?U.value.dailyUsage||y:h.value==="monthly"?U.value.monthlyUsage||y:U.value.alltimeUsage||y:h.value==="daily"?x.value||y:h.value==="monthly"?f.value||y:c.value||y}),ne=j(()=>{if(!$.value||!te.value)return{tokenUsage:0,costUsage:0,requestUsage:0};const y=te.value,S=$.value.limits;return{tokenUsage:S.tokenLimit>0?Math.min(y.allTokens/S.tokenLimit*100,100):0,costUsage:S.dailyCostLimit>0?Math.min(y.cost/S.dailyCostLimit*100,100):0,requestUsage:S.rateLimitRequests>0?Math.min(y.requests/S.rateLimitRequests*100,100):0}});async function oe(){if(C.value)return J();const y=E.value.trim();if(!y){v.value="请输入 API Key";return}if(y.length<10||y.length>512){v.value="API Key 格式无效:长度应在 10-512 个字符之间";return}i.value=!0,v.value="",$.value=null,M.value=[],K.value=null;try{const S=await Re(y);if(S.success){K.value=S.data.id;const I=await Le(K.value);if(I.success)$.value=I.data,G.value=I.data.serviceRates||{},await Y(),v.value="",de(),re();else throw new Error(I.message||"查询失败")}else throw new Error(S.message||"获取 API Key ID 失败")}catch(S){console.error("Query stats error:",S),v.value=S.message||"查询统计数据失败,请检查您的 API Key 是否正确",$.value=null,M.value=[],K.value=null}finally{i.value=!1}}async function Y(){K.value&&(await Promise.all([H("daily"),H("monthly")]),await Z())}async function Z(){if(K.value){_.value=!0;try{const[y,S,I]=await Promise.all([ke(K.value,"daily"),ke(K.value,"monthly"),ke(K.value,"alltime")]);L.value=y.success?y.data||[]:[],w.value=S.success?S.data||[]:[],u.value=I.success?I.data||[]:[],M.value=L.value}catch(y){console.error("Load all model stats error:",y),L.value=[],w.value=[],u.value=[],M.value=[]}finally{_.value=!1}}}async function H(y){try{const S=await ke(K.value,y);if(S.success){const I=S.data||[],V={requests:0,inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,allTokens:0,cost:0,formattedCost:"$0.000000"};I.forEach(p=>{var d;V.requests+=p.requests||0,V.inputTokens+=p.inputTokens||0,V.outputTokens+=p.outputTokens||0,V.cacheCreateTokens+=p.cacheCreateTokens||0,V.cacheReadTokens+=p.cacheReadTokens||0,V.allTokens+=p.allTokens||0,V.cost+=((d=p.costs)==null?void 0:d.total)||0}),V.formattedCost=B(V.cost),y==="daily"?x.value=V:y==="monthly"?f.value=V:y==="alltime"&&(c.value=V)}else console.warn(`Failed to load ${y} stats:`,S.message)}catch(S){console.error(`Load ${y} stats error:`,S)}}async function r(y="daily"){if(K.value){_.value=!0;try{const S=await ke(K.value,y);if(S.success)M.value=S.data||[];else throw new Error(S.message||"加载模型统计失败")}catch(S){console.error("Load model stats error:",S),M.value=[]}finally{_.value=!1}}}async function s(y){if(!(h.value===y||_.value)){if(h.value=y,C.value&&D.value.length>0){await ae(y);return}(y==="daily"&&!x.value||y==="monthly"&&!f.value||y==="alltime"&&!c.value)&&await H(y),await r(y)}}async function m(){var y,S;if(K.value){i.value=!0,v.value="",$.value=null,M.value=[];try{const I=await Le(K.value);if(I.success)$.value=I.data,G.value=I.data.serviceRates||{},console.log("API Stats - Full response:",I.data),console.log("API Stats - limits data:",I.data.limits),console.log("API Stats - weeklyOpusCostLimit:",(y=I.data.limits)==null?void 0:y.weeklyOpusCostLimit),console.log("API Stats - weeklyOpusCost:",(S=I.data.limits)==null?void 0:S.weeklyOpusCost),await Y(),v.value="";else throw new Error(I.message||"查询失败")}catch(I){console.error("Load stats with apiId error:",I),v.value=I.message||"查询统计数据失败",$.value=null,M.value=[]}finally{i.value=!1}}}async function A(){g.value=!0;try{const y=await Ge();y&&y.success&&y.data&&(n.value={...n.value,...y.data})}catch(y){console.error("Error loading OEM settings:",y),n.value={siteName:"Claude Relay Service",siteIcon:"",siteIconData:""}}finally{g.value=!1}}async function N(){try{const y=await He();y&&y.success&&y.data&&(W.value=y.data)}catch(y){console.error("Error loading service rates:",y),W.value=null}}function B(y){return typeof y!="number"||y===0?"$0.000000":y>=1?"$"+y.toFixed(2):y>=.01?"$"+y.toFixed(4):"$"+y.toFixed(6)}function de(){if(K.value){const y=new URL(window.location);y.searchParams.set("apiId",K.value),window.history.pushState({},"",y)}}function re(){E.value&&localStorage.setItem("lastApiKey",E.value)}function ie(){return localStorage.getItem("lastApiKey")}async function J(){const y=ue();if(y.length===0){v.value="请输入至少一个有效的 API Key";return}i.value=!0,v.value="",U.value=null,F.value=[],Q.value=[],M.value=[],P.value=y,D.value=[],G.value={};try{const S=await Promise.allSettled(y.map(d=>Re(d))),I=[],V=[];if(S.forEach((d,z)=>{d.status==="fulfilled"&&d.value.success?(I.push(d.value.data.id),V.push(y[z])):Q.value.push(y[z])}),I.length===0)throw new Error("所有 API Key 都无效");D.value=I,P.value=V;const p=await Je(I);if(p.success)U.value=p.data.aggregated,F.value=p.data.individual,$.value=p.data.aggregated,x.value=p.data.aggregated.dailyUsage||null,f.value=p.data.aggregated.monthlyUsage||null,await ae(h.value),ye();else throw new Error(p.message||"批量查询失败")}catch(S){console.error("Batch query error:",S),v.value=S.message||"批量查询统计数据失败",U.value=null,F.value=[]}finally{i.value=!1}}async function ae(y="daily"){if(D.value.length!==0){_.value=!0;try{const S=await Qe(D.value,y);if(S.success)M.value=S.data||[];else throw new Error(S.message||"加载批量模型统计失败")}catch(S){console.error("Load batch model stats error:",S),M.value=[]}finally{_.value=!1}}}function ue(){if(!E.value)return[];const y=E.value.split(/[,\n]+/).map(I=>I.trim()).filter(I=>I.length>=10&&I.length<=512);return[...new Set(y)].slice(0,30)}function ye(){if(D.value.length>0){const y=new URL(window.location);y.searchParams.set("apiIds",D.value.join(",")),y.searchParams.set("batch","true"),window.history.pushState({},"",y)}}function fe(){E.value=""}function pe(){$.value=null,M.value=[],L.value=[],w.value=[],u.value=[],x.value=null,f.value=null,c.value=null,v.value="",h.value="daily",K.value=null,G.value={},P.value=[],D.value=[],U.value=null,F.value=[],Q.value=[]}function he(){E.value="",C.value=!1,pe()}return{apiKey:E,apiId:K,loading:i,modelStatsLoading:_,oemLoading:g,error:v,statsPeriod:h,statsData:$,modelStats:M,dailyModelStats:L,monthlyModelStats:w,alltimeModelStats:u,dailyStats:x,monthlyStats:f,alltimeStats:c,oemSettings:n,multiKeyMode:C,apiKeys:P,apiIds:D,aggregatedStats:U,individualStats:F,invalidKeys:Q,serviceRates:W,keyServiceRates:G,currentPeriodData:te,usagePercentages:ne,queryStats:oe,queryBatchStats:J,loadAllPeriodStats:Y,loadAllModelStats:Z,loadPeriodStats:H,loadModelStats:r,loadBatchModelStats:ae,switchPeriod:s,loadStatsWithApiId:m,loadOemSettings:A,loadServiceRates:N,loadApiKeyFromStorage:ie,clearData:pe,clearInput:fe,reset:he}}),it={class:"api-input-wide-card mb-8 rounded-3xl p-6 shadow-xl"},dt={class:"mx-auto max-w-4xl"},ut={class:"control-bar mb-4 flex flex-wrap items-center justify-between gap-3"},ct={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},mt={class:"button-group flex items-center gap-2"},gt={class:"mode-switch-group flex items-center rounded-lg bg-gray-100 p-1 dark:bg-gray-800"},xt={key:0,class:"ml-1 rounded-full bg-white/20 px-1.5 py-0.5 text-xs font-semibold"},yt={class:"api-input-grid grid grid-cols-1 gap-4 lg:grid-cols-4"},ft={class:"lg:col-span-3"},pt={key:0,class:"relative"},vt=["disabled","type"],bt={key:1,class:"relative"},kt=["disabled"],ht={class:"lg:col-span-1"},_t=["disabled"],wt={key:0,class:"fas fa-spinner loading-spinner"},$t={key:1,class:"fas fa-search"},Ct={class:"security-notice mt-4"},Tt={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"},St={__name:"ApiKeyInput",setup(E){const K=ge(),{apiKey:i,loading:_,multiKeyMode:g}=ce(K),{queryStats:v,clearInput:h}=K,$=T(!1),M=j(()=>{if(!g.value||!i.value)return[];const w=i.value.split(/[,\n]+/).map(x=>x.trim()).filter(x=>x.length>0);return[...new Set(w)].slice(0,30)}),L=j(()=>g.value?M.value.length>0:i.value&&i.value.trim().length>0);return(w,u)=>(a(),l("div",it,[u[16]||(u[16]=e("div",{class:"wide-card-title mb-6"},[e("h2",{class:"mb-2 text-2xl font-bold text-gray-900 dark:text-gray-200"},[e("i",{class:"fas fa-chart-line mr-3"}),k(" 使用统计查询 ")]),e("p",{class:"text-base text-gray-600 dark:text-gray-400"},"查询您的 API Key 使用情况和统计数据")],-1)),e("div",dt,[e("div",ut,[e("label",ct,[u[9]||(u[9]=e("i",{class:"fas fa-key mr-2"},null,-1)),k(" "+o(t(g)?"输入您的 API Keys每行一个或用逗号分隔":"输入您的 API Key"),1)]),e("div",mt,[e("div",gt,[e("button",{class:R(["mode-switch-btn",{active:!t(g)}]),title:"单一模式",onClick:u[0]||(u[0]=x=>g.value=!1)},u[10]||(u[10]=[e("i",{class:"fas fa-key"},null,-1),e("span",{class:"ml-2 hidden sm:inline"},"单一",-1)]),2),e("button",{class:R(["mode-switch-btn",{active:t(g)}]),title:"聚合模式",onClick:u[1]||(u[1]=x=>g.value=!0)},[u[11]||(u[11]=e("i",{class:"fas fa-layer-group"},null,-1)),u[12]||(u[12]=e("span",{class:"ml-2 hidden sm:inline"},"聚合",-1)),t(g)&&M.value.length>0?(a(),l("span",xt,o(M.value.length),1)):b("",!0)],2)])])]),e("div",yt,[e("div",ft,[t(g)?(a(),l("div",bt,[xe(e("textarea",{"onUpdate:modelValue":u[5]||(u[5]=x=>Me(i)?i.value=x:null),class:"wide-card-input w-full resize-y",disabled:t(_),placeholder:`请输入您的 API Keys支持以下格式
cr_xxx
cr_yyy
cr_xxx, cr_yyy`,rows:"4",onKeyup:u[6]||(u[6]=$e(Ce((...x)=>t(v)&&t(v)(...x),["ctrl"]),["enter"]))},null,40,kt),[[Se,t(i)]]),t(i)&&!t(_)?(a(),l("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:u[7]||(u[7]=(...x)=>t(h)&&t(h)(...x))},u[13]||(u[13]=[e("i",{class:"fas fa-times-circle"},null,-1)]))):b("",!0)])):(a(),l("div",pt,[xe(e("input",{"onUpdate:modelValue":u[2]||(u[2]=x=>Me(i)?i.value=x:null),class:"wide-card-input w-full pr-10",disabled:t(_),placeholder:"请输入您的 API Key (cr_...)",type:$.value?"text":"password",onKeyup:u[3]||(u[3]=$e((...x)=>t(v)&&t(v)(...x),["enter"]))},null,40,vt),[[Fe,t(i)]]),e("button",{class:"absolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300",type:"button",onClick:u[4]||(u[4]=x=>$.value=!$.value)},[e("i",{class:R($.value?"fas fa-eye-slash":"fas fa-eye")},null,2)])]))]),e("div",ht,[e("button",{class:"btn btn-primary btn-query flex h-full w-full items-center justify-center gap-2",disabled:t(_)||!L.value,onClick:u[8]||(u[8]=(...x)=>t(v)&&t(v)(...x))},[t(_)?(a(),l("i",wt)):(a(),l("i",$t)),k(" "+o(t(_)?"查询中...":"查询统计"),1)],8,_t)])]),e("div",Ct,[u[14]||(u[14]=e("i",{class:"fas fa-shield-alt mr-2"},null,-1)),k(" "+o(t(g)?"您的 API Keys 仅用于查询统计数据,不会被存储。聚合模式下部分个体化信息将不显示。":"您的 API Key 仅用于查询自己的统计数据,不会被存储或用于其他用途"),1)]),t(g)?(a(),l("div",Tt,u[15]||(u[15]=[e("i",{class:"fas fa-lightbulb mr-2"},null,-1),e("span",null,"提示:最多支持同时查询 30 个 API Keys。使用 Ctrl+Enter 快速查询。",-1)]))):b("",!0)])]))}},At=me(St,[["__scopeId","data-v-411fd161"]]),Kt={class:"space-y-4 sm:space-y-6 md:space-y-8"},Mt={class:"grid grid-cols-1 items-stretch gap-3 sm:gap-4 md:gap-6 xl:grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)]"},Pt={class:"card-section"},Rt={class:"section-header"},Lt={class:"header-title"},It={key:0,class:"info-grid"},jt={class:"info-item"},Dt={class:"info-value"},qt={class:"info-item"},Ut={class:"info-value text-green-600 dark:text-emerald-400"},Et={key:0,class:"info-item"},Nt={class:"info-value text-red-500 dark:text-red-400"},Ot={class:"info-item"},Ft={class:"info-value"},Wt={class:"info-item"},Vt={class:"info-value"},zt={class:"info-item"},Bt={class:"info-value text-indigo-600 dark:text-indigo-300"},Gt={key:1,class:"info-item xl:col-span-2"},Ht={class:"space-y-2"},Jt={class:"truncate"},Qt={class:"font-semibold"},Yt={key:1,class:"info-grid"},Xt={class:"info-value flex items-center gap-1 break-all"},Zt={class:"info-item"},es={class:"info-item"},ts={class:"info-value"},ss={key:0,class:"info-item xl:col-span-2"},as={class:"flex flex-wrap gap-2"},rs={class:"info-item"},ls={class:"info-value break-all"},ns={class:"info-item xl:col-span-2"},os={class:"info-value"},is={class:"ml-2 text-xs text-gray-500 dark:text-gray-400"},ds={key:0,class:"text-red-500 dark:text-red-400"},us={key:1,class:"text-orange-500 dark:text-orange-400"},cs={key:2},ms={key:2,class:"text-gray-400 dark:text-gray-500"},gs={class:"card-section"},xs={class:"section-header"},ys={class:"header-tag"},fs={class:"metric-grid"},ps={class:"metric-card"},vs={class:"metric-value text-green-600 dark:text-emerald-300"},bs={class:"metric-label"},ks={class:"metric-card"},hs={class:"metric-value text-blue-600 dark:text-sky-300"},_s={class:"metric-label"},ws={class:"metric-card"},$s={class:"metric-value text-purple-600 dark:text-violet-300"},Cs={class:"metric-label"},Ts={class:"metric-card"},Ss={class:"metric-value text-amber-500 dark:text-amber-300"},As={class:"metric-label"},Ks={key:0,class:"card-section"},Ms={class:"flex items-center justify-between gap-3"},Ps={class:"flex items-center gap-3"},Rs={class:"account-name"},Ls={class:"account-sub"},Is={key:0,class:"mt-3 space-y-2"},js={class:"progress-row"},Ds={class:"progress-track"},qs={class:"progress-value"},Us={class:"flex flex-wrap items-center gap-2 text-xs text-gray-600 dark:text-gray-300"},Es={key:0,class:"font-medium text-indigo-600 dark:text-indigo-400"},Ns={key:1,class:"mt-3"},Os={key:0,class:"space-y-2"},Fs={class:"quota-header"},Ws={class:"quota-percent"},Vs={class:"progress-track"},zs={class:"quota-foot"},Bs={key:1,class:"rounded-xl bg-gray-100 px-3 py-2 text-xs text-gray-500 dark:bg-gray-800 dark:text-gray-300"},Gs={__name:"StatsOverview",setup(E){const K=ge(),{statsData:i,statsPeriod:_,currentPeriodData:g,multiKeyMode:v,aggregatedStats:h,individualStats:$,invalidKeys:M}=ce(K),L=j(()=>!$.value||$.value.length===0?[]:[...$.value].sort((r,s)=>{var m,A;return(((m=s.usage)==null?void 0:m.allTokens)||0)-(((A=r.usage)==null?void 0:A.allTokens)||0)}).slice(0,3)),w=j(()=>{var r;return((r=i.value)==null?void 0:r.serviceRates)&&Object.keys(i.value.serviceRates).length>0}),u=r=>{var m;return!h.value||!h.value.usage.allTokens?0:((((m=r.usage)==null?void 0:m.allTokens)||0)/h.value.usage.allTokens*100).toFixed(1)},x=r=>r?new Date(r).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",f=r=>r?new Date(r)<new Date:!1,c=r=>{if(!r)return!1;const A=(new Date(r)-new Date)/(1e3*60*60*24);return A>0&&A<=7},n=r=>{const s={claude:"Claude",gemini:"Gemini",codex:"Codex",droid:"Droid",bedrock:"Bedrock",azure:"Azure",ccr:"CCR"};if(!r)return"全部服务";let m=r;if(typeof r=="string"){if(r==="all"||r==="[]")return"全部服务";try{m=JSON.parse(r)}catch{return s[r]||r}}return Array.isArray(m)&&m.length===0?"全部服务":Array.isArray(m)?m.map(A=>s[A]||A).join(", "):s[r]||r},C=j(()=>{var m,A;const r=(A=(m=i.value)==null?void 0:m.accounts)==null?void 0:A.details;if(!r)return[];const s=[];return r.claude&&r.claude.accountType==="dedicated"&&s.push({key:"claude",...r.claude}),r.openai&&r.openai.accountType==="dedicated"&&s.push({key:"openai",...r.openai}),s}),P=j(()=>{const r=C.value.length;return r<=1?"md:grid-cols-1 lg:grid-cols-1":r===2?"md:grid-cols-2":"md:grid-cols-2 xl:grid-cols-3"}),D=r=>r?r.platform==="openai"?"OpenAI 专属账号":"Claude 专属账号":"专属账号",U=r=>{if(!r||r<=0)return"";const s=Math.floor(r),m=Math.floor(s/1440),A=Math.floor(s%1440/60),N=s%60;return m>0?A>0?`${m}${A}小时`:`${m}`:A>0?N>0?`${A}小时${N}分钟`:`${A}小时`:`${N}分钟`},F=r=>{if(!r)return{text:"状态未知",class:"text-gray-400"};if(r.isRateLimited){const s=U(r.minutesRemaining);return{text:`限流中${s?` · 剩余约 ${s}`:""}`,class:"text-red-500 dark:text-red-400"}}return{text:"未限流",class:"text-green-600 dark:text-emerald-400"}},Q=(r,s)=>{if(!r||!s)return"暂无时间窗口信息";const m=new Date(r),A=new Date(s),N=B=>`${`${B.getHours()}`.padStart(2,"0")}:${`${B.getMinutes()}`.padStart(2,"0")}`;return`${N(m)} - ${N(A)}`},W=r=>{if(!r||r<=0)return"";const s=Math.floor(r/60),m=r%60;return s>0?`${s}小时${m}分钟`:`${m}分钟`},G=(r,s)=>{var A;if(!r)return"bg-gradient-to-r from-blue-500 to-indigo-500";if((A=s==null?void 0:s.rateLimitStatus)!=null&&A.isRateLimited)return"bg-gradient-to-r from-red-500 to-red-600";const m=String(r).toLowerCase();return m==="rejected"?"bg-gradient-to-r from-red-500 to-red-600":m==="allowed_warning"?"bg-gradient-to-r from-yellow-500 to-orange-500":"bg-gradient-to-r from-blue-500 to-indigo-500"},te=r=>{if(!r)return null;const s=typeof r.usedPercent=="number"&&!Number.isNaN(r.usedPercent)?r.usedPercent:null,m=typeof r.resetAfterSeconds=="number"&&!Number.isNaN(r.resetAfterSeconds)?r.resetAfterSeconds:null,A=typeof r.remainingSeconds=="number"?r.remainingSeconds:null,N=r.resetAt?Date.parse(r.resetAt):null;return m!==null&&(A!==null&&A<=0||N!==null&&!Number.isNaN(N)&&Date.now()>=N)?0:s===null?null:Math.max(0,Math.min(100,s))},ne=r=>{const s=te(r);return s===null?"bg-gradient-to-r from-gray-300 to-gray-400":s>=90?"bg-gradient-to-r from-red-500 to-red-600":s>=75?"bg-gradient-to-r from-yellow-500 to-orange-500":"bg-gradient-to-r from-emerald-500 to-teal-500"},oe=r=>{const s=te(r);return s===null?"0%":`${s}%`},Y=r=>{const s=te(r);return s===null?"--":`${s.toFixed(1)}%`},Z=r=>{if(!r)return"--";let s=r.remainingSeconds;if(s==null&&(s=r.resetAfterSeconds),s==null||Number.isNaN(Number(s)))return"--";s=Math.max(0,Math.floor(Number(s)));const m=Math.floor(s/86400),A=Math.floor(s%86400/3600),N=Math.floor(s%3600/60),B=s%60;return m>0?A>0?`${m}${A}小时`:`${m}`:A>0?N>0?`${A}小时${N}分钟`:`${A}小时`:N>0?`${N}分钟`:`${B}`},H=r=>r==="secondary"?"周限":"5h";return(r,s)=>(a(),l("div",Kt,[e("div",Mt,[e("div",Pt,[e("header",Rt,[e("i",{class:R(["header-icon",t(v)?"fas fa-layer-group text-purple-500":"fas fa-info-circle text-blue-500"])},null,2),e("h3",Lt,o(t(v)?"批量查询概要":"API Key 信息"),1)]),t(v)&&t(h)?(a(),l("div",It,[e("div",jt,[s[1]||(s[1]=e("p",{class:"info-label"},"查询 Keys 数",-1)),e("p",Dt,o(t(h).totalKeys)+" 个",1)]),e("div",qt,[s[3]||(s[3]=e("p",{class:"info-label"},"有效 Keys 数",-1)),e("p",Ut,[s[2]||(s[2]=e("i",{class:"fas fa-check-circle mr-1"},null,-1)),k(o(t(h).activeKeys)+" 个 ",1)])]),t(M).length>0?(a(),l("div",Et,[s[5]||(s[5]=e("p",{class:"info-label"},"无效 Keys 数",-1)),e("p",Nt,[s[4]||(s[4]=e("i",{class:"fas fa-times-circle mr-1"},null,-1)),k(o(t(M).length)+" 个 ",1)])])):b("",!0),e("div",Ot,[s[6]||(s[6]=e("p",{class:"info-label"},"总请求数",-1)),e("p",Ft,o(t(O)(t(h).usage.requests)),1)]),e("div",Wt,[s[7]||(s[7]=e("p",{class:"info-label"},"总 Token 数",-1)),e("p",Vt,o(t(O)(t(h).usage.allTokens)),1)]),e("div",zt,[s[8]||(s[8]=e("p",{class:"info-label"},"总费用",-1)),e("p",Bt,o(t(h).usage.formattedCost),1)]),t($).length>1?(a(),l("div",Gt,[s[9]||(s[9]=e("p",{class:"info-label"},"Top 3 贡献占比",-1)),e("div",Ht,[(a(!0),l(X,null,se(L.value,m=>(a(),l("div",{key:m.apiId,class:"contributor-item"},[e("span",Jt,o(m.name),1),e("span",Qt,o(u(m))+"%",1)]))),128))])])):b("",!0)])):(a(),l("div",Yt,[e("div",{class:"info-item cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-700/50",title:"点击复制",onClick:s[0]||(s[0]=m=>t(Ee)(t(i).name))},[s[11]||(s[11]=e("p",{class:"info-label"},"名称",-1)),e("p",Xt,[k(o(t(i).name)+" ",1),s[10]||(s[10]=e("i",{class:"fas fa-copy text-xs text-gray-400"},null,-1))])]),e("div",Zt,[s[12]||(s[12]=e("p",{class:"info-label"},"状态",-1)),e("p",{class:R(["info-value font-semibold",t(i).isActive?"text-green-600 dark:text-emerald-400":"text-red-500 dark:text-red-400"])},[e("i",{class:R(["mr-1",t(i).isActive?"fas fa-check-circle":"fas fa-times-circle"])},null,2),k(" "+o(t(i).isActive?"活跃":"已停用"),1)],2)]),e("div",es,[s[13]||(s[13]=e("p",{class:"info-label"},"权限",-1)),e("p",ts,o(n(t(i).permissions)),1)]),w.value?(a(),l("div",ss,[s[14]||(s[14]=e("p",{class:"info-label"},"服务倍率",-1)),e("div",as,[(a(!0),l(X,null,se(t(i).serviceRates,(m,A)=>(a(),l("span",{key:A,class:"inline-flex items-center rounded-full bg-purple-100 px-2.5 py-0.5 text-xs font-medium text-purple-800 dark:bg-purple-900/30 dark:text-purple-300"},o(A)+": "+o(m)+"x ",1))),128))])])):b("",!0),e("div",rs,[s[15]||(s[15]=e("p",{class:"info-label"},"创建时间",-1)),e("p",ls,o(t(Ye)(t(i).createdAt)),1)]),e("div",ns,[s[20]||(s[20]=e("p",{class:"info-label"},"过期时间",-1)),e("div",os,[t(i).expirationMode==="activation"&&!t(i).isActivated?(a(),l(X,{key:0},[s[16]||(s[16]=e("span",{class:"text-amber-600 dark:text-amber-400"},[e("i",{class:"fas fa-pause-circle mr-1"}),k("未激活 ")],-1)),e("span",is," 首次使用后 "+o(t(i).activationDays||(t(i).activationUnit==="hours"?24:30))+" "+o(t(i).activationUnit==="hours"?"小时":"天")+"过期 ",1)],64)):t(i).expiresAt?(a(),l(X,{key:1},[f(t(i).expiresAt)?(a(),l("span",ds,s[17]||(s[17]=[e("i",{class:"fas fa-exclamation-circle mr-1"},null,-1),k("已过期 ",-1)]))):c(t(i).expiresAt)?(a(),l("span",us,[s[18]||(s[18]=e("i",{class:"fas fa-clock mr-1"},null,-1)),k(o(x(t(i).expiresAt)),1)])):(a(),l("span",cs,o(x(t(i).expiresAt)),1))],64)):(a(),l("span",ms,s[19]||(s[19]=[e("i",{class:"fas fa-infinity mr-1"},null,-1),k("永不过期 ",-1)])))])])]))]),e("div",gs,[e("header",xs,[s[21]||(s[21]=e("i",{class:"header-icon fas fa-chart-bar text-green-500"},null,-1)),s[22]||(s[22]=e("h3",{class:"header-title"},"使用统计概览",-1)),e("span",ys,o(t(_)==="daily"?"今日":"本月"),1)]),e("div",fs,[e("div",ps,[e("p",vs,o(t(O)(t(g).requests)),1),e("p",bs,o(t(_)==="daily"?"今日":"本月")+"请求数",1)]),e("div",ks,[e("p",hs,o(t(O)(t(g).allTokens)),1),e("p",_s,o(t(_)==="daily"?"今日":"本月")+"Token 数",1)]),e("div",ws,[e("p",$s,o(t(g).formattedCost||"$0.000000"),1),e("p",Cs,o(t(_)==="daily"?"今日":"本月")+"费用",1)]),e("div",Ts,[e("p",Ss,o(t(O)(t(g).inputTokens)),1),e("p",As,o(t(_)==="daily"?"今日":"本月")+"输入 Token",1)])])])]),!t(v)&&C.value.length>0?(a(),l("div",Ks,[s[24]||(s[24]=e("header",{class:"section-header"},[e("i",{class:"header-icon fas fa-plug text-indigo-500"}),e("h3",{class:"header-title"},"专属账号运行状态"),e("span",{class:"header-tag"},"实时更新")],-1)),e("div",{class:R(["grid grid-cols-1 gap-4",P.value])},[(a(!0),l(X,null,se(C.value,m=>{var A,N,B,de,re,ie;return a(),l("div",{key:m.id||m.key,class:"account-card"},[e("div",Ms,[e("div",Ps,[e("span",{class:R(["account-icon",m.platform==="claude"?"icon-claude":"icon-openai"])},[e("i",{class:R(m.platform==="claude"?"fas fa-meteor":"fas fa-robot")},null,2)],2),e("div",null,[e("p",Rs,o(D(m)),1),e("p",Ls,o(m.platform==="claude"?"会话窗口":"额度窗口"),1)])]),F(m.rateLimitStatus)?(a(),l("div",{key:0,class:R(["rate-badge",F(m.rateLimitStatus).class])},[s[23]||(s[23]=e("i",{class:"fas fa-tachometer-alt mr-1"},null,-1)),k(" "+o(F(m.rateLimitStatus).text),1)],2)):b("",!0)]),m.platform==="claude"?(a(),l("div",Is,[e("div",js,[e("div",Ds,[e("div",{class:R(["progress-bar",G((A=m.sessionWindow)==null?void 0:A.sessionWindowStatus,m)]),style:be({width:`${Math.min(100,Math.max(0,((N=m.sessionWindow)==null?void 0:N.progress)||0))}%`})},null,6)]),e("span",qs,o(Math.min(100,Math.max(0,Math.round(((B=m.sessionWindow)==null?void 0:B.progress)||0))))+"% ",1)]),e("div",Us,[e("span",null,o(Q((de=m.sessionWindow)==null?void 0:de.windowStart,(re=m.sessionWindow)==null?void 0:re.windowEnd)),1),((ie=m.sessionWindow)==null?void 0:ie.remainingTime)>0?(a(),l("span",Es," 剩余 "+o(W(m.sessionWindow.remainingTime)),1)):b("",!0)])])):m.platform==="openai"?(a(),l("div",Ns,[m.codexUsage?(a(),l("div",Os,[(a(),l(X,null,se(["primary","secondary"],J=>{var ae,ue,ye,fe;return e("div",{key:`${m.key}-${J}`,class:"quota-row"},[e("div",Fs,[e("span",{class:R(["quota-tag",J==="primary"?"tag-indigo":"tag-blue"])},o(H(J)),3),e("span",Ws,o(Y((ae=m.codexUsage)==null?void 0:ae[J])),1)]),e("div",Vs,[e("div",{class:R(["progress-bar",ne((ue=m.codexUsage)==null?void 0:ue[J])]),style:be({width:oe((ye=m.codexUsage)==null?void 0:ye[J])})},null,6)]),e("div",zs," 重置剩余 "+o(Z((fe=m.codexUsage)==null?void 0:fe[J])),1)])}),64))])):(a(),l("p",Bs," 暂无额度使用数据 "))])):b("",!0)])}),128))],2)])):b("",!0)]))}},Hs=me(Gs,[["__scopeId","data-v-99d8ab54"]]),Js={class:"card p-3 sm:p-4 md:p-6"},Qs={class:"mb-2 flex flex-col text-base font-bold text-gray-900 dark:text-gray-100 sm:mb-3 sm:flex-row sm:items-center sm:text-lg md:mb-4 md:text-xl"},Ys={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Xs={class:"space-y-2 md:space-y-3"},Zs={class:"flex items-center justify-between"},ea={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},ta={class:"flex items-center justify-between"},sa={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},aa={class:"flex items-center justify-between"},ra={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},la={class:"flex items-center justify-between"},na={class:"text-sm font-medium text-gray-900 dark:text-gray-100 md:text-base"},oa={class:"mt-3 border-t border-gray-200 pt-3 dark:border-gray-700 md:mt-4 md:pt-4"},ia={class:"flex items-center justify-between font-bold text-gray-900 dark:text-gray-100"},da={class:"text-sm md:text-base"},ua={class:"text-lg md:text-xl"},ca={__name:"TokenDistribution",setup(E){const K=ge(),{statsPeriod:i,currentPeriodData:_}=ce(K);return(g,v)=>(a(),l("div",Js,[e("h3",Qs,[v[0]||(v[0]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-coins mr-2 text-sm text-yellow-500 md:mr-3 md:text-base"}),k(" Token 使用分布 ")],-1)),e("span",Ys,"("+o(t(i)==="daily"?"今日":"本月")+")",1)]),e("div",Xs,[e("div",Zs,[v[1]||(v[1]=e("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[e("i",{class:"fas fa-arrow-right mr-1 text-xs text-green-500 md:mr-2 md:text-sm"}),k(" 输入 Token ")],-1)),e("span",ea,o(t(O)(t(_).inputTokens)),1)]),e("div",ta,[v[2]||(v[2]=e("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[e("i",{class:"fas fa-arrow-left mr-1 text-xs text-blue-500 md:mr-2 md:text-sm"}),k(" 输出 Token ")],-1)),e("span",sa,o(t(O)(t(_).outputTokens)),1)]),e("div",aa,[v[3]||(v[3]=e("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[e("i",{class:"fas fa-save mr-1 text-xs text-purple-500 md:mr-2 md:text-sm"}),k(" 缓存创建 Token ")],-1)),e("span",ra,o(t(O)(t(_).cacheCreateTokens)),1)]),e("div",la,[v[4]||(v[4]=e("span",{class:"flex items-center text-sm text-gray-600 dark:text-gray-400 md:text-base"},[e("i",{class:"fas fa-download mr-1 text-xs text-orange-500 md:mr-2 md:text-sm"}),k(" 缓存读取 Token ")],-1)),e("span",na,o(t(O)(t(_).cacheReadTokens)),1)])]),e("div",oa,[e("div",ia,[e("span",da,o(t(i)==="daily"?"今日":"本月")+"总计",1),e("span",ua,o(t(O)(t(_).allTokens)),1)])])]))}},ma=me(ca,[["__scopeId","data-v-f3f6aa17"]]),ga={class:"flex h-full flex-col gap-3 sm:gap-4 md:gap-6"},xa={class:"card flex h-full flex-col p-3 sm:p-4 md:p-6"},ya={class:"mb-2 flex items-center text-base font-bold text-gray-900 dark:text-gray-100 sm:mb-3 sm:text-lg md:mb-4 md:text-xl"},fa={key:0,class:"space-y-4"},pa={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"},va={class:"mb-3 flex items-center justify-between"},ba={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"},ka={class:"grid grid-cols-2 gap-3"},ha={class:"text-center"},_a={class:"text-lg font-bold text-gray-900 dark:text-gray-100"},wa={class:"text-center"},$a={class:"text-lg font-bold text-green-600"},Ca={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"},Ta={class:"space-y-2"},Sa={class:"flex items-center justify-between"},Aa={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},Ka={class:"flex items-center justify-between"},Ma={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},Pa={class:"flex items-center justify-between"},Ra={class:"text-sm font-medium text-gray-900 dark:text-gray-100"},La={key:0,class:"rounded-lg bg-red-50 p-3 text-sm dark:bg-red-900/20"},Ia={class:"text-red-700 dark:text-red-300"},ja={key:1,class:"space-y-4 md:space-y-5"},Da={class:"mb-2 flex items-center justify-between"},qa={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},Ua={key:0},Ea={key:1,class:"flex items-center gap-1"},Na={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Oa={key:1,class:"h-2 w-full rounded-full bg-gray-200"},Fa={class:"mb-2 flex items-center justify-between"},Wa={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},Va={key:0},za={key:1,class:"flex items-center gap-1"},Ba={key:0,class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Ga={key:1,class:"h-2 w-full rounded-full bg-gray-200"},Ha={key:0},Ja={class:"mb-2 flex items-center justify-between"},Qa={class:"text-xs text-gray-500 dark:text-gray-400 md:text-sm"},Ya={class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Xa={key:1},Za={class:"mt-2 text-xs text-gray-500 dark:text-gray-400"},er={key:0},tr={key:1},sr={key:2},ar={class:"space-y-4 border-t border-gray-100 pt-3 dark:border-gray-700"},rr={class:"flex items-center justify-between"},lr={class:"text-sm font-medium text-gray-900 md:text-base"},nr={key:0},or={key:1,class:"flex items-center gap-1"},ir={class:"flex items-center justify-between"},dr={class:"text-sm font-medium text-gray-900 md:text-base"},ur={key:0,class:"text-orange-600"},cr={key:1,class:"text-green-600"},mr={class:"space-y-2"},gr={class:"flex items-center justify-between"},xr={class:"text-sm font-medium text-gray-900 md:text-base"},yr={key:0,class:"text-orange-600"},fr={key:1,class:"text-green-600"},pr={key:0,class:"flex flex-wrap gap-2 rounded-lg bg-blue-50 p-2 dark:bg-blue-900/20 md:p-3"},vr={key:0,class:"card !overflow-visible p-4 md:p-6"},br={class:"rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20 md:p-4"},kr={class:"max-h-64 space-y-1 overflow-y-auto pr-1 md:max-h-80 md:space-y-2"},hr={class:"break-all text-gray-800 dark:text-gray-200"},_r={__name:"LimitConfig",setup(E){const K=ge(),{statsData:i,multiKeyMode:_,aggregatedStats:g,invalidKeys:v}=ce(K),h=j(()=>{var n;const c=(n=i.value)==null?void 0:n.restrictions;return c?c.enableModelRestriction===!0&&Array.isArray(c.restrictedModels)&&c.restrictedModels.length>0:!1}),$=j(()=>{var n;const c=(n=i.value)==null?void 0:n.restrictions;return c?c.enableClientRestriction===!0&&Array.isArray(c.allowedClients)&&c.allowedClients.length>0:!1}),M=()=>{if(!i.value.limits.dailyCostLimit||i.value.limits.dailyCostLimit===0)return 0;const c=i.value.limits.currentDailyCost/i.value.limits.dailyCostLimit*100;return Math.min(c,100)},L=()=>{const c=M();return c>=100?"bg-red-500":c>=80?"bg-yellow-500":"bg-green-500"},w=()=>{if(!i.value.limits.totalCostLimit||i.value.limits.totalCostLimit===0)return 0;const c=i.value.limits.currentTotalCost/i.value.limits.totalCostLimit*100;return Math.min(c,100)},u=()=>{const c=w();return c>=100?"bg-red-500":c>=80?"bg-yellow-500":"bg-blue-500"},x=()=>{if(!i.value.limits.weeklyOpusCostLimit||i.value.limits.weeklyOpusCostLimit===0)return 0;const c=i.value.limits.weeklyOpusCost/i.value.limits.weeklyOpusCostLimit*100;return Math.min(c,100)},f=()=>{const c=x();return c>=100?"bg-red-500":c>=80?"bg-yellow-500":"bg-indigo-500"};return(c,n)=>{var C;return a(),l("div",ga,[e("div",xa,[e("h3",ya,[n[0]||(n[0]=e("i",{class:"fas fa-shield-alt mr-2 text-sm text-red-500 md:mr-3 md:text-base"},null,-1)),k(" "+o(t(_)?"限制配置(聚合查询模式)":"限制配置"),1)]),t(_)&&t(g)?(a(),l("div",fa,[e("div",pa,[e("div",va,[n[1]||(n[1]=e("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},[e("i",{class:"fas fa-layer-group mr-2 text-blue-500"}),k(" API Keys 概况 ")],-1)),e("span",ba,o(t(g).activeKeys)+"/"+o(t(g).totalKeys),1)]),e("div",ka,[e("div",ha,[e("div",_a,o(t(g).totalKeys),1),n[2]||(n[2]=e("div",{class:"text-xs text-gray-600 dark:text-gray-400"},"总计 Keys",-1))]),e("div",wa,[e("div",$a,o(t(g).activeKeys),1),n[3]||(n[3]=e("div",{class:"text-xs text-gray-600 dark:text-gray-400"},"激活 Keys",-1))])])]),e("div",Ca,[n[7]||(n[7]=e("div",{class:"mb-3 flex items-center"},[e("i",{class:"fas fa-chart-pie mr-2 text-purple-500"}),e("span",{class:"text-sm font-medium text-gray-700 dark:text-gray-300"},"聚合统计摘要")],-1)),e("div",Ta,[e("div",Sa,[n[4]||(n[4]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400"},[e("i",{class:"fas fa-database mr-1 text-gray-400"}),k(" 总请求数 ")],-1)),e("span",Aa,o(t(O)(t(g).usage.requests)),1)]),e("div",Ka,[n[5]||(n[5]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400"},[e("i",{class:"fas fa-coins mr-1 text-yellow-500"}),k(" 总 Tokens ")],-1)),e("span",Ma,o(t(O)(t(g).usage.allTokens)),1)]),e("div",Pa,[n[6]||(n[6]=e("span",{class:"text-xs text-gray-600 dark:text-gray-400"},[e("i",{class:"fas fa-dollar-sign mr-1 text-green-500"}),k(" 总费用 ")],-1)),e("span",Ra,o(t(g).usage.formattedCost),1)])])]),t(v)&&t(v).length>0?(a(),l("div",La,[n[8]||(n[8]=e("i",{class:"fas fa-exclamation-triangle mr-2 text-red-600 dark:text-red-400"},null,-1)),e("span",Ia,o(t(v).length)+" 个无效的 API Key ",1)])):b("",!0),n[9]||(n[9]=e("div",{class:"rounded-lg bg-gray-50 p-3 text-xs text-gray-600 dark:bg-gray-800 dark:text-gray-400"},[e("i",{class:"fas fa-info-circle mr-1"}),k(" 每个 API Key 有独立的限制设置,聚合模式下不显示单个限制配置 ")],-1))])):b("",!0),!t(_)&&((C=t(i))!=null&&C.limits)?(a(),l("div",ja,[e("div",null,[e("div",Da,[n[11]||(n[11]=e("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"每日费用限制",-1)),e("span",qa,[t(i).limits.dailyCostLimit>0?(a(),l("span",Ua," $"+o(t(i).limits.currentDailyCost.toFixed(4))+" / $"+o(t(i).limits.dailyCostLimit.toFixed(2)),1)):(a(),l("span",Ea,[k(" $"+o(t(i).limits.currentDailyCost.toFixed(4))+" / ",1),n[10]||(n[10]=e("i",{class:"fas fa-infinity"},null,-1))]))])]),t(i).limits.dailyCostLimit>0?(a(),l("div",Na,[e("div",{class:R(["h-2 rounded-full transition-all duration-300",L()]),style:be({width:M()+"%"})},null,6)])):(a(),l("div",Oa,n[12]||(n[12]=[e("div",{class:"h-2 rounded-full bg-green-500",style:{width:"0%"}},null,-1)])))]),e("div",null,[e("div",Fa,[n[14]||(n[14]=e("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"总费用限制",-1)),e("span",Wa,[t(i).limits.totalCostLimit>0?(a(),l("span",Va," $"+o(t(i).limits.currentTotalCost.toFixed(4))+" / $"+o(t(i).limits.totalCostLimit.toFixed(2)),1)):(a(),l("span",za,[k(" $"+o(t(i).limits.currentTotalCost.toFixed(4))+" / ",1),n[13]||(n[13]=e("i",{class:"fas fa-infinity"},null,-1))]))])]),t(i).limits.totalCostLimit>0?(a(),l("div",Ba,[e("div",{class:R(["h-2 rounded-full transition-all duration-300",u()]),style:be({width:w()+"%"})},null,6)])):(a(),l("div",Ga,n[15]||(n[15]=[e("div",{class:"h-2 rounded-full bg-blue-500",style:{width:"0%"}},null,-1)])))]),t(i).limits.weeklyOpusCostLimit>0?(a(),l("div",Ha,[e("div",Ja,[n[16]||(n[16]=e("span",{class:"text-sm font-medium text-gray-600 dark:text-gray-400 md:text-base"},"Claude 模型周费用限制",-1)),e("span",Qa," $"+o(t(i).limits.weeklyOpusCost.toFixed(4))+" / $"+o(t(i).limits.weeklyOpusCostLimit.toFixed(2)),1)]),e("div",Ya,[e("div",{class:R(["h-2 rounded-full transition-all duration-300",f()]),style:be({width:x()+"%"})},null,6)])])):b("",!0),t(i).limits.rateLimitWindow>0&&(t(i).limits.rateLimitRequests>0||t(i).limits.tokenLimit>0||t(i).limits.rateLimitCost>0)?(a(),l("div",Xa,[ee(nt,{"cost-limit":t(i).limits.rateLimitCost,"current-cost":t(i).limits.currentWindowCost,"current-requests":t(i).limits.currentWindowRequests,"current-tokens":t(i).limits.currentWindowTokens,label:"时间窗口限制","rate-limit-window":t(i).limits.rateLimitWindow,"request-limit":t(i).limits.rateLimitRequests,"show-progress":!0,"show-tooltip":!0,"token-limit":t(i).limits.tokenLimit,"window-end-time":t(i).limits.windowEndTime,"window-remaining-seconds":t(i).limits.windowRemainingSeconds,"window-start-time":t(i).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"]),e("div",Za,[n[17]||(n[17]=e("i",{class:"fas fa-info-circle mr-1"},null,-1)),t(i).limits.rateLimitCost>0?(a(),l("span",er,' 请求次数和费用限制为"或"的关系,任一达到限制即触发限流 ')):t(i).limits.tokenLimit>0?(a(),l("span",tr,' 请求次数和Token使用量为"或"的关系,任一达到限制即触发限流 ')):(a(),l("span",sr," 仅限制请求次数 "))])])):b("",!0),e("div",ar,[e("div",rr,[n[19]||(n[19]=e("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"并发限制",-1)),e("span",lr,[t(i).limits.concurrencyLimit>0?(a(),l("span",nr,o(t(i).limits.concurrencyLimit),1)):(a(),l("span",or,n[18]||(n[18]=[e("i",{class:"fas fa-infinity text-gray-400"},null,-1)])))])]),e("div",ir,[n[22]||(n[22]=e("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"模型限制",-1)),e("span",dr,[h.value?(a(),l("span",ur,[n[20]||(n[20]=e("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),k(" 限制 "+o(t(i).restrictions.restrictedModels.length)+" 个模型 ",1)])):(a(),l("span",cr,n[21]||(n[21]=[e("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),k(" 允许所有模型 ",-1)])))])]),e("div",mr,[e("div",gr,[n[25]||(n[25]=e("span",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"客户端限制",-1)),e("span",xr,[$.value?(a(),l("span",yr,[n[23]||(n[23]=e("i",{class:"fas fa-exclamation-triangle mr-1 text-xs md:text-sm"},null,-1)),k(" 限 "+o(t(i).restrictions.allowedClients.length)+" 种客户端使用 ",1)])):(a(),l("span",fr,n[24]||(n[24]=[e("i",{class:"fas fa-check-circle mr-1 text-xs md:text-sm"},null,-1),k(" 允许所有客户端 ",-1)])))])]),$.value?(a(),l("div",pr,[(a(!0),l(X,null,se(t(i).restrictions.allowedClients,P=>(a(),l("span",{key:P,class:"flex items-center gap-1 rounded-full bg-white px-2 py-1 text-xs text-blue-700 shadow-sm dark:bg-gray-800 dark:text-blue-300 md:text-sm"},[n[26]||(n[26]=e("i",{class:"fas fa-id-badge"},null,-1)),k(" "+o(P),1)]))),128))])):b("",!0)])])])):b("",!0)]),h.value?(a(),l("div",vr,[n[30]||(n[30]=e("h3",{class:"mb-3 flex items-center text-lg font-bold text-gray-900 dark:text-gray-100 md:mb-4 md:text-xl"},[e("i",{class:"fas fa-list-alt mr-2 text-sm text-amber-500 md:mr-3 md:text-base"}),k(" 详细限制信息 ")],-1)),e("div",br,[n[28]||(n[28]=e("h4",{class:"mb-2 flex items-center text-sm font-bold text-amber-800 dark:text-amber-300 md:mb-3 md:text-base"},[e("i",{class:"fas fa-robot mr-1 text-xs md:mr-2 md:text-sm"}),k(" 受限模型列表 ")],-1)),e("div",kr,[(a(!0),l(X,null,se(t(i).restrictions.restrictedModels,P=>(a(),l("div",{key:P,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]=e("i",{class:"fas fa-ban mr-1 text-xs text-red-500 md:mr-2"},null,-1)),e("span",hr,o(P),1)]))),128))]),n[29]||(n[29]=e("p",{class:"mt-2 text-xs text-amber-700 dark:text-amber-400 md:mt-3"},[e("i",{class:"fas fa-info-circle mr-1"}),k(" 此 API Key 不能访问以上列出的模型 ")],-1))])])):b("",!0)])}}},wr=me(_r,[["__scopeId","data-v-e03e5fe5"]]),$r={class:"card h-full p-4 md:p-6"},Cr={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"},Tr={class:"text-xs font-normal text-gray-600 dark:text-gray-400 sm:ml-2 md:text-sm"},Sr={key:0,class:"space-y-2 md:space-y-3"},Ar={class:"mb-1 flex items-center justify-between text-sm"},Kr={class:"truncate font-medium text-gray-700 dark:text-gray-300"},Mr={class:"text-xs text-gray-600 dark:text-gray-400"},Pr={class:"h-2 w-full rounded-full bg-gray-200 dark:bg-gray-700"},Rr={class:"mt-1 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"},Lr={key:0,class:"border-t border-gray-200 pt-2 dark:border-gray-700"},Ir={class:"flex items-center justify-between text-sm text-gray-600 dark:text-gray-400"},jr={key:1,class:"flex h-32 items-center justify-center text-sm text-gray-500 dark:text-gray-400"},Dr={key:2,class:"flex h-32 items-center justify-center text-sm text-gray-500 dark:text-gray-400"},qr={__name:"AggregatedStatsCard",setup(E){const K=ge(),{aggregatedStats:i,individualStats:_,statsPeriod:g,multiKeyMode:v}=ce(K),h=x=>x?g.value==="daily"?x.dailyUsage||x.usage:x.monthlyUsage||x.usage:null,$=j(()=>!_.value||_.value.length===0?[]:[..._.value].sort((x,f)=>{const c=h(x),n=h(f);return((n==null?void 0:n.cost)||0)-((c==null?void 0:c.cost)||0)}).slice(0,5)),M=j(()=>_.value?Math.max(0,_.value.length-5):0),L=j(()=>{var n,C;if(!_.value||!i.value)return 0;const x=$.value.reduce((P,D)=>{const U=h(D);return P+((U==null?void 0:U.cost)||0)},0),f=g.value==="daily"?((n=i.value.dailyUsage)==null?void 0:n.cost)||0:((C=i.value.monthlyUsage)==null?void 0:C.cost)||0;if(f===0)return 0;const c=f-x;return Math.max(0,Math.round(c/f*100))}),w=x=>{var C,P;if(!i.value)return 0;const f=g.value==="daily"?((C=i.value.dailyUsage)==null?void 0:C.cost)||0:((P=i.value.monthlyUsage)==null?void 0:P.cost)||0;if(f===0)return 0;const c=h(x),n=((c==null?void 0:c.cost)||0)/f*100;return Math.round(n)},u=x=>["bg-blue-500","bg-green-500","bg-purple-500","bg-yellow-500","bg-pink-500"][x]||"bg-gray-400";return(x,f)=>(a(),l("div",$r,[e("h3",Cr,[f[0]||(f[0]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-chart-pie mr-2 text-sm text-orange-500 md:mr-3 md:text-base"}),k(" 使用占比 ")],-1)),e("span",Tr,"("+o(t(g)==="daily"?"今日":"本月")+")",1)]),t(i)&&t(_).length>0?(a(),l("div",Sr,[(a(!0),l(X,null,se($.value,(c,n)=>{var C,P;return a(),l("div",{key:c.apiId,class:"relative"},[e("div",Ar,[e("span",Kr,o(c.name||`Key ${n+1}`),1),e("span",Mr,o(w(c))+"% ",1)]),e("div",Pr,[e("div",{class:R(["h-2 rounded-full transition-all duration-300",u(n)]),style:be({width:w(c)+"%"})},null,6)]),e("div",Rr,[e("span",null,o(t(O)(((C=h(c))==null?void 0:C.requests)||0))+"次",1),e("span",null,o(((P=h(c))==null?void 0:P.formattedCost)||"$0.00"),1)])])}),128)),M.value>0?(a(),l("div",Lr,[e("div",Ir,[e("span",null,"其他 "+o(M.value)+" 个Keys",1),e("span",null,o(L.value)+"%",1)])])):b("",!0)])):t(v)?(a(),l("div",Dr,f[2]||(f[2]=[e("i",{class:"fas fa-chart-pie mr-2"},null,-1),k(" 暂无数据 ",-1)]))):(a(),l("div",jr,f[1]||(f[1]=[e("div",{class:"text-center"},[e("i",{class:"fas fa-chart-pie mb-2 text-2xl"}),e("p",null,"使用占比仅在多Key查询时显示")],-1)])))]))}},Ur=me(qr,[["__scopeId","data-v-37821008"]]),Er={class:"card p-3 sm:p-4 md:p-6"},Nr={class:"mb-2 sm:mb-3 md:mb-4"},Or={class:"flex flex-col text-base font-bold text-gray-900 dark:text-gray-100 sm:flex-row sm:items-center sm:text-lg md:text-xl"},Fr={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"},Vr={key:1,class:"space-y-2"},zr={class:"flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between"},Br={class:"flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-3"},Gr=["onClick"],Hr={class:"flex flex-wrap gap-x-2 text-xs text-gray-500 dark:text-gray-400"},Jr={key:0},Qr={key:1},Yr={class:"flex-shrink-0 text-xs sm:text-sm"},Xr={class:"ml-1 font-semibold text-green-600"},Zr={class:"ml-1 font-semibold text-amber-600 dark:text-amber-400"},el={key:2,class:"py-6 text-center text-gray-500 dark:text-gray-400 md:py-8"},tl={class:"text-sm md:text-base"},sl={__name:"ModelUsageStats",props:{period:{type:String,default:"daily",validator:E=>["daily","monthly","alltime"].includes(E)}},setup(E){const K=E,i=ge(),{dailyModelStats:_,monthlyModelStats:g,alltimeModelStats:v,modelStatsLoading:h,serviceRates:$}=ce(i),M=j(()=>K.period==="daily"?_.value:K.period==="monthly"?g.value:K.period==="alltime"?v.value:[]),L=j(()=>h.value),w=j(()=>K.period==="daily"?"今日":K.period==="monthly"?"本月":K.period==="alltime"?"所有时间":""),u=c=>Ee(c,"模型名称已复制"),x=c=>{if(!c)return"claude";const n=c.toLowerCase();return n.includes("claude")||n.includes("sonnet")||n.includes("opus")||n.includes("haiku")?"claude":n.includes("gpt")||n.includes("o1")||n.includes("o3")||n.includes("o4")?"codex":n.includes("gemini")?"gemini":n.includes("droid")||n.includes("factory")?"droid":n.includes("bedrock")||n.includes("amazon")?"bedrock":n.includes("azure")?"azure":"claude"},f=c=>{var U,F,Q;if(!c.isLegacy&&((U=c.costs)==null?void 0:U.rated)!==void 0){const W=c.costs.rated;return W>=1?"$"+W.toFixed(2):W>=.01?"$"+W.toFixed(4):"$"+W.toFixed(6)}const n=((F=c.costs)==null?void 0:F.total)||0;if(!n||!((Q=$.value)!=null&&Q.rates))return"$0.00";const C=x(c.model),P=$.value.rates[C]||1,D=n*P;return D>=1?"$"+D.toFixed(2):D>=.01?"$"+D.toFixed(4):"$"+D.toFixed(6)};return(c,n)=>(a(),l("div",Er,[e("div",Nr,[e("h3",Or,[n[0]||(n[0]=e("span",{class:"flex items-center"},[e("i",{class:"fas fa-robot mr-2 text-sm text-indigo-500 md:mr-3 md:text-base"}),k(" 模型使用统计 ")],-1)),e("span",Fr,"("+o(w.value)+")",1)])]),L.value?(a(),l("div",Wr,n[1]||(n[1]=[e("i",{class:"fas fa-spinner loading-spinner mb-2 text-xl text-gray-600 dark:text-gray-400 md:text-2xl"},null,-1),e("p",{class:"text-sm text-gray-600 dark:text-gray-400 md:text-base"},"加载模型统计数据中...",-1)]))):M.value.length>0?(a(),l("div",Vr,[(a(!0),l(X,null,se(M.value,(C,P)=>{var D,U;return a(),l("div",{key:P,class:"model-usage-item"},[e("div",zr,[e("div",Br,[e("h4",{class:"cursor-pointer text-sm font-bold text-gray-900 hover:text-indigo-600 dark:text-gray-100 dark:hover:text-indigo-400",title:"点击复制",onClick:F=>u(C.model)},[k(o(C.model)+" ",1),n[2]||(n[2]=e("i",{class:"fas fa-copy ml-1 text-xs text-gray-400"},null,-1))],8,Gr),e("div",Hr,[e("span",null,o(C.requests)+"次",1),e("span",null,"输入:"+o(t(O)(C.inputTokens)),1),e("span",null,"输出:"+o(t(O)(C.outputTokens)),1),C.cacheCreateTokens?(a(),l("span",Jr,"缓存创建:"+o(t(O)(C.cacheCreateTokens)),1)):b("",!0),C.cacheReadTokens?(a(),l("span",Qr,"缓存读取:"+o(t(O)(C.cacheReadTokens)),1)):b("",!0)])]),e("div",Yr,[n[4]||(n[4]=e("span",{class:"text-gray-500"},"官方API",-1)),e("span",Xr,o(((D=C.formatted)==null?void 0:D.total)||"$0.00"),1),(U=t($))!=null&&U.rates?(a(),l(X,{key:0},[n[3]||(n[3]=e("span",{class:"ml-2 text-gray-500"},"计费",-1)),e("span",Zr,o(f(C)),1)],64)):b("",!0)])])])}),128))])):(a(),l("div",el,[n[5]||(n[5]=e("i",{class:"fas fa-chart-pie mb-3 text-2xl md:text-3xl"},null,-1)),e("p",tl,"暂无"+o(w.value)+"模型使用数据",1)]))]))}},we=me(sl,[["__scopeId","data-v-0571e613"]]),al={key:0,class:"card p-3 sm:p-4 md:p-6"},rl={class:"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4"},ll={class:"mb-2 flex items-center justify-between"},nl={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},ol={class:"flex items-center gap-1"},il={class:"rounded-full bg-blue-100 px-2 py-0.5 text-xs font-medium text-blue-700 dark:bg-blue-900/30 dark:text-blue-300",title:"全局倍率"},dl={key:0,class:"rounded-full bg-purple-100 px-2 py-0.5 text-xs font-medium text-purple-700 dark:bg-purple-900/30 dark:text-purple-300",title:"Key倍率"},ul={class:"mb-2 space-y-0.5 text-xs text-gray-600 dark:text-gray-400"},cl={class:"flex justify-between"},ml={class:"text-gray-900 dark:text-gray-200"},gl={class:"flex justify-between"},xl={class:"text-gray-900 dark:text-gray-200"},yl={key:0,class:"flex justify-between"},fl={class:"text-gray-900 dark:text-gray-200"},pl={key:1,class:"flex justify-between"},vl={class:"text-gray-900 dark:text-gray-200"},bl={class:"mb-2 space-y-0.5 border-t border-gray-200 pt-2 text-xs dark:border-gray-700"},kl={class:"flex justify-between"},hl={class:"font-semibold text-green-600 dark:text-green-400"},_l={class:"flex justify-between"},wl={class:"font-semibold text-amber-600 dark:text-amber-400"},$l={key:0,class:"space-y-0.5 border-t border-gray-200 pt-2 text-xs text-gray-500 dark:border-gray-700 dark:text-gray-500"},Cl={class:"flex justify-between"},Tl={class:"flex justify-between"},Sl={key:0,class:"flex justify-between"},Al={key:1,class:"flex justify-between"},Kl={__name:"ServiceCostCards",setup(E){const K=ge(),{modelStats:i,serviceRates:_,keyServiceRates:g,multiKeyMode:v}=ce(K),h={claude:"Claude",codex:"Codex",gemini:"Gemini",droid:"Droid",bedrock:"Bedrock",azure:"Azure",ccr:"CCR"},$=w=>{if(!w)return"claude";const u=w.toLowerCase();return u.includes("claude")||u.includes("sonnet")||u.includes("opus")||u.includes("haiku")?"claude":u.includes("gpt")||u.includes("o1")||u.includes("o3")||u.includes("o4")?"codex":u.includes("gemini")?"gemini":u.includes("droid")||u.includes("factory")?"droid":u.includes("bedrock")||u.includes("amazon")?"bedrock":u.includes("azure")?"azure":"claude"},M=j(()=>{var u,x;if(!((u=_.value)!=null&&u.rates)||!((x=i.value)!=null&&x.length))return[];const w={};return Object.keys(_.value.rates).forEach(f=>{w[f]={inputTokens:0,outputTokens:0,cacheCreateTokens:0,cacheReadTokens:0,realCost:0,ratedCost:0,pricing:null}}),i.value.forEach(f=>{var n,C,P,D;const c=$(f.model);if(w[c]){w[c].inputTokens+=f.inputTokens||0,w[c].outputTokens+=f.outputTokens||0,w[c].cacheCreateTokens+=f.cacheCreateTokens||0,w[c].cacheReadTokens+=f.cacheReadTokens||0;const U=((n=f.costs)==null?void 0:n.real)??((C=f.costs)==null?void 0:C.total)??0;w[c].realCost+=U;const F=_.value.rates[c]||1,Q=v.value?1:((P=g.value)==null?void 0:P[c])??1,W=!f.isLegacy&&((D=f.costs)==null?void 0:D.rated)!==void 0?f.costs.rated:U*F*Q;w[c].ratedCost+=W,!w[c].pricing&&f.pricing&&(w[c].pricing=f.pricing)}}),Object.entries(w).filter(([,f])=>f.inputTokens>0||f.outputTokens>0||f.cacheCreateTokens>0||f.realCost>0).map(([f,c])=>{var D;const n=_.value.rates[f]||1,C=v.value?1:((D=g.value)==null?void 0:D[f])??1,P=c.pricing;return{name:f,label:h[f]||f,globalRate:n,keyRate:C,inputTokens:c.inputTokens,outputTokens:c.outputTokens,cacheCreateTokens:c.cacheCreateTokens,cacheReadTokens:c.cacheReadTokens,officialCost:L(c.realCost),ccCost:L(c.ratedCost),pricing:P?{input:L(P.input),output:L(P.output),cacheCreate:P.cacheCreate?L(P.cacheCreate):null,cacheRead:P.cacheRead?L(P.cacheRead):null}:null}}).sort((f,c)=>c.inputTokens+c.outputTokens-(f.inputTokens+f.outputTokens))}),L=w=>!w||w===0?"$0.00":w>=1?"$"+w.toFixed(2):w>=.01?"$"+w.toFixed(4):"$"+w.toFixed(6);return(w,u)=>t(_)&&t(i).length>0?(a(),l("div",al,[u[10]||(u[10]=e("h3",{class:"mb-2 flex items-center justify-between text-base font-bold text-gray-900 dark:text-gray-100 sm:mb-3 sm:text-lg md:mb-4 md:text-xl"},[e("span",{class:"flex items-center"},[e("i",{class:"fas fa-coins mr-2 text-sm text-amber-500 md:mr-3 md:text-base"}),k(" 服务费用统计 ")]),e("span",{class:"text-xs font-normal text-gray-500 dark:text-gray-400"}," 计费 = 官方费用 × 全局倍率 × Key倍率 ")],-1)),e("div",rl,[(a(!0),l(X,null,se(M.value,x=>(a(),l("div",{key:x.name,class:"rounded-xl border border-gray-200 bg-gray-50 p-3 dark:border-gray-700 dark:bg-gray-800/50"},[e("div",ll,[e("span",nl,o(x.label),1),e("div",ol,[e("span",il," 全局 "+o(x.globalRate)+"x ",1),t(v)?b("",!0):(a(),l("span",dl," Key "+o(x.keyRate)+"x ",1))])]),e("div",ul,[e("div",cl,[u[0]||(u[0]=e("span",null,"输入",-1)),e("span",ml,o(t(O)(x.inputTokens)),1)]),e("div",gl,[u[1]||(u[1]=e("span",null,"输出",-1)),e("span",xl,o(t(O)(x.outputTokens)),1)]),x.cacheCreateTokens?(a(),l("div",yl,[u[2]||(u[2]=e("span",null,"缓存创建",-1)),e("span",fl,o(t(O)(x.cacheCreateTokens)),1)])):b("",!0),x.cacheReadTokens?(a(),l("div",pl,[u[3]||(u[3]=e("span",null,"缓存读取",-1)),e("span",vl,o(t(O)(x.cacheReadTokens)),1)])):b("",!0)]),e("div",bl,[e("div",kl,[u[4]||(u[4]=e("span",{class:"text-gray-600 dark:text-gray-400"},"官方API",-1)),e("span",hl,o(x.officialCost),1)]),e("div",_l,[u[5]||(u[5]=e("span",{class:"text-gray-600 dark:text-gray-400"},"计费费用",-1)),e("span",wl,o(x.ccCost),1)])]),x.pricing?(a(),l("div",$l,[e("div",Cl,[u[6]||(u[6]=e("span",null,"输入",-1)),e("span",null,o(x.pricing.input)+"/M",1)]),e("div",Tl,[u[7]||(u[7]=e("span",null,"输出",-1)),e("span",null,o(x.pricing.output)+"/M",1)]),x.pricing.cacheCreate?(a(),l("div",Sl,[u[8]||(u[8]=e("span",null,"缓存创建",-1)),e("span",null,o(x.pricing.cacheCreate)+"/M",1)])):b("",!0),x.pricing.cacheRead?(a(),l("div",Al,[u[9]||(u[9]=e("span",null,"缓存读取",-1)),e("span",null,o(x.pricing.cacheRead)+"/M",1)])):b("",!0)])):b("",!0)]))),128))])])):b("",!0)}},Ml=me(Kl,[["__scopeId","data-v-79d7a9ef"]]),Pl={key:0,class:"fixed inset-0 z-[1050] flex items-center justify-center bg-gray-900/40 backdrop-blur-sm"},Rl={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"},Ll={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"},Il={class:"flex items-center gap-3"},jl={class:"text-xs text-gray-500 dark:text-gray-400"},Dl=["disabled"],ql={class:"max-h-[70vh] overflow-y-auto px-5 py-4"},Ul={class:"mb-4"},El={class:"relative"},Nl=["value"],Ol={class:"mb-4 space-y-2"},Fl={class:"flex items-center justify-between text-sm"},Wl={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"},Vl={class:"text-sm"},zl={class:"mb-1 flex items-center justify-between"},Bl=["value"],Gl={class:"text-right text-xs text-gray-400 dark:text-gray-500"},Hl={class:"text-sm"},Jl={class:"mb-1 flex items-center justify-between"},Ql=["value"],Yl={class:"flex items-center justify-between text-sm"},Xl={class:"font-medium text-gray-700 dark:text-gray-300"},Zl={class:"mb-4"},en={class:"flex items-center gap-3"},tn={class:"text-xs text-gray-500 dark:text-gray-400"},sn={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"},an={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"},rn={key:0,class:"text-xs text-gray-500 dark:text-gray-500"},ln={class:"max-h-40 overflow-y-auto p-3"},nn={key:0,class:"whitespace-pre-wrap text-sm text-gray-700 dark:text-gray-300"},on={key:0,class:"inline-block h-4 w-1 animate-pulse bg-blue-500"},dn={key:1,class:"flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400"},un={key:2,class:"text-sm text-red-600 dark:text-red-400"},cn={key:1,class:"mb-4 flex items-center justify-center gap-2 text-xs text-gray-500 dark:text-gray-400"},mn={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"},gn=["disabled"],xn=["disabled"],yn={__name:"ApiKeyTestModal",props:{show:{type:Boolean,default:!1},apiKeyValue:{type:String,default:""},apiKeyName:{type:String,default:""},serviceType:{type:String,default:"claude",validator:E=>["claude","gemini","openai"].includes(E)}},emits:["close"],setup(E,{emit:K}){const i=E,_=K,g=T("idle"),v=T(""),h=T(""),$=T(0),M=T(null),L=T(null),w=T("claude-sonnet-4-5-20250929"),u=T("hi"),x=T(1e3),f=[{value:100,label:"100"},{value:500,label:"500"},{value:1e3,label:"1000"},{value:2e3,label:"2000"},{value:4096,label:"4096"}],c=T({claude:[],gemini:[],openai:[]}),n=async()=>{try{const r=await Xe();r.success&&r.data&&(c.value={claude:r.data.claude||[],gemini:r.data.gemini||[],openai:r.data.openai||[]})}catch(r){console.error("Failed to load models:",r)}},C=j(()=>{const r={claude:{name:"Claude",endpoint:"/api-key/test",defaultModel:"claude-sonnet-4-5-20250929",displayEndpoint:"/api/v1/messages"},gemini:{name:"Gemini",endpoint:"/api-key/test-gemini",defaultModel:"gemini-2.5-pro",displayEndpoint:"/gemini/v1/models/:model:streamGenerateContent"},openai:{name:"OpenAI (Codex)",endpoint:"/api-key/test-openai",defaultModel:"gpt-5",displayEndpoint:"/openai/responses"}};return r[i.serviceType]||r.claude}),P=j(()=>c.value[i.serviceType]||[]);De(()=>{n()});const D=j(()=>i.apiKeyName||"当前 API Key"),U=j(()=>{const r=i.apiKeyValue;return r?r.length<=10?"****":r.substring(0,6)+"****"+r.substring(r.length-4):""}),F=j(()=>{switch(g.value){case"idle":return"准备就绪";case"testing":return"正在测试...";case"success":return"测试成功";case"error":return"测试失败";default:return"未知状态"}}),Q=j(()=>{switch(g.value){case"idle":return"点击下方按钮开始测试 API Key 连通性";case"testing":return"正在通过 /api 端点发送测试请求";case"success":return"API Key 可以正常访问服务";case"error":return h.value||"无法通过 API Key 访问服务";default:return""}}),W=j(()=>{switch(g.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"}}),G=j(()=>{switch(g.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"}}),te=j(()=>{switch(g.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"}}),ne=j(()=>{switch(g.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"}}),oe=j(()=>{switch(g.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 Y(){if(!i.apiKeyValue)return;g.value="testing",v.value="",h.value="",$.value=0,M.value=Date.now(),L.value&&L.value.abort(),L.value=new AbortController;const r=`${Ze.apiPrefix}/apiStats${C.value.endpoint}`;try{const s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiKey:i.apiKeyValue,model:w.value,prompt:u.value,maxTokens:x.value}),signal:L.value.signal});if(!s.ok){const B=await s.json().catch(()=>({}));throw new Error(B.message||B.error||`HTTP ${s.status}`)}const m=s.body.getReader(),A=new TextDecoder;let N=!1;for(;!N;){const{done:B,value:de}=await m.read();if(B){N=!0;continue}const ie=A.decode(de).split(`
`);for(const J of ie)if(J.startsWith("data: "))try{const ae=JSON.parse(J.substring(6));Z(ae)}catch{}}}catch(s){if(s.name==="AbortError")return;g.value="error",h.value=s.message||"连接失败",$.value=Date.now()-M.value}}function Z(r){switch(r.type){case"test_start":break;case"content":v.value+=r.text;break;case"message_stop":break;case"test_complete":$.value=Date.now()-M.value,r.success?g.value="success":(g.value="error",h.value=r.error||"测试失败");break;case"error":g.value="error",h.value=r.error||"未知错误",$.value=Date.now()-M.value;break}}function H(){g.value!=="testing"&&(L.value&&(L.value.abort(),L.value=null),g.value="idle",v.value="",h.value="",$.value=0,_("close"))}return Te(()=>i.show,r=>{r&&(g.value="idle",v.value="",h.value="",$.value=0,w.value=C.value.defaultModel,u.value="hi",x.value=1e3)}),Te(()=>i.serviceType,()=>{w.value=C.value.defaultModel}),qe(()=>{L.value&&L.value.abort()}),(r,s)=>(a(),ve(Ue,{to:"body"},[E.show?(a(),l("div",Pl,[e("div",{class:"absolute inset-0",onClick:H}),e("div",Rl,[e("div",Ll,[e("div",Il,[e("div",{class:R(["flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-xl text-white shadow-lg",g.value==="success"?"bg-gradient-to-br from-green-500 to-emerald-500":g.value==="error"?"bg-gradient-to-br from-red-500 to-pink-500":"bg-gradient-to-br from-blue-500 to-indigo-500"])},[e("i",{class:R(["fas",g.value==="idle"?"fa-vial":g.value==="testing"?"fa-spinner fa-spin":g.value==="success"?"fa-check":"fa-times"])},null,2)],2),e("div",null,[s[3]||(s[3]=e("h3",{class:"text-lg font-semibold text-gray-900 dark:text-gray-100"}," API Key 端点测试 ",-1)),e("p",jl,o(D.value),1)])]),e("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:g.value==="testing",onClick:H},s[4]||(s[4]=[e("i",{class:"fas fa-times text-sm"},null,-1)]),8,Dl)]),e("div",ql,[e("div",Ul,[s[6]||(s[6]=e("label",{class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"}," API Key ",-1)),e("div",El,[e("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:U.value},null,8,Nl),s[5]||(s[5]=e("div",{class:"absolute right-2 top-1/2 -translate-y-1/2 text-gray-400"},[e("i",{class:"fas fa-lock text-xs"})],-1))]),s[7]||(s[7]=e("p",{class:"mt-1 text-xs text-gray-500 dark:text-gray-400"}," 测试将使用此 API Key 调用当前服务的 /api 端点 ",-1))]),e("div",Ol,[e("div",Fl,[s[9]||(s[9]=e("span",{class:"text-gray-500 dark:text-gray-400"},"测试端点",-1)),e("span",Wl,[s[8]||(s[8]=e("i",{class:"fas fa-link"},null,-1)),k(" "+o(C.value.displayEndpoint),1)])]),e("div",Vl,[e("div",zl,[s[10]||(s[10]=e("span",{class:"text-gray-500 dark:text-gray-400"},"测试模型",-1)),xe(e("select",{"onUpdate:modelValue":s[0]||(s[0]=m=>w.value=m),class:"rounded-lg border border-gray-200 bg-white px-2 py-1 text-sm text-gray-700 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300"},[(a(!0),l(X,null,se(P.value,m=>(a(),l("option",{key:m.value,value:m.value},o(m.label),9,Bl))),128))],512),[[Pe,w.value]])]),e("div",Gl,o(w.value),1)]),e("div",Hl,[e("div",Jl,[s[11]||(s[11]=e("span",{class:"text-gray-500 dark:text-gray-400"},"最大输出 Token",-1)),xe(e("select",{"onUpdate:modelValue":s[1]||(s[1]=m=>x.value=m),class:"rounded-lg border border-gray-200 bg-white px-2 py-1 text-sm text-gray-700 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-300"},[(a(),l(X,null,se(f,m=>e("option",{key:m.value,value:m.value},o(m.label),9,Ql)),64))],512),[[Pe,x.value]])])]),e("div",Yl,[s[12]||(s[12]=e("span",{class:"text-gray-500 dark:text-gray-400"},"测试服务",-1)),e("span",Xl,o(C.value.name),1)])]),e("div",Zl,[s[13]||(s[13]=e("label",{class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"}," 提示词 ",-1)),xe(e("textarea",{"onUpdate:modelValue":s[2]||(s[2]=m=>u.value=m),class:"w-full rounded-lg border border-gray-200 bg-white px-3 py-2 text-sm text-gray-700 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200",placeholder:"输入测试提示词...",rows:"2"},null,512),[[Se,u.value]])]),e("div",{class:R(["mb-4 rounded-xl border p-4 transition-all duration-300",W.value])},[e("div",en,[e("div",{class:R(["flex h-8 w-8 items-center justify-center rounded-lg",G.value])},[e("i",{class:R(["fas text-sm",te.value,ne.value])},null,2)],2),e("div",null,[e("p",{class:R(["font-medium",oe.value])},o(F.value),3),e("p",tn,o(Q.value),1)])])],2),g.value!=="idle"?(a(),l("div",sn,[e("div",an,[s[14]||(s[14]=e("span",{class:"text-xs font-medium text-gray-600 dark:text-gray-400"},"AI 响应",-1)),v.value?(a(),l("span",rn,o(v.value.length)+" 字符 ",1)):b("",!0)]),e("div",ln,[v.value?(a(),l("p",nn,[k(o(v.value)+" ",1),g.value==="testing"?(a(),l("span",on)):b("",!0)])):g.value==="testing"?(a(),l("p",dn,s[15]||(s[15]=[e("i",{class:"fas fa-circle-notch fa-spin"},null,-1),k(" 等待响应中... ",-1)]))):g.value==="error"&&h.value?(a(),l("p",un,o(h.value),1)):b("",!0)])])):b("",!0),$.value>0?(a(),l("div",cn,[s[16]||(s[16]=e("i",{class:"fas fa-clock"},null,-1)),e("span",null,"耗时 "+o(($.value/1e3).toFixed(2))+" 秒",1)])):b("",!0)]),e("div",mn,[e("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:g.value==="testing",onClick:H}," 关闭 ",8,gn),e("button",{class:R(["flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium shadow-sm transition",g.value==="testing"||!E.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:g.value==="testing"||!E.apiKeyValue,onClick:Y},[e("i",{class:R(["fas",g.value==="testing"?"fa-spinner fa-spin":"fa-play"])},null,2),k(" "+o(g.value==="testing"?"测试中...":g.value==="idle"?"开始测试":"重新测试"),1)],10,xn)])])])):b("",!0)]))}},fn={class:"glass-strong mb-4 rounded-2xl p-3 shadow-xl sm:mb-6 sm:rounded-3xl sm:p-4 md:mb-8 md:p-6"},pn={class:"flex flex-col items-center justify-between gap-3 sm:gap-4 md:flex-row"},vn={class:"flex items-center gap-2 md:gap-4"},bn={class:"flex items-center"},kn={key:0,class:"h-8 w-px bg-gradient-to-b from-transparent via-gray-300 to-transparent opacity-50 dark:via-gray-600"},hn={class:"mb-4 sm:mb-6 md:mb-8"},_n={class:"flex justify-center"},wn={class:"inline-flex w-full max-w-2xl flex-wrap justify-center gap-1 rounded-full border border-white/20 bg-white/10 p-1 shadow-lg backdrop-blur-xl sm:w-auto sm:flex-nowrap"},$n={key:0,class:"tab-content"},Cn={key:0,class:"mb-4 sm:mb-6 md:mb-8"},Tn={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"},Sn={key:1,class:"fade-in"},An={class:"glass-strong rounded-2xl p-3 shadow-xl sm:rounded-3xl sm:p-4 md:p-6"},Kn={class:"mb-3 border-b border-gray-200 pb-3 dark:border-gray-700 sm:mb-4 sm:pb-4 md:mb-6 md:pb-6"},Mn={class:"flex flex-col items-start justify-between gap-2 sm:gap-3 md:flex-row md:items-center md:gap-4"},Pn={class:"flex w-full items-center gap-2 md:w-auto"},Rn=["disabled"],Ln=["disabled"],In=["disabled"],jn={key:0,class:"relative"},Dn=["disabled","title"],qn={key:0,class:"absolute right-0 top-full z-50 mt-1 min-w-[140px] overflow-hidden rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800"},Un={class:"mb-4 mt-4 grid grid-cols-1 gap-3 sm:mb-6 sm:mt-6 sm:gap-4 md:mb-8 md:mt-8 md:gap-6 xl:grid-cols-2 xl:items-stretch"},En={class:"space-y-4 sm:space-y-6"},Nn={key:1,class:"tab-content"},On={class:"glass-strong rounded-3xl shadow-xl"},Fn={key:2,class:"tab-content"},Wn={class:"glass-strong rounded-2xl p-4 shadow-xl sm:rounded-3xl sm:p-6 md:p-8"},Vn={class:"mb-4 flex gap-2 border-b border-gray-200 pb-4 dark:border-gray-700 md:mb-6 md:pb-6"},zn={key:0},Bn={key:0,class:"py-8 text-center"},Gn={key:1},Hn={class:"mb-6 rounded-xl bg-blue-50 p-4 dark:bg-blue-900/20"},Jn={class:"text-sm text-blue-700 dark:text-blue-300"},Qn={class:"font-medium"},Yn={class:"space-y-4"},Xn=["disabled"],Zn={key:0,class:"fas fa-spinner fa-spin mr-2"},eo={key:1,class:"fas fa-check-circle mr-2"},to={key:0,class:"mt-6"},so={class:"flex items-start gap-3"},ao={class:"font-medium"},ro={class:"mt-1 text-sm opacity-90"},lo={key:0,class:"mt-2 text-sm"},no={key:0},oo={class:"font-medium"},io={key:1},uo={class:"font-medium"},co={key:1},mo={key:0,class:"py-8 text-center"},go={key:1},xo={key:0,class:"py-8 text-center"},yo={key:1,class:"py-8 text-center"},fo={key:2,class:"space-y-3"},po={class:"flex items-start justify-between gap-4"},vo={class:"min-w-0 flex-1"},bo={class:"mb-1 flex items-center gap-2"},ko={key:0,class:"inline-flex items-center rounded-full bg-red-100 px-2 py-0.5 text-xs font-medium text-red-700 dark:bg-red-900/30 dark:text-red-300"},ho={class:"text-sm text-gray-600 dark:text-gray-300"},_o={key:0},wo={key:1},$o={key:2},Co={class:"whitespace-nowrap text-right text-xs text-gray-500 dark:text-gray-400"},To={class:"mb-4 flex items-center gap-3"},So={class:"text-lg font-semibold text-gray-900 dark:text-gray-100"},Ao={class:"mb-4 whitespace-pre-wrap text-sm leading-relaxed text-gray-600 dark:text-gray-300"},Ko={class:"mb-4 flex cursor-pointer items-center gap-2"},je="apiStatsNoticeRead",Mo={__name:"ApiStatsView",setup(E){const K=We(),i=ge(),_=et(),g=T("stats"),v=j(()=>_.isDarkMode),{apiKey:h,apiId:$,loading:M,oemLoading:L,error:w,statsPeriod:u,statsData:x,oemSettings:f,multiKeyMode:c}=ce(i),{queryStats:n,switchPeriod:C,loadStatsWithApiId:P,loadOemSettings:D,loadServiceRates:U,loadApiKeyFromStorage:F,reset:Q}=i,W=T(!1),G=T(!1),te=T("claude"),ne=T(!1),oe=T(!1),Y=T("redeem"),Z=T(""),H=T(!1),r=T(null),s=T([]),m=T(!1),A=async()=>{var d;if(!Z.value.trim()||!$.value)return;H.value=!0,r.value=null;const p=await tt({apiId:$.value,code:Z.value.trim()});if(H.value=!1,p.success){const z=((d=p.data)==null?void 0:d.warnings)||[],le=z.length>0;r.value={success:!0,message:le?z.join(""):"额度卡兑换成功!",data:p.data,hasWarnings:le},Z.value="",Ie(le?"兑换成功(部分截断)":"兑换成功",le?"warning":"success"),P()}else r.value={success:!1,message:p.error||p.message||"兑换失败"},Ie(p.error||p.message||"兑换失败","error")},N=async()=>{var d;if(!$.value)return;m.value=!0;const p=await st($.value);m.value=!1,p.success&&(s.value=((d=p.data)==null?void 0:d.records)||p.data||[])},B=()=>{g.value="quota",Y.value==="history"&&N()},de=()=>{Y.value="history",N()},re=p=>{if(!p)return[];if(Array.isArray(p))return p;if(typeof p=="string"){if(p==="all")return[];try{const d=JSON.parse(p);return Array.isArray(d)?d:[]}catch{return[]}}return[]},ie=j(()=>{var d;const p=re((d=x.value)==null?void 0:d.permissions);return p.length===0?!0:p.includes("claude")}),J=j(()=>{var d;const p=re((d=x.value)==null?void 0:d.permissions);return p.length===0?!0:p.includes("gemini")}),ae=j(()=>{var d;const p=re((d=x.value)==null?void 0:d.permissions);return p.length===0?!0:p.includes("openai")}),ue=j(()=>ie.value||J.value||ae.value),ye=j(()=>{var z;const p=re((z=x.value)==null?void 0:z.permissions);if(p.length===0)return"全部服务";const d={claude:"Claude",gemini:"Gemini",openai:"OpenAI",droid:"Droid"};return p.map(le=>d[le]||le).join(", ")}),fe=()=>{G.value=!G.value},pe=(p="claude")=>{te.value=p,G.value=!1,W.value=!0},he=()=>{W.value=!1},y=()=>{ne.value=!1,oe.value&&sessionStorage.setItem(je,"1")},S=()=>{var d;const p=(d=f.value)==null?void 0:d.apiStatsNotice;p!=null&&p.enabled&&(p!=null&&p.content)&&!sessionStorage.getItem(je)&&(ne.value=!0)},I=p=>{G.value&&!p.target.closest(".relative")&&(G.value=!1)},V=p=>{(p.ctrlKey||p.metaKey)&&p.key==="Enter"&&(!M.value&&h.value.trim()&&n(),p.preventDefault()),p.key==="Escape"&&Q()};return De(async()=>{_.initTheme(),await Promise.all([D(),U()]),S();const p=K.query.apiId,d=K.query.apiKey;if(p&&p.match(/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i)){$.value=p;const z=F();z&&(h.value=z),P()}else if(d&&d.length>10)h.value=d;else{const z=F();z&&z.length>10&&(h.value=z,n())}document.addEventListener("keydown",V),document.addEventListener("click",I)}),qe(()=>{document.removeEventListener("keydown",V),document.removeEventListener("click",I)}),Te(h,p=>{p||i.clearData()}),(p,d)=>{var le,Ae;const z=ze("router-link");return a(),l("div",{class:R(["min-h-screen p-2 sm:p-4 md:p-6",v.value?"gradient-bg-dark":"gradient-bg"])},[e("div",fn,[e("div",pn,[ee(rt,{loading:t(L),"logo-src":t(f).siteIconData||t(f).siteIcon,subtitle:g.value==="stats"?"API Key 使用统计":g.value==="quota"?"额度卡":"使用教程",title:t(f).siteName},null,8,["loading","logo-src","subtitle","title"]),e("div",vn,[e("div",bn,[ee(lt,{mode:"dropdown"})]),t(f).ldapEnabled||t(f).showAdminButton!==!1?(a(),l("div",kn)):b("",!0),t(f).ldapEnabled?(a(),ve(z,{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:_e(()=>d[14]||(d[14]=[e("i",{class:"fas fa-user text-sm md:text-base"},null,-1),e("span",{class:"text-xs font-semibold tracking-wide md:text-sm"},"用户登录",-1)])),_:1,__:[14]})):b("",!0),t(f).showAdminButton!==!1?(a(),ve(z,{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:_e(()=>d[15]||(d[15]=[e("i",{class:"fas fa-shield-alt text-sm md:text-base"},null,-1),e("span",{class:"text-xs font-semibold tracking-wide md:text-sm"},"管理后台",-1)])),_:1,__:[15]})):b("",!0)])])]),e("div",hn,[e("div",_n,[e("div",wn,[e("button",{class:R(["tab-pill-button",g.value==="stats"?"active":""]),onClick:d[0]||(d[0]=q=>g.value="stats")},d[16]||(d[16]=[e("i",{class:"fas fa-chart-line mr-1 md:mr-2"},null,-1),e("span",{class:"text-sm md:text-base"},"统计查询",-1)]),2),e("button",{class:R(["tab-pill-button",g.value==="quota"?"active":""]),onClick:B},d[17]||(d[17]=[e("i",{class:"fas fa-ticket-alt mr-1 md:mr-2"},null,-1),e("span",{class:"text-sm md:text-base"},"额度卡",-1)]),2),e("button",{class:R(["tab-pill-button",g.value==="tutorial"?"active":""]),onClick:d[1]||(d[1]=q=>g.value="tutorial")},d[18]||(d[18]=[e("i",{class:"fas fa-graduation-cap mr-1 md:mr-2"},null,-1),e("span",{class:"text-sm md:text-base"},"使用教程",-1)]),2)])])]),g.value==="stats"?(a(),l("div",$n,[ee(At),t(w)?(a(),l("div",Cn,[e("div",Tn,[d[19]||(d[19]=e("i",{class:"fas fa-exclamation-triangle mr-2"},null,-1)),k(" "+o(t(w)),1)])])):b("",!0),t(x)?(a(),l("div",Sn,[e("div",An,[e("div",Kn,[e("div",Mn,[d[27]||(d[27]=e("div",{class:"flex items-center gap-2 md:gap-3"},[e("i",{class:"fas fa-clock text-base text-blue-500 md:text-lg"}),e("span",{class:"text-base font-medium text-gray-700 dark:text-gray-200 md:text-lg"},"统计时间范围")],-1)),e("div",Pn,[e("button",{class:R(["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:t(u)==="daily"}]]),disabled:t(M),onClick:d[2]||(d[2]=q=>t(C)("daily"))},d[20]||(d[20]=[e("i",{class:"fas fa-calendar-day text-xs md:text-sm"},null,-1),k(" 今日 ",-1)]),10,Rn),e("button",{class:R(["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:t(u)==="monthly"}]]),disabled:t(M),onClick:d[3]||(d[3]=q=>t(C)("monthly"))},d[21]||(d[21]=[e("i",{class:"fas fa-calendar-alt text-xs md:text-sm"},null,-1),k(" 本月 ",-1)]),10,Ln),e("button",{class:R(["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:t(u)==="alltime"}]]),disabled:t(M),onClick:d[4]||(d[4]=q=>t(C)("alltime"))},d[22]||(d[22]=[e("i",{class:"fas fa-infinity text-xs md:text-sm"},null,-1),k(" 全部 ",-1)]),10,In),t(c)?b("",!0):(a(),l("div",jn,[e("button",{class:R(["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",ue.value?"":"cursor-not-allowed opacity-50"]),disabled:t(M)||!ue.value,title:ue.value?"测试 API":`当前 Key 可用服务: ${ye.value}`,onClick:fe},d[23]||(d[23]=[e("i",{class:"fas fa-vial text-xs md:text-sm"},null,-1),k(" 测试 ",-1),e("i",{class:"fas fa-chevron-down ml-1 text-xs"},null,-1)]),10,Dn),G.value?(a(),l("div",qn,[ie.value?(a(),l("button",{key:0,class:"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700",onClick:d[5]||(d[5]=q=>pe("claude"))},d[24]||(d[24]=[e("i",{class:"fas fa-robot text-orange-500"},null,-1),k(" Claude ",-1)]))):b("",!0),J.value?(a(),l("button",{key:1,class:"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700",onClick:d[6]||(d[6]=q=>pe("gemini"))},d[25]||(d[25]=[e("i",{class:"fas fa-gem text-blue-500"},null,-1),k(" Gemini ",-1)]))):b("",!0),ae.value?(a(),l("button",{key:2,class:"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700",onClick:d[7]||(d[7]=q=>pe("openai"))},d[26]||(d[26]=[e("i",{class:"fas fa-code text-green-500"},null,-1),k(" Codex ",-1)]))):b("",!0)])):b("",!0)]))])])]),ee(Hs),e("div",Un,[ee(ma,{class:"h-full"}),t(c)?(a(),ve(Ur,{key:0,class:"h-full"})):(a(),ve(wr,{key:1,class:"h-full"}))]),ee(Ml,{class:"mb-4 sm:mb-6"}),e("div",En,[ee(we,{period:"daily"}),ee(we,{period:"monthly"}),ee(we,{period:"alltime"})])])])):b("",!0)])):b("",!0),g.value==="tutorial"?(a(),l("div",Nn,[e("div",On,[ee(ot)])])):b("",!0),g.value==="quota"?(a(),l("div",Fn,[e("div",Wn,[e("div",Vn,[e("button",{class:R(["rounded-lg px-4 py-2 text-sm font-medium transition-all",Y.value==="redeem"?"bg-blue-500 text-white":"bg-gray-100 text-gray-600 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600"]),onClick:d[8]||(d[8]=q=>Y.value="redeem")},d[28]||(d[28]=[e("i",{class:"fas fa-ticket-alt mr-2"},null,-1),k(" 兑换额度卡 ",-1)]),2),e("button",{class:R(["rounded-lg px-4 py-2 text-sm font-medium transition-all",Y.value==="history"?"bg-blue-500 text-white":"bg-gray-100 text-gray-600 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600"]),onClick:de},d[29]||(d[29]=[e("i",{class:"fas fa-history mr-2"},null,-1),k(" 兑换记录 ",-1)]),2)]),Y.value==="redeem"?(a(),l("div",zn,[t($)?(a(),l("div",Gn,[e("div",Hn,[e("p",Jn,[d[31]||(d[31]=e("i",{class:"fas fa-info-circle mr-2"},null,-1)),d[32]||(d[32]=k(" 当前 API Key: ",-1)),e("span",Qn,o(((le=t(x))==null?void 0:le.name)||t($)),1)])]),e("div",Yn,[e("div",null,[d[33]||(d[33]=e("label",{class:"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"}," 额度卡卡号 ",-1)),xe(e("input",{"onUpdate:modelValue":d[10]||(d[10]=q=>Z.value=q),class:"w-full rounded-xl border border-gray-300 bg-white px-4 py-3 text-gray-900 placeholder-gray-400 transition-all focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100 dark:placeholder-gray-500",placeholder:"请输入额度卡卡号",type:"text",onKeyup:$e(A,["enter"])},null,544),[[Se,Z.value]])]),e("button",{class:"w-full rounded-xl bg-gradient-to-r from-green-500 to-emerald-500 px-6 py-3 font-medium text-white transition-all hover:from-green-600 hover:to-emerald-600 disabled:cursor-not-allowed disabled:opacity-50",disabled:!Z.value.trim()||H.value,onClick:A},[H.value?(a(),l("i",Zn)):(a(),l("i",eo)),k(" "+o(H.value?"兑换中...":"立即兑换"),1)],8,Xn)]),r.value?(a(),l("div",to,[e("div",{class:R(["rounded-xl p-4",r.value.success?r.value.hasWarnings?"bg-yellow-50 text-yellow-700 dark:bg-yellow-900/20 dark:text-yellow-300":"bg-green-50 text-green-700 dark:bg-green-900/20 dark:text-green-300":"bg-red-50 text-red-700 dark:bg-red-900/20 dark:text-red-300"])},[e("div",so,[e("i",{class:R(["mt-0.5 text-lg",r.value.success?r.value.hasWarnings?"fas fa-exclamation-triangle":"fas fa-check-circle":"fas fa-times-circle"])},null,2),e("div",null,[e("p",ao,o(r.value.success?r.value.hasWarnings?"兑换成功(部分截断)":"兑换成功":"兑换失败"),1),e("p",ro,o(r.value.message),1),r.value.success&&r.value.data?(a(),l("div",lo,[r.value.data.quotaAdded?(a(),l("p",no,[d[34]||(d[34]=k(" 额度增加: ",-1)),e("span",oo,"$"+o(r.value.data.quotaAdded),1)])):b("",!0),r.value.data.timeAdded?(a(),l("p",io,[d[35]||(d[35]=k(" 有效期延长: ",-1)),e("span",uo,o(r.value.data.timeAdded)+o(r.value.data.timeUnit==="days"?"天":r.value.data.timeUnit==="hours"?"小时":"月"),1)])):b("",!0)])):b("",!0)])])],2)])):b("",!0)])):(a(),l("div",Bn,[d[30]||(d[30]=e("div",{class:"mb-4 text-gray-500 dark:text-gray-400"},[e("i",{class:"fas fa-key mb-4 block text-4xl opacity-50"}),e("p",null,"请先在「统计查询」页面输入您的 API Key")],-1)),e("button",{class:"rounded-xl bg-gradient-to-r from-blue-500 to-cyan-500 px-6 py-2.5 font-medium text-white transition-all hover:from-blue-600 hover:to-cyan-600",onClick:d[9]||(d[9]=q=>g.value="stats")}," 前往输入 API Key ")]))])):b("",!0),Y.value==="history"?(a(),l("div",co,[t($)?(a(),l("div",go,[m.value?(a(),l("div",xo,d[37]||(d[37]=[e("i",{class:"fas fa-spinner fa-spin text-2xl text-gray-400"},null,-1),e("p",{class:"mt-2 text-gray-500 dark:text-gray-400"},"加载中...",-1)]))):s.value.length===0?(a(),l("div",yo,d[38]||(d[38]=[e("i",{class:"fas fa-inbox text-4xl text-gray-300 dark:text-gray-600"},null,-1),e("p",{class:"mt-2 text-gray-500 dark:text-gray-400"},"暂无兑换记录",-1)]))):(a(),l("div",fo,[(a(!0),l(X,null,se(s.value,q=>(a(),l("div",{key:q.id,class:"rounded-xl border border-gray-200 bg-white p-4 dark:border-gray-700 dark:bg-gray-800"},[e("div",po,[e("div",vo,[e("div",bo,[e("span",{class:R(["inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium",q.cardType==="quota"?"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300":q.cardType==="time"?"bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300":"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300"])},o(q.cardType==="quota"?"额度卡":q.cardType==="time"?"时间卡":"组合卡"),3),q.status==="revoked"?(a(),l("span",ko," 已撤销 ")):b("",!0)]),e("p",ho,[q.quotaAdded?(a(),l("span",_o,"额度 +$"+o(q.quotaAdded),1)):b("",!0),q.quotaAdded&&q.timeAdded?(a(),l("span",wo," · ")):b("",!0),q.timeAdded?(a(),l("span",$o,"有效期 +"+o(q.timeAmount)+o(q.timeUnit==="days"?"天":q.timeUnit==="hours"?"小时":"月"),1)):b("",!0)])]),e("div",Co,o(t(at)(q.redeemedAt)),1)])]))),128))]))])):(a(),l("div",mo,[d[36]||(d[36]=e("div",{class:"mb-4 text-gray-500 dark:text-gray-400"},[e("i",{class:"fas fa-key mb-4 block text-4xl opacity-50"}),e("p",null,"请先在「统计查询」页面输入您的 API Key")],-1)),e("button",{class:"rounded-xl bg-gradient-to-r from-blue-500 to-cyan-500 px-6 py-2.5 font-medium text-white transition-all hover:from-blue-600 hover:to-cyan-600",onClick:d[11]||(d[11]=q=>g.value="stats")}," 前往输入 API Key ")]))])):b("",!0)])])):b("",!0),ee(yn,{"api-key-name":((Ae=t(x))==null?void 0:Ae.name)||"","api-key-value":t(h),"service-type":te.value,show:W.value,onClose:he},null,8,["api-key-name","api-key-value","service-type","show"]),(a(),ve(Ue,{to:"body"},[ee(Ve,{name:"fade"},{default:_e(()=>{var q,Ke;return[ne.value?(a(),l("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4 backdrop-blur-sm",onClick:Ce(y,["self"])},[e("div",{class:"w-full max-w-md rounded-2xl bg-white p-6 shadow-2xl dark:bg-gray-800",onClick:d[13]||(d[13]=Ce(()=>{},["stop"]))},[e("div",To,[d[39]||(d[39]=e("div",{class:"flex h-10 w-10 items-center justify-center rounded-xl bg-gradient-to-br from-amber-500 to-orange-600 text-white"},[e("i",{class:"fas fa-bell"})],-1)),e("h3",So,o(((q=t(f).apiStatsNotice)==null?void 0:q.title)||"通知"),1)]),e("p",Ao,o((Ke=t(f).apiStatsNotice)==null?void 0:Ke.content),1),e("label",Ko,[xe(e("input",{"onUpdate:modelValue":d[12]||(d[12]=Ne=>oe.value=Ne),class:"h-4 w-4 rounded border-gray-300 text-blue-500 focus:ring-blue-500",type:"checkbox"},null,512),[[Be,oe.value]]),d[40]||(d[40]=e("span",{class:"text-sm text-gray-600 dark:text-gray-400"},"本次会话不再显示",-1))]),e("button",{class:"w-full rounded-xl bg-gradient-to-r from-blue-500 to-cyan-500 px-4 py-2.5 font-medium text-white transition-all hover:from-blue-600 hover:to-cyan-600",onClick:y}," 知道了 ")])])):b("",!0)]}),_:1})]))],2)}}},Eo=me(Mo,[["__scopeId","data-v-8fdf3cb4"]]);export{Eo as default};