diff --git a/apps/app/src/hooks/useThreadCreationOptions.test.tsx b/apps/app/src/hooks/useThreadCreationOptions.test.tsx index ff704dac4..a73b3b2b7 100644 --- a/apps/app/src/hooks/useThreadCreationOptions.test.tsx +++ b/apps/app/src/hooks/useThreadCreationOptions.test.tsx @@ -403,6 +403,7 @@ describe("useThreadCreationOptions", () => { expect(result.current.modelOptions.map((option) => option.value)).toEqual( [ "claude-fable-5", + "claude-opus-5[1m]", "claude-opus-4-8[1m]", "claude-opus-4-7[1m]", "claude-sonnet-5", diff --git a/apps/server/test/system/execution-options.test.ts b/apps/server/test/system/execution-options.test.ts index 6726431f2..7dc99fe54 100644 --- a/apps/server/test/system/execution-options.test.ts +++ b/apps/server/test/system/execution-options.test.ts @@ -743,6 +743,7 @@ describe("resolveSystemExecutionOptions", () => { // models stay appended after it. expect(response.models.map((model) => model.model)).toEqual([ "claude-fable-5", + "claude-opus-5[1m]", "claude-opus-4-8[1m]", "claude-opus-4-7[1m]", "claude-sonnet-5", @@ -782,6 +783,7 @@ describe("resolveSystemExecutionOptions", () => { }); expect(response.models.map((model) => model.model)).toEqual([ "claude-fable-5", + "claude-opus-5[1m]", "claude-opus-4-8[1m]", "claude-opus-4-7[1m]", "claude-sonnet-5", @@ -790,7 +792,7 @@ describe("resolveSystemExecutionOptions", () => { response.models .filter((model) => model.isDefault) .map((model) => model.model), - ).toEqual(["claude-opus-4-8[1m]"]); + ).toEqual(["claude-opus-5[1m]"]); }); }); diff --git a/packages/agent-providers/src/claude-code-models.ts b/packages/agent-providers/src/claude-code-models.ts index ecb27236b..94faf9c2e 100644 --- a/packages/agent-providers/src/claude-code-models.ts +++ b/packages/agent-providers/src/claude-code-models.ts @@ -31,7 +31,7 @@ export const CLAUDE_XHIGH_CAPABLE_REASONING_EFFORTS: readonly ModelReasoningEffo MAX_REASONING_EFFORT, ]; -export const DEFAULT_CLAUDE_CODE_MODEL = "claude-opus-4-8[1m]"; +export const DEFAULT_CLAUDE_CODE_MODEL = "claude-opus-5[1m]"; /** * BB's curated, version-pinned Claude Code models. Lives here rather than in the @@ -59,6 +59,14 @@ export const CLAUDE_CODE_ACTIVE_CATALOG: readonly ClaudeCodeCatalogEntry[] = [ { id: DEFAULT_CLAUDE_CODE_MODEL, model: DEFAULT_CLAUDE_CODE_MODEL, + displayName: "Opus 5 (1M)", + description: "Opus 5 with 1M context for complex long coding sessions", + supportedReasoningEfforts: CLAUDE_XHIGH_CAPABLE_REASONING_EFFORTS, + defaultReasoningEffort: "high", + }, + { + id: "claude-opus-4-8[1m]", + model: "claude-opus-4-8[1m]", displayName: "Opus 4.8 (1M)", description: "Opus 4.8 with 1M context for complex long coding sessions", supportedReasoningEfforts: CLAUDE_XHIGH_CAPABLE_REASONING_EFFORTS, diff --git a/packages/agent-runtime/src/claude-code/bridge/__tests__/bridge.test.ts b/packages/agent-runtime/src/claude-code/bridge/__tests__/bridge.test.ts index 219f319af..908ccdadc 100644 --- a/packages/agent-runtime/src/claude-code/bridge/__tests__/bridge.test.ts +++ b/packages/agent-runtime/src/claude-code/bridge/__tests__/bridge.test.ts @@ -1698,15 +1698,15 @@ describe("bridge", () => { models: [ { value: "default", - resolvedModel: "claude-opus-4-8[1m]", + resolvedModel: "claude-opus-5[1m]", displayName: "Default (recommended)", - description: "Opus 4.8 with 1M context", + description: "Opus 5 with 1M context", }, { value: "opus[1m]", - resolvedModel: "claude-opus-4-8[1m]", + resolvedModel: "claude-opus-5[1m]", displayName: "Opus", - description: "Opus 4.8 with 1M context", + description: "Opus 5 with 1M context", }, { value: "sonnet", @@ -1726,14 +1726,15 @@ describe("bridge", () => { // Sonnet still yields every curated row; the probe's default wins. expect(models.map((model) => model.model)).toEqual([ "claude-fable-5", + "claude-opus-5[1m]", "claude-opus-4-8[1m]", "claude-opus-4-7[1m]", "claude-sonnet-5", ]); expect(models.filter((model) => model.isDefault)).toEqual([ expect.objectContaining({ - model: "claude-opus-4-8[1m]", - displayName: "Opus 4.8 (1M)", + model: "claude-opus-5[1m]", + displayName: "Opus 5 (1M)", }), ]); expect(selectedOnlyModels.map((model) => model.model)).toEqual([ diff --git a/packages/agent-runtime/src/claude-code/model-list.test.ts b/packages/agent-runtime/src/claude-code/model-list.test.ts index 88339c036..3b714d7ee 100644 --- a/packages/agent-runtime/src/claude-code/model-list.test.ts +++ b/packages/agent-runtime/src/claude-code/model-list.test.ts @@ -5,15 +5,15 @@ import { buildClaudeCodeModels } from "./model-list.js"; const DISCOVERED_MODELS: ModelInfo[] = [ { value: "default", - resolvedModel: "claude-opus-4-8[1m]", + resolvedModel: "claude-opus-5[1m]", displayName: "Default (recommended)", - description: "Opus 4.8 with 1M context", + description: "Opus 5 with 1M context", }, { value: "opus[1m]", - resolvedModel: "claude-opus-4-8[1m]", + resolvedModel: "claude-opus-5[1m]", displayName: "Opus", - description: "Opus 4.8 with 1M context", + description: "Opus 5 with 1M context", }, { value: "claude-fable-5[1m]", @@ -37,6 +37,7 @@ const DISCOVERED_MODELS: ModelInfo[] = [ const CURATED_MODELS = [ "claude-fable-5", + "claude-opus-5[1m]", "claude-opus-4-8[1m]", "claude-opus-4-7[1m]", "claude-sonnet-5", @@ -53,7 +54,7 @@ describe("buildClaudeCodeModels", () => { "claude-haiku-4-5-20251001", ]); expect(result.models.find((model) => model.isDefault)?.model).toBe( - "claude-opus-4-8[1m]", + "claude-opus-5[1m]", ); // Selected-only rows stay discovery-gated — they only label a selection the // user already has. @@ -76,7 +77,7 @@ describe("buildClaudeCodeModels", () => { expect(result.models.map((model) => model.model)).toEqual(CURATED_MODELS); expect(result.models.find((model) => model.isDefault)?.model).toBe( - "claude-opus-4-8[1m]", + "claude-opus-5[1m]", ); expect(result.selectedOnlyModels).toEqual([]); }); diff --git a/packages/agent-runtime/src/claude-code/model-list.ts b/packages/agent-runtime/src/claude-code/model-list.ts index 47e96716e..01de55190 100644 --- a/packages/agent-runtime/src/claude-code/model-list.ts +++ b/packages/agent-runtime/src/claude-code/model-list.ts @@ -128,10 +128,11 @@ const CLAUDE_CODE_SELECTED_ONLY_CATALOG: readonly ClaudeCodeCatalogEntry[] = [ { id: "opus[1m]", model: "opus[1m]", - displayName: "Opus Alias (1M, Legacy)", - description: "Legacy moving Opus 1M alias retained for existing selections", - supportedReasoningEfforts: OPUS_4_6_REASONING_EFFORTS, - defaultReasoningEffort: "medium", + displayName: "Opus Alias (1M, Current)", + description: + "Moving Opus 1M alias accepted by Claude Code; resolves to the current Opus 1M model", + supportedReasoningEfforts: CLAUDE_XHIGH_CAPABLE_REASONING_EFFORTS, + defaultReasoningEffort: "high", }, { id: "opus",