BACK TO BLOGS

Engineering

Multi-Agent Memory: How to Share Context Across AI Agents

Multi-Agent Memory: How to Share Context Across AI Agents

Your AI agents are talking past each other. One agent researches customer history. Another manages support tickets. A third handles billing inquiries. They're pulling the same data independently, wasting compute, and missing the bigger picture.

This is the multi-agent memory coordination problem.

When you scale from single-agent systems to multi-agent architectures, you hit a wall: how do these agents actually remember what each other knows? Without shared context, you're just running parallel silos.

I'm going to show you how to solve this. We'll walk through architecture patterns that actually work, implementation strategies you can use today, and how to handle the messy parts: when agents disagree about what should be remembered.

Why multi-agent systems need shared memory coordination

Let's start with the coordination problem.

Imagine you're building a customer service platform with three specialized agents: one for technical support, one for billing, one for account management. Each one is good at its job. But when a customer calls with a complex issue spanning all three domains, what happens?

Without shared memory, each agent rebuilds context from scratch. Agent one queries the database, agent two queries the same database, agent three does it again. This multiplies latency by three and burns through API quotas. Worse, they might end up with inconsistent views of what's true.

The real problem: most AI frameworks treat memory as local state. LangChain's memory buffer is per-agent. CrewAI's context is task-specific. The agents can't see each other's learned facts, inferences, or decisions without explicit message passing, which is slow and incomplete.

Multi-agent memory coordination flips this. You build a shared context layer that all agents can read and write to, inspired by how computer memory works where individual CPUs share RAM instead of each keeping separate caches.

Here's what gets solved when you implement it right:

Coordination efficiency. Agents access pre-computed context instead of duplicating work. One agent caches a decision; another agent transforms and reuses it. This is what researchers call "KV cache sharing," borrowed from how LLMs optimize computation.

Consistency. All agents see the same ground truth about customer history, decisions made, data processed. This prevents the nightmare where agent A contradicts agent B.

Scalability. With shared memory, adding a fourth or fifth agent doesn't multiply your database hits. You scale the memory layer, not the data access patterns.

The use cases are everywhere: customer support teams where agents hand off between specialist and generalist, financial systems where trading agents coordinate on portfolio state, and content moderation with fact-checking, toxicity detection, and appeal review happening simultaneously.

Architecture patterns for shared memory

Let me break down the patterns researchers and production teams are using right now.

The shared memory store pattern

This is the simplest approach and where most teams start. You create a central context store—a database or in-memory system—that all agents can read and write to.

Here's the architecture:

  • Central store. This holds facts, decisions, intermediate results. It's the single source of truth.

  • Agent-specific views. Each agent can query subsets of memory relevant to its task. An agent doesn't need to see everything; it needs to see what matters for its current objective.

  • Write protocols. When agent A writes something, agents B and C can see it immediately—or after a sync interval, depending on your consistency requirements.

The advantage: simple to understand and implement. You can build this with a key-value store, a traditional database, or a vector database.

The catch: all agents hitting the same store creates bottlenecks. This is fine for small teams (5-10 agents), but at scale you need distribution.

Event-sourced memory

This pattern treats memory as an immutable log of events. Each agent writes events: "analyzed customer ticket", "identified fraud pattern", "resolved billing dispute". Other agents read this log to rebuild context.

Think of it like git for your agent's shared brain.

Benefits:

  • Auditability. You have a complete record of what every agent thought and when.

  • Replay-ability. Agents can replay events to understand why a decision was made.

  • Decoupling. Agents don't need to know about each other; they just write to the log.

The tradeoff: rebuilding full context from a long event log is slower than querying a normalized database. You need to layer snapshots on top to keep reads fast.

Distributed memory with periodic synchronization

Here's what large production systems do: agents keep local state for speed. They sync with a shared store periodically or on demand.

Each agent has:

  • Local cache. Working memory that's fast. The agent updates it frequently.

  • Shared checkpoint. Periodically pushed to the central store.

  • Sync protocol. When an agent needs information it doesn't have locally, it queries the shared store.

This solves latency. Your agent doesn't wait for remote calls on every operation. It only syncs when it needs new data or has findings to share.

The challenge: handling merges when agents have diverged. If agent A thinks "customer is premium" and agent B thinks "customer is standard," which is right? You need conflict resolution logic to determine the ground truth.

Hybrid orchestration

Real teams often combine patterns. A high-level orchestrator (maybe a supervisor agent) coordinates strategy and assigns tasks, while tactical agents coordinate through shared memory and direct messaging. This hybrid approach uses strategic coordination through an orchestrator paired with tactical execution through shared state management.

Implementation with HydraDB

Let me show you how to build this concretely. I'm going to use HydraDB because it's built exactly for this problem: in-memory state management for distributed systems, with a clean API.

Setting up shared context stores

First, here's how you create a shared memory layer that multiple agents can access:

<span class="kn">from</span><span class="w"> </span><span class="nn">hydradb</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydraDB</span><span class="p">,</span> <span class="n">ContextStore</span>

<span class="c1"># Initialize HydraDB instance</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">HydraDB</span><span class="p">()</span>

<span class="c1"># Create a shared context store for your agent team</span>
<span class="n">customer_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"customer_interactions"</span><span class="p">,</span>
    <span class="n">namespace</span><span class="o">=</span><span class="s2">"production"</span>
<span class="p">)</span>

<span class="c1"># Each agent can write observations</span>
<span class="k">def</span><span class="w"> </span><span class="nf">agent_writes_observation</span><span class="p">(</span><span class="n">agent_id</span><span class="p">,</span> <span class="n">customer_id</span><span class="p">,</span> <span class="n">observation</span><span class="p">):</span>
    <span class="n">key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:observations"</span>
    <span class="n">current</span> <span class="o">=</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[])</span>
    <span class="n">current</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
        <span class="s2">"agent"</span><span class="p">:</span> <span class="n">agent_id</span><span class="p">,</span>
        <span class="s2">"timestamp"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">(),</span>
        <span class="s2">"observation"</span><span class="p">:</span> <span class="n">observation</span>
    <span class="p">})</span>
    <span class="n">customer_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">current</span><span class="p">)</span>

<span class="c1"># Any agent can read what others have found</span>
<span class="k">def</span><span class="w"> </span><span class="nf">agent_reads_context</span><span class="p">(</span><span class="n">agent_id</span><span class="p">,</span> <span class="n">customer_id</span><span class="p">):</span>
    <span class="n">observations</span> <span class="o">=</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:observations"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[])</span>
    <span class="n">decisions</span> <span class="o">=</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:decisions"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[])</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="s2">"observations"</span><span class="p">:</span> <span class="n">observations</span><span class="p">,</span>
        <span class="s2">"decisions"</span><span class="p">:</span> <span class="n">decisions</span><span class="p">,</span>
        <span class="s2">"last_updated"</span><span class="p">:</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get_metadata</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:last_updated"</span><span class="p">)</span>
    <span class="p">}</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">hydradb</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydraDB</span><span class="p">,</span> <span class="n">ContextStore</span>

<span class="c1"># Initialize HydraDB instance</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">HydraDB</span><span class="p">()</span>

<span class="c1"># Create a shared context store for your agent team</span>
<span class="n">customer_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"customer_interactions"</span><span class="p">,</span>
    <span class="n">namespace</span><span class="o">=</span><span class="s2">"production"</span>
<span class="p">)</span>

<span class="c1"># Each agent can write observations</span>
<span class="k">def</span><span class="w"> </span><span class="nf">agent_writes_observation</span><span class="p">(</span><span class="n">agent_id</span><span class="p">,</span> <span class="n">customer_id</span><span class="p">,</span> <span class="n">observation</span><span class="p">):</span>
    <span class="n">key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:observations"</span>
    <span class="n">current</span> <span class="o">=</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[])</span>
    <span class="n">current</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
        <span class="s2">"agent"</span><span class="p">:</span> <span class="n">agent_id</span><span class="p">,</span>
        <span class="s2">"timestamp"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">(),</span>
        <span class="s2">"observation"</span><span class="p">:</span> <span class="n">observation</span>
    <span class="p">})</span>
    <span class="n">customer_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">current</span><span class="p">)</span>

<span class="c1"># Any agent can read what others have found</span>
<span class="k">def</span><span class="w"> </span><span class="nf">agent_reads_context</span><span class="p">(</span><span class="n">agent_id</span><span class="p">,</span> <span class="n">customer_id</span><span class="p">):</span>
    <span class="n">observations</span> <span class="o">=</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:observations"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[])</span>
    <span class="n">decisions</span> <span class="o">=</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:decisions"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[])</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="s2">"observations"</span><span class="p">:</span> <span class="n">observations</span><span class="p">,</span>
        <span class="s2">"decisions"</span><span class="p">:</span> <span class="n">decisions</span><span class="p">,</span>
        <span class="s2">"last_updated"</span><span class="p">:</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get_metadata</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:last_updated"</span><span class="p">)</span>
    <span class="p">}</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">hydradb</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydraDB</span><span class="p">,</span> <span class="n">ContextStore</span>

<span class="c1"># Initialize HydraDB instance</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">HydraDB</span><span class="p">()</span>

<span class="c1"># Create a shared context store for your agent team</span>
<span class="n">customer_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"customer_interactions"</span><span class="p">,</span>
    <span class="n">namespace</span><span class="o">=</span><span class="s2">"production"</span>
<span class="p">)</span>

<span class="c1"># Each agent can write observations</span>
<span class="k">def</span><span class="w"> </span><span class="nf">agent_writes_observation</span><span class="p">(</span><span class="n">agent_id</span><span class="p">,</span> <span class="n">customer_id</span><span class="p">,</span> <span class="n">observation</span><span class="p">):</span>
    <span class="n">key</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:observations"</span>
    <span class="n">current</span> <span class="o">=</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[])</span>
    <span class="n">current</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
        <span class="s2">"agent"</span><span class="p">:</span> <span class="n">agent_id</span><span class="p">,</span>
        <span class="s2">"timestamp"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">(),</span>
        <span class="s2">"observation"</span><span class="p">:</span> <span class="n">observation</span>
    <span class="p">})</span>
    <span class="n">customer_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">current</span><span class="p">)</span>

<span class="c1"># Any agent can read what others have found</span>
<span class="k">def</span><span class="w"> </span><span class="nf">agent_reads_context</span><span class="p">(</span><span class="n">agent_id</span><span class="p">,</span> <span class="n">customer_id</span><span class="p">):</span>
    <span class="n">observations</span> <span class="o">=</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:observations"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[])</span>
    <span class="n">decisions</span> <span class="o">=</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:decisions"</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="p">[])</span>

    <span class="k">return</span> <span class="p">{</span>
        <span class="s2">"observations"</span><span class="p">:</span> <span class="n">observations</span><span class="p">,</span>
        <span class="s2">"decisions"</span><span class="p">:</span> <span class="n">decisions</span><span class="p">,</span>
        <span class="s2">"last_updated"</span><span class="p">:</span> <span class="n">customer_context</span><span class="o">.</span><span class="n">get_metadata</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">customer_id</span><span class="si">}</span><span class="s2">:last_updated"</span><span class="p">)</span>
    <span class="p">}</span>

This is the basic pattern. One store. Multiple writers. Multiple readers. All reads are instant because HydraDB keeps everything in RAM.

Memory scoping: global, group, and private

But you need more control. You don't want every agent seeing every piece of state. You need three levels:

Global memory. Facts relevant to the entire system. "Customer has a known fraud pattern." "Product is out of stock globally."

Group memory. Shared by a subset of agents. Technical support agents share a context store separate from billing agents.

Private memory. Each agent's working context. This agent is currently processing ticket #12345.

Here's how to implement it:

<span class="kn">from</span><span class="w"> </span><span class="nn">hydradb</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydraDB</span>

<span class="n">db</span> <span class="o">=</span> <span class="n">HydraDB</span><span class="p">()</span>

<span class="c1"># Global context: shared across all agents</span>
<span class="n">global_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"global_facts"</span><span class="p">,</span>
    <span class="n">scope</span><span class="o">=</span><span class="s2">"global"</span><span class="p">,</span>
    <span class="n">retention_ttl</span><span class="o">=</span><span class="mi">3600</span>  <span class="c1"># Keep for 1 hour</span>
<span class="p">)</span>

<span class="c1"># Group context: shared within agent teams</span>
<span class="n">support_team_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"support_team_memory"</span><span class="p">,</span>
    <span class="n">scope</span><span class="o">=</span><span class="s2">"group"</span><span class="p">,</span>
    <span class="n">group_id</span><span class="o">=</span><span class="s2">"technical_support"</span>
<span class="p">)</span>

<span class="n">billing_team_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"billing_team_memory"</span><span class="p">,</span>
    <span class="n">scope</span><span class="o">=</span><span class="s2">"group"</span><span class="p">,</span>
    <span class="n">group_id</span><span class="o">=</span><span class="s2">"billing"</span>
<span class="p">)</span>

<span class="c1"># Private context: per-agent working memory</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Agent</span><span class="p">:</span>
    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">agent_id</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">agent_id</span> <span class="o">=</span> <span class="n">agent_id</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">private_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
            <span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"agent_</span><span class="si">{</span><span class="n">agent_id</span><span class="si">}</span><span class="s2">_working"</span><span class="p">,</span>
            <span class="n">scope</span><span class="o">=</span><span class="s2">"private"</span><span class="p">,</span>
            <span class="n">owner</span><span class="o">=</span><span class="n">agent_id</span>
        <span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">remember_global</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Write to global memory—visible to all agents"""</span>
        <span class="n">global_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">remember_team</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Write to group memory—visible to agent's team"""</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">team_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">remember_local</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Write to private memory—only this agent sees it"""</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">private_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">retrieve_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">access_level</span><span class="o">=</span><span class="s2">"all"</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Retrieve context at specified visibility level"""</span>
        <span class="n">context</span> <span class="o">=</span> <span class="p">{}</span>

        <span class="k">if</span> <span class="n">access_level</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"all"</span><span class="p">,</span> <span class="s2">"global"</span><span class="p">]:</span>
            <span class="n">context</span><span class="p">[</span><span class="s2">"global"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">global_context</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="s2">"*"</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">access_level</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"all"</span><span class="p">,</span> <span class="s2">"team"</span><span class="p">]:</span>
            <span class="n">context</span><span class="p">[</span><span class="s2">"team"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">team_context</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="s2">"*"</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">access_level</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"all"</span><span class="p">,</span> <span class="s2">"private"</span><span class="p">]:</span>
            <span class="n">context</span><span class="p">[</span><span class="s2">"private"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">private_context</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="s2">"*"</span><span class="p">))</span>

        <span class="k">return</span> <span class="n">context</span>

<span class="c1"># Example usage with two agents</span>
<span class="n">support_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span><span class="s2">"support_001"</span><span class="p">)</span>
<span class="n">billing_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span><span class="s2">"billing_001"</span><span class="p">)</span>

<span class="c1"># Support agent finds something important</span>
<span class="n">support_agent</span><span class="o">.</span><span class="n">remember_global</span><span class="p">(</span>
    <span class="s2">"customer:premium_status"</span><span class="p">,</span>
    <span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">"verified_at"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()}</span>
<span class="p">)</span>

<span class="c1"># Billing agent immediately sees it</span>
<span class="n">premium_status</span> <span class="o">=</span> <span class="n">billing_agent</span><span class="o">.</span><span class="n">retrieve_context</span><span class="p">(</span><span class="s2">"global"</span><span class="p">)</span>
<span class="c1"># Returns: {..., "global": {"customer:premium_status": {...}}}</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">hydradb</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydraDB</span>

<span class="n">db</span> <span class="o">=</span> <span class="n">HydraDB</span><span class="p">()</span>

<span class="c1"># Global context: shared across all agents</span>
<span class="n">global_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"global_facts"</span><span class="p">,</span>
    <span class="n">scope</span><span class="o">=</span><span class="s2">"global"</span><span class="p">,</span>
    <span class="n">retention_ttl</span><span class="o">=</span><span class="mi">3600</span>  <span class="c1"># Keep for 1 hour</span>
<span class="p">)</span>

<span class="c1"># Group context: shared within agent teams</span>
<span class="n">support_team_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"support_team_memory"</span><span class="p">,</span>
    <span class="n">scope</span><span class="o">=</span><span class="s2">"group"</span><span class="p">,</span>
    <span class="n">group_id</span><span class="o">=</span><span class="s2">"technical_support"</span>
<span class="p">)</span>

<span class="n">billing_team_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"billing_team_memory"</span><span class="p">,</span>
    <span class="n">scope</span><span class="o">=</span><span class="s2">"group"</span><span class="p">,</span>
    <span class="n">group_id</span><span class="o">=</span><span class="s2">"billing"</span>
<span class="p">)</span>

<span class="c1"># Private context: per-agent working memory</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Agent</span><span class="p">:</span>
    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">agent_id</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">agent_id</span> <span class="o">=</span> <span class="n">agent_id</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">private_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
            <span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"agent_</span><span class="si">{</span><span class="n">agent_id</span><span class="si">}</span><span class="s2">_working"</span><span class="p">,</span>
            <span class="n">scope</span><span class="o">=</span><span class="s2">"private"</span><span class="p">,</span>
            <span class="n">owner</span><span class="o">=</span><span class="n">agent_id</span>
        <span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">remember_global</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Write to global memory—visible to all agents"""</span>
        <span class="n">global_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">remember_team</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Write to group memory—visible to agent's team"""</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">team_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">remember_local</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Write to private memory—only this agent sees it"""</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">private_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">retrieve_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">access_level</span><span class="o">=</span><span class="s2">"all"</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Retrieve context at specified visibility level"""</span>
        <span class="n">context</span> <span class="o">=</span> <span class="p">{}</span>

        <span class="k">if</span> <span class="n">access_level</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"all"</span><span class="p">,</span> <span class="s2">"global"</span><span class="p">]:</span>
            <span class="n">context</span><span class="p">[</span><span class="s2">"global"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">global_context</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="s2">"*"</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">access_level</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"all"</span><span class="p">,</span> <span class="s2">"team"</span><span class="p">]:</span>
            <span class="n">context</span><span class="p">[</span><span class="s2">"team"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">team_context</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="s2">"*"</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">access_level</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"all"</span><span class="p">,</span> <span class="s2">"private"</span><span class="p">]:</span>
            <span class="n">context</span><span class="p">[</span><span class="s2">"private"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">private_context</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="s2">"*"</span><span class="p">))</span>

        <span class="k">return</span> <span class="n">context</span>

<span class="c1"># Example usage with two agents</span>
<span class="n">support_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span><span class="s2">"support_001"</span><span class="p">)</span>
<span class="n">billing_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span><span class="s2">"billing_001"</span><span class="p">)</span>

<span class="c1"># Support agent finds something important</span>
<span class="n">support_agent</span><span class="o">.</span><span class="n">remember_global</span><span class="p">(</span>
    <span class="s2">"customer:premium_status"</span><span class="p">,</span>
    <span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">"verified_at"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()}</span>
<span class="p">)</span>

<span class="c1"># Billing agent immediately sees it</span>
<span class="n">premium_status</span> <span class="o">=</span> <span class="n">billing_agent</span><span class="o">.</span><span class="n">retrieve_context</span><span class="p">(</span><span class="s2">"global"</span><span class="p">)</span>
<span class="c1"># Returns: {..., "global": {"customer:premium_status": {...}}}</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">hydradb</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydraDB</span>

<span class="n">db</span> <span class="o">=</span> <span class="n">HydraDB</span><span class="p">()</span>

<span class="c1"># Global context: shared across all agents</span>
<span class="n">global_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"global_facts"</span><span class="p">,</span>
    <span class="n">scope</span><span class="o">=</span><span class="s2">"global"</span><span class="p">,</span>
    <span class="n">retention_ttl</span><span class="o">=</span><span class="mi">3600</span>  <span class="c1"># Keep for 1 hour</span>
<span class="p">)</span>

<span class="c1"># Group context: shared within agent teams</span>
<span class="n">support_team_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"support_team_memory"</span><span class="p">,</span>
    <span class="n">scope</span><span class="o">=</span><span class="s2">"group"</span><span class="p">,</span>
    <span class="n">group_id</span><span class="o">=</span><span class="s2">"technical_support"</span>
<span class="p">)</span>

<span class="n">billing_team_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"billing_team_memory"</span><span class="p">,</span>
    <span class="n">scope</span><span class="o">=</span><span class="s2">"group"</span><span class="p">,</span>
    <span class="n">group_id</span><span class="o">=</span><span class="s2">"billing"</span>
<span class="p">)</span>

<span class="c1"># Private context: per-agent working memory</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Agent</span><span class="p">:</span>
    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">agent_id</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">agent_id</span> <span class="o">=</span> <span class="n">agent_id</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">private_context</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">create_context_store</span><span class="p">(</span>
            <span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">"agent_</span><span class="si">{</span><span class="n">agent_id</span><span class="si">}</span><span class="s2">_working"</span><span class="p">,</span>
            <span class="n">scope</span><span class="o">=</span><span class="s2">"private"</span><span class="p">,</span>
            <span class="n">owner</span><span class="o">=</span><span class="n">agent_id</span>
        <span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">remember_global</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Write to global memory—visible to all agents"""</span>
        <span class="n">global_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">remember_team</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Write to group memory—visible to agent's team"""</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">team_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">remember_local</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Write to private memory—only this agent sees it"""</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">private_context</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">retrieve_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">access_level</span><span class="o">=</span><span class="s2">"all"</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Retrieve context at specified visibility level"""</span>
        <span class="n">context</span> <span class="o">=</span> <span class="p">{}</span>

        <span class="k">if</span> <span class="n">access_level</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"all"</span><span class="p">,</span> <span class="s2">"global"</span><span class="p">]:</span>
            <span class="n">context</span><span class="p">[</span><span class="s2">"global"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">global_context</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="s2">"*"</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">access_level</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"all"</span><span class="p">,</span> <span class="s2">"team"</span><span class="p">]:</span>
            <span class="n">context</span><span class="p">[</span><span class="s2">"team"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">team_context</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="s2">"*"</span><span class="p">))</span>

        <span class="k">if</span> <span class="n">access_level</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"all"</span><span class="p">,</span> <span class="s2">"private"</span><span class="p">]:</span>
            <span class="n">context</span><span class="p">[</span><span class="s2">"private"</span><span class="p">]</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">private_context</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="s2">"*"</span><span class="p">))</span>

        <span class="k">return</span> <span class="n">context</span>

<span class="c1"># Example usage with two agents</span>
<span class="n">support_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span><span class="s2">"support_001"</span><span class="p">)</span>
<span class="n">billing_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span><span class="s2">"billing_001"</span><span class="p">)</span>

<span class="c1"># Support agent finds something important</span>
<span class="n">support_agent</span><span class="o">.</span><span class="n">remember_global</span><span class="p">(</span>
    <span class="s2">"customer:premium_status"</span><span class="p">,</span>
    <span class="p">{</span><span class="s2">"value"</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">"verified_at"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()}</span>
<span class="p">)</span>

<span class="c1"># Billing agent immediately sees it</span>
<span class="n">premium_status</span> <span class="o">=</span> <span class="n">billing_agent</span><span class="o">.</span><span class="n">retrieve_context</span><span class="p">(</span><span class="s2">"global"</span><span class="p">)</span>
<span class="c1"># Returns: {..., "global": {"customer:premium_status": {...}}}</span>

This scoping approach is critical. It reduces noise, improves query speed, and makes it easy to audit what each agent has access to.

Multi-agent memory sharing tool

Here's a pattern for using HydraDB with LangChain and CrewAI agents simultaneously:

<span class="kn">from</span><span class="w"> </span><span class="nn">hydradb</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydraDB</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">langchain.memory</span><span class="w"> </span><span class="kn">import</span> <span class="n">ConversationBufferMemory</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">langchain.tools</span><span class="w"> </span><span class="kn">import</span> <span class="n">Tool</span>

<span class="k">class</span><span class="w"> </span><span class="nc">SharedMemoryTool</span><span class="p">:</span>
<span class="w">    </span><span class="sd">"""Wraps HydraDB for use across any AI framework"""</span>

    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">,</span> <span class="n">context_store_name</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">db</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">store</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">get_context_store</span><span class="p">(</span><span class="n">context_store_name</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">write_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">visibility</span><span class="o">=</span><span class="s2">"global"</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Standard interface for writing shared memory"""</span>
        <span class="n">metadata</span> <span class="o">=</span> <span class="p">{</span>
            <span class="s2">"visibility"</span><span class="p">:</span> <span class="n">visibility</span><span class="p">,</span>
            <span class="s2">"written_at"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
        <span class="p">}</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">metadata</span><span class="o">=</span><span class="n">metadata</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">read_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Standard interface for reading shared memory"""</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">search_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pattern</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Find all memories matching a pattern"""</span>
        <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="n">pattern</span><span class="p">))</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">clear_expired</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">max_age_seconds</span><span class="o">=</span><span class="mi">3600</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Clean up old memories"""</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">cleanup</span><span class="p">(</span><span class="n">max_age</span><span class="o">=</span><span class="n">max_age_seconds</span><span class="p">)</span>

<span class="c1"># Create the tool</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">HydraDB</span><span class="p">()</span>
<span class="n">memory_tool</span> <span class="o">=</span> <span class="n">SharedMemoryTool</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="s2">"shared_agent_context"</span><span class="p">)</span>

<span class="c1"># Expose it to LangChain agents</span>
<span class="n">langchain_memory_tool</span> <span class="o">=</span> <span class="n">Tool</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"shared_memory"</span><span class="p">,</span>
    <span class="n">func</span><span class="o">=</span><span class="k">lambda</span> <span class="n">q</span><span class="p">:</span> <span class="n">memory_tool</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">q</span><span class="p">),</span>
    <span class="n">description</span><span class="o">=</span><span class="s2">"Read from shared agent memory"</span>
<span class="p">)</span>

<span class="c1"># Expose it to CrewAI agents</span>
<span class="n">crewai_memory_tool</span> <span class="o">=</span> <span class="n">Tool</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"write_memory"</span><span class="p">,</span>
    <span class="n">func</span><span class="o">=</span><span class="k">lambda</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">memory_tool</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">),</span>
    <span class="n">description</span><span class="o">=</span><span class="s2">"Write findings to shared agent memory"</span>
<span class="p">)</span>

<span class="c1"># Now both frameworks can use the same memory store</span>
<span class="c1"># LangChain agent finds something</span>
<span class="n">langchain_memory_tool</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">"customer_insights"</span><span class="p">,</span> <span class="p">{</span>
    <span class="s2">"age_group"</span><span class="p">:</span> <span class="s2">"35-45"</span><span class="p">,</span>
    <span class="s2">"purchase_history"</span><span class="p">:</span> <span class="s2">"tech products"</span><span class="p">,</span>
    <span class="s2">"confidence"</span><span class="p">:</span> <span class="mf">0.92</span>
<span class="p">})</span>

<span class="c1"># CrewAI agent reads the same data</span>
<span class="n">crewai_data</span> <span class="o">=</span> <span class="n">memory_tool</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="s2">"customer_insights"</span><span class="p">)</span>
<span class="c1"># This works seamlessly across frameworks</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">hydradb</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydraDB</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">langchain.memory</span><span class="w"> </span><span class="kn">import</span> <span class="n">ConversationBufferMemory</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">langchain.tools</span><span class="w"> </span><span class="kn">import</span> <span class="n">Tool</span>

<span class="k">class</span><span class="w"> </span><span class="nc">SharedMemoryTool</span><span class="p">:</span>
<span class="w">    </span><span class="sd">"""Wraps HydraDB for use across any AI framework"""</span>

    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">,</span> <span class="n">context_store_name</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">db</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">store</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">get_context_store</span><span class="p">(</span><span class="n">context_store_name</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">write_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">visibility</span><span class="o">=</span><span class="s2">"global"</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Standard interface for writing shared memory"""</span>
        <span class="n">metadata</span> <span class="o">=</span> <span class="p">{</span>
            <span class="s2">"visibility"</span><span class="p">:</span> <span class="n">visibility</span><span class="p">,</span>
            <span class="s2">"written_at"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
        <span class="p">}</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">metadata</span><span class="o">=</span><span class="n">metadata</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">read_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Standard interface for reading shared memory"""</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">search_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pattern</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Find all memories matching a pattern"""</span>
        <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="n">pattern</span><span class="p">))</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">clear_expired</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">max_age_seconds</span><span class="o">=</span><span class="mi">3600</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Clean up old memories"""</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">cleanup</span><span class="p">(</span><span class="n">max_age</span><span class="o">=</span><span class="n">max_age_seconds</span><span class="p">)</span>

<span class="c1"># Create the tool</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">HydraDB</span><span class="p">()</span>
<span class="n">memory_tool</span> <span class="o">=</span> <span class="n">SharedMemoryTool</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="s2">"shared_agent_context"</span><span class="p">)</span>

<span class="c1"># Expose it to LangChain agents</span>
<span class="n">langchain_memory_tool</span> <span class="o">=</span> <span class="n">Tool</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"shared_memory"</span><span class="p">,</span>
    <span class="n">func</span><span class="o">=</span><span class="k">lambda</span> <span class="n">q</span><span class="p">:</span> <span class="n">memory_tool</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">q</span><span class="p">),</span>
    <span class="n">description</span><span class="o">=</span><span class="s2">"Read from shared agent memory"</span>
<span class="p">)</span>

<span class="c1"># Expose it to CrewAI agents</span>
<span class="n">crewai_memory_tool</span> <span class="o">=</span> <span class="n">Tool</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"write_memory"</span><span class="p">,</span>
    <span class="n">func</span><span class="o">=</span><span class="k">lambda</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">memory_tool</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">),</span>
    <span class="n">description</span><span class="o">=</span><span class="s2">"Write findings to shared agent memory"</span>
<span class="p">)</span>

<span class="c1"># Now both frameworks can use the same memory store</span>
<span class="c1"># LangChain agent finds something</span>
<span class="n">langchain_memory_tool</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">"customer_insights"</span><span class="p">,</span> <span class="p">{</span>
    <span class="s2">"age_group"</span><span class="p">:</span> <span class="s2">"35-45"</span><span class="p">,</span>
    <span class="s2">"purchase_history"</span><span class="p">:</span> <span class="s2">"tech products"</span><span class="p">,</span>
    <span class="s2">"confidence"</span><span class="p">:</span> <span class="mf">0.92</span>
<span class="p">})</span>

<span class="c1"># CrewAI agent reads the same data</span>
<span class="n">crewai_data</span> <span class="o">=</span> <span class="n">memory_tool</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="s2">"customer_insights"</span><span class="p">)</span>
<span class="c1"># This works seamlessly across frameworks</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">hydradb</span><span class="w"> </span><span class="kn">import</span> <span class="n">HydraDB</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">langchain.memory</span><span class="w"> </span><span class="kn">import</span> <span class="n">ConversationBufferMemory</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">langchain.tools</span><span class="w"> </span><span class="kn">import</span> <span class="n">Tool</span>

<span class="k">class</span><span class="w"> </span><span class="nc">SharedMemoryTool</span><span class="p">:</span>
<span class="w">    </span><span class="sd">"""Wraps HydraDB for use across any AI framework"""</span>

    <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">db</span><span class="p">,</span> <span class="n">context_store_name</span><span class="p">):</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">db</span> <span class="o">=</span> <span class="n">db</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">store</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">get_context_store</span><span class="p">(</span><span class="n">context_store_name</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">write_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="nb">dict</span><span class="p">,</span> <span class="n">visibility</span><span class="o">=</span><span class="s2">"global"</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Standard interface for writing shared memory"""</span>
        <span class="n">metadata</span> <span class="o">=</span> <span class="p">{</span>
            <span class="s2">"visibility"</span><span class="p">:</span> <span class="n">visibility</span><span class="p">,</span>
            <span class="s2">"written_at"</span><span class="p">:</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span><span class="o">.</span><span class="n">isoformat</span><span class="p">()</span>
        <span class="p">}</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">metadata</span><span class="o">=</span><span class="n">metadata</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">read_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Standard interface for reading shared memory"""</span>
        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">search_memory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pattern</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Find all memories matching a pattern"""</span>
        <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">scan_prefix</span><span class="p">(</span><span class="n">pattern</span><span class="p">))</span>

    <span class="k">def</span><span class="w"> </span><span class="nf">clear_expired</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">max_age_seconds</span><span class="o">=</span><span class="mi">3600</span><span class="p">):</span>
<span class="w">        </span><span class="sd">"""Clean up old memories"""</span>
        <span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="o">.</span><span class="n">cleanup</span><span class="p">(</span><span class="n">max_age</span><span class="o">=</span><span class="n">max_age_seconds</span><span class="p">)</span>

<span class="c1"># Create the tool</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">HydraDB</span><span class="p">()</span>
<span class="n">memory_tool</span> <span class="o">=</span> <span class="n">SharedMemoryTool</span><span class="p">(</span><span class="n">db</span><span class="p">,</span> <span class="s2">"shared_agent_context"</span><span class="p">)</span>

<span class="c1"># Expose it to LangChain agents</span>
<span class="n">langchain_memory_tool</span> <span class="o">=</span> <span class="n">Tool</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"shared_memory"</span><span class="p">,</span>
    <span class="n">func</span><span class="o">=</span><span class="k">lambda</span> <span class="n">q</span><span class="p">:</span> <span class="n">memory_tool</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="n">q</span><span class="p">),</span>
    <span class="n">description</span><span class="o">=</span><span class="s2">"Read from shared agent memory"</span>
<span class="p">)</span>

<span class="c1"># Expose it to CrewAI agents</span>
<span class="n">crewai_memory_tool</span> <span class="o">=</span> <span class="n">Tool</span><span class="p">(</span>
    <span class="n">name</span><span class="o">=</span><span class="s2">"write_memory"</span><span class="p">,</span>
    <span class="n">func</span><span class="o">=</span><span class="k">lambda</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">:</span> <span class="n">memory_tool</span><span class="o">.</span><span class="n">write_memory</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">),</span>
    <span class="n">description</span><span class="o">=</span><span class="s2">"Write findings to shared agent memory"</span>
<span class="p">)</span>

<span class="c1"># Now both frameworks can use the same memory store</span>
<span class="c1"># LangChain agent finds something</span>
<span class="n">langchain_memory_tool</span><span class="o">.</span><span class="n">func</span><span class="p">(</span><span class="s2">"customer_insights"</span><span class="p">,</span> <span class="p">{</span>
    <span class="s2">"age_group"</span><span class="p">:</span> <span class="s2">"35-45"</span><span class="p">,</span>
    <span class="s2">"purchase_history"</span><span class="p">:</span> <span class="s2">"tech products"</span><span class="p">,</span>
    <span class="s2">"confidence"</span><span class="p">:</span> <span class="mf">0.92</span>
<span class="p">})</span>

<span class="c1"># CrewAI agent reads the same data</span>
<span class="n">crewai_data</span> <span class="o">=</span> <span class="n">memory_tool</span><span class="o">.</span><span class="n">read_memory</span><span class="p">(</span><span class="s2">"customer_insights"</span><span class="p">)</span>
<span class="c1"># This works seamlessly across frameworks</span>

Handling memory conflicts: when agents disagree

Here's where it gets real. What happens when two agents write conflicting facts?

Agent A: "Customer is premium tier" Agent B: "Customer is standard tier"

Both are based on data they've read. Both are confident. But they can't both be true.

Frequently asked questions

How does shared memory affect latency?

With in-memory platforms like HydraDB, the impact is minimal. HydraDB processes all queries directly from RAM, so reads and writes complete in microseconds without disk I/O or network round-trips. The real latency savings come from eliminating duplicate work: instead of three agents hitting your database, one agent queries once and two others read from shared memory.

Can agents from different frameworks share memory?

Absolutely. HydraDB provides a framework-agnostic API, meaning LangChain agents, CrewAI agents, AutoGen agents, or custom agents can all write to and read from the same context store. You build the bridge layer once (like the SharedMemoryTool example above), and suddenly all your agents can coordinate regardless of what library powers them, allowing production teams to scale beyond single-framework constraints.

Implementing multi-agent memory coordination: next steps

You now understand the architecture and have seen the code patterns. Here's what to do:

  1. Start with a single shared store. Create one HydraDB context store and have your two or three agents write to it. Don't overthink scoping or conflict resolution yet.

  2. Add monitoring. Log every write and read to see if agents are using shared memory effectively or still duplicating work.

  3. Implement conflict detection. Use a simple strategy first: confidence-based or recency-based. You'll learn which makes sense for your use case.

  4. Scale the scoping. Once you have three or more agents, introduce the global/group/private hierarchy. This reduces noise and makes queries faster.

Visit HydraDB's documentation on multi-agent coordination with LangChain integration to see a complete end-to-end example. If you're starting from scratch, read about why your AI agent needs a memory layer first to understand the problem before the solution.

The multi-agent era is here. The question isn't whether you'll build multi-agent systems—it's whether your agents will actually remember what they've learned.

Questions about building multi-agent systems? Join the HydraDB community or contact us to discuss your architecture.