fix: remove stream_options from xAI provider to fix Grok 4 API errors

- Removed stream_options: { include_usage: true } from XAIHandler
- Grok models do not support the stream_options parameter
- This fixes API errors when using Grok 4 model
- Updated tests to reflect the change

Fixes #6211
This commit is contained in:
Roo Code 2025-07-25 14:33:34 +00:00
parent d62a260576
commit dc45a2658d
2 changed files with 8 additions and 6 deletions

View file

@ -276,7 +276,6 @@ describe("XAIHandler", () => {
temperature: 0,
messages: expect.arrayContaining([{ role: "system", content: systemPrompt }]),
stream: true,
stream_options: { include_usage: true },
}),
)
})

View file

@ -48,13 +48,13 @@ export class XAIHandler extends BaseProvider implements SingleCompletionHandler
const { id: modelId, info: modelInfo, reasoning } = this.getModel()
// Use the OpenAI-compatible API.
// Note: Grok models don't support stream_options parameter
const stream = await this.client.chat.completions.create({
model: modelId,
max_tokens: modelInfo.maxTokens,
temperature: this.options.modelTemperature ?? XAI_DEFAULT_TEMPERATURE,
messages: [{ role: "system", content: systemPrompt }, ...convertToOpenAiMessages(messages)],
stream: true,
stream_options: { include_usage: true },
...(reasoning && reasoning),
})
@ -78,12 +78,15 @@ export class XAIHandler extends BaseProvider implements SingleCompletionHandler
if (chunk.usage) {
// Extract detailed token information if available
// First check for prompt_tokens_details structure (real API response)
const promptDetails = "prompt_tokens_details" in chunk.usage ? chunk.usage.prompt_tokens_details : null;
const cachedTokens = promptDetails && "cached_tokens" in promptDetails ? promptDetails.cached_tokens : 0;
const promptDetails = "prompt_tokens_details" in chunk.usage ? chunk.usage.prompt_tokens_details : null
const cachedTokens = promptDetails && "cached_tokens" in promptDetails ? promptDetails.cached_tokens : 0
// Fall back to direct fields in usage (used in test mocks)
const readTokens = cachedTokens || ("cache_read_input_tokens" in chunk.usage ? (chunk.usage as any).cache_read_input_tokens : 0);
const writeTokens = "cache_creation_input_tokens" in chunk.usage ? (chunk.usage as any).cache_creation_input_tokens : 0;
const readTokens =
cachedTokens ||
("cache_read_input_tokens" in chunk.usage ? (chunk.usage as any).cache_read_input_tokens : 0)
const writeTokens =
"cache_creation_input_tokens" in chunk.usage ? (chunk.usage as any).cache_creation_input_tokens : 0
yield {
type: "usage",