export type Usage = { inputTokens: number; outputTokens: number; totalTokens: number; estimated: boolean; }; export const estimateTokens = (text: string) => { if (!text.trim()) { return 0; } const ascii = text.match(/[\x00-\x7F]/g)?.length ?? 0; const nonAscii = text.length - ascii; return Math.max(1, Math.ceil(ascii / 4 + nonAscii / 1.7)); }; export const normalizeUsage = ( prompt: string, output: string, usage?: Partial | null ): Usage => { const inputTokens = usage?.inputTokens ?? estimateTokens(prompt); const outputTokens = usage?.outputTokens ?? estimateTokens(output); return { inputTokens, outputTokens, totalTokens: usage?.totalTokens ?? inputTokens + outputTokens, estimated: usage?.estimated ?? !usage }; };