From e63fa0de7b1f7d8859c8c2f7480b147c38a55b0c Mon Sep 17 00:00:00 2001 From: Tom X Nguyen Date: Thu, 5 Feb 2026 01:16:05 +0700 Subject: [PATCH] fix(provider): preserve user-defined model variants from config The previous code would unconditionally overwrite model.variants with ProviderTransform.variants() result, which returns {} for kimi and other models. This caused user-defined variants from config to be lost. The fix merges ProviderTransform variants with existing model.variants instead of overwriting, ensuring user config always takes precedence. Subtle bug: In the rare case where both ProviderTransform and user config define a variant with the same name, the old merge order could cause unexpected behavior when configVariants lookup failed. --- packages/opencode/src/provider/provider.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 2a01bbc4432..e9aeffe2d3a 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -922,17 +922,14 @@ export namespace Provider { ) delete provider.models[modelID] - model.variants = mapValues(ProviderTransform.variants(model), (v) => v) - - // Filter out disabled variants from config - const configVariants = configProvider?.models?.[modelID]?.variants - if (configVariants && model.variants) { - const merged = mergeDeep(model.variants, configVariants) - model.variants = mapValues( - pickBy(merged, (v) => !v.disabled), - (v) => omit(v, ["disabled"]), - ) - } + // Merge ProviderTransform variants with existing model variants (from config) + // User config variants take precedence over ProviderTransform defaults + const baseVariants = ProviderTransform.variants(model) + const mergedVariants = mergeDeep(baseVariants, model.variants ?? {}) + model.variants = mapValues( + pickBy(mergedVariants, (v) => !v.disabled), + (v) => omit(v, ["disabled"]), + ) } if (Object.keys(provider.models).length === 0) {