mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 21:17:30 +00:00
7 lines
84 KiB
JavaScript
7 lines
84 KiB
JavaScript
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-p8cKYBY8.js";import{L as rt}from"./LogoTitle-D3uO3Ady.js";import{T as lt}from"./ThemeToggle-CDMqn7Rp.js";import"./vendor-Dr8jvgFu.js";import{_ as nt}from"./WindowCountdown-Cz478C_V.js";import{T as ot}from"./TutorialView-BvEU86aX.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};
|