Jonathan Feller 16354461ff feat: add Impossibl provider (#3390)
* Add Impossibl provider

Impossibl (https://impossibl.com) is an OpenAI-compatible AI gateway,
served via @ai-sdk/openai-compatible at https://api.impossibl.com/v1.

Adds provider.toml, logo, and 76 model entries generated from the live
api.impossibl.com/v1/models catalog. Each entry inherits metadata via
base_model and carries Impossibl's serving price (USD / 1M tokens); no
limit/modalities overrides (the gateway serves the base metadata's).

reasoning_options are effort-only (the OpenAI-compatible /v1/chat/completions
surface exposes only reasoning_effort), with per-model value subsets taken
from each model's canonical metadata intersected with the gateway's accepted
set, or [] where the model has no effort control on this surface.

14 served models are omitted for now — models.dev has no base metadata to
inherit from for them yet.

* Do not assert per-model reasoning_options for Impossibl

The published effort ladders were derived from which values the live gateway
accepted with HTTP 200. That measures the request validator of whichever
upstream happened to serve the probe, not the model: Fireworks validates against
a generic OpenAI-style enum, Azure Foundry ignores the field entirely, and the
gateway forwards reasoning_effort verbatim without per-model mapping. The same
GLM-5.2 therefore read as a five-rung ladder on one route and as no control at
all on another.

Replaces every asserted set with an empty one plus the reason, matching how
other gateway providers document an unverifiable control surface. Entries whose
base model has no reasoning at all keep no key.

* Give the Inkling entry its own served limits

models/thinkingmachines/inkling.toml omits limit.output because the served
output cap varies by host (16K on NVIDIA, 32K on Baseten, 256K on Vercel, 1M on
OpenRouter), so every provider entry supplies its own. This one did not, which
fails validation now that the base model has changed on dev.

Impossibl serves Inkling through Thinking Machines' own Tinker API, so their
published served limits apply verbatim: 65_536 both ways, matching the context
window the gateway itself records for this route.

* Move in-file rationale into the leading comment block

AGENTS.md: the daily model sync re-serializes provider TOMLs and discards every
comment except a leading header block, so rationale placed between keys is
silently deleted on the next sync. The reasoning_options justification sat
between base_model and reasoning_options in all 68 files, and the Inkling limit
note sat above [limit]; both would have been lost.

Also recites the Inkling limits against the gateway catalog and Tinker's own
docs rather than an in-repo path, since that path differs between this branch
and dev.

* Explain the Inkling route instead of reusing the generic rationale

Inkling is the one Impossibl entry with a fixed single upstream, so the generic
"whichever upstream serves the model" rationale did not fit it.

limit: the 64K window now cites the first-party Tinker entry in this repo, which
publishes the same 65_536/65_536 limits and the same 1.87/4.68/0.374 pricing.
Tinker's 256K window is a separately priced tier (Inkling:peft:262144, 3.74/9.36),
not this route.

reasoning_options: Tinker documents its effort control only on the
Anthropic-compatible surface (output_config.effort, thinking.type). Impossibl
reaches Tinker over the OpenAI-compatible endpoint, for which no control is
documented, so none is asserted — the same basis on which providers/nvidia
publishes an empty set.

* Match the Inkling route modalities to the first-party Tinker entry

The entry already aligns limits and cost with providers/thinkingmachines/models/
thinkingmachines/Inkling.toml on the grounds that it is the same Tinker tier, but
still inherited the base model's audio input. Tinker serves this route as
text+image, so advertising audio implied an input the route may reject.

* fix: derive reasoning_options from verified per-route behavior, correct pricing

reasoning_options was `[]` on all 68 reasoning entries; a maintainer was right that this
is wrong for essentially all of them. 59 of 68 now publish a verified control.

These are generated from our gateway's model registry rather than hand-authored, and a
`--check` mode fails on drift. A control is published only where the model's declared shape
and its verified REACH agree: reach is established by making the upstream do the rejecting,
so a 502/422 carrying its own error text proves the field was forwarded rather than dropped.
Where our enum and the upstream's coincide and no rejection is possible, reach is shown by
billed effect instead. Acceptance alone is never used as evidence.

Every verdict is taken on the route that actually serves the model, confirmed per attempt in
our request log. That distinction is load-bearing: `zai/glm-5.2` is answered by Azure Foundry
(which ignores reasoning fields) while its seven siblings are answered by Z.ai, so one GLM
entry is `[]` and seven publish a toggle. An earlier draft had this backwards, having
measured Z.ai's own API rather than the route we use.

Also corrects three classes of pricing error found by diffing every entry against the
catalog the PR cites:
- `gpt-5.6-luna` was published at 5x the billed rate; `gpt-5.6-terra` carried a copied
  `gpt-5.4` cost block.
- `gpt-5.6-sol` omitted `cache_write` entirely.
- 11 entries published flat pricing for models the catalog bills in a higher bracket above a
  per-model input threshold, understating long-context requests by up to 2x.

Provider `doc` now points at the public models-and-pricing listing rather than the site root,
and the shared rationale lives in one leading comment block on provider.toml.

* fix: fireworks/glm-5.2 has no verified effort control

Fireworks does validate `reasoning_effort` for this model id — it enumerates its own enum in
a 502 for `minimal` — so the value genuinely reaches the upstream. But validation is not a
control, and this entry was published on that basis alone while Z.ai and Qwen were held to a
stricter standard.

Measured per rung through the gateway on a short-answer prompt, where output length is the
reasoning signal: output swings 121-275 tokens WITHIN the same rung, with no ordering across
rungs and no reasoning content at any level. No rung is distinguishable, so there is nothing
meaningful to advertise.

Both `glm-5.2` entries are now `[]`, for opposite reasons: the Fireworks route validates but
has no effect, and the Z.ai-namespaced route is served by Azure Foundry, which ignores the
field entirely.

* chore: keep the provider files data-only

The generated header on provider.toml was carrying material that has no business in another
project's repository: our internal source-file and tooling names, which upstream serves which
model, raw probe transcripts, and — worst — a description of an unfixed defect in our own
product. None of that is data about the models.

Evidence for the published values belongs in the PR conversation, where a reviewer can weigh
it, not in a committed data file. The audit guide says the same: "Put citations in the PR
body, not TOML comments."

Per-option `# API:` comments stay, trimmed to the bare request payload, matching the example
AGENTS.md gives for exactly this purpose. They document the public request syntax a caller
sends, which is not obvious for the controls that are not OpenAI's `reasoning_effort`.

* chore: justify the Inkling overrides from our own catalog, not from routing

The limit and modality overrides were explained by naming the upstream that serves this
model. That is routing detail, and it does not belong in another project's repository.

Our own public catalog reports this model's served context window (65_536), its input
modalities (text+image) and its prices directly, so it justifies every overridden value on
its own terms — the base model's 1_048_576 window and audio input are simply not what is
served here. No upstream needs naming for that to be checkable.

* Revert "chore: justify the Inkling overrides from our own catalog, not from routing"

This reverts commit 71598cbd14e7622735f1c84ded3dafccaab9dc20.
2026-08-02 21:02:50 -05:00
2026-07-03 14:10:05 +02:00
2026-07-06 13:13:11 +02:00
2025-07-09 19:11:53 -04:00
2025-06-17 19:52:16 -04:00
2025-06-17 19:52:16 -04:00
2026-06-02 14:24:55 -04:00
2025-06-17 19:52:16 -04:00

Models.dev logo


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.

API

You can access this data through an API.

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.

Provider-agnostic model metadata is available separately:

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:

curl https://models.dev/catalog.json

Logos

Provider logos are available as SVG files:

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:

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:

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:

    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 doesnt publish an npm package but exposes an OpenAI-compatible endpoint, set the npm field accordingly and include the base URL:

    npm = "@ai-sdk/openai-compatible" # Use OpenAI-compatible SDK
    api = "https://api.example.com/v1" # Required with openai-compatible
    

2. Add a Logo (required for new providers)

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 xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
  <!-- Logo paths here -->
</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.

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  - models 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.

base_model = "anthropic/claude-opus-4-6"
# Match lab/peer controls for this model (not a stripped L/M/H guess)
reasoning_options = [
  { type = "effort", values = ["low", "medium", "high", "max"] },
  { type = "budget_tokens", min = 1_024 },
]

[cost]
input = 5.00
output = 25.00

Rules:

  • base_model must point to a TOML file in models/ using <provider>/<model-id>.
  • Override-only: after base_model, write only provider-specific fields and values that differ from the base. Do not restate the same description, structured_output, modalities, tool_call, dates, etc.
  • You may override any top-level model field when the provider actually differs.
  • If you override a nested table like [cost], [limit], or [modalities], include the full values needed for that table (arrays/primitives replace; plain objects deep-merge).
  • 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"].
  • Provider-specific fields (cost, reasoning_options, interleaved, status, provider, experimental) belong on the provider model when needed.
  • id still comes from the filename; do not add it to the TOML.

Reasoning options (short): classify first-party lab vs multi-model relay (not by npm). Copy the underlying models controls from the lab entry and same-surface peers — often low/medium/high on GPT-style relays, but DeepSeek V4 is toggle+high/max, etc. Do not use [] from uncertainty on relays. Full policy: AGENTS.md.

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:

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 installed.

$ 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:

$ 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.

Join our community Discord | YouTube | X.com

S
Description
开源 AI 模型数据库|GitHub 镜像 6.6k · 🍴 1.5k
https://github.com/anomalyco/models.dev Readme MIT 20 MiB
Languages
TypeScript 95%
CSS 2.4%
Shell 2.4%
HTML 0.2%