1import{g as Ft,j as Ge,a as It,_ as Ae,a0 as Ot}from"./index-Bzpify6I.js";import{k as Bt}from"./AppHeader.vue_vue_type_style_index_0_scoped_e9be4349_lang-BfYnDr_J.js";import{g as At,u as G}from"./usage-Dlo4IjTy.js";import{u as Pt}from"./groups-Bcw3AEFu.js";import{_ as Nt}from"./AppLayout.vue_vue_type_script_setup_true_lang-DB33jg2n.js";import{P as je}from"./Pagination-BLWEUE0g.js";import{S as M}from"./Select-CRadB1U5.js";import{D as Kt,_ as Gt}from"./TokenUsageTrend.vue_vue_type_script_setup_true_lang-izUhEMOX.js";import{r as jt,_ as Ht,a as Jt,b as Wt,g as Yt,c as Qt,B as Xt}from"./GroupDistributionChart.vue_vue_type_script_setup_true_lang-hAgr4FNT.js";import{a as Zt}from"./ModelDistributionChart.vue_vue_type_script_setup_true_lang-yhLkIlvx.js";import{_ as ea}from"./EndpointDistributionChart.vue_vue_type_script_setup_true_lang-BjYiwPMB.js";import{d as ve,r as i,w as He,H as j,u as n,J as w,z as d,D as T,B as a,G as o,A as Y,C as u,c as _,k as g,V as ta,q as oe,o as aa,a as sa,F as Pe,L as la}from"./vendor-vue-CNokyTVe.js";import{D as oa}from"./DataTable-QeaeoXSl.js";import{_ as ra}from"./EmptyState.vue_vue_type_script_setup_true_lang-BlXX7LdK.js";import{u as _e}from"./vendor-i18n-CJe1LeE7.js";import{_ as na,a as ia,s as ua,n as da,r as ca,b as ga,m as ma,C as pa}from"./errorBadges-BOaLB2cD.js";import{g as va}from"./usePersistedPageSize-x0WpaIWh.js";import"./vendor-misc-CSmvsGIg.js";import"./useClipboard-KB6Zj9c3.js";import"./LocaleSwitcher-ynQpDOt3.js";/* empty css */import"./vendor-chart-CN2sanci.js";import"./LoadingSpinner-CROWDdDr.js";const _a={key:0,class:"flex justify-center py-10"},ya={key:1,class:"py-8 text-center text-sm text-red-500"},ba={key:2,class:"space-y-4 text-sm"},fa={class:"grid grid-cols-2 gap-x-6 gap-y-3"},ka={class:"font-medium text-gray-500 dark:text-dark-400"},ha={class:"mt-0.5 text-gray-900 dark:text-dark-100"},xa={class:"font-medium text-gray-500 dark:text-dark-400"},wa={class:"mt-0.5 text-gray-900 dark:text-dark-100"},Sa={class:"font-medium text-gray-500 dark:text-dark-400"},Ca={class:"mt-0.5 text-gray-900 dark:text-dark-100"},$a={class:"font-medium text-gray-500 dark:text-dark-400"},Ea={class:"mt-0.5"},Da={class:"font-medium text-gray-500 dark:text-dark-400"},Va={class:"mt-0.5 text-gray-900 dark:text-dark-100"},Ta={class:"font-medium text-gray-500 dark:text-dark-400"},Ua={class:"mt-0.5 text-gray-900 dark:text-dark-100"},Ma={key:0},Ra={class:"font-medium text-gray-500 dark:text-dark-400"},qa={class:"mt-0.5 text-gray-900 dark:text-dark-100"},La={key:0},za={class:"font-medium text-gray-500 dark:text-dark-400"},Fa={class:"mt-0.5 text-gray-900 dark:text-dark-100 break-all"},Ia={key:1},Oa={class:"font-medium text-gray-500 dark:text-dark-400"},Ba={class:"mt-1 overflow-auto max-h-[40vh] whitespace-pre-wrap break-all rounded-lg bg-gray-50 dark:bg-dark-900 border border-gray-200 dark:border-dark-700 p-3 text-xs text-gray-800 dark:text-dark-200"},Aa=ve({__name:"UserErrorDetailModal",props:{show:{type:Boolean},errorId:{}},emits:["update:show"],setup(E,{emit:s}){const k=E,B=s,{t:b}=_e(),c=i(!1),U=i(!1),m=i(null);He(()=>[k.show,k.errorId],([h,f])=>{h&&f!=null?R(f):h||(m.value=null,U.value=!1)});async function R(h){c.value=!0,U.value=!1,m.value=null;try{m.value=await At(h)}catch(f){console.error("[UserErrorDetailModal] Failed to load error detail:",f),U.value=!0}finally{c.value=!1}}function q(h){return h>=500?"badge-danger":h===429?"badge-warning":"badge-gray"}return(h,f)=>(u(),j(Ft,{show:E.show,title:n(b)("usage.errors.detail.title"),width:"wide",onClose:f[0]||(f[0]=A=>B("update:show",!1))},{default:w(()=>[c.value?(u(),d("div",_a,[...f[1]||(f[1]=[a("svg",{class:"h-7 w-7 animate-spin text-primary-500",fill:"none",viewBox:"0 0 24 24"},[a("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"}),a("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})],-1)])])):U.value?(u(),d("div",ya,o(n(b)("usage.errors.detail.loadFailed")),1)):m.value?(u(),d("div",ba,[a("div",fa,[a("div",null,[a("span",ka,o(n(b)("usage.errors.time")),1),a("p",ha,o(n(Ge)(m.value.created_at)),1)]),a("div",null,[a("span",xa,o(n(b)("usage.errors.model")),1),a("p",wa,o(m.value.model||"-"),1)]),a("div",null,[a("span",Sa,o(n(b)("usage.errors.endpoint")),1),a("p",Ca,o(m.value.inbound_endpoint||"-"),1)]),a("div",null,[a("span",$a,o(n(b)("usage.errors.status")),1),a("p",Ea,[a("span",{class:Y(["badge",q(m.value.status_code)])},o(m.value.status_code||"-"),3)])]),a("div",null,[a("span",Da,o(n(b)("usage.errors.category")),1),a("p",Va,o(n(b)("usage.errors.categories."+m.value.category)),1)]),a("div",null,[a("span",Ta,o(n(b)("usage.errors.platform")),1),a("p",Ua,o(m.value.platform||"-"),1)]),m.value.upstream_status_code!=null?(u(),d("div",Ma,[a("span",Ra,o(n(b)("usage.errors.detail.upstreamStatus")),1),a("p",qa,o(m.value.upstream_status_code),1)])):T("",!0)]),m.value.message?(u(),d("div",La,[a("span",za,o(n(b)("usage.errors.message")),1),a("p",Fa,o(m.value.message),1)])):T("",!0),m.value.error_body?(u(),d("div",Ia,[a("span",Oa,o(n(b)("usage.errors.detail.responseBody")),1),a("pre",Ba,o(m.value.error_body),1)])):T("",!0)])):T("",!0)]),_:1},8,["show","title"]))}}),Pa={class:"flex min-h-0 flex-1 flex-col"},Na={class:"card flex min-h-0 flex-1 flex-col overflow-hidden"},Ka={key:0,class:"text-sm font-medium text-gray-900 dark:text-white"},Ga={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},ja={class:"text-sm"},Ha={class:"text-gray-900 dark:text-white"},Ja={key:0,class:"ml-1 inline-flex items-center rounded px-1 py-px text-[10px] font-medium leading-tight bg-rose-100 text-rose-600 ring-1 ring-inset ring-rose-200 dark:bg-rose-500/20 dark:text-rose-400 dark:ring-rose-500/30"},Wa={class:"max-w-[320px] text-xs"},Ya={class:"break-all text-gray-700 dark:text-gray-300"},Qa={class:"font-medium text-gray-500 dark:text-gray-400"},Xa={class:"ml-1"},Za={class:"text-sm text-gray-900 dark:text-white"},es=["title"],ts={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},as={key:0,class:"inline-flex items-center rounded px-2 py-0.5 text-xs font-medium bg-indigo-100 text-indigo-800 dark:bg-indigo-900 dark:text-indigo-200"},ss={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},ls={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},os={class:"text-sm text-gray-900 dark:text-white"},rs={key:0},ns={class:"text-sm font-mono text-gray-600 dark:text-gray-400"},is={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},us={class:"text-sm text-gray-600 dark:text-gray-400"},ds=["title"],cs={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},gs={class:"flex-shrink-0"},ms=ve({__name:"UserErrorRequestsTable",props:{rows:{},total:{},loading:{type:Boolean},page:{},pageSize:{},visibleColumnKeys:{}},emits:["update:page","update:pageSize","ipGeoBatchFailed","sort"],setup(E,{emit:s}){const k=E,B=s;function b(x,v){B("sort",ma(x),v)}const{t:c}=_e(),U=_(()=>[{key:"key_name",label:c("usage.errors.keyName")},{key:"model",label:c("usage.errors.model"),sortable:!0},{key:"endpoint",label:c("usage.errors.endpoint")},{key:"client_ip",label:"IP"},{key:"group",label:c("admin.usage.group")},{key:"type",label:c("usage.type")},{key:"platform",label:c("usage.errors.platform")},{key:"category",label:c("usage.errors.category")},{key:"status",label:c("usage.errors.status"),sortable:!0},{key:"message",label:c("usage.errors.message")},{key:"created_at",label:c("usage.errors.time"),sortable:!0},{key:"user_agent",label:c("usage.userAgent")}]),m=_(()=>k.visibleColumnKeys?U.value.filter(x=>k.visibleColumnKeys.includes(x.key)):U.value);function R(x){const v=da(x.request_type,x.stream);return v?{label:c(ga(v)),className:ca(v)}:null}const q=i(!1),h=i(null);function f(x){h.value=x,q.value=!0}const A=ua;return(x,v)=>(u(),d("div",Pa,[a("div",Na,[g(na,{ips:E.rows.map(r=>r.client_ip),onFailed:v[0]||(v[0]=r=>B("ipGeoBatchFailed"))},null,8,["ips"]),g(oa,{columns:m.value,data:E.rows,loading:E.loading,"clickable-rows":"","server-side-sort":"","default-sort-key":"created_at","default-sort-order":"desc",onSort:b,onRowClick:v[2]||(v[2]=r=>f(r.id))},{"cell-model":w(({row:r})=>[r.model?(u(),d("span",Ka,o(r.model),1)):(u(),d("span",Ga,"-"))]),"cell-key_name":w(({row:r})=>[a("div",ja,[a("span",Ha,o(r.key_name||"-"),1),r.key_deleted?(u(),d("span",Ja,o(n(c)("usage.errors.keyDeleted")),1)):T("",!0)])]),"cell-endpoint":w(({row:r})=>{var L;return[a("div",Wa,[a("div",Ya,[a("span",Qa,o(n(c)("usage.inbound"))+":",1),a("span",Xa,o(((L=r.inbou
1nd_endpoint)==null?void 0:L.trim())||"-"),1)])])]}),"cell-status":w(({row:r})=>[a("span",{class:Y(["inline-flex items-center rounded px-2 py-0.5 text-xs font-medium",n(A)(r.status_code)])},o(r.status_code||"-"),3)]),"cell-category":w(({row:r})=>[a("span",Za,o(n(c)("usage.errors.categories."+r.category)),1)]),"cell-message":w(({row:r})=>[r.message?(u(),d("span",{key:0,class:"block max-w-[280px] truncate text-sm text-gray-600 dark:text-gray-400",title:r.message},o(r.message),9,es)):(u(),d("span",ts,"-"))]),"cell-group":w(({row:r})=>[r.group_name?(u(),d("span",as,o(r.group_name),1)):(u(),d("span",ss,"-"))]),"cell-type":w(({row:r})=>[R(r)?(u(),d("span",{key:0,class:Y(["inline-flex items-center rounded px-2 py-0.5 text-xs font-medium",R(r).className])},o(R(r).label),3)):(u(),d("span",ls,"-"))]),"cell-platform":w(({row:r})=>[a("span",os,o(r.platform||"-"),1)]),"cell-client_ip":w(({row:r})=>[a("div",{onClick:v[1]||(v[1]=ta(()=>{},["stop"]))},[r.client_ip?(u(),d("div",rs,[a("span",ns,o(r.client_ip),1),g(ia,{ip:r.client_ip},null,8,["ip"])])):(u(),d("span",is,"-"))])]),"cell-created_at":w(({row:r})=>[a("span",us,o(n(Ge)(r.created_at)),1)]),"cell-user_agent":w(({row:r})=>[r.user_agent?(u(),d("span",{key:0,class:"block max-w-[320px] truncate text-sm text-gray-600 dark:text-gray-400",title:r.user_agent},o(r.user_agent),9,ds)):(u(),d("span",cs,"-"))]),empty:w(()=>[g(ra,{message:n(c)("usage.errors.empty")},null,8,["message"])]),_:1},8,["columns","data","loading"])]),a("div",gs,[E.total>0?(u(),j(je,{key:0,page:E.page,"page-size":E.pageSize,total:E.total,"onUpdate:page":v[3]||(v[3]=r=>x.$emit("update:page",r)),"onUpdate:pageSize":v[4]||(v[4]=r=>x.$emit("update:pageSize",r))},null,8,["page","page-size","total"])):T("",!0)]),g(Aa,{show:q.value,"onUpdate:show":v[5]||(v[5]=r=>q.value=r),"error-id":h.value},null,8,["show","error-id"])]))}}),ps={class:"space-y-6"},vs={class:"space-y-4"},_s={class:"card p-4"},ys={class:"flex flex-wrap items-center gap-4"},bs={class:"flex items-center gap-2"},fs={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},ks={class:"ml-auto flex items-center gap-2"},hs={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},xs={class:"w-28"},ws={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},Ss={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},Cs={class:"card p-6"},$s={class:"flex flex-wrap items-end justify-between gap-4"},Es={key:0,class:"flex flex-1 flex-wrap items-end gap-4"},Ds={class:"w-full sm:w-auto sm:min-w-[220px]"},Vs={class:"input-label"},Ts={class:"w-full sm:w-auto sm:min-w-[220px]"},Us={class:"input-label"},Ms={class:"w-full sm:w-auto sm:min-w-[200px]"},Rs={class:"input-label"},qs={class:"w-full sm:w-auto sm:min-w-[180px]"},Ls={class:"input-label"},zs={key:1,class:"flex flex-1 flex-wrap items-end gap-4"},Fs={class:"w-full sm:w-auto sm:min-w-[220px]"},Is={class:"input-label"},Os={class:"w-full sm:w-auto sm:min-w-[220px]"},Bs={class:"input-label"},As={class:"w-full sm:w-auto sm:min-w-[200px]"},Ps={class:"input-label"},Ns={class:"w-full sm:w-auto sm:min-w-[180px]"},Ks={class:"input-label"},Gs={class:"w-full sm:w-auto sm:min-w-[200px]"},js={class:"input-label"},Hs={class:"w-full sm:w-auto sm:min-w-[200px]"},Js={class:"input-label"},Ws={class:"flex w-full flex-wrap items-center justify-end gap-3 sm:w-auto"},Ys=["disabled"],Qs=["title"],Xs={class:"hidden md:inline"},Zs={key:0,class:"absolute right-0 top-full z-50 mt-1 max-h-80 w-48 overflow-y-auto rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-dark-600 dark:bg-dark-800"},el=["onClick"],tl=["disabled"],al={key:0,class:"flex gap-2 border-b border-gray-200 dark:border-dark-700"},Ne="user-usage-hidden-columns",Ke="user-usage-error-hidden-columns",$l=ve({__name:"UsageView",setup(E){const{t:s}=_e(),k=It(),B=i(null),b=i([]),c=i([]),U=i([]),m=i([]),R=i([]),q=i([]),h=i([]),f=i(!1),A=i(!1),x=i(!1),v=i(!1),r=i(!1),L=i([]),Q=i(!1),P=i(1),re=i(20),ye=i("created_at"),be=i("desc"),ne=i(0),$=i({model:"",category:"",api_key_id:null,status_code:null}),Je=_(()=>[{value:null,label:s("usage.errors.allKeys")},...de.value.map(e=>({value:e.id,label:e.name}))]),We=_(()=>{const e=new Set,t=[];for(const l of L.value)l.model&&!e.has(l.model)&&(e.add(l.model),t.push({value:l.model,label:l.model}));return t}
1),Ye=["auth","rate_limit","quota","invalid_request","service_unavailable","upstream","internal","cyber"],Qe=_(()=>[{value:"",label:s("usage.errors.allCategories")},...Ye.map(e=>({value:e,label:s("usage.errors.categories."+e)}))]),Xe=_(()=>[{value:null,label:s("usage.errors.allStatuses")},...pa.map(e=>({value:e,label:String(e)}))]),H=()=>{P.value=1,N()};let z=null,X=0,Z=0,ee=0;const fe=e=>`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,ke=()=>{const e=new Date,t=new Date(e.getTime()-24*60*60*1e3);return{start:fe(t),end:fe(e)}},ie=(e,t)=>{const l=new Date(`${e}T00:00:00`).getTime(),K=new Date(`${t}T00:00:00`).getTime();return Math.ceil((K-l)/(1e3*60*60*24))<=1?"hour":"day"},he=ke(),D=i(he.start),V=i(he.end),J=i(ie(D.value,V.value)),xe=i("tokens"),we=i("tokens"),Se=i("tokens"),ue=i("inbound"),S=i("usage"),Ce=_(()=>{var e;return((e=k.cachedPublicSettings)==null?void 0:e.allow_user_view_error_requests)??!1}),y=i({start_date:D.value,end_date:V.value,request_type:void 0,billing_type:null,billing_mode:null}),C=oe({page:1,page_size:va(),total:0}),te=oe({sort_by:"created_at",sort_order:"desc"}),Ze=_(()=>[{value:"day",label:s("admin.dashboard.day")},{value:"hour",label:s("admin.dashboard.hour")}]),et=_(()=>[{value:null,label:s("admin.usage.allTypes")},{value:"ws_v2",label:s("usage.ws")},{value:"live",label:s("usage.live")},{value:"stream",label:s("usage.stream")},{value:"sync",label:s("usage.sync")}]),tt=_(()=>[{value:null,label:s("admin.usage.allBillingTypes")},{value:0,label:s("admin.usage.billingTypeBalance")},{value:1,label:s("admin.usage.billingTypeSubscription")}]),at=_(()=>[{value:null,label:s("admin.usage.allBillingModes")},{value:"token",label:s("admin.usage.billingModeToken")},{value:"per_request",label:s("admin.usage.billingModePerRequest")},{value:"image",label:s("admin.usage.billingModeImage")},{value:"video",label:s("admin.usage.billingModeVideo")}]),de=i([]),$e=i([]),ce=i([]),st=_(()=>[{value:null,label:s("usage.allApiKeys")},...de.value.map(e=>({value:e.id,label:e.name}))]),lt=_(()=>[{value:null,label:s("admin.usage.allGroups")},...$e.value.map(e=>({value:e.id,label:e.name}))]),ot=_(()=>[{value:null,label:s("admin.usage.allModels")},...ce.value.map(e=>({value:e,label:e}))]),ae=_(()=>{const e=y.value.request_type,t=e?jt(e):y.value.stream;return{...y.value,start_date:D.value,end_date:V.value,stream:t===null?void 0:t}}),Ee=(e,t)=>({page:e,page_size:t,...ae.value,sort_by:te.sort_by,sort_order:te.sort_order}),W=async()=>{z==null||z.abort();const e=new AbortController;z=e,f.value=!0;try{const t=await G.query(Ee(C.page,C.page_size),{signal:e.signal});e.signal.aborted||(b.value=t.items,C.total=t.total)}catch(t){(t==null?void 0:t.name)!=="AbortError"&&(t==null?void 0:t.code)!=="ERR_CANCELED"&&k.showError(s("usage.failedToLoad"))}finally{z===e&&(f.value=!1)}},De=async()=>{const e=++Z;v.value=!0;try{const t=await G.getStats(ae.value);if(e!==Z)return;B.value=t,R.value=t.endpoints||[],q.value=[],h.value=[]}catch(t){if(e!==Z)return;console.error("Failed to load usage stats:",t),R.value=[],q.value=[],h.value=[]}finally{e===Z&&(v.value=!1)}},Ve=async()=>{const e=++ee;x.value=!0;try{const t=await G.getDashboardModels({...ae.value,model_source:"requested"});if(e!==ee)return;U.value=t.models||[],rt(t.models||[])}catch(t){if(e!==ee)return;console.error("Failed to load model stats:",t),U.value=[]}finally{e===ee&&(x.value=!1)}},ge=async()=>{const e=++X;A.value=!0;try{const t=await G.getDashboardSnapshotV2({...ae.value,granularity:J.value,include_trend:!0,include_model_stats:!1,include_group_stats:!0});if(e!==X)return;c.value=t.trend||[],m.value=t.groups||[]}catch(t){if(e!==X)return;console.error("Failed to load chart data:",t),c.value=[],m.value=[]}finally{e===X&&(A.value=!1)}},rt=e=>{const t=y.value.model,l=new Set(ce.value);e.forEach(K=>{K.model&&l.add(K.model)}),t&&l.add(t),ce.value=Array.from(l).sort()},F=()=>{C.page=1,W(),De(),Ve(),ge(),Vt()},Te=()=>{W(),De(),Ve(),ge(),S.value==="errors"&&N()},nt=()=>{const e=ke();D.value=e.start,V.value=e.end,y.value={start_date:e.start,end_date:e.end,request_type:void 0,billing_type:null,billing_mode:null},J.value=ie(e.start,e.end),F(),S.value==="errors"&&($.value={model:"",category:"",api_key_id:null,
1status_code:null},H())},it=e=>{D.value=e.startDate,V.value=e.endDate,y.value.start_date=e.startDate,y.value.end_date=e.endDate,J.value=ie(e.startDate,e.endDate),F()},ut=e=>{C.page=e,W()},dt=e=>{C.page_size=e,C.page=1,W()},ct=(e,t)=>{te.sort_by=e,te.sort_order=t,C.page=1,W()},Ue=()=>{k.showError(s("usage.ipGeo.batchFailed"))},gt=e=>{const t=Qt(e);return t==="cyber"?"Cyber":t==="live"?"Live":t==="ws_v2"?"WS":t==="stream"?"Stream":t==="sync"?"Sync":"Unknown"},mt=e=>((e==null?void 0:e.image_count)??0)>0?Xt:e==null?void 0:e.billing_mode,Me=e=>{if(e==null)return"";const t=String(e),l=t.replace(/"/g,'""');return/^[=+\-@\t\r]/.test(t)?`"'${l}"`:/[,"\n\r]/.test(t)?`"${l}"`:t},pt=async()=>{if(C.total===0){k.showWarning(s("usage.noDataToExport"));return}r.value=!0,k.showInfo(s("usage.preparingExport"));try{const e=[],l=Math.ceil(C.total/100);for(let p=1;p<=l;p++){const le=await G.query(Ee(p,100));e.push(...le.items)}if(e.length===0){k.showWarning(s("usage.noDataToExport"));return}const K=["Time","API Key Name","Model","Reasoning Effort","Inbound Endpoint","IP Address","Type","Billing Mode","Input Tokens","Output Tokens","Cache Read Tokens","Cache Creation Tokens","Rate Multiplier","Billed Cost","Original Cost","First Token (ms)","Duration (ms)"],qt=e.map(p=>{var le;return[p.created_at,((le=p.api_key)==null?void 0:le.name)||"",p.model,Ot(p.reasoning_effort),p.inbound_endpoint||"",p.ip_address||"",gt(p),Yt(mt(p),s),p.input_tokens,p.output_tokens,p.cache_read_tokens,p.cache_creation_tokens,p.rate_multiplier,p.actual_cost.toFixed(8),p.total_cost.toFixed(8),p.first_token_ms??"",p.duration_ms??""].map(Me)}),Lt=[K.map(Me).join(","),...qt.map(p=>p.join(","))].join(` 2`),zt=new Blob(["\uFEFF"+Lt],{type:"text/csv;charset=utf-8;"}),Be=window.URL.createObjectURL(zt),pe=document.createElement("a");pe.href=Be,pe.download=`usage_${D.value}_to_${V.value}.csv`,pe.click(),window.URL.revokeObjectURL(Be),k.showSuccess(s("usage.exportSuccess"))}catch(e){console.error("CSV Export failed:",e),k.showError(s("usage.exportFailed"))}finally{r.value=!1}},Re=["created_at"],qe=["user_agent"],Le=_(()=>[{key:"api_key",label:s("usage.apiKeyFilter"),sortable:!1},{key:"model",label:s("usage.model"),sortable:!0},{key:"reasoning_effort",label:s("usage.reasoningEffort"),sortable:!1},{key:"endpoint",label:s("usage.endpoint"),sortable:!1},{key:"ip_address",label:"IP",sortable:!1},{key:"group",label:s("admin.usage.group"),sortable:!1},{key:"stream",label:s("usage.type"),sortable:!1},{key:"billing_mode",label:s("admin.usage.billingMode"),sortable:!1},{key:"tokens",label:s("usage.tokens"),sortable:!1},{key:"cost",label:s("usage.cost"),sortable:!1},{key:"latency",label:s("usage.latency"),sortable:!1},{key:"created_at",label:s("usage.time"),sortable:!0},{key:"user_agent",label:s("usage.userAgent"),sortable:!1}]),I=oe(new Set),vt=_(()=>Le.value.filter(e=>!Re.includes(e.key))),_t=_(()=>Le.value.filter(e=>Re.includes(e.key)||!I.has(e.key))),yt=e=>!I.has(e),bt=e=>{I.has(e)?I.delete(e):I.add(e),localStorage.setItem(Ne,JSON.stringify([...I]))},ft=()=>{try{const e=localStorage.getItem(Ne);(e?JSON.parse(e):qe).forEach(l=>I.add(l))}catch{qe.forEach(e=>I.add(e))}},ze=["status","created_at"],Fe=["user_agent"],Ie=_(()=>[{key:"key_name",label:s("usage.errors.keyName")},{key:"model",label:s("usage.errors.model")},{key:"endpoint",label:s("usage.errors.endpoint")},{key:"client_ip",label:"IP"},{key:"group",label:s("admin.usage.group")},{key:"type",label:s("usage.type")},{key:"platform",label:s("usage.errors.platform")},{key:"category",label:s("usage.errors.category")},{key:"status",label:s("usage.errors.status")},{key:"message",label:s("usage.errors.message")},{key:"created_at",label:s("usage.errors.time")},{key:"user_agent",label:s("usage.userAgent")}]),O=oe(new Set),kt=_(()=>Ie.value.filter(e=>!ze.includes(e.key))),ht=_(()=>Ie.value.filter(e=>ze.includes(e.key)||!O.has(e.key)).map(e=>e.key)),xt=e=>!O.has(e),wt=e=>{O.has(e)?O.delete(e):O.add(e),localStorage.setItem(Ke,JSON.stringify([...O]))},St=()=>{try{const e=localStorage.getItem(Ke);(e?JSON.parse(e):Fe).forEach(l=>O.add(l))}
2catch{Fe.forEach(e=>O.add(e))}},Ct=_(()=>S.value==="errors"?kt.value:vt.value),$t=e=>S.value==="errors"?xt(e):yt(e),Et=e=>{S.value==="errors"?wt(e):bt(e)},se=i(!1),me=i(null),Oe=e=>{me.value&&!me.value.contains(e.target)&&(se.value=!1)},Dt=async()=>{try{const[e,t]=await Promise.all([Bt.list(1,100),Pt.getAvailable()]);de.value=e.items,$e.value=t}catch(e){console.error("Failed to load usage filter options:",e)}},Vt=()=>{P.value=1,S.value==="errors"?N():(L.value=[],ne.value=0)},N=async()=>{Q.value=!0;try{const e=await G.listMyErrorRequests({page:P.value,page_size:re.value,start_date:D.value,end_date:V.value,model:($.value.model??"").trim()||void 0,category:$.value.category||void 0,api_key_id:$.value.api_key_id??void 0,status_code:$.value.status_code??void 0,sort_by:ye.value,sort_order:be.value});L.value=e.items,ne.value=e.total}catch(e){console.error("[UsageView] loadErrors failed:",e),k.showError(s("usage.errors.failedToLoad"))}finally{Q.value=!1}},Tt=(e,t)=>{ye.value=e,be.value=t,P.value=1,N()},Ut=e=>{P.value=e,N()},Mt=e=>{re.value=e,P.value=1,N()},Rt=()=>{S.value="errors",L.value.length===0&&N()};return aa(()=>{ft(),St(),document.addEventListener("click",Oe),Dt(),Te()}),sa(()=>{z==null||z.abort(),document.removeEventListener("click",Oe)}),He(ue,()=>{}),(e,t)=>(u(),j(Nt,null,{default:w(()=>[a("div",ps,[g(Ht,{stats:B.value,"show-account-cost":!1,"strike-standard-cost":!0},null,8,["stats"]),a("div",vs,[a("div",_s,[a("div",ys,[a("div",bs,[a("span",fs,o(n(s)("admin.dashboard.timeRange"))+":",1),g(Kt,{"start-date":D.value,"onUpdate:startDate":t[0]||(t[0]=l=>D.value=l),"end-date":V.value,"onUpdate:endDate":t[1]||(t[1]=l=>V.value=l),onChange:it}
2,null,8,["start-date","end-date"])]),a("div",ks,[a("span",hs,o(n(s)("admin.dashboard.granularity"))+":",1),a("div",xs,[g(M,{modelValue:J.value,"onUpdate:modelValue":t[2]||(t[2]=l=>J.value=l),options:Ze.value,onChange:ge},null,8,["modelValue","options"])])])])]),a("div",ws,[g(Zt,{metric:xe.value,"onUpdate:metric":t[3]||(t[3]=l=>xe.value=l),"model-stats":U.value,loading:x.value,"show-source-toggle":!1,"show-metric-toggle":!0,"enable-breakdown":!1,"show-account-cost":!1,"start-date":D.value,"end-date":V.value},null,8,["metric","model-stats","loading","start-date","end-date"]),g(Jt,{metric:we.value,"onUpdate:metric":t[4]||(t[4]=l=>we.value=l),"group-stats":m.value,loading:A.value,"show-metric-toggle":!0,"enable-breakdown":!1,"show-account-cost":!1,"start-date":D.value,"end-date":V.value},null,8,["metric","group-stats","loading","start-date","end-date"])]),a("div",Ss,[g(ea,{source:ue.value,"onUpdate:source":t[5]||(t[5]=l=>ue.value=l),metric:Se.value,"onUpdate:metric":t[6]||(t[6]=l=>Se.value=l),"endpoint-stats":R.value,"upstream-endpoint-stats":q.value,"endpoint-path-stats":h.value,loading:v.value,"show-source-toggle":!1,"show-metric-toggle":!0,"enable-breakdown":!1,title:n(s)("usage.endpointDistribution"),"start-date":D.value,"end-date":V.value},null,8,["source","metric","endpoint-stats","upstream-endpoint-stats","endpoint-path-stats","loading","title","start-date","end-date"]),g(Gt,{"trend-data":c.value,loading:A.value},null,8,["trend-data","loading"])])]),a("div",Cs,[a("div",$s,[S.value==="errors"?(u(),d("div",Es,[a("div",Ds,[a("label",Vs,o(n(s)("usage.errors.keyName")),1),g(M,{modelValue:$.value.api_key_id,"onUpdate:modelValue":t[7]||(t[7]=l=>$.value.api_key_id=l),options:Je.value,onChange:H},null,8,["modelValue","options"])]),a("div",Ts,[a("label",Us,o(n(s)("usage.errors.model")),1),g(M,{modelValue:$.value.model,"onUpdate:modelValue":t[8]||(t[8]=l=>$.value.model=l),options:We.value,searchable:"",creatable:"",clearable:"",placeholder:n(s)("usage.errors.modelPlaceholder"),onChange:H},null,8,["modelValue","options","placeholder"])]),a("div",Ms,[a("label",Rs,o(n(s)("usage.errors.category")),1),g(M,{modelValue:$.value.category,"onUpdate:modelValue":t[9]||(t[9]=l=>$.value.category=l),options:Qe.value,onChange:H},null,8,["modelValue","options"])]),a("div",qs,[a("label",Ls,o(n(s)("usage.errors.status")),1),g(M,{modelValue:$.value.status_code,"onUpdate:modelValue":t[10]||(t[10]=l=>$.value.status_code=l),options:Xe.value,onChange:H},null,8,["modelValue","options"])])])):(u(),d("div",zs,[a("div",Fs,[a("label",Is,o(n(s)("usage.apiKeyFilter")),1),g(M,{modelValue:y.value.api_key_id,"onUpdate:modelValue":t[11]||(t[11]=l=>y.value.api_key_id=l),options:st.value,onChange:F},null,8,["modelValue","options"])]),a("div",Os,[a("label",Bs,o(n(s)("usage.model")),1),g(M,{modelValue:y.value.model,"onUpdate:modelValue":t[12]||(t[12]=l=>y.value.model=l),options:ot.value,searchable:"",onChange:F},null,8,["modelValue","options"])]),a("div",As,[a("label",Ps,o(n(s)("admin.usage.group")),1),g(M,{modelValue:y.value.group_id,"onUpdate:modelValue":t[13]||(t[13]=l=>y.value.group_id=l),options:lt.value,searchable:"",onChange:F},null,8,["modelValue","options"])]),a("div",Ns,[a("label",Ks,o(n(s)("usage.type")),1),g(M,{modelValue:y.value.request_type,"onUpdate:modelValue":t[14]||(t[14]=l=>y.value.request_type=l),options:et.value,onChange:F},null,8,["modelValue","options"])]),a("div",Gs,[a("label",js,o(n(s)("admin.usage.billingType")),1),g(M,{modelValue:y.value.billing_type,"onUpdate:modelValue":t[15]||(t[15]=l=>y.value.billing_type=l),options:tt.value,onChange:F},null,8,["modelValue","options"])]),a("div",Hs,[a("label",Js,o(n(s)("admin.usage.billingMode")),1),g(M,{modelValue:y.value.billing_mode,"onUpdate:modelValue":t[16]||(t[16]=l=>y.value.billing_mode=l),options:at.value,onChange:F},null,8,["modelValue","options"])])])),a("div",Ws,[a("button",{type:"button",onClick:Te,disabled:S.value==="errors"?Q.value:f.value,class:"btn btn-secondary"},o(n(s)("common.refresh")),9,Ys),a("button",{type:"button",onClick:nt,class:"btn btn-secondary"},o(n(s)("common.reset")),1),a("div",{class:"relative",ref_key:"columnDropdownRef",ref:me},[a("button",{type:"button",onClick:t[17]||(t[17]=l=>se.value=!se.value),class:"btn btn-secondary px-2 md:px-3",title:n(s)("admin.users.columnSettings")},[g(Ae,{name:"grid",size:"sm"}),a("span",Xs,o(n(s)("admin.users.columnSettings")),1)],8,Qs),se.value?(u(),d("div",Zs,[(u(!0),d(Pe,null,la(Ct.value,l=>(u(),d("button",{key:l.key,type:"button",onClick:K=>Et(l.key),class:"flex w-full items-center justify-between px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-dark-700"},[a("span",null,o(l.label),1),$t(l.key)?(u(),j(Ae,{key:0,name:"check",size:"sm",class:"text-primary-500"})):T("",!0)],8,el))),128))])):T("",!0)],512),S.value!=="errors"?(u(),d("button",{key:0,t
2ype:"button",onClick:pt,disabled:r.value,class:"btn btn-primary"},o(r.value?n(s)("usage.exporting"):n(s)("usage.exportCsv")),9,tl)):T("",!0)])])]),Ce.value?(u(),d("div",al,[a("button",{class:Y(["tab",{"tab-active":S.value==="usage"}]),onClick:t[18]||(t[18]=l=>S.value="usage")},o(n(s)("usage.tabs.usage")),3),a("button",{class:Y(["tab",{"tab-active":S.value==="errors"}]),onClick:Rt},o(n(s)("usage.tabs.errors")),3)])):T("",!0),S.value==="usage"?(u(),d(Pe,{key:1},[g(Wt,{data:b.value,loading:f.value,columns:_t.value,"server-side-sort":!0,"show-account-billing":!1,"show-upstream-endpoint":!1,"default-sort-key":"created_at","default-sort-order":"desc",onSort:ct,onIpGeoBatchFailed:Ue},null,8,["data","loading","columns"]),C.total>0?(u(),j(je,{key:0,page:C.page,total:C.total,"page-size":C.page_size,"onUpdate:page":ut,"onUpdate:pageSize":dt},null,8,["page","total","page-size"])):T("",!0)],64)):Ce.value?(u(),j(ms,{key:2,rows:L.value,total:ne.value,loading:Q.value,page:P.value,"page-size":re.value,"visible-column-keys":ht.value,onSort:Tt,"onUpdate:page":Ut,"onUpdate:pageSize":Mt,onIpGeoBatchFailed:Ue},null,8,["rows","total","loading","page","page-size","visible-column-keys"])):T("",!0)])]),_:1}))}});export{$l 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.