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
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,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-fable-5, claude-3-7-sonnet, claude-3-5-haiku
- **Google**: 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.1-flash-lite-preview, gemini-3.5-flash; image generation: gemini-2.5-flash-image, gemini-3.1-flash-image
- **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
- **ByteDance** (BytePlus ModelArk, OpenAI-compatible, ap-southeast): seed-1.6, seed-1.8, seed-2.0-lite, deepseek-v4-flash, deepseek-v4-pro; image generation: seedream-4.0, seedream-5.0-lite, seedance-4.5
- **Nous Research** (Nous Portal, OpenAI-compatible): hermes-4-405b, hermes-4-70b
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ 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-2.5-flash, gemini-2.5-flash-lite, gemini-2.5-pro, gemini-3-pro-preview, gemini-3-flash-preview |
| 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 |
| ByteDance | seed-1.6, seed-1.8, seed-2.0-lite, deepseek-v4-flash, deepseek-v4-pro |

Expand Down
22 changes: 14 additions & 8 deletions tee_gateway/model_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,13 +324,6 @@ class SupportedModel(Enum):
output_price_usd=Decimal("0.000012"),
thinking_budget=128,
)
GEMINI_3_1_FLASH_LITE_PREVIEW = ModelConfig(
provider="google",
api_name="gemini-3.1-flash-lite-preview",
input_price_usd=Decimal("0.00000025"),
output_price_usd=Decimal("0.0000015"),
thinking_budget=0,
)
# Native image generation ("nano banana"). Google bills output at two rates:
# text/thinking at $1.50/MTok and images at $30/MTok (~1290 tokens per
# 1024x1024 image ≈ $0.039/image); input (text/image) is $0.30/MTok.
Expand Down Expand Up @@ -360,6 +353,18 @@ class SupportedModel(Enum):
input_price_usd=Decimal("0.0000015"),
output_price_usd=Decimal("0.000009"),
)
GEMINI_3_5_FLASH_LITE = ModelConfig(
provider="google",
api_name="gemini-3.5-flash-lite",
input_price_usd=Decimal("0.0000003"),
output_price_usd=Decimal("0.0000025"),
)
GEMINI_3_6_FLASH = ModelConfig(
provider="google",
api_name="gemini-3.6-flash",
input_price_usd=Decimal("0.0000015"),
output_price_usd=Decimal("0.0000075"),
)

# ── xAI Grok ────────────────────────────────────────────────────────
GROK_4_5 = ModelConfig(
Expand Down Expand Up @@ -610,10 +615,11 @@ class SupportedModel(Enum):
"gemini-2.5-flash-lite": SupportedModel.GEMINI_2_5_FLASH_LITE,
"gemini-3-flash-preview": SupportedModel.GEMINI_3_FLASH_PREVIEW,
"gemini-3.1-pro-preview": SupportedModel.GEMINI_3_1_PRO_PREVIEW,
"gemini-3.1-flash-lite-preview": SupportedModel.GEMINI_3_1_FLASH_LITE_PREVIEW,
"gemini-2.5-flash-image": SupportedModel.GEMINI_2_5_FLASH_IMAGE,
"gemini-3.1-flash-image": SupportedModel.GEMINI_3_1_FLASH_IMAGE,
"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,
# xAI
"grok-4.5": SupportedModel.GROK_4_5,
"grok-4.5-latest": SupportedModel.GROK_4_5,
Expand Down
34 changes: 21 additions & 13 deletions tests/test_pricing.py
Original file line number Diff line number Diff line change
Expand Up @@ -262,19 +262,24 @@ def test_gemini_3_1_pro_preview_resolves(self):
self.assertEqual(cfg.output_price_usd, Decimal("0.000012"))
self.assertEqual(cfg.thinking_budget, 128)

def test_gemini_3_1_flash_lite_preview_resolves(self):
cfg = get_model_config("gemini-3.1-flash-lite-preview")
self.assertEqual(cfg.provider, "google")
self.assertEqual(cfg.input_price_usd, Decimal("0.00000025"))
self.assertEqual(cfg.output_price_usd, Decimal("0.0000015"))
self.assertEqual(cfg.thinking_budget, 0)

def test_gemini_3_5_flash_resolves(self):
cfg = get_model_config("gemini-3.5-flash")
self.assertEqual(cfg.provider, "google")
self.assertEqual(cfg.input_price_usd, Decimal("0.0000015"))
self.assertEqual(cfg.output_price_usd, Decimal("0.000009"))

def test_gemini_3_5_flash_lite_resolves(self):
cfg = get_model_config("gemini-3.5-flash-lite")
self.assertEqual(cfg.provider, "google")
self.assertEqual(cfg.input_price_usd, Decimal("0.0000003"))
self.assertEqual(cfg.output_price_usd, Decimal("0.0000025"))

def test_gemini_3_6_flash_resolves(self):
cfg = get_model_config("gemini-3.6-flash")
self.assertEqual(cfg.provider, "google")
self.assertEqual(cfg.input_price_usd, Decimal("0.0000015"))
self.assertEqual(cfg.output_price_usd, Decimal("0.0000075"))

def test_gemini_3_1_flash_image_resolves(self):
cfg = get_model_config("gemini-3.1-flash-image")
self.assertEqual(cfg.provider, "google")
Expand Down Expand Up @@ -657,12 +662,15 @@ def test_gemini_3_1_pro_preview_cost(self):
# 1000*0.000002 + 500*0.000012 = 0.002 + 0.006 = 0.008 USD = 8e15 wei
self.assertEqual(cost, 8_000_000_000_000_000)

def test_gemini_3_1_flash_lite_preview_cost(self):
cost = self._calc("gemini-3.1-flash-lite-preview", 1000, 500)
expected = _expected_cost_opg("gemini-3.1-flash-lite-preview", 1000, 500)
self.assertEqual(cost, expected)
# 1000*0.00000025 + 500*0.0000015 = 0.00025 + 0.00075 = 0.001 USD = 1e15 wei
self.assertEqual(cost, 1_000_000_000_000_000)
def test_gemini_3_5_flash_lite_cost(self):
cost = self._calc("gemini-3.5-flash-lite", 1000, 500)
self.assertEqual(cost, _expected_cost_opg("gemini-3.5-flash-lite", 1000, 500))
self.assertEqual(cost, 1_550_000_000_000_000)

def test_gemini_3_6_flash_cost(self):
cost = self._calc("gemini-3.6-flash", 1000, 500)
self.assertEqual(cost, _expected_cost_opg("gemini-3.6-flash", 1000, 500))
self.assertEqual(cost, 5_250_000_000_000_000)

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

Expand Down
Loading