Skip to main content

Overview

Hermes Agent is a self-hosted AI agent from Nous Research. You bring the model — an API key for Anthropic, OpenAI, or any OpenAI-compatible endpoint — and the agent brings the memory, tools, and interfaces around it. This template deploys the supervised gateway with an OpenAI-compatible API for your clients and an internal-only web dashboard, with all agent state on a persistent volume.

Architecture

  • Hermes Agent — A single-replica stateful workload running the supervised gateway. It serves the OpenAI-compatible API on port 8642 and the web dashboard on port 9119. Headless Chromium for browser automation is baked into the image and launched on demand.
  • Model — External. Every completion is dispatched to your LLM provider using a key you supply; the workload holds no model weights.

What Gets Created

  • Stateful Hermes Agent Workload — Single replica. Gateway API on port 8642 (bearer auth, optionally public); web dashboard on port 9119 (internal only, basic auth).
  • Volume Set — 10 GiB persistent storage at /opt/data for the SQLite memory database, sessions, learned skills, and agent config. Supports optional autoscaling.
  • Identity & Policy — An identity bound to the workload with reveal access to exactly the one prerequisite secret, and nothing else.
This template does not create a GVC. You must deploy it into an existing GVC.

Prerequisites

Hermes Agent needs an LLM API key and a dictionary secret that you create before installing. No credential is passed through values.
1

Get an LLM API key

Obtain a key from your provider — Anthropic, OpenAI, or any OpenAI-compatible endpoint (OpenRouter, Ollama, vLLM, LM Studio, a proxy) reached via provider: custom.
2

Generate a gateway API key

Generate the bearer token your clients will present to the gateway API. It must be at least 16 characters — generate one with openssl rand -hex 32.
3

Create a dictionary secret

Create a dictionary secret holding the three values below. Name the keys however you like — map them with secret.keys at install, so an existing secret works unchanged. Pass the secret’s name as secret.name.
Hermes rejects an API server key shorter than 16 characters. The gateway still starts, but the API never serves and the workload never becomes ready.
Once your secret exists, install the template using your preferred method:

UI

Browse, install, and manage templates visually

CLI

Manage templates from your terminal

Terraform

Declare templates in your Terraform configurations
Pulumi Icon Streamline Icon: https://streamlinehq.com

Pulumi

Declare templates in your Pulumi programs

Configuration

The default values.yaml for this template:

Model

  • image — The Hermes Agent container image.
  • model.provider — The LLM provider:
  • model.name — Model override, e.g. claude-opus-4.6, gpt-5. Empty uses the provider default. Recommended for non-Anthropic providers.
  • model.baseUrl — The OpenAI-compatible endpoint. Required when provider is custom.
  • model.reasoningEffortnone, low, medium, or high (default medium).
To reach OpenRouter or any other OpenAI-compatible service, use provider: custom:
Hermes sends a reasoning effort with every request, and models that do not support reasoning reject it with 400: Unsupported parameter: 'reasoning.effort'. Set reasoningEffort: none for those (e.g. gpt-4o); leave the default for reasoning-capable models (e.g. gpt-5, claude-opus-4.6).
model.baseUrl has no effect with provider: anthropic — the Anthropic client ignores it. The template fails at render if you set both, so use provider: custom to route through a proxy.

Secret

  • secret.name — Name of the dictionary secret you created. See Prerequisites.
  • secret.keys.apiKey / secret.keys.apiServerKey / secret.keys.dashboardPassword — The key names within your secret that hold each value. Override these to match an existing secret rather than renaming its keys.

Dashboard

  • dashboard.enabled — Serve the web dashboard on port 9119. Internal only — it is never published on the public endpoint.
  • dashboard.username — Basic-auth username. The password comes from your secret.

Resources

  • resources.minCpu / resources.minMemory — The idle floor.
  • resources.cpu / resources.memory — The burst ceiling, giving headroom for the on-demand headless browser.
The min→max spread is the elasticity: the workload idles at the floor and bursts toward the ceiling only while browser automation runs. Keep cpu under 4× minCpu — the platform rejects a wider ratio.

Storage

  • volumeset.capacity — Initial volume size in GiB (minimum 10) for the memory database, sessions, skills, and config.
  • volumeset.autoscaling.enabled — Automatically expand the volume as state grows. When enabled:
    • maxCapacity — Maximum volume size in GiB.
    • minFreePercentage — Trigger a scale-up when free space drops below this percentage.
    • scalingFactor — Multiply the current capacity by this factor when scaling up.

Access

  • publicAccess.enabled — Expose the gateway API on the public canonical HTTPS endpoint. Defaults to false. Read the security note below before enabling.
  • internalAccess.type — Internal firewall scope of the workload:
publicAccess.enabled: true publishes a terminal-capable agent to the internet, guarded only by your bearer token. The agent’s terminal backend runs unsandboxed as the container user with full file access, so anyone holding the key can execute work inside the workload. It is off by default — before enabling it, use a long random API server key (openssl rand -hex 32) and prefer restricting reach via internalAccess.

Connecting

Example request against the gateway API:

Messaging Platforms

Hermes supports chat-platform gateways such as Telegram, Discord, and Slack. These are configured after install using Hermes’s own interactive setup — not through this template’s values:
Follow the prompts for your platform; the configuration is stored on the data volume. See the Hermes Agent documentation for each platform’s requirements, such as bot tokens.

Important Notes

  • The API server key must be at least 16 characters — Hermes rejects anything shorter, and the workload will not become ready.
  • The dashboard is internal-only — it is never on the public endpoint; reach it via cpln workload port-forward.
  • Single replica by design — memory is a single-writer SQLite database and upstream forbids two gateways sharing one data directory. Do not scale up. State persists on the volume across restarts and the agent resumes; only in-flight work is lost.
  • The model is external — cost and rate limits are governed by your LLM provider, not this workload.
  • Failed model calls return HTTP 200 with the error inside the body ("finish_reason": "error", "hermes": {"failed": true}). A client that checks only the HTTP status will read a provider failure as success — inspect the body, or the agent log at /opt/data/logs/agent.log.
  • Keep cpu under 4× minCpu — the platform rejects a wider ratio; raise minCpu if you raise cpu.
  • Resetting requires an uninstall — changing the secret and redeploying does not wipe existing memory or config on the volume. cpln helm uninstall deletes the volume set.

External References

Hermes Agent Documentation

Official Hermes Agent documentation

Hermes Agent Repository

Source, issues, and release notes

Nous Research

The team behind Hermes Agent

Hermes Agent Template

View the source files, default values, and chart definition