( calculateCost?: (inputTokens: number, outputTokens: number, cacheReadTokens: number) => number, )
| 115 | * @param calculateCost - Optional function to compute total cost from token counts |
| 116 | */ |
| 117 | export function createUsageNormalizer( |
| 118 | calculateCost?: (inputTokens: number, outputTokens: number, cacheReadTokens: number) => number, |
| 119 | ): (usage: any) => ApiStreamUsageChunk | undefined { |
| 120 | return (usage: any): ApiStreamUsageChunk | undefined => { |
| 121 | if (!usage) return undefined |
| 122 | |
| 123 | const inputDetails = usage.input_tokens_details ?? usage.prompt_tokens_details |
| 124 | const cachedTokens = inputDetails?.cached_tokens ?? 0 |
| 125 | |
| 126 | const inputTokens = usage.input_tokens ?? usage.prompt_tokens ?? 0 |
| 127 | const outputTokens = usage.output_tokens ?? usage.completion_tokens ?? 0 |
| 128 | const cacheReadTokens = usage.cache_read_input_tokens ?? cachedTokens ?? 0 |
| 129 | const cacheWriteTokens = usage.cache_creation_input_tokens ?? usage.cache_write_tokens ?? 0 |
| 130 | |
| 131 | const reasoningTokens = |
| 132 | typeof usage.output_tokens_details?.reasoning_tokens === "number" |
| 133 | ? usage.output_tokens_details.reasoning_tokens |
| 134 | : undefined |
| 135 | |
| 136 | const totalCost = calculateCost ? calculateCost(inputTokens, outputTokens, cacheReadTokens) : undefined |
| 137 | |
| 138 | return { |
| 139 | type: "usage", |
| 140 | inputTokens, |
| 141 | outputTokens, |
| 142 | cacheWriteTokens, |
| 143 | cacheReadTokens, |
| 144 | ...(typeof reasoningTokens === "number" ? { reasoningTokens } : {}), |
| 145 | ...(typeof totalCost === "number" ? { totalCost } : {}), |
| 146 | } |
| 147 | } |
| 148 | } |
no test coverage detected