SCM Memory: embedded lifecycle memory for Python and LangChain agents.
Project description
SCM Memory: Embedded Lifecycle Memory for Agents
SCM gives Python and LangChain agents persistent lifecycle memory without an SCM server, hosted account, or SCM URL. It remembers facts and events, resolves corrections, consolidates during sleep, forgets stale noise, discovers schemas, and reports what changed when it wakes.
Install
pip install scm-memory
No SCM server, hosted account, base URL, or provider key is required.
Embedded Python
from scm import SCM
memory = SCM(user_id="alice")
memory.add_memory("Alice prefers concise answers.")
result = memory.search_memory("communication preference")
print(result["memories"])
memory.sleep("deep")
print(memory.wake_summary()["narrative"])
memory.close()
State is stored atomically under ~/.scm by default. No provider key is
required; SCM uses offline extraction and hash embeddings when no model is
configured.
LangChain 1.x
pip install "scm-memory[langchain]"
from langchain.agents import create_agent
from scm import SCM
memory = SCM(user_id="alice")
agent = create_agent(
model=model,
tools=[...],
middleware=[memory.langchain()],
)
agent.invoke({"messages": [{"role": "user", "content": "I prefer short answers."}]})
The middleware automatically:
- Recalls relevant memory before the first model call.
- Persists human messages with retry-safe message identity.
- Injects bounded memory and wake context as delimited untrusted data.
- Registers exactly
add_memory,search_memory,sleep,wake_summary, andforget. - Reuses the attached agent model for extraction when supported, while retaining an offline fallback.
The one-call helper is equivalent:
from scm.langchain import create_scm_agent
agent = create_scm_agent(model=model, tools=[...], user_id="alice")
Multi-User Applications
Application code supplies identity; the model never chooses it.
from scm import SCM, SCMContext
from scm.langchain import create_scm_agent
memory = SCM(namespace="support-app")
agent = create_scm_agent(model=model, tools=[...], memory=memory)
agent.invoke(
{"messages": [{"role": "user", "content": "Remember my timezone is IST."}]},
context=SCMContext(user_id="alice", thread_id="ticket-184"),
)
Set SCM_DATABASE_URL in the deployment environment to use PostgreSQL. Agent
code remains unchanged and contains no SCM endpoint.
Five Lifecycle Operations
| Operation | Purpose |
|---|---|
add_memory |
Persist a fact, event, preference, or observation. |
search_memory |
Recall relevant memory and update access state. |
sleep |
Consolidate, discover schemas, resolve interference, and forget. |
wake_summary |
Report what changed during sleep or idle time. |
forget |
Suppress one memory while preserving audit lineage. |
consolidate remains a backward-compatible alias for sleep.
Persistence and Administration
Local storage uses atomic replacement, checksums, process locking, restrictive
permissions, and last-known-good recovery. Optional encryption is enabled with
SCM_ENCRYPTION_KEY. PostgreSQL adds revisioned transactions, per-user locks,
and database-backed sleep leases for multi-worker deployments.
backup = memory.export_user()
memory.import_user(backup)
memory.delete_user() # hard deletion
Advanced Surfaces
REST, MCP, and the HTTP client remain supported for remote or non-Python deployments. The JavaScript package is a remote REST client; SCM 1.0 does not claim an embedded JavaScript runtime. See Integrations and Deployment.
Product Verification
python scripts/run_product_qualification.py
The release gate builds and installs the wheel outside the repository, runs plain Python and LangChain without an SCM server, checks lifecycle recovery, exercises the optional REST and JavaScript surfaces, and audits dependencies. See Quality Gates.
Documentation
Research
The research paper motivates and evaluates SCM's lifecycle architecture. The product remains honest about the evidence: SCM targets interference, contradiction, schema discovery, curiosity gaps, and idle-time transformation; it is not a claim of universal superiority over retrieval systems.
- Published SCM paper (DOI: 10.5281/zenodo.21323877)
- Repository copy
- Reproducibility
- Versioned artifacts
License
Project details
Release history Release notifications | RSS feed
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 scm_memory-1.0.0.tar.gz.
File metadata
- Download URL: scm_memory-1.0.0.tar.gz
- Upload date:
- Size: 437.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b169ac1b220c335506f88a4b40a9c330d3c94a23e24f0e199a0cbb22246438c0
|
|
| MD5 |
4ffc882b3fd0823da9e4b23408dd07f4
|
|
| BLAKE2b-256 |
dd09e68c7f2c06389d0afa3561ec62b14bd117cef282eeb59aa4e84b2ecca33f
|
File details
Details for the file scm_memory-1.0.0-py3-none-any.whl.
File metadata
- Download URL: scm_memory-1.0.0-py3-none-any.whl
- Upload date:
- Size: 363.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d01b9a17c9a2e90fbaf46e2623a3f139c0b1a4f927fbe90ad23fdea03f4a4af1
|
|
| MD5 |
1bbd51f1fcf946745d18d3b4506aaa3c
|
|
| BLAKE2b-256 |
2c84cb7125508deefd07986b3f314b4b669922fdef2c9fd3134963eabf52c202
|