fix(ai): Fix a configuration bug with Opus 4.7 adaptive thinking (#3286)

This commit is contained in:
Markus Ylisiurunen
2026-04-16 20:57:19 +03:00
committed by GitHub
parent 72619e9246
commit d1c6cb1e0f
9 changed files with 223 additions and 20 deletions

View File

@@ -153,7 +153,7 @@ function convertContentBlocks(content: (TextContent | ImageContent)[]):
return blocks;
}
export type AnthropicEffort = "low" | "medium" | "high" | "max";
export type AnthropicEffort = "low" | "medium" | "high" | "xhigh" | "max";
export interface AnthropicOptions extends StreamOptions {
/**
@@ -168,9 +168,10 @@ export interface AnthropicOptions extends StreamOptions {
*/
thinkingBudgetTokens?: number;
/**
* Effort level for adaptive thinking (Opus 4.6 and Sonnet 4.6).
* Effort level for adaptive thinking (Opus 4.6+ and Sonnet 4.6).
* Controls how much thinking Claude allocates:
* - "max": Always thinks with no constraints (Opus 4.6 only)
* - "xhigh": Highest reasoning level (Opus 4.7)
* - "high": Always thinks, deep reasoning (default)
* - "medium": Moderate thinking, may skip for simple queries
* - "low": Minimal thinking, skips for simple tasks
@@ -448,13 +449,15 @@ export const streamAnthropic: StreamFunction<"anthropic-messages", AnthropicOpti
};
/**
* Check if a model supports adaptive thinking (Opus 4.6 and Sonnet 4.6)
* Check if a model supports adaptive thinking (Opus 4.6+, Sonnet 4.6)
*/
function supportsAdaptiveThinking(modelId: string): boolean {
// Opus 4.6 and Sonnet 4.6 model IDs (with or without date suffix)
// Adaptive-thinking model IDs (with or without date suffix)
return (
modelId.includes("opus-4-6") ||
modelId.includes("opus-4.6") ||
modelId.includes("opus-4-7") ||
modelId.includes("opus-4.7") ||
modelId.includes("sonnet-4-6") ||
modelId.includes("sonnet-4.6")
);
@@ -462,7 +465,7 @@ function supportsAdaptiveThinking(modelId: string): boolean {
/**
* Map ThinkingLevel to Anthropic effort levels for adaptive thinking.
* Note: effort "max" is only valid on Opus 4.6.
* Note: effort "max" is only valid on Opus 4.6, while Opus 4.7 supports "xhigh".
*/
function mapThinkingLevelToEffort(level: SimpleStreamOptions["reasoning"], modelId: string): AnthropicEffort {
switch (level) {
@@ -475,7 +478,13 @@ function mapThinkingLevelToEffort(level: SimpleStreamOptions["reasoning"], model
case "high":
return "high";
case "xhigh":
return modelId.includes("opus-4-6") || modelId.includes("opus-4.6") ? "max" : "high";
if (modelId.includes("opus-4-6") || modelId.includes("opus-4.6")) {
return "max";
}
if (modelId.includes("opus-4-7") || modelId.includes("opus-4.7")) {
return "xhigh";
}
return "high";
default:
return "high";
}