diff --git a/packages/contracts/src/model.ts b/packages/contracts/src/model.ts index 7788eaace48..9d7d46e789a 100644 --- a/packages/contracts/src/model.ts +++ b/packages/contracts/src/model.ts @@ -166,6 +166,9 @@ export const MODEL_SLUG_ALIASES_BY_PROVIDER: Partial< "gpt-5.3-spark": "gpt-5.3-codex-spark", }, [CLAUDE_DRIVER_KIND]: { + fable: "claude-fable-5", + "fable-5": "claude-fable-5", + "claude-fable": "claude-fable-5", opus: "claude-opus-4-8", "opus-4.8": "claude-opus-4-8", "claude-opus-4.8": "claude-opus-4-8", diff --git a/packages/shared/src/model.test.ts b/packages/shared/src/model.test.ts index 00c01616005..2a08d5ec250 100644 --- a/packages/shared/src/model.test.ts +++ b/packages/shared/src/model.test.ts @@ -75,6 +75,8 @@ describe("normalizeModelSlug", () => { const claude = ProviderDriverKind.make("claudeAgent"); expect(normalizeModelSlug("gpt-5-codex")).toBe("gpt-5.4"); expect(normalizeModelSlug("5.3")).toBe("gpt-5.3-codex"); + expect(normalizeModelSlug("fable", claude)).toBe("claude-fable-5"); + expect(normalizeModelSlug("fable-5", claude)).toBe("claude-fable-5"); expect(normalizeModelSlug("sonnet", claude)).toBe("claude-sonnet-4-6"); }); @@ -110,6 +112,7 @@ describe("resolveSelectableModel", () => { it("resolves exact slugs, labels, and aliases", () => { const options = [ { slug: "gpt-5.3-codex", name: "GPT-5.3 Codex" }, + { slug: "claude-fable-5", name: "Claude Fable 5" }, { slug: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, ]; expect(resolveSelectableModel(ProviderDriverKind.make("codex"), "gpt-5.3-codex", options)).toBe( @@ -121,6 +124,9 @@ describe("resolveSelectableModel", () => { expect(resolveSelectableModel(ProviderDriverKind.make("claudeAgent"), "sonnet", options)).toBe( "claude-sonnet-4-6", ); + expect(resolveSelectableModel(ProviderDriverKind.make("claudeAgent"), "fable", options)).toBe( + "claude-fable-5", + ); }); });