Skip to content

Commit b5b1ca8

Browse files
committed
fix: address MiniMax review findings
Treat env-only provider routes such as direct MiniMax as complete startup provider selections so saved profiles do not override explicit MINIMAX_API_KEY/ANTHROPIC_* env. Stop advertising direct MiniMax benchmark support through the OpenAI-compatible benchmark path, and add regression coverage for the unsupported direct MiniMax benchmark env.
1 parent 1ac6a95 commit b5b1ca8

5 files changed

Lines changed: 77 additions & 4 deletions

File tree

src/commands/benchmark.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ async function runBenchmark(
1515
if (!isBenchmarkSupported()) {
1616
context?.stdout?.write(
1717
'Benchmark not supported for this provider.\n' +
18-
'Supported: OpenAI-compatible endpoints (Ollama, NVIDIA NIM, MiniMax)\n',
18+
'Supported: OpenAI-compatible endpoints (Ollama, NVIDIA NIM)\n',
1919
)
2020
return
2121
}
@@ -53,4 +53,4 @@ export const benchmark: Command = {
5353

5454
await runBenchmark(model, context)
5555
},
56-
}
56+
}

src/utils/model/benchmark.test.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { afterEach, expect, test } from 'bun:test'
2+
3+
const ORIGINAL_ENV = {
4+
CLAUDE_CODE_USE_OPENAI: process.env.CLAUDE_CODE_USE_OPENAI,
5+
OPENAI_API_KEY: process.env.OPENAI_API_KEY,
6+
OPENAI_BASE_URL: process.env.OPENAI_BASE_URL,
7+
OPENAI_API_BASE: process.env.OPENAI_API_BASE,
8+
OPENAI_MODEL: process.env.OPENAI_MODEL,
9+
MINIMAX_API_KEY: process.env.MINIMAX_API_KEY,
10+
ANTHROPIC_BASE_URL: process.env.ANTHROPIC_BASE_URL,
11+
ANTHROPIC_MODEL: process.env.ANTHROPIC_MODEL,
12+
}
13+
14+
function restoreEnv(): void {
15+
for (const [key, value] of Object.entries(ORIGINAL_ENV)) {
16+
if (value === undefined) {
17+
delete process.env[key]
18+
} else {
19+
process.env[key] = value
20+
}
21+
}
22+
}
23+
24+
afterEach(() => {
25+
restoreEnv()
26+
})
27+
28+
test('benchmark support does not advertise direct MiniMax Anthropic-compatible env', async () => {
29+
delete process.env.CLAUDE_CODE_USE_OPENAI
30+
delete process.env.OPENAI_API_KEY
31+
delete process.env.OPENAI_BASE_URL
32+
delete process.env.OPENAI_API_BASE
33+
delete process.env.OPENAI_MODEL
34+
process.env.MINIMAX_API_KEY = 'minimax-test-key'
35+
process.env.ANTHROPIC_BASE_URL = 'https://api.minimax.io/anthropic'
36+
process.env.ANTHROPIC_MODEL = 'MiniMax-M2.7'
37+
38+
const { isBenchmarkSupported } = await import(
39+
`./benchmark.js?ts=${Date.now()}-${Math.random()}`
40+
)
41+
42+
expect(isBenchmarkSupported()).toBe(false)
43+
})

src/utils/model/benchmark.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ function getBenchmarkEndpoint(): string | null {
3434
if (provider === 'openai' || provider === 'firstParty') {
3535
return `${baseUrl || 'https://api.openai.com/v1'}/chat/completions`
3636
}
37-
// NVIDIA NIM or MiniMax via OPENAI_BASE_URL
38-
if (baseUrl?.includes('nvidia') || baseUrl?.includes('minimax')) {
37+
// NVIDIA NIM via OPENAI_BASE_URL
38+
if (baseUrl?.includes('nvidia')) {
3939
return `${baseUrl}/chat/completions`
4040
}
4141
return null

src/utils/providerProfiles.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,34 @@ describe('applyActiveProviderProfileFromConfig', () => {
781781
expect(process.env.OPENAI_MODEL).toBe('gpt-4o-mini')
782782
})
783783

784+
test('does not override explicit env-only MiniMax selection with saved profile', async () => {
785+
const { applyActiveProviderProfileFromConfig } =
786+
await importFreshProviderProfileModules()
787+
process.env.MINIMAX_API_KEY = 'minimax-live-key'
788+
process.env.ANTHROPIC_BASE_URL = 'https://api.minimax.io/anthropic'
789+
process.env.ANTHROPIC_MODEL = 'MiniMax-M2.7'
790+
791+
const applied = applyActiveProviderProfileFromConfig({
792+
providerProfiles: [
793+
buildProfile({
794+
id: 'saved_openai',
795+
baseUrl: 'https://api.openai.com/v1',
796+
model: 'gpt-4o',
797+
}),
798+
],
799+
activeProviderProfileId: 'saved_openai',
800+
} as any)
801+
802+
expect(applied).toBeUndefined()
803+
expect(process.env.MINIMAX_API_KEY).toBe('minimax-live-key')
804+
expect(process.env.ANTHROPIC_BASE_URL).toBe(
805+
'https://api.minimax.io/anthropic',
806+
)
807+
expect(process.env.ANTHROPIC_MODEL).toBe('MiniMax-M2.7')
808+
expect(process.env.CLAUDE_CODE_USE_OPENAI).toBeUndefined()
809+
expect(process.env.OPENAI_BASE_URL).toBeUndefined()
810+
})
811+
784812
test('does not override explicit startup selection when profile marker is stale', async () => {
785813
const { applyActiveProviderProfileFromConfig } =
786814
await importFreshProviderProfileModules()

src/utils/providerProfiles.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
type ResolvedProfileRoute,
3939
type ProviderPreset,
4040
} from '../integrations/index.js'
41+
import { resolveEnvOnlyProviderRouteId } from '../integrations/routeMetadata.js'
4142
import { logForDebugging } from './debug.js'
4243
import {
4344
sanitizeProfileCustomHeaders,
@@ -344,6 +345,7 @@ function hasProviderSelectionFlags(
344345
function hasCompleteProviderSelection(
345346
processEnv: NodeJS.ProcessEnv = process.env,
346347
): boolean {
348+
if (resolveEnvOnlyProviderRouteId(processEnv) !== null) return true
347349
if (!hasProviderSelectionFlags(processEnv)) return false
348350
if (processEnv.CLAUDE_CODE_USE_OPENAI !== undefined) {
349351
return (

0 commit comments

Comments
 (0)