|
| 1 | +/** |
| 2 | + * Shared utilities for OpenAI-compatible API paths. |
| 3 | + * |
| 4 | + * Both the OpenAI path (queryModelOpenAI) and Grok path (queryModelGrok) use |
| 5 | + * the same adapters (openaiStreamAdapter, openaiConvertMessages), so the event |
| 6 | + * processing logic should be shared rather than duplicated. |
| 7 | + */ |
| 8 | + |
| 9 | +/** |
| 10 | + * Merge a delta usage into the accumulated usage, preserving cache-related |
| 11 | + * fields from previous values when the delta carries explicit zeroes or |
| 12 | + * undefined values. |
| 13 | + * |
| 14 | + * Mirrors updateUsage() in claude.ts: a future adapter change that omits |
| 15 | + * cache fields from certain streaming events should not silently zero the |
| 16 | + * accumulated counters. |
| 17 | + */ |
| 18 | +export function updateOpenAIUsage( |
| 19 | + current: { |
| 20 | + input_tokens: number |
| 21 | + output_tokens: number |
| 22 | + cache_creation_input_tokens: number |
| 23 | + cache_read_input_tokens: number |
| 24 | + }, |
| 25 | + delta: { |
| 26 | + input_tokens?: number |
| 27 | + output_tokens?: number |
| 28 | + cache_creation_input_tokens?: number |
| 29 | + cache_read_input_tokens?: number |
| 30 | + }, |
| 31 | +): typeof current { |
| 32 | + return { |
| 33 | + input_tokens: delta.input_tokens ?? current.input_tokens, |
| 34 | + output_tokens: delta.output_tokens ?? current.output_tokens, |
| 35 | + cache_creation_input_tokens: |
| 36 | + delta.cache_creation_input_tokens !== undefined && |
| 37 | + delta.cache_creation_input_tokens > 0 |
| 38 | + ? delta.cache_creation_input_tokens |
| 39 | + : current.cache_creation_input_tokens, |
| 40 | + cache_read_input_tokens: |
| 41 | + delta.cache_read_input_tokens !== undefined && |
| 42 | + delta.cache_read_input_tokens > 0 |
| 43 | + ? delta.cache_read_input_tokens |
| 44 | + : current.cache_read_input_tokens, |
| 45 | + } |
| 46 | +} |
0 commit comments