fix: clean up OpenRouter-generated provider configs (#37)

- Merge unique models from duplicate providers into their hand-written
  counterparts and remove the duplicates:
  - alibaba (tongyi-deepresearch) → qwen
  - amazon (nova-2-lite, nova-micro, nova-premier) → bedrock
  - bytedance (ui-tars) → volcengine
  - nvidia (nemotron-3-nano, nemotron-3-super, etc.) → nvidia-nim
  - rekaai (reka-flash-3) → reka
- Set correct official API base_url for providers with public APIs:
  arcee-ai, inception, morph, reka, upstage
- Set key_required=false for 20 providers only accessible through
  hosting platforms (no public API)
- Update sync-pricing.py with SKIP_DUPLICATES, PROVIDER_API mapping,
  and default key_required=false for future auto-generated providers
This commit is contained in:
Evan authored and GitHub committed 2026-04-02 23:30:56 +08:00
1 parent 8104d86caa
commit 2fa48bfdcb
35 files changed
+162 -260

No files matched your search

+1 -1
View File
@@ -5,7 +5,7 @@ id = "aion-labs"
display_name = "Aion Labs"
api_key_env = "AION_LABS_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "aion-1.0"
-18
View File
@@ -1,18 +0,0 @@
# alibaba — auto-generated from OpenRouter API
[provider]
id = "alibaba"
display_name = "Alibaba"
api_key_env = "ALIBABA_API_KEY"
base_url = ""
key_required = true
[[models]]
id = "tongyi-deepresearch-30b-a3b"
display_name = "Tongyi DeepResearch 30B A3B"
tier = "fast"
context_window = 131072
max_output_tokens = 131072
input_cost_per_m = 0.09
output_cost_per_m = 0.45
supports_streaming = true
+1 -1
View File
@@ -5,7 +5,7 @@ id = "allenai"
display_name = "Allenai"
api_key_env = "ALLENAI_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "olmo-2-0325-32b-instruct"
-58
View File
@@ -1,58 +0,0 @@
# amazon — auto-generated from OpenRouter API
[provider]
id = "amazon"
display_name = "Amazon"
api_key_env = "AMAZON_API_KEY"
base_url = ""
key_required = true
[[models]]
id = "nova-2-lite-v1"
display_name = "Amazon: Nova 2 Lite"
tier = "fast"
context_window = 1000000
max_output_tokens = 65535
input_cost_per_m = 0.3
output_cost_per_m = 2.5
supports_streaming = true
[[models]]
id = "nova-lite-v1"
display_name = "Amazon: Nova Lite 1.0"
tier = "fast"
context_window = 300000
max_output_tokens = 5120
input_cost_per_m = 0.06
output_cost_per_m = 0.24
supports_streaming = true
[[models]]
id = "nova-micro-v1"
display_name = "Amazon: Nova Micro 1.0"
tier = "fast"
context_window = 128000
max_output_tokens = 5120
input_cost_per_m = 0.035
output_cost_per_m = 0.14
supports_streaming = true
[[models]]
id = "nova-premier-v1"
display_name = "Amazon: Nova Premier 1.0"
tier = "smart"
context_window = 1000000
max_output_tokens = 32000
input_cost_per_m = 2.5
output_cost_per_m = 12.5
supports_streaming = true
[[models]]
id = "nova-pro-v1"
display_name = "Amazon: Nova Pro 1.0"
tier = "smart"
context_window = 300000
max_output_tokens = 5120
input_cost_per_m = 0.8
output_cost_per_m = 3.2
supports_streaming = true
+2 -2
View File
@@ -3,8 +3,8 @@
[provider]
id = "arcee-ai"
display_name = "Arcee Ai"
api_key_env = "ARCEE_AI_API_KEY"
base_url = ""
api_key_env = "ARCEE_API_KEY"
base_url = "https://api.arcee.ai/v1"
key_required = true
[[models]]
+30
View File
@@ -111,3 +111,33 @@ supports_tools = true
supports_vision = false
supports_streaming = true
aliases = []
[[models]]
id = "bedrock/amazon.nova-2-lite-v1:0"
display_name = "Amazon: Nova 2 Lite"
tier = "fast"
context_window = 1000000
max_output_tokens = 65535
input_cost_per_m = 0.3
output_cost_per_m = 2.5
supports_streaming = true
[[models]]
id = "bedrock/amazon.nova-micro-v1:0"
display_name = "Amazon: Nova Micro 1.0"
tier = "fast"
context_window = 128000
max_output_tokens = 5120
input_cost_per_m = 0.035
output_cost_per_m = 0.14
supports_streaming = true
[[models]]
id = "bedrock/amazon.nova-premier-v1:0"
display_name = "Amazon: Nova Premier 1.0"
tier = "frontier"
context_window = 1000000
max_output_tokens = 65535
input_cost_per_m = 2.5
output_cost_per_m = 12.5
supports_streaming = true
-18
View File
@@ -1,18 +0,0 @@
# bytedance — auto-generated from OpenRouter API
[provider]
id = "bytedance"
display_name = "Bytedance"
api_key_env = "BYTEDANCE_API_KEY"
base_url = ""
key_required = true
[[models]]
id = "ui-tars-1.5-7b"
display_name = "ByteDance: UI-TARS 7B "
tier = "fast"
context_window = 128000
max_output_tokens = 2048
input_cost_per_m = 0.1
output_cost_per_m = 0.2
supports_streaming = true
+1 -1
View File
@@ -5,7 +5,7 @@ id = "deepcogito"
display_name = "Deepcogito"
api_key_env = "DEEPCOGITO_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "cogito-v2.1-671b"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "eleutherai"
display_name = "Eleutherai"
api_key_env = "ELEUTHERAI_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "llemma_7b"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "essentialai"
display_name = "Essentialai"
api_key_env = "ESSENTIALAI_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "rnj-1-instruct"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "ibm-granite"
display_name = "Ibm Granite"
api_key_env = "IBM_GRANITE_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "granite-4.0-h-micro"
+1 -1
View File
@@ -4,7 +4,7 @@
id = "inception"
display_name = "Inception"
api_key_env = "INCEPTION_API_KEY"
base_url = ""
base_url = "https://api.inceptionlabs.ai/v1"
key_required = true
[[models]]
+1 -1
View File
@@ -5,7 +5,7 @@ id = "inflection"
display_name = "Inflection"
api_key_env = "INFLECTION_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "inflection-3-pi"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "kwaipilot"
display_name = "Kwaipilot"
api_key_env = "KWAIPILOT_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "kat-coder-pro"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "liquid"
display_name = "Liquid"
api_key_env = "LIQUID_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "lfm-2-24b-a2b"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "meituan"
display_name = "Meituan"
api_key_env = "MEITUAN_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "longcat-flash-chat"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "meta-llama"
display_name = "Meta Llama"
api_key_env = "META_LLAMA_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "llama-3-70b-instruct"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "microsoft"
display_name = "Microsoft"
api_key_env = "MICROSOFT_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "phi-4"
+1 -1
View File
@@ -4,7 +4,7 @@
id = "morph"
display_name = "Morph"
api_key_env = "MORPH_API_KEY"
base_url = ""
base_url = "https://api.morphlabs.io/v1"
key_required = true
[[models]]
+1 -1
View File
@@ -5,7 +5,7 @@ id = "nex-agi"
display_name = "Nex Agi"
api_key_env = "NEX_AGI_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "deepseek-v3.1-nex-n1"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "nousresearch"
display_name = "Nousresearch"
api_key_env = "NOUSRESEARCH_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "hermes-2-pro-llama-3-8b"
+41
View File
@@ -307,3 +307,44 @@ supports_tools = true
supports_vision = false
supports_streaming = true
aliases = ["phi-4-mini"]
[[models]]
id = "nvidia/nemotron-3-nano-30b-a3b"
display_name = "Nvidia: Nemotron 3 Nano 30B"
tier = "fast"
context_window = 131072
max_output_tokens = 32768
input_cost_per_m = 0.0
output_cost_per_m = 0.0
supports_streaming = true
[[models]]
id = "nvidia/nemotron-3-super-120b-a12b"
display_name = "Nvidia: Nemotron 3 Super 120B"
tier = "smart"
context_window = 131072
max_output_tokens = 32768
input_cost_per_m = 0.0
output_cost_per_m = 0.0
supports_streaming = true
[[models]]
id = "nvidia/nemotron-nano-12b-v2-vl"
display_name = "Nvidia: Nemotron Nano 12B V2 VL"
tier = "fast"
context_window = 131072
max_output_tokens = 32768
input_cost_per_m = 0.0
output_cost_per_m = 0.0
supports_vision = true
supports_streaming = true
[[models]]
id = "nvidia/nemotron-nano-9b-v2"
display_name = "Nvidia: Nemotron Nano 9B V2"
tier = "fast"
context_window = 131072
max_output_tokens = 32768
input_cost_per_m = 0.0
output_cost_per_m = 0.0
supports_streaming = true
-118
View File
@@ -1,118 +0,0 @@
# nvidia — auto-generated from OpenRouter API
[provider]
id = "nvidia"
display_name = "Nvidia"
api_key_env = "NVIDIA_API_KEY"
base_url = ""
key_required = true
[[models]]
id = "llama-3.1-nemotron-70b-instruct"
display_name = "NVIDIA: Llama 3.1 Nemotron 70B Instruct"
tier = "smart"
context_window = 131072
max_output_tokens = 16384
input_cost_per_m = 1.2
output_cost_per_m = 1.2
supports_streaming = true
[[models]]
id = "llama-3.1-nemotron-ultra-253b-v1"
display_name = "NVIDIA: Llama 3.1 Nemotron Ultra 253B v1"
tier = "smart"
context_window = 131072
max_output_tokens = 16384
input_cost_per_m = 0.6
output_cost_per_m = 1.8
supports_streaming = true
[[models]]
id = "llama-3.3-nemotron-super-49b-v1.5"
display_name = "NVIDIA: Llama 3.3 Nemotron Super 49B V1.5"
tier = "fast"
context_window = 131072
max_output_tokens = 16384
input_cost_per_m = 0.1
output_cost_per_m = 0.4
supports_streaming = true
[[models]]
id = "nemotron-3-nano-30b-a3b"
display_name = "NVIDIA: Nemotron 3 Nano 30B A3B"
tier = "fast"
context_window = 262144
max_output_tokens = 16384
input_cost_per_m = 0.05
output_cost_per_m = 0.2
supports_streaming = true
[[models]]
id = "nemotron-3-nano-30b-a3b:free"
display_name = "NVIDIA: Nemotron 3 Nano 30B A3B (free)"
tier = "fast"
context_window = 256000
max_output_tokens = 16384
input_cost_per_m = 0.0
output_cost_per_m = 0.0
supports_streaming = true
[[models]]
id = "nemotron-3-super-120b-a12b"
display_name = "NVIDIA: Nemotron 3 Super"
tier = "fast"
context_window = 262144
max_output_tokens = 16384
input_cost_per_m = 0.1
output_cost_per_m = 0.5
supports_streaming = true
[[models]]
id = "nemotron-3-super-120b-a12b:free"
display_name = "NVIDIA: Nemotron 3 Super (free)"
tier = "fast"
context_window = 262144
max_output_tokens = 262144
input_cost_per_m = 0.0
output_cost_per_m = 0.0
supports_streaming = true
[[models]]
id = "nemotron-nano-12b-v2-vl"
display_name = "NVIDIA: Nemotron Nano 12B 2 VL"
tier = "fast"
context_window = 131072
max_output_tokens = 16384
input_cost_per_m = 0.2
output_cost_per_m = 0.6
supports_streaming = true
[[models]]
id = "nemotron-nano-12b-v2-vl:free"
display_name = "NVIDIA: Nemotron Nano 12B 2 VL (free)"
tier = "fast"
context_window = 128000
max_output_tokens = 128000
input_cost_per_m = 0.0
output_cost_per_m = 0.0
supports_streaming = true
[[models]]
id = "nemotron-nano-9b-v2"
display_name = "NVIDIA: Nemotron Nano 9B V2"
tier = "fast"
context_window = 131072
max_output_tokens = 16384
input_cost_per_m = 0.04
output_cost_per_m = 0.16
supports_streaming = true
[[models]]
id = "nemotron-nano-9b-v2:free"
display_name = "NVIDIA: Nemotron Nano 9B V2 (free)"
tier = "fast"
context_window = 128000
max_output_tokens = 16384
input_cost_per_m = 0.0
output_cost_per_m = 0.0
supports_streaming = true
+1 -1
View File
@@ -5,7 +5,7 @@ id = "prime-intellect"
display_name = "Prime Intellect"
api_key_env = "PRIME_INTELLECT_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "intellect-3"
+10
View File
@@ -157,3 +157,13 @@ supports_tools = false
supports_vision = true
supports_streaming = true
aliases = []
[[models]]
id = "tongyi-deepresearch-30b-a3b"
display_name = "Tongyi DeepResearch 30B A3B"
tier = "fast"
context_window = 131072
max_output_tokens = 131072
input_cost_per_m = 0.09
output_cost_per_m = 0.45
supports_streaming = true
+11 -1
View File
@@ -4,7 +4,7 @@
id = "reka"
display_name = "Reka"
api_key_env = "REKA_API_KEY"
base_url = ""
base_url = "https://api.reka.ai/v1"
key_required = true
[[models]]
@@ -16,3 +16,13 @@ max_output_tokens = 16384
input_cost_per_m = 0.1
output_cost_per_m = 0.1
supports_streaming = true
[[models]]
id = "reka-flash-3"
display_name = "Reka: Flash 3"
tier = "fast"
context_window = 131072
max_output_tokens = 32768
input_cost_per_m = 0.15
output_cost_per_m = 0.6
supports_streaming = true
-18
View File
@@ -1,18 +0,0 @@
# rekaai — auto-generated from OpenRouter API
[provider]
id = "rekaai"
display_name = "Rekaai"
api_key_env = "REKAAI_API_KEY"
base_url = ""
key_required = true
[[models]]
id = "reka-flash-3"
display_name = "Reka: Flash 3"
tier = "fast"
context_window = 65536
max_output_tokens = 65536
input_cost_per_m = 0.1
output_cost_per_m = 0.2
supports_streaming = true
+1 -1
View File
@@ -5,7 +5,7 @@ id = "relace"
display_name = "Relace"
api_key_env = "RELACE_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "relace-apply-3"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "switchpoint"
display_name = "Switchpoint"
api_key_env = "SWITCHPOINT_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "router"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "tencent"
display_name = "Tencent"
api_key_env = "TENCENT_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "hunyuan-a13b-instruct"
+1 -1
View File
@@ -5,7 +5,7 @@ id = "tngtech"
display_name = "Tngtech"
api_key_env = "TNGTECH_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "deepseek-r1t2-chimera"
+1 -1
View File
@@ -4,7 +4,7 @@
id = "upstage"
display_name = "Upstage"
api_key_env = "UPSTAGE_API_KEY"
base_url = ""
base_url = "https://api.upstage.ai/v1"
key_required = true
[[models]]
+10
View File
@@ -98,3 +98,13 @@ supports_tools = true
supports_vision = true
supports_streaming = true
aliases = ["doubao-vision"]
[[models]]
id = "ui-tars-1.5-7b"
display_name = "ByteDance: UI-TARS 7B"
tier = "fast"
context_window = 128000
max_output_tokens = 2048
input_cost_per_m = 0.1
output_cost_per_m = 0.2
supports_streaming = true
+1 -1
View File
@@ -5,7 +5,7 @@ id = "xiaomi"
display_name = "Xiaomi"
api_key_env = "XIAOMI_API_KEY"
base_url = ""
key_required = true
key_required = false
[[models]]
id = "mimo-v2-flash"
+35 -4
View File
@@ -36,6 +36,27 @@ SKIP_PROVIDERS = {
"anthracite-org", "alpindale", "alfredpros", "mancer",
}
# Skip creating NEW provider files for these — they overlap with hand-written
# providers but may contain unique models, so existing files are kept.
SKIP_DUPLICATES = {
"alibaba", # overlaps with qwen.toml but has unique models
"amazon", # overlaps with bedrock.toml but has unique models
"bytedance", # overlaps with volcengine.toml but has unique models
"nvidia", # overlaps with nvidia-nim.toml but has unique models
"rekaai", # overlaps with reka.toml but has unique models
}
# Providers with known public APIs — set their official base_url + api_key_env.
# Providers NOT in this map are OpenRouter-only and get key_required = false.
PROVIDER_API = {
"arcee-ai": ("https://api.arcee.ai/v1", "ARCEE_API_KEY"),
"inception": ("https://api.inceptionlabs.ai/v1", "INCEPTION_API_KEY"),
"morph": ("https://api.morphlabs.io/v1", "MORPH_API_KEY"),
"nvidia": ("https://integrate.api.nvidia.com/v1", "NVIDIA_API_KEY"),
"reka": ("https://api.reka.ai/v1", "REKA_API_KEY"),
"upstage": ("https://api.upstage.ai/v1", "UPSTAGE_API_KEY"),
}
def fetch_openrouter_models():
"""Fetch all models from OpenRouter."""
@@ -119,8 +140,18 @@ def generate_provider_toml(provider_id, models, dry_run=False):
if toml_path.exists():
return 0
# Derive api_key_env from provider name: FOO_BAR -> FOO_BAR_API_KEY
env_key = our_name.upper().replace("-", "_") + "_API_KEY"
if our_name in SKIP_DUPLICATES:
return 0
# Check if provider has a known public API
if our_name in PROVIDER_API:
base_url, env_key = PROVIDER_API[our_name]
key_required = "true"
else:
# No known public API — only accessible via OpenRouter/hosting providers
env_key = our_name.upper().replace("-", "_") + "_API_KEY"
base_url = ""
key_required = "false"
lines = [
f'# {provider_id} — auto-generated from OpenRouter API',
@@ -129,8 +160,8 @@ def generate_provider_toml(provider_id, models, dry_run=False):
f'id = "{our_name}"',
f'display_name = "{provider_id.replace("-", " ").title()}"',
f'api_key_env = "{env_key}"',
f'base_url = ""',
f"key_required = true",
f'base_url = "{base_url}"',
f"key_required = {key_required}",
f"",
]