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
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,8 @@ 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
- **Google**: 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-fast, grok-4-1-fast; image generation: grok-2-image
- **Google**: 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
- **Nous Research** (Nous Portal, OpenAI-compatible): hermes-4-405b, hermes-4-70b
- **Z.ai** (Model API, OpenAI-compatible): image generation: glm-image (glm-5.2 chat is routed through BytePlus ModelArk, see ByteDance above)
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ The gateway solves this by running inside a hardware-isolated Nitro Enclave wher
|----------|--------|
| 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 |
| Google | 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.5, grok-4.3, grok-4, grok-4-fast, grok-4-1-fast, grok-4-1-fast-non-reasoning |
| Google | 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 |

## Quick Start
Expand Down
15 changes: 15 additions & 0 deletions tee_gateway/model_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -392,8 +392,21 @@ class SupportedModel(Enum):
input_price_usd=Decimal("0.0000015"),
output_price_usd=Decimal("0.0000075"),
)
# Promotional standard pricing through December 31, 2026.
GEMINI_3_7_FLASH = ModelConfig(
provider="google",
api_name="gemini-3.7-flash",
input_price_usd=Decimal("0.00000075"),
output_price_usd=Decimal("0.00000375"),
)

# ── xAI Grok ────────────────────────────────────────────────────────
GROK_4_6 = ModelConfig(
provider="x-ai",
api_name="grok-4.6",
input_price_usd=Decimal("0.000002"),
output_price_usd=Decimal("0.000006"),
)
GROK_4_5 = ModelConfig(
provider="x-ai",
api_name="grok-4.5",
Expand Down Expand Up @@ -671,7 +684,9 @@ class SupportedModel(Enum):
"gemini-3.5-flash": SupportedModel.GEMINI_3_5_FLASH,
"gemini-3.5-flash-lite": SupportedModel.GEMINI_3_5_FLASH_LITE,
"gemini-3.6-flash": SupportedModel.GEMINI_3_6_FLASH,
"gemini-3.7-flash": SupportedModel.GEMINI_3_7_FLASH,
# xAI
"grok-4.6": SupportedModel.GROK_4_6,
"grok-4.5": SupportedModel.GROK_4_5,
"grok-4.5-latest": SupportedModel.GROK_4_5,
"grok-4.3": SupportedModel.GROK_4_3,
Expand Down
24 changes: 24 additions & 0 deletions tests/test_pricing.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,13 @@ def test_gemini_3_6_flash_resolves(self):
self.assertEqual(cfg.input_price_usd, Decimal("0.0000015"))
self.assertEqual(cfg.output_price_usd, Decimal("0.0000075"))

def test_gemini_3_7_flash_resolves(self):
cfg = get_model_config("gemini-3.7-flash")
self.assertEqual(cfg.provider, "google")
self.assertEqual(cfg.api_name, "gemini-3.7-flash")
self.assertEqual(cfg.input_price_usd, Decimal("0.00000075"))
self.assertEqual(cfg.output_price_usd, Decimal("0.00000375"))

def test_gemini_3_1_flash_image_resolves(self):
cfg = get_model_config("gemini-3.1-flash-image")
self.assertEqual(cfg.provider, "google")
Expand All @@ -301,6 +308,13 @@ def test_gemini_3_1_flash_image_resolves(self):

# ── xAI Grok ────────────────────────────────────────────────────────────

def test_grok_4_6_resolves(self):
cfg = get_model_config("grok-4.6")
self.assertEqual(cfg.provider, "x-ai")
self.assertEqual(cfg.api_name, "grok-4.6")
self.assertEqual(cfg.input_price_usd, Decimal("0.000002"))
self.assertEqual(cfg.output_price_usd, Decimal("0.000006"))

def test_grok_4_5_resolves(self):
cfg = get_model_config("grok-4.5")
self.assertEqual(cfg.provider, "x-ai")
Expand Down Expand Up @@ -713,8 +727,18 @@ def test_gemini_3_6_flash_cost(self):
self.assertEqual(cost, _expected_cost_opg("gemini-3.6-flash", 1000, 500))
self.assertEqual(cost, 5_250_000_000_000_000)

def test_gemini_3_7_flash_cost(self):
cost = self._calc("gemini-3.7-flash", 1000, 500)
self.assertEqual(cost, _expected_cost_opg("gemini-3.7-flash", 1000, 500))
self.assertEqual(cost, 2_625_000_000_000_000)

# ── xAI Grok ────────────────────────────────────────────────────────────

def test_grok_4_6_cost(self):
cost = self._calc("grok-4.6", 1000, 500)
self.assertEqual(cost, _expected_cost_opg("grok-4.6", 1000, 500))
self.assertEqual(cost, 5_000_000_000_000_000)

def test_grok_4_5_cost(self):
cost = self._calc("grok-4.5", 1000, 500)
expected = _expected_cost_opg("grok-4.5", 1000, 500)
Expand Down
Loading