import { useQuery } from '@tanstack/react-query'; import { api, SettingsActor } from '../lib/api'; import { Card, StatTile, StatusBadge } from '../components/ui/Card'; const viewer: SettingsActor = { actor: 'finops-viewer', role: 'viewer', project: 'default', tenant: 'default', }; function money(v: number | null | undefined): string { return typeof v === 'number' && Number.isFinite(v) ? `$${v.toFixed(4)}` : 'n/a'; } export function FinOps() { const cost = useQuery({ queryKey: ['cost'], queryFn: api.cost }); const settings = useQuery({ queryKey: ['settings', 'finops-viewer'], queryFn: () => api.settings(viewer), retry: false }); if (cost.isLoading || !cost.data) return
Loading…
; const capRaw = settings.data?.settings['cost.absolute_cap_usd']?.value; const cap = typeof capRaw === 'number' ? capRaw : null; const actual = cost.data.provider_cost; const budgetStatus = cap === null ? 'not configured' : actual <= cap ? 'ok' : 'breach'; const kpis = Array.isArray(cost.data.business_kpi?.kpis) ? cost.data.business_kpi.kpis : []; return ( <>
} />
{cost.data.by_provider.map((r: any, i: number) => ( ))} {cost.data.by_provider.length === 0 && ( )}
timeprovidermodelsteptokenscoststatus
{r.timestamp?.replace('T', ' ').replace('Z', '')} {r.provider} {r.model} {r.step} {r.total_tokens} {money(r.cost_usd)}
No provider usage records.
{kpis.map((k: any) => (
{String(k.id).replaceAll('_', ' ')}
baseline{k.baseline}
current{k.current}
target{k.target}
))} {kpis.length === 0 &&
No KPI artifact found.
}
); }