diff --git a/src/modules/aix/server/dispatch/chatGenerate/parsers/openai.parser.ts b/src/modules/aix/server/dispatch/chatGenerate/parsers/openai.parser.ts index 323f52045..163177b43 100644 --- a/src/modules/aix/server/dispatch/chatGenerate/parsers/openai.parser.ts +++ b/src/modules/aix/server/dispatch/chatGenerate/parsers/openai.parser.ts @@ -410,7 +410,7 @@ function _fromOpenAIUsage(usage: OpenAIWire_API_Chat_Completions.Response['usage // Input Metrics // Input redistribution: Cache Read - if (usage.prompt_tokens_details !== undefined) { + if (usage.prompt_tokens_details) { const TCacheRead = usage.prompt_tokens_details.cached_tokens; if (TCacheRead !== undefined && TCacheRead > 0) { metricsUpdate.TCacheRead = TCacheRead; @@ -434,8 +434,11 @@ function _fromOpenAIUsage(usage: OpenAIWire_API_Chat_Completions.Response['usage // Output Metrics // Output breakdown: Reasoning - if (usage.completion_tokens_details?.reasoning_tokens !== undefined) - metricsUpdate.TOutR = usage.completion_tokens_details.reasoning_tokens; + if (usage.completion_tokens_details) { + const details = usage.completion_tokens_details || {}; + if (details.reasoning_tokens !== undefined) + metricsUpdate.TOutR = usage.completion_tokens_details.reasoning_tokens; + } // TODO: Output breakdown: Audio diff --git a/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts b/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts index 99c25a0e8..8e87d7eed 100644 --- a/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts +++ b/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts @@ -394,7 +394,8 @@ export namespace OpenAIWire_API_Chat_Completions { prompt_tokens_details: z.object({ audio_tokens: z.number().optional(), cached_tokens: z.number().optional(), - }).optional(), + }).optional() + .nullable(), // [2025-06-02] Chutes.ai using slang server returns null for prompt_tokens_details // [OpenAI o1, 2024-09-12] breaks down the completion tokens into components completion_tokens_details: z.object({ @@ -403,7 +404,8 @@ export namespace OpenAIWire_API_Chat_Completions { audio_tokens: z.number().optional(), // [OpenAI, 2024-10-01] audio tokens used in the completion (charged at a different rate) accepted_prediction_tokens: z.number().optional(), // [OpenAI, 2024-11-05] Predicted Outputs rejected_prediction_tokens: z.number().optional(), // [OpenAI, 2024-11-05] Predicted Outputs - }).optional(), // not present in other APIs yet + }).optional() // not present in other APIs yet + .nullable(), // [2025-06-02] no issues yet, but preventive // [DeepSeek, 2024-08-02] context caching on disk prompt_cache_hit_tokens: z.number().optional(),