Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions packages/shared/src/agent-options/agent-options.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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", () => {
Expand All @@ -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");
});
Expand All @@ -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", () => {
Expand All @@ -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", () => {
Expand All @@ -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");
Expand Down Expand Up @@ -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", () => {
Expand Down
17 changes: 15 additions & 2 deletions packages/shared/src/agent-options/anthropic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
},
{
Expand Down Expand Up @@ -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: [
{
Expand Down
Loading