RepoNous ResearchNous Researchpublished Sep 17, 2026seen Sep 18

NousResearch/hermes-plugin-openviking

Python

Open original ↗

Captured source

source ↗
published Sep 17, 2026seen Sep 18captured Sep 18http 200method plain

NousResearch/hermes-plugin-openviking

Description: Handoff: standalone Hermes memory provider plugin (openviking). OpenViking context database — session-managed memory with automatic extraction, tiered retrieval, and filesyst

Language: Python

License: MIT

Stars: 2

Forks: 0

Open issues: 0

Created: 2026-09-17T16:02:17Z

Pushed: 2026-09-17T16:02:21Z

Default branch: main

Fork: no

Archived: no

README: > Handoff repository. This is the standalone copy of the openviking memory provider formerly bundled with Hermes Agent, published so its upstream maintainers can take it over. Not an official Nous Research plugin. See [HANDOFF.md](HANDOFF.md).

OpenViking Memory Provider

Context database by Volcengine (ByteDance) with filesystem-style knowledge hierarchy, tiered retrieval, and automatic memory extraction.

Requirements

  • OpenViking installed with the openviking-server command available
  • OpenViking server config initialized and validated (openviking-server init,

then openviking-server doctor)

  • OpenViking server running and reachable from Hermes

OpenViking 0.2.10 or newer is recommended. For backward compatibility, Hermes can identify older servers that expose the legacy status-only health response, but only when anonymous OpenAPI metadata also identifies the service as OpenViking. OpenViking 0.2.6 and earlier are deprecated for this integration; upgrade them to receive the current health contract and compatibility fixes.

Setup

Prepare OpenViking first:

openviking-server init
openviking-server doctor
openviking-server

Then configure Hermes:

hermes memory setup # select "openviking"

The setup can link to an existing ~/.openviking/ovcli.conf, copy its current connection values into Hermes, or create a minimal ovcli.conf when one does not exist.

Or manually:

hermes config set memory.provider openviking

Add the connection settings to the active profile's .env file. For the default profile that is ~/.hermes/.env; for a named profile use ~/.hermes/profiles//.env.

OPENVIKING_ENDPOINT=http://127.0.0.1:1933
# OPENVIKING_API_KEY=...
# OPENVIKING_ACCOUNT=default
# OPENVIKING_USER=default

Config

OpenViking's server config is separate from Hermes:

  • ov.conf configures OpenViking storage, embedding/VLM models, auth, and

server behavior. OpenViking reads it from --config, OPENVIKING_CONFIG_FILE, or ~/.openviking/ov.conf.

  • ovcli.conf stores client/CLI connection values such as url, api_key,

account, and user. It is read from OPENVIKING_CLI_CONFIG_FILE or ~/.openviking/ovcli.conf.

Hermes-side provider config is read from environment variables in the active profile's .env:

| Env Var | Default | Description | |---------|---------|-------------| | OPENVIKING_ENDPOINT | http://127.0.0.1:1933 | Server URL | | OPENVIKING_API_KEY | (none) | User/admin API key for authenticated servers | | OPENVIKING_ACCOUNT | default | Tenant account for local/trusted mode | | OPENVIKING_USER | default | Tenant user for local/trusted mode | | OPENVIKING_AGENT | (none) | Optional peer ID for separate assistant context |

When OPENVIKING_API_KEY is set, Hermes lets OpenViking derive account/user identity from the key. In local or trusted deployments without an API key, Hermes sends OPENVIKING_ACCOUNT and OPENVIKING_USER as identity headers. Hermes also sends User-Agent: openviking-memory-hermes/ on OpenViking requests. This standard harness identifier contains the Hermes version, but no per-user identifier, and does not add a separate request.

Optional peer identity

New connections use the OpenViking user's memory directory by default. Setup does not ask for a peer ID. Without a configured peer, Hermes sends neither X-OpenViking-Actor-Peer nor assistant-message peer_id.

For separate assistant context, set the existing agent field in the active profile's config.yaml:

memory:
openviking:
agent: work-assistant

Existing non-empty OPENVIKING_AGENT, YAML agent, and linked OpenViking actor_peer_id or legacy agent_id values retain their behavior. Resolution order remains environment, linked OpenViking config, then Hermes YAML. To use no peer, remove the peer value from each configured source and start a new Hermes session.

Upgrades do not move or delete existing memories. Installations that relied on the old implicit hermes peer now use user memory for new writes. Without a peer ID, default OpenViking search covers user memory and existing peer memories under the same OpenViking user. Old peer memories stay at their existing paths and remain searchable. Ranking and result limits determine which memories are returned. Keep a peer ID if you need the narrower view.

Set agent: hermes to restore peer-scoped writes. Memories written at user scope before this change stay there and remain searchable. This setting changes future writes, not the location of existing memories.

Tools

| Tool | Description | |------|-------------| | viking_search | Semantic search with fast/deep/auto modes | | viking_read | Read content at a viking:// URI (abstract/overview/full) | | viking_browse | Filesystem-style navigation (list/tree/stat) | | viking_remember | Submit a fact through OpenViking session memory extraction | | viking_forget | Delete one exact viking:// memory file URI | | viking_add_resource | Ingest URLs/docs into the knowledge base |

Memory Writes And Deletes

viking_remember creates a one-shot hermes-remember- OpenViking session, adds the fact as one message, and commits the session with no retained tail. The session remains available in OpenViking for audit. OpenViking then classifies the source and can add, merge, or skip a memory through its normal extraction pipeline. The tool returns the one-shot session ID and the extraction task ID when the server provides one. Extraction continues asynchronously after the tool returns.

The tool returns status: submitted because extraction can add a memory, merge the fact into an existing memory, or produce no memory operation. It does not promise that OpenViking created a distinct memory file. The fact is submitted as an unchanged user message so OpenViking owns the final classification. The legacy category argument is still accepted from existing callers but is not advertised or used. The one-shot session is separate from the live Hermes conversation, so an explicit...

Excerpt shown — open the source for the full document.