model-metadata-central 0.2.0__tar.gz

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.
Files changed (22) hide show
  1. model_metadata_central-0.2.0/.gitignore +5 -0
  2. model_metadata_central-0.2.0/PKG-INFO +109 -0
  3. model_metadata_central-0.2.0/README.md +85 -0
  4. model_metadata_central-0.2.0/model_metadata_central/__init__.py +115 -0
  5. model_metadata_central-0.2.0/model_metadata_central/_registry.py +22 -0
  6. model_metadata_central-0.2.0/model_metadata_central/generated/__init__.py +4 -0
  7. model_metadata_central-0.2.0/model_metadata_central/generated/models.py +44 -0
  8. model_metadata_central-0.2.0/model_metadata_central/lib.py +58 -0
  9. model_metadata_central-0.2.0/model_metadata_central/providers.json +189 -0
  10. model_metadata_central-0.2.0/model_metadata_central/registry.json +2111 -0
  11. model_metadata_central-0.2.0/model_metadata_central/tests/__init__.py +0 -0
  12. model_metadata_central-0.2.0/model_metadata_central/tests/schema_test.py +19 -0
  13. model_metadata_central-0.2.0/model_metadata_central/tests/utils_test.py +68 -0
  14. model_metadata_central-0.2.0/model_metadata_central/utils/__init__.py +0 -0
  15. model_metadata_central-0.2.0/model_metadata_central/utils/exceptions.py +6 -0
  16. model_metadata_central-0.2.0/model_metadata_central/utils/get_metadata_models.py +6 -0
  17. model_metadata_central-0.2.0/model_metadata_central/utils/get_provider_ids.py +6 -0
  18. model_metadata_central-0.2.0/model_metadata_central/utils/load_metadata.py +6 -0
  19. model_metadata_central-0.2.0/model_metadata_central/utils/load_provider.py +6 -0
  20. model_metadata_central-0.2.0/pyproject.toml +55 -0
  21. model_metadata_central-0.2.0/scripts/build_registry.py +37 -0
  22. model_metadata_central-0.2.0/uv.lock +783 -0
@@ -0,0 +1,5 @@
1
+ __pycache__
2
+ .pytest_cache
3
+
4
+ node_modules
5
+ dist
@@ -0,0 +1,109 @@
1
+ Metadata-Version: 2.4
2
+ Name: model-metadata-central
3
+ Version: 0.2.0
4
+ Summary: Typed registry of LLM model metadata for Python — context windows, pricing, provider routing.
5
+ Project-URL: Homepage, https://github.com/InterwebAlchemy/model-metadata-central
6
+ Project-URL: Repository, https://github.com/InterwebAlchemy/model-metadata-central
7
+ Project-URL: Issues, https://github.com/InterwebAlchemy/model-metadata-central/issues
8
+ Author-email: Eric Allen <era@lakera.ai>
9
+ License-Expression: MIT
10
+ Keywords: anthropic,context-window,language model,llm,metadata,openai,pricing
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Software Development :: Libraries
20
+ Requires-Python: >=3.10
21
+ Requires-Dist: pydantic<3,>=2.0
22
+ Requires-Dist: pyyaml<7,>=6.0
23
+ Description-Content-Type: text/markdown
24
+
25
+ # model-metadata-central
26
+
27
+ Typed registry of LLM model metadata for Python — context windows, pricing, provider routing.
28
+
29
+ ```sh
30
+ pip install model-metadata-central
31
+ ```
32
+
33
+ ## Usage
34
+
35
+ ### Full registry
36
+
37
+ ```python
38
+ from model_metadata_central import get_all_models, get_all_providers
39
+
40
+ models = get_all_models()
41
+ for model in models:
42
+ print(f"{model['model_name']}: {model['context_window']} context")
43
+ ```
44
+
45
+ ### Look up a single model
46
+
47
+ ```python
48
+ from model_metadata_central import get_model
49
+
50
+ model = get_model("gpt-4o")
51
+ if model:
52
+ print(model["context_window"]) # 128000
53
+ print(model["cost_per_token"]) # {"input": 0.000005, "output": 0.000015}
54
+ ```
55
+
56
+ ### Filter by provider
57
+
58
+ ```python
59
+ from model_metadata_central import get_models_by_provider
60
+
61
+ anthropic = get_models_by_provider("anthropic")
62
+ openrouter = get_models_by_provider("openrouter")
63
+ ```
64
+
65
+ ### Provider routing
66
+
67
+ ```python
68
+ from model_metadata_central import get_provider_model_id, get_provider
69
+
70
+ # Get the model ID for a specific provider
71
+ openai_id = get_provider_model_id("gpt-4o", "openai") # "gpt-4o"
72
+ orouter_id = get_provider_model_id("gpt-4o", "openrouter") # "openai/gpt-4o"
73
+
74
+ # Get provider config
75
+ provider = get_provider("openai")
76
+ print(provider["base_url"]) # "https://api.openai.com/v1"
77
+ print(provider["auth_type"]) # "api_key"
78
+ ```
79
+
80
+ ### Named model constants
81
+
82
+ ```python
83
+ from model_metadata_central import GPT_4_O, CLAUDE_OPUS_4_7
84
+
85
+ # Fully typed dict — bundlers exclude the rest
86
+ print(GPT_4_O["context_window"])
87
+ ```
88
+
89
+ ## API
90
+
91
+ | Function | Returns | Description |
92
+ |---|---|---|
93
+ | `get_model(id)` | `dict \| None` | Lookup by model_id |
94
+ | `get_all_models()` | `list[dict]` | All models |
95
+ | `get_models_by_provider(provider_id)` | `list[dict]` | Filter by provider |
96
+ | `get_model_on_provider(provider_id, provider_model_id=None)` | `dict \| None` | Find model on a specific provider |
97
+ | `get_provider(id)` | `dict \| None` | Provider config |
98
+ | `get_all_providers()` | `list[dict]` | All providers |
99
+ | `get_provider_model_id(model_id, provider_id)` | `str \| None` | Provider-specific model ID |
100
+
101
+ ## Data
102
+
103
+ - Registry pre-compiled from `models/*.yaml` at install/build time
104
+ - 74 models across 17 providers
105
+ - Prices are in USD per token
106
+
107
+ ## Schema
108
+
109
+ Matches the JSON Schema definitions in the repo root.
@@ -0,0 +1,85 @@
1
+ # model-metadata-central
2
+
3
+ Typed registry of LLM model metadata for Python — context windows, pricing, provider routing.
4
+
5
+ ```sh
6
+ pip install model-metadata-central
7
+ ```
8
+
9
+ ## Usage
10
+
11
+ ### Full registry
12
+
13
+ ```python
14
+ from model_metadata_central import get_all_models, get_all_providers
15
+
16
+ models = get_all_models()
17
+ for model in models:
18
+ print(f"{model['model_name']}: {model['context_window']} context")
19
+ ```
20
+
21
+ ### Look up a single model
22
+
23
+ ```python
24
+ from model_metadata_central import get_model
25
+
26
+ model = get_model("gpt-4o")
27
+ if model:
28
+ print(model["context_window"]) # 128000
29
+ print(model["cost_per_token"]) # {"input": 0.000005, "output": 0.000015}
30
+ ```
31
+
32
+ ### Filter by provider
33
+
34
+ ```python
35
+ from model_metadata_central import get_models_by_provider
36
+
37
+ anthropic = get_models_by_provider("anthropic")
38
+ openrouter = get_models_by_provider("openrouter")
39
+ ```
40
+
41
+ ### Provider routing
42
+
43
+ ```python
44
+ from model_metadata_central import get_provider_model_id, get_provider
45
+
46
+ # Get the model ID for a specific provider
47
+ openai_id = get_provider_model_id("gpt-4o", "openai") # "gpt-4o"
48
+ orouter_id = get_provider_model_id("gpt-4o", "openrouter") # "openai/gpt-4o"
49
+
50
+ # Get provider config
51
+ provider = get_provider("openai")
52
+ print(provider["base_url"]) # "https://api.openai.com/v1"
53
+ print(provider["auth_type"]) # "api_key"
54
+ ```
55
+
56
+ ### Named model constants
57
+
58
+ ```python
59
+ from model_metadata_central import GPT_4_O, CLAUDE_OPUS_4_7
60
+
61
+ # Fully typed dict — bundlers exclude the rest
62
+ print(GPT_4_O["context_window"])
63
+ ```
64
+
65
+ ## API
66
+
67
+ | Function | Returns | Description |
68
+ |---|---|---|
69
+ | `get_model(id)` | `dict \| None` | Lookup by model_id |
70
+ | `get_all_models()` | `list[dict]` | All models |
71
+ | `get_models_by_provider(provider_id)` | `list[dict]` | Filter by provider |
72
+ | `get_model_on_provider(provider_id, provider_model_id=None)` | `dict \| None` | Find model on a specific provider |
73
+ | `get_provider(id)` | `dict \| None` | Provider config |
74
+ | `get_all_providers()` | `list[dict]` | All providers |
75
+ | `get_provider_model_id(model_id, provider_id)` | `str \| None` | Provider-specific model ID |
76
+
77
+ ## Data
78
+
79
+ - Registry pre-compiled from `models/*.yaml` at install/build time
80
+ - 74 models across 17 providers
81
+ - Prices are in USD per token
82
+
83
+ ## Schema
84
+
85
+ Matches the JSON Schema definitions in the repo root.
@@ -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,4 @@
1
+ # Re-export for convenience
2
+ from .models import ModelMetadata, ProviderMetadata
3
+
4
+ __all__ = ["ModelMetadata", "ProviderMetadata"]
@@ -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
+ ]