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.6.0.tar.gz (21.0 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.6.0-py3-none-any.whl (14.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: cartisien_engram-0.6.0.tar.gz
  • Upload date:
  • Size: 21.0 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.6.0.tar.gz
Algorithm Hash digest
SHA256 37c8d4fe8b1789f0cb7b4bc4c9ddd100fd896d315768864d44eb1fd6dc245e6e
MD5 df5894d0f544ef7224672d71e4499866
BLAKE2b-256 9621e330cbae51b52a6d26aacd96594cbf58c0b03ffd6e0c23c138240a142971

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for cartisien_engram-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8551eeff74e97ba96ad137234cbcb1c17d0cca27d274e7969d05ea2ba250aa13
MD5 efdedfd451ef86b70342028a3cce7674
BLAKE2b-256 d260b28e80c42584283f5017489f4acf55a67489a9e937956b05522b6a83110f

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