Skip to main content

LangGraph integration for MCAL - Goal-aware memory for AI agents

Project description

mcal-ai-langgraph

LangGraph integration for MCAL — Goal-aware memory for AI agents.

Installation

pip install mcal-ai-langgraph

This will automatically install mcal-ai and langgraph as dependencies.

Quick Start

from mcal import MCAL
from mcal_langgraph import MCALStore

# Initialize MCAL
mcal = MCAL(llm_provider="anthropic")

# Create LangGraph-compatible store
store = MCALStore(mcal)

# Use with LangGraph
from langgraph.prebuilt import create_react_agent

agent = create_react_agent(
    model=your_model,
    tools=your_tools,
    store=store  # Goal-aware memory!
)

What's New in 0.4.1

  • First-Class FACT Nodes — 3 new typed edges (measures, evidence_for, quantifies) improve fact retrieval; quantitative queries automatically boost fact content
  • Importance Scoring Boost — FACT nodes with numeric values score higher in retrieval
  • search_facts() API — Filter facts by category and value range on UnifiedGraph
  • Version Metadata Fix__version__ now correctly reports 0.4.1 (was stuck at 0.2.9)

What's New in 0.4.0

  • Graph Compaction Fixes — Improved retrieval quality with facts-in-context, expanded edge types, chunk boost scoring
  • CTO-1020 Benchmark — 85.3% decision retention over 1020 turns, 95.6% cross-era recall, 88% token reduction
  • Statistical Rigor — Multi-run validation with Fisher's exact test, Wilson score confidence intervals

What's New in 0.3.0

  • Expanded Relationship Edge Types — 10 new edge types (family, friend, colleague, likes, prefers, lives_in, works_at, etc.) for richer relationship graphs
  • Key Facts & Entities in Search Contextsearch() now surfaces extracted facts and background entities directly in result.context
  • Improved Chunk Retrieval — More results returned with equal weighting; conversation excerpts prioritized in context
Older releases

What's New in 0.2.9

  • Configurable Extraction Profiles — Choose decision, conversational, or comprehensive via MCALMemoryConfig
  • Hybrid Retrieval with ChunkStore — Graph traversal + embedding search for maximum recall
  • FACT/PERSON Node Protection — Graph compaction preserves factual and identity nodes
# Configuration options
memory = MCALMemory(
    llm_provider="anthropic",
    extraction_profile="decision",      # "decision" | "conversational" | "comprehensive"
    enable_chunk_store=True,             # hybrid retrieval
)

Features

MCALStore (BaseStore)

Drop-in replacement for LangGraph's built-in stores with goal-aware memory:

from mcal_langgraph import MCALStore

store = MCALStore(mcal)

# Store memories
await store.aput(
    namespace=("user_123", "memories"),
    key="decision_1",
    value={"text": "Decided to use PostgreSQL for ACID compliance"}
)

# Goal-aware search — returns memories relevant to current goals
results = await store.asearch(
    namespace_prefix=("user_123",),
    query="database choice"
)

# Results include goal context and decisions
for item in results:
    print(item.value)

MCALMemory

Memory nodes for custom LangGraph workflows:

from mcal_langgraph import MCALMemory

# Initialize with provider (uses get_mcal() factory internally)
memory = MCALMemory(llm_provider="anthropic")

# Or pass an existing MCAL instance
memory = MCALMemory(mcal=mcal, user_id="user_123")

# Add as nodes in your graph
graph.add_node("update_memory", memory.update_node())
graph.add_node("get_context", memory.context_node())

MCALCheckpointer

State persistence for LangGraph graphs:

from mcal_langgraph import MCALCheckpointer

checkpointer = MCALCheckpointer(storage_path="~/.mcal")
graph = builder.compile(checkpointer=checkpointer)

Why mcal-ai-langgraph?

Feature LangGraph InMemoryStore MCALStore
BaseStore interface
Namespace organization
TTL support
Filter operators ($eq, $gt, etc.)
Goal-aware search
Decision tracking
Intent preservation

API Reference

MCALStore

class MCALStore(BaseStore):
    def __init__(self, mcal: MCAL): ...
    
    # Async API
    async def aput(self, namespace, key, value, index=None): ...
    async def aget(self, namespace, key) -> Optional[Item]: ...
    async def adelete(self, namespace, key): ...
    async def asearch(self, namespace_prefix, /, *, query=None, filter=None, limit=10, offset=0) -> list[Item]: ...
    async def alist_namespaces(self, *, prefix=None, suffix=None, max_depth=None, limit=100, offset=0) -> list[tuple[str, ...]]: ...
    
    # Sync API (also available)
    def put(self, namespace, key, value, index=None): ...
    def get(self, namespace, key) -> Optional[Item]: ...
    def delete(self, namespace, key): ...
    def search(self, namespace_prefix, /, *, query=None, filter=None, limit=10, offset=0) -> list[Item]: ...

MCALMemory

class MCALMemory:
    def __init__(
        self,
        mcal: Optional[MCAL] = None,
        llm_provider: str = "anthropic",
        embedding_provider: str = "openai",
        storage_path: Optional[str] = None,
        user_id: str = "default",
        **mcal_kwargs,
    ): ...
    
    def update_node(self) -> Callable: ...
    def context_node(self) -> Callable: ...
    async def add(self, messages, user_id=None): ...
    async def get_context(self, query, user_id=None): ...
    async def search(self, query, user_id=None, limit=5): ...

MCALCheckpointer

class MCALCheckpointer(BaseCheckpointSaver):
    def __init__(self, storage_path: Optional[str] = None): ...
    
    def get(self, config) -> Optional[dict]: ...
    def put(self, config, checkpoint): ...
    def list(self, config) -> list[dict]: ...

Migrating from mcal[langgraph]

If you were using the old extras-based installation:

# Old way (deprecated)
from mcal.integrations.langgraph import MCALStore

# New way (recommended)
from mcal_langgraph import MCALStore

The old import path still works but will show a deprecation warning.

Requirements

  • Python >= 3.11
  • mcal-ai >= 0.2.0
  • langgraph >= 0.2.0
  • langchain-core >= 0.3.0

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

mcal_ai_langgraph-0.4.2.tar.gz (16.3 kB view details)

Uploaded Source

Built Distribution

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

mcal_ai_langgraph-0.4.2-py3-none-any.whl (14.3 kB view details)

Uploaded Python 3

File details

Details for the file mcal_ai_langgraph-0.4.2.tar.gz.

File metadata

  • Download URL: mcal_ai_langgraph-0.4.2.tar.gz
  • Upload date:
  • Size: 16.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.11

File hashes

Hashes for mcal_ai_langgraph-0.4.2.tar.gz
Algorithm Hash digest
SHA256 422a3e9493d0ce486229b7b6a634f709b79341f4f9221879593e09f380e3c03a
MD5 54d7fd54b0dbf86c6f11af58849c8972
BLAKE2b-256 985c2a438f8ae62a164faa19268e64c7b2a2b84cc86b9393694d5ccdb90d50f8

See more details on using hashes here.

File details

Details for the file mcal_ai_langgraph-0.4.2-py3-none-any.whl.

File metadata

File hashes

Hashes for mcal_ai_langgraph-0.4.2-py3-none-any.whl
Algorithm Hash digest
SHA256 26d3bda8577feb3fd62408773cb01b257e47b031def3138f474f86b604907c1e
MD5 86dd8cd30499db9f14ad76ea3818f3eb
BLAKE2b-256 ef2d8d18dfd751070baa0ff8accd87567b055d9619351b92e02decb9d8319f4e

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