( usage: OpenAI.Responses.ResponseUsage | undefined | null, )
| 85 | * zeroed totals. |
| 86 | */ |
| 87 | export function buildResponsesUsage( |
| 88 | usage: OpenAI.Responses.ResponseUsage | undefined | null, |
| 89 | ): TokenUsage | undefined { |
| 90 | if (!usage) return undefined |
| 91 | |
| 92 | const result = buildBaseUsage({ |
| 93 | promptTokens: usage.input_tokens || 0, |
| 94 | completionTokens: usage.output_tokens || 0, |
| 95 | totalTokens: usage.total_tokens || 0, |
| 96 | }) |
| 97 | |
| 98 | // Despite the SDK types marking these required, they can be undefined at runtime. |
| 99 | // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition |
| 100 | const cachedTokens = usage.input_tokens_details?.cached_tokens |
| 101 | if (cachedTokens && cachedTokens > 0) { |
| 102 | result.promptTokensDetails = { |
| 103 | ...result.promptTokensDetails, |
| 104 | cachedTokens, |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition |
| 109 | const reasoningTokens = usage.output_tokens_details?.reasoning_tokens |
| 110 | if (reasoningTokens && reasoningTokens > 0) { |
| 111 | result.completionTokensDetails = { |
| 112 | ...result.completionTokensDetails, |
| 113 | reasoningTokens, |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | return result |
| 118 | } |
| 119 | |
| 120 | /** |
| 121 | * Build normalized {@link TokenUsage} from an OpenAI Images API `usage` object. |
no test coverage detected