From 8e75735b33483ef91d76054dc4751f244fde8686 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Thu, 27 Aug 2026 15:43:22 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=A4=96=20feat:=20promote=20Claude=20M?= =?UTF-8?q?ythos=205.1=20as=20the=20mythos=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pre-release prep, twin of the Fable 5.1 promotion on mike/fable-5-1-drop: flips MYTHOS to claude-mythos-5-1, retains the Mythos 5 metadata/tokenizer as a custom model string, and pins the Mythos-class wildcard behavior for the new id. DO NOT MERGE until Anthropic announces Mythos 5.1. --- docs/config/models.mdx | 2 +- src/common/constants/knownModels.ts | 12 ++++++----- src/common/utils/ai/modelDisplay.test.ts | 1 + src/common/utils/ai/models.test.ts | 6 +++++- src/common/utils/ai/models.ts | 1 + src/common/utils/ai/providerOptions.test.ts | 9 +++++++++ src/common/utils/thinking/policy.test.ts | 8 ++++++++ src/common/utils/tokens/models-extra.ts | 20 +++++++++++++++++++ src/common/utils/tools/tools.test.ts | 1 + .../builtInSkillContent.generated.ts | 2 +- 10 files changed, 54 insertions(+), 8 deletions(-) diff --git a/docs/config/models.mdx b/docs/config/models.mdx index 74e83ba887..d530845e2b 100644 --- a/docs/config/models.mdx +++ b/docs/config/models.mdx @@ -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` | | diff --git a/src/common/constants/knownModels.ts b/src/common/constants/knownModels.ts index 764c9d1d6a..96a7ded6ca 100644 --- a/src/common/constants/knownModels.ts +++ b/src/common/constants/knownModels.ts @@ -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. @@ -287,6 +288,7 @@ export const MODEL_ABBREVIATIONS: Record = Object.fromEntries( // lookup does not fall back to the generic per-provider tokenizer. const LEGACY_TOKENIZER_MODEL_OVERRIDES: Record = { "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", }; diff --git a/src/common/utils/ai/modelDisplay.test.ts b/src/common/utils/ai/modelDisplay.test.ts index 3ff9045c3d..5fa2deefad 100644 --- a/src/common/utils/ai/modelDisplay.test.ts +++ b/src/common/utils/ai/modelDisplay.test.ts @@ -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"); }); }); diff --git a/src/common/utils/ai/models.test.ts b/src/common/utils/ai/models.test.ts index 8abea904a5..8d773f6794 100644 --- a/src/common/utils/ai/models.test.ts +++ b/src/common/utils/ai/models.test.ts @@ -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", () => { diff --git a/src/common/utils/ai/models.ts b/src/common/utils/ai/models.ts index a58d7432b9..da8bb3036b 100644 --- a/src/common/utils/ai/models.ts +++ b/src/common/utils/ai/models.ts @@ -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"), diff --git a/src/common/utils/ai/providerOptions.test.ts b/src/common/utils/ai/providerOptions.test.ts index 2aff923f3a..71122689dc 100644 --- a/src/common/utils/ai/providerOptions.test.ts +++ b/src/common/utils/ai/providerOptions.test.ts @@ -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", () => { @@ -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" }, + }); }); }); diff --git a/src/common/utils/thinking/policy.test.ts b/src/common/utils/thinking/policy.test.ts index 779a598e5a..9e7e029675 100644 --- a/src/common/utils/thinking/policy.test.ts +++ b/src/common/utils/thinking/policy.test.ts @@ -457,6 +457,13 @@ 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", () => { @@ -464,6 +471,7 @@ describe("getThinkingPolicyForModel", () => { 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 forced-thinking models", () => { diff --git a/src/common/utils/tokens/models-extra.ts b/src/common/utils/tokens/models-extra.ts index f579cdc5e3..8da05ece63 100644 --- a/src/common/utils/tokens/models-extra.ts +++ b/src/common/utils/tokens/models-extra.ts @@ -178,6 +178,26 @@ export const modelsExtra: Record = { 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, diff --git a/src/common/utils/tools/tools.test.ts b/src/common/utils/tools/tools.test.ts index 98f281c733..28f24f2cd3 100644 --- a/src/common/utils/tools/tools.test.ts +++ b/src/common/utils/tools/tools.test.ts @@ -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], diff --git a/src/node/services/agentSkills/builtInSkillContent.generated.ts b/src/node/services/agentSkills/builtInSkillContent.generated.ts index 2d009f1ac0..651cbb77f4 100644 --- a/src/node/services/agentSkills/builtInSkillContent.generated.ts +++ b/src/node/services/agentSkills/builtInSkillContent.generated.ts @@ -3851,7 +3851,7 @@ export const BUILTIN_SKILL_FILES: Record> = { "| 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` | |", From 477e250cae4072b722e5e4b7051fadcbd7e40c7a Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Tue, 1 Sep 2026 19:06:51 +0000 Subject: [PATCH 2/2] fix: apply announced Fable/Mythos 5.1 cache-read pricing (0.025x input) Anthropic's whats-new page confirms both 5.1 ids, the 1M/128K envelope, adaptive-only thinking, and the tokenizer, but cache reads dropped to $0.25/M (0.025x input) versus the assumed 0.1x. Forced tool use (now a 400 on these models) was audited: Mux only forces toolChoice on xAI. --- src/common/constants/knownModels.ts | 16 +++++++++------- src/common/utils/tokens/models-extra.ts | 9 +++++---- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/common/constants/knownModels.ts b/src/common/constants/knownModels.ts index 96a7ded6ca..6ed64da764 100644 --- a/src/common/constants/knownModels.ts +++ b/src/common/constants/knownModels.ts @@ -28,9 +28,10 @@ interface KnownModel extends KnownModelDefinition { // of the community. const MODEL_DEFINITIONS = { // Claude Fable 5.1 - Mythos-class model (a tier above Opus), successor to Fable 5 - // (released June 9, 2026) as the generally-available safeguarded variant, at unchanged - // pricing ($10/M input, $50/M output). API id `claude-fable-5-1`; Fable 5 stays usable - // as the custom model string `anthropic:claude-fable-5`. + // (released June 9, 2026) as the generally-available safeguarded variant, at the same + // pricing ($10/M input, $50/M output) except cheaper cache reads (0.025x input). + // API id `claude-fable-5-1`; Fable 5 stays usable as the custom model string + // `anthropic:claude-fable-5`. FABLE: { provider: "anthropic", providerModelId: "claude-fable-5-1", @@ -43,10 +44,11 @@ const MODEL_DEFINITIONS = { tokenizerOverride: "anthropic/claude-opus-4.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`. + // as the restricted-access, safeguards-lifted twin of Fable 5.1, with identical specs + // and pricing ($10/M input, $50/M output, 0.025x-input cache reads) and unchanged + // availability (approved Project Glasswing customers only, 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: { diff --git a/src/common/utils/tokens/models-extra.ts b/src/common/utils/tokens/models-extra.ts index 8da05ece63..f2c8e39a74 100644 --- a/src/common/utils/tokens/models-extra.ts +++ b/src/common/utils/tokens/models-extra.ts @@ -178,9 +178,10 @@ export const modelsExtra: Record = { 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, + // Claude Mythos 5.1 - successor to Mythos 5, the restricted-access (Project + // Glasswing) twin of Fable 5.1 with identical announced specs and pricing: + // $10/M input, $50/M output, cache write 1.25x input, cache read 0.025x input + // ($0.25/M, down from Mythos 5's 0.1x), native 1M context, 128K max output, // native xhigh effort level. "claude-mythos-5-1": { max_input_tokens: 1000000, @@ -188,7 +189,7 @@ export const modelsExtra: Record = { 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) + cache_read_input_token_cost: 0.00000025, // $0.25 per million tokens (0.025× input) litellm_provider: "anthropic", mode: "chat", supports_function_calling: true,