Hermes Agent Is Not a Chatbot Framework. It’s Early Infrastructure
Subtitle:
Most agent projects optimize for the demo. Hermes Agent is optimized for what happens after the demo: persistence, coordination, retries, and operational survival.
Most AI agent projects still live in the age of the demo.
They can search, call tools, edit files, maybe even spawn another agent. For a few minutes, that feels like the future. Then the runtime starts to matter. Context swells. Tools fail in unglamorous ways. Memory becomes a vague promise instead of a state model. Multi-agent coordination turns into prompt theater. What looked like autonomy was often just a well-lit happy path.
Hermes Agent is interesting because it seems to understand that the real problem starts exactly where the demo ends.
After reading the docs and tracing the repository itself, I kept coming back to one conclusion: Hermes Agent is not trying to become a better chatbot framework. It is attempting to become infrastructure for operational autonomous AI systems.
That distinction matters. A chatbot framework is mostly about interaction quality. An autonomous runtime is about continuity: surviving retries, preserving state, routing across providers, controlling tools, and coordinating work that outlives a single exchange.
Halfway through tracing the runtime, I realized Hermes was not really optimizing for chatbot UX at all. It was optimizing for operational continuity.
That belief shows up everywhere:
- in how prompts are stabilized for cache reuse
- in how memory is bounded instead of mythologized
- in how tools are registered, filtered, and stitched back into the transcript
- in how background self-improvement produces files and skill patches instead of invisible “learning”
- in how “multi-agent” means both short-lived delegation and durable Kanban-backed coordination
Most projects avoid these tradeoffs because they make the system messier. Hermes leans into them because that mess is the actual work.
“Tool calling is easy. Operational durability is hard.”
[Insert screenshot: Hermes TUI showing active tool execution, status updates, and a running conversation]
The real problem Hermes Agent is trying to solve
The common failure mode in agent systems is not reasoning. It is orchestration.
Once an agent is allowed to act over time, the center of gravity shifts. The model becomes only one component. The real difficulty moves into runtime concerns:
- how turns are persisted
- how context is compressed
- how tool failures are retried
- how permissions are enforced
- how model transports differ
- how work is interrupted
- how state is handed off
- how multiple workers coordinate without hallucinating coordination
This is where many “agent frameworks” quietly collapse. They solve the first inference call and leave everything after that to application code, operator discipline, or luck.
Hermes takes a different stance. It treats long-running autonomy as an infrastructure problem. If you take that seriously, memory stops being a product flourish and becomes a state model. Tooling stops being a list of functions and becomes an execution layer. Multi-agent stops being a branching trick and becomes workflow coordination. Prompt construction stops being prompt engineering and becomes cache economics.
The deeper architectural signal here is simple: the runtime eventually becomes the real product.
That is why Hermes feels different. It is one of the few open-source projects in this space that consistently behaves as though the hardest part of agents is not getting them to act, but getting them to keep acting coherently.
What Hermes Agent actually is
At the surface, Hermes Agent is an open-source agent from Nous Research that runs in a terminal, over messaging platforms, through editor integrations, and in scheduled jobs.
At the systems level, it is better understood as four things at once:
- An agent execution kernel
- A tool orchestration runtime
- A persistence and memory layer
- A coordination layer for long-running autonomous work
The core object is AIAgent in run_agent.py, but the project has been steadily decomposing that runtime into subsystem modules for conversation flow, prompt assembly, provider resolution, tool execution, compression, memory, and background review.
That decomposition is not cosmetic. It is what happens when a project stops being a clever monolith and starts becoming a platform.
flowchart TD
A["Entry Surfaces<br/>CLI / TUI / Gateway / ACP / Cron / API"] --> B["AIAgent Runtime"]
B --> C["Prompt Assembly<br/>stable / context / volatile"]
B --> D["Runtime Provider Resolver<br/>transport + auth + model"]
B --> E["Tool Registry + Dispatch"]
B --> F["Session State"]
B --> G["Background Review"]
B --> H["Kanban Coordination"]
C --> I["SOUL.md / AGENTS.md / .hermes.md"]
C --> J["MEMORY.md / USER.md"]
E --> K["Terminal / Files / Browser / Web"]
E --> L["MCP Servers"]
E --> M["Delegation / Memory / Messaging Tools"]
F --> N["SQLite state.db + FTS5"]
H --> O["SQLite kanban.db"]
G --> P["Skill Updates + Memory Writes"]
[Insert diagram: Full Hermes runtime architecture]
The interesting part is not the number of features. It is the shape. Hermes is designed as though the agent may need to keep working across interfaces, failures, sessions, and execution environments. That is infrastructure thinking.
Before the architecture gets interesting, the setup has to be boring
Good runtime design starts with a practical first-run path.
The shortest install is:
pip install hermes-agent
hermes
The docs also cover Linux, macOS, WSL2, Termux, and early-beta native Windows support. One date detail is worth being precise about: on May 19, 2026, the latest public GitHub release page I verified showed v0.13.0, while the repository main branch I inspected already contained version = "0.14.0" and a corresponding release note file. Hermes is moving quickly enough that release state and main-branch architecture briefly diverge.
Provider setup happens through:
hermes model
That command is doing more than picking a model. Hermes resolves a runtime shape:
- provider
- base URL
- auth source
- API mode
- transport path
Then the first useful run is:
hermes --tui
A grounded first prompt is still the best test:
Summarize this repository in 5 bullets and tell me what the main entrypoint is.
From there, a realistic workflow is:
hermes tools
hermes skills
hermes doctor
hermes gateway setup
I like this sequence because it reflects operational maturity in the docs themselves. Hermes does not encourage you to turn on everything at once. It encourages you to stabilize the runtime, then widen the surface area.
[Insert screenshot: hermes model or hermes --tui first-run view]
Once an agent persists across turns, runtime architecture becomes the story
The core runtime behavior lives across run_agent.py, agent/conversation_loop.py, agent/system_prompt.py, and related modules. The crucial point is that Hermes is not simply “asking the model what to do next.” It is supervising a controlled loop.
flowchart TD
A["User Input"] --> B["Restore or Build Cached System Prompt"]
B --> C["Resolve Provider Runtime"]
C --> D["Call Model"]
D --> E{"Tool Calls?"}
E -- Yes --> F["Validate + Guardrail + Approve"]
F --> G["Dispatch Tools"]
G --> H["Collect and Stitch Results"]
H --> D
E -- No --> I["Finalize Output"]
I --> J["Persist Session"]
J --> K["Optional Background Review"]
[Insert diagram: Runtime execution lifecycle]
One runtime across many surfaces
Hermes tries hard to keep a single AIAgent core serving CLI, gateway, cron, ACP, and related flows. Platform differences are pushed outward into routing, delivery, and UX.
That matters because it prevents every surface from becoming its own slightly different ontology of the agent. A lot of systems fracture here. Hermes mostly resists that fracture.
The conversation loop is really a control loop
The deeper architectural signal in agent/conversation_loop.py is that it behaves more like a supervisor than a wrapper.
A turn includes:
- prompt restoration from persisted session state
- message sanitization
- provider resolution and transport selection
- retry and fallback logic
- compression triggers
- tool-call validation
- interrupt propagation
- session DB writes
- memory and skill review nudges
This is where Hermes stops feeling like a demo framework. A demo loop asks “what should the model do next?” Hermes also asks “what happens if the answer is malformed, interrupted, stale, rate-limited, context-broken, or partially completed?”
Prompt assembly is engineered for stability
Hermes’s prompt layering is one of its sharpest decisions.
agent/system_prompt.py splits the prompt into:
stablecontextvolatile
The stable layer includes identity, tool-use directives, model-family execution guidance, skills prompts, and environment hints. The context layer includes project-shaping files like AGENTS.md, .hermes.md, and SOUL.md. The volatile layer includes memory snapshots, user profile blocks, and timestamp/session/provider metadata.
What surprised me most was how aggressively Hermes optimizes prompt stability as a systems concern rather than a prompt-engineering trick. This is not just about better prompts. It is about preserving prefix-cache reuse, reducing cost, and keeping runtime behavior explainable.
flowchart LR
A["Stable Layer<br/>identity + tool guidance + skill guidance"] --> D["Final System Prompt"]
B["Context Layer<br/>AGENTS.md + .hermes.md + SOUL.md"] --> D
C["Volatile Layer<br/>memory + user profile + session metadata"] --> D
[Insert diagram: Prompt layering system]
Provider abstraction is not fake abstraction
Many frameworks flatten providers into a lowest-common-denominator API and let the edge cases leak later. Hermes does something more honest.
hermes_cli/runtime_provider.py resolves not just a model and credential, but a transport family:
chat_completionscodex_responsesanthropic_messagesbedrock_converse- optional Codex app-server runtime
That solves a real problem: the APIs are not actually interchangeable. Tool calls, streaming semantics, reasoning payloads, and multimodal behavior differ in ways that matter. Hermes absorbs that complexity into the runtime instead of pretending it does not exist.
Retries are a defining feature, not an accessory
If you want to know whether a project is serious about autonomy, inspect its retry paths.
Hermes has many of them.
The conversation loop handles malformed responses, empty content, truncated tool calls, JSON corruption, context errors, unsupported multimodal payloads, auth expiry, rate limiting, stream failures, and provider-specific oddities. It can also rotate through fallback models/providers when configured.
Most projects avoid this tradeoff entirely because retry logic is thankless and makes architectures uglier. But a long-running agent without recovery paths is just a failure demo with better branding.
“Most agent systems fail not at reasoning, but at orchestration.”
The codebase is large, but it isn’t confused
Hermes is broad, and sometimes sprawling, but the repository has a recognizable internal shape.
| Path | Role in the system |
|---|---|
run_agent.py |
top-level AIAgent surface and compatibility layer |
agent/conversation_loop.py |
main turn execution loop |
agent/agent_init.py |
runtime initialization |
agent/system_prompt.py |
prompt assembly and invalidation |
agent/prompt_builder.py |
skills, context files, guidance blocks |
model_tools.py |
tool discovery and schema resolution |
tools/registry.py |
central tool registry |
agent/tool_executor.py |
sequential and concurrent tool execution |
hermes_state.py |
SQLite session DB with FTS5 |
agent/memory_manager.py |
built-in and external memory orchestration |
agent/background_review.py |
memory and skill review fork |
tools/delegate_tool.py |
short-lived subagent delegation |
cron/ |
scheduled execution |
gateway/ |
messaging runtime and adapters |
hermes_cli/kanban.py + kanban_db.py
|
durable multi-agent task system |
Two patterns stand out.
First, Hermes is clearly in the middle of a long modularization process. Large methods have been extracted into subsystem modules while compatibility wrappers stay in the top-level runtime. That is exactly the kind of unglamorous refactor a project undergoes when it is growing from a tool into a platform.
Second, Hermes leans heavily on registry-based extensibility. Tools self-register. Providers are registry-driven. Plugins and MCP servers join controlled discovery paths. Registries are one of the few ways a runtime can keep growing without turning every new capability into hand-maintained branching logic.
The tradeoff is obvious: power buys complexity. But the codebase’s shape suggests the maintainers know that and are paying the price consciously.
The moment memory becomes operational, infinite-context fantasies start to look unserious
Hermes’s memory design is one of the clearest examples of systems maturity in the project.
It does something many AI products still resist: it makes memory small.
The built-in model revolves around two files:
MEMORY.mdUSER.md
MEMORY.md stores durable operational facts: environment quirks, stable conventions, useful learned constraints. USER.md stores user preferences and long-lived interaction norms.
This is not as flashy as “infinite adaptive memory.” It is better.
flowchart TD
A["Session Start"] --> B["Load MEMORY.md"]
A --> C["Load USER.md"]
B --> D["Prompt Snapshot"]
C --> D
E["Conversation History"] --> F["SQLite state.db"]
F --> G["FTS5 Session Search"]
H["Background Review"] --> I["Memory Tool Writes"]
I --> B
I --> C
[Insert diagram: Memory architecture visualization]
Why bounded memory is more credible than infinite memory
Bounded memory forces a runtime to answer the right question: what is durable enough to deserve always-on context?
Infinite memory usually creates four pathologies:
- stale facts stay live too long
- prompt cost grows without discipline
- importance becomes harder to rank
- debugging behavior gets much harder because state is diffuse
Hermes separates memory from history.
- Memory is small, curated, and injected up front.
- History is persisted in SQLite and searchable via FTS5.
That separation is stronger than it first appears. Memory answers: what should always matter? Session search answers: what happened before? Those are different questions, and most systems blur them.
Frozen snapshots are a feature
Hermes loads memory into the prompt as a frozen snapshot at session start. If the agent writes new memory during the session, the change persists to disk but does not mutate the live prompt.
At first that can feel conservative. The longer I sat with it, the more correct it looked.
This preserves:
- prompt stability
- prefix-cache reuse
- explainability of current-turn behavior
- resistance to hidden state drift
Memory here is not mystical. It is bounded, inspectable, editable, and operational. That is probably much closer to what future autonomous systems will actually need.
Tooling is where the runtime starts to show its real shape
Tool orchestration is the point where most agents stop being “model products” and start being systems problems.
Hermes has a notably mature answer to that transition.
The registry is the center of the tool system
The tooling model is built around tools/registry.py and model_tools.py.
Tool modules self-register. Discovery imports them. Schemas are filtered by toolsets, availability checks, config, and runtime generation. Plugins and MCP tools enter the same broad control plane.
The interesting part is not the registry itself, but what it implies: Hermes treats tools as runtime citizens, not prompt accessories.
Runtime-aware exposure is more important than it sounds
Hermes does not expose every tool all the time.
Tool visibility can depend on:
- enabled or disabled toolsets
- platform configuration
- capability probes
- plugin discovery
- MCP server filtering
- runtime conditions
That matters because capability management is part of model performance. Overexpose the tool surface and the agent wastes turns, widens risk, and reasons against irrelevant options. Hermes seems to understand that tool selection is as much about subtraction as addition.
Concurrent dispatch is handled like a real subsystem
Hermes supports concurrent tool execution, but with more care than most comparable systems.
The executor in agent/tool_executor.py:
- checks whether a batch is safe to parallelize
- propagates approval callbacks into worker threads
- propagates interrupts
- preserves original tool-call ordering in the results stream
- keeps activity surfaces alive during longer work
That last point is underrated. Tool concurrency is not interesting because it is fast. It is interesting because it is easy to break transcript coherence. Hermes is one of the few projects here that seems visibly worried about that problem.
flowchart LR
A["Model Tool Calls"] --> B["Argument Parse"]
B --> C["Guardrails + Approval"]
C --> D{"Parallel Safe?"}
D -- Yes --> E["Concurrent Dispatch"]
D -- No --> F["Sequential Dispatch"]
E --> G["Ordered Result Collection"]
F --> G
G --> H["Transcript Stitching"]
H --> I["Next Model Turn"]
[Insert diagram: Tool orchestration lifecycle]
[Insert screenshot: Hermes tool execution in progress, showing multiple tool calls or status indicators]
MCP is treated as a namespace problem, not a novelty feature
Hermes’s MCP integration supports:
- stdio and HTTP servers
- dynamic discovery
- per-server include/exclude filters
- capability-aware registration of resource and prompt utilities
- runtime refresh when tool lists change
What matters is not that Hermes “supports MCP.” It is that MCP capabilities join the same managed runtime namespace as native tools. That is what makes it infrastructural.
Safety is inside the dispatch path
Hermes layers safety through:
- dangerous command approvals
- tool guardrails
- environment-aware restrictions
- context-file injection scanning
- sanitization of tool errors before reinjection into prompt context
No agent runtime with terminal access is ever truly “safe” in the comforting marketing sense. But Hermes does reflect the right mindset: once the agent can act, the runtime’s job is partly to bound how that action proceeds.
A realistic workflow: where Hermes stops looking like an agent shell and starts looking like operations software
The clearest way to understand Hermes is to follow a real workflow instead of a staged prompt.
Consider a small security engineering team using Hermes for nightly supply-chain triage on monitored open-source packages.
-
Cron starts the run
- Hermes launches from the scheduler with a self-contained prompt and configured toolsets.
- The run starts without prior chat history, but with access to persistent memory, skills, and configured tools.
-
The agent gathers evidence
- It uses web and file tools to inspect changelogs, manifests, release notes, and advisory sources.
- It uses terminal tools in a sandboxed backend to diff dependencies or unpack suspicious artifacts.
-
A suspicious signal appears
- A package adds a new
postinstallscript and an unexpected outbound network call. - Hermes records concrete findings instead of vague suspicion.
- A package adds a new
-
The work exceeds one clean pass
- Instead of pretending one loop is enough, Hermes creates a durable Kanban task assigned to a specialist profile: reverse engineering, code review, or threat intel.
-
A worker claims the task
- Another Hermes worker claims the task from
kanban.db. - It inherits the task summary, prior evidence, workspace context, and comments.
- Another Hermes worker claims the task from
-
The worker performs deeper analysis
- It uses bounded delegation for short subproblems and board-backed coordination for the broader workflow.
- If a human judgment call is needed, it blocks the task explicitly rather than improvising.
-
Retries and failure are normal
- If a provider rate-limits, Hermes retries or falls back.
- If a run stalls, the worker heartbeat keeps the board honest.
- If a process exits, the task still exists.
-
Results become durable artifacts
- The worker completes the task with a summary and metadata.
- Background review extracts reusable techniques into a skill.
- Memory updates capture durable facts, not transient case details.
flowchart TD
A["Cron Trigger"] --> B["Hermes Investigation Run"]
B --> C["Search + Diff + Sandbox Analysis"]
C --> D{"Suspicious?"}
D -- No --> E["Report and Exit"]
D -- Yes --> F["Create Kanban Task"]
F --> G["Specialist Worker Claims Task"]
G --> H["Deep Analysis + Tool Use"]
H --> I{"Need Human Decision?"}
I -- Yes --> J["Block Task with Reason"]
I -- No --> K["Complete Task with Summary + Metadata"]
K --> L["Background Review Updates Skill or Memory"]
[Insert diagram: Realistic operational workflow]
[Insert screenshot: Kanban board or task coordination view]
The moment the Kanban subsystem clicked for me, Hermes stopped looking like an agent framework and started looking like workflow infrastructure.
The important thing is not that Hermes can automate part of an investigation. Plenty of systems can do that. The important thing is that Hermes has primitives for durability across the workflow:
- scheduled entry
- persistent history
- delegated and durable coordination
- retries and fallbacks
- explicit blocking
- stable artifacts after completion
That is the difference between an assistant and a runtime.
“Multi-agent” usually means too little. Hermes splits it into two separate problems.
A lot of agent discourse uses “multi-agent” to describe anything involving more than one model invocation. That is not precise enough.
Hermes implicitly distinguishes between two categories of multi-agent behavior.
1. Ephemeral delegation
delegate_task in tools/delegate_tool.py creates child agents with isolated context, restricted tools, and focused tasks.
This is useful for:
- bounded parallel research
- scoped implementation subtasks
- isolated reasoning branches
It is fast, local, and temporary.
2. Durable coordination
The Kanban system in hermes_cli/kanban.py and kanban_db.py is something else entirely.
It provides:
- SQLite-backed tasks
- atomic claims
- heartbeats
- retries
- comments
- status transitions
- worker workspaces
- reassignment and blocking
This is not a swarm. It is workflow infrastructure.
flowchart LR
A["Parent Agent"] --> B["delegate_task"]
A --> C["Kanban Task"]
B --> D["Ephemeral Child Agent<br/>isolated context"]
C --> E["Persistent Task Row"]
E --> F["Claimed by Worker"]
F --> G["Heartbeat / Retry / Block / Complete"]
[Insert diagram: Delegation vs durable coordination]
This is where Hermes feels most future-facing. Most frameworks stop at the left side of that diagram. Hermes is trying to build the right side too.
Comparing Hermes to other frameworks means comparing philosophies, not just features
The least interesting way to compare agent systems is by counting tools or integrations.
The better question is: what problem is each system really optimized to solve?
LangChain / LangGraph
LangChain and LangGraph are strongest as application-construction frameworks. They give developers structured ways to compose model calls, state, routing, and execution graphs.
Their strength is composability. Their tradeoff is that you own more of the runtime philosophy yourself.
Hermes is less of a framework for assembling arbitrary LLM applications and more of a pre-shaped environment for running a persistent agent.
CrewAI
CrewAI shines when you want role-oriented multi-agent workflow authoring. It makes “a crew of agents” legible and approachable.
Hermes feels less role-first and more runtime-first. It spends more attention on tool discipline, memory, persistence, transport abstraction, and operational recovery.
AutoGen
AutoGen is excellent when your center of gravity is agent-to-agent interaction or multi-agent experimentation.
Hermes is less elegant as a pure research substrate, but stronger as an environment for agents that must live across terminals, chats, boards, and scheduled runs.
OpenAI Agents SDK
The OpenAI Agents SDK is clean, modern, and impressive as a developer orchestration toolkit with tracing, handoffs, and strong core primitives.
Hermes is solving a neighboring but different problem. The OpenAI SDK is a strong developer toolkit. Hermes is trying to become a runtime habitat.
| System | What it feels optimized for |
|---|---|
| LangChain / LangGraph | composable LLM application architecture |
| CrewAI | role-based multi-agent workflow authoring |
| AutoGen | agent-to-agent orchestration and experimentation |
| OpenAI Agents SDK | modern orchestration SDK with strong core primitives |
| Hermes Agent | persistent runtime for operational autonomous agents |
This is why fanboy comparisons are unhelpful. Hermes is not simply “better.” It is more committed to one thesis: that long-running autonomous systems need a runtime layer that is itself a serious software system.
The price of being infrastructural is complexity
This is the section that determines whether praise is credible.
What Hermes gets unusually right
- Prompt stability: the stable/context/volatile split is one of the best prompt architectures I have seen in an open-source agent runtime.
- Memory discipline: bounded files plus searchable session history is far more credible than most “infinite memory” stories.
- Runtime honesty: provider transport differences are absorbed into the resolver instead of wished away.
- Tool maturity: registry-driven tools, filtered exposure, guarded concurrency, and interrupt propagation all suggest real operational experience.
- Durable coordination: the Kanban subsystem is more serious than most so-called multi-agent systems.
Where the system pays for that ambition
- Repo sprawl: Hermes is broad, and broad systems accumulate complexity quickly.
- Operational burden: once you use gateway, cron, MCP, plugins, multiple providers, memory backends, and Kanban together, you are operating infrastructure.
- Uneven maturity: some subsystems feel deeply settled; others still feel like active frontier construction.
- Extensibility tension: registries are powerful, but every new toolset, provider, or plugin path expands the maintenance surface.
- Not minimalist: if your problem is embedding one tightly scoped agent in an app, Hermes may be more runtime than you need.
The interesting part is not that Hermes is complex. The interesting part is that this complexity may be unavoidable for the class of problem it is tackling.
Persistent autonomous systems are fundamentally an infrastructure problem. Infrastructure eventually becomes layered, failure-aware, and operationally heavy. Hermes is paying that price early.
That is both the source of its power and the source of its rough edges.
We may be watching the transition from chatbot interfaces to AI runtime infrastructure
The strongest reason to care about Hermes is not that it is finished. It is that it points in the right direction.
A lot of the industry still talks about agents as though the future will be won by better prompting, nicer wrappers, or more provider options. Those things matter. But they do not solve the deeper problem.
Long-running autonomous systems need:
- durable state
- bounded memory
- stable prompts
- reliable retries
- explicit orchestration
- interruptibility
- transport-aware model routing
- coordination that survives process boundaries
- learning mechanisms that produce visible artifacts
That starts to look less like “chat” and more like a new runtime layer.
A few years ago, most AI tooling revolved around prompts and interfaces. Hermes feels like part of a more important transition: the center of gravity is shifting toward runtimes, orchestration, memory discipline, and operational continuity. That shift matters because the next generation of useful AI systems will be defined less by how well they chat and more by how well they persist, recover, coordinate, and keep working once the novelty wears off.
Hermes is one of the clearer open-source examples of that shift. It treats learning as files, skills, and memory mutations rather than hidden latent state. It treats multi-agent work as durable coordination rather than theatrical swarms. It treats prompt stability as an economic and architectural concern. It treats the runtime as the product.
That is why this project feels important.
Not because it is small. Not because it is tidy. Not because it is polished in every corner.
But because it behaves as if the next era of agents will not be defined by who can generate the slickest demo, but by who can build systems that keep working after the demo is over.
And if that is true, Hermes Agent is not another wrapper.
It is an early piece of the runtime layer for autonomous AI infrastructure.
“The future of agents may depend less on better models than on better runtime architecture.”

























