PageSourceSearch

https://ns.org.nz/assets/UsageView-6VGRwCUc.js

js ns.org.nz collected 2026-10-02 13:30:40 UTC 29,855 bytes, 2 lines download raw bytes

1import{g as At,h as je,a as Nt,a1 as Kt,_ as Pe,a8 as Gt,J as jt}from"./index-DajaXR7V.js";import{k as Ae}from"./AppHeader.vue_vue_type_style_index_0_scoped_59fb3e77_lang-Byu4umtj.js";import{g as Ht,u as G}from"./usage-i6-K-vdL.js";import{u as Wt}from"./groups-CltzQ3Vj.js";import{_ as Jt}from"./AppLayout.vue_vue_type_script_setup_true_lang-JfP_0peg.js";import{P as He}from"./Pagination-_CpJhwyV.js";import{S as T}from"./Select-CoBc91Of.js";import{D as Yt,_ as Qt}from"./TokenUsageTrend.vue_vue_type_script_setup_true_lang-BqlcVa2A.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-BieEecuT.js";import{a as oa}from"./ModelDistributionChart.vue_vue_type_script_setup_true_lang-aKRB1WJz.js";import{_ as ra}from"./EndpointDistributionChart.vue_vue_type_script_setup_true_lang-_83NdpIq.js";import{d as ve,r as i,w as We,D as j,u as n,K as w,z as d,E as D,B as a,G as o,A as Y,C as u,c as p,k as c,V as na,q as oe,o as ia,a as ua,F as Ne,W as da}from"./vendor-vue-BVJWaRIf.js";import{D as ca}from"./DataTable-Bc9gam4x.js";import{_ as ga}from"./EmptyState.vue_vue_type_script_setup_true_lang-YIbkRpkA.js";import{u as _e}from"./vendor-i18n-pgwztqC8.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-PpUHtANa.js";import{g as ha}from"./usePersistedPageSize-x0WpaIWh.js";import"./vendor-misc-WKm5Kdig.js";import"./useClipboard-CMfQ2Hei.js";import"./LocaleSwitcher-2gZiNgay.js";/* empty css                                                                       */import"./vendor-chart-M5tlAGIn.js";import"./LoadingSpinner-Bt8vP3pa.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(V,{emit:s}){const h=V,A=s,{t:k}=_e(),g=i(!1),U=i(!1),v=i(null);let $=0;We(()=>[h.show,h.errorId],([x,f],y,m)=>{m(()=>{$++}),x&&f!=null?q(f):x||(v.value=null,U.value=!1)});async function q(x){const f=++$;g.value=!0,U.value=!1,v.value=null;try{const y=await Ht(x);f===$&&(v.value=y)}catch(y){if(f!==$)return;console.error("[UserErrorDetailModal] Failed to load error detail:",y),U.value=!0}finally{f===$&&(g.value=!1)}}function L(x){return x>=500?"badge-danger":x===429?"badge-warning":"badge-gray"}return(x,f)=>(u(),j(At,{show:V.show,title:n(k)("usage.errors.detail.title"),width:"wide",onClose:f[0]||(f[0]=y=>A("update:show",!1))},{default:w(()=>[g.value?(u(),d("div",xa,[...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",wa,o(n(k)("usage.errors.detail.loadFailed")),1)):v.value?(u(),d("div",Sa,[a("div",Ca,[a("div",null,[a("span",$a,o(n(k)("usage.errors.time")),1),a("p",Ea,o(n(je)(v.value.created_at)),1)]),a("div",null,[a("span",Da,o(n(k)("usage.errors.model")),1),a("p",Va,o(v.value.model||"-"),1)]),a("div",null,[a("span",Ta,o(n(k)("usage.errors.endpoint")),1),a("p",Ua,o(v.value.inbound_endpoint||"-"),1)]),a("div",null,[a("span",Fa,o(n(k)("usage.errors.status")),1),a("p",Ma,[a("span",{class:Y(["badge",L(v.value.status_code)])},o(v.value.status_code||"-"),3)])]),a("div",null,[a("span",Ra,o(n(k)("usage.errors.category")),1),a("p",qa,o(n(k)("usage.errors.categories."+v.value.category)),1)]),a("div",null,[a("span",za,o(n(k)("usage.errors.platform")),1),a("p",La,o(v.value.platform||"-"),1)]),v.value.upstream_status_code!=null?(u(),d("div",Oa,[a("span",Ia,o(n(k)("usage.errors.detail.upstreamStatus")),1),a("p",Ba,o(v.value.upstream_status_code),1)])):D("",!0)]),v.value.message?(u(),d("div",Pa,[a("span",Aa,o(n(k)("usage.errors.message")),1),a("p",Na,o(v.value.message),1)])):D("",!0),v.value.error_body?(u(),d("div",Ka,[a("span",Ga,o(n(k)("usage.errors.detail.responseBody")),1),a("pre",ja,o(v.value.error_body),1)])):D("",!0)])):D("",!0)]),_:1},8,["show","title"]))}}),Wa={class:"flex min-h-0 flex-1 flex-col"},Ja={class:"card flex min-h-0 flex-1 flex-col overflow-hidden"},Ya={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(V,{emit:s}){const h=V,A=s;function k(y,m){A("sort",fa(y),m)}const{t:g}=_e(),U=p(()=>[{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")}]),v=p(()=>h.visibleColumnKeys?U.value.filter(y=>h.visibleColumnKeys.includes(y.key)):U.value);function $(y){const m=_a(y.request_type,y.stream);return m?{label:g(ba(m)),className:ya(m)}:null}const q=i(!1),L=i(null);function x(y){L.value=y,q.value=!0}const f=va;return(y,m)=>(u(),d("div",Wa,[a("div",Ja,[c(ma,{ips:V.rows.map(r=>r.client_ip),onFailed:m[0]||(m[0]=r=>A("ipGeoBatchFailed"))},null,8,["ips"]),c(ca,{columns:v.value,data:V.rows,loading:V.loading,"clickable-rows":"","server-side-sort":"","default-sort-key":"created_at","default-sort-order":"desc",onSort:k,onRowClick:m[2]||(m[2]=r=>x(r.id))},{"cell-model":w(({row:r})=>[r.model?(u(),d("span",Ya,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)):D("",!0)])]),"cell-endpoint":w(({row:r})=>{var O;return[a("div",ts,[a("div",as,[a("span",ss,o(n(g)("usage.inbound"))+":",1),a("span",ls,o(((O=r.inbound_endpoint)==null?void 0:O.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(f)(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)?(u(),d("span",{key:0,class:Y(["inline-flex items-center rounded px-2 py-0.5 text-xs font-medium",$(r).className])},o($(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:m[1]||(m[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,[V.total>0?(u(),j(He,{key:0,page:V.page,"page-size":V.pageSize,total:V.total,"onUpdate:page":m[3]||(m[3]=r=>y.$emit("update:page",r)),"onUpdate:pageSize":m[4]||(m[4]=r=>y.$emit("update:pageSize",r))},null,8,["page","page-size","total"])):D("",!0)]),c(Ha,{show:q.value,"onUpdate:show":m[5]||(m[5]=r=>q.value=r),"error-id":L.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"},Js={class:"w-full sm:w-auto sm:min-w-[180px]"},Ys={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(V){const{t:s}=_e(),h=Nt(),A=i(null),k=i([]),g=i([]),U=i([]),v=i([]),$=i([]),q=i([]),L=i([]),x=i(!1),f=i(!1),y=i(!1),m=i(!1),r=i(!1),O=i([]),Q=i(!1),N=i(1),re=i(20),ye=i("created_at"),be=i("desc"),ne=i(0),E=i({model:"",category:"",api_key_id:null,status_code:null}),Je=p(()=>[{value:null,label:s("usage.errors.allKeys")},...de.value.map(e=>({value:e.id,label:e.name}))]),Ye=p(()=>{const e=new Set,t=[];for(const l of O.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=p(()=>[{value:"",label:s("usage.errors.allCategories")},...Qe.map(e=>({value:e,label:s("usage.errors.categories."+e)}))]),Ze=p(()=>[{value:null,label:s("usage.errors.allStatuses")},...ka.map(e=>({value:e,label:String(e)}))]),H=()=>{N.value=1,K()};let I=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(),R=new Date(`${t}T00:00:00`).getTime();return Math.ceil((R-l)/(1e3*60*60*24))<=1?"hour":"day"},he=ke(),F=i(he.start),M=i(he.end),W=i(ie(F.value,M.value)),xe=i("tokens"),we=i("tokens"),Se=i("tokens"),ue=i("inbound"),S=i("usage"),Ce=p(()=>{var e;return((e=h.cachedPublicSettings)==null?void 0:e.allow_user_view_error_requests)??!1}),b=i({start_date:F.value,end_date:M.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=p(()=>[{value:"day",label:s("admin.dashboard.day")},{value:"hour",label:s("admin.dashboard.hour")}]),tt=p(()=>[{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=p(()=>[{value:null,label:s("usage.allCompactionTypes")},{value:!0,label:s("usage.compactionOnly")}]),st=p(()=>Kt(h.cachedPublicSettings,jt.subscription)),lt=p(()=>[{value:null,label:s("admin.usage.allBillingTypes")},{value:0,label:s("admin.usage.billingTypeBalance")},{value:1,label:s("admin.usage.billingTypeSubscription")}]),ot=p(()=>[{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=p(()=>[{value:null,label:s("usage.allApiKeys")},...de.value.map(e=>({value:e.id,label:e.name}))]),nt=p(()=>[{value:null,label:s("admin.usage.allGroups")},...$e.value.map(e=>({value:e.id,label:e.name}))]),it=p(()=>[{value:null,label:s("admin.usage.allModels")},...ce.value.map(e=>({value:e,label:e}))]),ae=p(()=>{const e=b.value.request_type,t=e?Xt(e):b.value.stream;
1return{...b.value,start_date:F.value,end_date:M.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}),J=async()=>{I==null||I.abort();const e=new AbortController;I=e,x.value=!0;try{const t=await G.query(Ee(C.page,C.page_size),{signal:e.signal});e.signal.aborted||(k.value=t.items,C.total=t.total)}catch(t){(t==null?void 0:t.name)!=="AbortError"&&(t==null?void 0:t.code)!=="ERR_CANCELED"&&h.showError(s("usage.failedToLoad"))}finally{I===e&&(x.value=!1)}},De=async()=>{const e=++Z;m.value=!0;try{const t=await G.getStats(ae.value);if(e!==Z)return;A.value=t,$.value=t.endpoints||[],q.value=[],L.value=[]}catch(t){if(e!==Z)return;console.error("Failed to load usage stats:",t),$.value=[],q.value=[],L.value=[]}finally{e===Z&&(m.value=!1)}},Ve=async()=>{const e=++ee;y.value=!0;try{const t=await G.getDashboardModels({...ae.value,model_source:"requested"});if(e!==ee)return;U.value=t.models||[],ut(t.models||[])}catch(t){if(e!==ee)return;console.error("Failed to load model stats:",t),U.value=[]}finally{e===ee&&(y.value=!1)}},ge=async()=>{const e=++X;f.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||[],v.value=t.groups||[]}catch(t){if(e!==X)return;console.error("Failed to load chart data:",t),g.value=[],v.value=[]}finally{e===X&&(f.value=!1)}},ut=e=>{const t=b.value.model,l=new Set(ce.value);e.forEach(R=>{R.model&&l.add(R.model)}),t&&l.add(t),ce.value=Array.from(l).sort()},z=()=>{C.page=1,J(),De(),Ve(),ge(),Mt()},Te=()=>{J(),De(),Ve(),ge(),S.value==="errors"&&K()},dt=()=>{const e=ke();F.value=e.start,M.value=e.end,b.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"&&(E.value={model:"",category:"",api_key_id:null,status_code:null},H())},ct=e=>{F.value=e.startDate,M.value=e.endDate,b.value.start_date=e.startDate,b.value.end_date=e.endDate,W.value=ie(e.startDate,e.endDate),z()},gt=e=>{C.page=e,J()},mt=e=>{C.page_size=e,C.page=1,J()},pt=(e,t)=>{te.sort_by=e,te.sort_order=t,C.page=1,J()},Ue=()=>{h.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==="-"?t:/^[=+\-@\t\r]/.test(t)?`"'${l}"`:/[,"\n\r]/.test(t)?`"${l}"`:t},yt=async()=>{if(C.total===0){h.showWarning(s("usage.noDataToExport"));return}r.value=!0,h.showInfo(s("usage.preparingExport"));try{const e=[],l=Ee(1,100),R=Math.ceil(C.total/100);for(let _=1;_<=R;_++){const le=await G.query({...l,page:_});e.push(...le.items)}if(e.length===0){h.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(_=>{var le;return[_.created_at,((le=_.api_key)==null?void 0:le.name)||"",_.model,Gt(_.reasoning_effort),_.inbound_endpoint||"",_.ip_address||"",vt(_),aa(_t(_),s),_.input_tokens,_.output_tokens,_.cache_read_tokens,_.cache_creation_tokens,_.rate_multiplier,_.actual_cost.toFixed(8),_.total_cost.toFixed(8),_.first_token_ms??"",_.duration_ms??""].map(Fe)}),Bt=[Ot.map(Fe).join(","),...It.map(_=>_.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),h.showSuccess(s("usage.exportSuccess"))}catch(e){console.error("CSV Export failed:",e),h.showError(s("usage.exportFailed"))}finally{r.value=!1}},Me=["created_at"],Re=["user_agent"],qe=p(()=>[{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}]),B=oe(new Set),bt=p(()=>qe.value.filter(e=>
2!Me.includes(e.key))),ft=p(()=>qe.value.filter(e=>Me.includes(e.key)||!B.has(e.key))),kt=e=>!B.has(e),ht=e=>{B.has(e)?B.delete(e):B.add(e),localStorage.setItem(Ke,JSON.stringify([...B]))},xt=()=>{try{const e=localStorage.getItem(Ke);(e?JSON.parse(e):Re).forEach(l=>B.add(l))}catch{Re.forEach(e=>B.add(e))}},ze=["status","created_at"],Le=["user_agent"],Oe=p(()=>[{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")}]),P=oe(new Set),wt=p(()=>Oe.value.filter(e=>!ze.includes(e.key))),St=p(()=>Oe.value.filter(e=>ze.includes(e.key)||!P.has(e.key)).map(e=>e.key)),Ct=e=>!P.has(e),$t=e=>{P.has(e)?P.delete(e):P.add(e),localStorage.setItem(Ge,JSON.stringify([...P]))},Et=()=>{try{const e=localStorage.getItem(Ge);(e?JSON.parse(e):Le).forEach(l=>P.add(l))}catch{Le.forEach(e=>P.add(e))}},Dt=p(()=>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 R=await Ae.list(l,100);if(R.items.length===0)break;t.push(...R.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():(O.value=[],ne.value=0)},K=async()=>{Q.value=!0;try{const e=await G.listMyErrorRequests({page:N.value,page_size:re.value,start_date:F.value,end_date:M.value,model:(E.value.model??"").trim()||void 0,category:E.value.category||void 0,api_key_id:E.value.api_key_id??void 0,status_code:E.value.status_code??void 0,sort_by:ye.value,sort_order:be.value});O.value=e.items,ne.value=e.total}catch(e){console.error("[UsageView] loadErrors failed:",e),h.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",O.value.length===0&&K()};return ia(()=>{xt(),Et(),document.addEventListener("click",Ie),Ft(),Te()}),ua(()=>{I==null||I.abort(),document.removeEventListener("click",Ie)}),We(ue,()=>{}),(e,t)=>(u(),j(Jt,null,{default:w(()=>[a("div",ks,[c(Zt,{stats:A.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(Yt,{"start-date":F.value,"onUpdate:startDate":t[0]||(t[0]=l=>F.value=l),"end-date":M.value,"onUpdate:endDate":t[1]||(t[1]=l=>M.value=l),onChange:ct}
2,null,8,["start-date","end-date"])]),a("div",$s,[a("span",Es,o(n(s)("admin.dashboard.granularity"))+":",1),a("div",Ds,[c(T,{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":U.value,loading:y.value,"show-source-toggle":!1,"show-metric-toggle":!0,"enable-breakdown":!1,"show-account-cost":!1,"start-date":F.value,"end-date":M.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":v.value,loading:f.value,"show-metric-toggle":!0,"enable-breakdown":!1,"show-account-cost":!1,"start-date":F.value,"end-date":M.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":$.value,"upstream-endpoint-stats":q.value,"endpoint-path-stats":L.value,loading:m.value,"show-source-toggle":!1,"show-metric-toggle":!0,"enable-breakdown":!1,title:n(s)("usage.endpointDistribution"),"start-date":F.value,"end-date":M.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:f.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(T,{modelValue:E.value.api_key_id,"onUpdate:modelValue":t[7]||(t[7]=l=>E.value.api_key_id=l),options:Je.value,onChange:H},null,8,["modelValue","options"])]),a("div",zs,[a("label",Ls,o(n(s)("usage.errors.model")),1),c(T,{modelValue:E.value.model,"onUpdate:modelValue":t[8]||(t[8]=l=>E.value.model=l),options:Ye.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(T,{modelValue:E.value.category,"onUpdate:modelValue":t[9]||(t[9]=l=>E.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(T,{modelValue:E.value.status_code,"onUpdate:modelValue":t[10]||(t[10]=l=>E.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(T,{modelValue:b.value.api_key_id,"onUpdate:modelValue":t[11]||(t[11]=l=>b.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(T,{modelValue:b.value.model,"onUpdate:modelValue":t[12]||(t[12]=l=>b.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(T,{modelValue:b.value.group_id,"onUpdate:modelValue":t[13]||(t[13]=l=>b.value.group_id=l),options:nt.value,searchable:"",onChange:z},null,8,["modelValue","options"])]),a("div",Js,[a("label",Ys,o(n(s)("usage.type")),1),c(T,{modelValue:b.value.request_type,"onUpdate:modelValue":t[14]||(t[14]=l=>b.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(T,{modelValue:b.value.native_compaction_v2,"onUpdate:modelValue":t[15]||(t[15]=l=>b.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(T,{modelValue:b.value.billing_type,"onUpdate:modelValue":t[16]||(t[16]=l=>b.value.billing_type=l),options:lt.value,onChange:z},null,8,["modelValue","options"])])):D("",!0),a("div",tl,[a("label",al,o(n(s)("admin.usage.billingMode")),1),c(T,{modelValue:b.value.billing_mode,"onUpdate:modelValue":t[17]||(t[17]=l=>b.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:x.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:R=>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"})):D("",!0)],8,il))),128))])):D("",!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)):D("",!0)])])]),Ce.value?(u(),d("div",dl,[a("button",{class:Y(["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:Y(["tab",{"tab-active":S.value==="errors"}]),onClick:Lt},o(n(s)("usage.tabs.errors")),3)])):D("",!0),S.value==="usage"?(u(),d(Ne,{key:1},[c(ta,{data:k.value,loading:x.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"])):D("",!0)],64)):Ce.value?(u(),j(fs,{key:2,rows:O.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"])):D("",!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.