Skip to content

Commit 3278c25

Browse files
authored
docs: two-week gap sweep — platforms, CLI, config, TUI, hooks, providers (NousResearch#17727)
Covers ~60 merged PRs from Apr 15–29 that shipped user-visible behavior without docs coverage. No functional code changes; docs + static manifest regeneration only. Highlights: Stale / incorrect: - configuration.md: auxiliary auto-routing line was wrong since NousResearch#11900; now correctly states auto routes to the main model, with a note on the cost trade-off and per-task override pattern. - integrations/providers.md + configuration.md compression intro: removed stale 'Gemini Flash via OpenRouter' claim. - website/static/api/model-catalog.json: rebuilt from hermes_cli/models.py so the live manifest picks up tencent/hy3-preview (and remains in sync for future model-catalog PRs). Platform messaging (NousResearch#17417 NousResearch#16997 NousResearch#16193 NousResearch#14315 NousResearch#13151 NousResearch#11794 NousResearch#10610 NousResearch#10283 NousResearch#10246 NousResearch#11564 NousResearch#13178): - Signal: native formatting (bodyRanges), reply quotes, reactions. - Telegram: table rendering (bullets + code-block fallback), disable_link_previews, group_allowed_chats. - Slack: strict_mention config. - Discord: slash_commands disable, send_animation GIF, send_message native media attachments. - DingTalk: require_mention + allowed_users. CLI (NousResearch#16052 NousResearch#16539 NousResearch#16566 NousResearch#15841 NousResearch#14798 NousResearch#10043): - New 'hermes fallback' interactive manager. - New 'hermes update --check', '--backup' flag, and pre-update pairing snapshot behavior. - 'hermes gateway start/restart --all' multi-profile flag. - cron.md: 'hermes tools' as a platform, per-job enabled_toolsets, wakeAgent gate, context_from chaining. Config keys / env vars (NousResearch#17305 NousResearch#17026 NousResearch#17000 NousResearch#15077 NousResearch#14557 NousResearch#14227 NousResearch#14166 NousResearch#14730 NousResearch#17008): - terminal.docker_run_as_host_user, display.runtime_metadata_footer, compression.hygiene_hard_message_limit, HINDSIGHT_TIMEOUT, skills.guard_agent_created, TAVILY_BASE_URL, security.allow_private_urls, agent.api_max_retries, gateway hot-reload of compression/context_length config edits. TUI / CLI UX (NousResearch#17130 NousResearch#17113 NousResearch#17175 NousResearch#17150 NousResearch#16707 NousResearch#12312 NousResearch#12305 NousResearch#12934 NousResearch#14810 NousResearch#14045 NousResearch#17286 NousResearch#17126): - HERMES_TUI_RESUME, HERMES_TUI_THEME, LaTeX rendering, busy-indicator styles, ctrl-x queued-message delete, git branch in status bar, per- prompt elapsed stopwatch, external-editor keybind, markdown stripping, TUI voice-mode parity, /agents overlay, /reload + /mouse. Gateway features (NousResearch#16506 NousResearch#15027 NousResearch#13428 NousResearch#12116): - Native multimodal image routing based on vision capability. - /usage account-limits section. - /steer slash command (added to reference + explanation in CLI). Plugins / hooks (NousResearch#12929 NousResearch#12972 NousResearch#10763 NousResearch#16364): - transform_tool_result, transform_terminal_output plugin hooks. - PluginContext.dispatch_tool() documented with slash-command example. - google_meet bundled plugin entry under built-in-plugins.md. Other (NousResearch#16576 NousResearch#16572 NousResearch#16383 NousResearch#15878 NousResearch#15608 NousResearch#15606 NousResearch#14809 NousResearch#14767 NousResearch#14231 NousResearch#14232 NousResearch#14307 NousResearch#13683 NousResearch#12373 NousResearch#11891 NousResearch#11291 NousResearch#10066): - hermes backup exclusions (WAL/SHM/journal + checkpoints/). - security.md hardline blocklist (floor below --yolo). - FHS install layout for root installs. - openssh-client + docker-cli baked into the Docker image. - MEDIA: tag supported extensions table (docs/office/archives/pdf). - Remote-to-host file sync on SSH/Modal/Daytona teardown. - 'hermes model' -> Configure Auxiliary Models interactive picker. - Podman support via HERMES_DOCKER_BINARY. Providers / STT / one-shot (NousResearch#15045 NousResearch#14473 NousResearch#15704): - alibaba-coding-plan first-class provider entry. - xAI Grok STT as a 6th transcription option. - 'hermes -z' scripted one-shot mode + HERMES_INFERENCE_MODEL. Build: 'docusaurus build' succeeds. No new broken links/anchors; pre-existing warnings unchanged.
1 parent 1f27ef3 commit 3278c25

26 files changed

Lines changed: 727 additions & 19 deletions

website/docs/getting-started/installation.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,17 @@ Native Windows is **not supported**. Please install [WSL2](https://learn.microso
4141

4242
The installer handles everything automatically — all dependencies (Python, Node.js, ripgrep, ffmpeg), the repo clone, virtual environment, global `hermes` command setup, and LLM provider configuration. By the end, you're ready to chat.
4343

44+
#### Install Layout
45+
46+
Where the installer puts things depends on whether you're installing as a normal user or as root:
47+
48+
| Installer | Code lives at | `hermes` binary | Data directory |
49+
|---|---|---|---|
50+
| Per-user (normal) | `~/.hermes/hermes-agent/` | `~/.local/bin/hermes` (symlink) | `~/.hermes/` |
51+
| Root-mode (`sudo curl … \| sudo bash`) | `/usr/local/lib/hermes-agent/` | `/usr/local/bin/hermes` | `/root/.hermes/` (or `$HERMES_HOME`) |
52+
53+
The root-mode **FHS layout** (`/usr/local/lib/…`, `/usr/local/bin/hermes`) matches where other system-wide developer tools land on Linux. It's useful for shared-machine deployments where one system install should serve every user. Per-user config (auth, skills, sessions) still lives under each user's `~/.hermes/` or explicit `HERMES_HOME`.
54+
4455
### After Installation
4556

4657
Reload your shell and start chatting:

website/docs/getting-started/updating.md

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,33 @@ This pulls the latest code, updates dependencies, and prompts you to configure a
2424

2525
When you run `hermes update`, the following steps occur:
2626

27-
1. **Git pull** — pulls the latest code from the `main` branch and updates submodules
28-
2. **Dependency install** — runs `uv pip install -e ".[all]"` to pick up new or changed dependencies
29-
3. **Config migration** — detects new config options added since your version and prompts you to set them
30-
4. **Gateway auto-restart** — if the gateway service is running (systemd on Linux, launchd on macOS), it is **automatically restarted** after the update completes so the new code takes effect immediately
27+
1. **Pairing-data snapshot** — a lightweight pre-update state snapshot is saved (covers `~/.hermes/pairing/`, Feishu comment rules, and other state files that get modified at runtime). Rollbackable via `hermes backup restore --state pre-update`.
28+
2. **Git pull** — pulls the latest code from the `main` branch and updates submodules
29+
3. **Dependency install** — runs `uv pip install -e ".[all]"` to pick up new or changed dependencies
30+
4. **Config migration** — detects new config options added since your version and prompts you to set them
31+
5. **Gateway auto-restart** — if the gateway service is running (systemd on Linux, launchd on macOS), it is **automatically restarted** after the update completes so the new code takes effect immediately
32+
33+
### Preview-only: `hermes update --check`
34+
35+
Want to know if you're behind `origin/main` before actually pulling? Run `hermes update --check` — it fetches, prints your local commit and the latest remote commit side-by-side, and exits `0` if in sync or `1` if behind. No files are modified, no gateway is restarted. Useful in scripts and cron jobs that gate on "is there an update".
36+
37+
### Full pre-update backup: `--backup`
38+
39+
For high-value profiles (production gateways, shared team installs) you can opt into a full pre-pull backup of `HERMES_HOME` (config, auth, sessions, skills, pairing):
40+
41+
```bash
42+
hermes update --backup
43+
```
44+
45+
Or make it the default for every run:
46+
47+
```yaml
48+
# ~/.hermes/config.yaml
49+
update:
50+
backup: true
51+
```
52+
53+
`--backup` was the always-on behavior in earlier builds, but it was adding minutes to every update on large homes, so it's now opt-in. The lightweight pairing-data snapshot above still runs unconditionally.
3154

3255
Expected output looks like:
3356

website/docs/guides/build-a-hermes-plugin.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,24 @@ def register(ctx):
242242
- `ctx.register_tool()` puts your tool in the registry — the model sees it immediately
243243
- `ctx.register_hook()` subscribes to lifecycle events
244244
- `ctx.register_cli_command()` registers a CLI subcommand (e.g. `hermes my-plugin <subcommand>`)
245+
- `ctx.register_command()` registers an in-session slash command (e.g. `/myplugin <args>` inside CLI / gateway chat) — see [Register slash commands](#register-slash-commands) below
246+
- `ctx.dispatch_tool(name, arguments)` — call any other tool (built-in or from another plugin) with the parent agent's context (approvals, credentials, task_id) wired up automatically. Useful from slash-command handlers that need to invoke `terminal`, `read_file`, or any other tool as if the model had called it directly.
245247
- If this function crashes, the plugin is disabled but Hermes continues fine
246248

249+
**`dispatch_tool` example — a slash command that runs a tool:**
250+
251+
```python
252+
def handle_scan(ctx, argstr):
253+
"""Implement /scan by invoking the terminal tool through the registry."""
254+
result = ctx.dispatch_tool("terminal", {"command": f"find . -name '{argstr}'"})
255+
return result # returned to the caller's chat UI
256+
257+
def register(ctx):
258+
ctx.register_command("scan", handle_scan, help="Find files matching a glob")
259+
```
260+
261+
The dispatched tool goes through the normal approval, redaction, and budget pipelines — it's a real tool invocation, not a shortcut around them.
262+
247263
## Step 6: Test it
248264

249265
Start Hermes:

website/docs/integrations/providers.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ You need at least one way to connect to an LLM. Use `hermes model` to switch pro
2929
| **MiniMax** | `MINIMAX_API_KEY` in `~/.hermes/.env` (provider: `minimax`) |
3030
| **MiniMax China** | `MINIMAX_CN_API_KEY` in `~/.hermes/.env` (provider: `minimax-cn`) |
3131
| **Alibaba Cloud** | `DASHSCOPE_API_KEY` in `~/.hermes/.env` (provider: `alibaba`, aliases: `dashscope`, `qwen`) |
32+
| **Alibaba Coding Plan** | `DASHSCOPE_API_KEY` (provider: `alibaba-coding-plan`, alias: `alibaba_coding`) — separate billing SKU, different endpoint |
3233
| **Kilo Code** | `KILOCODE_API_KEY` in `~/.hermes/.env` (provider: `kilocode`) |
3334
| **Xiaomi MiMo** | `XIAOMI_API_KEY` in `~/.hermes/.env` (provider: `xiaomi`, aliases: `mimo`, `xiaomi-mimo`) |
3435
| **Tencent TokenHub** | `TOKENHUB_API_KEY` in `~/.hermes/.env` (provider: `tencent-tokenhub`, aliases: `tencent`, `tokenhub`, `tencentmaas`) |
@@ -136,7 +137,7 @@ The OpenAI Codex provider authenticates via device code (open a URL, enter a cod
136137
:::
137138

138139
:::warning
139-
Even when using Nous Portal, Codex, or a custom endpoint, some tools (vision, web summarization, MoA) use a separate "auxiliary" model — by default Gemini Flash via OpenRouter. An `OPENROUTER_API_KEY` enables these tools automatically. You can also configure which model and provider these tools use — see [Auxiliary Models](/docs/user-guide/configuration#auxiliary-models).
140+
Even when using Nous Portal, Codex, or a custom endpoint, some tools (vision, web summarization, MoA) use a separate "auxiliary" model. By default (`auxiliary.*.provider: "auto"`), Hermes routes these tasks to your **main chat model** — the same model you picked in `hermes model`. You can override each task individually to route it to a cheaper/faster model (e.g. Gemini Flash on OpenRouter) — see [Auxiliary Models](/docs/user-guide/configuration#auxiliary-models).
140141
:::
141142

142143
:::tip Nous Tool Gateway
@@ -411,6 +412,24 @@ Set `HERMES_QWEN_BASE_URL` only if the portal endpoint relocates (default: `http
411412
`qwen-oauth` uses the consumer-facing Qwen Portal with OAuth login — ideal for individual users. The `alibaba` provider uses DashScope's enterprise API with a `DASHSCOPE_API_KEY` — ideal for programmatic / production workloads. Both route to Qwen-family models but live at different endpoints.
412413
:::
413414

415+
### Alibaba Coding Plan
416+
417+
If you're subscribed to Alibaba's **Coding Plan** (a pricing SKU separate from standard DashScope API access), Hermes exposes it as its own first-class provider: `alibaba-coding-plan`. Endpoint: `https://coding-intl.dashscope.aliyuncs.com/v1`. It's OpenAI-compatible like the regular `alibaba` provider but with a different base URL and billing surface.
418+
419+
```yaml
420+
model:
421+
provider: alibaba_coding # alias for alibaba-coding-plan
422+
model: qwen3-coder-plus
423+
```
424+
425+
Or from the CLI:
426+
427+
```bash
428+
hermes chat --provider alibaba_coding --model qwen3-coder-plus
429+
```
430+
431+
`alibaba_coding` uses the same `DASHSCOPE_API_KEY` your `alibaba` entry already uses — no separate key needed, just a different routing target. Before this provider was registered, users who set `provider: alibaba_coding` in `config.yaml` silently fell through to OpenRouter routing.
432+
414433
### MiniMax (OAuth)
415434

416435
MiniMax-M2.7 via browser OAuth login — no API key needed. Pick **MiniMax (OAuth)** in `hermes model`, sign in through the browser, and Hermes persists the access + refresh tokens. Uses the Anthropic Messages-compatible endpoint (`/anthropic`) under the hood.

website/docs/reference/cli-commands.md

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,13 @@ hermes [global-options] <command> [subcommand/options]
6464
| `hermes tools` | Configure enabled tools per platform. |
6565
| `hermes sessions` | Browse, export, prune, rename, and delete sessions. |
6666
| `hermes insights` | Show token/cost/activity analytics. |
67+
| `hermes fallback` | Interactive manager for the fallback provider chain. |
6768
| `hermes claw` | OpenClaw migration helpers. |
6869
| `hermes dashboard` | Launch the web dashboard for managing config, API keys, and sessions. |
6970
| `hermes profile` | Manage profiles — multiple isolated Hermes instances. |
7071
| `hermes completion` | Print shell completion scripts (bash/zsh). |
7172
| `hermes version` | Show version information. |
72-
| `hermes update` | Pull latest code and reinstall dependencies. |
73+
| `hermes update` | Pull latest code and reinstall dependencies. `--check` prints commit diff without pulling; `--backup` takes a pre-pull `HERMES_HOME` snapshot. |
7374
| `hermes uninstall` | Remove Hermes from the system. |
7475

7576
## `hermes chat`
@@ -85,7 +86,7 @@ Common options:
8586
| `-q`, `--query "..."` | One-shot, non-interactive prompt. |
8687
| `-m`, `--model <model>` | Override the model for this run. |
8788
| `-t`, `--toolsets <csv>` | Enable a comma-separated set of toolsets. |
88-
| `--provider <provider>` | Force a provider: `auto`, `openrouter`, `nous`, `openai-codex`, `copilot-acp`, `copilot`, `anthropic`, `gemini`, `google-gemini-cli`, `huggingface`, `zai`, `kimi-coding`, `kimi-coding-cn`, `minimax`, `minimax-cn`, `minimax-oauth`, `kilocode`, `xiaomi`, `arcee`, `gmi`, `alibaba`, `deepseek`, `nvidia`, `ollama-cloud`, `xai` (alias `grok`), `qwen-oauth`, `bedrock`, `opencode-zen`, `opencode-go`, `ai-gateway`, `azure-foundry`. |
89+
| `--provider <provider>` | Force a provider: `auto`, `openrouter`, `nous`, `openai-codex`, `copilot-acp`, `copilot`, `anthropic`, `gemini`, `google-gemini-cli`, `huggingface`, `zai`, `kimi-coding`, `kimi-coding-cn`, `minimax`, `minimax-cn`, `minimax-oauth`, `kilocode`, `xiaomi`, `arcee`, `gmi`, `alibaba`, `alibaba-coding-plan` (alias `alibaba_coding`), `deepseek`, `nvidia`, `ollama-cloud`, `xai` (alias `grok`), `qwen-oauth`, `bedrock`, `opencode-zen`, `opencode-go`, `ai-gateway`, `azure-foundry`, `tencent-tokenhub` (alias `tencent`, `tokenhub`). |
8990
| `-s`, `--skills <name>` | Preload one or more skills for the session (can be repeated or comma-separated). |
9091
| `-v`, `--verbose` | Verbose output. |
9192
| `-Q`, `--quiet` | Programmatic mode: suppress banner/spinner/tool previews. |
@@ -112,6 +113,33 @@ hermes chat --worktree -q "Review this repo and open a PR"
112113
hermes chat --ignore-user-config --ignore-rules -q "Repro without my personal setup"
113114
```
114115

116+
### `hermes -z <prompt>` — scripted one-shot
117+
118+
For programmatic callers (shell scripts, CI, cron, parent processes piping in a prompt), `hermes -z` is the purest one-shot entry point: **single prompt in, final response text out, nothing else on stdout or stderr.** No banner, no spinner, no tool previews, no `Session:` line — just the agent's final reply as plain text.
119+
120+
```bash
121+
hermes -z "What's the capital of France?"
122+
# → Paris.
123+
124+
# Parent scripts can cleanly capture the response:
125+
answer=$(hermes -z "summarize this" < /path/to/file.txt)
126+
```
127+
128+
Per-run overrides (no mutation to `~/.hermes/config.yaml`):
129+
130+
| Flag | Equivalent env var | Purpose |
131+
|---|---|---|
132+
| `-m` / `--model <model>` | `HERMES_INFERENCE_MODEL` | Override the model for this run |
133+
| `--provider <provider>` | `HERMES_INFERENCE_PROVIDER` | Override the provider for this run |
134+
135+
```bash
136+
hermes -z "" --provider openrouter --model openai/gpt-5.5
137+
# or:
138+
HERMES_INFERENCE_MODEL=anthropic/claude-sonnet-4.6 hermes -z ""
139+
```
140+
141+
Same agent, same tools, same skills — just strips every interactive / cosmetic layer. If you need tool output in the transcript too, use `hermes chat -q` instead; `-z` is explicitly for "I only want the final answer".
142+
115143
## `hermes model`
116144

117145
Interactive provider + model selector. **This is the command for adding new providers, setting up API keys, and running OAuth flows.** Run it from your terminal — not from inside an active Hermes chat session.
@@ -181,6 +209,12 @@ Subcommands:
181209
| `uninstall` | Remove the installed service. |
182210
| `setup` | Interactive messaging-platform setup. |
183211

212+
Options:
213+
214+
| Option | Description |
215+
|--------|-------------|
216+
| `--all` | On `start` / `restart` / `stop`: act on **every profile's** gateway, not just the active `HERMES_HOME`. Useful if you run multiple profiles side-by-side and want to restart them all after `hermes update`. |
217+
184218
:::tip WSL users
185219
Use `hermes gateway run` instead of `hermes gateway start` — WSL's systemd support is unreliable. Wrap it in tmux for persistence: `tmux new -s hermes 'hermes gateway run'`. See [WSL FAQ](/docs/reference/faq#wsl-gateway-keeps-disconnecting-or-hermes-gateway-start-fails) for details.
186220
:::
@@ -462,6 +496,12 @@ Create a zip archive of your Hermes configuration, skills, sessions, and data. T
462496

463497
The backup uses SQLite's `backup()` API for safe copying, so it works correctly even when Hermes is running (WAL-mode safe).
464498

499+
**What's excluded from the zip:**
500+
501+
- `*.db-wal`, `*.db-shm`, `*.db-journal` — SQLite's WAL / shared-memory / journal sidecars. The `*.db` file already got a consistent snapshot via `sqlite3.backup()`; shipping the live sidecars alongside it would let a restore see a half-committed state.
502+
- `checkpoints/` — per-session trajectory caches. Hash-keyed and regenerated per session; wouldn't port cleanly to another install anyway.
503+
- The `hermes-agent` code itself (this is a user-data backup, not a repo snapshot).
504+
465505
### Examples
466506

467507
```bash
@@ -910,6 +950,44 @@ hermes completion bash >> ~/.bashrc
910950
hermes completion zsh >> ~/.zshrc
911951
```
912952

953+
## `hermes update`
954+
955+
```bash
956+
hermes update [--check] [--backup] [--restart-gateway]
957+
```
958+
959+
Pulls the latest `hermes-agent` code and reinstalls dependencies in your venv, then re-runs the post-install hooks (MCP servers, skills sync, completion install). Safe to run on a live install.
960+
961+
| Option | Description |
962+
|--------|-------------|
963+
| `--check` | Print the current commit and the latest `origin/main` commit side by side, and exit 0 if in sync or 1 if behind. Does not pull, install, or restart anything. |
964+
| `--backup` | Create a labeled pre-update snapshot of `HERMES_HOME` (config, auth, sessions, skills, pairing data) before pulling. Default is **off** — the previous always-backup behavior was adding minutes to every update on large homes. Flip it on permanently via `update.backup: true` in `config.yaml`. |
965+
| `--restart-gateway` | After a successful update, restart the running gateway service. Implies `--all` semantics if multiple profiles are installed. |
966+
967+
Additional behavior:
968+
969+
- **Pairing data snapshot.** Even when `--backup` is off, `hermes update` takes a lightweight snapshot of `~/.hermes/pairing/` and the Feishu comment rules before `git pull`. You can roll it back with `hermes backup restore --state pre-update` if a pull rewrites a file you were editing.
970+
- **Legacy `hermes.service` warning.** If Hermes detects a pre-rename `hermes.service` systemd unit (instead of the current `hermes-gateway.service`), it prints a one-time migration hint so you can avoid flap-loop issues.
971+
- **Exit codes.** `0` on success, `1` on pull/install/post-install errors, `2` on unexpected working-tree changes that block `git pull`.
972+
973+
## `hermes fallback`
974+
975+
```bash
976+
hermes fallback # interactive manager
977+
```
978+
979+
Manage the fallback provider chain (used when your primary provider hits a rate limit or returns a fatal error) without hand-editing `config.yaml`. Reuses the provider picker from `hermes model` — same provider list, same credential prompts, same validation.
980+
981+
Typical session:
982+
983+
1. Press `a` to add a fallback → pick a provider (OAuth-based providers open a browser; API-key providers prompt for the key), then pick the specific model.
984+
2. Use ``/`` to reorder fallbacks (first-in-list is tried first).
985+
3. Press `d` to remove one.
986+
987+
All changes persist to `fallback_providers:` under `model:` in `config.yaml`. Interacts with [Credential Pools](/docs/user-guide/features/credential-pools): pools rotate keys *within* a provider, fallbacks switch to a *different* provider entirely.
988+
989+
See [Fallback Providers](/docs/user-guide/features/fallback-providers) for behavior details and interaction with `fallback_model` (legacy single-fallback key).
990+
913991
## Maintenance commands
914992

915993
| Command | Description |

0 commit comments

Comments
 (0)