perseus-vault-haystack
Local-first, encrypted persistent memory for Haystack 2.x pipelines, backed by Perseus Vault (formerly "Mimir"/"Mneme").
Perseus Vault is an open-source (MIT) memory engine that runs entirely on your machine, stores data in an encrypted SQLite database, and exposes 40+ tools over the Model Context Protocol (MCP). This package wraps Perseus Vault as Haystack pipeline components and ready-made Agent tools, so your pipelines and agents can persist and retrieve memory across runs — no external vector database, no cloud, and no API key required.
Why Perseus Vault vs. other Haystack memory stores? It is the only one that runs fully local and offline, stores everything encrypted at rest (AES-256-GCM), needs no API key or signup, and ships as a single binary with no external vector database. Your data never leaves the machine.
What's included
| Class / function | Type | Role |
|---|---|---|
PerseusVaultMemoryStore |
Memory store | Owns the perseus-vault subprocess and config. add_memories / search_memories / delete_all_memories for Documents, plus write_messages / recall_messages for ChatMessages. |
PerseusVaultMemoryWriter |
@component |
Pipeline sink that persists Documents into the store. |
PerseusVaultMemoryRetriever |
@component |
Pipeline source that retrieves the most relevant Documents for a query. |
create_perseus_vault_tools(...) |
Agent tools | Returns retain_memory / recall_memory / reflect_memory Tools so an Agent decides when to store and retrieve memory. |
PerseusVaultMemoryWrapper |
Agent wrapper | Automatic recall-before / retain-after memory for an agent, no tool-calling required. |
Prerequisite: the perseus-vault binary
These components talk to a local perseus-vault executable over stdio. Install it first:
- Download a pre-built binary from the Perseus Vault releases page (or build from source).
- Put it on your
$PATH(soperseus-vaultresolves), or pass its absolute path viaperseus_vault_binary=.
You can verify it works with:
perseus-vault --version
Install
pip install perseus-vault-haystack
This pulls in haystack-ai. The perseus-vault binary is a separate, language-agnostic dependency (see above).
Quickstart — write then read in a pipeline
from haystack import Pipeline, Document
from perseus_vault_haystack import (
PerseusVaultMemoryStore,
PerseusVaultMemoryWriter,
PerseusVaultMemoryRetriever,
)
# One store, shared by both components (single perseus-vault subprocess).
store = PerseusVaultMemoryStore(db_path="~/.perseus-vault/haystack.db", category="docs")
# --- Write documents into persistent memory ---
write_pipe = Pipeline()
write_pipe.add_component("writer", PerseusVaultMemoryWriter(memory_store=store))
write_pipe.run(
{
"writer": {
"documents": [
Document(content="Perseus Vault is a local-first, encrypted memory engine."),
Document(content="Haystack is an open-source LLM framework by deepset."),
]
}
}
)
# --- Retrieve them later (even in a separate process / run) ---
read_pipe = Pipeline()
read_pipe.add_component("retriever", PerseusVaultMemoryRetriever(memory_store=store, top_k=3))
result = read_pipe.run({"retriever": {"query": "What is Perseus Vault?"}})
for doc in result["retriever"]["documents"]:
print(doc.score, doc.content)
Because Perseus Vault persists to an encrypted SQLite file, documents written in one run are available in any future run pointed at the same db_path.
Use directly (without a pipeline)
from haystack import Document
from perseus_vault_haystack import PerseusVaultMemoryStore
store = PerseusVaultMemoryStore(db_path="~/.perseus-vault/haystack.db")
store.add_memories([Document(content="Remember this fact.")])
hits = store.search_memories("fact", top_k=5)
Agents
Give an Agent memory tools
Let the agent decide when to store and retrieve memory with ready-made Tools:
from haystack.components.agents import Agent
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.dataclasses import ChatMessage
from perseus_vault_haystack import PerseusVaultMemoryStore, create_perseus_vault_tools
store = PerseusVaultMemoryStore(db_path="~/.perseus-vault/agent.db", category="agent-memory")
tools = create_perseus_vault_tools(store) # retain_memory, recall_memory, reflect_memory
agent = Agent(
chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"),
tools=tools,
system_prompt=(
"You are a helpful assistant with long-term memory. "
"Use recall_memory before answering, and retain_memory to store durable facts."
),
)
agent.run(messages=[ChatMessage.from_user("Remember that I prefer concise answers.")])
You can include or exclude any tool, e.g. create_perseus_vault_tools(store, include_reflect=False).
Automatic memory (no tool-calling)
PerseusVaultMemoryWrapper injects relevant memories before each turn and stores the
exchange after — without relying on the model to call tools:
from haystack.components.agents import Agent
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.dataclasses import ChatMessage
from perseus_vault_haystack import PerseusVaultMemoryStore, PerseusVaultMemoryWrapper
store = PerseusVaultMemoryStore(db_path="~/.perseus-vault/agent.db")
memory = PerseusVaultMemoryWrapper(store, auto_recall=True, auto_retain=True)
agent = Agent(
chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"),
system_prompt="You are a helpful assistant with long-term memory.",
)
result = memory.run(agent, messages=[ChatMessage.from_user("I prefer dark mode.")])
print(result["last_message"].text)
ChatMessage memory is also available directly on the store via
store.write_messages([...]) and store.recall_messages(query).
Configuration
PerseusVaultMemoryStore accepts:
db_path— path to the Perseus Vault SQLite database (default~/.perseus-vault/haystack.db).perseus_vault_binary— name on$PATHor absolute path to the executable (defaultperseus-vault).category— Perseus Vault category scoping all writes/recalls for this store (defaulthaystack-memory). Use distinct categories to isolate corpora.top_k— default number of documents returned by retrieval (default10).timeout_s— per-RPC timeout for the subprocess (default30).
Serialization
All three classes implement to_dict() / from_dict() and round-trip through Pipeline.dumps() / Pipeline.loads().
License
MIT © 2026 Perseus Computing LLC. Perseus Vault (formerly Mimir/Mneme) is also MIT-licensed.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file perseus_vault_haystack-0.2.0.tar.gz.
File metadata
- Download URL: perseus_vault_haystack-0.2.0.tar.gz
- Upload date:
- Size: 17.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b7eb27231c47a25d079a53dcbb196e5b61b0f3485456a9ce6c312b26caf03c8
|
|
| MD5 |
a11dcd0db97b10d8a4b30c5c24142048
|
|
| BLAKE2b-256 |
a4f33abb329f68123333baf0281011c397a927b082f58f478f131a4a340b8a48
|
Provenance
The following attestation bundles were made for perseus_vault_haystack-0.2.0.tar.gz:
Publisher:
publish.yml on Perseus-Computing-LLC/perseus-vault-haystack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
perseus_vault_haystack-0.2.0.tar.gz -
Subject digest:
8b7eb27231c47a25d079a53dcbb196e5b61b0f3485456a9ce6c312b26caf03c8 - Sigstore transparency entry: 2145561312
- Sigstore integration time:
-
Permalink:
Perseus-Computing-LLC/perseus-vault-haystack@be5cd31a52703bf0d0ae3c54048a5897f7e60343 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Perseus-Computing-LLC
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@be5cd31a52703bf0d0ae3c54048a5897f7e60343 -
Trigger Event:
push
-
Statement type:
File details
Details for the file perseus_vault_haystack-0.2.0-py3-none-any.whl.
File metadata
- Download URL: perseus_vault_haystack-0.2.0-py3-none-any.whl
- Upload date:
- Size: 17.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59fe0f6f5424439cc6e89acbbc4e2cee4b8c4f65b260629c01e53b3d7f15ffdf
|
|
| MD5 |
2337572ac5857a51b924de1bbd582c68
|
|
| BLAKE2b-256 |
90c0b6f2002afbe3bc20009542179ac791aed79b60c659ee5b14ded892edc824
|
Provenance
The following attestation bundles were made for perseus_vault_haystack-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on Perseus-Computing-LLC/perseus-vault-haystack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
perseus_vault_haystack-0.2.0-py3-none-any.whl -
Subject digest:
59fe0f6f5424439cc6e89acbbc4e2cee4b8c4f65b260629c01e53b3d7f15ffdf - Sigstore transparency entry: 2145561322
- Sigstore integration time:
-
Permalink:
Perseus-Computing-LLC/perseus-vault-haystack@be5cd31a52703bf0d0ae3c54048a5897f7e60343 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Perseus-Computing-LLC
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@be5cd31a52703bf0d0ae3c54048a5897f7e60343 -
Trigger Event:
push
-
Statement type: