Spaces:
Paused
Paused
| sidebar_position: 2 | |
| # Profiles: Running Multiple Agents | |
| Run multiple independent Hermes agents on the same machine β each with its own config, API keys, memory, sessions, skills, and gateway. | |
| ## What are profiles? | |
| A profile is a fully isolated Hermes environment. Each profile gets its own directory containing its own `config.yaml`, `.env`, `SOUL.md`, memories, sessions, skills, cron jobs, and state database. Profiles let you run separate agents for different purposes β a coding assistant, a personal bot, a research agent β without any cross-contamination. | |
| When you create a profile, it automatically becomes its own command. Create a profile called `coder` and you immediately have `coder chat`, `coder setup`, `coder gateway start`, etc. | |
| ## Quick start | |
| ```bash | |
| hermes profile create coder # creates profile + "coder" command alias | |
| coder setup # configure API keys and model | |
| coder chat # start chatting | |
| ``` | |
| That's it. `coder` is now a fully independent agent. It has its own config, its own memory, its own everything. | |
| ## Creating a profile | |
| ### Blank profile | |
| ```bash | |
| hermes profile create mybot | |
| ``` | |
| Creates a fresh profile with bundled skills seeded. Run `mybot setup` to configure API keys, model, and gateway tokens. | |
| ### Clone config only (`--clone`) | |
| ```bash | |
| hermes profile create work --clone | |
| ``` | |
| Copies your current profile's `config.yaml`, `.env`, and `SOUL.md` into the new profile. Same API keys and model, but fresh sessions and memory. Edit `~/.hermes/profiles/work/.env` for different API keys, or `~/.hermes/profiles/work/SOUL.md` for a different personality. | |
| ### Clone everything (`--clone-all`) | |
| ```bash | |
| hermes profile create backup --clone-all | |
| ``` | |
| Copies **everything** β config, API keys, personality, all memories, full session history, skills, cron jobs, plugins. A complete snapshot. Useful for backups or forking an agent that already has context. | |
| ### Clone from a specific profile | |
| ```bash | |
| hermes profile create work --clone --clone-from coder | |
| ``` | |
| :::tip Honcho memory + profiles | |
| When Honcho is enabled, `--clone` automatically creates a dedicated AI peer for the new profile while sharing the same user workspace. Each profile builds its own observations and identity. See [Honcho -- Multi-agent / Profiles](./features/memory-providers.md#honcho) for details. | |
| ::: | |
| ## Using profiles | |
| ### Command aliases | |
| Every profile automatically gets a command alias at `~/.local/bin/<name>`: | |
| ```bash | |
| coder chat # chat with the coder agent | |
| coder setup # configure coder's settings | |
| coder gateway start # start coder's gateway | |
| coder doctor # check coder's health | |
| coder skills list # list coder's skills | |
| coder config set model.model anthropic/claude-sonnet-4 | |
| ``` | |
| The alias works with every hermes subcommand β it's just `hermes -p <name>` under the hood. | |
| ### The `-p` flag | |
| You can also target a profile explicitly with any command: | |
| ```bash | |
| hermes -p coder chat | |
| hermes --profile=coder doctor | |
| hermes chat -p coder -q "hello" # works in any position | |
| ``` | |
| ### Sticky default (`hermes profile use`) | |
| ```bash | |
| hermes profile use coder | |
| hermes chat # now targets coder | |
| hermes tools # configures coder's tools | |
| hermes profile use default # switch back | |
| ``` | |
| Sets a default so plain `hermes` commands target that profile. Like `kubectl config use-context`. | |
| ### Knowing where you are | |
| The CLI always shows which profile is active: | |
| - **Prompt**: `coder β―` instead of `β―` | |
| - **Banner**: Shows `Profile: coder` on startup | |
| - **`hermes profile`**: Shows current profile name, path, model, gateway status | |
| ## Running gateways | |
| Each profile runs its own gateway as a separate process with its own bot token: | |
| ```bash | |
| coder gateway start # starts coder's gateway | |
| assistant gateway start # starts assistant's gateway (separate process) | |
| ``` | |
| ### Different bot tokens | |
| Each profile has its own `.env` file. Configure a different Telegram/Discord/Slack bot token in each: | |
| ```bash | |
| # Edit coder's tokens | |
| nano ~/.hermes/profiles/coder/.env | |
| # Edit assistant's tokens | |
| nano ~/.hermes/profiles/assistant/.env | |
| ``` | |
| ### Safety: token locks | |
| If two profiles accidentally use the same bot token, the second gateway will be blocked with a clear error naming the conflicting profile. Supported for Telegram, Discord, Slack, WhatsApp, and Signal. | |
| ### Persistent services | |
| ```bash | |
| coder gateway install # creates hermes-gateway-coder systemd/launchd service | |
| assistant gateway install # creates hermes-gateway-assistant service | |
| ``` | |
| Each profile gets its own service name. They run independently. | |
| ## Configuring profiles | |
| Each profile has its own: | |
| - **`config.yaml`** β model, provider, toolsets, all settings | |
| - **`.env`** β API keys, bot tokens | |
| - **`SOUL.md`** β personality and instructions | |
| ```bash | |
| coder config set model.model anthropic/claude-sonnet-4 | |
| echo "You are a focused coding assistant." > ~/.hermes/profiles/coder/SOUL.md | |
| ``` | |
| ## Updating | |
| `hermes update` pulls code once (shared) and syncs new bundled skills to **all** profiles automatically: | |
| ```bash | |
| hermes update | |
| # β Code updated (12 commits) | |
| # β Skills synced: default (up to date), coder (+2 new), assistant (+2 new) | |
| ``` | |
| User-modified skills are never overwritten. | |
| ## Managing profiles | |
| ```bash | |
| hermes profile list # show all profiles with status | |
| hermes profile show coder # detailed info for one profile | |
| hermes profile rename coder dev-bot # rename (updates alias + service) | |
| hermes profile export coder # export to coder.tar.gz | |
| hermes profile import coder.tar.gz # import from archive | |
| ``` | |
| ## Deleting a profile | |
| ```bash | |
| hermes profile delete coder | |
| ``` | |
| This stops the gateway, removes the systemd/launchd service, removes the command alias, and deletes all profile data. You'll be asked to type the profile name to confirm. | |
| Use `--yes` to skip confirmation: `hermes profile delete coder --yes` | |
| :::note | |
| You cannot delete the default profile (`~/.hermes`). To remove everything, use `hermes uninstall`. | |
| ::: | |
| ## Tab completion | |
| ```bash | |
| # Bash | |
| eval "$(hermes completion bash)" | |
| # Zsh | |
| eval "$(hermes completion zsh)" | |
| ``` | |
| Add the line to your `~/.bashrc` or `~/.zshrc` for persistent completion. Completes profile names after `-p`, profile subcommands, and top-level commands. | |
| ## How it works | |
| Profiles use the `HERMES_HOME` environment variable. When you run `coder chat`, the wrapper script sets `HERMES_HOME=~/.hermes/profiles/coder` before launching hermes. Since 119+ files in the codebase resolve paths via `get_hermes_home()`, everything automatically scopes to the profile's directory β config, sessions, memory, skills, state database, gateway PID, logs, and cron jobs. | |
| The default profile is simply `~/.hermes` itself. No migration needed β existing installs work identically. | |