Model routing prefers OpenRouter over direct providers

NousResearch/hermes-agent · cluster 10300

Data as of

Nothing open on GitHub. Fix merged in #10780. Check it covers your case.

The short answer

0open issues
0open PRs
5items grouped
Known?
Yes. 5 related items grouped here, 2 issues already closed.
Fix event
A fix was merged to main in PR #10780. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this partially resolved, deciding PR #10780. That is separate from the fix event.
Still open
Nothing open on GitHub.

These issues and PRs concern a bug where the /model command silently routes requests through OpenRouter instead of using configured direct providers. Fixes and feature work address provider detection and profile provider usage during model switching.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #10780 fix: stop /model from silently rerouting direct providers to OpenRouter

    merged to main

    files: hermes_cli/models.py

    Show the diff
    • hermes_cli/models.py
      @@ -1064,7 +1064,8 @@ def detect_provider_for_model(
                   break
       
           if direct_match:
      -        # Check if we have credentials for this provider
      +        # Check if we have credentials for this provider — env vars,
      +        # credential pool, or auth store entries.
               has_creds = False
               try:
                   from hermes_cli.auth import PROVIDER_REGISTRY
      @@ -1077,16 +1078,28 @@ def detect_provider_for_model(
                               break
               except Exception:
                   pass
      -
      -        if has_creds:
      -            return (direct_match, name)
      -
      -        # No direct creds — try to find this model on OpenRouter instead
      -        or_slug = _find_openrouter_slug(name)
      -        if or_slug:
      -            return ("openrouter", or_slug)
      -        # Still return the direct provider — credential resolution will
      -        # give a clear error rather than silently using the wrong provider
      +        # Also check credential pool and auth store — covers OAuth,
      +        # Claude Code tokens, and other non-env-var credentials (#10300).
      +        if not has_creds:
      +            try:
      +                from agent.credential_pool import load_pool
      +                pool = load_pool(direct_match)
      +                if pool.has_credentials():
      +                    has_creds = True
      +            except Exception:
      +                pass
      +        if not has_creds:
      +            try:
      +                from hermes_cli.auth import _load_auth_store
      +                store = _load_auth_store()
      +                if direct_match in store.get("providers", {}) or direct_match in store.get("credential_pool", {}):
      +                    has_creds = True
      +            except Exception:
      +                pass
      +
      +        # Always return the direct provider match.  If credentials are
      +        # missing, the client init will give a clear error rather than
      +        # silently routing through the wrong provider (#10300).
               return (direct_match, name)
       
           # --- Step 2: check OpenRouter catalog ---

2 PRs closed without merging

From the close comments: done elsewhere 1 · other 1

  • #10466 fix(model): prefer direct providers over OpenRouter fallback · other → #10780
  • #14584 fix(cli): use profile providers during model switch · done elsewhere
Closed issues · 2
  • Closed#10300/model silently routes to OpenRouter for direct providers (minimax-cn, zai, etc.)
  • Closed#14554[Bug]: Multi Model for Profile don't work
How this cluster was grouped
  • Link evidence (partly structural links): some members are connected by structural evidence (shared changed files, or a closing/superseded reference); the rest are joined by an automated relevance judgement over their text.
  • Members outside that structural core may belong to a different underlying problem.
  • Pairwise link density 0.34: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. 1.00 means every pair is linked.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Merged PRs
#10780
Closed issues
2
Attempts
2 PRs closed without merging
Fix link checked
16 Apr 2026. This confirmation is old and may be out of date (a revert or reopen would not have invalidated it here); re-verify.

For your agent

The same facts, typed.