Skip to content

Commit 23e76db

Browse files
committed
fix(xai): enforce positive integer for xaiModelContextWindow and handle undefined cacheWritesPrice
1 parent 4b39e2e commit 23e76db

File tree

5 files changed

+9
-8
lines changed

5 files changed

+9
-8
lines changed

packages/types/src/provider-settings.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ const fakeAiSchema = baseProviderSettingsSchema.extend({
345345

346346
const xaiSchema = apiModelIdProviderModelSchema.extend({
347347
xaiApiKey: z.string().optional(),
348-
xaiModelContextWindow: z.number().optional(),
348+
xaiModelContextWindow: z.number().int().min(1).optional(),
349349
})
350350

351351
const groqSchema = apiModelIdProviderModelSchema.extend({

src/api/providers/fetchers/xai.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export async function getXaiModels(apiKey?: string, baseUrl?: string): Promise<R
7777
inputPrice: centsToDollars(m.prompt_text_token_price),
7878
outputPrice: centsToDollars(m.completion_text_token_price),
7979
cacheReadsPrice,
80-
cacheWritesPrice: cacheReadsPrice, // xAI uses same price for reads and writes
80+
cacheWritesPrice: undefined, // Leave undefined unless API exposes a distinct write price
8181
description: staticInfo?.description,
8282
supportsReasoningEffort:
8383
staticInfo && "supportsReasoningEffort" in staticInfo

src/api/providers/xai.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export class XAIHandler extends BaseProvider implements SingleCompletionHandler
8989
try {
9090
stream = await this.client.chat.completions.create({
9191
model: modelId,
92-
max_tokens: modelInfo.maxTokens,
92+
...(typeof modelInfo.maxTokens === "number" ? { max_tokens: modelInfo.maxTokens } : {}),
9393
temperature: this.options.modelTemperature ?? XAI_DEFAULT_TEMPERATURE,
9494
messages: [{ role: "system", content: systemPrompt }, ...convertToOpenAiMessages(messages)],
9595
stream: true,

webview-ui/src/components/settings/providers/XAI.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,9 @@ export const XAI = ({
166166
<VSCodeTextField
167167
value={apiConfiguration?.xaiModelContextWindow?.toString() || ""}
168168
onInput={handleInputChange("xaiModelContextWindow", (e) => {
169-
const target = e.target as HTMLInputElement
170-
const value = target.value
171-
return value ? parseInt(value, 10) : undefined
169+
const v = (e.target as HTMLInputElement).value.trim()
170+
const n = Number(v)
171+
return Number.isFinite(n) && n > 0 ? Math.floor(n) : undefined
172172
})}
173173
placeholder="e.g., 256000"
174174
className="w-full mt-4">

webview-ui/src/components/ui/hooks/useSelectedModel.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,11 @@ function getSelectedModel({
166166
const id = apiConfiguration.apiModelId ?? xaiDefaultModelId
167167
const dynamicInfo = routerModels.xai?.[id]
168168
if (dynamicInfo) {
169-
// If router-provided model lacks contextWindow, apply manual override when provided
169+
// If router-provided contextWindow is missing or invalid (<= 0), apply manual override when provided
170170
const overrideCw = apiConfiguration.xaiModelContextWindow
171171
const info =
172-
dynamicInfo.contextWindow === undefined && typeof overrideCw === "number"
172+
!(typeof dynamicInfo.contextWindow === "number" && dynamicInfo.contextWindow > 0) &&
173+
typeof overrideCw === "number"
173174
? { ...dynamicInfo, contextWindow: overrideCw }
174175
: dynamicInfo
175176
return { id, info }

0 commit comments

Comments
 (0)