From d6e594eedab72f2b69220750d03682dbb0791de5 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Thu, 30 Oct 2025 13:38:38 -0600 Subject: [PATCH] fix(xai): enforce positive integer for xaiModelContextWindow and handle undefined cacheWritesPrice --- packages/types/src/provider-settings.ts | 2 +- src/api/providers/fetchers/xai.ts | 2 +- src/api/providers/xai.ts | 2 +- webview-ui/src/components/settings/providers/XAI.tsx | 6 +++--- webview-ui/src/components/ui/hooks/useSelectedModel.ts | 5 +++-- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index a05e3f6b50..636214e9a1 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -353,7 +353,7 @@ const fakeAiSchema = baseProviderSettingsSchema.extend({ const xaiSchema = apiModelIdProviderModelSchema.extend({ xaiApiKey: z.string().optional(), - xaiModelContextWindow: z.number().optional(), + xaiModelContextWindow: z.number().int().min(1).optional(), }) const groqSchema = apiModelIdProviderModelSchema.extend({ diff --git a/src/api/providers/fetchers/xai.ts b/src/api/providers/fetchers/xai.ts index 5f12eb03a0..4ca861864d 100644 --- a/src/api/providers/fetchers/xai.ts +++ b/src/api/providers/fetchers/xai.ts @@ -77,7 +77,7 @@ export async function getXaiModels(apiKey?: string, baseUrl?: string): Promise { - const target = e.target as HTMLInputElement - const value = target.value - return value ? parseInt(value, 10) : undefined + const v = (e.target as HTMLInputElement).value.trim() + const n = Number(v) + return Number.isFinite(n) && n > 0 ? Math.floor(n) : undefined })} placeholder="e.g., 256000" className="w-full mt-4"> diff --git a/webview-ui/src/components/ui/hooks/useSelectedModel.ts b/webview-ui/src/components/ui/hooks/useSelectedModel.ts index d4cd9275c8..1ef1a1f079 100644 --- a/webview-ui/src/components/ui/hooks/useSelectedModel.ts +++ b/webview-ui/src/components/ui/hooks/useSelectedModel.ts @@ -184,10 +184,11 @@ function getSelectedModel({ const id = apiConfiguration.apiModelId ?? xaiDefaultModelId const dynamicInfo = routerModels.xai?.[id] if (dynamicInfo) { - // If router-provided model lacks contextWindow, apply manual override when provided + // If router-provided contextWindow is missing or invalid (<= 0), apply manual override when provided const overrideCw = apiConfiguration.xaiModelContextWindow const info = - dynamicInfo.contextWindow === undefined && typeof overrideCw === "number" + !(typeof dynamicInfo.contextWindow === "number" && dynamicInfo.contextWindow > 0) && + typeof overrideCw === "number" ? { ...dynamicInfo, contextWindow: overrideCw } : dynamicInfo return { id, info }