Model comparison ยท 2026-08-29

The models.dev LLMTR provider entry and metadata sync

A look at the LLMTR provider entry in the models.dev open metadata database, the model files beneath it, and where those records have drifted from the live catalog, including a retired id that still reads as selectable.

LLMTR metadata comparison diagram showing the relationship between the models.dev provider entry, its model files and the tools that read them.

models.dev is a metadata database, not an endpoint

models.dev is an open metadata database that holds model ids and capabilities in TOML files. It accepts no requests, produces no responses and carries no keys. Agent tools and clients read the model list, context limits and capability flags from it, then present them to the user as options. It is a discovery source, not a runtime component.

That distinction has a practical consequence. Without an entry a provider does not become unusable; a user who types the id by hand still gets a result. What is lost without an entry is discovery: the model never appears on the selection screen, so nobody learns it exists.

Two discovery paths need to be told apart. Tools that read from the metadata database see the list once an entry is merged, and opencode belongs to that group. Tools that fetch the gateway model endpoint at their own startup are independent of the database and wait for no update. Both paths use the same canonical ids; the only difference is when the list refreshes.

The provider entry is five fields

The entry sits on the add-llmtr-provider branch of the knowhycodata/models.dev repository. The provider definition is the provider file under providers/llmtr, and it consists of five fields. Do not let the brevity mislead: those five lines together decide which client the tool installs, where it reads the key from and where it sends requests.

The display name field is the label on the selection screen. The environment field tells the tool which variable holds the key, and it matches the name used by tools that ship LLMTR as a built-in provider, so a user moving between the two paths never has to rename a variable.

The package field does the most work: because an OpenAI-compatible client is selected, no tool has to write an LLMTR-specific adapter, and the existing client is reused with a different base URL. The documentation field points a user at the docs, and the API field at the gateway root.

The provider definition under providers/llmtr

name = "LLMTR"
env = ["LLMTR_API_KEY"]
npm = "@ai-sdk/openai-compatible"
doc = "https://llmtr.com/docs"
api = "https://llmtr.com/v1"

Drift between the model files and the live catalog

The same fork holds six model files under providers/llmtr/models: gemma-4, magibu-11b-v8, medgemma-4b, qwen3-6-35b, sincap and trendyol-7b. The catalog carries more Turkey-hosted rows than that today, and one of the six records belongs to a retired id.

The drift runs in two directions and each direction causes a different problem. An id present in the metadata but retired in the catalog steers a user toward a choice that cannot work. Rows live in the catalog with no metadata record at all never appear on the selection screen, so an existing capability goes unused. The table below shows the current state row by row.

llmtr records in the models.dev fork against catalog status, 29 August 2026
Model idMetadata recordCatalog status
llmtr/gemma-4PresentPublic and live
llmtr/qwen3-6-35bPresentPublic and live
llmtr/medgemma-4bPresentWithdrawn on 21 August 2026
llmtr/magibu-11b-v8PresentPublic and live
llmtr/trendyol-7bPresentPublic and live
llmtr/sincapPresentRetired
llmtr/trendyol-asure-12bAbsentPublic and live
llmtr/muse-glimmer-30b-trAbsentPublic and live
llmtr/qwen3-5-4bAbsentPublic and live
llmtr/ornith-1-35bAbsent, withdrawnWithdrawn on 21 August 2026
llmtr/embeddinggemma-300mAbsentPublic and live, embeddings endpoint

The retired record problem: llmtr/sincap

The llmtr/sincap id is retired in the catalog today. LLMTR neither deletes nor hides a retired model: the row stays visible and its retired state is stated on its own page. Anyone searching for the id can therefore see what the row was, when it was retired and why it no longer answers. An id that vanished silently would make after-the-fact debugging impossible.

On the metadata side, however, the record still reads as a selectable model. The result is a chain failure: a tool that builds its list from the database offers a retired id, the user picks it, and the request comes back refused with an explanation once it reaches the gateway. The refusal is correct; what is wrong is that the option entered the list at all. The proper fix is to mark the record retired in the metadata too.

This row has no defined successor, because the catalog holds no Turkey-hosted equivalent doing the same job. Not auto-forwarding is deliberate: silently switching to a model that behaves differently and bills differently misinforms a caller whose code still names the old id. For general text and tool-calling work, llmtr/gemma-4 and llmtr/qwen3-6-35b are live options, and the caller who knows the workload decides which fits.

  • A retired id stays visible in the catalog, but requests are not accepted.
  • Until the metadata record is marked retired, tools keep offering that id.
  • For rows without a successor the caller picks the replacement; nothing forwards automatically.
  • The gap between a retirement date and a metadata update reaches the user directly as an error.

Capability flags decide the outcome of a selection

A metadata record carries more than an id. Tool calling, image input and context limits live there too, and agent tools use those flags to decide whether a model enters the list. A correct id with a wrong flag still produces a wrong selection.

The damage runs both ways. A model that genuinely calls tools looks unfit for agent work because the flag is missing and drops off the list; a model that refuses tool calls gets recommended because the flag is wrong and stalls at the first tool request. Flags therefore have to be measured per model. Two rows in the same family need not share a capability, and the table below shows exactly that among the Turkey-hosted rows.

Capabilities of the live Turkey-hosted rows, 29 August 2026
Model idTool callingImage input
llmtr/gemma-4YesYes
llmtr/qwen3-6-35bYesNo
llmtr/qwen3-5-4bYesNo
llmtr/muse-glimmer-30b-trYesYes
llmtr/trendyol-asure-12bNoYes
llmtr/magibu-11b-v8NoNo

Keeping the entry in sync with the catalog

The LLMTR model endpoint is readable without a key. Producing or verifying a metadata record needs no credentials, so the sync check reduces to a small script that can run continuously.

The comparison yields three sets. Ids found only in the metadata are retired or mistaken records. Ids found only in the live list are missing records. Ids present in both but differing in their fields are flag and limit drift, and that is the most insidious group, because the id looks right and the difference goes unnoticed.

Do not treat the check as a one-off. New rows and retirement decisions can land between two metadata updates, so the live list is always the reference. Tools reading the record wait for a merge while tools fetching live see the same change immediately; the sync check is what keeps both groups looking at the same ids.

  • Mark or remove ids that exist only in the metadata.
  • Add records for rows that exist only in the live list.
  • Check context limits and capability flags against a live response.
  • Store the comparison with a timestamp so each update's change set stays readable.

Compare metadata records against the keyless catalog read

# The catalog is readable without a key, so no credential is needed
curl -s https://llmtr.com/v1/models

# Only the ids of the Turkey-hosted rows
curl -s https://llmtr.com/v1/models | grep -o '"id":"llmtr/[^"]*"'

# Record files in the metadata fork
ls providers/llmtr/models

Frequently asked questions

Can I use LLMTR models without a models.dev entry?

You can. The database is a discovery source rather than a runtime component. Type the canonical id by hand and the request works normally. What you lose without an entry is the tool listing the model on its selection screen.

What happens if I call a retired id?

The gateway refuses the request with an explanation. That is not a network error and retrying will not clear it. The catalog row stays visible so the id and the reason it no longer answers remain readable. For rows without a defined successor you choose the replacement yourself.

What does the package field in the entry do?

It decides which client the tool installs. Because an OpenAI-compatible client is selected, no tool needs an LLMTR-specific adapter; the existing client is reused with a different base URL. Get this field wrong and a tool can install the provider but cannot send requests.

What follows from a wrong capability flag?

Damage in both directions. A model that can call tools looks unfit and drops off the list because the flag is missing, while a model that cannot gets recommended and stalls at the first tool request. This is why flags must be measured per model rather than copied across a family.

Related posts