NousResearch/hermes-agent · warning · RuntimeError
iron-proxy is not running — nothing to reload. Run `hermes
Error message
iron-proxy is not running — nothing to reload. Run `hermes egress start`.
What it means
reload_proxy() POSTs to /v1/reload on the daemon's loopback management listener to hot-swap the config without dropping the proxy. It first reads the pidfile and checks liveness; if there is no pid or the pid is dead, there is nothing to reload and it raises with the command to bring the daemon up. This is a state precondition error, not a failure of the reload itself.
Source
Thrown at agent/proxy_sources/iron_proxy.py:930
return (host or "127.0.0.1", port)
def reload_proxy() -> bool:
"""Hot-reload the running daemon's ruleset via the management API.
POSTs to ``/v1/reload`` on the loopback management listener; the daemon
re-reads proxy.yaml and atomically swaps the transform pipeline —
validation failures leave the running config untouched (HTTP 422).
Returns True on a successful reload. Raises ``RuntimeError`` with an
actionable message when the daemon isn't running, the config predates
management-API support (no ``management`` block → restart required),
or the reload is rejected.
"""
pid = _read_pid()
if not pid or not _pid_alive(pid):
raise RuntimeError(
"iron-proxy is not running — nothing to reload. "
"Run `hermes egress start`."
)
mgmt = _read_management_listen_from_config()
if mgmt is None:
raise RuntimeError(
"The generated proxy.yaml has no management listener (written "
"before reload support). Re-run `hermes egress setup` and use "
"`hermes egress restart` this one time."
)
token = _read_management_token()
if not token:
raise RuntimeError(
"management.token is missing — re-run `hermes egress setup`, "
"then `hermes egress restart`."
)
import urllib.errorView on GitHub (pinned to c896c09c42)
Solutions
- Start the daemon with `hermes egress start`, then re-run `hermes egress reload`.
- If you expected it to be running, inspect the daemon log (iron-proxy.log in the proxy state dir) for the earlier crash and fix that first.
- In automation, gate reload on get_status() showing a running daemon instead of assuming.
Example fix
// before
reload_proxy() # RuntimeError: nothing to reload
// after
from agent.proxy_sources.iron_proxy import get_status, start_proxy, reload_proxy
if not get_status().running:
start_proxy()
reload_proxy() Defensive patterns
Strategy: validation
Validate before calling
from agent.proxy_sources.iron_proxy import get_status
def proxy_is_running() -> bool:
try:
return get_status().running
except Exception:
return False Try / catch
try:
reload_proxy()
except RuntimeError as e:
if "nothing to reload" in str(e):
start_proxy()
reload_proxy()
else:
raise Prevention
- In automation, always gate reload on a running-daemon check (pid/get_status) instead of assuming.
- After host reboots, start the daemon before any reload-driven config rollout.
When it happens
Trigger: Calling reload_proxy() / `hermes egress reload` when the daemon was never started, was stopped (`hermes egress stop`), or crashed — _read_pid() returns None or _pid_alive(pid) is False.
Common situations: Editing proxy rules and running reload after a reboot (the daemon isn't auto-started); the daemon crashed earlier and nobody noticed; running reload on a fresh machine where setup ran but start never did.
Related errors
- The generated proxy.yaml has no management listener (written
- management.token is missing — re-run `hermes egress setup`,
- management API returned unexpected status {resp.status}
- iron-proxy rejected the new config (validation failed; the r
- management API rejected our key (401). The running daemon w
AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14).
Data as JSON: /api/errors/7b3aa33350f0ee3f.
Report an issue: GitHub.