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.
- model_metadata_central-0.2.0/.gitignore +5 -0
- model_metadata_central-0.2.0/PKG-INFO +109 -0
- model_metadata_central-0.2.0/README.md +85 -0
- model_metadata_central-0.2.0/model_metadata_central/__init__.py +115 -0
- model_metadata_central-0.2.0/model_metadata_central/_registry.py +22 -0
- model_metadata_central-0.2.0/model_metadata_central/generated/__init__.py +4 -0
- model_metadata_central-0.2.0/model_metadata_central/generated/models.py +44 -0
- model_metadata_central-0.2.0/model_metadata_central/lib.py +58 -0
- model_metadata_central-0.2.0/model_metadata_central/providers.json +189 -0
- model_metadata_central-0.2.0/model_metadata_central/registry.json +2111 -0
- model_metadata_central-0.2.0/model_metadata_central/tests/__init__.py +0 -0
- model_metadata_central-0.2.0/model_metadata_central/tests/schema_test.py +19 -0
- model_metadata_central-0.2.0/model_metadata_central/tests/utils_test.py +68 -0
- model_metadata_central-0.2.0/model_metadata_central/utils/__init__.py +0 -0
- model_metadata_central-0.2.0/model_metadata_central/utils/exceptions.py +6 -0
- model_metadata_central-0.2.0/model_metadata_central/utils/get_metadata_models.py +6 -0
- model_metadata_central-0.2.0/model_metadata_central/utils/get_provider_ids.py +6 -0
- model_metadata_central-0.2.0/model_metadata_central/utils/load_metadata.py +6 -0
- model_metadata_central-0.2.0/model_metadata_central/utils/load_provider.py +6 -0
- model_metadata_central-0.2.0/pyproject.toml +55 -0
- model_metadata_central-0.2.0/scripts/build_registry.py +37 -0
- model_metadata_central-0.2.0/uv.lock +783 -0
|
@@ -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,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
|
+
]
|