PageSourceSearch

https://apextoken.ai/assets/index-68e0bETo.js

js apextoken.ai collected 2026-10-05 15:17:00 UTC 36,395 bytes, 3 lines download raw bytes

1import{a8 as ge,ap as Qe,b2 as Xe,an as Ye,c9 as Ze,aT as te,ca as _e,j as e,bc as Ce,r as K,aD as le,B as A,n as B,P as ve,M as de,T as ie,W as Je,b9 as Se,cb as et,S as tt,u as Oe,ao as st,m as Re,C as ye,G as Fe,ad as je,ae as G,q as De,ba as nt,aF as Ke,f as D,d as k,cc as at,s as ce,F as rt,aR as lt,at as it,I as Ie,cd as ot,c as ct,be as dt,aV as ut}from"./index--pHwc1mu.js";import{r as h,R as ae}from"./react-core-D4X2NdAg.js";import{C as mt}from"./CardPro-B4c0kMDS.js";import{C as pt}from"./CardTable-ILI2CLAN.js";import{I as ht,a as xt}from"./IllustrationNoResult-FOYmBomC.js";import{P as Z}from"./react-components-Bu9rtIvp.js";import{P as ft}from"./index-D6Q6KCv8.js";import{r as W,g as gt}from"./format-BHmpwC4r.js";import{r as yt,m as Ne,n as jt,o as wt}from"./render-3L0-OOa7.js";import{F as z}from"./baseForm-C8hTVcrk.js";import{C as bt,u as Ct}from"./useTableCompactMode-eO1MbEIF.js";import{a as ke,R as kt}from"./index-vH85z9_d.js";import{S as _t}from"./index-CPkAkwt2.js";import{d as we,q as Me}from"./quota-_dh7w8lU.js";import{u as qe}from"./i18n-CZDhMbvn.js";import{I as Nt}from"./IconSave-HMTDOX0s.js";import{I as Ve}from"./IconLink-n_n0emEt.js";import{g as Tt}from"./token-WTcAxMaN.js";import{I as Ge}from"./IconExternalOpen-ByiIjfKG.js";import{I as vt}from"./IconServer-DmOOf6ZP.js";import"./tools-D645YXon.js";import"./index-DqrTFes6.js";import"./split-C7ExR1A8.js";import"./slice-YtD6ANQP.js";import"./Animation-06F2yRfr.js";import"./index-KhxnqNOs.js";import"./index-D7Nh1TSV.js";import"./iconBase-Cvif2m-f.js";import"./index-JOE5mu5h.js";import"./index-BY7aX2oY.js";import"./IconFile-DjcuGUvw.js";import"./index-B6KpDZuk.js";import"./index-DuY0klIs.js";import"./index-ZyaSWAZp.js";import"./IconClock-M6ugx4M0.js";import"./index-DWSUbHCq.js";var St=function(s,t){var n={};for(var a in s)Object.prototype.hasOwnProperty.call(s,a)&&t.indexOf(a)<0&&(n[a]=s[a]);if(s!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,a=Object.getOwnPropertySymbols(s);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(s,a[r])&&(n[a[r]]=s[a[r]]);return n};const It=_e.SIZE,Mt=_e.SHAPE,Et=_e.OVERLAP_FROM,oe=Ze.PREFIX;class Te extends h.PureComponent{getAllAvatars(){const{children:t}=this.props;return t?Array.isArray(t)?ae.Children.toArray(t):[t]:[]}getMergeAvatars(t){const{maxCount:n}=this.props;let a=t;const r=t.length-n,l=t.slice(0,n),i=t.slice(n);if(r>0){const o=this.renderMoreAvatar(r,i);l.push(o),a=l}return a}renderMoreAvatar(t,n){const{renderMore:a}=this.props,r=ge(`${oe}-item-more`),l=n==null?void 0:n.reduce((c,p)=>{const{children:f,alt:j}=p.props,_=j??(typeof f=="string"?f:"");return _.length===0?c:c.length>0?`${c},${_}`:_},""),i=` Number of remaining Avatars:${t},${l}`;let o=ae.createElement(te,{className:r,key:"_+n",alt:i},`+${t}`);return Qe(a)&&(o=ae.createElement(h.Fragment,{key:"_+n"},a(t,n))),o}render(){const t=this.props,{children:n,maxCount:a,overlapFrom:r,size:l,shape:i,renderMore:o}=t,c=St(t,["children","maxCount","overlapFrom","size","shape","renderMore"]);let p;const f=ge({[`${oe}-group`]:!0});if(n){const j=this.getAllAvatars();p=(Xe(a)?this.getMergeAvatars(j):j).map((_,$)=>{const R=ge(Ye(_.props,"className"),{[`${oe}-item-start-${$}`]:r==="start",[`${oe}-item-end-${$}`]:r==="end"});return ae.cloneElement(_,Object.assign(Object.assign({},c),{className:R,size:l,shape:i,key:$}))})}return ae.createElement("div",{className:f,role:"list"},p)}}Te.defaultProps={size:"medium",shape:"circle",overlapFrom:"start"};Te.propTypes={children:Z.node,shape:Z.oneOf(Mt),size:Z.oneOf(It),maxCount:Z.number,renderMore:Z.func,overlapFrom:Z.oneOf(Et)};const Be=s=>(s==null?void 0:s.key_shown)===!1,At=s=>{if(s===100)return"var(--semi-color-success)";if(s<=10)return"var(--semi-color-danger)";if(s<=30)return"var(--semi-color-warning)"};function Ee(s){return e.jsx(e.Fragment,{children:Ce(s)})}const Pt=(s,t,n)=>{const a=s===1;let r="black",l=n("未知状态");return a?(r="green",l=n("已启用")):s===2?(r="red",l=n("已禁用")):s===3?(r="yellow",l=n("已过期")):s===4&&(r="grey",l=n("已耗尽")),e.jsx(K,{color:r,shape:"circle",size:"small",children:l})},zt=(s,t,n,a={})=>
1{if(s==="auto")return e.jsx(le,{content:n("当前分组为 auto,会自动选择最优分组,当一个组不可用时自动降级到下一个组(熔断机制)"),position:"top",children:e.jsxs(K,{color:"white",shape:"circle",children:[n("智能熔断"),t&&t.cross_group_retry?`(${n("跨分组")})`:""]})});const r=a[s];return e.jsxs("span",{className:"flex items-center gap-1",children:[yt(s),r!==void 0&&e.jsxs(K,{size:"small",color:"green",shape:"circle",children:[r,"x"]})]})},$t=(s,t,n,a,r)=>{const l=t.key?`sk-${t.key}`:"",i=Be(t);return e.jsx("div",{className:"w-[200px]",children:e.jsx(le,{content:r(i?"点击后将完整展示一次密钥,关闭后无法再次查看。":"密钥已经展示过,无法再次查看。"),position:"top",showArrow:!0,children:e.jsx(A,{className:"!justify-start !px-3 font-mono",size:"small",type:"tertiary",disabled:!i,onClick:async()=>{const o=await n(t);o&&a([o])},style:{width:200},children:l})})})},Ot=(s,t,n)=>{if(t.model_limits_enabled&&s){const a=s.split(",").filter(Boolean),r=Ne(n),l=[],i=new Set;Object.entries(r).forEach(([c,p])=>{if(c==="all"||!p.icon||!p.filter)return;const f=a.filter(j=>p.filter({model_name:j}));f.length>0&&(l.push(e.jsx(le,{content:f.join(", "),position:"top",showArrow:!0,children:e.jsx(te,{size:"extra-extra-small",alt:p.label,color:"transparent",children:p.icon})},c)),f.forEach(j=>i.add(j)))});const o=a.filter(c=>!i.has(c));return o.length>0&&l.push(e.jsx(le,{content:o.join(", "),position:"top",showArrow:!0,children:e.jsx(te,{size:"extra-extra-small",alt:"unknown",children:n("其他")})},"unknown")),e.jsx(Te,{size:"extra-extra-small",children:l})}else return e.jsx(K,{color:"white",shape:"circle",children:n("无限制")})},Rt=(s,t)=>{if(!s||s.trim()==="")return e.jsx(K,{color:"white",shape:"circle",children:t("无限制")});const n=s.split(`
2`).map(i=>i.trim()).filter(Boolean),a=n.slice(0,1),r=n.length-a.length,l=a.map((i,o)=>e.jsx(K,{shape:"circle",children:i},o));return r>0&&l.push(e.jsx(le,{content:n.slice(1).join(", "),position:"top",showArrow:!0,children:e.jsx(K,{shape:"circle",children:"+"+r})},"extra")),e.jsx(B,{wrap:!0,children:l})},Ft=(s,t,n)=>{const{Paragraph:a}=ie,r=parseInt(t.used_quota)||0,l=t.historical_used_quota,i=l==null?r:parseInt(l)||0,o=parseInt(t.remain_quota)||0,c=r+o,p=Math.max(o,0);if(t.unlimited_quota){const _=e.jsx("div",{className:"text-xs p-2",children:e.jsxs(a,{copyable:{content:W(i)},children:[n("历史消耗"),": ",W(i)]})});return e.jsx(ve,{content:_,position:"top",children:e.jsx(K,{color:"white",shape:"circle",children:n("无限额度")})})}const f=c>0?Math.min(100,Math.max(0,p/c*100)):0,j=e.jsxs("div",{className:"text-xs p-2",children:[e.jsxs(a,{copyable:{content:W(i)},children:[n("历史消耗"),": ",W(i)]}),e.jsxs(a,{copyable:{content:W(o)},children:[n("剩余额度"),": ",W(o)," (",f.toFixed(0),"%)"]})]});return e.jsx(ve,{content:j,position:"top",children:e.jsx(K,{color:"white",shape:"circle",children:e.jsxs("div",{className:"flex flex-col items-end",children:[e.jsx("span",{className:"text-xs leading-none",children:`${W(o)} / ${W(i)}`}),e.jsx(ft,{percent:f,stroke:At(f),"aria-label":"quota usage",format:()=>`${f.toFixed(0)}%`,style:{width:"100%",marginTop:"1px",marginBottom:0}})]})})})},Dt=(s,t,n,a,r,l,i)=>e.jsxs(B,{wrap:!0,children:[t.status===1?e.jsx(A,{type:"danger",size:"small",onClick:async()=>{await r(t.id,"disable",t),await l()},children:i("禁用")}):e.jsx(A,{size:"small",onClick:async()=>{await r(t.id,"enable",t),await l()},children:i("启用")}),e.jsx(A,{type:"tertiary",size:"small",onClick:()=>{n(t),a(!0)},children:i("编辑")}),e.jsx(A,{type:"danger",size:"small",onClick:()=>{de.confirm({title:i("确定是否要删除此令牌?"),content:i("此修改将不可逆"),onOk:()=>{(async()=>(await r(t.id,"delete",t),await l()))()}})},children:i("删除")})]}),Kt=({t:s,revealTokenKey:t,showTokenKeys:n,manageToken:a,setEditingToken:r,setShowEdit:l,refresh:i,groupRatios:o={}})=>[{title:s("名称"),dataIndex:"name"},{title:s("状态"),dataIndex:"status",key:"status",render:(c,p)=>Pt(c,p,s)},{title:`${s("剩余额度")}/${s("历史消耗")}`,key:"quota_usage",render:(c,p)=>Ft(c,p,s)},{title:s("分组"),dataIndex:"group",key:"group",render:(c,p)=>zt(c,p,s,o)},{title:s("密钥"),key:"token_key",render:(c,p)=>$t(c,p,t,n,s)},{title:s("可用模型"),dataIndex:"model_limits",render:(c,p)=>Ot(c,p,s)},{title:s("IP限制"),dataIndex:"allow_ips",render:c=>Rt(c,s)},{title:s("创建时间"),dataIndex:"created_time",render:(c,p,f)=>e.jsx("div",{children:Ee(c)})},{title:s("过期时间"),dataIndex:"expired_time",render:(c,p,f)=>e.jsx("div",{children:p.expired_time===-1?s("永不过期"):Ee(c)})},{title:"",dataIndex:"operate",fixed:"right",render:(c,p,f)=>Dt(c,p,r,l,a,i,s)}],qt=s=>{const{tokens:t,loading:n,activePage:a,pageSize:r,tokenCount:l,compactMode:i,handlePageChange:o,handlePageSizeChange:c,rowSelection:p,handleRow:f,revealTokenKey:j,showTokenKeys:_,manageToken:$,setEditingToken:R,setShowEdit:M,refresh:v,groupRatios:S,t:E}=s,q=h.useMemo(()=>Kt({t:E,revealTokenKey:j,showTokenKeys:_,manageToken:$,setEditingToken:R,setShowEdit:M,refresh:v,groupRatios:S}),[E,j,_,$,R,M,v,S]),w=h.useMemo(()=>i?q.map(b=>{if(b.dataIndex==="operate"){const{fixed:L,...H}=b;return H}return b}):q,[i,q]);return e.jsx(pt,{columns:w,dataSource:t,scroll:i?void 0:{x:"max-content"},pagination:{currentPage:a,pageSize:r,total:l,showSizeChanger:!0,pageSizeOptions:[10,20,50,100],onPageSizeChange:c,onPageChange:o},hidePagination:!0,loading:n,rowKey:"id",rowSelection:p,onRow:f,empty:e.jsx(Je,{image:e.jsx(ht,{style:{width:150,height:150}}),darkModeImage:e.jsx(xt,{style:{width:150,height:150}}),description:E("搜索无结果"),style:{padding:30}}),className:"rounded-xl overflow-hidden",size:"middle"})}
2,Vt=({setEditingToken:s,setShowEdit:t,t:n})=>e.jsx("div",{className:"flex flex-wrap gap-2 w-full md:w-auto order-2 md:order-1",children:e.jsx(A,{type:"primary",className:"flex-1 md:flex-initial",onClick:()=>{s({id:void 0}),t(!0)},size:"small",children:n("添加令牌")})}),Gt=({selectedCount:s=0,children:t,t:n,className:a})=>{if(s<1)return null;const r=n("已选择 {{count}} 项",{count:s});return e.jsxs("div",{role:"toolbar","aria-label":r,className:`flex flex-col sm:flex-row sm:items-center justify-between gap-2 rounded-lg bg-[var(--semi-color-fill-0)] px-3 py-2 ${a||""}`,children:[e.jsx(ie.Text,{strong:!0,children:r}),e.jsx("div",{className:"flex flex-col sm:flex-row sm:items-center gap-2",children:t})]})},Bt=({visible:s,onCancel:t,onConfirm:n,selectedKeys:a,t:r})=>e.jsx(de,{title:r("批量删除令牌"),visible:s,onCancel:t,onOk:n,type:"warning",children:e.jsx("div",{children:r("确定要删除所选的 {{count}} 个令牌吗?",{count:a.length})})}),Lt=({selectedKeys:s=[],batchDeleteTokens:t,t:n})=>{const[a,r]=h.useState(!1),l=s.length;h.useEffect(()=>{l===0&&r(!1)},[l]);const i=()=>{t(),r(!1)};return e.jsxs(e.Fragment,{children:[e.jsx(Gt,{selectedCount:l,className:"mb-3",t:n,children:e.jsx(A,{type:"danger",className:"w-full sm:w-auto",onClick:()=>r(!0),size:"small",children:n("删除 {{count}} 个令牌",{count:l})})}),e.jsx(Bt,{visible:l>0&&a,onCancel:()=>r(!1),onConfirm:i,selectedKeys:s,t:n})]})},Ut=({formInitValues:s,setFormApi:t,searchTokens:n,loading:a,searching:r,t:l})=>{const i=h.useRef(null),o=()=>{i.current&&(i.current.reset(),setTimeout(()=>{n()},100))};return e.jsx(z,{initValues:s,getFormApi:c=>{t(c),i.current=c},onSubmit:()=>n(1),allowEmpty:!0,autoComplete:"off",layout:"horizontal",trigger:"change",stopValidateWithError:!1,className:"w-full md:w-auto order-1 md:order-2",children:e.jsxs("div",{className:"flex flex-col md:flex-row items-center gap-2 w-full md:w-auto",children:[e.jsx("div",{className:"relative w-full md:w-56",children:e.jsx(z.Input,{field:"searchKeyword",prefix:e.jsx(Se,{}),placeholder:l("搜索令牌名称"),showClear:!0,pure:!0,size:"small"})}),e.jsx("div",{className:"relative w-full md:w-56",children:e.jsx(z.Input,{field:"searchToken",prefix:e.jsx(Se,{}),placeholder:l("密钥"),showClear:!0,pure:!0,size:"small"})}),e.jsxs("div",{className:"flex gap-2 w-full md:w-auto",children:[e.jsx(A,{type:"tertiary",htmlType:"submit",loading:a||r,className:"flex-1 md:flex-initial md:w-auto",size:"small",children:l("查询")}),e.jsx(A,{type:"tertiary",onClick:o,className:"flex-1 md:flex-initial md:w-auto",size:"small",children:l("重置")})]})]})})},{Text:Wt}=ie,Ht=({compactMode:s,setCompactMode:t,t:n})=>e.jsxs("div",{className:"flex flex-col md:flex-row justify-between items-start md:items-center gap-2 w-full",children:[e.jsxs("div",{className:"flex items-center text-blue-500",children:[e.jsx(et,{size:16,className:"mr-2"}),e.jsx(Wt,{children:n("令牌管理")})]}),e.jsx(bt,{compactMode:s,setCompactMode:t,t:n})]}),Qt=({tokens:s,closeSheet:t,showTokenKeys:n,defer:a=r=>setTimeout(r,0)})=>(t==null||t(),!Array.isArray(s)||s.length===0?!1:(a(()=>{n==null||n(s)}),!0)),ee="never",J="custom",Ae=[{key:"one_month",labelKey:"一个月",offset:{months:1}},{key:"one_day",labelKey:"一天",offset:{days:1}},{key:"one_hour",labelKey:"一小时",offset:{hours:1}}],Pe=s=>{if(s==null||s==="")return null;const t=Number(s);return Number.isFinite(t)?t:null},Xt=(s,t,n)=>{const a=Pe(n),r=a===null?Pe(s):a;return r===-1?{mode:ee,value:-1}:{mode:J,value:r===null?null:t(r)}},ze=(s,t)=>{if(s===ee)return-1;const n=t instanceof Date?t.getTime():Date.parse(t);return Number.isNaN(n)?null:Math.ceil(n/1e3)},Yt=(s,t)=>{const n=s.getDate();s.setDate(1),s.setMonth(s.getMonth()+t);const a=new Date(s.getFullYear(),s.getMonth()+1,0).getDate();s.setDate(Math.min(n,a))},Zt=(s,t=new Date)=>{const n=new Date(t.getTime()),{months:a=0,days:r=0,hours:l=0}=s.offset;return a!==0&&Yt(n,a),r!==0&&n.setDate(n.getDate()+r),l!==0&&n.setHours(n.getHours()+l),n},Jt=(s,t)=>s===t?"primary":"tertiary",{Text:be,Title:es}=ie,ts=s=>{const{t}=qe(),[n,a]=h.useContext(tt),[r,l]=h.useState(!1),i=Oe(),o=h.useRef(null),[c,p]=h.useState([]),[f,j]=h.useState([]),[_,$]=h.useState(!1),[R,M]=h.useState(""),v=h.useRef(null),S=s.editingToken.id!==void 0,E=()=>({name:"",remain_quota:0,remain_amount:0,expired_time:-1,expiry_mode:ee,unlimited_quota:!0,model_limits_enabled:!1,model_limits:[],allow_ips:"",group:"",cross_group_retry:!1,tokenCount:1}),q=()=>{s.handleClose()},w=g=>{if(!o.current)return;const m=Zt(g),y=Ce(m.getTime()/1e3);o.current.setValue("expired_time",y),o.current.setValue("expiry_mode",J),v.current=y,M(g.key)},b=g=>{if(!o.current)return;if(g===ee){const u=o.current.getValue("expired_time");u&&u!==-1&&(v.current=u),o.current.setValue("expired_time",-1),o.current.setValue("expiry_mode",ee),M("");return}const m=v.current,y=Date.parse(m);
2if(!Number.isNaN(y)&&y>Date.now()){o.current.setValue("expired_time",m),o.current.setValue("expiry_mode",J),M("");return}const x=Ae.find(u=>u.key==="one_month");w(x)},L=async()=>{let g=await D.get("/api/user/models");const{success:m,message:y,data:x}=g.data;if(m){const u=Ne(t);let P=x.map(F=>{let U=null;for(const[N,Q]of Object.entries(u))if(N!=="all"&&Q.filter({model_name:F})){U=Q.icon;break}return{label:e.jsxs("span",{className:"flex items-center gap-1",children:[U,F]}),value:F}});p(P)}else k(t(y))},H=async()=>{var u;let g=await D.get("/api/user/self/groups");const{success:m,message:y,data:x}=g.data;if(m){let P=Object.entries(x).map(([F,U])=>at(F,U));(u=n==null?void 0:n.status)!=null&&u.default_use_auto_group&&P.some(F=>F.value==="auto")&&P.sort((F,U)=>F.value==="auto"?-1:1),j(P)}else k(t(y))},se=async()=>{l(!0);let g=await D.get(`/api/token/${s.editingToken.id}`);const{success:m,message:y,data:x}=g.data;if(m){const u=Xt(x.expired_time,Ce,s.editingToken.expired_time);x.expiry_mode=u.mode,x.expired_time=u.value,u.mode===J?v.current=x.expired_time:v.current=null,M(""),x.model_limits!==""?x.model_limits=x.model_limits.split(","):x.model_limits=[],x.remain_amount=Number(Me(x.remain_quota||0).toFixed(6)),o.current&&o.current.setValues({...E(),...x},{isOverride:!0})}else k(y);l(!1)};h.useEffect(()=>{o.current&&(S||(o.current.setValues(E()),M(""),v.current=null)),L(),H()},[s.editingToken.id]),h.useEffect(()=>{var g,m;s.visiable?S?se():((g=o.current)==null||g.setValues(E()),M(""),v.current=null):((m=o.current)==null||m.reset(),M(""),v.current=null)},[s.visiable,s.editingToken.id]);const ne=()=>{const g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";let m="";for(let y=0;y<6;y++)m+=g.charAt(Math.floor(Math.random()*g.length));return m},ue=async g=>{var m;if(l(!0),S){let{tokenCount:y,expiry_mode:x,...u}=g;if(u.remain_quota=u.unlimited_quota?0:we(u.remain_amount),!u.unlimited_quota&&u.remain_quota<=0){k(t("请输入金额")),l(!1);return}if(u.expired_time=ze(x,u.expired_time),u.expired_time===null){k(t("过期时间格式错误!")),l(!1);return}u.model_limits=u.model_limits.join(","),u.model_limits_enabled=u.model_limits.length>0;let P=await D.put("/api/token/",{...u,id:parseInt(s.editingToken.id)});const{success:F,message:U}=P.data;F?(ce(t("令牌更新成功!")),s.refresh(),s.handleClose()):k(t(U))}else{const y=parseInt(g.tokenCount,10)||1;let x=0;const u=[];for(let P=0;P<y;P++){let{tokenCount:F,expiry_mode:U,...N}=g;const Q=g.name.trim()===""?"default":g.name.trim();if(P!==0||g.name.trim()===""?N.name=`${Q}-${ne()}`:N.name=Q,N.remain_quota=N.unlimited_quota?0:we(N.remain_amount),!N.unlimited_quota&&N.remain_quota<=0){k(t("请输入金额")),l(!1);break}if(N.expired_time=ze(U,N.expired_time),N.expired_time===null){k(t("过期时间格式错误!")),l(!1);break}N.model_limits=N.model_limits.join(","),N.model_limits_enabled=N.model_limits.length>0;let me=await D.post("/api/token/",N);const{success:pe,message:he,data:X}=me.data;if(pe)x++,X!=null&&X.key&&u.push({id:X.id,name:N.name,key:X.key});else{k(t(he));break}}x>0&&(s.refresh(),Qt({tokens:u,closeSheet:s.handleClose,showTokenKeys:s.onTokenKeysCreated})||k(t("令牌创建成功,但后端未返回密钥,请重新创建令牌")))}l(!1),(m=o.current)==null||m.setValues(E())};return e.jsx(_t,{placement:S?"right":"left",title:e.jsxs(B,{children:[S?e.jsx(K,{color:"blue",shape:"circle",children:t("更新")}):e.jsx(K,{color:"green",shape:"circle",children:t("新建")}),e.jsx(es,{heading:4,className:"m-0",children:t(S?"更新令牌信息":"创建新的令牌")})]}),bodyStyle:{padding:"0"},visible:s.visiable,width:i?"100%":600,footer:e.jsx("div",{className:"flex justify-end bg-white",children:e.jsxs(B,{children:[e.jsx(A,{theme:"solid",className:"!rounded-lg",onClick:()=>{var g;return(g=o.current)==null?void 0:g.submitForm()},icon:e.jsx(Nt,{}),loading:r,children:t("提交")}),e.jsx(A,{theme:"light",className:"!rounded-lg",type:"primary",onClick:q,icon:e.jsx(st,{}),children:t("取消")})]})}),closeIcon:null,onCancel:()=>q(),children:e.jsx(Re,{spinning:r,children:e.jsx(z,{initValues:E(),getFormApi:g=>o.current=g,onSubmit:ue,children:({values:g})=>e.jsxs("div",{className:"p-2",children:[e.jsxs(ye,{className:"!rounded-2xl shadow-sm border-0",children:[e.jsxs("div",{className:"flex items-center mb-2",children:[e.jsx(te,{size:"small",color:"blue",className:"mr-2 shadow-md",children:e.jsx(Fe,{size:16})}),e.jsxs("div",{children:[e.jsx(be,{className:"text-lg font-medium",children:t("基本信息")}),e.jsx("div",{className:"text-xs text-gray-600",children:t("设置令ç‰
2Œçš„基本信息")})]})]}),e.jsxs(je,{gutter:12,children:[e.jsx(G,{span:24,children:e.jsx(z.Input,{field:"name",label:t("名称"),placeholder:t("请输入名称"),rules:[{required:!0,message:t("请输入名称")}],showClear:!0})}),e.jsx(G,{span:24,children:f.length>0?e.jsx(z.Select,{field:"group",label:t("令牌分组"),placeholder:t("令牌分组,默认为用户的分组"),optionList:f,renderOptionItem:jt,renderSelectedItem:wt,filter:(m,y)=>{var u;const x=m.toLowerCase();return((u=y.value)==null?void 0:u.toLowerCase().includes(x))||typeof y.label=="string"&&y.label.toLowerCase().includes(x)||typeof y.description=="string"&&y.description.toLowerCase().includes(x)},showClear:!0,style:{width:"100%"}}):e.jsx(De,{placeholder:t("管理员未设置用户可选分组"),disabled:!0,label:t("令牌分组"),style:{width:"100%"}})}),e.jsx(G,{span:24,style:{display:g.group==="auto"?"block":"none"},children:e.jsx(z.Switch,{field:"cross_group_retry",label:t("跨分组重试"),size:"default",extraText:t("开启后,当前分组渠道失败时会按顺序尝试下一个分组的渠道")})}),e.jsx(G,{span:24,children:e.jsxs(z.RadioGroup,{field:"expiry_mode",label:t("过期时间"),type:"button",onChange:m=>b(m.target.value),"aria-label":t("过期时间"),children:[e.jsx(ke,{value:ee,children:t("永不过期")}),e.jsx(ke,{value:J,children:t("自定义")})]})}),g.expiry_mode===J&&e.jsxs(e.Fragment,{children:[e.jsx(G,{xs:24,sm:24,md:24,lg:10,xl:10,children:e.jsx(z.DatePicker,{field:"expired_time",label:t("有效期"),type:"dateTime",placeholder:t("请选择过期时间"),rules:[{required:!0,message:t("请选择过期时间")},{validator:(m,y)=>{if(!y)return Promise.resolve();const x=Date.parse(y);return isNaN(x)?Promise.reject(t("过期时间格式错误!")):x<=Date.now()?Promise.reject(t("过期时间不能早于当前时间!")):Promise.resolve()}}],showClear:!0,style:{width:"100%"},onChange:m=>{v.current=m||null,M("")}})}),e.jsx(G,{xs:24,sm:24,md:24,lg:14,xl:14,children:e.jsx(z.Slot,{label:t("过期时间快捷设置"),children:e.jsx(B,{wrap:!0,children:Ae.map(m=>e.jsx(A,{theme:"light",type:Jt(R,m.key),onClick:()=>w(m),children:t(m.labelKey)},m.key))})})})]}),!S&&e.jsx(G,{span:24,children:e.jsx(z.InputNumber,{field:"tokenCount",label:t("新建数量"),min:1,extraText:t("批量创建时会在名称后自动添加随机后缀"),rules:[{required:!0,message:t("请输入新建数量")}],style:{width:"100%"}})})]})]}),e.jsxs(ye,{className:"!rounded-2xl shadow-sm border-0",children:[e.jsxs("div",{className:"flex items-center mb-2",children:[e.jsx(te,{size:"small",color:"green",className:"mr-2 shadow-md",children:e.jsx(nt,{size:16})}),e.jsxs("div",{children:[e.jsx(be,{className:"text-lg font-medium",children:t("额度设置")}),e.jsx("div",{className:"text-xs text-gray-600",children:t("设置令牌可用额度和数量")})]})]}),e.jsxs(je,{gutter:12,children:[e.jsx(G,{span:24,children:e.jsx(z.InputNumber,{field:"remain_amount",label:t("金额"),prefix:gt().symbol,placeholder:t("输入金额"),precision:6,disabled:g.unlimited_quota,min:0,step:1e-6,onChange:m=>{var x,u;const y=m===""||m==null?0:m;(x=o.current)==null||x.setValue("remain_amount",y),(u=o.current)==null||u.setValue("remain_quota",we(y))},style:{width:"100%"},showClear:!0})}),e.jsxs(G,{span:24,children:[e.jsx("div",{className:"text-xs cursor-pointer mt-1",style:{color:"var(--semi-color-text-2)"},onClick:()=>$(m=>!m),children:_?`▾ ${t("收起原生额度输入")}`:`▸ ${t("使用原生额度输入")}`}),e.jsx("div",{style:{display:_?"block":"none"},className:"mt-2",children:e.jsx(z.InputNumber,{field:"remain_quota",label:t("额度"),placeholder:t("输入额度"),disabled:g.unlimited_quota,min:0,step:5e5,rules:g.unlimited_quota?[]:[{required:!0,message:t("请输入额度")}],onChange:m=>{var x,u;const y=m===""||m==null?0:m;(x=o.current)==null||x.setValue("remain_quota",y),(u=o.current)==null||u.setValue("remain_amount",Number(Me(y).toFixed(6)))},style:{width:"100%"},showClear:!0})})]}),e.jsx(G,{span:24,children:e.jsx(z.Switch,{field:"unlimited_quota",label:t("无限额度"),size:"default",extraText:t("令牌的额度仅用于限制令牌本身的最大额度使用量,实际的使用受到账户的剩余额度限制")})})]})]}),e.jsxs(ye,{className:"!rounded-2xl shadow-sm border-0",children:[e.jsxs("div",{className:"flex items-center mb-2",children:[e.jsx(te,{size:"small",color:"purple",className:"mr-2 shadow-md",children:e.jsx(Ve,{size:16})}),e.jsxs("div",{children:[e.jsx(be,{className:"text-lg font-medium",children:t("访问限制")}),e.jsx("div",{className:"text-xs text-gray-600",children:t("设置令ç‰
2Œçš„访问限制")})]})]}),e.jsxs(je,{gutter:12,children:[e.jsx(G,{span:24,children:e.jsx(z.Select,{field:"model_limits",label:t("模型限制列表"),placeholder:t("请选择该令牌支持的模型,留空支持所有模型"),multiple:!0,optionList:c,extraText:t("非必要,不建议启用模型限制"),filter:Ke,autoClearSearchValue:!1,searchPosition:"dropdown",showClear:!0,style:{width:"100%"}})}),e.jsx(G,{span:24,children:e.jsx(z.TextArea,{field:"allow_ips",label:t("IP白名单(支持CIDR表达式)"),placeholder:t("允许的IP,一行一个,不填写则不限制"),autosize:!0,rows:1,extraText:t("请勿过度信任此功能,IP可能被伪造,请配合nginx和cdn等网关使用"),showClear:!0,style:{width:"100%"}})})]})]})]})},S?"edit":"new")})})},re={claude:{label:"Claude",defaultName:"My Claude",modelFields:[{key:"model",label:"主模型"},{key:"haikuModel",label:"Haiku 模型"},{key:"sonnetModel",label:"Sonnet 模型"},{key:"opusModel",label:"Opus 模型"}]},codex:{label:"Codex",defaultName:"My Codex",modelFields:[{key:"model",label:"主模型"}]},gemini:{label:"Gemini",defaultName:"My Gemini",modelFields:[{key:"model",label:"主模型"}]}},Le=s=>(s||"").trim().replace(/\/+$/,""),ss=s=>{const t=(s||"").trim();return t?t.startsWith("sk-")?t:`sk-${t}`:""},Ue=(s,t)=>{const n=Le(t);return s!=="codex"||n.endsWith("/v1")?n:`${n}/v1`},ns=({app:s,name:t,models:n={},apiKey:a,serverAddress:r})=>{const l=Le(r),i=new URLSearchParams;return i.set("resource","provider"),i.set("app",s),i.set("name",t),i.set("endpoint",Ue(s,l)),i.set("apiKey",ss(a)),Object.entries(n).forEach(([o,c])=>{c&&i.set(o,c)}),i.set("homepage",l),i.set("enabled","true"),`ccswitch://v1/import?${i.toString()}`},{Text:$e}=ie,as=(s,t)=>{const n=Ne(t);return(s||[]).map(a=>{let r=null;for(const[l,i]of Object.entries(n))if(l!=="all"&&i.filter({model_name:a})){r=i.icon;break}return{label:e.jsxs("span",{className:"flex items-center gap-1",children:[r,a]}),value:a}})},rs=({visible:s,token:t,onClose:n,t:a})=>{const[r,l]=h.useState("claude"),[i,o]=h.useState(re.claude.defaultName),[c,p]=h.useState({}),[f,j]=h.useState([]),[_,$]=h.useState(!1),R=h.useMemo(()=>Tt(),[s]),M=re[r],v=Ue(r,R);h.useEffect(()=>{s&&(l("claude"),o(re.claude.defaultName),p({}))},[s]),h.useEffect(()=>{if(!s)return;(async()=>{$(!0);try{const b=await D.get("/api/user/models"),{success:L,message:H,data:se}=b.data||{};L?j(as(se,a)):k(a(H||"获取模型列表失败"))}catch(b){k((b==null?void 0:b.message)||a("获取模型列表失败"))}finally{$(!1)}})()},[s,a]);const S=w=>{l(w),o(re[w].defaultName),p({})},E=(w,b)=>{p(L=>({...L,[w]:b}))},q=()=>{if(!c.model){lt.warning(a("请选择主模型"));return}const w=ns({app:r,name:i,models:c,apiKey:t==null?void 0:t.key,serverAddress:R});window.open(w,"_blank"),n()};return e.jsx(de,{title:e.jsxs(B,{spacing:10,children:[e.jsx("span",{className:"inline-flex h-9 w-9 items-center justify-center rounded-lg bg-blue-50 text-blue-600 ring-1 ring-blue-100",children:e.jsx(Ve,{size:"large"})}),e.jsx("span",{className:"text-base font-semibold",children:a("填入 CC Switch")})]}),visible:s,onCancel:n,footer:e.jsxs(B,{children:[e.jsx(A,{type:"tertiary",onClick:n,children:a("取消")}),e.jsx(A,{theme:"solid",type:"primary",icon:e.jsx(Ge,{}),loading:_,onClick:q,children:a("打开 CC Switch")})]}),maskClosable:!1,width:520,children:e.jsx(Re,{spinning:_,children:e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"rounded-lg border border-blue-100 bg-blue-50 px-4 py-3 text-sm leading-6 text-blue-800",children:a("将使用当前完整密钥生成 CC Switch 导入链接。密钥仍只会在本窗口完整展示这一次。")}),e.jsxs("div",{className:"grid gap-4",children:[e.jsxs("div",{children:[e.jsx("div",{className:"mb-2 text-sm font-medium text-gray-700",children:a("目标应用")}),e.jsx(kt,{type:"button",value:r,onChange:w=>S(w.target.value),children:Object.entries(re).map(([w,b])=>e.jsx(ke,{value:w,children:b.label},w))})]}),e.jsxs("div",{children:[e.jsx("div",{className:"mb-2 text-sm font-medium text-gray-700",children:a("名称")}),e.jsx(rt,{value:i,onChange:o,placeholder:M.defaultName})]}),e.jsx("div",{className:"rounded-lg border border-gray-200 bg-gray-50 px-3 py-2",children:e.jsxs(B,{spacing:8,children:[e.jsx(vt,{className:"text-gray-500"}),e.jsx($e,{type:"secondary",children:a("请求地址")}),e.jsx(K,{color:"white",className:"font-mono",children:v})]})}),M.modelFields.map(w=>e.jsxs("div",{children:[e.jsxs("div",{className:"mb-2 text-sm font-medium text-gray-700",children:[a(w.label),w.key==="model"&&e.jsx($e,{type:"danger",children:" *"})]}),e.jsx(De,{placeholder:a("请选择模型"),optionList:f,value:c[w.key]||void 0,onChange:b=>E(w.key,b),filter:Ke,style:{width:"100%"},showClear:!0,searchable:!0,emptyContent:a("暂无数据")})]},w.key))]})]})})})},ls=s=>s.map(t=>s.length>1?`${t.name}    ${t.key}`:t.key).join(`
3`),is=({visible:s,tokens:t,onClose:n,t:a})=>{const r=t.length>0,[l,i]=h.useState(null),o=async f=>{await ct(f)?ce(a("已复制到剪贴板!")):k(a("无法复制到剪贴板,请手动复制"))},c=async()=>{r&&await o(ls(t))},p=()=>{i(null),n()};return e.jsxs(e.Fragment,{children:[e.jsx(de,{title:e.jsxs(B,{spacing:10,children:[e.jsx("span",{className:"inline-flex h-9 w-9 items-center justify-center rounded-lg bg-red-50 text-red-600 ring-1 ring-red-100",children:e.jsx(it,{size:"large"})}),e.jsx("span",{className:"text-base font-semibold text-gray-900",children:a("请立即保存令ç‰
3Œå¯†é’¥")})]}),icon:null,visible:s,maskClosable:!1,closeIcon:null,width:720,onCancel:p,footer:e.jsxs(B,{children:[e.jsx(A,{theme:"solid",type:"primary",icon:e.jsx(Ie,{}),disabled:!r,onClick:c,className:"min-h-[40px]",children:a("复制全部密钥")}),e.jsx(A,{type:"tertiary",onClick:p,className:"min-h-[40px]",children:a("我已复制并保存,关闭")})]}),children:e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{role:"alert",className:"rounded-lg border border-red-100 bg-red-50 px-4 py-3 text-sm leading-6 text-red-700",children:[e.jsxs("div",{className:"mb-1 flex items-center gap-2 font-semibold text-red-800",children:[e.jsx(ot,{}),a("密钥只会完整展示这一次")]}),e.jsx("div",{children:a("关闭此窗口后无法再次查看或复制,请现在复制并保存到安全位置。")})]}),e.jsx("div",{className:"max-h-[420px] space-y-3 overflow-auto pr-1",children:t.map((f,j)=>e.jsxs("div",{className:"rounded-lg border border-gray-200 bg-white p-4 shadow-sm",children:[e.jsxs("div",{className:"mb-3 flex flex-col gap-3 md:flex-row md:items-center md:justify-between",children:[e.jsxs(B,{spacing:8,children:[e.jsx("span",{className:"inline-flex h-8 w-8 items-center justify-center rounded-lg bg-blue-50 text-blue-600 ring-1 ring-blue-100",children:e.jsx(Fe,{})}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"truncate font-medium text-gray-900",children:f.name||a("未命名令牌")}),e.jsx(K,{color:"red",shape:"circle",size:"small",children:a("一次性密钥")})]})]}),e.jsxs(B,{wrap:!0,children:[e.jsx(A,{type:"primary",theme:"light",icon:e.jsx(Ie,{}),onClick:()=>o(f.key),className:"min-h-[36px]",children:a("复制")}),e.jsx(A,{type:"tertiary",icon:e.jsx(Ge,{}),onClick:()=>i(f),className:"min-h-[36px]",children:a("填入 CC Switch")})]})]}),e.jsx("div",{className:"break-all rounded-lg bg-gray-50 px-3 py-3 font-mono text-sm leading-6 text-gray-900 ring-1 ring-gray-200",children:f.key})]},`${f.id||j}-${f.name}`))})]})}),e.jsx(rs,{visible:!!l,token:l,onClose:()=>i(null),t:a})]})},os=()=>{const{t:s}=qe(),[t,n]=h.useState([]),[a,r]=h.useState(!0),[l,i]=h.useState({}),[o,c]=h.useState(1),[p,f]=h.useState(0),[j,_]=h.useState(dt),[$,R]=h.useState(!1),[M,v]=h.useState(!1),[S,E]=h.useState([]),[q,w]=h.useState(!1),[b,L]=h.useState({id:void 0}),[H,se]=Ct("tokens"),[ne,ue]=h.useState(null),g={searchKeyword:"",searchToken:""},m=()=>{const d=ne?ne.getValues():{};return{searchKeyword:d.searchKeyword||"",searchToken:d.searchToken||""}},y=()=>{w(!1),setTimeout(()=>{L({id:void 0})},500)},x=d=>{n(d.items||[]),E([]),f(d.total||0),c(d.page||1),_(d.page_size||j)},u=async(d=1,C=j)=>{r(!0),v(!1);const O=await D.get(`/api/token/?p=${d}&size=${C}`),{success:T,message:I,data:V}=O.data;T?x(V):k(I),r(!1)},P=async(d=o)=>{await u(d),E([])},F=async d=>{if(!(d!=null&&d.id))return k(s("令牌不存在")),null;if(!Be(d))return k(s("密钥仅能展示一次,请重新创建令牌")),null;let C;try{C=await D.post(`/api/token/${d.id}/key`)}catch(V){return k((V==null?void 0:V.message)||s("获取令牌密钥失败")),null}const{success:O,message:T,data:I}=C.data||{};return!O||!(I!=null&&I.key)?(k(s(T||"密钥仅能展示一次,请重新创建令牌")),null):(n(V=>V.map(Y=>Y.id===d.id?{...Y,key_shown:!0}:Y)),{id:I.id||d.id,name:d.name,key:I.key})},U=async(d,C,O)=>{r(!0);let T={id:d},I;switch(C){case"delete":I=await D.delete(`/api/token/${d}/`);break;case"enable":T.status=1,I=await D.put("/api/token/?status_only=true",T);break;case"disable":T.status=2,I=await D.put("/api/token/?status_only=true",T);break}const{success:V,message:Y}=I.data;if(V){ce(s("操作成功完成!"));let xe=I.data.data,fe=[...t];C!=="delete"&&(O.status=xe.status),n(fe)}else k(Y);r(!1)},N=async(d=1,C=j)=>{const O=Number.isInteger(d)&&d>0?d:1,T=Number.isInteger(C)&&C>0?C:j,{searchKeyword:I,searchToken:V}=m();if(I===""&&V===""){v(!1),await u(1);return}R(!0);const Y=await D.get(`/api/token/search?keyword=${encodeURIComponent(I)}&token=${encodeURIComponent(V)}&p=${O}&size=${T}`),{success:xe,message:fe,data:He}=Y.data;xe?(v(!0),x(He)):k(fe),R(!1)},Q=d=>{if(t.length===0)return;r(!0);let C=[...t];C.sort((O,T)=>(""+O[d]).localeCompare(T[d])),C[0].id===t[0].id&&C.reverse(),n(C),r(!1)},me=d=>{M?N(d,j).then():u(d,j).then()},pe=async d=>{_(d),M?await N(1,d):await u(1,d)},he={selectedRowKeys:S.map(d=>d.id),onChange:(d,C)=>{E(C||[])}},X=(d,C)=>d.status!==1?{style:{background:"var(--semi-color-disabled-border)"}}:{},We=async()=>{var d,C;if(S.length===0){k(s("请先选择要删除的令牌!"));return}r(!0);try{const O=S.map(I=>I.id),T=await D.post("/api/token/batch",{ids:O});if((d=T==null?void 0:T.data)!=null&&d.success){const I=T.data.data||0;ce(s("已删除 {{count}} 个令牌!",{count:I}
3)),await P(),setTimeout(()=>{t.length===0&&o>1&&P(o-1)},100)}else k(((C=T==null?void 0:T.data)==null?void 0:C.message)||s("删除失败"))}catch(O){k(O.message)}finally{r(!1)}};return h.useEffect(()=>{u(1).then().catch(d=>{k(d)}),D.get("/api/user/self/groups").then(d=>{if(d.data.success&&d.data.data){const C={};for(const[O,T]of Object.entries(d.data.data))C[O]=T.ratio;i(C)}}).catch(()=>{})},[j]),{tokens:t,loading:a,activePage:o,tokenCount:p,pageSize:j,searching:$,groupRatios:l,selectedKeys:S,setSelectedKeys:E,showEdit:q,setShowEdit:w,editingToken:b,setEditingToken:L,closeEdit:y,compactMode:H,setCompactMode:se,formApi:ne,setFormApi:ue,formInitValues:g,getFormValues:m,loadTokens:u,refresh:P,revealTokenKey:F,manageToken:U,searchTokens:N,sortToken:Q,handlePageChange:me,handlePageSizeChange:pe,rowSelection:he,handleRow:X,batchDeleteTokens:We,syncPageData:x,t:s}};function cs(){const s=os(),t=Oe(),[n,a]=h.useState([]),r=L=>{a(L||[])},l=()=>{a([])},{showEdit:i,editingToken:o,closeEdit:c,refresh:p,selectedKeys:f,setEditingToken:j,setShowEdit:_,batchDeleteTokens:$,formInitValues:R,setFormApi:M,searchTokens:v,loading:S,searching:E,compactMode:q,setCompactMode:w,t:b}=s;return e.jsxs(e.Fragment,{children:[e.jsx(ts,{refresh:p,editingToken:o,visiable:i,handleClose:c,onTokenKeysCreated:r}),e.jsx(is,{visible:n.length>0,tokens:n,onClose:l,t:b}),e.jsxs(mt,{type:"type1",descriptionArea:e.jsx(Ht,{compactMode:q,setCompactMode:w,t:b}),actionsArea:e.jsxs("div",{className:"flex flex-col md:flex-row justify-between items-center gap-2 w-full",children:[e.jsx(Vt,{setEditingToken:j,setShowEdit:_,t:b}),e.jsx("div",{className:"w-full md:w-full lg:w-auto order-1 md:order-2",children:e.jsx(Ut,{formInitValues:R,setFormApi:M,searchTokens:v,loading:S,searching:E,t:b})})]}),paginationArea:ut({currentPage:s.activePage,pageSize:s.pageSize,total:s.tokenCount,onPageChange:s.handlePageChange,onPageSizeChange:s.handlePageSizeChange,isMobile:t,t:s.t}),t:s.t,children:[e.jsx(Lt,{selectedKeys:f,batchDeleteTokens:$,t:b}),e.jsx(qt,{...s,showTokenKeys:r})]})]})}const Us=()=>e.jsx("div",{className:"mt-[60px] px-2",children:e.jsx(cs,{})});export{Us as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.