You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
After updating Hermes Desktop, a user's named Mixture of Agents presets (e.g. "Free MOA Gemini build") disappeared from both the chat model-picker pill and the Settings > Models provider dropdown. The preset config (the moa: block, with default_preset: Free MOA Gemini build) was never deleted — the desktop model pickers simply stopped listing the MoA virtual provider.
Steps to Reproduce
Configure a MoA preset (Settings > Models > Configure Mixture of Agents presets).
Update Hermes Desktop (the regression landed in #37a4cf900, merged Jul 2).
Open the chat model-picker pill and type "moa".
Observe: only ambient providers appear (e.g. KILO GATEWAY -> Hy3:Free High); no "MOA PRESETS" section.
Open Settings > Models provider dropdown: "Mixture of Agents" is missing from the list.
Expected Behavior
The MoA virtual provider and its named presets should remain selectable in explicit-only desktop pickers, the same way user-defined providers do — MoA presets are user-authored config, not ambient auto-seeded credentials.
Actual Behavior
With explicit_only=True (the default for desktop chat pickers since #37a4cf900), _filter_explicit_provider_rows hard-drops the moa virtual provider:
ifslug=="moa":
# MoA is a virtual routing mode, not an independently configured provider.# Hide it from explicit-only pickers unless it is the current provider.continue
So build_models_payload(ctx, explicit_only=True) returns no moa row, and the chat pill + Settings panel both lose MoA.
Affected Component
Configuration (config.yaml, .env, hermes setup)
Other (Desktop model picker UI)
Messaging Platform (if gateway-related)
N/A (CLI only)
Debug Report
Not pasted — running hermes debug share would upload the user's personal config and logs to a public paste service, so we are intentionally not including it. The bug is fully reproduced and fixed from source; see Root Cause Analysis and Proposed Fix below.
Operating System
macOS 26.5.1 (Desktop)
Python Version
3.11.15
Hermes Version
0.18.2
Root Cause Analysis
hermes_cli/inventory.py, function _filter_explicit_provider_rows. When slug == "moa", the row is unconditionally skipped (continue). This was added by #37a4cf900 along with the explicit_only flag, whose stated intent was to hide ambient / auto-seeded credentials (e.g. GitHub CLI -> Copilot) from desktop chat pickers. MoA presets are explicitly user-authored config, so they should be kept — exactly like is_user_defined provider rows are kept earlier in the same loop.
The chat pill and Settings panel both consume /api/model/options, which calls build_models_payload(..., explicit_only=True) (web_server.py get_model_options), so both surfaces regressed together.
Proposed Fix
In _filter_explicit_provider_rows, keep the moa row instead of skipping it:
ifslug=="moa":
# MoA presets are user-authored config, so keep them in explicit-only pickers.kept.append(row)
continue
Regressing PR: #37a4cf900 ("fix: limit desktop model pickers to explicit providers", merged Jul 2). Its intent was legitimate — it closed two reported bugs:
[Bug]: Stale credential pool entries cause removed providers to persist in model picker #55790 — a removed provider's API key stayed in the picker because a stale auth.json credential-pool env: entry survived after the env var was deleted. The PR hardened is_provider_explicitly_configured to count only explicit pool sources (manual/device-code/PKCE) and env: entries only when the var still resolves now.
The MoA break is a category error in that filter: MoA presets are user-authored config (named presets from the MoA settings panel), but they have no API key / provider-specific env, so is_provider_explicitly_configured("moa") is always False. The filter treated MoA like borrowed gh_cli credentials and dropped it. The fix keeps the row (the moa row is only ever produced by _moa_provider_row when presets exist, so there is no ambient-clutter risk). Fix: PR fix(moa): keep MoA presets in explicit-only desktop pickers (#61889) #61887.
Bug Description
After updating Hermes Desktop, a user's named Mixture of Agents presets (e.g. "Free MOA Gemini build") disappeared from both the chat model-picker pill and the Settings > Models provider dropdown. The preset config (the
moa:block, withdefault_preset: Free MOA Gemini build) was never deleted — the desktop model pickers simply stopped listing the MoA virtual provider.Steps to Reproduce
KILO GATEWAY -> Hy3:Free High); no "MOA PRESETS" section.Expected Behavior
The MoA virtual provider and its named presets should remain selectable in explicit-only desktop pickers, the same way user-defined providers do — MoA presets are user-authored config, not ambient auto-seeded credentials.
Actual Behavior
With
explicit_only=True(the default for desktop chat pickers since #37a4cf900),_filter_explicit_provider_rowshard-drops themoavirtual provider:So
build_models_payload(ctx, explicit_only=True)returns nomoarow, and the chat pill + Settings panel both lose MoA.Affected Component
Messaging Platform (if gateway-related)
Debug Report
Not pasted — running
hermes debug sharewould upload the user's personal config and logs to a public paste service, so we are intentionally not including it. The bug is fully reproduced and fixed from source; see Root Cause Analysis and Proposed Fix below.Operating System
macOS 26.5.1 (Desktop)
Python Version
3.11.15
Hermes Version
0.18.2
Root Cause Analysis
hermes_cli/inventory.py, function_filter_explicit_provider_rows. Whenslug == "moa", the row is unconditionally skipped (continue). This was added by #37a4cf900 along with theexplicit_onlyflag, whose stated intent was to hide ambient / auto-seeded credentials (e.g. GitHub CLI -> Copilot) from desktop chat pickers. MoA presets are explicitly user-authored config, so they should be kept — exactly likeis_user_definedprovider rows are kept earlier in the same loop.The chat pill and Settings panel both consume
/api/model/options, which callsbuild_models_payload(..., explicit_only=True)(web_server.pyget_model_options), so both surfaces regressed together.Proposed Fix
In
_filter_explicit_provider_rows, keep themoarow instead of skipping it:A fix + regression test is ready as PR #61887.
Are you willing to submit a PR for this?
References
gh_cli, residual Nous creds) as if explicitly configured.auth.jsoncredential-poolenv:entry survived after the env var was deleted. The PR hardenedis_provider_explicitly_configuredto count only explicit pool sources (manual/device-code/PKCE) andenv:entries only when the var still resolves now.is_provider_explicitly_configured("moa")is alwaysFalse. The filter treated MoA like borrowedgh_clicredentials and dropped it. The fix keeps the row (themoarow is only ever produced by_moa_provider_rowwhen presets exist, so there is no ambient-clutter risk). Fix: PR fix(moa): keep MoA presets in explicit-only desktop pickers (#61889) #61887.