Skip to main content

A Python library for advanced memory management in AI agent applications

Project description

memory-agent

View on GitHub
GitHub stars
GitHub forks

The library allows managing both persistence and memory for a LangGraph agent.

memory-agent uses Redis as the backend for short‑term memory and long‑term persistence and semantic search.

memory-agent


🔑 Key Features

  • Dual-layer memory system
    • Short-term memory with Redis → fast, volatile storage with TTL for active sessions.
    • Long-term persistence with Qdrant → semantic search, embeddings, and cross‑session retrieval.
  • Integration with LangGraph → stateful LLM agents with checkpoints and memory tools.
  • Multi-LLM
    • OpenAI (via AgentOpenAI)
    • Ollama (via AgentOllama) for local inference
  • Flexible embeddings
    • OpenAI embeddings (default)
    • Ollama embeddings (e.g., nomic-embed-text)
  • Automatic memory management
    • Summarization and reflection to compress context
  • Observability
    • Structured logging, compatible with Grafana/Loki
  • Easy installation & deployment

🧠 Memory vs 🗃️ Persistence

Function Database Why
Memory Redis Performance, TTL, fast session context
Persistence Redis Vector search, long‑term storage

📦 Installation

pip install memory-agent

For local use with Ollama or local embeddings:


▶️ Usage examples (repository root)

The examples show how to configure the agent, send messages (including streaming) and share memory between different agents.

1) demo.py — Quick start with Ollama + memory

What it does:

  1. Saves to context: "My name is Giuseppe. Remember that."
  2. Asks a factoid: "What is the capital of France?" (streaming)
  3. Retrieves from short‑term memory: "What is my name?" (streaming)

Essential snippet (simplified):

from memory_agent.agent.ollama import AgentOllama
from demo_config import thread_id, user_id, session_id, model_ollama, redis_config,     model_embedding_vs_config, model_embedding_config, qdrant_config, collection_config

agent = AgentOllama(
    thread_id=thread_id,
    user_id=user_id,
    session_id=session_id,
    model_config=model_ollama,
    redis_config=redis_config,
    qdrant_config=qdrant_config,
    collection_config=collection_config,
    embedding_store_config=model_embedding_vs_config,
    embedding_model_config=model_embedding_config,
)

# Non-streaming call
text = await agent.invoke("My name is Giuseppe. Remember that.")

# Streaming call
async for token in agent.invoke_stream("What is the capital of France?"):
    print(token, end="")

# Retrieve from context
async for token in agent.invoke_stream("What is my name?"):
    print(token, end="")

Run:

python demo.py

What to expect:

  • On the first request the agent stores the information (“Giuseppe”).
  • On the third request the agent should answer with the previously provided name.

2) demo_config.py — Centralized configuration

This file defines all parameters used by the examples:

  • Session identifiers:
    thread_id = "thread_demo"
    user_id = "user_demo"
    session_id = "session_demo"
    
  • LLM model (Ollama):
    model_ollama = {
        "model": "llama3.1",
        "model_provider": "ollama",
        "api_key": None,
        "base_url": "http://localhost:11434",
        "temperature": 0.5,
    }
    
  • Qdrant:
    qdrant_config = {
        "url": "http://localhost:6333",
    }
    
  • Embeddings (via Ollama):
    model_embedding_config = {
        "name": "nomic-embed-text",
        "url": "http://localhost:11434"
    }
    
  • Vector Store / Collection (example): COSINE distance with qdrant_client.http.models.Distance.COSINE.
  • Redis: connection/TTL parameters for short‑term memory.

Modify these values to point to your Redis/Qdrant/Ollama instances. Other examples import directly from demo_config.py.


3) demo_mem_shared.py — Shared memory between two agents (LangGraph)

This example shows how two distinct agents can share the same memory.
The idea is to create two AgentOllama instances (e.g., agent_1 and agent_2) that use the same backends (Redis + Qdrant) and the same relevant identifiers (e.g., collection, user, thread), so that what the first agent stores is available to the second.

Flow:

  1. agent_1 receives: "My name is Giuseppe. Remember that." and stores it.
  2. agent_2 receives: "What is my name?" and retrieves the answer from shared memory.

Essential snippet (simplified):

agent_1 = AgentOllama(... shared ...)
agent_2 = AgentOllama(... shared ...)

await agent_1.invoke("My name is Giuseppe. Remember that.")

# The other agent pulls from the same memory
answer = await agent_2.invoke("What is my name?")
print(answer)  # → "Your name is Giuseppe" (expected)

Run:

python demo_mem_shared.py

This pattern is useful when multiple services/workers collaborate on the same user or conversation, leveraging Redis for short‑term state and Qdrant for persistence/semantic search across sessions.


⚙️ Prerequisites

  • Redis running (used for short‑term memory)
  • Ollama running (LLM and optionally embeddings)
  • OpenAI API KEY to make request to OpenAI API
  • Correct variables/URLs in demo_config.py

Docker


🧪 Tips

  • For multi‑worker environments, ensure thread_id, user_id and session_id and collection keys are consistent across processes that need to share memory.
  • To separate memories of different agents, use distinct session/thread IDs or different collections in Qdrant.
  • Tune model temperature and pruning/summarization parameters to balance cost/quality/context.

🛠️ Troubleshooting

  • Doesn't retrieve memory → check Redis reachability and that IDs (thread/user/session) are consistent between requests.
  • Semantic search not effective → verify embeddings are enabled (e.g., nomic-embed-text) and that Qdrant has the correct collection.
  • Streaming prints nothing → ensure you iterate the invoke_stream(...) generator and do print(token, end="").

📄 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

memory_agent-2.0.14.tar.gz (41.4 kB view details)

Uploaded Source

Built Distribution

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

memory_agent-2.0.14-py3-none-any.whl (43.8 kB view details)

Uploaded Python 3

File details

Details for the file memory_agent-2.0.14.tar.gz.

File metadata

  • Download URL: memory_agent-2.0.14.tar.gz
  • Upload date:
  • Size: 41.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.2

File hashes

Hashes for memory_agent-2.0.14.tar.gz
Algorithm Hash digest
SHA256 94c93ceec923c20af8e0e7b69845c63f6065a75f3dcbbfacd6abbe2a66bd5eb2
MD5 2808be2c7f531534e26991e026351adc
BLAKE2b-256 823b0b3d6fa24cbadee2ff421001569eb1348535052c35631eaaaf203324574c

See more details on using hashes here.

File details

Details for the file memory_agent-2.0.14-py3-none-any.whl.

File metadata

  • Download URL: memory_agent-2.0.14-py3-none-any.whl
  • Upload date:
  • Size: 43.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.2

File hashes

Hashes for memory_agent-2.0.14-py3-none-any.whl
Algorithm Hash digest
SHA256 90f0eac19cb34c04ba1c551c9624855b083f48a32db963a7cd32323c75fbf5c7
MD5 b67fa5b0aa9e06b8a742a8845c0e1092
BLAKE2b-256 356bf6e14f8c9c0bf88ffaea3e8e4ccd8a4b1788d65c7772ee3996ebebb38d81

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