Hermes Agent supports two mechanisms for running multiple personas/contexts:
Each profile is a separate Hermes home directory with its own:
- config.yaml — independent settings, model, provider
- SOUL.md — independent identity/persona
- MEMORY.md — independent memory
- USER.md — independent user profile
- users/ — independent per-user directories
- skills/ — independent skills
- sessions/ — independent conversation history
hermes profile create NAME --clone # Copy config + SOUL + skills
hermes profile create NAME --clone-all # Copy everything (memory + sessions)
hermes profile create NAME --clone-from SOURCE # Clone from specific profile
hermes profile use NAME # Set as default
hermes --profile NAME chat # One-off command with specific profile
hermes profile alias NAME # Create wrapper command (e.g., hermes-samantha)
hermes profile list # Show all profiles
hermes profile show NAME # Show profile details
hermes profile delete NAME # Remove profile
hermes profile export NAME # Backup to tar.gz
hermes profile import FILE # Restore from archive
~/.hermes/profiles/NAME/
├── config.yaml # Independent config
├── SOUL.md # Independent identity
├── .env # API keys (can be shared or separate)
├── memories/ # Independent memory
│ ├── MEMORY.md
│ ├── USER.md
│ └── users/
├── skills/ # Independent skills
└── sessions/ # Independent conversation history
Each profile can run its own gateway instance: - Different bot tokens (e.g., WhatsApp for personal, Telegram for work) - Different ports - Simultaneous operation - No interference between profiles
Defined in config.yaml under agent.personalities:
agent:
personalities:
professional:
system_prompt: "You are a professional work assistant..."
tone: "direct"
style: "structured"
casual:
system_prompt: "You are a playful assistant..."
tone: "casual"
style: "humorous"
Activated via display.personality: NAME in config.
Hermes supports per-user memory separation:
memories/
├── MEMORY.md # Global memory (all contexts)
├── USER.md # Global user profile
└── users/
├── henry/
│ ├── USER.md # Henry's personal info
│ └── MEMORY.md # Henry's personal notes
├── henna/
│ ├── USER.md # Henna's info
│ └── MEMORY.md # Henna's notes
└── group/
├── USER.md # Group chat info
└── MEMORY.md # Group chat rules
Each user directory is loaded based on who's talking (platform user ID).
GitHub issue #33548 proposes {PLATFORM}_USER_PROFILE_MAP environment variable:
- Maps platform user IDs to Hermes profiles
- Single bot serves different users with fully isolated profiles
- Each user gets their own config, skills, memory, model, cronjobs
- Not yet implemented (as of 2026-06-17)
Default profile (Ming):
- WhatsApp gateway (personal)
- Personal memory, users, skills
- Casual tone
Work profile (Samantha):
- Telegram gateway (work)
- Work memory, users, skills
- Professional tone
Pros: True isolation, no cross-contamination Cons: Double maintenance, two sets of config/memory/skills
Default profile (Ming):
- One gateway (all channels)
- Shared memory and users
- Work mode activated via keyword ("work mode")
- Different focus/tone based on context
Pros: Simple, single maintenance Cons: No memory separation, work sees personal context
Default profile:
- One gateway
- `display.personality` switched manually
- Tone/style changes, but memory/users stay same
Pros: Minimal setup Cons: Global switch, no per-channel automation, no real separation
| Need | Profile | Personality | Work Mode |
|---|---|---|---|
| Different identity | ✅ | ✅ | ❌ |
| Memory separation | ✅ | ❌ | ❌ |
| User separation | ✅ | ❌ | ❌ |
| Different tools | ✅ | ❌ | ❌ |
| Per-channel auto-switch | ❌ | ❌ | ❌ |
| Single maintenance | ❌ | ✅ | ✅ |
| Different gateway | ✅ | ❌ | ❌ |
The choice depends on whether you need memory separation or just behavioral separation: