1import{g as At,h as je,a as Nt,a2 as Kt,_ as Pe,a8 as Gt,K as jt}from"./index-Dg7iAOYr.js";import{k as Ae}from"./AppHeader.vue_vue_type_style_index_0_scoped_25b0c839_lang-B0lsvCqV.js";import{g as Ht,u as G}from"./usage-DsKpGxd5.js";import{u as Wt}from"./groups-u1Mee6N9.js";import{_ as Yt}from"./AppLayout.vue_vue_type_script_setup_true_lang-CDGJUeC2.js";import{P as He}from"./Pagination-CXXT1YBd.js";import{S as V}from"./Select-D8cj2YCx.js";import{D as Jt,_ as Qt}from"./TokenUsageTrend.vue_vue_type_script_setup_true_lang-BCE9MD51.js";import{r as Xt,_ as Zt,a as ea,b as ta,g as aa,c as sa,d as la}from"./GroupDistributionChart.vue_vue_type_script_setup_true_lang-Ba2QWabV.js";import{a as oa}from"./ModelDistributionChart.vue_vue_type_script_setup_true_lang-CvZaR2yo.js";import{_ as ra}from"./EndpointDistributionChart.vue_vue_type_script_setup_true_lang-DPWOvRrW.js";import{d as ve,r as i,w as We,D as j,u as n,K as w,z as d,E,B as a,G as o,A as J,C as u,c as m,k as c,U as na,q as oe,o as ia,a as ua,F as Ne,V as da}from"./vendor-vue-Dzwqm9Y9.js";import{D as ca}from"./DataTable-DjIYOVxu.js";import{_ as ga}from"./EmptyState.vue_vue_type_script_setup_true_lang-vqww5YOW.js";import{u as _e}from"./vendor-i18n-BuoWFzps.js";import{_ as ma,a as pa,s as va,n as _a,r as ya,b as ba,m as fa,C as ka}from"./errorBadges-B3nXROVy.js";import{g as ha}from"./usePersistedPageSize-x0WpaIWh.js";import"./vendor-misc-B-nM3tYW.js";import"./useClipboard-DI2IZ1WO.js";import"./LocaleSwitcher-BZZz6YQD.js";/* empty css */import"./vendor-chart-BNlN3Otn.js";import"./LoadingSpinner-CObn9Zi-.js";const xa={key:0,class:"flex justify-center py-10"},wa={key:1,class:"py-8 text-center text-sm text-red-500"},Sa={key:2,class:"space-y-4 text-sm"},Ca={class:"grid grid-cols-2 gap-x-6 gap-y-3"},$a={class:"font-medium text-gray-500 dark:text-dark-400"},Ea={class:"mt-0.5 text-gray-900 dark:text-dark-100"},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"},Fa={class:"font-medium text-gray-500 dark:text-dark-400"},Ma={class:"mt-0.5"},Ra={class:"font-medium text-gray-500 dark:text-dark-400"},qa={class:"mt-0.5 text-gray-900 dark:text-dark-100"},za={class:"font-medium text-gray-500 dark:text-dark-400"},La={class:"mt-0.5 text-gray-900 dark:text-dark-100"},Oa={key:0},Ia={class:"font-medium text-gray-500 dark:text-dark-400"},Ba={class:"mt-0.5 text-gray-900 dark:text-dark-100"},Pa={key:0},Aa={class:"font-medium text-gray-500 dark:text-dark-400"},Na={class:"mt-0.5 text-gray-900 dark:text-dark-100 break-all"},Ka={key:1},Ga={class:"font-medium text-gray-500 dark:text-dark-400"},ja={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"},Ha=ve({__name:"UserErrorDetailModal",props:{show:{type:Boolean},errorId:{}},emits:["update:show"],setup(D,{emit:s}){const f=D,P=s,{t:b}=_e(),g=i(!1),T=i(!1),p=i(null);We(()=>[f.show,f.errorId],([h,k])=>{h&&k!=null?R(k):h||(p.value=null,T.value=!1)});async function R(h){g.value=!0,T.value=!1,p.value=null;try{p.value=await Ht(h)}catch(k){console.error("[UserErrorDetailModal] Failed to load error detail:",k),T.value=!0}finally{g.value=!1}}function q(h){return h>=500?"badge-danger":h===429?"badge-warning":"badge-gray"}return(h,k)=>(u(),j(At,{show:D.show,title:n(b)("usage.errors.detail.title"),width:"wide",onClose:k[0]||(k[0]=A=>P("update:show",!1))},{default:w(()=>[g.value?(u(),d("div",xa,[...k[1]||(k[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)])])):T.value?(u(),d("div",wa,o(n(b)("usage.errors.detail.loadFailed")),1)):p.value?(u(),d("div",Sa,[a("div",Ca,[a("div",null,[a("span",$a,o(n(b)("usage.errors.time")),1),a("p",Ea,o(n(je)(p.value.created_at)),1)]),a("div",null,[a("span",Da,o(n(b)("usage.errors.model")),1),a("p",Va,o(p.value.model||"-"),1)]),a("div",null,[a("span",Ta,o(n(b)("usage.errors.endpoint")),1),a("p",Ua,o(p.value.inbound_endpoint||"-"),1)]),a("div",null,[a("span",Fa,o(n(b)("usage.errors.status")),1),a("p",Ma,[a("span",{class:J(["badge",q(p.value.status_code)])},o(p.value.status_code||"-"),3)])]),a("div",null,[a("span",Ra,o(n(b)("usage.errors.category")),1),a("p",qa,o(n(b)("usage.errors.categories."+p.value.category)),1)]),a("div",null,[a("span",za,o(n(b)("usage.errors.platform")),1),a("p",La,o(p.value.platform||"-"),1)]),p.value.upstream_status_code!=null?(u(),d("div",Oa,[a("span",Ia,o(n(b)("usage.errors.detail.upstreamStatus")),1),a("p",Ba,o(p.value.upstream_status_code),1)])):E("",!0)]),p.value.message?(u(),d("div",Pa,[a("span",Aa,o(n(b)("usage.errors.message")),1),a("p",Na,o(p.value.message),1)])):E("",!0),p.value.error_body?(u(),d("div",Ka,[a("span",Ga,o(n(b)("usage.errors.detail.responseBody")),1),a("pre",ja,o(p.value.error_body),1)])):E("",!0)])):E("",!0)]),_:1},8,["show","title"]))}}),Wa={class:"flex min-h-0 flex-1 flex-col"},Ya={class:"card flex min-h-0 flex-1 flex-col overflow-hidden"},Ja={key:0,class:"text-sm font-medium text-gray-900 dark:text-white"},Qa={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},Xa={class:"text-sm"},Za={class:"text-gray-900 dark:text-white"},es={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"},ts={class:"max-w-[320px] text-xs"},as={class:"break-all text-gray-700 dark:text-gray-300"},ss={class:"font-medium text-gray-500 dark:text-gray-400"},ls={class:"ml-1"},os={class:"text-sm text-gray-900 dark:text-white"},rs=["title"],ns={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},is={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"},us={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},ds={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},cs={class:"text-sm text-gray-900 dark:text-white"},gs={key:0},ms={class:"text-sm font-mono text-gray-600 dark:text-gray-400"}
1,ps={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},vs={class:"text-sm text-gray-600 dark:text-gray-400"},_s=["title"],ys={key:1,class:"text-sm text-gray-400 dark:text-gray-500"},bs={class:"flex-shrink-0"},fs=ve({__name:"UserErrorRequestsTable",props:{rows:{},total:{},loading:{type:Boolean},page:{},pageSize:{},visibleColumnKeys:{}},emits:["update:page","update:pageSize","ipGeoBatchFailed","sort"],setup(D,{emit:s}){const f=D,P=s;function b(x,_){P("sort",fa(x),_)}const{t:g}=_e(),T=m(()=>[{key:"key_name",label:g("usage.errors.keyName")},{key:"model",label:g("usage.errors.model"),sortable:!0},{key:"endpoint",label:g("usage.errors.endpoint")},{key:"client_ip",label:"IP"},{key:"group",label:g("admin.usage.group")},{key:"type",label:g("usage.type")},{key:"platform",label:g("usage.errors.platform")},{key:"category",label:g("usage.errors.category")},{key:"status",label:g("usage.errors.status"),sortable:!0},{key:"message",label:g("usage.errors.message")},{key:"created_at",label:g("usage.errors.time"),sortable:!0},{key:"user_agent",label:g("usage.userAgent")}]),p=m(()=>f.visibleColumnKeys?T.value.filter(x=>f.visibleColumnKeys.includes(x.key)):T.value);function R(x){const _=_a(x.request_type,x.stream);return _?{label:g(ba(_)),className:ya(_)}:null}const q=i(!1),h=i(null);function k(x){h.value=x,q.value=!0}const A=va;return(x,_)=>(u(),d("div",Wa,[a("div",Ya,[c(ma,{ips:D.rows.map(r=>r.client_ip),onFailed:_[0]||(_[0]=r=>P("ipGeoBatchFailed"))},null,8,["ips"]),c(ca,{columns:p.value,data:D.rows,loading:D.loading,"clickable-rows":"","server-side-sort":"","default-sort-key":"created_at","default-sort-order":"desc",onSort:b,onRowClick:_[2]||(_[2]=r=>k(r.id))},{"cell-model":w(({row:r})=>[r.model?(u(),d("span",Ja,o(r.model),1)):(u(),d("span",Qa,"-"))]),"cell-key_name":w(({row:r})=>[a("div",Xa,[a("span",Za,o(r.key_name||"-"),1),r.key_deleted?(u(),d("span",es,o(n(g)("usage.errors.keyDeleted")),1)):E("",!0)])]),"cell-endpoint":w(({row:r})=>{var L;return[a("div",ts,[a("div",as,[a("span",ss,o(n(g)("usage.inbound"))+":",1),a("span",ls,o(((L=r.inbound_endpoint)==null?void 0:L.trim())||"-"),1)])])]}),"cell-status":w(({row:r})=>[a("span",{class:J(["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",os,o(n(g)("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,rs)):(u(),d("span",ns,"-"))]),"cell-group":w(({row:r})=>[r.group_name?(u(),d("span",is,o(r.group_name),1)):(u(),d("span",us,"-"))]),"cell-type":w(({row:r})=>[R(r)?(u(),d("span",{key:0,class:J(["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",ds,"-"))]),"cell-platform":w(({row:r})=>[a("span",cs,o(r.platform||"-"),1)]),"cell-client_ip":w(({row:r})=>[a("div",{onClick:_[1]||(_[1]=na(()=>{},["stop"]))},[r.client_ip?(u(),d("div",gs,[a("span",ms,o(r.client_ip),1),c(pa,{ip:r.client_ip},null,8,["ip"])])):(u(),d("span",ps,"-"))])]),"cell-created_at":w(({row:r})=>[a("span",vs,o(n(je)(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,_s)):(u(),d("span",ys,"-"))]),empty:w(()=>[c(ga,{message:n(g)("usage.errors.empty")},null,8,["message"])]),_:1},8,["columns","data","loading"])]),a("div",bs,[D.total>0?(u(),j(He,{key:0,page:D.page,"page-size":D.pageSize,total:D.total,"onUpdate:page":_[3]||(_[3]=r=>x.$emit("update:page",r)),"onUpdate:pageSize":_[4]||(_[4]=r=>x.$emit("update:pageSize",r))},null,8,["page","page-size","total"])):E("",!0)]),c(Ha,{show:q.value,"onUpdate:show":_[5]||(_[5]=r=>q.value=r),"error-id":h.value},null,8,["show","error-id"])]))}}),ks={class:"space-y-6"},hs={class:"space-y-4"},xs={class:"card p-4"},ws={class:"flex flex-wrap items-center gap-4"},Ss={class:"flex items-center gap-2"},Cs={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},$s={class:"ml-auto flex items-center gap-2"},Es={class:"text-sm font-medium text-gray-700 dark:text-gray-300"},Ds={class:"w-28"},Vs={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},Ts={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},Us={class:"card p-6"},Fs={class:"flex flex-wrap items-end justify-between gap-4"},Ms={key:0,class:"flex flex-1 flex-wrap items-end gap-4"}
1,Rs={class:"w-full sm:w-auto sm:min-w-[220px]"},qs={class:"input-label"},zs={class:"w-full sm:w-auto sm:min-w-[220px]"},Ls={class:"input-label"},Os={class:"w-full sm:w-auto sm:min-w-[200px]"},Is={class:"input-label"},Bs={class:"w-full sm:w-auto sm:min-w-[180px]"},Ps={class:"input-label"},As={key:1,class:"flex flex-1 flex-wrap items-end gap-4"},Ns={class:"w-full sm:w-auto sm:min-w-[220px]"},Ks={class:"input-label"},Gs={class:"w-full sm:w-auto sm:min-w-[220px]"},js={class:"input-label"},Hs={class:"w-full sm:w-auto sm:min-w-[200px]"},Ws={class:"input-label"},Ys={class:"w-full sm:w-auto sm:min-w-[180px]"},Js={class:"input-label"},Qs={class:"w-full sm:w-auto sm:min-w-[180px]"},Xs={class:"input-label"},Zs={key:0,class:"w-full sm:w-auto sm:min-w-[200px]"},el={class:"input-label"},tl={class:"w-full sm:w-auto sm:min-w-[200px]"},al={class:"input-label"},sl={class:"flex w-full flex-wrap items-center justify-end gap-3 sm:w-auto"},ll=["disabled"],ol=["title"],rl={class:"hidden md:inline"},nl={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"},il=["data-testid","onClick"],ul=["disabled"],dl={key:0,class:"flex gap-2 border-b border-gray-200 dark:border-dark-700"},Ke="user-usage-hidden-columns",Ge="user-usage-error-hidden-columns",Rl=ve({__name:"UsageView",setup(D){const{t:s}=_e(),f=Nt(),P=i(null),b=i([]),g=i([]),T=i([]),p=i([]),R=i([]),q=i([]),h=i([]),k=i(!1),A=i(!1),x=i(!1),_=i(!1),r=i(!1),L=i([]),Q=i(!1),N=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}),Ye=m(()=>[{value:null,label:s("usage.errors.allKeys")},...de.value.map(e=>({value:e.id,label:e.name}))]),Je=m(()=>{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}),Qe=["auth","rate_limit","quota","invalid_request","service_unavailable","upstream","internal","cyber"],Xe=m(()=>[{value:"",label:s("usage.errors.allCategories")},...Qe.map(e=>({value:e,label:s("usage.errors.categories."+e)}))]),Ze=m(()=>[{value:null,label:s("usage.errors.allStatuses")},...ka.map(e=>({value:e,label:String(e)}))]),H=()=>{N.value=1,K()};let O=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(),M=new Date(`${t}T00:00:00`).getTime();return Math.ceil((M-l)/(1e3*60*60*24))<=1?"hour":"day"},he=ke(),U=i(he.start),F=i(he.end),W=i(ie(U.value,F.value)),xe=i("tokens"),we=i("tokens"),Se=i("tokens"),ue=i("inbound"),S=i("usage"),Ce=m(()=>{var e;return((e=f.cachedPublicSettings)==null?void 0:e.allow_user_view_error_requests)??!1}),y=i({start_date:U.value,end_date:F.value,request_type:void 0,native_compaction_v2:null,billing_type:null,billing_mode:null}),C=oe({page:1,page_size:ha(),total:0}),te=oe({sort_by:"created_at",sort_order:"desc"}),et=m(()=>[{value:"day",label:s("admin.dashboard.day")},{value:"hour",label:s("admin.dashboard.hour")}]),tt=m(()=>[{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")}]),at=m(()=>[{value:null,label:s("usage.allCompactionTypes")},{value:!0,label:s("usage.compactionOnly")}]),st=m(()=>Kt(f.cachedPublicSettings,jt.subscription)),lt=m(()=>[{value:null,label:s("admin.usage.allBillingTypes")},{value:0,label:s("admin.usage.billingTypeBalance")},{value:1,label:s("admin.usage.billingTypeSubscription")}]),ot=m(()=>[{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([]),rt=m(()=>[{value:null,label:s("usage.allApiKeys")},...de.value.map(e=>({value:e.id,label:e.name}))]),nt=m(()=>[{value:null,label:s("admin.usage.allGroups")},...$e.value.map(e=>({value:e.id,label:e.name}))]),it=m(()=>[{value:null,label:s("admin.usage.allModels")},...ce.value.map(e=>({value:e,label:e}))]),ae=m(()=>{const e=y.value.request_type,t=e?Xt(e):y.value.stream;
1return{...y.value,start_date:U.value,end_date:F.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}),Y=async()=>{O==null||O.abort();const e=new AbortController;O=e,k.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"&&f.showError(s("usage.failedToLoad"))}finally{O===e&&(k.value=!1)}},De=async()=>{const e=++Z;_.value=!0;try{const t=await G.getStats(ae.value);if(e!==Z)return;P.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&&(_.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;T.value=t.models||[],ut(t.models||[])}catch(t){if(e!==ee)return;console.error("Failed to load model stats:",t),T.value=[]}finally{e===ee&&(x.value=!1)}},ge=async()=>{const e=++X;A.value=!0;try{const t=await G.getDashboardSnapshotV2({...ae.value,granularity:W.value,include_trend:!0,include_model_stats:!1,include_group_stats:!0});if(e!==X)return;g.value=t.trend||[],p.value=t.groups||[]}catch(t){if(e!==X)return;console.error("Failed to load chart data:",t),g.value=[],p.value=[]}finally{e===X&&(A.value=!1)}},ut=e=>{const t=y.value.model,l=new Set(ce.value);e.forEach(M=>{M.model&&l.add(M.model)}),t&&l.add(t),ce.value=Array.from(l).sort()},z=()=>{C.page=1,Y(),De(),Ve(),ge(),Mt()},Te=()=>{Y(),De(),Ve(),ge(),S.value==="errors"&&K()},dt=()=>{const e=ke();U.value=e.start,F.value=e.end,y.value={start_date:e.start,end_date:e.end,request_type:void 0,native_compaction_v2:null,billing_type:null,billing_mode:null},W.value=ie(e.start,e.end),z(),S.value==="errors"&&($.value={model:"",category:"",api_key_id:null,status_code:null},H())},ct=e=>{U.value=e.startDate,F.value=e.endDate,y.value.start_date=e.startDate,y.value.end_date=e.endDate,W.value=ie(e.startDate,e.endDate),z()},gt=e=>{C.page=e,Y()},mt=e=>{C.page_size=e,C.page=1,Y()},pt=(e,t)=>{te.sort_by=e,te.sort_order=t,C.page=1,Y()},Ue=()=>{f.showError(s("usage.ipGeo.batchFailed"))},vt=e=>{const t=la(e);return t==="cyber"?"Cyber":t==="live"?"Live":t==="ws_v2"?"WS":t==="stream"?"Stream":t==="sync"?"Sync":"Unknown"},_t=e=>sa(e),Fe=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},yt=async()=>{if(C.total===0){f.showWarning(s("usage.noDataToExport"));return}r.value=!0,f.showInfo(s("usage.preparingExport"));try{const e=[],l=Ee(1,100),M=Math.ceil(C.total/100);for(let v=1;v<=M;v++){const le=await G.query({...l,page:v});e.push(...le.items)}if(e.length===0){f.showWarning(s("usage.noDataToExport"));return}const Ot=["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)"],It=e.map(v=>{var le;return[v.created_at,((le=v.api_key)==null?void 0:le.name)||"",v.model,Gt(v.reasoning_effort),v.inbound_endpoint||"",v.ip_address||"",vt(v),aa(_t(v),s),v.input_tokens,v.output_tokens,v.cache_read_tokens,v.cache_creation_tokens,v.rate_multiplier,v.actual_cost.toFixed(8),v.total_cost.toFixed(8),v.first_token_ms??"",v.duration_ms??""].map(Fe)}),Bt=[Ot.map(Fe).join(","),...It.map(v=>v.join(","))].join(` 2`),Pt=new Blob(["\uFEFF"+Bt],{type:"text/csv;charset=utf-8;"}),Be=window.URL.createObjectURL(Pt),pe=document.createElement("a");pe.href=Be,pe.download=`usage_${l.start_date}_to_${l.end_date}.csv`,pe.click(),window.URL.revokeObjectURL(Be),f.showSuccess(s("usage.exportSuccess"))}catch(e){console.error("CSV Export failed:",e),f.showError(s("usage.exportFailed"))}finally{r.value=!1}},Me=["created_at"],Re=["user_agent"],qe=m(()=>[{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),bt=m(()=>qe.value.filter(e=>
2!Me.includes(e.key))),ft=m(()=>qe.value.filter(e=>Me.includes(e.key)||!I.has(e.key))),kt=e=>!I.has(e),ht=e=>{I.has(e)?I.delete(e):I.add(e),localStorage.setItem(Ke,JSON.stringify([...I]))},xt=()=>{try{const e=localStorage.getItem(Ke);(e?JSON.parse(e):Re).forEach(l=>I.add(l))}catch{Re.forEach(e=>I.add(e))}},ze=["status","created_at"],Le=["user_agent"],Oe=m(()=>[{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")}]),B=oe(new Set),wt=m(()=>Oe.value.filter(e=>!ze.includes(e.key))),St=m(()=>Oe.value.filter(e=>ze.includes(e.key)||!B.has(e.key)).map(e=>e.key)),Ct=e=>!B.has(e),$t=e=>{B.has(e)?B.delete(e):B.add(e),localStorage.setItem(Ge,JSON.stringify([...B]))},Et=()=>{try{const e=localStorage.getItem(Ge);(e?JSON.parse(e):Le).forEach(l=>B.add(l))}catch{Le.forEach(e=>B.add(e))}},Dt=m(()=>S.value==="errors"?wt.value:bt.value),Vt=e=>S.value==="errors"?Ct(e):kt(e),Tt=e=>{S.value==="errors"?$t(e):ht(e)},se=i(!1),me=i(null),Ie=e=>{me.value&&!me.value.contains(e.target)&&(se.value=!1)},Ut=async()=>{const e=await Ae.list(1,100),t=[...e.items];for(let l=2;l<=e.pages&&t.length>0;l++){const M=await Ae.list(l,100);if(M.items.length===0)break;t.push(...M.items)}return t},Ft=async()=>{try{const[e,t]=await Promise.all([Ut(),Wt.getAvailable()]);de.value=e,$e.value=t}catch(e){console.error("Failed to load usage filter options:",e)}},Mt=()=>{N.value=1,S.value==="errors"?K():(L.value=[],ne.value=0)},K=async()=>{Q.value=!0;try{const e=await G.listMyErrorRequests({page:N.value,page_size:re.value,start_date:U.value,end_date:F.value,model:($.value.model??"").trim()||void 0,category:$.value.category||void 0,api_key_id:$.value.a
2pi_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),f.showError(s("usage.errors.failedToLoad"))}finally{Q.value=!1}},Rt=(e,t)=>{ye.value=e,be.value=t,N.value=1,K()},qt=e=>{N.value=e,K()},zt=e=>{re.value=e,N.value=1,K()},Lt=()=>{S.value="errors",L.value.length===0&&K()};return ia(()=>{xt(),Et(),document.addEventListener("click",Ie),Ft(),Te()}),ua(()=>{O==null||O.abort(),document.removeEventListener("click",Ie)}),We(ue,()=>{}),(e,t)=>(u(),j(Yt,null,{default:w(()=>[a("div",ks,[c(Zt,{stats:P.value,"show-account-cost":!1,"strike-standard-cost":!0},null,8,["stats"]),a("div",hs,[a("div",xs,[a("div",ws,[a("div",Ss,[a("span",Cs,o(n(s)("admin.dashboard.timeRange"))+":",1),c(Jt,{"start-date":U.value,"onUpdate:startDate":t[0]||(t[0]=l=>U.value=l),"end-date":F.value,"onUpdate:endDate":t[1]||(t[1]=l=>F.value=l),onChange:ct},null,8,["start-date","end-date"])]),a("div",$s,[a("span",Es,o(n(s)("admin.dashboard.granularity"))+":",1),a("div",Ds,[c(V,{modelValue:W.value,"onUpdate:modelValue":t[2]||(t[2]=l=>W.value=l),options:et.value,onChange:ge},null,8,["modelValue","options"])])])])]),a("div",Vs,[c(oa,{metric:xe.value,"onUpdate:metric":t[3]||(t[3]=l=>xe.value=l),"model-stats":T.value,loading:x.value,"show-source-toggle":!1,"show-metric-toggle":!0,"enable-breakdown":!1,"show-account-cost":!1,"start-date":U.value,"end-date":F.value},null,8,["metric","model-stats","loading","start-date","end-date"]),c(ea,{metric:we.value,"onUpdate:metric":t[4]||(t[4]=l=>we.value=l),"group-stats":p.value,loading:A.value,"show-metric-toggle":!0,"enable-breakdown":!1,"show-account-cost":!1,"start-date":U.value,"end-date":F.value},null,8,["metric","group-stats","loading","start-date","end-date"])]),a("div",Ts,[c(ra,{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:_.value,"show-source-toggle":!1,"show-metric-toggle":!0,"enable-breakdown":!1,title:n(s)("usage.endpointDistribution"),"start-date":U.value,"end-date":F.value},null,8,["source","metric","endpoint-stats","upstream-endpoint-stats","endpoint-path-stats","loading","title","start-date","end-date"]),c(Qt,{"trend-data":g.value,loading:A.value},null,8,["trend-data","loading"])])]),a("div",Us,[a("div",Fs,[S.value==="errors"?(u(),d("div",Ms,[a("div",Rs,[a("label",qs,o(n(s)("usage.errors.keyName")),1),c(V,{modelValue:$.value.api_key_id,"onUpdate:modelValue":t[7]||(t[7]=l=>$.value.api_key_id=l),options:Ye.value,onChange:H},null,8,["modelValue","options"])]),a("div",zs,[a("label",Ls,o(n(s)("usage.errors.model")),1),c(V,{modelValue:$.value.model,"onUpdate:modelValue":t[8]||(t[8]=l=>$.value.model=l),options:Je.value,searchable:"",creatable:"",clearable:"",placeholder:n(s)("usage.errors.modelPlaceholder"),onChange:H},null,8,["modelValue","options","placeholder"])]),a("div",Os,[a("label",Is,o(n(s)("usage.errors.category")),1),c(V,{modelValue:$.value.category,"onUpdate:modelValue":t[9]||(t[9]=l=>$.value.category=l),options:Xe.value,onChange:H},null,8,["modelValue","options"])]),a("div",Bs,[a("label",Ps,o(n(s)("usage.errors.status")),1),c(V,{modelValue:$.value.status_code,"onUpdate:modelValue":t[10]||(t[10]=l=>$.value.status_code=l),options:Ze.value,onChange:H},null,8,["modelValue","options"])])])):(u(),d("div",As,[a("div",Ns,[a("label",Ks,o(n(s)("usage.apiKeyFilter")),1),c(V,{modelValue:y.value.api_key_id,"onUpdate:modelValue":t[11]||(t[11]=l=>y.value.api_key_id=l),options:rt.value,onChange:z},null,8,["modelValue","options"])]),a("div",Gs,[a("label",js,o(n(s)("usage.model")),1),c(V,{modelValue:y.value.model,"onUpdate:modelValue":t[12]||(t[12]=l=>y.value.model=l),options:it.value,searchable:"",onChange:z},null,8,["modelValue","options"])]),a("div",Hs,[a("label",Ws,o(n(s)("admin.usage.group")),1),c(V,{modelValue:y.value.group_id,"onUpdate:modelValue":t[13]||(t[13]=l=>y.value.group_id=l),options:nt.value,searchable:"",onChange:z},null,8,["modelValue","options"])]),a("div",Ys,[a("label",Js,o(n(s)("usage.type")),1),c(V,{modelValue:y.value.request_type,"onUpdate:modelValue":t[14]||(t[14]=l=>y.value.request_type=l),options:tt.value,onChange:z},null,8,["modelValue","options"])]),a("div",Qs,[a("label",Xs,o(n(s)("usage.compactionFilter")),1),c(V,{modelValue:y.value.native_compaction_v2,"onUpdate:modelValue":t[15]||(t[15]=l=>y.value.native_compaction_v2=l),options:at.value,onChange:z},null,8,["modelValue","options"])]),st.value?(u(),d("div",Zs,[a("label",el,o(n(s)("admin.usage.billingType")),1),c(V,{modelValue:y.value.billing_type,"onUpdate:modelValue":t[16]||(t[16]=l=>y.value.billing_type=l),options:lt.value,onChange:z},null,8,["modelValue","options"])])):E("",!0),a("div",tl,[a("label",al,o(n(s)("admin.usage.billingMode")),1),c(V,{modelValue:y.value.billing_mode,"onUpdate:modelValue":t[17]||(t[17]=l=>y.value.billing_mode=l),options:ot.value,onChange:z},null,8,["modelValue","options"])])])),a("div",sl,[a("button",{type:"button",onClick:Te,disabled:S.value==="errors"?Q.value:k.value,class:"btn btn-secondary"},o(n(s)("common.refresh")),9,ll),a("button",{type:"button",onClick:dt,class:"btn btn-secondary"},o(n(s)("common.reset")),1),a("div",{class:"relative",ref_key:"columnDropdownRef",ref:me},[a("button",{type:"button","data-testid":"usage-column-settings",onClick:t[18]||(t[18]=l=>se.value=!se.value),class:"btn btn-secondary px-2 md:px-3",title:n(s)("admin.users.columnSettings")},[c(Pe,{name:"grid",size:"sm"}),a("span",rl,o(n(s)("admin.users.columnSettings")),1)],8,ol),se.value?(u(),d("div",nl,[(u(!0),d(Ne,null,da(Dt.value,l=>(u(),d("button",{key:l.key,type:"button","data-testid":`usage-column-toggle-${l.key}`,onClick:M=>Tt(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),Vt(l.key)?(u(),j(Pe,{key:0,name:"check",size:"sm",class:"text-primary-500"})):E("",!0)],8,il))),128))])):E("",!0)],512),S.value!=="errors"?(u(),d("button",{key:0,t
2ype:"button",onClick:yt,disabled:r.value,class:"btn btn-primary"},o(r.value?n(s)("usage.exporting"):n(s)("usage.exportCsv")),9,ul)):E("",!0)])])]),Ce.value?(u(),d("div",dl,[a("button",{class:J(["tab",{"tab-active":S.value==="usage"}]),onClick:t[19]||(t[19]=l=>S.value="usage")},o(n(s)("usage.tabs.usage")),3),a("button",{class:J(["tab",{"tab-active":S.value==="errors"}]),onClick:Lt},o(n(s)("usage.tabs.errors")),3)])):E("",!0),S.value==="usage"?(u(),d(Ne,{key:1},[c(ta,{data:b.value,loading:k.value,columns:ft.value,"server-side-sort":!0,"show-account-billing":!1,"show-upstream-endpoint":!1,"default-sort-key":"created_at","default-sort-order":"desc",onSort:pt,onIpGeoBatchFailed:Ue},null,8,["data","loading","columns"]),C.total>0?(u(),j(He,{key:0,page:C.page,total:C.total,"page-size":C.page_size,"onUpdate:page":gt,"onUpdate:pageSize":mt},null,8,["page","total","page-size"])):E("",!0)],64)):Ce.value?(u(),j(fs,{key:2,rows:L.value,total:ne.value,loading:Q.value,page:N.value,"page-size":re.value,"visible-column-keys":St.value,onSort:Rt,"onUpdate:page":qt,"onUpdate:pageSize":zt,onIpGeoBatchFailed:Ue},null,8,["rows","total","loading","page","page-size","visible-column-keys"])):E("",!0)])]),_:1}))}});export{Rl 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.