hermes-agent

CLI Tool

NousResearch/hermes-agent

A self-improving AI agent with a built-in learning loop.

Overview

Hermes Agent is a self-improving AI agent built by Nous Research. It features a built-in learning loop that creates skills from experience and nudges itself to persist knowledge. It supports multiple messaging platforms, any LLM provider, and runs on various backends.

README Preview

\n  \n\n\n# Hermes Agent ☤\n\n\n  \n  \n  \n  \n  \n\n\n**The self-improving AI agent built by [Nous Research](https://nousresearch.com).** It's the only agent with a built-in learning loop — it creates skills from experience, improves them during use, nudges itself to persist knowledge, searches its own past conversations, and builds a deepening model of who you are across sessions. Run it on a $5 VPS, a GPU cluster, or serverless infrastructure that costs nearly nothing when idle. It's not tied to your laptop — talk to it from Telegram while it works on a cloud VM.\n\nUse any model you want — [Nous Portal](https://portal.nousresearch.com), [OpenRouter](https://openrouter.ai) (200+ models), [NVIDIA NIM](https://build.nvidia.com) (Nemotron), [Xiaomi MiMo](https://platform.xiaomimimo.com), [z.ai/GLM](https://z.ai), [Kimi/Moonshot](https://platform.moonshot.ai), [MiniMax](https://www.minimax.io), [Hugging Face](https://huggingface.co), OpenAI, or your own endpoint. Switch with `hermes model` — no code changes, no lock-in.\n\n\nA real terminal interfaceFull TUI with multiline editing, slash-command autocomplete, conversation history, interrupt-and-redirect, and streaming tool output.\nLives where you doTelegram, Discord, Slack, WhatsApp, Signal, and CLI — all from a single gateway process. Voice memo transcription, cross-platform conversation continuity.\nA closed learning loopAgent-curated memory with periodic nudges. Autonomous skill creation after complex tasks. Skills self-improve during use. FTS5 session search with LLM summarization for cross-session recall. Honcho dialectic user modeling. Compatible with the agentskills.io open standard.\nScheduled automationsBuilt-in cron scheduler with delivery to any platform. Daily reports, nightly backups, weekly audits — all in natural language, running unattended.\nDelegates and parallelizesSpawn isolated subagents for parallel workstreams. Write Python scripts that call tools via RPC, collapsing multi-step pipelines into

FAQ (5)

Troubleshooting
Why does 'hermes desktop' fail with 'ENOENT: no such file or directory, rename electron -> Hermes' on Linux?

The error is caused by a corrupt cached Electron distribution zip in the per-user Electron download cache. Delete the cache file and re-run the build.

- For Linux: rm ~/.cache/electron/electron-v*.zip (or the specific version, e.g., rm ~/.cache/electron/electron-v40.9.3-linux-x64.zip)
- For macOS: rm ~/Library/Caches/electron/*.zip
- For macOS with custom cache: respect XDG_CACHE_HOME or ELECTRON_CACHE if set.

After clearing the corrupt zip, execute 'hermes desktop' again. The build will re-download a clean Electron distribution and complete successfully. This is a known issue tracked in #39127 (self-healing cache purge).

GitHub Issue #37544
Troubleshooting
How to fix 'result of groups.log violates its wire contract' error (RoomActor extra_forbidden on display_name/profile) in Hermes tui_gateway?

Cause: the RoomActor contract model in tui_gateway/contracts/groups_bot_relay.py only declares kind and id with extra="forbid", while the producer _member_actor() in gateway/hosted_room_discussion.py also emits profile, display_name, and connection_id. The actor dict is persisted verbatim as actor_json in state.db and replayed on every groups.log page, so every member-authored event re-triggers a validation error (or raises ContractViolation under HERMES_TEST_ISOLATION=1).

Fix: declare the optional fields on RoomActor to match _OPTIONAL_ACTOR_FIELDS in gateway/hosted_rooms.py:

class RoomActor(Result):
    kind: str
    id: str
    profile: str | None = None
    display_name: str | None = None
    connection_id: str | None = None

Then regenerate the contract artifacts by running scripts/gen_gateway_contracts.py (per tui_gateway/AGENTS.md) to update apps/shared/src/gateway-contract.generated.ts and gateway-contract.openrpc.json. Same fix pattern as issue #118067/profiles.list (ProfileRow missing previous_names), fixed in commit 9a4a598bfcd. Optionally add an invariant test asserting a _member_actor()-shaped dict passes RoomActor validation.

GitHub Issue #138908
Troubleshooting
Why does Hermes Desktop show "We couldn't reach the update server" on Windows and how to fix it?

This message is misleading — it's usually not a network failure. On Windows installs created by the official bootstrap installer, git is installed only into the package-manager tool store (%LOCALAPPDATA%\hermes\tools\git-<ver>-win32-x64), but the Desktop's resolveGitBinary() never probes that location. With no Git for Windows installed and no git on PATH, the update check fails with head-unavailable ("Could not read the installed revision.") and the UI mislabels it as a server-reachability problem.

Confirm the real cause: open %HERMES_HOME%\source-checks\<install_id>.json — if you see "error": "head-unavailable" with "currentSha": null, git wasn't found (not a network issue).

Workarounds (any one):
1. Create a junction so the managed git matches the path the app probes. In Command Prompt (not PowerShell):
mklink /J "%LOCALAPPDATA%\hermes\git" "%LOCALAPPDATA%\hermes\tools\git-2.53.0+3-win32-x64"
(adjust the version folder name to match your install), then restart the app.
2. Install Git for Windows (into C:\Program Files\Git or %LOCALAPPDATA%\Programs\Git) or add git to your PATH — both locations are probed by the resolver.

Note this also affects other Desktop git features (worktrees, review, branch operations) on the same install shape. A permanent fix requires updating resolveGitBinary() in apps/desktop/electron/main.ts to probe the %LOCALAPPDATA%\hermes\tools\git-* store.

GitHub Issue #122956
Troubleshooting
Why does the chat scrollbar jump backward in Hermes Desktop app?

This is a known bug in the useThreadScrollAnchor logic (thread-virtualizer.tsx). A ResizeObserver disarm condition misfires on interim scroll events, causing the sticky-bottom behavior to disengage temporarily. The fix is already merged in PR #38221 and will be included in Hermes Desktop v0.15.2. Until then, as a workaround, minimize composer resizes (e.g., close suggestion chips, avoid large code block re-renders) or manually keep the scroll at the bottom.

GitHub Issue #37997
Troubleshooting
Why does Hermes disk-cleanup delete cron/jobs.json and how can I stop it?

This occurs when older tracked.json entries (from Hermes versions before the cron classification fix) label cron/jobs.json as "cron-output", causing disk-cleanup to delete it after 14 days. To prevent deletion, manually edit the tracked.json file (at ~/.hermes/disk-cleanup/tracked.json) and remove any entries for cron/jobs.json or the cron/ directory. Restart Hermes afterward. Newer versions (after commit d473e7c93) avoid adding such entries, but stale ones must be cleared manually.

GitHub Issue #37721