feat(server): add Opus 4.7 to claude provider with xhigh effort

Adds claude-opus-4-7 and claude-opus-4-7[1m] alongside the existing 4.6
entries (4.6 stays default). Opus 4.7 introduces a new "xhigh" effort
level between high and max; the option only surfaces on 4.7 models.

The SDK 0.2.71 effort union doesn't yet include xhigh, so the value is
cast at the assignment site.
This commit is contained in:
Mohamed Boudra
2026-04-16 21:52:40 +07:00
parent 754f1facb6
commit daefa8fb7f
5 changed files with 47 additions and 3 deletions
+10
View File
@@ -31,6 +31,16 @@ type ProviderModel = {
};
const EXPECTED_CLAUDE_MODELS = [
{
id: "claude-opus-4-7[1m]",
model: "Opus 4.7 1M",
descriptionFragment: "1M context window",
},
{
id: "claude-opus-4-7",
model: "Opus 4.7",
descriptionFragment: "Latest release",
},
{
id: "claude-opus-4-6[1m]",
model: "Opus 4.6 1M",
@@ -340,6 +340,8 @@ describe("ClaudeAgentClient.listModels", () => {
const models = await client.listModels();
expect(models.map((m) => m.id)).toEqual([
"claude-opus-4-7[1m]",
"claude-opus-4-7",
"claude-opus-4-6[1m]",
"claude-opus-4-6",
"claude-sonnet-4-6",
@@ -171,7 +171,7 @@ type ClaudeAgentSessionOptions = {
queryFactory?: typeof query;
};
type ClaudeThinkingEffort = "low" | "medium" | "high" | "max";
type ClaudeThinkingEffort = "low" | "medium" | "high" | "xhigh" | "max";
function resolveClaudeSpawnCommand(
spawnOptions: SpawnOptions,
@@ -238,7 +238,13 @@ function applyRuntimeSettingsToClaudeOptions(
}
function isClaudeThinkingEffort(value: string | null | undefined): value is ClaudeThinkingEffort {
return value === "low" || value === "medium" || value === "high" || value === "max";
return (
value === "low" ||
value === "medium" ||
value === "high" ||
value === "xhigh" ||
value === "max"
);
}
function sanitizeClaudeProjectPath(cwd: string): string {
@@ -2114,7 +2120,9 @@ class ClaudeAgentSession implements AgentSession {
let effort: ClaudeOptions["effort"];
if (thinkingOptionId && isClaudeThinkingEffort(thinkingOptionId)) {
thinking = { type: "adaptive" };
effort = thinkingOptionId;
// SDK 0.2.71 types `effort` as 'low' | 'medium' | 'high' | 'max'; Opus 4.7
// adds 'xhigh' which the binary accepts but the typings don't yet expose.
effort = thinkingOptionId as ClaudeOptions["effort"];
}
const appendedSystemPrompt = [
@@ -6,6 +6,8 @@ describe("getClaudeModels", () => {
it("returns all claude models", () => {
const models = getClaudeModels();
expect(models.map((m) => m.id)).toEqual([
"claude-opus-4-7[1m]",
"claude-opus-4-7",
"claude-opus-4-6[1m]",
"claude-opus-4-6",
"claude-sonnet-4-6",
@@ -7,7 +7,29 @@ const CLAUDE_THINKING_OPTIONS = [
{ id: "max", label: "Max" },
] as const;
const CLAUDE_OPUS_4_7_THINKING_OPTIONS = [
{ id: "low", label: "Low" },
{ id: "medium", label: "Medium" },
{ id: "high", label: "High" },
{ id: "xhigh", label: "Extra High" },
{ id: "max", label: "Max" },
] as const;
const CLAUDE_MODELS: AgentModelDefinition[] = [
{
provider: "claude",
id: "claude-opus-4-7[1m]",
label: "Opus 4.7 1M",
description: "Opus 4.7 with 1M context window",
thinkingOptions: [...CLAUDE_OPUS_4_7_THINKING_OPTIONS],
},
{
provider: "claude",
id: "claude-opus-4-7",
label: "Opus 4.7",
description: "Opus 4.7 · Latest release",
thinkingOptions: [...CLAUDE_OPUS_4_7_THINKING_OPTIONS],
},
{
provider: "claude",
id: "claude-opus-4-6[1m]",