Skip to content

feat(hermes): bump to v0.16 (calver 2026.6.5) + upgrade follow-ups - #5217

Closed
tyeth-ai-assisted wants to merge 10 commits into
NVIDIA:mainfrom
tyeth-ai-assisted:feat/hermes-0.16-upstream
Closed

feat(hermes): bump to v0.16 (calver 2026.6.5) + upgrade follow-ups#5217
tyeth-ai-assisted wants to merge 10 commits into
NVIDIA:mainfrom
tyeth-ai-assisted:feat/hermes-0.16-upstream

Conversation

@tyeth-ai-assisted

@tyeth-ai-assisted tyeth-ai-assisted commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Bumps the Hermes Agent to v0.16.0 (calver 2026.6.5) and lands the follow-up fixes needed to make the v0.16 gateway, dashboard, and model picker work inside a NemoClaw sandbox. Rebased onto current main; mergeable.

Scope: GitHub network-policy changes and the model-router uninstall/recover fixes are intentionally excluded (the latter ship separately).

Commits

  1. feat(hermes): bump Hermes Agent to v0.16 (calver 2026.6.5)expected_version 2026.5.16 → 2026.6.5 across Dockerfile / Dockerfile.base / manifest.yaml, plus scripts/update-hermes-agent.sh.
  2. fix(hermes): require and allow API_SERVER_KEY so the v0.16 gateway starts — v0.16 guards its OpenAI-compatible API server with a bearer token. Generate one into the sandbox .env (via buildHermesEnvLines), allow that single raw key past the secret-boundary validator (mirroring OPENCLAW_GATEWAY_TOKEN — a self-minted loopback token, not an egress credential), and treat HTTP 401 as "gateway alive" in the unauthenticated in-sandbox health wait.
  3. feat(hermes): surface the API_SERVER_KEY auth tokenAgentWebAuth model; agent-aware gateway-token; onboard prints the OpenAI-compatible API endpoint + retrieval command.
  4. fix(hermes): v0.16 install fixes — kanban deps, chat pty, bump verify — vendor python-multipart (hash-pinned); grant /dev/pts; fix the bump script's post-rebuild verify to use exec.
  5. feat(hermes): populate the model picker via custom_providers — emit a custom_providers/providers entry mirroring the proxied endpoint with discover_models: true so the picker lists the routed models. Also aligns the minimal Hermes YAML serializer's block-sequence indentation with the messaging build applier so the new top-level array round-trips.
  6. fix(hermes): seed dashboard config so Models page and kanban see the routed model + fix(hermes): seed v16 dashboard routing.
  7. test(hermes): allow raw API_SERVER_KEY in env-boundary test helper

Testing

  • npm run typecheck:cli, plugin tsc --noEmit, and the full cli+plugin Vitest suite pass under Node 22 (7812 passed / 47 skipped; the lone failure is an unrelated hardware GPU-detection test on the dev box).
  • ⚠️ Inference/kanban/pty/model-picker were originally verified on a live sandbox on a pre-rebase base; re-verify against a freshly rebuilt v0.16 sandbox before merge, since the rebase re-ported the config code onto upstream's refactored hermes-env.ts / hermes-config.ts.

🤖 Generated with Claude Code

@copy-pr-bot

copy-pr-bot Bot commented Jun 11, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: b2790542-8789-44ce-8dfc-dc907edf0bcb

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

tyeth and others added 8 commits June 11, 2026 13:30
Bump the Hermes Agent image to expected_version 2026.6.5 (Dockerfile,
Dockerfile.base, manifest.yaml) and add scripts/update-hermes-agent.sh to
automate future version bumps.
…arts

Hermes v0.16.0+ guards its OpenAI-compatible API server with a bearer token
read from API_SERVER_KEY. Without it the gateway refuses to start, so the
install health check fails.

- Generate a per-sandbox API_SERVER_KEY into the Hermes .env.
- Allow that single raw key past the secret-boundary validator (env-file and
  runtime-env), mirroring OPENCLAW_GATEWAY_TOKEN: it is a self-minted,
  loopback-only token, not an egress credential, so it legitimately lives raw
  in .env rather than as an openshell:resolve placeholder.
- Accept HTTP 401 (not just 200) as "gateway alive" in the in-sandbox health
  wait, since the probe is unauthenticated and v0.16 may 401 it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The v0.16 gateway's bearer token was minted but not retrievable, so users
had no way to call the OpenAI-compatible API.

- Add an agent web-auth model (AgentWebAuth { method, env }) read from the
  manifest; Hermes is bearer_token/API_SERVER_KEY, OpenClaw stays none.
- Make `gateway-token` agent-aware: it now returns a bearer_token agent's
  web-auth key (Hermes' API_SERVER_KEY) as well as OpenClaw's gateway token,
  reading it group-readably from the sandbox .env without ever logging it.
- Onboard prints the OpenAI-compatible API endpoint and the retrieval
  command for bearer_token agents.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Three independent v0.16 install/runtime regressions:

- Vendor python-multipart (pinned + hash-verified to the release's uv.lock)
  so the bundled kanban dashboard plugin's file-upload route mounts. It is
  not a dependency of hermes core or the `web` extra (only of mcp/daytona),
  so a slim extras install omits it; FastAPI then fails the Form/File route.
  Vendored directly rather than pulling the MCP client or the Daytona SDK.
- Grant /dev/pts in both Hermes sandbox policies. The TUI, the dashboard
  chat pty bridge, and terminal.backend: local allocate a pty via openpty();
  without the grant landlock denies /dev/ptmx with EACCES, surfaced as
  "out of pty devices". Mirrors the existing OpenClaw grant (NVIDIA#4513).
- Fix the bump script's post-rebuild verify to use `exec` not `connect`:
  connect is a strict interactive shell that ignores a trailing `-- <cmd>`
  and just prints its usage, so the version check always failed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The model picker (CLI `hermes model` and the dashboard Models page via
/api/model/options) showed zero models even though inference worked: it
enumerates providers through get_compatible_custom_providers(), which only
reads custom_providers/providers — never the inline `model:` block NemoClaw
writes for routing.

Emit a custom_providers entry mirroring the proxied endpoint
(inference.local/v1) with discover_models: true, so the picker live-lists
/v1/models (already served by the proxy and allowlisted in policy). Verified
live: the picker then lists the routed models with is_current set.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…routed model

The Hermes dashboard runs as the sandbox user under its own isolated
HERMES_HOME (/tmp/hermes-dashboard-home) for privilege separation from the
gateway user, so it never sees the model/custom_providers block NemoClaw
writes to the gateway's /sandbox/.hermes/config.yaml. Its load_config() reads
a Hermes-default config with model: '' and no providers, so the dashboard
Models page (/api/model/options -> inventory.build_models_payload) listed zero
models and the kanban specifier/dispatcher (get_text_auxiliary_client) resolved
no client — even though the TUI/CLI on the gateway home worked. Verified live.

Add seed-dashboard-config.py, invoked from start.sh::seed_hermes_dashboard_config
before the dashboard launches, mirroring model/custom_providers/_nemoclaw_upstream
into the dashboard home config while preserving its other keys. custom_providers
carries discover_models: true so the model list stays live-discovered from
/v1/models rather than pinned. Idempotent, symlink-guarded, best-effort (a seed
failure never blocks startup). Confirmed end-to-end in a live sandbox: the
dashboard then lists the 3 routed models and kanban resolves nvidia-routed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
generate-hermes-config.test.ts's findRawSecretEnvEntries flagged the raw
API_SERVER_KEY messaging-config.ts writes to .env, but the production validator
(validate-env-secret-boundary.py) already exempts it via
ENV_FILE_ALLOWED_RAW_SECRET_KEYS — it is Hermes' self-generated api_server
bearer token (v0.16.0+) that never transits the OpenShell proxy, so it has no
resolver placeholder. Mirror that allowlist in the test helper.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Seed the Hermes dashboard's config so the Models page and kanban see the
routed model, mirror the routed provider, and align Dockerfile.base/start.sh
with the v0.16 dashboard launch path.
@tyeth-ai-assisted
tyeth-ai-assisted force-pushed the feat/hermes-0.16-upstream branch from 3d79eef to 3fef7f8 Compare June 11, 2026 12:44
start.sh invoked seed-dashboard-config.py with bare `python3`, which at
container boot is the base-image interpreter without PyYAML (an interactive
login shell activates the venv, masking this). The seeder then hit its
"PyYAML unavailable; skipping model seed" branch and returned 0, so the
gateway's model routing was silently never mirrored into the dashboard
HERMES_HOME — leaving model:'' / providers:{} and an empty Models page after
a rebuild. Resolve the Hermes venv interpreter explicitly
(/opt/hermes/.venv/bin/python, fallback python3) and run the seeder with it.
That binary is already an allowlisted blueprint binary and the prefer-venv
fallback idiom is used elsewhere in the repo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@wscurran wscurran added feature PR adds or expands user-visible functionality integration: hermes Hermes integration behavior labels Jun 12, 2026
@wscurran

Copy link
Copy Markdown
Contributor

✨ Thanks for bumping Hermes to v0.16 (calver 2026.6.5) and adding the API_SERVER_KEY handling for the new gateway auth. This proposes a way to upgrade the Hermes integration with the required token generation and secret-boundary allowances for the v0.16 gateway, dashboard, and model picker to function inside the NemoClaw sandbox.

… add hermes doctor --fix

Agent-Logs-Url: https://github.com/tyeth-ai-assisted/NemoClaw/sessions/cc04407b-b2a0-4a6b-8625-2512fab13384

Co-authored-by: tyeth-ai-assisted <259968460+tyeth-ai-assisted@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature PR adds or expands user-visible functionality integration: hermes Hermes integration behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants