Skip to content

fix(openrouter): surface router models in the picker and add Fusion - #46067

Closed
MaxFreedomPollard wants to merge 1 commit into
NousResearch:mainfrom
MaxFreedomPollard:feat/openrouter-fusion
Closed

fix(openrouter): surface router models in the picker and add Fusion#46067
MaxFreedomPollard wants to merge 1 commit into
NousResearch:mainfrom
MaxFreedomPollard:feat/openrouter-fusion

Conversation

@MaxFreedomPollard

@MaxFreedomPollard MaxFreedomPollard commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

Summary

Two changes, one root cause:

  1. Bug fix - OpenRouter router models are silently dropped from hermes model. openrouter/pareto-code ships today (curated, documented, tested) but never appears in the picker, because the tool-support filter reads a router's supported_parameters: [] as "no tool calling." This restores routers to the picker.
  2. New capability - adds openrouter/fusion as a built-in selectable model.

The two belong together because the feature is impossible without the fix: openrouter/fusion is itself a router, so without fixing the filter it would be added and then immediately hidden - dead on arrival. Fixing the filter is the minimum required for the addition to work at all, and the same fix incidentally unblocks the already-shipped pareto-code. Keeping it one change avoids landing a fix and then a feature that re-touches the same five lines.

After this, hermes model / /model (TUI/CLI) and the desktop model picker list both router entries (today openrouter/pareto-code is silently absent):

openrouter/pareto-code   auto-routes to cheapest coder meeting openrouter.min_coding_score
openrouter/fusion        multi-model panel + judge deliberation (priced as sum of all calls)

Because the picker reads the hosted catalog manifest at runtime, the entry reaches existing installs without an app update.

What Fusion is (OpenRouter docs)

A panel of 1-8 models answers in parallel (each with openrouter:web_search / openrouter:web_fetch), a judge compares them (it does not merge) and returns structured analysis - consensus, contradictions, blind spots - and a model writes the final answer. Useful when the cost of being wrong outweighs a few extra completions. Pricing, verbatim: "Because Fusion runs every panel member plus a judge call, your request is priced as the sum of those underlying completions rather than a single model."

Changes

  • hermes_cli/models.py: add _OPENROUTER_TOOL_CAPABLE_ROUTERS (openrouter/pareto-code, openrouter/fusion) and short-circuit _openrouter_model_supports_tools() to True for those ids. Explicit allowlist, not an openrouter/* glob, so a real non-router openrouter/* model lacking tools is still filtered. Add openrouter/fusion to the OPENROUTER_MODELS fallback snapshot.
  • website/static/api/model-catalog.json: add openrouter/fusion to the hosted curated manifest - the source the picker prefers over the in-repo snapshot, so both are required for the entry to surface.
  • tests/hermes_cli/test_models.py: router-survives-filter, allowlist-is-not-a-glob, fusion-curated, and an end-to-end picker test that keeps fusion when its catalog entry advertises supported_parameters: [].

Tests

Check Result
pytest tests/hermes_cli/test_models.py tests/hermes_cli/test_model_catalog.py tests/providers/test_provider_profiles.py 161 passed
ruff check hermes_cli/models.py clean
E2E: fetch_openrouter_models(force_refresh=True) against live /api/v1/models with the updated manifest openrouter/fusion and openrouter/pareto-code both present (both dropped before the fix)

Tested on macOS, Python 3.11.

Deliberately out of scope

A fusion config block (panel analysis_models + judge model) translated into the OpenRouter plugins array in OpenRouterProfile.build_extra_body - mirroring the existing pareto-router branch - is left out to keep this narrow: the bare alias already deliberates with server-side defaults, so wiring config now would be unused surface. A Fusion subsection for website/docs/integrations/providers.md (mirroring the Pareto Code section, with the verbatim pricing note) can be added here or as a follow-up - happy to include it in this PR if preferred.

Closes #46064

OpenRouter router aliases (openrouter/pareto-code, openrouter/fusion)
route each request to an underlying tool-capable model, so the alias
reports supported_parameters: [] in /api/v1/models. The picker's
tool-support filter treats that empty list as "no tool calling" and
silently drops every router - openrouter/pareto-code ships today but
never appears in `hermes model` for this reason.

Add an explicit router allowlist so known OpenRouter routers survive
the filter (not an openrouter/* glob, so a genuine non-router model
lacking tools is still filtered), and add openrouter/fusion to the
curated OpenRouter list (both the in-repo OPENROUTER_MODELS fallback
and the hosted model-catalog.json the picker prefers). The bare
openrouter/fusion alias works with no client config; OpenRouter applies
its Quality-preset panel/judge defaults server-side.
@liuhao1024

Copy link
Copy Markdown
Contributor

Competing PR note — OpenRouter Fusion model slug

This PR and #46094 (by teknium1) both add openrouter/fusion as a curated model slug with the _openrouter_model_supports_tools allowlist for router aliases that report supported_parameters: [].

Comparison:

Both approaches are correct. The key difference is that #46094's _ensure_openrouter_router_models() provides a fallback when the curated manifest is stale — this matters for newly-launched router slugs that haven't been added to the upstream manifest yet.

If only one lands, #46094 covers the manifest-lag edge case. If both land, the second will need a rebase since they modify the same functions.

@alt-glitch alt-glitch added type/bug Something isn't working comp/cli CLI entry point, hermes_cli/, setup wizard provider/openrouter OpenRouter aggregator P3 Low — cosmetic, nice to have labels Jun 14, 2026

@ajoslin ajoslin left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry my Hermes was looking at this pr and decided to review it smh

@teknium1

Copy link
Copy Markdown
Contributor

Closing in favor of #46094, which adds configurable Fusion presets as the canonical OpenRouter Fusion implementation. Thanks for the contribution — the Fusion direction is being consolidated there.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/cli CLI entry point, hermes_cli/, setup wizard P3 Low — cosmetic, nice to have provider/openrouter OpenRouter aggregator type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: OpenRouter router models (openrouter/pareto-code, openrouter/fusion) are silently dropped from hermes model by the tool-support filter

5 participants