fix(opencode): support MiniMax M3 thinking toggle (#31426)
This commit is contained in:
@@ -641,6 +641,15 @@ export function variants(model: Provider.Model): Record<string, Record<string, a
|
|||||||
if (!model.capabilities.reasoning) return {}
|
if (!model.capabilities.reasoning) return {}
|
||||||
|
|
||||||
const id = model.id.toLowerCase()
|
const id = model.id.toLowerCase()
|
||||||
|
if (
|
||||||
|
model.api.id.toLowerCase().includes("minimax-m3") &&
|
||||||
|
["@ai-sdk/anthropic", "@ai-sdk/openai-compatible"].includes(model.api.npm)
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
none: { thinking: { type: "disabled" } },
|
||||||
|
thinking: { thinking: { type: "adaptive" } },
|
||||||
|
}
|
||||||
|
}
|
||||||
const adaptiveOpus = anthropicOpus47OrLater(model.api.id)
|
const adaptiveOpus = anthropicOpus47OrLater(model.api.id)
|
||||||
const adaptiveEfforts = anthropicAdaptiveEfforts(model.api.id)
|
const adaptiveEfforts = anthropicAdaptiveEfforts(model.api.id)
|
||||||
if (
|
if (
|
||||||
@@ -1076,8 +1085,13 @@ export function options(input: {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable thinking by default for kimi models using anthropic SDK
|
|
||||||
const modelId = input.model.api.id.toLowerCase()
|
const modelId = input.model.api.id.toLowerCase()
|
||||||
|
// MiniMax's Anthropic interface defaults thinking off, unlike Chat Completions.
|
||||||
|
if (modelId.includes("minimax-m3") && input.model.api.npm === "@ai-sdk/anthropic") {
|
||||||
|
result["thinking"] = { type: "adaptive" }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable thinking by default for kimi models using anthropic SDK
|
||||||
if (
|
if (
|
||||||
(input.model.api.npm === "@ai-sdk/anthropic" || input.model.api.npm === "@ai-sdk/google-vertex/anthropic") &&
|
(input.model.api.npm === "@ai-sdk/anthropic" || input.model.api.npm === "@ai-sdk/google-vertex/anthropic") &&
|
||||||
(modelId.includes("k2p") || modelId.includes("kimi-k2.") || modelId.includes("kimi-k2p"))
|
(modelId.includes("k2p") || modelId.includes("kimi-k2.") || modelId.includes("kimi-k2p"))
|
||||||
|
|||||||
@@ -175,6 +175,39 @@ describe("ProviderTransform.options - zai/zhipuai thinking", () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe("ProviderTransform.options - minimax m3 thinking", () => {
|
||||||
|
const createModel = (npm: string) =>
|
||||||
|
({
|
||||||
|
id: "minimax/minimax-m3",
|
||||||
|
providerID: "minimax",
|
||||||
|
api: {
|
||||||
|
id: "minimax-m3",
|
||||||
|
url: "https://api.minimax.com",
|
||||||
|
npm,
|
||||||
|
},
|
||||||
|
capabilities: { reasoning: true },
|
||||||
|
limit: { output: 64_000 },
|
||||||
|
}) as any
|
||||||
|
|
||||||
|
test("explicitly enables adaptive thinking with the anthropic SDK", () => {
|
||||||
|
expect(
|
||||||
|
ProviderTransform.options({
|
||||||
|
model: createModel("@ai-sdk/anthropic"),
|
||||||
|
sessionID: "test-session-123",
|
||||||
|
}).thinking,
|
||||||
|
).toEqual({ type: "adaptive" })
|
||||||
|
})
|
||||||
|
|
||||||
|
test("uses the native default with the openai-compatible SDK", () => {
|
||||||
|
expect(
|
||||||
|
ProviderTransform.options({
|
||||||
|
model: createModel("@ai-sdk/openai-compatible"),
|
||||||
|
sessionID: "test-session-123",
|
||||||
|
}).thinking,
|
||||||
|
).toBeUndefined()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
describe("ProviderTransform.options - google thinkingConfig gating", () => {
|
describe("ProviderTransform.options - google thinkingConfig gating", () => {
|
||||||
const sessionID = "test-session-123"
|
const sessionID = "test-session-123"
|
||||||
|
|
||||||
@@ -2452,6 +2485,39 @@ describe("ProviderTransform.variants", () => {
|
|||||||
expect(result).toEqual({})
|
expect(result).toEqual({})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("minimax m3 using anthropic returns thinking toggles", () => {
|
||||||
|
const model = createMockModel({
|
||||||
|
id: "minimax/minimax-m3",
|
||||||
|
providerID: "minimax",
|
||||||
|
api: {
|
||||||
|
id: "MiniMax-M3",
|
||||||
|
url: "https://api.minimax.com/anthropic/v1",
|
||||||
|
npm: "@ai-sdk/anthropic",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const result = ProviderTransform.variants(model)
|
||||||
|
expect(result).toEqual({
|
||||||
|
none: { thinking: { type: "disabled" } },
|
||||||
|
thinking: { thinking: { type: "adaptive" } },
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
test("minimax m3 using openai-compatible returns thinking toggles", () => {
|
||||||
|
const model = createMockModel({
|
||||||
|
id: "minimax/minimax-m3",
|
||||||
|
providerID: "minimax",
|
||||||
|
api: {
|
||||||
|
id: "minimax-m3",
|
||||||
|
url: "https://api.minimax.com/v1",
|
||||||
|
npm: "@ai-sdk/openai-compatible",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
expect(ProviderTransform.variants(model)).toEqual({
|
||||||
|
none: { thinking: { type: "disabled" } },
|
||||||
|
thinking: { thinking: { type: "adaptive" } },
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
test("glm returns empty object", () => {
|
test("glm returns empty object", () => {
|
||||||
const model = createMockModel({
|
const model = createMockModel({
|
||||||
id: "glm/glm-4",
|
id: "glm/glm-4",
|
||||||
|
|||||||
Reference in New Issue
Block a user