feat(models): persist Nous recommended-models to disk; fall back on Portal failure - #42628
Merged
Conversation
…ortal failure
The Portal's /api/nous/recommended-models endpoint is the source of truth for
which models are free/paid right now, but its result was cached in-process
only. When the live fetch failed (network, parse, non-2xx), the function
returned {} and the model picker silently dropped the free/paid
recommendations — free models would vanish with no indication anything went
wrong.
Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json:
a successful live fetch is persisted as last-known-good, and a failed fetch
with an empty in-process cache falls back to the disk copy instead of {}.
Self-heals on the next successful fetch. With no disk copy, still degrades to
{} (callers already handle that). Keyed by portal base URL so staging/prod
don't collide.
E2E: live fetch writes disk; simulated Portal failure returns the cached free
models from disk; no-disk + failure returns {}.
Contributor
🔎 Lint report:
|
changman
pushed a commit
to changman/hermes-agent
that referenced
this pull request
Jun 10, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
alt-glitch
pushed a commit
that referenced
this pull request
Jun 14, 2026
…ortal failure (#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
ether-btc
pushed a commit
to ether-btc/hermes-agent
that referenced
this pull request
Jun 15, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
xyshanren
pushed a commit
to xyshanren/hermes-agent-cn
that referenced
this pull request
Jun 17, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}. (cherry picked from commit e687292)
davidgut1982
pushed a commit
to davidgut1982/hermes-agent
that referenced
this pull request
Jun 17, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
T02200059
pushed a commit
to T02200059/hermes-agent
that referenced
this pull request
Jun 18, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
1 task
waefrebeorn
pushed a commit
to waefrebeorn/slermes
that referenced
this pull request
Jul 2, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
santhreal
pushed a commit
to santhreal/hermes-agent
that referenced
this pull request
Jul 13, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
donbowman
pushed a commit
to donbowman/hermes-agent
that referenced
this pull request
Jul 13, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
Gravezzz
pushed a commit
to Gravezzz/hermes-agent
that referenced
this pull request
Jul 21, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
leewenjie
pushed a commit
to leewenjie/hermes-agent
that referenced
this pull request
Aug 7, 2026
…ortal failure (NousResearch#42628) The Portal's /api/nous/recommended-models endpoint is the source of truth for which models are free/paid right now, but its result was cached in-process only. When the live fetch failed (network, parse, non-2xx), the function returned {} and the model picker silently dropped the free/paid recommendations — free models would vanish with no indication anything went wrong. Add a per-base disk cache at $HERMES_HOME/cache/nous_recommended_cache.json: a successful live fetch is persisted as last-known-good, and a failed fetch with an empty in-process cache falls back to the disk copy instead of {}. Self-heals on the next successful fetch. With no disk copy, still degrades to {} (callers already handle that). Keyed by portal base URL so staging/prod don't collide. E2E: live fetch writes disk; simulated Portal failure returns the cached free models from disk; no-disk + failure returns {}.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
A transient Nous Portal outage no longer drops the free/paid model recommendations from the picker. The recommended-models payload is now persisted to disk as last-known-good and served on fetch failure instead of an empty result.
Root cause:
/api/nous/recommended-modelsis the source of truth for what's free/paid right now, but the result was cached in-process only. On any fetch failure (network, parse, non-2xx) the function returned{}, so the picker silently dropped the recommendations — free models would vanish with no indication anything went wrong.Changes
hermes_cli/models.py:_read_nous_recommended_disk()/_write_nous_recommended_disk()— per-portal-base disk cache at$HERMES_HOME/cache/nous_recommended_cache.json(keyed by base URL so staging/prod don't collide; atomic write).fetch_nous_recommended_models()— a successful live fetch refreshes both the in-process and disk caches; a failed fetch with an empty in-process cache falls back to the disk copy. With no disk copy it still degrades to{}(callers already handle that). Self-heals on the next successful fetch.Validation
E2E with an isolated
HERMES_HOME+ mockedurlopen:stepfun/step-3.7-flash:free,nvidia/nemotron-3-ultra:free) instead of{}{}test_model_catalog.py+test_model_validation.py105 passed;test_models.pyrecommended/nous/portal/free 49 passedComplements #42614 (which seeds the static catalog from the checkout on update); this hardens the live dynamic recommendations source.
Infographic