fix(opencode): enable adaptive reasoning for opus 4.7+ (#29769)
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user