diff --git a/packages/shared/src/agent-options/agent-options.test.ts b/packages/shared/src/agent-options/agent-options.test.ts index 2fe8a2b9..1cfb0ba0 100644 --- a/packages/shared/src/agent-options/agent-options.test.ts +++ b/packages/shared/src/agent-options/agent-options.test.ts @@ -63,7 +63,7 @@ describe("PROVIDER_CATALOGS", () => { describe("resolveModelId", () => { it("resolves the opus alias to the latest dated id", () => { - expect(resolveModelId("anthropic", "opus")).toBe("claude-opus-4-7"); + expect(resolveModelId("anthropic", "opus")).toBe("claude-opus-4-8"); }); it("resolves the sonnet alias", () => { @@ -74,6 +74,10 @@ describe("resolveModelId", () => { expect(resolveModelId("anthropic", "haiku")).toBe("claude-haiku-4-5-20251001"); }); + it("resolves the fable alias", () => { + expect(resolveModelId("anthropic", "fable")).toBe("claude-fable-5"); + }); + it("returns an exact-match dated id unchanged", () => { expect(resolveModelId("anthropic", "claude-sonnet-4-5")).toBe("claude-sonnet-4-5"); }); @@ -87,7 +91,7 @@ describe("resolveModelId", () => { it("returns the latest-marked model when no input is provided", () => { // Pick a provider with an explicit `latest` flag. - expect(resolveModelId("anthropic", undefined)).toBe("claude-opus-4-7"); + expect(resolveModelId("anthropic", undefined)).toBe("claude-opus-4-8"); }); it("returns undefined for free-text providers with no baseline models", () => { @@ -102,7 +106,7 @@ describe("resolveModelId", () => { }); it("treats an empty string like undefined", () => { - expect(resolveModelId("anthropic", "")).toBe("claude-opus-4-7"); + expect(resolveModelId("anthropic", "")).toBe("claude-opus-4-8"); }); it("resolves gemini-pro alias", () => { @@ -123,9 +127,9 @@ describe("mergeLiveModels", () => { }); it("preserves baseline metadata when a live id matches", () => { - const opus = ANTHROPIC_CATALOG.models.find((m) => m.id === "claude-opus-4-7")!; - const merged = mergeLiveModels(ANTHROPIC_CATALOG, ["claude-opus-4-7"]); - const mergedOpus = merged.models.find((m) => m.id === "claude-opus-4-7")!; + const opus = ANTHROPIC_CATALOG.models.find((m) => m.id === "claude-opus-4-8")!; + const merged = mergeLiveModels(ANTHROPIC_CATALOG, ["claude-opus-4-8"]); + const mergedOpus = merged.models.find((m) => m.id === "claude-opus-4-8")!; expect(mergedOpus.label).toBe(opus.label); expect(mergedOpus.latest).toBe(true); expect(mergedOpus.source).toBe("baseline"); @@ -160,7 +164,7 @@ describe("groupModelsByFamily", () => { it("groups anthropic models by family", () => { const groups = groupModelsByFamily(ANTHROPIC_CATALOG); const families = groups.map((g) => g.family).sort(); - expect(families).toEqual(["haiku", "opus", "sonnet"]); + expect(families).toEqual(["fable", "haiku", "opus", "sonnet"]); }); it("falls back to the model id when there is no family", () => { diff --git a/packages/shared/src/agent-options/anthropic.ts b/packages/shared/src/agent-options/anthropic.ts index 74bfccbd..e130e13b 100644 --- a/packages/shared/src/agent-options/anthropic.ts +++ b/packages/shared/src/agent-options/anthropic.ts @@ -10,11 +10,17 @@ export const ANTHROPIC_CATALOG: ProviderCatalog = { label: "Claude Code", modelField: "claudeModel", models: [ + { + id: "claude-opus-4-8", + label: "Opus 4.8", + family: "opus", + latest: true, + source: "baseline", + }, { id: "claude-opus-4-7", label: "Opus 4.7", family: "opus", - latest: true, source: "baseline", }, { @@ -43,11 +49,18 @@ export const ANTHROPIC_CATALOG: ProviderCatalog = { latest: true, source: "baseline", }, + { + id: "claude-fable-5", + label: "Fable 5", + family: "fable", + source: "baseline", + }, ], aliases: { - opus: "claude-opus-4-7", + opus: "claude-opus-4-8", sonnet: "claude-sonnet-4-6", haiku: "claude-haiku-4-5-20251001", + fable: "claude-fable-5", }, options: [ {