+
+---
+
+[Models.dev](https://models.dev) is a comprehensive open-source database of AI model specifications, pricing, and capabilities.
+
+There's no single database with information about all the available AI models. We started Models.dev as a community-contributed project to address this. We also use it internally in [opencode](https://opencode.ai).
+
+## API
+
+You can access this data through an API.
+
+```bash
+curl https://models.dev/api.json
+```
+
+Use the **Model ID** field to do a lookup on any model; it's the identifier used by [AI SDK](https://ai-sdk.dev/).
+
+Provider-agnostic model metadata is available separately:
+
+```bash
+curl https://models.dev/models.json
+```
+
+Use this for facts about the model itself, independent of where it is served. If you need both provider endpoints and model-only metadata in one response:
+
+```bash
+curl https://models.dev/catalog.json
+```
+
+### Logos
+
+Provider logos are available as SVG files:
+
+```bash
+curl https://models.dev/logos/{provider}.svg
+```
+
+Replace `{provider}` with the **Provider ID** (e.g., `anthropic`, `openai`, `google`). If we don't have a provider's logo, a default logo is served instead.
+
+## Contributing
+
+The data is stored in the repo as TOML files; organized by provider and model. The logo is stored as an SVG. This is used to generate this page and power the API.
+
+We need your help keeping the data up to date.
+
+### Adding Model Metadata
+
+Model-only facts live in `models/`, using the same path-style IDs as provider models. For example, `models/openai/gpt-5.toml` defines metadata for the underlying GPT-5 model, while `providers/openai/models/gpt-5.toml` defines OpenAI-specific serving details such as pricing.
+
+Use model metadata for provider-agnostic facts:
+
+- `name`, `family`, `release_date`, `last_updated`, `knowledge`
+- `attachment`, `reasoning`, `tool_call`, `structured_output`, `temperature`
+- `[limit]` defaults like context, input, and output token limits
+- `[modalities]` defaults
+- `open_weights`, `license`, `links`, `weights`, and `benchmarks`
+
+Example:
+
+```toml
+name = "GPT-5"
+family = "gpt"
+release_date = "2025-08-07"
+last_updated = "2025-08-07"
+attachment = true
+reasoning = true
+temperature = false
+tool_call = true
+structured_output = true
+open_weights = false
+
+[limit]
+context = 400_000
+input = 272_000
+output = 128_000
+
+[modalities]
+input = ["text", "image"]
+output = ["text"]
+
+[[benchmarks]]
+name = "Benchmark Name"
+score = 72.5
+metric = "accuracy"
+source = "https://example.com/results"
+
+[[weights]]
+label = "Model weights"
+url = "https://huggingface.co/example/model"
+format = "safetensors"
+```
+
+Provider TOMLs can inherit these facts with `base_model` and then keep only provider-specific fields or overrides:
+
+```toml
+base_model = "openai/gpt-5"
+
+[cost]
+input = 1.25
+output = 10.00
+cache_read = 0.125
+
+[limit]
+context = 200_000 # optional provider override
+output = 32_000
+```
+
+Provider fields win over model metadata during generation. Use this when the underlying model is the same but a provider serves it with different context limits, modalities, features, or pricing.
+
+### Adding a New Provider Model
+
+To add a new model, start by checking if the provider already exists in the `providers/` directory. If not, then:
+
+#### 1. Create a Provider
+
+If the provider isn't already in `providers/`:
+
+1. Create a new folder in `providers/` with the provider's ID. For example, `providers/newprovider/`.
+2. Add a `provider.toml` with the provider details:
+
+ ```toml
+ name = "Provider Name"
+ npm = "@ai-sdk/provider" # AI SDK Package name
+ env = ["PROVIDER_API_KEY"] # Environment Variable keys used for auth
+ doc = "https://example.com/docs/models" # Link to provider's documentation
+ ```
+
+ If the provider doesn’t publish an npm package but exposes an OpenAI-compatible endpoint, set the npm field accordingly and include the base URL:
+
+ ```toml
+ npm = "@ai-sdk/openai-compatible" # Use OpenAI-compatible SDK
+ api = "https://api.example.com/v1" # Required with openai-compatible
+ ```
+
+#### 2. Add a Logo (optional)
+
+To add a logo for the provider:
+
+1. Add a `logo.svg` file to the provider's directory (e.g., `providers/newprovider/logo.svg`)
+2. Use SVG format with no fixed size or colors - use `currentColor` for fills/strokes
+
+Example SVG structure:
+
+```svg
+
+```
+
+#### 3. Add a Model Definition
+
+Create a new TOML file in the provider's `models/` directory where the filename is the model ID.
+
+If the model ID contains `/`, use subfolders. For example, for the model ID `openai/gpt-5`, create a folder `openai/` and place a file named `gpt-5.toml` inside it.
+
+```toml
+name = "Model Display Name"
+attachment = true # or false - supports file attachments
+reasoning = false # or true - supports reasoning / chain-of-thought
+tool_call = true # or false - supports tool calling
+structured_output = true # or false - supports a dedicated structured output feature
+temperature = true # or false - supports temperature control
+knowledge = "2024-04" # Knowledge-cutoff date
+release_date = "2025-02-19" # First public release date
+last_updated = "2025-02-19" # Most recent update date
+open_weights = true # or false - model’s trained weights are publicly available
+
+[cost]
+input = 3.00 # Cost per million input tokens (USD)
+output = 15.00 # Cost per million output tokens (USD)
+reasoning = 15.00 # Cost per million reasoning tokens (USD)
+cache_read = 0.30 # Cost per million cached read tokens (USD)
+cache_write = 3.75 # Cost per million cached write tokens (USD)
+input_audio = 1.00 # Cost per million audio input tokens (USD)
+output_audio = 10.00 # Cost per million audio output tokens (USD)
+
+[limit]
+context = 400_000 # Maximum context window (tokens)
+input = 272_000 # Maximum input tokens
+output = 8_192 # Maximum output tokens
+
+[modalities]
+input = ["text", "image"] # Supported input modalities
+output = ["text"] # Supported output modalities
+
+[interleaved]
+field = "reasoning_content" # Name of the interleaved field "reasoning_content" or "reasoning_details"
+```
+
+#### 3a. Reuse Model Metadata with `base_model`
+
+For wrapper providers that mirror an existing model, prefer referencing the model-only metadata instead of duplicating provider-agnostic fields.
+
+Use `base_model` when the provider serves the same underlying model and only provider-specific fields differ.
+
+```toml
+base_model = "anthropic/claude-opus-4-6"
+
+[cost]
+input = 5.00
+output = 25.00
+```
+
+Rules:
+
+- `base_model` must point to a TOML file in `models/` using `/`.
+- You can override any top-level model field locally.
+- If you override a nested table like `[cost]`, `[limit]`, or `[modalities]`, include the full values needed for that table.
+- `base_model_omit` is optional and removes inherited model metadata fields after local overrides are merged. Use dot-path strings, for example `base_model_omit = ["limit.input"]`.
+- `id` still comes from the filename; do not add it to the TOML.
+
+Use `base_model` when the wrapper model is materially the same as the source model and only differs by provider-specific pricing, limits, modalities, provider request shape, or lifecycle flags.
+
+Sync and generator scripts should preserve existing `base_model` / `base_model_omit` fields when updating provider TOMLs. Do not use legacy `[extends]` tables.
+
+#### 4. Submit a Pull Request
+
+1. Fork this repo
+2. Create a new branch with your changes
+3. Add your provider and/or model files
+4. Open a PR with a clear description
+
+### Validation
+
+There's a GitHub Action that will automatically validate your submission against our schema to ensure:
+
+- All required fields are present
+- Data types are correct
+- Values are within acceptable ranges
+- TOML syntax is valid
+
+When moving existing provider fields into model metadata, compare generated output before and after the change:
+
+```bash
+bun run compare:migrations
+```
+
+This prints a diff for each changed model TOML so you can confirm the generated JSON only changed where you intended.
+
+### Schema Reference
+
+Models must conform to the following schema, as defined in `packages/core/src/schema.ts`.
+
+**Provider Schema:**
+
+- `name`: String - Display name of the provider
+- `npm`: String - AI SDK Package name
+- `env`: String[] - Environment variable keys used for auth
+- `doc`: String - Link to the provider's documentation
+- `api` _(optional)_: String - OpenAI-compatible API endpoint. Required only when using `@ai-sdk/openai-compatible` as the npm package
+
+**Model Schema:**
+
+- `name`: String — Display name of the model
+- `attachment`: Boolean — Supports file attachments
+- `reasoning`: Boolean — Supports reasoning / chain-of-thought
+- `tool_call`: Boolean - Supports tool calling
+- `structured_output` _(optional)_: Boolean — Supports structured output feature
+- `temperature` _(optional)_: Boolean — Supports temperature control
+- `knowledge` _(optional)_: String — Knowledge-cutoff date in `YYYY-MM` or `YYYY-MM-DD` format
+- `release_date`: String — First public release date in `YYYY-MM` or `YYYY-MM-DD`
+- `last_updated`: String — Most recent update date in `YYYY-MM` or `YYYY-MM-DD`
+- `open_weights`: Boolean - Indicate the model's trained weights are publicly available
+- `interleaved` _(optional)_: Boolean or Object — Supports interleaved reasoning. Use `true` for general support or an object with `field` to specify the format
+- `interleaved.field`: String — Name of the interleaved field (`"reasoning_content"` or `"reasoning_details"`)
+- `cost.input`: Number — Cost per million input tokens (USD)
+- `cost.output`: Number — Cost per million output tokens (USD)
+- `cost.reasoning` _(optional)_: Number — Cost per million reasoning tokens (USD)
+- `cost.cache_read` _(optional)_: Number — Cost per million cached read tokens (USD)
+- `cost.cache_write` _(optional)_: Number — Cost per million cached write tokens (USD)
+- `cost.input_audio` _(optional)_: Number — Cost per million audio input tokens, if billed separately (USD)
+- `cost.output_audio` _(optional)_: Number — Cost per million audio output tokens, if billed separately (USD)
+- `limit.context`: Number — Maximum context window (tokens)
+- `limit.input`: Number — Maximum input tokens
+- `limit.output`: Number — Maximum output tokens
+- `modalities.input`: Array of strings — Supported input modalities (e.g., ["text", "image", "audio", "video", "pdf"])
+- `modalities.output`: Array of strings — Supported output modalities (e.g., ["text"])
+- `status` _(optional)_: String — Supported status:
+ - `alpha` - Indicate the model is in alpha testing
+ - `beta` - Indicate the model is in beta testing
+ - `deprecated` - Indicate the model is no longer served by the provider's public API
+
+### Examples
+
+See existing providers in the `providers/` directory for reference:
+
+- `providers/anthropic/` - Anthropic Claude models
+- `providers/openai/` - OpenAI GPT models
+- `providers/google/` - Google Gemini models
+
+### Working on frontend
+
+Make sure you have [Bun](https://bun.sh/) installed.
+
+```bash
+$ bun install
+$ cd packages/web
+$ bun run dev
+```
+
+And it'll open the frontend at http://localhost:3000
+
+### Manual testing with opencode
+
+You can manually check provider changes with opencode by:
+
+```bash
+$ bun install
+$ cd packages/web
+$ bun run build
+$ OPENCODE_MODELS_PATH="dist/_api.json" opencode
+```
+
+### Questions?
+
+Open an issue if you need help or have questions about contributing.
+
+---
+
+Models.dev is created by the maintainers of [SST](https://sst.dev).
+
+**Join our community** [Discord](https://sst.dev/discord) | [YouTube](https://www.youtube.com/c/sst-dev) | [X.com](https://x.com/SST_dev)