Skip to main content

Persistent semantic memory for AI agents — SQLite-backed, local-first, zero config

Project description

cartisien-engram

Persistent semantic memory for AI agents — Python SDK

from engram import Engram, EngramConfig

memory = Engram(EngramConfig(db_path="./memory.db"))

# Store
memory.remember("user_123", "User prefers TypeScript and dark mode", "user")

# Recall semantically — finds the right memory without exact keyword match
results = memory.recall("user_123", "what are the user's preferences?", limit=5)
# [MemoryEntry(content='User prefers TypeScript and dark mode', similarity=0.82, ...)]

Install

pip install cartisien-engram

Optional: LangChain integration

pip install "cartisien-engram[langchain]"

Optional: Local embeddings (recommended)

# Install Ollama: https://ollama.ai
ollama pull nomic-embed-text

Without Ollama, keyword search is used automatically.


Quick Start

from engram import Engram, EngramConfig

memory = Engram(EngramConfig(
    db_path="./agent.db",
    embedding_url="http://localhost:11434",  # Ollama default
))

# In your agent loop
def handle_message(session_id: str, user_input: str) -> str:
    # 1. Recall relevant context
    context = memory.recall(session_id, user_input, limit=5)
    context_str = "\n".join(f"[{e.role}]: {e.content}" for e in context)

    # 2. Build prompt + call your LLM
    response = llm.chat(f"Context:\n{context_str}\n\nUser: {user_input}")

    # 3. Store both sides
    memory.remember(session_id, user_input, "user")
    memory.remember(session_id, response, "assistant")

    return response

LangChain Integration

Drop-in replacement for ConversationBufferMemory:

from engram.langchain import EngramMemory
from langchain.chains import ConversationChain
from langchain.llms import OpenAI

memory = EngramMemory(
    session_id="user_abc",
    db_path="./memory.db",
    recall_limit=10
)

chain = ConversationChain(llm=OpenAI(), memory=memory)
chain.predict(input="My name is Jeff and I'm building GovScout")
# Start a new session — memory persists
chain.predict(input="What am I building?")  # Remembers "GovScout"

API

Engram(config?)

config = EngramConfig(
    db_path="./memory.db",       # SQLite path (default: ":memory:")
    max_context_length=4000,     # Max chars per entry
    embedding_url="http://localhost:11434",  # Ollama base URL
    embedding_model="nomic-embed-text",      # Embedding model
    semantic_search=True,        # Enable semantic search
)
memory = Engram(config)

remember(session_id, content, role="user", metadata=None)

entry = memory.remember("session_1", "User loves Thai food", "user")
# MemoryEntry(id=..., content=..., role='user', timestamp=...)

recall(session_id, query=None, limit=10, options=None)

Semantic search when Ollama available, keyword fallback otherwise.

results = memory.recall("session_1", "food preferences", limit=5)
# [MemoryEntry(..., similarity=0.84)]

history(session_id, limit=20)

Chronological conversation history.

chat = memory.history("session_1", limit=20)

forget(session_id, id=None, before=None)

memory.forget("session_1")                    # clear all
memory.forget("session_1", id="abc123")       # delete one
memory.forget("session_1", before=datetime.now())  # delete old

stats(session_id)

stats = memory.stats("session_1")
# {"total": 42, "by_role": {"user": 21, "assistant": 21}, "with_embeddings": 42}

Context manager

with Engram(EngramConfig(db_path="./memory.db")) as memory:
    memory.remember("s1", "test", "user")

Part of the Cartisien Memory Suite

Package Language Purpose
cartisien-engram Python This package
@cartisien/engram TypeScript/Node TS SDK
@cartisien/engram-mcp TypeScript MCP server
@cartisien/extensa TypeScript Vector infrastructure (soon)
@cartisien/cogito TypeScript Agent identity (soon)

MIT © Cartisien Interactive

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

cartisien_engram-0.4.0.tar.gz (15.7 kB view details)

Uploaded Source

Built Distribution

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

cartisien_engram-0.4.0-py3-none-any.whl (11.7 kB view details)

Uploaded Python 3

File details

Details for the file cartisien_engram-0.4.0.tar.gz.

File metadata

  • Download URL: cartisien_engram-0.4.0.tar.gz
  • Upload date:
  • Size: 15.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for cartisien_engram-0.4.0.tar.gz
Algorithm Hash digest
SHA256 7d9727bd7649ab9a8a8ef898a8aebac17a676124dd6378a8ddc16faebae4268c
MD5 c794b61ac28416e4b3579072e2ece62d
BLAKE2b-256 85027768131b560aebc62a50e4d3f35e8986f5d0a06bee13b3c22bff957abbe6

See more details on using hashes here.

File details

Details for the file cartisien_engram-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for cartisien_engram-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 96ed8182209aab4963f2f8bdebbc14c0f9416a9e6b3d6bac366a2388fd562800
MD5 0e6246e1acca8e53470181d5a432f857
BLAKE2b-256 c75bdefa025dae4b66b64cf6ad94bf745e3888729d69345257d0946e5563d432

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