Hermes, the messenger, speaks any model
Hermes Agent is Nous Research's agent, and it takes a model from any local runtime as well as a hosted one. Link installs it, keeps it in a sandbox and up to date, and runs it as your agent's harness.
lnk agent start # your agent: paste your Anthropic key when it asks
lnk agent use --harness hermes # installs it, then starts it with your settings
lnk agent connect telegram # text it from your phoneUse a hosted model
Anthropic, OpenAI and OpenRouter work with your own key.
ANTHROPIC_API_KEY=sk-ant-... lnk agent startUse a local model
Hermes takes any local runtime lnk model list finds, such as Ollama,
LM Studio and llama.cpp. It needs a context of 64k tokens, and
Troubleshooting shows how to set that for Ollama.
lnk up models
lnk agent start --model qwen3Move from OpenClaw to Hermes
use hands Hermes your model and files folder, and Link's bridge carries
your connections to it, the same Telegram bot, Slack app, Discord bot and
Signal account, so it answers the same chats and Hermes itself holds no
bot's credential. What you send while it's stopped, starting or moving is
answered once it's up, and lnk agent chat send reaches it too.
lnk agent use --harness hermes
lnk agent status
lnk agent use --harness openclaw # and backWhat it carries
use carries your agent's state over ASP: switching away, Hermes's
conversations, files, skills and memory are kept in your agent's folder;
switching to it, every conversation that went on elsewhere since is
taken into Hermes's own sessions, each chat going on in its own.
Its memory, exported
Its MEMORY.md and USER.md go along at each switch away, kept in your
agent's folder as Hermes left them, and reach every other harness your
agent runs on after.
What others remember
At each start, what your agent remembers elsewhere, Link's notes and
what OpenClaw remembered, becomes entries of Hermes's MEMORY.md,
each opening (from link) or (from openclaw), after its own and
within 1,600 of its 2,200 characters, so its memory tool can still add.
Those entries are never exported back.
When it reads them
Hermes puts its memory into a conversation's prompt once, as the conversation starts, and keeps that prompt while it goes on, so its model's cache stays warm. An entry from elsewhere reaches Hermes's model from its next conversation, and the start says so when it writes new ones.
Each chat's thread
Each chat Link's bridge carries is the thread its session names
(telegram:42), on Telegram, Slack, Discord and Signal.
Who your agent is
Your agent's persona, owner and standing instructions go into a block of
Hermes's SOUL.md at each start, the rest of the file as it was, and
its skills are one of Hermes's skills folders.
Switching away
What SOUL.md holds besides, unless it's the one Hermes wrote, and the
skills Hermes made, neither bundled with it nor from its hub, come into
your agent's folder wherever it has none. Native history and memory
files stay in Hermes's home. Hermes's hermes claw migrate remains a
separate one-way import that Link does not run.
Its state, over ASP
Asked over ASP, as a switch asks, Hermes gives and takes its
conversations through its own SessionDB, run by its own Python: one
that comes in becomes a session of hermes acp's, once, so it's listed
and goes on. Its SOUL.md, its own skills, its memory and the MCP
servers you added to its config.yaml are carried both ways; its
settings are Link's.
Imported sessions
Completed tool records and images become native conversation records without
executing historical effects. Exact imported updates stay in
.hermes/link-imports.json and return unchanged on export, with later native
work appended. Divergent native history keeps both branches. Thinking and
unsupported content remain archival, named before switching and in the
import response.
How it runs
lnk agent start installs the Hermes release Link pins, with its own
Python and Node, in ~/Link/Agents/<agent>/Harnesses/hermes, and runs
hermes acp there, in the sandbox, behind lnk-hermes serve, its
endpoint.
Each message
Link's bridge sends it each message over ACP, with Link's key for this start, each chat a Hermes session of its own. Its terminal starts in your files folder. Security lists what it installs and the ports it uses.
Its scheduled jobs
Link's scheduler runs them: each reaches Hermes as a message from the schedule, and its answer goes to the chat the schedule names.
Files it keeps
What Link writes in the harness's home for it, beside Hermes's own files.
.hermes/.lnk-tools.json
The MCP servers Link added to Hermes's settings, one per tool, in
<harness home>, so it removes only its own.
.hermes/link.env
The key of its endpoint for this start, ENDPOINT_KEY, mode 600, which
only Link's bridge sends: kept beside Hermes's .env, never in it, so
Hermes never reads it.
.hermes/link-threads.json
Which Hermes session is each chat's thread, so a chat goes on where it was after a restart.
More about it
Troubleshooting says what to do when it fails,
Decisions why it works this way and
Security what it may do. Compare
Harnesses
sets it beside the other harnesses, and the other lnk agent commands
are on the
Agents
page.
Work on its code
How to build and test lnk-hermes, and how it's released and licensed.
Build and test
It depends on link-plugin from the core, beside it in the public
workspace.
cargo fmt --check
cargo clippy --all-targets --locked -- -D warnings
cargo test --lockedRelease
Link's release builds lnk-hermes from this folder and ships it as one
of Link's plugins, at the core's version, signed with Link's key.
License
MIT or Apache-2.0, at your option.
Docs
- Security: What
lnk-hermesinstalls and runs, beyond what Link's sandbox guarantees every harness (Link's Agents Security page) - Decisions: Why
lnk-hermesruns Hermes Agent the way it does - Troubleshooting: What to do when Hermes Agent doesn't install, start or remember (Hermes Agent)