From cc51c2d0ae2a78af97af5febc4820b1e27563b0e Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Mon, 22 Jun 2026 21:47:14 -0400 Subject: [PATCH 1/3] fix(ai-gateway): require thinking for MiniMax M3 --- .../providers/model-settings.test.ts | 20 +++++++++++++++++++ .../ai-gateway/providers/model-settings.ts | 5 ++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 apps/web/src/lib/ai-gateway/providers/model-settings.test.ts diff --git a/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts b/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts new file mode 100644 index 0000000000..1d59776ebf --- /dev/null +++ b/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts @@ -0,0 +1,20 @@ +import { MINIMAX_CURRENT_MODEL_ID } from './minimax'; +import { getModelVariants } from './model-settings'; + +describe('MiniMax model variants', () => { + it.each([MINIMAX_CURRENT_MODEL_ID, 'opencode-go/minimax-m3'])( + 'exposes only adaptive thinking for MiniMax M3 model %s', + model => { + expect(getModelVariants(model)).toEqual({ + thinking: { reasoning: { enabled: true, effort: 'high' } }, + }); + } + ); + + it('keeps the reasoning toggle for older MiniMax models', () => { + expect(getModelVariants('minimax/minimax-m2.7')).toEqual({ + instant: { reasoning: { enabled: false, effort: 'none' } }, + thinking: { reasoning: { enabled: true, effort: 'high' } }, + }); + }); +}); diff --git a/apps/web/src/lib/ai-gateway/providers/model-settings.ts b/apps/web/src/lib/ai-gateway/providers/model-settings.ts index 52ff151945..ddc4a9c7dc 100644 --- a/apps/web/src/lib/ai-gateway/providers/model-settings.ts +++ b/apps/web/src/lib/ai-gateway/providers/model-settings.ts @@ -104,7 +104,10 @@ export function getModelVariants(model: string): OpenCodeSettings['variants'] { if (model.includes('mistral-medium-3-5')) { return REASONING_VARIANTS_BINARY; } - if (model.includes('kimi-k2.7-code')) { + if ( + model.includes('kimi-k2.7-code') || + (isMinimaxModel(model) && model.toLowerCase().includes('minimax-m3')) + ) { return REASONING_VARIANTS_THINKING_ONLY; } if ( From 7fdc18854cb1b1321cf25192f5f8fc97e82101c4 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Mon, 22 Jun 2026 22:19:07 -0400 Subject: [PATCH 2/3] fix(ai-gateway): support MiniMax M3 thinking modes --- .../lib/ai-gateway/providers/model-settings.test.ts | 3 ++- .../src/lib/ai-gateway/providers/model-settings.ts | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts b/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts index 1d59776ebf..27d9f02969 100644 --- a/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts +++ b/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts @@ -3,9 +3,10 @@ import { getModelVariants } from './model-settings'; describe('MiniMax model variants', () => { it.each([MINIMAX_CURRENT_MODEL_ID, 'opencode-go/minimax-m3'])( - 'exposes only adaptive thinking for MiniMax M3 model %s', + 'exposes disabled and adaptive thinking for MiniMax M3 model %s', model => { expect(getModelVariants(model)).toEqual({ + none: { reasoning: { enabled: false, effort: 'none' } }, thinking: { reasoning: { enabled: true, effort: 'high' } }, }); } diff --git a/apps/web/src/lib/ai-gateway/providers/model-settings.ts b/apps/web/src/lib/ai-gateway/providers/model-settings.ts index ddc4a9c7dc..d67a31bdac 100644 --- a/apps/web/src/lib/ai-gateway/providers/model-settings.ts +++ b/apps/web/src/lib/ai-gateway/providers/model-settings.ts @@ -25,6 +25,11 @@ const REASONING_VARIANTS_THINKING_ONLY = { thinking: { reasoning: { enabled: true, effort: 'high' } }, } as const; +const REASONING_VARIANTS_NONE_THINKING = { + none: { reasoning: { enabled: false, effort: 'none' } }, + ...REASONING_VARIANTS_THINKING_ONLY, +} as const; + export const REASONING_VARIANTS_BINARY = { instant: { reasoning: { enabled: false, effort: 'none' } }, ...REASONING_VARIANTS_THINKING_ONLY, @@ -104,12 +109,12 @@ export function getModelVariants(model: string): OpenCodeSettings['variants'] { if (model.includes('mistral-medium-3-5')) { return REASONING_VARIANTS_BINARY; } - if ( - model.includes('kimi-k2.7-code') || - (isMinimaxModel(model) && model.toLowerCase().includes('minimax-m3')) - ) { + if (model.includes('kimi-k2.7-code')) { return REASONING_VARIANTS_THINKING_ONLY; } + if (isMinimaxModel(model) && model.toLowerCase().includes('minimax-m3')) { + return REASONING_VARIANTS_NONE_THINKING; + } if ( isMinimaxModel(model) || isKimiModel(model) || From 183af72d9f43e05cc4c164f073fee8e0a8e80543 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Mon, 22 Jun 2026 22:40:58 -0400 Subject: [PATCH 3/3] fix(ai-gateway): default MiniMax M3 to thinking --- .../ai-gateway/providers/model-settings.test.ts | 16 +++++++++++----- .../lib/ai-gateway/providers/model-settings.ts | 10 ++++++---- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts b/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts index 27d9f02969..348bf92489 100644 --- a/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts +++ b/apps/web/src/lib/ai-gateway/providers/model-settings.test.ts @@ -3,17 +3,23 @@ import { getModelVariants } from './model-settings'; describe('MiniMax model variants', () => { it.each([MINIMAX_CURRENT_MODEL_ID, 'opencode-go/minimax-m3'])( - 'exposes disabled and adaptive thinking for MiniMax M3 model %s', + 'defaults to thinking while exposing instant for MiniMax M3 model %s', model => { - expect(getModelVariants(model)).toEqual({ - none: { reasoning: { enabled: false, effort: 'none' } }, + const variants = getModelVariants(model); + + expect(Object.keys(variants ?? {})).toEqual(['thinking', 'instant']); + expect(variants).toEqual({ thinking: { reasoning: { enabled: true, effort: 'high' } }, + instant: { reasoning: { enabled: false, effort: 'none' } }, }); } ); - it('keeps the reasoning toggle for older MiniMax models', () => { - expect(getModelVariants('minimax/minimax-m2.7')).toEqual({ + it('keeps instant as the default for older MiniMax models', () => { + const variants = getModelVariants('minimax/minimax-m2.7'); + + expect(Object.keys(variants ?? {})).toEqual(['instant', 'thinking']); + expect(variants).toEqual({ instant: { reasoning: { enabled: false, effort: 'none' } }, thinking: { reasoning: { enabled: true, effort: 'high' } }, }); diff --git a/apps/web/src/lib/ai-gateway/providers/model-settings.ts b/apps/web/src/lib/ai-gateway/providers/model-settings.ts index d67a31bdac..b14fa072a8 100644 --- a/apps/web/src/lib/ai-gateway/providers/model-settings.ts +++ b/apps/web/src/lib/ai-gateway/providers/model-settings.ts @@ -25,13 +25,15 @@ const REASONING_VARIANTS_THINKING_ONLY = { thinking: { reasoning: { enabled: true, effort: 'high' } }, } as const; -const REASONING_VARIANTS_NONE_THINKING = { - none: { reasoning: { enabled: false, effort: 'none' } }, +const REASONING_DISABLED = { reasoning: { enabled: false, effort: 'none' } } as const; + +const REASONING_VARIANTS_THINKING_INSTANT = { ...REASONING_VARIANTS_THINKING_ONLY, + instant: REASONING_DISABLED, } as const; export const REASONING_VARIANTS_BINARY = { - instant: { reasoning: { enabled: false, effort: 'none' } }, + instant: REASONING_DISABLED, ...REASONING_VARIANTS_THINKING_ONLY, } as const; @@ -113,7 +115,7 @@ export function getModelVariants(model: string): OpenCodeSettings['variants'] { return REASONING_VARIANTS_THINKING_ONLY; } if (isMinimaxModel(model) && model.toLowerCase().includes('minimax-m3')) { - return REASONING_VARIANTS_NONE_THINKING; + return REASONING_VARIANTS_THINKING_INSTANT; } if ( isMinimaxModel(model) ||