import { Badge } from "@/src/components/ui/badge"; import { type ObservationReturnType } from "@/src/server/api/routers/traces"; import { numberFormatter } from "@/src/utils/numbers"; import { type Observation } from "@langfuse/shared"; export const AggUsageBadge = (props: { observations: ObservationReturnType[]; rightIcon?: React.ReactNode; variant?: "default" | "secondary" | "destructive" | "outline" | "tertiary"; }) => { const usage = { inputUsage: props.observations .map((o) => o.inputUsage) .reduce((a, b) => a + b, 0), outputUsage: props.observations .map((o) => o.outputUsage) .reduce((a, b) => a + b, 0), totalUsage: props.observations .map((o) => o.totalUsage) .reduce((a, b) => a + b, 0), }; return ( ); }; export const TokenUsageBadge = ( props: ( | { observation: Observation; } | { inputUsage: number; outputUsage: number; totalUsage: number; } ) & { inline?: boolean; rightIcon?: React.ReactNode; variant?: "default" | "secondary" | "destructive" | "outline" | "tertiary"; }, ) => { const usage = "observation" in props ? { inputUsage: props.observation.inputUsage, outputUsage: props.observation.outputUsage, totalUsage: props.observation.totalUsage, } : props; if ( usage.inputUsage === 0 && usage.outputUsage === 0 && usage.totalUsage === 0 ) return <>; const content = `${numberFormatter(usage.inputUsage, 0)} → ${numberFormatter(usage.outputUsage, 0)} (∑ ${numberFormatter(usage.totalUsage, 0)})`; if (props.inline) return ( {content} {props.rightIcon} ); return ( {content} {props.rightIcon} ); };