LangGraph¶
holographic_integrations.langgraph provides a long-term-memory BaseStore (HolographicStore) and a checkpoint saver (HolographicSaver) over Holographic Memory (hms-server).
Install¶
Quickstart¶
from holographic_integrations.langgraph import HolographicSaver, HolographicStore
saver = HolographicSaver(url="http://127.0.0.1:8080", tenant_id="acme")
store = HolographicStore(index={"embed": embeddings, "dims": 384, "fields": ["text"]}, url="http://127.0.0.1:8080", tenant_id="acme")
app = graph.compile(checkpointer=saver, store=store)
Runnable example: integrations/python/examples/langgraph_memory.py.
HolographicStore (BaseStore)¶
Implements batch/abatch (so get, put, delete, search, list_namespaces and their async twins). index is LangGraph's IndexConfig (embed: Embeddings, function or provider string; dims; fields). Without index, semantic search is off as for every BaseStore: query is ignored and put(index=...) has no effect. HMS knobs: config=HmsConfig(...) or keyword arguments (url, api_key, tenant_id, collection default langgraph-store, zero_trust_key, max_fetch, ...).
| LangGraph operation | Mapping |
|---|---|
| namespace prefix | per-level equality filters, run in the service |
filter scalar equality (str up to 256 chars, int, null) | pushed to the service; every filter is then re-checked on the full value with LangGraph's own comparison rules ($eq $ne $gt $gte $lt $lte, nested dicts, lists) |
list_namespaces prefix/suffix/wildcards/max_depth | one marker record per namespace (removed when its last item is deleted); suffix conditions are evaluated client-side |
index=False / index=[fields] on put | not embedded (excluded from semantic search) / embedded from those fields |
Differences from InMemoryStore, all deliberate: several index fields are joined into one vector (one vector per record; InMemory keeps one per field); TTL is not supported (ttl= raises NotImplementedError); a search without query returns items sorted by (namespace, key) after fetching at most max_fetch matches, so offset + limit above max_fetch raises ValueError; namespaces are limited to 16 levels; a value must fit 64 KiB as JSON. Namespace listing returns at most max_fetch namespaces. Scores are cosine similarity.
HolographicSaver (checkpointer)¶
Implements put, put_writes, get_tuple, list, delete_thread, delete_for_runs, copy_thread, prune and their async twins. Channel values are stored as shared blobs keyed by (channel, version) like InMemorySaver; payloads of any size are split over part records, so a 200 kB channel value works although the service caps text at 64 KiB. Checkpoints are grouped into pages of 50 by sequence number, so a thread of any length lists newest-first exactly; each page, channel blob and pending-write set is one query. Pending writes are stored one record per (checkpoint, task).
Limits: one writer per (thread, namespace) (LangGraph serializes a thread already); more than max_fetch tasks with writes on one checkpoint is unsupported; delete_for_runs leaves channel blobs in place (they may be shared; prune removes unreferenced blobs); copy_thread does not preserve each write's task_path; list(None) enumerates at most max_fetch (thread, namespace) heads. max_fetch must be at least 50.
Tested against¶
| Package | Version |
|---|---|
| langgraph | 1.2.16 |
| langgraph-checkpoint | 4.3.0 |
| langgraph-checkpoint-conformance | 0.0.2 |
| langchain-core | 1.6.12 |
| Python | 3.12 |
- Checkpoint saver:
langgraph-checkpoint-conformanceagainst a livehms-server, all eight capabilities detected, 81 tests passed, 0 failed, level FULL. Plus real graphs: resume from a second saver instance, a 200 kB value,get_state_history, and a 62-checkpoint thread listed across pages withlimitandbefore, sync and async. - Store: LangGraph publishes no store conformance package (
langgraph-store-conformancedoes not exist), soInMemoryStoreis the oracle: 14 filter queries and 10list_namespacesforms are compared against it on identical data, plus semantic search, index controls, batch ordering, TTL rejection and limits.