fix(picker): keep tokenizer Router models in the OpenRouter list - #126030
djsanchezsuarez wants to merge 2 commits into
Conversation
_openrouter_model_supports_tools dropped every model whose supported_parameters was an empty list. Router models (architecture.tokenizer == "Router", e.g. typesafe/jev-router) hand each request to a tool-capable backend instead of calling tools themselves, so they legitimately advertise no tools and were silently invisible in the model picker even though the live catalog lists them. Only the router tokenizer is exempted; a non-router model without "tools" is still dropped.
Adds the router SKU to the in-repo fallback list and the shipped manifest so it survives a manifest that omits it; without a catalog entry the picker intersects the curated list with the live /v1/models response and the model never appears.
|
Cross-link from the weekly Kilo Code PR scout: Kilo landed the general form of this fix as Kilo-Org/kilocode#14592 — a missing or empty Live evidence gathered today against Also related: #82767 (Aug) implements the same empty-list-permissive rule and replaces |
Symptom
Models whose OpenRouter
architecture.tokenizeris"Router"(e.g.typesafe/jev-router) never appear in the model picker, althoughhttps://openrouter.ai/api/v1/modelslists them and their endpoints work.Exact line
hermes_cli/models.py::_openrouter_model_supports_tools(the Kilo #9068 port):A router SKU hands each request to a tool-capable backend instead of calling tools itself, so OpenRouter reports
"supported_parameters": []for it. An explicit empty list is the one shape this helper treats as "no tools" — intentional, an image-only model advertising no tools must stay hidden — so router models are dropped from the curated ∩ live intersection and stay invisible in every picker surface (hermes model,/model, the desktop Models page).Change
Exempt only
architecture.tokenizer == "Router". Every other tokenizer keeps the existing rule.test_empty_supported_parameters_list_drops_modelstill passesSecond commit (droppable)
The curated manifest is still the outer gate: the picker intersects the manifest with the live catalog, so a model missing from the manifest can never surface no matter what the filter does. The second commit adds
typesafe/jev-routertomodels_catalog_static.pyandwebsite/static/api/model-catalog.json. Drop it if you would rather not curate that SKU — the code fix stands alone.Verification
End-to-end on a live install: with a catalog that lists the model, the picker payload's
openrouterrow contains it (build_model_options_payload(load_picker_context())); without the change it does not.