diff --git a/packages/xai/src/xai-chat-language-model.test.ts b/packages/xai/src/xai-chat-language-model.test.ts index 0a43feb10395..4c87215d3058 100644 --- a/packages/xai/src/xai-chat-language-model.test.ts +++ b/packages/xai/src/xai-chat-language-model.test.ts @@ -190,6 +190,7 @@ describe('XaiChatLanguageModel', () => { expect(usage).toMatchInlineSnapshot(` { + "cachedInputTokens": undefined, "inputTokens": 20, "outputTokens": 5, "reasoningTokens": undefined, @@ -799,6 +800,7 @@ describe('XaiChatLanguageModel', () => { "finishReason": "stop", "type": "finish", "usage": { + "cachedInputTokens": undefined, "inputTokens": 4, "outputTokens": 32, "reasoningTokens": undefined, @@ -862,6 +864,7 @@ describe('XaiChatLanguageModel', () => { "finishReason": "stop", "type": "finish", "usage": { + "cachedInputTokens": undefined, "inputTokens": 4, "outputTokens": 32, "reasoningTokens": undefined, @@ -940,6 +943,7 @@ describe('XaiChatLanguageModel', () => { "finishReason": "tool-calls", "type": "finish", "usage": { + "cachedInputTokens": undefined, "inputTokens": 183, "outputTokens": 133, "reasoningTokens": undefined, @@ -1126,6 +1130,7 @@ describe('XaiChatLanguageModel', () => { "finishReason": "stop", "type": "finish", "usage": { + "cachedInputTokens": undefined, "inputTokens": 4, "outputTokens": 30, "reasoningTokens": undefined, @@ -1252,6 +1257,7 @@ describe('XaiChatLanguageModel', () => { expect(usage).toMatchInlineSnapshot(` { + "cachedInputTokens": undefined, "inputTokens": 15, "outputTokens": 20, "reasoningTokens": 10, @@ -1334,6 +1340,7 @@ describe('XaiChatLanguageModel', () => { "finishReason": "stop", "type": "finish", "usage": { + "cachedInputTokens": undefined, "inputTokens": 15, "outputTokens": 20, "reasoningTokens": 10, @@ -1424,6 +1431,7 @@ describe('XaiChatLanguageModel', () => { "finishReason": "stop", "type": "finish", "usage": { + "cachedInputTokens": undefined, "inputTokens": 15, "outputTokens": 20, "reasoningTokens": 10, @@ -1567,6 +1575,7 @@ describe('doStream with raw chunks', () => { "finishReason": "stop", "type": "finish", "usage": { + "cachedInputTokens": undefined, "inputTokens": 10, "outputTokens": 5, "reasoningTokens": undefined, diff --git a/packages/xai/src/xai-chat-language-model.ts b/packages/xai/src/xai-chat-language-model.ts index 3a95d173dad4..29602f2ea085 100644 --- a/packages/xai/src/xai-chat-language-model.ts +++ b/packages/xai/src/xai-chat-language-model.ts @@ -294,6 +294,8 @@ export class XaiChatLanguageModel implements LanguageModelV3 { reasoningTokens: response.usage.completion_tokens_details?.reasoning_tokens ?? undefined, + cachedInputTokens: + response.usage.prompt_tokens_details?.cached_tokens ?? undefined, }, request: { body }, response: { @@ -333,6 +335,8 @@ export class XaiChatLanguageModel implements LanguageModelV3 { inputTokens: undefined, outputTokens: undefined, totalTokens: undefined, + reasoningTokens: undefined, + cachedInputTokens: undefined, }; let isFirstChunk = true; const contentBlocks: Record = {}; @@ -392,6 +396,8 @@ export class XaiChatLanguageModel implements LanguageModelV3 { usage.reasoningTokens = value.usage.completion_tokens_details?.reasoning_tokens ?? undefined; + usage.cachedInputTokens = + value.usage.prompt_tokens_details?.cached_tokens ?? undefined; } const choice = value.choices[0]; @@ -523,9 +529,20 @@ const xaiUsageSchema = z.object({ prompt_tokens: z.number(), completion_tokens: z.number(), total_tokens: z.number(), + prompt_tokens_details: z + .object({ + text_tokens: z.number().nullish(), + audio_tokens: z.number().nullish(), + image_tokens: z.number().nullish(), + cached_tokens: z.number().nullish(), + }) + .nullish(), completion_tokens_details: z .object({ reasoning_tokens: z.number().nullish(), + audio_tokens: z.number().nullish(), + accepted_prediction_tokens: z.number().nullish(), + rejected_prediction_tokens: z.number().nullish(), }) .nullish(), });