diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d2340dc..c43f34b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ ### Fixed +- **Multi-container Docker deployments can reach the agent API again.** In the two- and three-container Compose topologies, the agent's gateway API bound to loopback only, so the WebUI (and dashboard) containers — separate hosts on the Docker network — couldn't reach `http://hermes-agent:8642` even with `HERMES_API_URL` and `API_SERVER_KEY` set correctly, breaking cron/Tasks and gateway-backed features. The agent service now sets `API_SERVER_HOST=0.0.0.0` so it's reachable across the Compose network; the host port publish stays `127.0.0.1`-only, so this does not expose the API beyond the Docker network and host loopback. Thanks @bragov4ik. (#6968) + - **Two WebUI sessions with the same auto-generated title no longer leave the second one blank.** Follow-up to the `state.db` title sync: hermes-agent enforces a uniqueness rule on session titles, so when two sessions independently generated a byte-identical auto-title, the second sync raised (and silently swallowed) a collision error and left that session untitled in `hermes sessions list`. The sync now catches the collision, derives a de-duplicated variant via the existing lineage helper (`"My Session"` → `"My Session #2"`), and retries — and because the retry goes through the same provenance guard, a title you set manually is still never overwritten. Thanks @webtecnica. (#6964) - **Custom-provider models keep their exact identity across catalog refreshes.** When a session used a model served through a custom provider whose upstream id contains a namespace (e.g. `z-ai/glm-5.2` under a `tokenrouter` custom endpoint), a catalog refresh could mis-resolve the picker selection — matching a *different* model whose bare suffix collided, or (in an interim fix) fabricating a new bare-id option instead of re-selecting the real one. Model resolution now matches the exact routed id first, and only falls back to a provider-hinted bare-id repair (preserving the older #6195 behavior for legacy sessions that stored just the suffix) when there is exactly one unambiguous candidate — otherwise it declines to guess. The resolved value is always an existing dropdown option, so re-renders no longer inject duplicates or lose the selection. Thanks @josephcy95. (#6944) - **WebUI no longer crashes a send when running against an older hermes-agent.** The streaming path passed `persist_user_timestamp=` to `agent.run_conversation()` unconditionally, so a WebUI paired with an older agent whose `run_conversation()` predates that keyword raised `TypeError: unexpected keyword argument` and the message failed. The three call sites now check the callable's signature first (via a small `_supports_kwarg` introspection helper) and only pass the timestamp when the agent accepts it — the same defensive pattern already used for `moa_config`. Modern agents are unaffected (the timestamp is still passed with the identical value); older agents degrade gracefully instead of erroring. Thanks @harsh2hell. (#6935) diff --git a/docker-compose.three-container.yml b/docker-compose.three-container.yml index 7e967624..f8602d94 100644 --- a/docker-compose.three-container.yml +++ b/docker-compose.three-container.yml @@ -60,6 +60,10 @@ services: # The agent's container detection (/.dockerenv) already auto-skips # credential chmod inside Docker, so HERMES_SKIP_CHMOD is redundant here. # - HERMES_HOME_MODE=0750 + # Bind to 0.0.0.0 so that other services can reach the agent's api. + # We map the service to 127.0.0.1 with docker, so it won't be reachable + # outside the host + - API_SERVER_HOST=0.0.0.0 restart: unless-stopped deploy: resources: diff --git a/docker-compose.two-container.yml b/docker-compose.two-container.yml index 0eb91185..3fdba336 100644 --- a/docker-compose.two-container.yml +++ b/docker-compose.two-container.yml @@ -76,6 +76,10 @@ services: # The agent's container detection (/.dockerenv) already auto-skips # credential chmod inside Docker, so HERMES_SKIP_CHMOD is redundant here. # - HERMES_HOME_MODE=0750 + # Bind to 0.0.0.0 so that other services can reach the agent's api. + # We map the service to 127.0.0.1 with docker, so it won't be reachable + # outside the host + - API_SERVER_HOST=0.0.0.0 restart: unless-stopped networks: - hermes-net