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 @@ -114,10 +114,10 @@ Server configuration:
### Supported Providers

Model name prefixes determine routing:
- **OpenAI**: gpt-4.1, gpt-5, gpt-5-mini, gpt-5.2, o4-mini; image generation: gpt-image-2
- **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
- **xAI**: grok-2, grok-3, grok-3-mini, grok-4, grok-4-fast, grok-4-1-fast; image generation: grok-2-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
- **Z.ai** (Model API, OpenAI-compatible): glm-5.2; image generation: glm-image
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ The gateway solves this by running inside a hardware-isolated Nitro Enclave wher

| Provider | Models |
|----------|--------|
| OpenAI | gpt-4.1, gpt-5, gpt-5-mini, o4-mini |
| 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 |
| xAI | grok-4, grok-4-fast, grok-4-1-fast, grok-4-1-fast-non-reasoning |
| 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 |

## Quick Start
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ dependencies = [
"setuptools>=21.0.0",
"Flask>=3.0.0",
"gunicorn>=23.0.0",
"og-x402[evm]==0.0.2.dev7",
"og-x402[evm]==0.0.2.dev8",
"fastapi>=0.128.0",
"uvicorn[standard]>=0.40.0",
"pydantic>=2.12.5",
Expand Down
30 changes: 30 additions & 0 deletions tee_gateway/model_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,24 @@ class SupportedModel(Enum):
input_price_usd=Decimal("0.000005"),
output_price_usd=Decimal("0.00003"),
)
GPT_5_6_SOL = ModelConfig(
provider="openai",
api_name="gpt-5.6-sol",
input_price_usd=Decimal("0.000005"),
output_price_usd=Decimal("0.00003"),
)
GPT_5_6_TERRA = ModelConfig(
provider="openai",
api_name="gpt-5.6-terra",
input_price_usd=Decimal("0.0000025"),
output_price_usd=Decimal("0.000015"),
)
GPT_5_6_LUNA = ModelConfig(
provider="openai",
api_name="gpt-5.6-luna",
input_price_usd=Decimal("0.000001"),
output_price_usd=Decimal("0.000006"),
)
# Image generation via OpenAI's /images/generations endpoint (gpt-image).
# Unlike DALL·E, gpt-image models always return base64 (``b64_json``) and
# reject the ``response_format`` field, so it's omitted. Image-to-image
Expand Down Expand Up @@ -344,6 +362,12 @@ class SupportedModel(Enum):
)

# ── xAI Grok ────────────────────────────────────────────────────────
GROK_4_5 = ModelConfig(
provider="x-ai",
api_name="grok-4.5",
input_price_usd=Decimal("0.000002"),
output_price_usd=Decimal("0.000006"),
)
GROK_4_3 = ModelConfig(
provider="x-ai",
api_name="grok-4.3",
Expand Down Expand Up @@ -565,6 +589,10 @@ class SupportedModel(Enum):
"gpt-5.4-mini": SupportedModel.GPT_5_4_MINI,
"gpt-5.4-nano": SupportedModel.GPT_5_4_NANO,
"gpt-5.5": SupportedModel.GPT_5_5,
"gpt-5.6": SupportedModel.GPT_5_6_SOL,
"gpt-5.6-sol": SupportedModel.GPT_5_6_SOL,
"gpt-5.6-terra": SupportedModel.GPT_5_6_TERRA,
"gpt-5.6-luna": SupportedModel.GPT_5_6_LUNA,
"gpt-image-2": SupportedModel.GPT_IMAGE_2,
# Anthropic
"claude-sonnet-4-5": SupportedModel.CLAUDE_SONNET_4_5,
Expand All @@ -587,6 +615,8 @@ class SupportedModel(Enum):
"gemini-3.1-flash-image": SupportedModel.GEMINI_3_1_FLASH_IMAGE,
"gemini-3.5-flash": SupportedModel.GEMINI_3_5_FLASH,
# xAI
"grok-4.5": SupportedModel.GROK_4_5,
"grok-4.5-latest": SupportedModel.GROK_4_5,
"grok-4.3": SupportedModel.GROK_4_3,
"grok-4": SupportedModel.GROK_4,
"grok-4-fast": SupportedModel.GROK_4_FAST,
Expand Down
74 changes: 74 additions & 0 deletions tests/test_pricing.py
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,29 @@ def test_gpt_5_5_resolves(self):
self.assertEqual(cfg.input_price_usd, Decimal("0.000005"))
self.assertEqual(cfg.output_price_usd, Decimal("0.00003"))

def test_gpt_5_6_sol_resolves(self):
cfg = get_model_config("gpt-5.6-sol")
self.assertEqual(cfg.provider, "openai")
self.assertEqual(cfg.api_name, "gpt-5.6-sol")
self.assertEqual(cfg.input_price_usd, Decimal("0.000005"))
self.assertEqual(cfg.output_price_usd, Decimal("0.00003"))

def test_gpt_5_6_alias_resolves_to_sol(self):
cfg = get_model_config("gpt-5.6")
self.assertEqual(cfg, get_model_config("gpt-5.6-sol"))

def test_gpt_5_6_terra_resolves(self):
cfg = get_model_config("gpt-5.6-terra")
self.assertEqual(cfg.provider, "openai")
self.assertEqual(cfg.input_price_usd, Decimal("0.0000025"))
self.assertEqual(cfg.output_price_usd, Decimal("0.000015"))

def test_gpt_5_6_luna_resolves(self):
cfg = get_model_config("gpt-5.6-luna")
self.assertEqual(cfg.provider, "openai")
self.assertEqual(cfg.input_price_usd, Decimal("0.000001"))
self.assertEqual(cfg.output_price_usd, Decimal("0.000006"))

# ── Google ──────────────────────────────────────────────────────────────

def test_gemini_2_5_flash_resolves(self):
Expand Down Expand Up @@ -264,6 +287,17 @@ def test_gemini_3_1_flash_image_resolves(self):

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

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

def test_grok_4_5_latest_resolves(self):
cfg = get_model_config("grok-4.5-latest")
self.assertEqual(cfg, get_model_config("grok-4.5"))

def test_grok_4_resolves(self):
cfg = get_model_config("grok-4")
self.assertEqual(cfg.provider, "x-ai")
Expand Down Expand Up @@ -521,6 +555,33 @@ def test_gpt_5_5_cost(self):
# 1000*0.000005 + 500*0.00003 = 0.005 + 0.015 = 0.02 USD = 2e16 wei
self.assertEqual(cost, 20_000_000_000_000_000)

def test_gpt_5_6_sol_cost(self):
cost = self._calc("gpt-5.6-sol", 1000, 500)
expected = _expected_cost_opg("gpt-5.6-sol", 1000, 500)
self.assertEqual(cost, expected)
# 1000*0.000005 + 500*0.00003 = 0.005 + 0.015 = 0.02 USD = 2e16 wei
self.assertEqual(cost, 20_000_000_000_000_000)

def test_gpt_5_6_alias_cost(self):
self.assertEqual(
self._calc("gpt-5.6", 1000, 500),
self._calc("gpt-5.6-sol", 1000, 500),
)

def test_gpt_5_6_terra_cost(self):
cost = self._calc("gpt-5.6-terra", 1000, 500)
expected = _expected_cost_opg("gpt-5.6-terra", 1000, 500)
self.assertEqual(cost, expected)
# 1000*0.0000025 + 500*0.000015 = 0.0025 + 0.0075 = 0.01 USD = 1e16 wei
self.assertEqual(cost, 10_000_000_000_000_000)

def test_gpt_5_6_luna_cost(self):
cost = self._calc("gpt-5.6-luna", 1000, 500)
expected = _expected_cost_opg("gpt-5.6-luna", 1000, 500)
self.assertEqual(cost, expected)
# 1000*0.000001 + 500*0.000006 = 0.001 + 0.003 = 0.004 USD = 4e15 wei
self.assertEqual(cost, 4_000_000_000_000_000)

# ── Anthropic Sonnet ────────────────────────────────────────────────────

def test_claude_sonnet_4_5_cost(self):
Expand Down Expand Up @@ -605,6 +666,19 @@ def test_gemini_3_1_flash_lite_preview_cost(self):

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

def test_grok_4_5_cost(self):
cost = self._calc("grok-4.5", 1000, 500)
expected = _expected_cost_opg("grok-4.5", 1000, 500)
self.assertEqual(cost, expected)
# 1000*0.000002 + 500*0.000006 = 0.002 + 0.003 = 0.005 USD = 5e15 wei
self.assertEqual(cost, 5_000_000_000_000_000)

def test_grok_4_5_latest_cost(self):
self.assertEqual(
self._calc("grok-4.5-latest", 1000, 500),
self._calc("grok-4.5", 1000, 500),
)

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