Skip to main content

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:

  1. Recalls relevant memory before the first model call.
  2. Persists human messages with retry-safe message identity.
  3. Injects bounded memory and wake context as delimited untrusted data.
  4. Registers exactly add_memory, search_memory, sleep, wake_summary, and forget.
  5. 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.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scm_memory-1.0.0.tar.gz (437.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

scm_memory-1.0.0-py3-none-any.whl (363.6 kB view details)

Uploaded Python 3

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

Hashes for scm_memory-1.0.0.tar.gz
Algorithm Hash digest
SHA256 b169ac1b220c335506f88a4b40a9c330d3c94a23e24f0e199a0cbb22246438c0
MD5 4ffc882b3fd0823da9e4b23408dd07f4
BLAKE2b-256 dd09e68c7f2c06389d0afa3561ec62b14bd117cef282eeb59aa4e84b2ecca33f

See more details on using hashes here.

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

Hashes for scm_memory-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d01b9a17c9a2e90fbaf46e2623a3f139c0b1a4f927fbe90ad23fdea03f4a4af1
MD5 1bbd51f1fcf946745d18d3b4506aaa3c
BLAKE2b-256 2c84cb7125508deefd07986b3f314b4b669922fdef2c9fd3134963eabf52c202

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page