1import{o as x,j as e}from"./index-uweSqKmM.js";import{b as d}from"./vendor-react-BwtB5J2r.js";import{P as j}from"./PortalShell-mcEfTKGv.js";function i(s){const c=(s||0)/1e6;return"$"+c.toFixed(c>=1?2:4)}function t(s){return s?s>=1e6?(s/1e6).toFixed(1)+"M":s>=1e3?Math.round(s/1e3)+"K":String(s):"0"}function o(s){s=Math.round(s||0);const c=Math.floor(s/3600),n=Math.floor(s%3600/60),l=s%60;return c?`${c}h ${n}m`:n?`${n}m ${l}s`:`${l}s`}const g={inference:"Inference",transcription:"Transcription",tts:"Text to speech",wingman:"Wingman"};function N(s){return s.service==="transcription"?o(s.audio_seconds):s.service==="tts"?`${(s.characters||0).toLocaleString()} chars`:`${t(s.tokens_input)} / ${t(s.tokens_output)}`}function v(){const[s,c]=d.useState(null),[n,l]=d.useState(!0),[h,u]=d.useState(null),m=d.useCallback(async()=>{l(!0),u(null);try{c(await x.get("/admin/usage"))}catch(r){u(r.message)}finally{l(!1)}},[]);d.useEffect(()=>{m()},[m]);const a=(s==null?void 0:s.total)||{};return e.jsx(j,{children:e.jsxs("main",{className:"portal-main",children:[e.jsx("div",{className:"keys-head",children:e.jsxs("div",{children:[e.jsx("h1",{children:"Admin · Usage"}),e.jsxs("p",{className:"keys-sub",children:["Platform usage across all members. Costs are real COGS (what we pay providers).",s!=null&&s.period?` · ${s.period}`:""]})]})}),h&&e.jsx("div",{className:"auth-error",children:h}),n?e.jsx("p",{className:"portal-note",children:"Loading usage..."}):s?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"usage-cards usage-cards-3",children:[e.jsxs("div",{className:"usage-card",children:[e.jsx("div",{className:"usage-card-label",children:"Total COGS"}),e.jsx("div",{className:"usage-card-big",children:i((a.inference_micros||0)+(a.transcription_micros||0)+(a.tts_micros||0)+(a.wingman_micros||0)+(a.other_micros||0))}),e.jsxs("div",{className:"usage-card-sub",children:[(a.requests||0).toLocaleString()," requests · all members"]})]}),e.jsxs("div",{className:"usage-card",children:[e.jsx("div",{className:"usage-card-label",children:"Inference"}),e.jsx("div",{className:"usage-card-big",children:i(a.inference_micros)}),e.jsxs("div",{className:"usage-card-sub",children:[t(a.inference_tokens_in)," in / ",t(a.inference_tokens_out)," out tokens"]})]}),e.jsxs("div",{className:"usage-card",children:[e.jsx("div",{className:"usage-card-label",children:"Transcription"}),e.jsx("div",{className:"usage-card-big",children:i(a.transcription_micros)}),e.jsxs("div",{className:"usage-card-sub",children:[o(a.transcription_seconds)," audio"]})]}),e.jsxs("div",{className:"usage-card",children:[e.jsx("div",{className:"usage-card-label",children:"Text to speech"}),e.jsx("div",{className:"usage-card-big",children:i(a.tts_micros)}),e.jsxs("div",{className:"usage-card-sub",children:[(a.tts_characters||0).toLocaleString()," characters synthesised"]})]}),e.jsxs("div",{className:"usage-card",children:[e.jsx("div",{className:"usage-card-label",children:"Wingman"}),e.jsx("div",{className:"usage-card-big",children:i(a.wingman_micros)}),e.jsxs("div",{className:"usage-card-sub",children:[t(a.wingman_tokens_in)," in / ",t(a.wingman_tokens_out)," out tokens · included"]})]})]}),e.jsx("h2",{className:"usage-section-title",children:"By member"}),(s.byMember||[]).length===0?e.jsx("p",{className:"portal-note muted",children:"No usage yet this period."}):e.jsx("div",{className:"keys-card",children:e.jsxs("table",{className:"keys-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Member"}),e.jsx("th",{children:"Inference"}),e.jsx("th",{children:"Transcription (COGS)"}),e.jsx("th",{children:"Speech (COGS)"}),e.jsx("th",{children:"Wingman (COGS)"}),e.jsx("th",{children:"Total COGS"}),e.jsx("th",{children:"Requests"})]})}),e.jsx("tbody",{children:s.byMember.map(r=>e.jsxs("tr",{children:[e.jsx("td",{children:r.email}),e.jsx("td",{children:i(r.inference_micros)}),e.jsxs("td",{className:"muted",children:[o(r.transcription_seconds)," (",i(r.transcription_micros),")"]}),e.jsxs("td",{className:"muted",children:[(r.tts_characters||0).toLocaleString()," chars (",i(r.tts_micros),")"]}),e.jsx("td",{className:"muted",children:i(r.wingman_micros)}),e.jsx("td",{children:i(r.total_micros)}
1),e.jsx("td",{className:"muted",children:r.requests.toLocaleString()})]},r.member_id))})]})}),e.jsx("h2",{className:"usage-section-title",children:"By model (all members)"}),(s.byModel||[]).length===0?e.jsx("p",{className:"portal-note muted",children:"No usage yet this period."}):e.jsx("div",{className:"keys-card",children:e.jsxs("table",{className:"keys-table",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Model"}),e.jsx("th",{children:"Capability"}),e.jsx("th",{children:"Requests"}),e.jsx("th",{children:"Volume"}),e.jsx("th",{children:"Cost (COGS)"})]})}),e.jsx("tbody",{children:s.byModel.map(r=>e.jsxs("tr",{children:[e.jsx("td",{children:r.model}),e.jsx("td",{className:"muted",children:g[r.service]||r.service}),e.jsx("td",{children:r.requests.toLocaleString()}),e.jsx("td",{className:"muted",children:N(r)}),e.jsx("td",{children:i(r.cost_micros)})]},`${r.service}|${r.model}`))})]})})]}):null]})})}export{v 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.