Skip to content
Open
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
2 changes: 1 addition & 1 deletion docs/config/models.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Xum ships with curated models kept up to date with the frontier. Use any custom
| Model | ID | Aliases | Default |
| ---------------------- | ----------------------------- | ------------------------------------------------------------ | ------- |
| Fable 5.1 | anthropic:claude-fable-5-1 | `fable` | |
| Mythos 5 | anthropic:claude-mythos-5 | `mythos` | |
| Mythos 5.1 | anthropic:claude-mythos-5-1 | `mythos` | |
| Opus 5 | anthropic:claude-opus-5 | `opus` | βœ“ |
| Sonnet 5 | anthropic:claude-sonnet-5 | `sonnet` | |
| Haiku 4.5 | anthropic:claude-haiku-4-5 | `haiku` | |
Expand Down
12 changes: 7 additions & 5 deletions src/common/constants/knownModels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,16 @@ const MODEL_DEFINITIONS = {
// same text, so real usage can run ~1.0-1.3x higher than this estimate.
tokenizerOverride: "anthropic/claude-opus-4.5",
},
// Claude Mythos 5 - released June 9, 2026 alongside Fable 5. Same underlying model,
// specs, and pricing as Fable 5 ($10/M input, $50/M output) but with safeguards lifted
// in some areas. Limited availability: restricted to approved Project Glasswing /
// trusted-access customers (no self-serve sign-up). API id `claude-mythos-5`.
// Claude Mythos 5.1 - successor to Mythos 5 (released June 9, 2026 alongside Fable 5)
// as the restricted-access, safeguards-lifted twin of Fable 5.1, assumed at unchanged
// pricing ($10/M input, $50/M output) and availability (approved Project Glasswing /
// trusted-access customers, no self-serve sign-up). API id `claude-mythos-5-1`;
// Mythos 5 stays usable as the custom model string `anthropic:claude-mythos-5`.
// Not warmed: most users cannot access it, and its tokenizer override is already
// warmed via FABLE.
MYTHOS: {
provider: "anthropic",
providerModelId: "claude-mythos-5",
providerModelId: "claude-mythos-5-1",
aliases: ["mythos"],
// Same tokenizer situation as Fable 5 (see FABLE above): reuse Opus 4.5 for
// approximate counting; real usage can run ~1.0-1.3x higher.
Expand Down Expand Up @@ -280,6 +281,7 @@ export const MODEL_ABBREVIATIONS: Record<string, string> = Object.fromEntries(
// lookup does not fall back to the generic per-provider tokenizer.
const LEGACY_TOKENIZER_MODEL_OVERRIDES: Record<string, string> = {
"anthropic:claude-fable-5": "anthropic/claude-opus-4.5",
"anthropic:claude-mythos-5": "anthropic/claude-opus-4.5",
"anthropic:claude-opus-4-8": "anthropic/claude-opus-4.5",
};

Expand Down
1 change: 1 addition & 0 deletions src/common/utils/ai/modelDisplay.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ describe("formatModelDisplayName", () => {
expect(formatModelDisplayName("claude-fable-5")).toBe("Fable 5");
expect(formatModelDisplayName("claude-fable-5-1")).toBe("Fable 5.1");
expect(formatModelDisplayName("claude-mythos-5")).toBe("Mythos 5");
expect(formatModelDisplayName("claude-mythos-5-1")).toBe("Mythos 5.1");
});
});

Expand Down
6 changes: 5 additions & 1 deletion src/common/utils/ai/models.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,14 +167,18 @@ describe("Anthropic 1M context classification", () => {
expect(hasNative1MContext("anthropic:claude-sonnet-5")).toBe(true);
});

it("treats Mythos-class Fable 5 / Fable 5.1 / Mythos 5 as native 1M models", () => {
it("treats Mythos-class Fable 5 / Fable 5.1 / Mythos 5 / Mythos 5.1 as native 1M models", () => {
expect(getAnthropic1MContextMode("anthropic:claude-fable-5")).toBe("native");
expect(getAnthropic1MContextMode("anthropic:claude-fable-5-1")).toBe("native");
expect(getAnthropic1MContextMode("anthropic:claude-mythos-5")).toBe("native");
expect(getAnthropic1MContextMode("anthropic:claude-mythos-5-1")).toBe("native");
expect(getAnthropic1MContextMode("mux-gateway:anthropic/claude-fable-5-1")).toBe("native");
expect(getAnthropic1MContextMode("mux-gateway:anthropic/claude-mythos-5-1")).toBe("native");
expect(hasNative1MContext("anthropic:claude-fable-5")).toBe(true);
expect(hasNative1MContext("anthropic:claude-fable-5-1")).toBe(true);
expect(hasNative1MContext("anthropic:claude-mythos-5-1")).toBe(true);
expect(supports1MContext("anthropic:claude-fable-5-1")).toBe(false);
expect(supports1MContext("anthropic:claude-mythos-5-1")).toBe(false);
});

it("returns none for models without Anthropic 1M support", () => {
Expand Down
1 change: 1 addition & 0 deletions src/common/utils/ai/models.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ const ANTHROPIC_NATIVE_1M_PATTERNS = [
new RegExp(`^claude-fable-5${OPTIONAL_VERSION_SUFFIX}$`, "i"),
new RegExp(`^claude-fable-5-1${OPTIONAL_VERSION_SUFFIX}$`, "i"),
new RegExp(`^claude-mythos-5${OPTIONAL_VERSION_SUFFIX}$`, "i"),
new RegExp(`^claude-mythos-5-1${OPTIONAL_VERSION_SUFFIX}$`, "i"),
new RegExp(`^claude-opus-5${OPTIONAL_VERSION_SUFFIX}$`, "i"),
new RegExp(`^claude-opus-4-8${OPTIONAL_VERSION_SUFFIX}$`, "i"),
new RegExp(`^claude-opus-4-7${OPTIONAL_VERSION_SUFFIX}$`, "i"),
Expand Down
9 changes: 9 additions & 0 deletions src/common/utils/ai/providerOptions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,12 @@ describe("buildProviderOptions - Anthropic", () => {
);
expect(anthropic51.thinking).toEqual({ type: "adaptive", display: "summarized" });
expect(anthropic51.effort).toBe("medium");
// Mythos 5.1 does too.
const mythos51 = anthropicProviderOptions(
buildProviderOptions("anthropic:claude-mythos-5-1", "medium")
);
expect(mythos51.thinking).toEqual({ type: "adaptive", display: "summarized" });
expect(mythos51.effort).toBe("medium");
});

test("omits thinking instead of sending disabled when off", () => {
Expand All @@ -198,6 +204,9 @@ describe("buildProviderOptions - Anthropic", () => {
expect(buildProviderOptions("anthropic:claude-fable-5-1", "off")).toEqual({
anthropic: { ...baseAnthropicOptions, effort: "low" },
});
expect(buildProviderOptions("anthropic:claude-mythos-5-1", "off")).toEqual({
anthropic: { ...baseAnthropicOptions, effort: "low" },
});
});
});

Expand Down
8 changes: 8 additions & 0 deletions src/common/utils/thinking/policy.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -457,13 +457,21 @@ describe("getThinkingPolicyForModel", () => {
"xhigh",
"max",
]);
expect(getThinkingPolicyForModel("anthropic:claude-mythos-5-1")).toEqual([
"low",
"medium",
"high",
"xhigh",
"max",
]);
});

test("clamps 'off' up to 'low' for Mythos-class models", () => {
// A stored/legacy "off" selection must not reach the wire as disabled thinking.
expect(enforceThinkingPolicy("anthropic:claude-fable-5", "off")).toBe("low");
expect(enforceThinkingPolicy("anthropic:claude-fable-5-1", "off")).toBe("low");
expect(enforceThinkingPolicy("anthropic:claude-mythos-5", "off")).toBe("low");
expect(enforceThinkingPolicy("anthropic:claude-mythos-5-1", "off")).toBe("low");
});

test("resolveEffectiveThinkingLevel clamps unset/off for Mythos-class only", () => {
Expand Down
20 changes: 20 additions & 0 deletions src/common/utils/tokens/models-extra.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,26 @@ export const modelsExtra: Record<string, ModelData> = {
supports_response_schema: true,
},

// Claude Mythos 5.1 - successor to Mythos 5, the restricted-access twin of
// Fable 5.1, assumed at the same pricing/shape: $10/M input, $50/M output, cache
// write 1.25x input / cache read 0.1x input, native 1M context, 128K max output,
// native xhigh effort level.
"claude-mythos-5-1": {
max_input_tokens: 1000000,
max_output_tokens: 128000,
input_cost_per_token: 0.00001, // $10 per million input tokens
output_cost_per_token: 0.00005, // $50 per million output tokens
cache_creation_input_token_cost: 0.0000125, // $12.50 per million tokens (1.25Γ— input)
cache_read_input_token_cost: 0.000001, // $1.00 per million tokens (0.1Γ— input)
litellm_provider: "anthropic",
mode: "chat",
supports_function_calling: true,
supports_vision: true,
supports_pdf_input: true,
supports_reasoning: true,
supports_response_schema: true,
},

// Same underlying model as Fable 5 (identical pricing/shape); restricted access.
"claude-mythos-5": {
max_input_tokens: 1000000,
Expand Down
1 change: 1 addition & 0 deletions src/common/utils/tools/tools.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ describe("supportsAnthropicNativeWebFetch", () => {
["claude-mythos-5", true],
// Two-segment IDs at/after the 4.6 cutoff.
["claude-fable-5-1", true],
["claude-mythos-5-1", true],
["claude-sonnet-4-6", true],
["claude-opus-4-6", true],
["claude-opus-4-8", true],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3851,7 +3851,7 @@ export const BUILTIN_SKILL_FILES: Record<string, Record<string, string>> = {
"| Model | ID | Aliases | Default |",
"| ---------------------- | ----------------------------- | ------------------------------------------------------------ | ------- |",
"| Fable 5.1 | anthropic:claude-fable-5-1 | `fable` | |",
"| Mythos 5 | anthropic:claude-mythos-5 | `mythos` | |",
"| Mythos 5.1 | anthropic:claude-mythos-5-1 | `mythos` | |",
"| Opus 5 | anthropic:claude-opus-5 | `opus` | βœ“ |",
"| Sonnet 5 | anthropic:claude-sonnet-5 | `sonnet` | |",
"| Haiku 4.5 | anthropic:claude-haiku-4-5 | `haiku` | |",
Expand Down
Loading