model-metadata-central 0.2.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- model_metadata_central/__init__.py +115 -0
- model_metadata_central/_registry.py +22 -0
- model_metadata_central/generated/__init__.py +4 -0
- model_metadata_central/generated/models.py +44 -0
- model_metadata_central/lib.py +58 -0
- model_metadata_central/providers.json +189 -0
- model_metadata_central/registry.json +2111 -0
- model_metadata_central/tests/__init__.py +0 -0
- model_metadata_central/tests/schema_test.py +19 -0
- model_metadata_central/tests/utils_test.py +68 -0
- model_metadata_central/utils/__init__.py +0 -0
- model_metadata_central/utils/exceptions.py +6 -0
- model_metadata_central/utils/get_metadata_models.py +6 -0
- model_metadata_central/utils/get_provider_ids.py +6 -0
- model_metadata_central/utils/load_metadata.py +6 -0
- model_metadata_central/utils/load_provider.py +6 -0
- model_metadata_central-0.2.0.dist-info/METADATA +109 -0
- model_metadata_central-0.2.0.dist-info/RECORD +19 -0
- model_metadata_central-0.2.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from model_metadata_central.lib import (
|
|
2
|
+
get_all_models,
|
|
3
|
+
get_metadata,
|
|
4
|
+
get_model,
|
|
5
|
+
get_model_on_provider,
|
|
6
|
+
get_models,
|
|
7
|
+
get_models_by_provider,
|
|
8
|
+
)
|
|
9
|
+
from model_metadata_central.utils.exceptions import ModelMetadataNotFoundError
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"get_model",
|
|
13
|
+
"get_all_models",
|
|
14
|
+
"get_models",
|
|
15
|
+
"get_models_by_provider",
|
|
16
|
+
"get_model_on_provider",
|
|
17
|
+
"get_metadata",
|
|
18
|
+
"get_provider",
|
|
19
|
+
"get_all_providers",
|
|
20
|
+
"get_provider_model_id",
|
|
21
|
+
"ModelMetadataNotFoundError",
|
|
22
|
+
# Named model constants — kept in sync with models/*.yaml
|
|
23
|
+
"GPT_4_O",
|
|
24
|
+
"GPT_4_O_MINI",
|
|
25
|
+
"GPT_4_5",
|
|
26
|
+
"GPT_5_5",
|
|
27
|
+
"GPT_5_5_PRO",
|
|
28
|
+
"GPT_5_4_IMAGE_2",
|
|
29
|
+
"GPT_3_5_TURBO",
|
|
30
|
+
"GPT_3_5_TURBO_INSTRUCT",
|
|
31
|
+
"GPT_4",
|
|
32
|
+
"GPT_4_32K",
|
|
33
|
+
"O3",
|
|
34
|
+
"O4_MINI",
|
|
35
|
+
"CLAUDE_OPUS_4_7",
|
|
36
|
+
"CLAUDE_OPUS_4_6_FAST",
|
|
37
|
+
"CLAUDE_SONNET_4_2",
|
|
38
|
+
"CLAUDE_OPUS_LATEST",
|
|
39
|
+
"CLAUDE_HAIKU_4",
|
|
40
|
+
"GEMINI_2_5_PRO",
|
|
41
|
+
"GEMINI_2_5_FLASH",
|
|
42
|
+
"GEMINI_2_0_FLASH",
|
|
43
|
+
"GEMMA_4_31B_IT",
|
|
44
|
+
"GEMMA_4_26B_A4B_IT",
|
|
45
|
+
"DEEPSEEK_V4_PRO",
|
|
46
|
+
"DEEPSEEK_V4_FLASH",
|
|
47
|
+
"DEEPSEEK_CODER_V4",
|
|
48
|
+
"GROK_4_2",
|
|
49
|
+
"GROK_4_2_MULTI_AGENT",
|
|
50
|
+
"KIMI_K2_6",
|
|
51
|
+
"KIMI_V3",
|
|
52
|
+
"QWEN_3_6_PLUS",
|
|
53
|
+
"QWEN_3_6_FLASH",
|
|
54
|
+
"MISTRAL_7B",
|
|
55
|
+
"MISTRAL_7B_INSTRUCT",
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
# Named model constants — import only what you need
|
|
59
|
+
GPT_4_O = get_model("gpt-4o")
|
|
60
|
+
GPT_4_O_MINI = get_model("gpt-4o-mini")
|
|
61
|
+
GPT_4_5 = get_model("gpt-4.5")
|
|
62
|
+
GPT_5_5 = get_model("gpt-5.5")
|
|
63
|
+
GPT_5_5_PRO = get_model("gpt-5.5-pro")
|
|
64
|
+
GPT_5_4_IMAGE_2 = get_model("gpt-5.4-image-2")
|
|
65
|
+
GPT_3_5_TURBO = get_model("gpt-3.5-turbo")
|
|
66
|
+
GPT_3_5_TURBO_INSTRUCT = get_model("gpt-3.5-turbo-instruct")
|
|
67
|
+
GPT_4 = get_model("gpt-4")
|
|
68
|
+
GPT_4_32K = get_model("gpt-4-32k")
|
|
69
|
+
O3 = get_model("o3")
|
|
70
|
+
O4_MINI = get_model("o4-mini")
|
|
71
|
+
CLAUDE_OPUS_4_7 = get_model("claude-opus-4-7")
|
|
72
|
+
CLAUDE_OPUS_4_6_FAST = get_model("claude-opus-4-6-fast")
|
|
73
|
+
CLAUDE_SONNET_4_2 = get_model("claude-sonnet-4-2")
|
|
74
|
+
CLAUDE_OPUS_LATEST = get_model("claude-opus-latest")
|
|
75
|
+
CLAUDE_HAIKU_4 = get_model("claude-haiku-4")
|
|
76
|
+
GEMINI_2_5_PRO = get_model("gemini-2.5-pro")
|
|
77
|
+
GEMINI_2_5_FLASH = get_model("gemini-2.5-flash")
|
|
78
|
+
GEMINI_2_0_FLASH = get_model("gemini-2.0-flash")
|
|
79
|
+
GEMMA_4_31B_IT = get_model("gemma-4-31b-it")
|
|
80
|
+
GEMMA_4_26B_A4B_IT = get_model("gemma-4-26b-a4b-it")
|
|
81
|
+
DEEPSEEK_V4_PRO = get_model("deepseek-v4-pro")
|
|
82
|
+
DEEPSEEK_V4_FLASH = get_model("deepseek-v4-flash")
|
|
83
|
+
DEEPSEEK_CODER_V4 = get_model("deepseek-coder-v4")
|
|
84
|
+
GROK_4_2 = get_model("grok-4.2")
|
|
85
|
+
GROK_4_2_MULTI_AGENT = get_model("grok-4.2-multi-agent")
|
|
86
|
+
KIMI_K2_6 = get_model("kimi-k2.6")
|
|
87
|
+
KIMI_V3 = get_model("kimi-v3")
|
|
88
|
+
QWEN_3_6_PLUS = get_model("qwen3.6-plus")
|
|
89
|
+
QWEN_3_6_FLASH = get_model("qwen3.6-flash")
|
|
90
|
+
MISTRAL_7B = get_model("mistral-7b")
|
|
91
|
+
MISTRAL_7B_INSTRUCT = get_model("mistral-7b-instruct")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# Provider helpers
|
|
95
|
+
def get_provider(provider_id: str) -> dict | None:
|
|
96
|
+
"""Get provider configuration by provider_id, or None if not found."""
|
|
97
|
+
from model_metadata_central.utils.load_provider import load_provider
|
|
98
|
+
return load_provider(provider_id)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def get_all_providers() -> list[dict]:
|
|
102
|
+
"""Get all providers."""
|
|
103
|
+
from model_metadata_central._registry import PROVIDERS
|
|
104
|
+
return list(PROVIDERS)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def get_provider_model_id(model_id: str, provider_id: str) -> str | None:
|
|
108
|
+
"""Get the model_id as used by a specific provider."""
|
|
109
|
+
model = get_model(model_id)
|
|
110
|
+
if model is None:
|
|
111
|
+
return None
|
|
112
|
+
for p in model.get("providers") or []:
|
|
113
|
+
if p.get("provider_id") == provider_id:
|
|
114
|
+
return p.get("model_id_on_provider")
|
|
115
|
+
return None
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"""Loader for the bundled JSON registries built by scripts/build_registry.py."""
|
|
2
|
+
import json
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
_PKG_DIR = Path(__file__).resolve().parent
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _load(name: str) -> list[dict]:
|
|
9
|
+
path = _PKG_DIR / name
|
|
10
|
+
if not path.exists():
|
|
11
|
+
raise RuntimeError(
|
|
12
|
+
f"Bundled {name} is missing. Run "
|
|
13
|
+
"`uv run python scripts/build_registry.py` to generate it."
|
|
14
|
+
)
|
|
15
|
+
return json.loads(path.read_text())
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
MODELS: list[dict] = _load("registry.json")
|
|
19
|
+
PROVIDERS: list[dict] = _load("providers.json")
|
|
20
|
+
|
|
21
|
+
MODELS_BY_ID: dict[str, dict] = {m["model_id"]: m for m in MODELS}
|
|
22
|
+
PROVIDERS_BY_ID: dict[str, dict] = {p["provider_id"]: p for p in PROVIDERS}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Generated from JSON Schema — do not edit manually
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, Literal
|
|
6
|
+
from pydantic import BaseModel, Field
|
|
7
|
+
|
|
8
|
+
class Provider_reference(BaseModel):
|
|
9
|
+
provider_id: str
|
|
10
|
+
model_id_on_provider: str | None = None
|
|
11
|
+
|
|
12
|
+
class Tokenizer_config(BaseModel):
|
|
13
|
+
family: Literal['tiktoken', 'tekken', 'sentencepiece', 'huggingface', 'other', 'unknown']
|
|
14
|
+
name: str | None = None
|
|
15
|
+
|
|
16
|
+
class ModelMetadata(BaseModel):
|
|
17
|
+
"""Generated from model-metadata.schema.json"""
|
|
18
|
+
model_id: str
|
|
19
|
+
model_name: str | None = None
|
|
20
|
+
model_provider: str | None = None
|
|
21
|
+
model_description: str | None = None
|
|
22
|
+
model_info: str | None = None
|
|
23
|
+
model_version: str | None = None
|
|
24
|
+
model_type: Literal['chat', 'completion', 'embedding']
|
|
25
|
+
context_window: float
|
|
26
|
+
max_tokens: float | None = None
|
|
27
|
+
cost_per_token: Any | None = None
|
|
28
|
+
knowledge_cutoff: str | None = None
|
|
29
|
+
tokenizer: Tokenizer_config | None = None
|
|
30
|
+
tuning: list | None = None
|
|
31
|
+
deprecated: bool | None = None
|
|
32
|
+
providers: list | None = None
|
|
33
|
+
|
|
34
|
+
class ProviderMetadata(BaseModel):
|
|
35
|
+
"""Generated from provider.schema.json"""
|
|
36
|
+
provider_id: str
|
|
37
|
+
name: str
|
|
38
|
+
website_url: str | None = None
|
|
39
|
+
api_type: Literal['openai_compatible', 'anthropic', 'openai', 'other']
|
|
40
|
+
base_url: str | None = None
|
|
41
|
+
auth_type: Literal['api_key', 'bearer', 'oauth', 'managed', 'none'] | None = None
|
|
42
|
+
routing_priority: Literal['direct', 'aggregator', 'both']
|
|
43
|
+
status: Literal['active', 'deprecated', 'inactive'] | None = None
|
|
44
|
+
notes: str | None = None
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
from model_metadata_central.utils.get_metadata_models import get_metadata_models
|
|
2
|
+
from model_metadata_central.utils.load_metadata import load_metadata
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def get_model(model_id: str) -> dict | None:
|
|
6
|
+
"""Get metadata for a specific model by model_id, or None if not found."""
|
|
7
|
+
return load_metadata(model_id)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def get_all_models() -> list[dict]:
|
|
11
|
+
"""
|
|
12
|
+
Get all models from the registry.
|
|
13
|
+
"""
|
|
14
|
+
models = get_metadata_models()
|
|
15
|
+
return [load_metadata(m) for m in models]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_models_by_provider(provider_id: str) -> list[dict]:
|
|
19
|
+
"""
|
|
20
|
+
Get all models available on a given provider.
|
|
21
|
+
"""
|
|
22
|
+
return [
|
|
23
|
+
m for m in get_all_models()
|
|
24
|
+
if m.get("providers")
|
|
25
|
+
and any(p.get("provider_id") == provider_id for p in m["providers"])
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_model_on_provider(provider_id: str, provider_model_id: str | None = None) -> dict | None:
|
|
30
|
+
"""
|
|
31
|
+
Find a model available on a specific provider.
|
|
32
|
+
|
|
33
|
+
If provider_model_id is given, match both provider and the model's ID on that provider.
|
|
34
|
+
Otherwise return the first model found on the provider.
|
|
35
|
+
"""
|
|
36
|
+
for model in get_all_models():
|
|
37
|
+
providers = model.get("providers") or []
|
|
38
|
+
for p in providers:
|
|
39
|
+
if p.get("provider_id") == provider_id:
|
|
40
|
+
if provider_model_id is None:
|
|
41
|
+
return model
|
|
42
|
+
if p.get("model_id_on_provider") == provider_model_id:
|
|
43
|
+
return model
|
|
44
|
+
return None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_metadata() -> dict[str, dict]:
|
|
48
|
+
"""
|
|
49
|
+
Get metadata for all models as a dict keyed by model_id.
|
|
50
|
+
"""
|
|
51
|
+
return {m["model_id"]: m for m in get_all_models()}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def get_models() -> list[str]:
|
|
55
|
+
"""
|
|
56
|
+
Get all model_ids. Deprecated: use get_all_models() for typed data.
|
|
57
|
+
"""
|
|
58
|
+
return get_metadata_models()
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"provider_id": "anthropic",
|
|
4
|
+
"name": "Anthropic",
|
|
5
|
+
"website_url": "https://anthropic.com",
|
|
6
|
+
"api_type": "anthropic",
|
|
7
|
+
"base_url": "https://api.anthropic.com/v1",
|
|
8
|
+
"auth_type": "api_key",
|
|
9
|
+
"routing_priority": "direct",
|
|
10
|
+
"status": "active",
|
|
11
|
+
"notes": "Primary provider for Claude models. Uses Anthropic's own API protocol."
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"provider_id": "cloudflare",
|
|
15
|
+
"name": "Cloudflare Workers AI",
|
|
16
|
+
"website_url": "https://developers.cloudflare.com/workers-ai",
|
|
17
|
+
"api_type": "openai_compatible",
|
|
18
|
+
"base_url": "https://api.cloudflare.com/client/v4",
|
|
19
|
+
"auth_type": "api_key",
|
|
20
|
+
"routing_priority": "direct",
|
|
21
|
+
"status": "active",
|
|
22
|
+
"notes": "Edge inference via Cloudflare Workers AI. Account-scoped model routes use /accounts/{account_id}/ai/run/{model}; OpenAI-compatible routes use /accounts/{account_id}/ai/v1."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"provider_id": "deepseek",
|
|
26
|
+
"name": "DeepSeek",
|
|
27
|
+
"website_url": "https://deepseek.com",
|
|
28
|
+
"api_type": "openai_compatible",
|
|
29
|
+
"base_url": "https://api.deepseek.com/v1",
|
|
30
|
+
"auth_type": "api_key",
|
|
31
|
+
"routing_priority": "direct",
|
|
32
|
+
"status": "active",
|
|
33
|
+
"notes": "Primary provider for DeepSeek V4 and Coder models."
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"provider_id": "google",
|
|
37
|
+
"name": "Google AI",
|
|
38
|
+
"website_url": "https://ai.google",
|
|
39
|
+
"api_type": "openai_compatible",
|
|
40
|
+
"base_url": "https://generativelanguage.googleapis.com/v1beta",
|
|
41
|
+
"auth_type": "api_key",
|
|
42
|
+
"routing_priority": "direct",
|
|
43
|
+
"status": "active",
|
|
44
|
+
"notes": "Primary provider for Gemini, Gemma, and Lyria models via Vertex AI or AI Studio."
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"provider_id": "groq",
|
|
48
|
+
"name": "Groq",
|
|
49
|
+
"website_url": "https://console.groq.com",
|
|
50
|
+
"api_type": "openai_compatible",
|
|
51
|
+
"base_url": "https://api.groq.com/openai/v1",
|
|
52
|
+
"auth_type": "api_key",
|
|
53
|
+
"routing_priority": "direct",
|
|
54
|
+
"status": "active",
|
|
55
|
+
"notes": "High-speed inference provider. Good for latency-sensitive applications. Popular for Llama and Mixtral models."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"provider_id": "lmstudio",
|
|
59
|
+
"name": "LM Studio",
|
|
60
|
+
"website_url": "https://lmstudio.ai",
|
|
61
|
+
"api_type": "openai_compatible",
|
|
62
|
+
"base_url": "http://localhost:1234/v1",
|
|
63
|
+
"auth_type": "none",
|
|
64
|
+
"routing_priority": "direct",
|
|
65
|
+
"status": "active",
|
|
66
|
+
"notes": "Local inference GUI and API server for GGUF/GGML models. Similar API to Ollama. Authentication disabled by default."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"provider_id": "localai",
|
|
70
|
+
"name": "LocalAI",
|
|
71
|
+
"website_url": "https://localai.io",
|
|
72
|
+
"api_type": "openai_compatible",
|
|
73
|
+
"base_url": "http://localhost:8080/v1",
|
|
74
|
+
"auth_type": "api_key",
|
|
75
|
+
"routing_priority": "direct",
|
|
76
|
+
"status": "active",
|
|
77
|
+
"notes": "Self-hosted inference engine. Supports many open models via ggml/gguf. Often used in Kubernetes/ Docker stacks. Authentication may be bearer token or disabled depending on config."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"provider_id": "minimax",
|
|
81
|
+
"name": "MiniMax",
|
|
82
|
+
"website_url": "https://platform.minimax.io",
|
|
83
|
+
"api_type": "anthropic",
|
|
84
|
+
"base_url": "https://api.minimax.io/anthropic",
|
|
85
|
+
"auth_type": "api_key",
|
|
86
|
+
"routing_priority": "direct",
|
|
87
|
+
"status": "active",
|
|
88
|
+
"notes": "Primary provider for MiniMax text models. Anthropic-compatible API is recommended and supports streaming plus interleaved thinking; MiniMax also exposes OpenAI-compatible text APIs."
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"provider_id": "mistralai",
|
|
92
|
+
"name": "Mistral AI",
|
|
93
|
+
"website_url": "https://mistral.ai",
|
|
94
|
+
"api_type": "openai_compatible",
|
|
95
|
+
"base_url": "https://api.mistral.ai/v1",
|
|
96
|
+
"auth_type": "api_key",
|
|
97
|
+
"routing_priority": "direct",
|
|
98
|
+
"status": "active",
|
|
99
|
+
"notes": "Primary provider for Mistral's own models including Mistral Small, Medium, Large, and Codestral."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"provider_id": "moonshotai",
|
|
103
|
+
"name": "Moonshot AI",
|
|
104
|
+
"website_url": "https://moonshot.ai",
|
|
105
|
+
"api_type": "openai_compatible",
|
|
106
|
+
"base_url": "https://api.moonshotai.com/v1",
|
|
107
|
+
"auth_type": "api_key",
|
|
108
|
+
"routing_priority": "direct",
|
|
109
|
+
"status": "active",
|
|
110
|
+
"notes": "Primary provider for Kimi models."
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"provider_id": "nvidia",
|
|
114
|
+
"name": "NVIDIA NIM",
|
|
115
|
+
"website_url": "https://build.nvidia.com",
|
|
116
|
+
"api_type": "openai_compatible",
|
|
117
|
+
"base_url": "https://integrate.api.nvidia.com/v1",
|
|
118
|
+
"auth_type": "api_key",
|
|
119
|
+
"routing_priority": "direct",
|
|
120
|
+
"status": "active",
|
|
121
|
+
"notes": "NVIDIA NIM API catalog for hosted and deployable NVIDIA/open model inference, including Nemotron."
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"provider_id": "ollama",
|
|
125
|
+
"name": "Ollama",
|
|
126
|
+
"website_url": "https://ollama.com",
|
|
127
|
+
"api_type": "openai_compatible",
|
|
128
|
+
"base_url": "http://localhost:11434/v1",
|
|
129
|
+
"auth_type": "none",
|
|
130
|
+
"routing_priority": "direct",
|
|
131
|
+
"status": "active",
|
|
132
|
+
"notes": "Local inference runtime for macOS, Linux, and Windows. Serves quantized GGUF models. Authentication disabled by default; configure .env/ollama for credentials in production."
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"provider_id": "openai",
|
|
136
|
+
"name": "OpenAI",
|
|
137
|
+
"website_url": "https://openai.com",
|
|
138
|
+
"api_type": "openai_compatible",
|
|
139
|
+
"base_url": "https://api.openai.com/v1",
|
|
140
|
+
"auth_type": "api_key",
|
|
141
|
+
"routing_priority": "direct",
|
|
142
|
+
"status": "active",
|
|
143
|
+
"notes": "The primary provider for OpenAI models including GPT-4, GPT-5, and o-series."
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"provider_id": "openrouter",
|
|
147
|
+
"name": "OpenRouter",
|
|
148
|
+
"website_url": "https://openrouter.ai",
|
|
149
|
+
"api_type": "openai_compatible",
|
|
150
|
+
"base_url": "https://openrouter.ai/api/v1",
|
|
151
|
+
"auth_type": "api_key",
|
|
152
|
+
"routing_priority": "aggregator",
|
|
153
|
+
"status": "active",
|
|
154
|
+
"notes": "Aggregator that routes to multiple providers. Useful for model comparison and failover. Access models from OpenAI, Anthropic, Google, DeepSeek and more via a unified API."
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"provider_id": "qwen",
|
|
158
|
+
"name": "Qwen",
|
|
159
|
+
"website_url": "https://qwen.ai",
|
|
160
|
+
"api_type": "openai_compatible",
|
|
161
|
+
"base_url": "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
|
|
162
|
+
"auth_type": "api_key",
|
|
163
|
+
"routing_priority": "direct",
|
|
164
|
+
"status": "active",
|
|
165
|
+
"notes": "Primary provider for Qwen models via Alibaba Cloud DashScope."
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"provider_id": "x-ai",
|
|
169
|
+
"name": "xAI",
|
|
170
|
+
"website_url": "https://x.ai",
|
|
171
|
+
"api_type": "openai_compatible",
|
|
172
|
+
"base_url": "https://api.x.ai/v1",
|
|
173
|
+
"auth_type": "api_key",
|
|
174
|
+
"routing_priority": "direct",
|
|
175
|
+
"status": "active",
|
|
176
|
+
"notes": "Primary provider for Grok models."
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"provider_id": "zai",
|
|
180
|
+
"name": "Z.AI",
|
|
181
|
+
"website_url": "https://z.ai",
|
|
182
|
+
"api_type": "openai_compatible",
|
|
183
|
+
"base_url": "https://api.z.ai/api/paas/v4",
|
|
184
|
+
"auth_type": "api_key",
|
|
185
|
+
"routing_priority": "direct",
|
|
186
|
+
"status": "active",
|
|
187
|
+
"notes": "Primary provider for GLM models. OpenAI-compatible API endpoint for Z.AI/Zhipu model access."
|
|
188
|
+
}
|
|
189
|
+
]
|