| 97 | describe('onLLMEnd Usage Metadata Extraction Logic', () => { |
| 98 | // Helper function that mirrors the extraction logic in handler.ts onLLMEnd (lines 1437-1465) |
| 99 | const extractOutputData = (output: string | Record<string, any>, model?: string) => { |
| 100 | let outputText: string |
| 101 | let usageMetadata: Record<string, any> | undefined |
| 102 | let modelName: string | undefined = model |
| 103 | |
| 104 | if (typeof output === 'string') { |
| 105 | outputText = output |
| 106 | } else { |
| 107 | outputText = output.content ?? '' |
| 108 | usageMetadata = output.usageMetadata ?? output.usage_metadata |
| 109 | if (usageMetadata) { |
| 110 | usageMetadata = { |
| 111 | input_tokens: usageMetadata.input_tokens ?? usageMetadata.prompt_tokens, |
| 112 | output_tokens: usageMetadata.output_tokens ?? usageMetadata.completion_tokens, |
| 113 | total_tokens: usageMetadata.total_tokens |
| 114 | } |
| 115 | } |
| 116 | const responseMetadata = output.responseMetadata ?? output.response_metadata |
| 117 | if (!model && responseMetadata) { |
| 118 | modelName = responseMetadata.model ?? responseMetadata.model_name ?? responseMetadata.modelId |
| 119 | } |
| 120 | } |
| 121 | return { outputText, usageMetadata, modelName } |
| 122 | } |
| 123 | |
| 124 | // Helper to format for Langfuse |
| 125 | const formatForLangfuse = (usageMetadata: Record<string, any> | undefined) => { |