Catalog PyPI
PACKAGE EXPLORERView in registry

agno-memorysync

PyPI

MemorySync memory backend for Agno agents: a memory-only db for MemoryManager with real semantic recall, guarded deletes, and an async-native twin.

agentsagnoaillmmemorymemorysyncphidata
Versions collected1
Direct dependencies2From release 1.1.0
Last observed21 Oct, 09:16 UTC

README

Version 1.1.0 documentation

agno-memorysync

MemorySync memory backend for Agno agents.

A memory-only db for Agno's MemoryManager: user memories live in MemorySync's state store for agno (persistent, searchable) while sessions and other agent state stay in your local db. Each memory's text is also sent to MemorySync's fact extraction, so the facts are recallable from every MemorySync surface. Ships a sync MemorySyncDb and an async-native AsyncMemorySyncDb twin.

pip install agno-memorysync

Quickstart

from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.memory import MemoryManager
from agno_memorysync import MemorySyncDb

agent = Agent(
    db=SqliteDb(db_file="agent.db"),                  # sessions: local
    memory_manager=MemoryManager(db=MemorySyncDb()),  # memories: MemorySync
    update_memory_on_run=True,   # extract + store memories after every run
    user_id="customer-42",
)
agent.run("I prefer teal dashboards and window seats")
agent.run("Which color should the new chart use?")   # remembers

The API key comes from the MEMORYSYNC_API_KEY environment variable (or MemorySyncDb(api_key=...)). add_memories_to_context auto-enables when a memory manager is set, so recalled memories are injected into context on every run.

Why this instead of the Mem0 toolkit?

Agno's ecosystem has one other memory SaaS: the Mem0Tools toolkit shipped in agno core, plus a cookbook. Verified against their source:

BehaviorMem0 (Mem0Tools + cookbook)agno-memorysync
Integration depthLLM tools — the model must decide to recallnative MemoryManager backend — automatic extraction + injection
Async agents✗ sync client blocks the event loopsync db with bounded budget + a true AsyncBaseDb twin
Missing user idreturns error strings as tool outputdeterministic default namespace, never cross-user
Retries / re-runscookbook: "comment out this line after running once"one value per memory id — an unchanged memory is never stored or extracted twice
Memory snapshotcookbook injects a static snapshot fetched at constructionfresh recall every run
Agent scopingsearch/get_all ignore agent_idagent_id / team_id stored and filterable
Semantic search—server-side similarity search via search_content (agno itself has only last_n / first_n / an extra LLM round-trip)
Whole-store wipe—clear_memories() refuses; per-user wipe is explicit

The memory-only contract

BaseDb covers sessions, evals, knowledge, metrics, and traces too. MemorySyncDb implements every memory method for real and makes every other surface raise MemorySyncMemoryOnlyError with the fix in the message — a backend that silently pretended to store sessions would lose them.

Agent(
    db=SqliteDb(...),                                # sessions, evals, ...
    memory_manager=MemoryManager(db=MemorySyncDb())  # memories only
)

Where memories are stored

  • Each memory is one value in MemorySync's state store for agno, keyed by its memory_id, holding the UserMemory exactly as the manager wrote it: text, topics, input, feedback, agent and team ids, timestamps. A memory id always has exactly one current value.
  • The memory's text is also sent to fact extraction. The extracted facts (tagged with the memory's agent_id / team_id) are recallable from every MemorySync surface, and they are what the MemorySync dashboard shows.
  • Updating a memory replaces the facts extracted from its previous version. Deleting a memory deletes its facts too, so nothing resurfaces through recall.

Semantic recall

db = MemorySyncDb()
memories = db.get_user_memories(
    user_id="customer-42",
    search_content="what does the user like to eat?",  # ranked server-side
    limit=5,
)

Agno's built-in search_user_memories offers last_n, first_n, and agentic (an extra LLM call that reads all memories). search_content here ranks the user's memories by similarity on the MemorySync side — no LLM round-trip, best match first.

Async agents

from agno_memorysync import AsyncMemorySyncDb

manager = MemoryManager(db=AsyncMemorySyncDb())
# MemoryManager awaits AsyncBaseDb natively on Agent.arun paths.

Delete semantics — designed against data loss

CallWhat happens
delete_user_memory(id, user_id=...)deletes that memory and the facts extracted from it; an already-gone id is an idempotent no-op; a FAILED delete raises
delete_user_memories([ids], user_id=...)bulk variant
clear_memories()always raises — a nullary everything-wipe is how accounts get destroyed
forget_user_memories(user_id)the explicit, scoped, loud per-user wipe (memories and their facts); returns the number removed

Failure policy

  • Reads fail open under a hard budget (recall_timeout, default 1.2 s): a slow or down memory service degrades to no memories, never a stalled or crashed turn.
  • Writes fail open by default (fail_open_writes=True): post-run extraction never turns a successful agent run into a failure. The failure is logged loudly and the call returns None — an honest contract value. Set fail_open_writes=False to raise instead.
  • Deletes are never fail-open. A delete that did not happen raises.

Configuration

ParameterDefaultMeaning
api_keyMEMORYSYNC_API_KEY env varAPI key
base_urlhttps://api.memorysync.ioOverride for staging
project_id–Optional X-Project-ID header
tenant_idauto-discoveredSkip discovery
default_user_id"default"Namespace when agno passes user_id=None
recall_timeout1.2Hard read budget (seconds)
fail_open_writesTruePost-run extraction failures log instead of raise
source"agno"Not used for storage: memories always live under the agno source, so every install shares them

Multimodal memories

Images flow to the model (Agent.run(images=[Image(...)])), the model's understanding is extracted by MemoryManager as text, and the memory lands here with its source input — image-derived memories work through agno's NATIVE pipeline. (The Mem0 docs demo bypasses agno's memory system entirely and pushes raw base64 into their cloud.)

Tests

pip install -e . agno pytest pytest-asyncio "httpx>=0.25,<1"
python -m pytest tests -q   # 60+ checks against the real agno at latest

The suite drives the real MemoryManager and a REAL Agent run (stub model, local session db) against a mock of the MemorySync state API, and reproduces each named competitor bug as a regression test.

License

MIT © MemorySync.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
1.1.01 Oct 20262

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 21 Oct, 09:16 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:d8b9aa732c0954d7eaf452de102f640f9754181f4d4a516acb0a8166c0cebfce