memorysync-pipecat
MemorySync for Pipecat —
long-term memory for voice pipelines that never stalls a reply and never
re-stores what it already knows. PyPI package: pipecat-memorysync.
Built and maintained by the MemorySync team — MemorySync is our product, and this integration is actively maintained alongside it.
Tested with Pipecat v1.8.1 (pipecat-ai>=1.0.0,<2).
pip install pipecat-memorysync
# or
uv add pipecat-memorysync
Where it sits
MemorySyncMemoryService is a FrameProcessor. Place it between your
context aggregator and your LLM service:
transport.input() → stt → context_aggregator.user()
→ MemorySyncMemoryService ← enriches + captures here
→ llm → tts → transport.output() → context_aggregator.assistant()
from pipecat_memorysync import MemorySyncMemoryService
memory = MemorySyncMemoryService(
api_key="ms_...", # or MEMORYSYNC_API_KEY env var
user_id="caller-42", # stable end-user id
session_id="call-123", # optional: scope to this call
)
pipeline = Pipeline([
transport.input(),
stt,
context_aggregator.user(),
memory,
llm,
tts,
transport.output(),
context_aggregator.assistant(),
])
Every LLMContextFrame that flows through is enriched with relevant memories
(as a system message) and mined for new turns to persist — then pushed on,
enriched or not, on time.
Design guarantees
- Budgeted recall. Enrichment runs under a hard timeout (default 1.2 s). A slow or dead memory backend means an unenriched frame, never a stalled voice reply.
- Delta-only capture. Only messages not seen before are stored, tracked by deterministic idempotency seeds. Growing a 50-message context does not re-store 50 messages per turn.
- Injection exclusion. The memory block this service adds is never captured back as a new memory.
- Graceful end, salvaged abort. On
EndFrame, queued writes get a bounded window (3 s) to land before the pipeline stops — the call's final exchange is not lost. OnCancelFrame, the frame is pushed first and writes get a brief salvage window. - Failure-proof. HTTP errors, quota limits, and timeouts all degrade to "no memories this turn". Nothing propagates into the pipeline.
Running the example
A single-file voice agent that remembers callers across calls lives in
examples/foundational.py:
uv add pipecat-memorysync "pipecat-ai[deepgram,cartesia,openai,silero,runner,webrtc]"
export MEMORYSYNC_API_KEY=ms_... # https://app.memorysync.io
export DEEPGRAM_API_KEY=...
export CARTESIA_API_KEY=...
export OPENAI_API_KEY=...
python examples/foundational.py
Open http://localhost:7860/client, tell the bot your name and a preference,
hang up, and connect again — it remembers.
Configuration (InputParams)
from pipecat_memorysync import MemorySyncMemoryService
memory = MemorySyncMemoryService(
api_key="ms_...",
user_id="caller-42",
params=MemorySyncMemoryService.InputParams(
top_k=5, # memories injected per turn
recall_timeout=1.2, # hard budget, seconds
add_as_system_message=True,
position="end", # where the memory block lands in the context
min_prompt_chars=8, # skip enrichment for shorter user prompts
),
)
| Param | Default | Meaning |
|---|---|---|
top_k |
5 |
Memories injected per turn |
recall_timeout |
1.2 |
Hard recall budget in seconds |
system_prompt |
(guarded header) | Prefix line for the injected block; also the capture-exclusion marker |
add_as_system_message |
True |
Inject as system (else appended to the latest user message) |
position |
"end" |
"start" or "end" of the message list |
min_prompt_chars |
8 |
Skip recall for trivial prompts |
Semantics worth knowing
- Both user and assistant turns are persisted, with role fidelity.
- Idempotency seeds make retries/reconnects duplicate-free server-side.
- Free-tier quota exhaustion is silent by design (empty recall, accepted-but-
dropped writes); evaluation keys surface strict
429s instead. - The service is reusable across pipeline runs; call
await memory.aclose()from application shutdown if you want an explicit flush + client close.
Development
python -m venv venv && venv/Scripts/pip install -e . pipecat-ai pytest pytest-asyncio
venv/Scripts/python -m pytest tests -q # 14 tests, run via pipecat's official test harness
Docs
Full guide: docs.memorysync.io/guides/pipecat
License
MIT
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 pipecat_memorysync-1.0.1.tar.gz.
File metadata
- Download URL: pipecat_memorysync-1.0.1.tar.gz
- Upload date:
- Size: 16.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
70f52437a247e1746f76fde22a480ebc515defb83574e1a5b6393e584415daab
|
|
| MD5 |
0219d97ea4b4bcf332b7e64052f774fb
|
|
| BLAKE2b-256 |
1252a4e0a8e972cfa3f1ec4a4e1e288efbc9a6402ac8bbac2c10f18ad2e69a9b
|
File details
Details for the file pipecat_memorysync-1.0.1-py3-none-any.whl.
File metadata
- Download URL: pipecat_memorysync-1.0.1-py3-none-any.whl
- Upload date:
- Size: 12.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81f240db56b9dcd87d8d241211a2715e35a10c2464537e97c812891c1e832250
|
|
| MD5 |
4e2525ef7b3059a8683e23ec9d3f1ff9
|
|
| BLAKE2b-256 |
937c856e05d5a202252466147bc6b25a5bda204ead76e8df59f1f043925458a2
|