Skip to content

fix(container): update image nousresearch/hermes-agent (v2026.8.16 ➔ v2026.8.16.2) - #4519

Merged
Tanguille merged 3 commits into
mainfrom
renovate/nousresearch-hermes-agent-2026.x
Aug 17, 2026
Merged

fix(container): update image nousresearch/hermes-agent (v2026.8.16 ➔ v2026.8.16.2)#4519
Tanguille merged 3 commits into
mainfrom
renovate/nousresearch-hermes-agent-2026.x

Conversation

@renovate

@renovate renovate Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Update Change
nousresearch/hermes-agent patch v2026.8.16v2026.8.16.2

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


Configuration

📅 Schedule: (in timezone Europe/Brussels)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about these updates again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

Tanguille and others added 2 commits August 17, 2026 22:18
…ng (#4509)

* feat(llmkube): add qwen 3.8 benchmark lane

* feat(llmkube)!: cut Qwen 3.8 over to production, retire Qwen 3.6 SGLang

vLLM v0.27.1's new RDNAHybridW4A16LinearKernel closes the dense-INT4
decode-kernel gap that lost the June vLLM-vs-SGLang evaluation on this
hardware. Live-qualified against the SGLang 3.6 baseline: C1 +28%, C8
+14%, C16 +199%.

- promote qwen38-27b-vllm to production (replicas 1, parallelSlots 16,
  cudagraph_capture_sizes capped per vLLM #39010, MTP deliberately
  omitted per the tool-calling wedge)
- port the OffloadingConnector RAM+disk KV tier from qwen36-27b-vllm to
  raise context from 32768 to 96000 (Hermes hard-requires >=64K and
  measures p90 94K); vision stays loaded (unlike the qwen36 config's
  --language-model-only) since Hermes' auxiliary.vision uses it
- park qwen36-27b-sglang (replicas 0) instead of deleting, for rollback
- drop the throwaway qwen38-27b-benchmark manifest
- repoint the qwen-3.6/qwen-3.6-fast litellm aliases at the new backend,
  keeping the alias names for downstream compat (karakeep, omniroute);
  maxInputTokens corrected to match the real ceiling

BREAKING CHANGE: qwen-3.6/qwen-3.6-fast litellm aliases now serve
Qwen 3.8 via vLLM instead of Qwen 3.6 via SGLang. Max input context
drops from 171808 to 87808 tokens.

* perf(llmkube): shrink Mamba conv-state cache dtype, raise Qwen 3.8 context to 98K

--mamba-cache-dtype (conv-state pool, separate from the already-set
--mamba-ssm-cache-dtype which only covers SSM state) was left at the
model-config default. Setting it to bfloat16 too freed ~0.23 GiB,
raising the GPU KV pool from 99,809 to 107,428 tokens at the same
gpuMemoryUtilization ceiling — real headroom, not a quality tradeoff,
since bfloat16 is already the precision floor we accept elsewhere.

That let maxModelLen go from 96000 to 98000 (106000, closer to Hermes'
p95 of 106K, didn't fit — vLLM's own estimate at this budget tops out
at 100000). Updated Hermes' context_length and litellm's
maxInputTokens to match the real ceiling.

* perf(llmkube): size Qwen 3.8 KV pool explicitly, raise context to 112K

Deriving the KV pool from gpuMemoryUtilization left it at 3.22 GiB -- 99,519
tokens, or 1.02x concurrency at the old 98000 context, so a second full-length
request had to queue behind the first. vLLM's own memory profiler reported
6.88 GiB as the ceiling that still fits on this card.

Set --kv-cache-memory to 6 GiB and raise gpuMemoryUtilization to 0.97 (it now
only has to admit weights + activations + that block, not size KV itself).
Measured on the R9700: 187,945 KV tokens, 1.68x concurrency at 112000 context.

Context goes 98000 -> 112000, which covers Hermes' measured p100 so routine
sessions stop truncating; litellm maxInputTokens follows to 103808.

Concurrency sweep vs the SGLang 3.6 baseline:
  C1  15.36 vs 14.96 tok/s
  C8  40.11 vs 36.24 tok/s (+11%)
  C16 76.12 vs 34.49 tok/s (+121%)

Review remarks:
- Replace the no-op liveness probe with a real /health check. The startup probe
  owns the load window, so liveness only runs against a serving engine; slack
  thresholds (20x30s) keep a saturated GPU from being mistaken for a dead one.
- Run the kv-offload free-space guard hourly instead of daily. hostpath enforces
  no quota, so this job is the only control; hourly bounds the exposure to one
  hour of writes. Noted in-file that a quota-enforcing storage class is the real
  fix and why it is not taken.
- Drop the session handoff doc: it described a paused, unsafe live state
  (Flux suspended, production stopped) that no longer exists.

Fix the bench script's hardcoded qwen-3.6 served name, which made every request
fail silently after the cutover and report 0 tok/s.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DcmiaP2xnvqGmvshQUteVK

* fix(llmkube): stop the kv-offload guard wiping the whole L3 tier every run

The guard's 160Gi free-space floor was never reachable on the qwen38 node: the
disk is 500G with ~370G held by everything else, so df reported 131G free even
with an empty store. Every run therefore took the "below floor" branch and did
`rm -rf /kvoffload/*`. Confirmed live -- the last job logged
`avail: 128291444K (floor: 167772160K) / below floor, wiping the L3 store`
and the store is currently 4K. The tier that reports a 95.7% external prefix
hit rate was being deleted daily.

Two changes, applied identically to qwen36-27b-vllm.yaml so the copies cannot
drift:

- Floor 160Gi -> 80Gi, a value this disk can actually satisfy.
- Evict oldest-first instead of wiping: blocks are write-once, so mtime is the
  recency signal the old comment claimed did not exist. The cutoff walks
  30/14/7/3/1/0 days and stops as soon as it is back above the floor, so an
  overshoot costs a slice of cold blocks rather than weeks of warm ones. An
  unreachable floor now degrades to "keep the last 24h" instead of erroring.

This is what makes the hourly schedule safe; hourly plus wipe-all would have
destroyed the cache 24x a day. qwen36's guard moves to hourly to match.

Also from review:
- Fix the same hardcoded qwen-3.6 served name in spectest.py, not just
  concsweep.py -- spectest has no exception handling and would traceback rather
  than silently report 0. Both now take the model as an optional 2nd argv,
  matching the existing _port() convention instead of adding an env var.
- Trim comments that restated neighbouring comments or git history.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DcmiaP2xnvqGmvshQUteVK

* fix(llmkube): fail the kv-offload guard when it cannot reach its floor

The eviction ladder exited 0 even after walking all the way down, so a
node whose free space was short for reasons other than this cache
reported a healthy guard run until it filled up.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

* refactor(ai): rename qwen-3.6 litellm aliases to qwen-3.8

The aliases now serve Qwen 3.8, so the 3.6 names were actively
misleading. Renamed atomically across every consumer that hardcodes
them: karakeep's image model, the PR-review action's fallback, the
proxy's omniroute fallback chain, and the alias definitions.

Hermes' own profile configs live in its PVC and were updated in the
same pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

* refactor(ai): retire the Qwen 3.6 lane and its sglang references

qwen38-27b-vllm has taken all traffic, so the parked qwen36 sglang and
vllm manifests were dead weight -- and their kv-offload guard CronJobs
kept sweeping two multi-hundred-thousand-file stores hourly for models
that never serve.

Removes both manifests and everything left dangling by them: the
sglang-rdna4 Renovate rule (no image left to track), the sglang Grafana
dashboard link and its chart toggle, and the kustomization entries.

Comments naming the deleted services are repointed rather than dropped
-- muse-glimmer's scale-down condition named qwen36-27b-vllm, which
would have sent a future operator looking for a service that no longer
exists.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

* fix(llmkube): restore the 0.875 VRAM ceiling shared with Jellyfin

The 0.97 this shipped with broke a documented hard constraint: the R9700
is shared with Jellyfin transcoding, and the ~4.6 GB free at 0.875 is
that reservation, not slack. At 0.97 free VRAM measured 3.41 GB -- under
the reservation, so a concurrent transcode would contend or OOM.

The raise was also based on a misreading. vLLM logs 'skipped memory
profiling ... does not respect the gpu_memory_utilization config' when
--kv-cache-memory is set, so the KV pool never came from the 0.97 at
all; the explicit flag was doing the work by itself.

Sizing KV at 5 GiB instead keeps 112K context and measures 5.46 GB free
(0.86 GB over the reservation). It also benchmarks faster at the
concurrency end than the 0.97 build did: 53.93 vs 40.11 tok/s at 8,
100.82 vs 76.12 at 16.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

* fix(llmkube): ship the vLLM dashboard now that sglang is gone

The dashboard ship-list carried sglang-dashboard because production ran
SGLang. Removing the qwen36 lane dropped it without adding the vLLM
equivalent, which would have left the new engine with no dashboard at
all -- `only` is a static ship-list and does not follow what is
deployed.

operator.mode defaults to auto, so vllm-dashboard publishes only while a
vLLM InferenceService exists and self-suppresses instead of rendering
blank if qwen38 is ever parked.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

* refactor(ai): use upstream litellm dashboard and auto runtime gating

litellm dashboard: drop the 542-line vendored copy for grafana.com
24965. It was forked because 24965's $job/$instance vars query
litellm_proxy_total_requests_metric_created, which litellm did not
export -- every panel came up blank. v1.97.0 exports that series (91
live) and all 10 metrics the dashboard queries; $model resolves too.
Revision pinned: no Renovate manager covers grafanaCom.

llmkube dashboards: list both runtimes we ship manifests for and let
operator.mode: auto decide. vllm follows qwen38, llamacpp follows
muse-glimmer, so parking or scaling either no longer needs an edit here.

`only` stays: auto gates only the three runtime dashboards, so dropping
it would ship four that render blank regardless -- verified pyrra is
absent (llmkube-slo) and we export drm_* not amdgpu_* (amd-gpu-
observability), plus quota/model-router need features we don't deploy.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

* refactor(ai): drop the explicit dashboard pins

Track grafana.com 24965's latest revision instead of pinning one, and
let operator.mode fall through to the chart's auto default rather than
restating it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

* docs(ai): trim the verbose comments

Same reasoning, fewer lines: keep the measured numbers and the
constraint each value encodes, drop the prose around them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

* refactor(ai): apply simplify review findings

- Drop 6 redundant `namespace: ai` declarations; the Flux Kustomization
  sets targetNamespace and three of four siblings already omit them.
- Drop --mamba-ssm-cache-dtype: it defaults to following
  --mamba-cache-dtype, so both flags plus five lines argued one setting.
- Remove two citations to files that do not exist in this repo
  (docs/hermes-config.md, project_vllm_toolcalling_specdecode.md); the
  numbers they backed are already inline.
- Lead the gpuMemoryUtilization comment with INERT rather than a HARD
  CEILING banner over a field vLLM logs that it ignores.
- Correct the memory comment: measured 13.3Gi steady state (8Gi of it
  tmpfs), not the inherited '24Gi base' figure.
- models.yaml no longer claims the rename was atomic with hermes --
  hermes' profiles live on its PVC and were edited by hand.
- Renovate: match the hf://repo@sha source form too, so the primary
  serving model's weights digest is tracked (3 of 5 models -> 5 of 5).
- Docs: engine-benchmarks still named SGLang as production, the bench
  recipe port-forwarded a deleted Service, and sglang-blockers described
  a retired setup in the present tense.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

* refactor(llmkube): drop the dashboard only-list

Ship every dashboard and let the operator's auto mode gate the runtime
ones. The four non-runtime dashboards auto does not cover will render
blank; the comment says which and why.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PusTnmBZMnHEJDRLQprNRG

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@tanguille-cluster

Copy link
Copy Markdown
@@ spec.template.spec.containers.app.image @@
# apps/v1/Deployment/ai/hermes
! ± value change
- nousresearch/hermes-agent:v2026.8.16@sha256:f8f548d87d16634d1ad9e3777280f3f577ba2358703f04e18e74007ffd3621bf
+ nousresearch/hermes-agent:v2026.8.16.2@sha256:a39fc11620213e3669a327aff5c6cb1eb2b8a238c6044e33e7ef8885833d89a7

@tanguille-cluster

Copy link
Copy Markdown
@@ spec.values.controllers.hermes.containers.app.image.tag @@
# helm.toolkit.fluxcd.io/v2/HelmRelease/ai/hermes
! ± value change
- v2026.8.16@sha256:f8f548d87d16634d1ad9e3777280f3f577ba2358703f04e18e74007ffd3621bf
+ v2026.8.16.2@sha256:a39fc11620213e3669a327aff5c6cb1eb2b8a238c6044e33e7ef8885833d89a7

@github-actions

Copy link
Copy Markdown

AI Automated Review

Analysis engine: qwen-3.8-fast@http://litellm.ai.svc.cluster.local/v1 (openai) — fallback (primary failed)

Recommendation: Approve. This is a standard Renovate patch bump for nousresearch/hermes-agent from v2026.8.16 to v2026.8.16.2, updating the image tag and digest in kubernetes/apps/ai/hermes/app/helmrelease.yaml. No other files are modified.

Must-check items:

  • Validate manifest against target cluster version: The change only updates an image tag/digest within an existing HelmRelease manifest. No API versions, resource types, or structural fields are altered, so cluster-version compatibility is unchanged from the previously deployed state.
  • Check for resource quota / limit changes: Resource requests (cpu: 100m, memory: 2Gi) and limits (cpu: 2, memory: 4Gi) are identical before and after; no quota-relevant values were modified.

Sources: PR diff and metadata only; upstream release notes for nousresearch/hermes-agent v2026.8.16.2 were not fetched (no tool calls issued), so specific patch contents are unverified.

@github-actions github-actions Bot 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.

Inline findings from the automated review (summary in the sticky comment).

image:
repository: nousresearch/hermes-agent
tag: v2026.8.16@sha256:f8f548d87d16634d1ad9e3777280f3f577ba2358703f04e18e74007ffd3621bf
tag: v2026.8.16.2@sha256:a39fc11620213e3669a327aff5c6cb1eb2b8a238c6044e33e7ef8885833d89a7

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Info (docs): Upstream release notes for v2026.8.16.2 were not retrieved; patch-level changes are unverified.

Automated finding from AI PR review.

@renovate

renovate Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Edited/Blocked Notification

Renovate will not automatically rebase this PR, because it does not recognize the last commit author and assumes somebody else may have edited the PR.

You can manually request rebase by checking the rebase/retry box above.

⚠️ Warning: custom changes will be lost.

@Tanguille
Tanguille merged commit 6fa2522 into main Aug 17, 2026
13 checks passed
@Tanguille
Tanguille deleted the renovate/nousresearch-hermes-agent-2026.x branch August 17, 2026 21:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant