polign-recall
A Python client for Recall, correctable agent memory. Requires Python 3.10+.
pip install polign-recall
That is the whole install. pip also brings the
polign_db package, which holds the
polign CLI and polign-server binaries for Linux, macOS and Windows, so
there is nothing else to download.
from polign_recall import Client
with Client(local_dir="./recall-data", extract_model="anthropic:claude-haiku-4-5-20251001") as memory:
memory.remember(text="I switched from helix to zed last week.")
for m in memory.ask("Which editor do I use?"):
print(m.text, m.since, [e.text for e in m.before]) # user prefers editor: zed ... ['helix']
memory.forget_text("my editor")
remember(text=...) hands the server a passage; the model named by
extract_model works out the facts in it, and a newer fact replaces an older
one. It returns a TextResult listing what was filed and what each statement
replaced. ask returns Memory sentences, each with since, days_ago, and
what it replaced under before; it accepts as_of. forget_text withdraws
the facts a description names and returns them; the texts they came from stay
as the record. Without extract_model, remembered text is kept as written:
ask finds it by its words, but it replaces nothing, and forget_text needs
a model.
local_dir keeps the database on this machine. The first client to open the
directory starts a polign-server for it in the background, listening on
localhost only and protected by a key stored in the directory. Later clients,
including ones in other processes, share that server. It keeps running after
your program exits; its process id is in runtime.json and its log in
server.log, both inside the directory. Managed local databases work on Linux
and macOS.
To use a server you run yourself, leave local_dir out and set POLIGN_URL,
POLIGN_API_KEY, and POLIGN_COLLECTION in the environment, or pass
env={...} to Client. With neither, the client uses the connection
recall setup saved, and without one connects to http://localhost:23000,
where polign-server -store fs:./recall-data listens by default.
The client owns a long-lived recall mcp -write -text subprocess and shares
the Go implementation's validation and fold. Use write=False for a read-only
connection. It runs the recall binary that this package's platform wheel
installs next to python; on a platform without one it runs recall from
PATH, and without recall it falls back to polign mcp -memory-only
from polign_db 0.13 or earlier. command=[...] overrides all of these.
The model is provider:model: anthropic:<model>, openai:<model>, or
ollama:<model>, with keys from ANTHROPIC_API_KEY or OPENAI_API_KEY.
POLIGN_EXTRACT_MODEL in the environment does the same.
Typed memory
With typed=True, the client uses the typed tools (recall mcp -typed,
recall 0.18 or later): your code names the subject, predicate and value, over
a fixed vocabulary.
with Client(local_dir="./recall-data", typed=True) as memory:
memory.remember("user", "prefers_editor", "vim")
changed = memory.remember("user", "prefers_editor", "neovim")
current = memory.recall("user", "prefers_editor")[0]
print(current.value, current.replaced[0].value) # neovim vim
print(memory.history("user", "prefers_editor")) # both statements
memory.forget("user", "prefers_editor", "neovim")
Read predicates() for the vocabulary: the starter registry, or the file
named by POLIGN_PREDICATES. remember(text=..., statements=[...]) accepts
proposals from your agent's model; every statement must have subject,
predicate, typed value, and evidence quoting the text exactly. A proposal
that names an unlisted predicate is dropped, and the whole text is kept as a
note either way. With extract_model and no statements, the server's model
proposes them over the same vocabulary.
The text calls (ask, forget_text, remember(text=...) alone) raise
ValueError on a typed client, and the typed calls (recall, forget,
history, predicates) raise on a text client. With command=[...] or
url=..., the client follows whichever tools the server lists; typed=True
or text=True against the other surface is an error at open.
recall(..., as_of=...) accepts an RFC3339 string or timezone-aware datetime.
forget requires a typed value or explicit all=True; false and zero remain
values. Forgetting retracts a belief and retains its historical events.
Errors raise RecallError with a code and, for a failed extraction batch, any
reported partial results. Calls are serialized, timeout after 120 seconds by
default, and never automatically retry writes. A timeout closes the transport;
inspect history using a new client before retrying an uncertain write.
Connecting to a server
When memory is served by recall serve rather than a local process, give the
client the server and one credential and it speaks HTTP instead:
from polign_recall import Client
client = Client(url="http://recall.recall.svc:8080", api_key="rcl_...")
Inside a Kubernetes sandbox the credential is the pod's projected service account token, which the server exchanges for a short-lived key and the client renews:
client = Client(url="http://recall.recall.svc:8080", token_file="/var/run/secrets/recall/token")
Client.from_env() reads RECALL_URL, RECALL_API_KEY and
RECALL_TOKEN_FILE (default /var/run/secrets/recall/token when it exists)
and falls back to a local process when RECALL_URL is unset, so the same
program runs on a laptop and in a sandbox. Over HTTP the server decides
whether it serves the text or the typed tools and whether the resume tools
exist; the client finds out when it connects.
Resuming an agent
An agent that crashes or moves to another machine can pick up from its own
records instead of a snapshot of its process. Open the client with
agent=True and call resume:
from polign_recall import Client
with Client(local_dir="./recall-data", agent=True) as client:
with client.resume("billing-migrator") as agent:
print(agent.context.briefing) # hand this to the model as its starting context
agent.update_working_state(goal="Move billing to the v2 API",
plan=["find call sites", "migrate them", "run the tests"])
agent.record_turn("user", "Start with the charge endpoint.")
agent.set_pointer("wip", "git_ref", {"repo": "github.com/acme/billing", "branch": "agent/wip"})
agent.milestone("call sites found", progress="12 call sites listed")
The first resume of an id starts the agent fresh (context.fresh is true).
Every later one rebuilds context from what the agent wrote: its working
state, pointers to its work, relevant memories, and its most recent turns,
trimmed to token_budget. context.briefing is all of that as one text for
the model; the same parts are also there as fields.
resume takes a lease on the agent id, so only one process acts for it at a
time. While another process holds it, resume raises RecallError with code
"lease_held". The lease is renewed in the background and handed over when
you call release(), leave the with block, or close the client.
If the process before crashed without releasing, resume has to wait for its
lease to expire. When you cannot wait, as on a live call, pass
defer_lease=True: resume returns the context at once without the lease,
because reading cannot conflict with anyone. Writes then raise RecallError
with code "lease_not_held", so keep them in a buffer and call
agent.acquire() until it returns True:
agent = client.resume("call-42", defer_lease=True, lease_ttl=6)
greet_with(agent.context.briefing) # no waiting
while not agent.acquire(): # False while the crashed process's lease is live
time.sleep(1)
agent.record_turn("assistant", "Sorry, we got cut off.")
Once it holds the lease, anything the crashed process wrote after the resume is picked up, and new turns continue after it.
The other methods write what the next resume reads: update_working_state
(fields you leave out are kept), milestone, record_turn (a turn longer
than the output threshold is stored whole and the turn keeps a reference),
store_output and fetch_output for large tool results, set_pointer,
remove_pointer and pointers, and recent_turns and
working_state_history to read back.
Metadata
Release files for polign-recall 0.19.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| polign_recall-0.19.0.tar.gz | 35.3 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| polign_recall-0.19.0-py3-none-win_arm64.whl | Python 3 | none | Windows ARM64 | Details |
| polign_recall-0.19.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| polign_recall-0.19.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.musllinux_1_1_x86_64.whl | Python 3 | none | Linux glibc 2.17+ x86-64, Linux musl 1.1+ x86-64 | Details |
| polign_recall-0.19.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.musllinux_1_1_aarch64.whl | Python 3 | none | Linux musl 1.1+ ARM64, Linux glibc 2.17+ ARM64 | Details |
| polign_recall-0.19.0-py3-none-macosx_12_0_x86_64.whl | Python 3 | none | macOS 12.0+ x86-64 | Details |
| polign_recall-0.19.0-py3-none-macosx_12_0_arm64.whl | Python 3 | none | macOS 12.0+ ARM64 | Details |
| polign_recall-0.19.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.2 MB
Release files / polign_recall-0.19.0.tar.gz
| Download URL | polign_recall-0.19.0.tar.gz |
|---|---|
| Size | 35.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dc44a6fa1d00d03dc495f22f4827aa8b728057d4e53cbed9f9751b0e925cd699
|
|
BLAKE2b-256 checksum How to use checksums |
29c297c6bdeedd31ee869589b6cd029558f74ac2d28c8903e7dc875b1dbcd7d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / polign_recall-0.19.0-py3-none-win_arm64.whl
| Download URL | polign_recall-0.19.0-py3-none-win_arm64.whl |
|---|---|
| Size | 4.9 MB |
| Tags | Python 3 Windows ARM64 |
|
SHA-256 checksum How to use checksums |
2af2e21121a5fdbcfcbeb0542475607071c167a022fec6797a17fa1ce49946bb
|
|
BLAKE2b-256 checksum How to use checksums |
b93fd51d04f26a83b51c0a210b48b1dd1be1cef9e8d817792428e787fa539dc0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / polign_recall-0.19.0-py3-none-win_amd64.whl
| Download URL | polign_recall-0.19.0-py3-none-win_amd64.whl |
|---|---|
| Size | 5.4 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
aedd8bbf8a971c336e29ea3afa71714a47d4d50a8cb48c043a3d6dea2b83a3e7
|
|
BLAKE2b-256 checksum How to use checksums |
9dd0044828905b9b9f0b88ce9f35843176a85169fbede984b595f43ef248bf55
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / polign_recall-0.19.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.musllinux_1_1_x86_64.whl
| Download URL | polign_recall-0.19.0-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.musllinux_1_1_x86_64.whl |
|---|---|
| Size | 5.4 MB |
| Tags | Linux glibc 2.17+ x86-64 Linux musl 1.1+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
3202ed9c07ae22e1804915201c6db03ac687ba363b443ff094f7001e971ace2e
|
|
BLAKE2b-256 checksum How to use checksums |
239a802b1ae9e300dce5a23d92361a409043ddeab1a62afbb2b07acf611b18be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / polign_recall-0.19.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.musllinux_1_1_aarch64.whl
| Download URL | polign_recall-0.19.0-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.musllinux_1_1_aarch64.whl |
|---|---|
| Size | 4.9 MB |
| Tags | Linux glibc 2.17+ ARM64 Linux musl 1.1+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
1cb0c6273d063ae5f5d705bea76e42b7f54f70fe9ea843156e546f9b6d893af4
|
|
BLAKE2b-256 checksum How to use checksums |
ab8a6749f498160fe0a10771d530cddc0db68f643289d46313ec561569a1f0d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / polign_recall-0.19.0-py3-none-macosx_12_0_x86_64.whl
| Download URL | polign_recall-0.19.0-py3-none-macosx_12_0_x86_64.whl |
|---|---|
| Size | 5.5 MB |
| Tags | Python 3 macOS 12.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
ffde899a8c086be5bb9c54b0d9d812cfa5d2c635eb568db1f8204690593f2a5a
|
|
BLAKE2b-256 checksum How to use checksums |
26d2236db8c7d23a6365b961685b44a4f51b21e059a904ef2d901c3205afeeda
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / polign_recall-0.19.0-py3-none-macosx_12_0_arm64.whl
| Download URL | polign_recall-0.19.0-py3-none-macosx_12_0_arm64.whl |
|---|---|
| Size | 5.1 MB |
| Tags | Python 3 macOS 12.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7be16ac36304f4b2a6c8bae489a2138f27d56c12b513eab5ac1a0cc3723d72f5
|
|
BLAKE2b-256 checksum How to use checksums |
06c71900fb583f3ec5817bfdd1ecead25c1f5688faa5ad499db114846731cfb7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / polign_recall-0.19.0-py3-none-any.whl
| Download URL | polign_recall-0.19.0-py3-none-any.whl |
|---|---|
| Size | 24.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4632e62a64de1fbada5451da98b0fb2a7e8ff60cb577041f86f7ef78d0e49293
|
|
BLAKE2b-256 checksum How to use checksums |
2cc9863159a07622f3f670704ca095a1262aec417bd889dc101a79781b3f41d0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency log