fix(opencode): enable adaptive reasoning for opus 4.7+ (#29769)

This commit is contained in:
Aiden Cline
2026-05-28 12:19:34 -05:00
committed by GitHub
parent 72d008bd5c
commit 05e3c4ecee
2 changed files with 40 additions and 7 deletions
+12 -7
View File
@@ -596,8 +596,16 @@ function openaiCompatibleReasoningEfforts(id: string) {
return gpt5CodexReasoningEfforts(apiId) ?? versionedGpt5ReasoningEfforts(apiId) ?? OPENAI_EFFORTS return gpt5CodexReasoningEfforts(apiId) ?? versionedGpt5ReasoningEfforts(apiId) ?? OPENAI_EFFORTS
} }
function anthropicOpus47OrLater(apiId: string) {
const version = /opus-(\d+)[.-](\d+)(?:[.-]|$)/i.exec(apiId)
if (!version) return false
const major = Number(version[1])
const minor = Number(version[2])
return major > 4 || (major === 4 && minor >= 7)
}
function anthropicAdaptiveEfforts(apiId: string): string[] | null { function anthropicAdaptiveEfforts(apiId: string): string[] | null {
if (["opus-4-7", "opus-4.7"].some((v) => apiId.includes(v))) { if (anthropicOpus47OrLater(apiId)) {
return ["low", "medium", "high", "xhigh", "max"] return ["low", "medium", "high", "xhigh", "max"]
} }
if (["opus-4-6", "opus-4.6", "sonnet-4-6", "sonnet-4.6"].some((v) => apiId.includes(v))) { if (["opus-4-6", "opus-4.6", "sonnet-4-6", "sonnet-4.6"].some((v) => apiId.includes(v))) {
@@ -625,6 +633,7 @@ 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()
const adaptiveOpus = anthropicOpus47OrLater(model.api.id)
const adaptiveEfforts = anthropicAdaptiveEfforts(model.api.id) const adaptiveEfforts = anthropicAdaptiveEfforts(model.api.id)
if ( if (
id.includes("deepseek-chat") || id.includes("deepseek-chat") ||
@@ -833,9 +842,7 @@ export function variants(model: Provider.Model): Record<string, Record<string, a
{ {
thinking: { thinking: {
type: "adaptive", type: "adaptive",
...(model.api.id.includes("opus-4-7") || model.api.id.includes("opus-4.7") ...(adaptiveOpus ? { display: "summarized" } : {}),
? { display: "summarized" }
: {}),
}, },
effort, effort,
}, },
@@ -872,9 +879,7 @@ export function variants(model: Provider.Model): Record<string, Record<string, a
reasoningConfig: { reasoningConfig: {
type: "adaptive", type: "adaptive",
maxReasoningEffort: effort, maxReasoningEffort: effort,
...(model.api.id.includes("opus-4-7") || model.api.id.includes("opus-4.7") ...(adaptiveOpus ? { display: "summarized" } : {}),
? { display: "summarized" }
: {}),
}, },
}, },
]), ]),
@@ -3223,6 +3223,12 @@ describe("ProviderTransform.variants", () => {
efforts: ["low", "medium", "high", "xhigh", "max"], efforts: ["low", "medium", "high", "xhigh", "max"],
expectedHigh: { thinking: { type: "adaptive", display: "summarized" }, effort: "high" }, expectedHigh: { thinking: { type: "adaptive", display: "summarized" }, effort: "high" },
}, },
{
name: "opus 4.8",
apiIds: ["claude-opus-4-8", "claude-opus-4.8"],
efforts: ["low", "medium", "high", "xhigh", "max"],
expectedHigh: { thinking: { type: "adaptive", display: "summarized" }, effort: "high" },
},
]) { ]) {
for (const apiId of testCase.apiIds) { for (const apiId of testCase.apiIds) {
test(`${testCase.name} ${apiId} returns supported reasoning efforts`, () => { test(`${testCase.name} ${apiId} returns supported reasoning efforts`, () => {
@@ -3341,6 +3347,28 @@ describe("ProviderTransform.variants", () => {
}) })
}) })
test("anthropic opus 4.8 returns adaptive reasoning options with xhigh", () => {
const result = ProviderTransform.variants(
createMockModel({
id: "bedrock/anthropic-claude-opus-4.8",
providerID: "bedrock",
api: {
id: "anthropic.claude-opus-4.8",
url: "https://bedrock.amazonaws.com",
npm: "@ai-sdk/amazon-bedrock",
},
}),
)
expect(Object.keys(result)).toEqual(["low", "medium", "high", "xhigh", "max"])
expect(result.high).toEqual({
reasoningConfig: {
type: "adaptive",
maxReasoningEffort: "high",
display: "summarized",
},
})
})
test("returns WIDELY_SUPPORTED_EFFORTS with reasoningConfig", () => { test("returns WIDELY_SUPPORTED_EFFORTS with reasoningConfig", () => {
const model = createMockModel({ const model = createMockModel({
id: "bedrock/llama-4", id: "bedrock/llama-4",