Model Metadata
View SourceLLMDB is the model registry behind ReqLLM. Browse the current catalog on LLMDB.xyz.
This guide is about shared registry metadata. If you only need to call a model that is not in the registry yet, start with the Model Specs guide. You do not need a local patch just to make a request.
Overview
The model metadata system provides:
- Automatic metadata via the
llm_dbdependency, sourced from models.dev - Browsable catalog via LLMDB.xyz
- Local patch system for adding missing models or overriding metadata
- Explicit model-spec path for using models before they land in the registry
- Seamless integration with no provider configuration changes needed
- Persistent customizations that survive dependency updates
Pricing metadata is one input into ReqLLM's best-effort cost calculation. It is useful for normalized application-side billing estimates, but it is not a guarantee of exact provider invoice totals. See the Pricing Policy guide for the public contract.
Model Metadata Flow
1. Upstream Metadata via llm_db
Model metadata is provided by the llm_db dependency, which sources data from the models.dev API. This includes:
- Model capabilities (text generation, embedding, vision, etc.)
- Pricing information (input/output token costs)
- Context limits and output limits
- Supported modalities (text, images, audio)
- Provider-specific details
To get the latest model metadata, update the dependency:
mix deps.update llm_db
If the model is still missing after that, use the Model Specs path first. Add or patch registry metadata only when you want the model to be shared, discoverable, and available to tooling like mix mc.
2. Local Patch Integration
ReqLLM automatically discovers and merges local patches from priv/models_local/ on top of the llm_db data.
Use this when you want missing models to behave like first-class registry entries for the whole codebase, not when you just need to make one request.
File Structure
priv/
├── models_dev/ # Auto-generated from models.dev (DO NOT EDIT)
│ ├── openai.json
│ ├── anthropic.json
│ └── ...
└── models_local/ # Local patches and extensions
├── openai_patch.json
├── custom_models.json
└── ...Creating Local Patches
Basic Patch Structure
Patch files use the same JSON structure as upstream metadata:
{
"provider": {
"id": "openai",
"name": "OpenAI",
"base_url": "https://api.openai.com/v1",
"env": ["OPENAI_API_KEY"],
"doc": "AI model provider"
},
"models": [
{
"id": "text-embedding-3-small",
"name": "Text Embedding 3 Small",
"provider": "openai",
"provider_model_id": "text-embedding-3-small",
"type": "embedding",
"attachment": false,
"open_weights": false,
"reasoning": false,
"temperature": false,
"tool_call": false,
"knowledge": "2024-01",
"release_date": "2024-01-25",
"cost": {
"input": 0.00002,
"output": 0.0
},
"limit": {
"context": 8191,
"output": 0
},
"modalities": {
"input": ["text"],
"output": ["embedding"]
},
"dimensions": {
"min": 1,
"max": 1536,
"default": 1536
}
}
]
}Patch Merging Rules
- New models: Added to the provider's model list
- Existing models: Patch data overrides upstream data by model ID
- Provider metadata: Can be extended or overridden
- Multiple patches: All JSON files in
priv/models_local/are processed
Common Use Cases
Adding Missing Models To The Shared Registry
Some models may not be available in the upstream registry yet:
{
"provider": {
"id": "openai"
},
"models": [
{
"id": "gpt-4o-mini-2024-07-18",
"name": "GPT-4o Mini (2024-07-18)",
"provider": "openai",
"provider_model_id": "gpt-4o-mini-2024-07-18",
"type": "chat",
"cost": {
"input": 0.00015,
"output": 0.0006
}
}
]
}Overriding Pricing
Adjust costs for enterprise pricing or different regions:
{
"provider": {
"id": "openai"
},
"models": [
{
"id": "gpt-4o",
"cost": {
"input": 0.002,
"output": 0.008
}
}
]
}This is the recommended path when your account pricing differs from the shared registry. ReqLLM will use the patched values for its own cost calculations.
Adding Custom Models To The Shared Registry
Include private or custom model deployments:
{
"provider": {
"id": "custom",
"name": "Custom Provider",
"base_url": "https://api.mycompany.com/v1",
"env": ["CUSTOM_API_KEY"]
},
"models": [
{
"id": "company-llm-v1",
"name": "Company LLM v1",
"provider": "custom",
"type": "chat"
}
]
}Working with Model Metadata
Accessing Model Information
# Get model details
{:ok, model} = ReqLLM.model("openai:gpt-4o")
# Check model capabilities
model.capabilities.tool_call # true
model.capabilities.reasoning # false
# View pricing
model.cost.input # 0.005
model.cost.output # 0.015
# Context limits
model.max_tokens # 4096 (output limit)
model.limit.context # 128000 (input limit)Listing Available Models
# All models for a provider
models = LLMDB.models(:openai)
specs = Enum.map(models, &LLMDB.Model.spec/1)Updating Model Metadata
Model metadata ships with the llm_db package dependency. To get the latest models, pricing, and capabilities:
mix deps.update llm_db
Keeping llm_db current improves ReqLLM's cost estimates, especially when providers ship new models or pricing changes.
Integration with Providers
The patch system works transparently with all ReqLLM providers. No code changes needed. Local patches in priv/models_local/ are automatically integrated into the model registry at runtime.
This enables you to:
- Add missing models immediately without waiting for upstream updates
- Override metadata for your specific deployment requirements
- Include custom or private models alongside public ones
- Maintain local customizations across sync operations
If your only goal is to call a missing model right now, the Model Specs guide is the simpler path.