diff --git a/CLAUDE.md b/CLAUDE.md index d184e01..05a5c6e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -121,7 +121,7 @@ Server configuration: Model name prefixes determine routing: - **OpenAI**: gpt-4.1, gpt-5, gpt-5-mini, gpt-5.2, gpt-5.6-sol/terra/luna, o4-mini; image generation: gpt-image-2 -- **Anthropic**: claude-sonnet-4-0/4-5/4-6, claude-sonnet-5, claude-haiku-4-5, claude-opus-4-5/4-6/4-7/4-8, claude-opus-5, claude-fable-5, claude-3-7-sonnet, claude-3-5-haiku +- **Anthropic**: claude-sonnet-4-0/4-5/4-6, claude-sonnet-5, claude-haiku-4-5, claude-opus-4-5/4-6/4-7/4-8, claude-opus-5, claude-fable-5, claude-fable-5-1, claude-3-7-sonnet, claude-3-5-haiku - **Google**: gemini-3.8-flash, gemini-3.7-flash, gemini-3.6-flash, gemini-3.5-flash-lite, gemini-2.5-flash, gemini-2.5-flash-lite, gemini-2.5-pro, gemini-3-pro-preview, gemini-3-flash-preview, gemini-3.1-pro-preview, gemini-3.5-flash; image generation: gemini-2.5-flash-image, gemini-3.1-flash-image - **xAI**: grok-2, grok-3, grok-3-mini, grok-4, grok-4.3, grok-4.5, grok-4.6, grok-4-fast, grok-4-1-fast; image generation: grok-2-image - **ByteDance** (BytePlus ModelArk, OpenAI-compatible, ap-southeast): seed-1.6, seed-1.8, seed-2.0-lite, deepseek-v4-flash, deepseek-v4-pro, glm-5.2 (Z.ai's model served via a ModelArk deployment endpoint); image generation: seedream-4.0, seedream-5.0-lite, seedance-4.5, seedance-5.0 diff --git a/README.md b/README.md index c0c00ff..ee4c2e4 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ The gateway solves this by running inside a hardware-isolated Nitro Enclave wher | Provider | Models | |----------|--------| | OpenAI | gpt-4.1, gpt-5, gpt-5-mini, gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, o4-mini | -| Anthropic | claude-sonnet-4-5, claude-sonnet-4-6, claude-haiku-4-5, claude-opus-4-5, claude-opus-4-6 | +| Anthropic | claude-fable-5-1, claude-sonnet-4-5, claude-sonnet-4-6, claude-haiku-4-5, claude-opus-4-5, claude-opus-4-6 | | Google | gemini-3.8-flash, gemini-3.7-flash, gemini-3.6-flash, gemini-3.5-flash-lite, gemini-2.5-flash, gemini-2.5-flash-lite, gemini-2.5-pro, gemini-3-pro-preview, gemini-3-flash-preview | | xAI | grok-4.6, grok-4.5, grok-4.3, grok-4, grok-4-fast, grok-4-1-fast, grok-4-1-fast-non-reasoning | | ByteDance | seed-1.6, seed-1.8, seed-2.0-lite, deepseek-v4-flash, deepseek-v4-pro | diff --git a/tee_gateway/model_registry.py b/tee_gateway/model_registry.py index 67121d5..1b69f76 100644 --- a/tee_gateway/model_registry.py +++ b/tee_gateway/model_registry.py @@ -313,6 +313,18 @@ class SupportedModel(Enum): output_price_usd=Decimal("0.00005"), supports_temperature=False, ) + # Claude Fable 5.1 — supersedes Fable 5 as Anthropic's most capable widely + # released model (GA 2026-09-01). Same sticker input/output pricing as + # Fable 5; the only pricing change is a 75%-cheaper cached-token read rate, + # which this registry doesn't model (base input/output only). Adaptive- + # thinking-only; like Opus 4.7+/Fable 5 it rejects `temperature` (HTTP 400). + CLAUDE_FABLE_5_1 = ModelConfig( + provider="anthropic", + api_name="claude-fable-5-1", + input_price_usd=Decimal("0.00001"), + output_price_usd=Decimal("0.00005"), + supports_temperature=False, + ) # ── Google Gemini ─────────────────────────────────────────────────── # Note: gemini-2.5-flash, gemini-2.5-pro, and gemini-2.5-flash-lite are scheduled @@ -681,6 +693,7 @@ class SupportedModel(Enum): "claude-opus-4-8": SupportedModel.CLAUDE_OPUS_4_8, "claude-opus-5": SupportedModel.CLAUDE_OPUS_5, "claude-fable-5": SupportedModel.CLAUDE_FABLE_5, + "claude-fable-5-1": SupportedModel.CLAUDE_FABLE_5_1, # Google "gemini-2.5-flash": SupportedModel.GEMINI_2_5_FLASH, "gemini-2.5-pro": SupportedModel.GEMINI_2_5_PRO, diff --git a/tests/test_pricing.py b/tests/test_pricing.py index 1a8a4d3..467a66f 100644 --- a/tests/test_pricing.py +++ b/tests/test_pricing.py @@ -145,6 +145,15 @@ def test_claude_fable_5_resolves(self): # Adaptive-thinking-only; rejects the `temperature` field (HTTP 400) self.assertFalse(cfg.supports_temperature) + def test_claude_fable_5_1_resolves(self): + cfg = get_model_config("claude-fable-5-1") + self.assertEqual(cfg.provider, "anthropic") + self.assertEqual(cfg.api_name, "claude-fable-5-1") + self.assertEqual(cfg.input_price_usd, Decimal("0.00001")) + self.assertEqual(cfg.output_price_usd, Decimal("0.00005")) + # Adaptive-thinking-only; rejects the `temperature` field (HTTP 400) + self.assertFalse(cfg.supports_temperature) + # ── OpenAI ────────────────────────────────────────────────────────────── def test_gpt_4_1_resolves(self): @@ -710,6 +719,13 @@ def test_claude_opus_5_cost(self): # Same price tier as opus-4-5/4-6/4-7/4-8: 1000*0.000005 + 500*0.000025 = 0.0175 USD self.assertEqual(cost, 17_500_000_000_000_000) + def test_claude_fable_5_1_cost(self): + cost = self._calc("claude-fable-5-1", 1000, 500) + expected = _expected_cost_opg("claude-fable-5-1", 1000, 500) + self.assertEqual(cost, expected) + # Same price tier as fable-5: 1000*0.00001 + 500*0.00005 = 0.035 USD + self.assertEqual(cost, 35_000_000_000_000_000) + # ── Google Gemini ──────────────────────────────────────────────────────── def test_gemini_2_5_flash_cost(self):