From 35f9ba849eeacd4c313b0b29aa5b8e4adfe10448 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Thu, 27 Aug 2026 15:43:22 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20feat:=20promote=20Claude=20Mytho?= =?UTF-8?q?s=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 79f56e5387..5d9cfafbab 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 5a4a3f90c9..22ecc4da83 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. @@ -280,6 +281,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 f5e4cc5928..d16dfad57a 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 6fe8c7658b..1c0d2ac1d9 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 6c58576bf1..274483ab7f 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 Mythos-class only", () => { diff --git a/src/common/utils/tokens/models-extra.ts b/src/common/utils/tokens/models-extra.ts index 81beb9a31b..fd3008a1bf 100644 --- a/src/common/utils/tokens/models-extra.ts +++ b/src/common/utils/tokens/models-extra.ts @@ -177,6 +177,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 9148b88adf..9fb6dd3c53 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` | |",