camel-memorysync
MemorySync memory for CAMEL agents.
Two pieces, use either or both:
MemorySyncMemory— a drop-inAgentMemoryforChatAgent(memory=...): verbatim chat history plus semantic recall from MemorySync, injected as one scored context record under a hard latency budget. Zero client-side embeddings.MemorySyncStorage— a losslessBaseKeyValueStorageforChatHistoryMemorythat keeps the full history locally and sends the user's turns to MemorySync out of band, where only the durable facts in them are stored.
pip install camel-memorysync
Quickstart
from camel.agents import ChatAgent
from camel_memorysync import MemorySyncMemory
memory = MemorySyncMemory(
user_id="customer-42", # required — who these memories belong to
session_id="support", # conversation scope
)
agent = ChatAgent(system_message="You are a helpful travel assistant.", memory=memory)
agent.step("I always prefer window seats on long flights")
# … days later, a new session:
agent.step("which seat should I book for the Oslo flight?") # remembers
The API key comes from the MEMORYSYNC_API_KEY environment variable (or
api_key=...).
Why not the in-repo Mem0 storage?
CAMEL ships Mem0Storage in its repo. Verified against its source:
| Behavior | Mem0 (Mem0Storage, in-repo) |
camel-memorysync |
|---|---|---|
| History round-trip | ✗ broken — load() returns extracted facts, not your messages |
byte-exact: from_dict reconstructs every record |
| Message roles | ✗ every record hardcoded role=USER — OpenAI alternation breaks |
preserved exactly |
clear() blast radius |
✗ calls client.delete_users() — the entire user entity |
local window only; remote wipes are explicit (forget_session() / forget_user()) |
agent_id filter |
✗ silently overwritten by user_id filter |
both preserved per record |
| Failures | ✗ every exception swallowed — callers never know | conversation always works, failures logged loudly; explicit deletes raise |
| Multimodal | ✗ image_list / video_bytes silently discarded |
full media round-trip (base64) |
| Recall latency guard | none | 1.2 s hard budget, fails open to history-only |
| Retried saves | duplicated | deterministic speaker seeds: a retried turn is recognised and extracted once |
VectorDBMemory (CAMEL's own long-term option) needs client-side embeddings —
OpenAIEmbedding() by default (extra key, cost, latency) plus a vector DB you
operate. Recall here is one MemorySync query; the index lives server-side.
How recall enters the context
ScoreBasedContextCreator sorts records by timestamp. The recall block is one
SYSTEM-role record with timestamp=0.0, so it lands right after the system
prompt — your history is never reordered, rewritten, or role-swapped:
[system] You are a helpful travel assistant.
[system] Relevant long-term memories about this user:
- Prefers window seats on long flights
[user] which seat should I book for the Oslo flight?
Memories created by other MemorySync surfaces (LangChain, the CLI, voice agents, coding agents…) are recallable inside CAMEL too — that is the point of memory-as-a-service.
Storage-seam usage (ChatHistoryMemory)
from camel.memories import ChatHistoryMemory, ScoreBasedContextCreator
from camel.types import ModelType
from camel.utils import OpenAITokenCounter
from camel_memorysync import MemorySyncStorage
memory = ChatHistoryMemory(
context_creator=ScoreBasedContextCreator(OpenAITokenCounter(ModelType.GPT_4O_MINI), 2048),
storage=MemorySyncStorage(user_id="customer-42", session_id="support"),
)
save() keeps verbatim records locally (exact round-trip) and sends each
user turn to MemorySync, which extracts the durable facts in it ("Prefers
window seats") and stores only those; the turn text itself is not stored
server-side, and filler is skipped. Assistant replies are not sent — they
are not stored as memories — and system prompts and tool chatter never
leave the process. A retried save is recognised server-side, so each turn
is extracted once.
Deletion — designed against data loss
| Call | What happens |
|---|---|
clear() |
resets the LOCAL conversation window only |
forget_session() |
deletes the facts extracted from THIS session's turns and returns the number deleted (loud — failures raise) |
forget_user() |
deletes the facts extracted from all of this user's CAMEL turns (every camel-surface memory) and returns the number deleted; other surfaces' memories survive |
Configuration
| Parameter | Default | Meaning |
|---|---|---|
user_id |
— (required) | End user the memories belong to |
session_id |
default |
Conversation scope, carried by the facts extracted from its turns |
top_k |
5 |
Memories per recall |
recall_timeout |
1.2 |
Hard recall budget (seconds) |
min_query_chars |
8 |
Skip recall for trivial topics |
window_size |
unlimited | History records per turn |
extraction |
True |
Send the user's turns to MemorySync for fact extraction |
context_creator |
ScoreBased/GPT-4o-mini/2048 | Any BaseContextCreator |
Note on dependencies
camel-ai 0.2.x imports FastMCP from mcp.server, which mcp 2.0 moved —
an unpinned install crashes at import camel.agents. This package pins
mcp<2 until CAMEL supports mcp 2.
Tests
pip install -e . pytest
pytest tests -q # 33 checks against the real camel-ai at latest
The suite drives a REAL ChatAgent turn via CAMEL's own StubModel and
reproduces each in-repo Mem0Storage bug as a regression test.
License
MIT © MemorySync.
Metadata
Release files for camel-memorysync 1.1.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 | Provenance | |
|---|---|---|---|---|
| camel_memorysync-1.1.0.tar.gz | 11.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| camel_memorysync-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.8 kB
Release files / camel_memorysync-1.1.0.tar.gz
| Download URL | camel_memorysync-1.1.0.tar.gz |
|---|---|
| Size | 11.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d3aec8eb9824f7cd43a99f16c2e9211672651701fa2e85f4de5a27fb2010a95f
|
|
BLAKE2b-256 checksum How to use checksums |
e0a23bc8ed10d789ad563da953a6aab4343e0f8f4a9beef9571c1a54b7ff3f6a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.5
|
Release files / camel_memorysync-1.1.0-py3-none-any.whl
| Download URL | camel_memorysync-1.1.0-py3-none-any.whl |
|---|---|
| Size | 14.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
341563c212c8c1c098371decd7ad7017b76a5e18b057c6de7d8a3e1b9eba070c
|
|
BLAKE2b-256 checksum How to use checksums |
204b1aa839ddf4c9f8d21bc21bbfc84ca3b10bb316f23f07f60b39491d0c4aae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.5
|
Security for camel-memorysync 1.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.