diff --git a/packages/cli/tests/15-provider.test.ts b/packages/cli/tests/15-provider.test.ts index f08f9b420..6de2e3dd4 100644 --- a/packages/cli/tests/15-provider.test.ts +++ b/packages/cli/tests/15-provider.test.ts @@ -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", diff --git a/packages/server/src/server/agent/providers/claude-agent.test.ts b/packages/server/src/server/agent/providers/claude-agent.test.ts index c4eb812a7..58285b5f8 100644 --- a/packages/server/src/server/agent/providers/claude-agent.test.ts +++ b/packages/server/src/server/agent/providers/claude-agent.test.ts @@ -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", diff --git a/packages/server/src/server/agent/providers/claude-agent.ts b/packages/server/src/server/agent/providers/claude-agent.ts index 6924f5917..52e868a94 100644 --- a/packages/server/src/server/agent/providers/claude-agent.ts +++ b/packages/server/src/server/agent/providers/claude-agent.ts @@ -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 = [ diff --git a/packages/server/src/server/agent/providers/claude/claude-models.test.ts b/packages/server/src/server/agent/providers/claude/claude-models.test.ts index fb72f2337..6d1e8a49a 100644 --- a/packages/server/src/server/agent/providers/claude/claude-models.test.ts +++ b/packages/server/src/server/agent/providers/claude/claude-models.test.ts @@ -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", diff --git a/packages/server/src/server/agent/providers/claude/claude-models.ts b/packages/server/src/server/agent/providers/claude/claude-models.ts index e59d19384..28f6ba335 100644 --- a/packages/server/src/server/agent/providers/claude/claude-models.ts +++ b/packages/server/src/server/agent/providers/claude/claude-models.ts @@ -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]",