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.12.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.12-py3-none-any.whl (43.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: memory_agent-2.0.12.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.12.tar.gz
Algorithm Hash digest
SHA256 19048ad0c65024eff0bc52cba5238b718072cd963a359de3ee52208012512b35
MD5 26d59595af764f73c727f5eb9f6df4a6
BLAKE2b-256 994efa858960408914ede91cf6e5a0470fcf94ebd888e19366a6b58c5f3863e7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: memory_agent-2.0.12-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.12-py3-none-any.whl
Algorithm Hash digest
SHA256 56b64707ce02b7d414446c14efeb759ff9d65793f9d7edd2e71c8e7d81e1cbd0
MD5 e58b6d7bddae1b3bf7c003ee93e7613f
BLAKE2b-256 9575c72571a62b0da16ad0a318135209f67a99ac0f26bb35490e1b8cad83c0d0

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