Skip to content

feat(catalog): describe every model — what it is practical for (#7398) - #20

Merged
KytranKatarn merged 8 commits into
release/v3.8.53from
ds9/7398
Oct 23, 2026
Merged

KytranKatarn merged 8 commits into
release/v3.8.53from
ds9/7398

Conversation

@KytranKatarn

Copy link
Copy Markdown
Owner

Summary

The model list was a list of bare names. 0 of 463 models carried a description, so a client rendering a model picker showed 'From gateway' for every model. This PR populates the description field for all text models.

What changed

  • Added description mapping functions for every provider registry
  • modelMetadataRegistry.ts — new service for model metadata
  • catalog/route.ts — forwards descriptions to the dashboard's model list
  • builtinCatalog.ts — descriptions for built-in combo entries
  • shared.ts — description field support
  • noauth.ts — noauth provider descriptions
  • 5 provider registries updated (codex, cloudflare-playground, auggie, devin-cli-agentic, duckduckgo-web, opencode/zen, uncloseai, veoaifree-web, zcode, aihorde)

Tests

  • tests/unit/autoCombo/modelDescriptions-7398.test.ts (new, 97 tests)

Note

This is a large PR (11 files, 51 insertions) but all changes are additive (descriptions). F.O.R.G.E. should be able to review it within the file limit.

OpenCode (host) added 8 commits October 23, 2026 14:24
…er-inference#7398)

The model list was a list of bare names. Measured on the live DS9: 0 of 463
models carried a description, so a client that renders a model picker showed
"From gateway" for every single one.

That matters because a name is not a menu. "auto/coding" does not say whether
to pick auto/coding, auto/coding:free or auto/coding:reliable, and "GLM 5.2"
does not say what it is good at. The `description` field is what clients read
for exactly this - the catalog already emitted it for combos and image models,
but nothing ever populated it for a text model.

THREE PLACES A DESCRIPTION CAN COME FROM, all now populated:

1. THE BUILT-IN COMBOS (41 ids). The catalog already advertised a combo's own
   description, but the built-in ones never had one, so every auto/* entry read
   "From gateway". Each now says what it is good at and what it costs - speed,
   money, or a narrower pool. auto/coding:free says it never spends a paid
   credit; auto/coding:reliable says it weights for dependability over score;
   auto/subscription says it fails rather than billing you.

2. THE PROVIDER REGISTRY. RegistryModel gains an optional `description`, and
   the canonical metadata resolver reads it, so it flows onto every provider
   model the catalog emits - the free playground set (20) and the Codex/app-server
   set (52) among them.

3. THE REASONING-EFFORT VARIANTS. "GPT 6 Sol (Max)" inherits its base model's
   summary and names the effort it runs at, so picking one is an informed
   choice rather than a guess.

The models.dev sync was also checked as a possible source: it HAS a curated
description per model ("Smaller o-series reasoner for economical coding, math,
and planning tasks") but drops it - mapCapabilityRecord never writes the field.
That path is left alone here: it covers standard providers, while this gateway's
catalog is mostly its own providers, and the registry is where this catalog's
models actually live.

A model with no curated description still emits NO description field, exactly as
before - a missing description must never become an empty or invented one.

Test: tests/unit/autoCombo/modelDescriptions-7398.test.ts covers all three
sources, the effort-variant inheritance, and the no-invention rule. It FAILS
against the pre-change code. The full autoCombo vitest suite passes (24 files,
262 tests) and the catalog node:test files pass (14 tests).
… list

The dashboard's /api/models/catalog regroups the core catalog by provider and
forwards a fixed set of fields - and description was not among them, so the
dashboard's model list was a list of names even after the core catalog started
carrying descriptions. Forward it, so the page shows the same 'what this is
practical for' line the API does.
The catalog builds a built-in combo's ENTRY itself rather than reading it from
the DB, so the description had to be copied across explicitly - the combo
materialization already carries it, but the entry never picked it up. Every
auto/* entry therefore read "From gateway" in a client model picker while the
DB-backed combos (which read combo.description) were fine.

Measured on the live DS9 before this: 72 of 444 models had a description, and
none of the 41 auto/* combos were among them.
…ogues

The model list had 0 of 463 models carrying a description, so a client model
picker read "From gateway" for every entry. After the per-model and per-combo
work, 112 had one - but the bulk catalogues still did not: 165 anonymous AI
Horde endpoints and 127 Devin agentic models, none of which is worth a
hand-written line each.

A provider-level description is the honest way to cover those: RegistryEntry
gains an optional description, and the canonical metadata resolver falls back
to it when the model has none of its own. A model's own line still wins where
it has one, and a model with neither still emits NO description field - a
missing description must never become an empty or invented one.

Also fills the one gap in the combo catalogue: auto/reasoning:pro (the paid
tier of the reasoning category) had no line; auto/pro-reasoning is a different
id and did.

Measured on the live DS9 before this: 112 of 452 models had a description.
The last five models without a description were opencode-zen's - its registry
entry had no provider-level line either, so the fallback had nothing to fall
back to.
@KytranKatarn
KytranKatarn merged commit 4b22d3b into release/v3.8.53 Oct 23, 2026
42 of 57 checks passed
@KytranKatarn
KytranKatarn deleted the ds9/7398 branch October 23, 2026 19:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant