219 lines
7.5 KiB
Markdown
219 lines
7.5 KiB
Markdown
---
|
|
sidebar_position: 10
|
|
---
|
|
|
|
# Hermes Agent
|
|
|
|
Hindsight memory integration for [Hermes Agent](https://github.com/NousResearch/hermes-agent). Gives your Hermes agent persistent long-term memory via retain, recall, and reflect tools.
|
|
|
|
## What it does
|
|
|
|
This package registers three tools into Hermes via its plugin system:
|
|
|
|
- **`hindsight_retain`** — Stores information to long-term memory. Hermes calls this when the user shares facts, preferences, or anything worth remembering.
|
|
- **`hindsight_recall`** — Searches long-term memory for relevant information. Returns a numbered list of matching memories.
|
|
- **`hindsight_reflect`** — Synthesizes a thoughtful answer from stored memories. Use this when you want Hermes to reason over what it knows rather than return raw facts.
|
|
|
|
These tools appear under the `[hindsight]` toolset in Hermes's `/tools` list.
|
|
|
|
## Setup
|
|
|
|
### 1. Install hindsight-hermes into the Hermes venv
|
|
|
|
The package must be installed in the **same Python environment** that Hermes runs in, so the entry point is discoverable.
|
|
|
|
```bash
|
|
uv pip install hindsight-hermes --python $HOME/.hermes/hermes-agent/venv/bin/python
|
|
```
|
|
|
|
### 2. Set environment variables
|
|
|
|
The plugin reads its configuration from environment variables. Set these before launching Hermes:
|
|
|
|
```bash
|
|
# Required — tells the plugin where Hindsight is running
|
|
export HINDSIGHT_API_URL=http://localhost:8888
|
|
|
|
# Required — the memory bank to read/write. Think of this as a "brain" for one user or agent.
|
|
export HINDSIGHT_BANK_ID=my-agent
|
|
|
|
# Optional — only needed if using Hindsight Cloud (https://api.hindsight.vectorize.io)
|
|
export HINDSIGHT_API_KEY=your-api-key
|
|
|
|
# Optional — recall budget: low (fast), mid (default), high (thorough)
|
|
export HINDSIGHT_BUDGET=mid
|
|
```
|
|
|
|
If neither `HINDSIGHT_API_URL` nor `HINDSIGHT_API_KEY` is set, the plugin silently skips registration — Hermes starts normally without the Hindsight tools.
|
|
|
|
### 3. Disable Hermes's built-in memory tool
|
|
|
|
Hermes has its own `memory` tool that saves to local files (`~/.hermes/`). If both are active, the LLM tends to prefer the built-in one since it's familiar. Disable it so the LLM uses Hindsight instead:
|
|
|
|
```bash
|
|
hermes tools disable memory
|
|
```
|
|
|
|
This persists across sessions. You can re-enable it later with `hermes tools enable memory`.
|
|
|
|
### 4. Start Hindsight API
|
|
|
|
Follow the [Quick Start](/developer/api/quickstart) guide to get the Hindsight API running, then come back here.
|
|
|
|
### 5. Launch Hermes
|
|
|
|
```bash
|
|
hermes
|
|
```
|
|
|
|
Verify the plugin loaded by typing `/tools` — you should see:
|
|
|
|
```
|
|
[hindsight]
|
|
* hindsight_recall - Search long-term memory for relevant information.
|
|
* hindsight_reflect - Synthesize a thoughtful answer from long-term memories.
|
|
* hindsight_retain - Store information to long-term memory for later retrieval.
|
|
```
|
|
|
|
### 6. Test it
|
|
|
|
**Store a memory:**
|
|
> Remember that my favourite colour is red
|
|
|
|
You should see `⚡ hindsight` in the response, confirming it called `hindsight_retain`.
|
|
|
|
**Recall a memory:**
|
|
> What's my favourite colour?
|
|
|
|
**Reflect on memories:**
|
|
> Based on what you know about me, suggest a colour scheme for my IDE
|
|
|
|
This calls `hindsight_reflect`, which synthesizes a response from all stored memories.
|
|
|
|
**Verify via API:**
|
|
|
|
```bash
|
|
curl -s http://localhost:8888/v1/default/banks/my-agent/memories/recall \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"query": "favourite colour", "budget": "low"}' | python3 -m json.tool
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Tools don't appear in `/tools`
|
|
|
|
1. **Check the plugin is installed in the right venv.** Run this from the Hermes venv:
|
|
```bash
|
|
python -c "from hindsight_hermes import register; print('OK')"
|
|
```
|
|
|
|
2. **Check the entry point is registered:**
|
|
```bash
|
|
python -c "
|
|
import importlib.metadata
|
|
eps = importlib.metadata.entry_points(group='hermes_agent.plugins')
|
|
print(list(eps))
|
|
"
|
|
```
|
|
You should see `EntryPoint(name='hindsight', value='hindsight_hermes', group='hermes_agent.plugins')`.
|
|
|
|
3. **Check env vars are set.** The plugin skips registration silently if `HINDSIGHT_API_URL` and `HINDSIGHT_API_KEY` are both unset.
|
|
|
|
### Hermes uses built-in memory instead of Hindsight
|
|
|
|
Run `hermes tools disable memory` and restart. The built-in `memory` tool and Hindsight tools have overlapping purposes — the LLM will prefer whichever it's more familiar with, which is usually the built-in one.
|
|
|
|
### Bank not found errors
|
|
|
|
The plugin auto-creates banks on first use. If you see bank errors, check that the Hindsight API is running and `HINDSIGHT_API_URL` is correct.
|
|
|
|
### Connection refused
|
|
|
|
Make sure the Hindsight API is running and listening on the URL you configured. Test with:
|
|
```bash
|
|
curl http://localhost:8888/health
|
|
```
|
|
|
|
## Manual registration (advanced)
|
|
|
|
If you don't want to use the plugin system, you can register tools directly in a Hermes startup script or custom agent:
|
|
|
|
```python
|
|
from hindsight_hermes import register_tools
|
|
|
|
register_tools(
|
|
bank_id="my-agent",
|
|
hindsight_api_url="http://localhost:8888",
|
|
budget="mid",
|
|
tags=["hermes"], # applied to all retained memories
|
|
recall_tags=["hermes"], # filter recall to only these tags
|
|
)
|
|
```
|
|
|
|
This imports `tools.registry` from Hermes at call time and registers the three tools directly. This approach gives you more control over parameters but requires Hermes to be importable.
|
|
|
|
## Memory instructions (system prompt injection)
|
|
|
|
Pre-recall memories at startup and inject them into the system prompt, so the agent starts every conversation with relevant context:
|
|
|
|
```python
|
|
from hindsight_hermes import memory_instructions
|
|
|
|
context = memory_instructions(
|
|
bank_id="my-agent",
|
|
hindsight_api_url="http://localhost:8888",
|
|
query="user preferences and important context",
|
|
budget="low",
|
|
max_results=5,
|
|
)
|
|
# Returns:
|
|
# Relevant memories:
|
|
# 1. User's favourite colour is red
|
|
# 2. User prefers dark mode
|
|
```
|
|
|
|
This never raises — if the API is down or no memories exist, it returns an empty string.
|
|
|
|
## Global configuration (advanced)
|
|
|
|
Instead of passing parameters to every call, configure once:
|
|
|
|
```python
|
|
from hindsight_hermes import configure
|
|
|
|
configure(
|
|
hindsight_api_url="http://localhost:8888",
|
|
api_key="your-key",
|
|
budget="mid",
|
|
tags=["hermes"],
|
|
)
|
|
```
|
|
|
|
Subsequent calls to `register_tools()` or `memory_instructions()` will use these defaults if no explicit values are provided.
|
|
|
|
## MCP alternative
|
|
|
|
Hermes also supports MCP servers natively. You can use Hindsight's MCP server directly instead of this plugin — no `hindsight-hermes` package needed:
|
|
|
|
```yaml
|
|
# In your Hermes config
|
|
mcp_servers:
|
|
- name: hindsight
|
|
url: http://localhost:8888/mcp
|
|
```
|
|
|
|
This exposes the same retain/recall/reflect operations through Hermes's MCP integration. The tradeoff is that MCP tools may have different naming and the LLM needs to discover them, whereas the plugin registers tools with Hermes-native schemas.
|
|
|
|
## Configuration reference
|
|
|
|
| Parameter | Env Var | Default | Description |
|
|
|-----------|---------|---------|-------------|
|
|
| `hindsight_api_url` | `HINDSIGHT_API_URL` | `https://api.hindsight.vectorize.io` | Hindsight API URL |
|
|
| `api_key` | `HINDSIGHT_API_KEY` | — | API key for authentication |
|
|
| `bank_id` | `HINDSIGHT_BANK_ID` | — | Memory bank ID |
|
|
| `budget` | `HINDSIGHT_BUDGET` | `mid` | Recall budget (low/mid/high) |
|
|
| `max_tokens` | — | `4096` | Max tokens for recall results |
|
|
| `tags` | — | — | Tags applied when storing memories |
|
|
| `recall_tags` | — | — | Tags to filter recall results |
|
|
| `recall_tags_match` | — | `any` | Tag matching mode (any/all/any_strict/all_strict) |
|
|
| `toolset` | — | `hindsight` | Hermes toolset group name |
|