Skip to main content
Memory troubleshooting helps resolve common errors when configuring memory providers and debugging memory-related issues in PraisonAI agents.
The user enables memory and hits a provider error; this guide maps common failures to fixes.

Quick Start

1

Default (No Extras) — Works Out of the Box

2

Switch to Real Provider — Install Extras First


Why am I seeing ImportError: mem0ai is not installed...?

This error occurs when you explicitly request a memory provider that requires optional dependencies. The new behavior ensures you get clear feedback instead of silent fallbacks.

The Problem

The Solution

Install the required extras package:

Explicit vs Default Behavior


Why am I seeing ValueError: Mem0 API Key not provided?

This occurs when the mem0ai package is installed but the API key is missing.

Set the API Key


Why am I seeing TypeError: MemoryConfig.db must be a DbAdapter instance?

This error fires at agent construction when memory={"db": ...} (or MemoryConfig(db=...)) receives something that isn’t a real database adapter — most commonly a bare file-path string.

The Problem

Earlier releases accepted the string, warned on each hook call ('str' object has no attribute 'on_agent_start'), and silently dropped every message — memory looked enabled while no turns were ever stored. Fix landed in PR #5679 (fixes #5668).

Behavior change at a glance

The Fix

Pick one of the two supported shapes depending on how you want to point to a SQLite file (or any backing store):
Use the db factory for URL-based stores. Works for sqlite, postgresql, and more.

Interaction flow

Why the hook check, not just a type check?

The memory bridge drives db through three hooks: on_agent_start, on_user_message, on_agent_message. A valid db is either a DbAdapter or a db(...) backend instance — both expose these hooks. The guard requires the hooks themselves (callable), not a weaker signal like database_url that a half-built object could expose while still dropping every message. See also Database Persistence and Session Persistence for custom DbAdapter implementations.

Why is memory="mem0" returning empty search results? (MongoDB vector store)

Search results come back empty because mem0’s MongoDB vector store has an upstream signature-mismatch bug. Symptom: Searches return [], and the logs contain Detected mem0 MongoDB vector store compatibility issue. (before this was surfaced, the adapter path returned empty results with no log at all). Cause: mem0’s MongoDB vector store raises TypeError: unexpected keyword argument 'vectors' on .search() (mem0ai/mem0#3185); PraisonAI catches that specific TypeError, logs a warning, and returns [] so the agent keeps running. PraisonAI does not fix the upstream bug — the fix lives in mem0. Both the memory-layer and the knowledge-layer mem0 search paths now delegate to the same safe_mem0_search helper in praisonaiagents.memory.adapters.factories, so this fallback behaviour is identical whether you configured mem0 via memory= or via knowledge=. Fix reference: PraisonAI PR #5204.

Fix: switch mem0’s vector store to Qdrant or Chroma

Alternative: use PraisonAI’s built-in MongoDB adapter

If you need MongoDB itself, use PraisonAI’s first-party MongoDB Memory adapter — it is a separate implementation, unrelated to mem0, and unaffected by this bug.
See also the Mem0 integration guide.
On releases before 2026-07-14, Knowledge(config=...) could silently degrade a configured mem0 or mongodb backend to SQLite because the adapter constructor rejected an internal verbose keyword (PR #2982). Check which adapter you actually got:
If it isn’t Mem0Adapter / MongoDBKnowledgeAdapter, upgrade to a release built after commit 69d7ecf. On the fixed release, an explicit provider that fails to construct emits a WARNING naming the provider and the reason:
See Knowledge Backends → Troubleshooting: silent SQLite fallback for the full walkthrough.

Memory silently returned empty context

On releases before PR #4213, Agent(memory=True) retrieved memory hits but only included them in the task prompt when the root logger was at DEBUG. Under normal WARNING/INFO logging the retrieved context was logged and then discarded, so nothing reached the LLM. Old workaround (no longer needed): enabling verbose=5 / DEBUG logging, or calling agent.memory.build_context_for_task(..., include_in_output=True) by hand. Now: retrieval reaches the prompt by default — build_context_for_task() defaults include_in_output=True, and agent.memory.get_context(query=...) returns the prompt-ready string for the non-prompt-caching path.
An empty or whitespace-only query to get_context() returns "" on purpose — this avoids a LIKE "%%" scan that would leak unrelated (and possibly other users’) records into the prompt.

My second Agent instance doesn’t recall what the first one said (auto_memory + prefetch + user_id)

A new Agent with the same user_id and prefetch=True answers as if a fact stored by an earlier instance was never saved — no errors, no warnings. Symptom: Agent A stores a fact via auto_memory=True and a shared user_id; a new Agent B with the same user_id and prefetch=True answers as if the fact were never stored. Cause: Fixed by PR #5688. On earlier releases, auto-memory wrote only to short-term memory with no user_id in record metadata, and turn-start prefetch queries long-term with a metadata.user_id post-filter — so every persisted row was silently dropped on recall. Fix: upgrade to a build containing PR #5688 (merged into main 2026-10-07, head 9f1c205f). On the fix, auto_memory=True persists each turn to long-term memory stamped with the configured user_id / session_id, so the prefetch scope filter matches. Verify recall works end to end:
Isolation holds: a different user_id does not recall another user’s turn. See Memory Prefetch → Automatic cross-instance recall and Memory → Always set user_id.

My AutoMemory preview blocked a later store (store=False then store=True wrote nothing)

A process_interaction(..., store=False) preview marked the interaction as processed, so a follow-up store=True for the same text returned [] and persisted nothing. Symptom: auto.process_interaction(text, store=False) returns extracted memories; a follow-up auto.process_interaction(text, store=True) returns [] and nothing is persisted in FileMemory. Cause: Fixed by PR #5689. On earlier releases, process_interaction recorded the interaction hash before calling _store_memories, so a store=False preview marked the text as already processed and blocked the real store. The same bug left the hash consumed after a failed store, preventing retry once the backend recovered. Fix: upgrade to a build containing PR #5689 (merged into main 2026-10-08, head 1cebaa0e). On the fix, a preview never consumes dedup and the hash is recorded only after a successful write. Verify the preview no longer blocks a real store:
Related symptom: a retry after a transient backend outage stores nothing. Same root cause, same fix — see Previews and retry semantics.

Why did my metadata dict come back as a string? (or: my None values disappeared)

The chroma / rag (default) memory backend only accepts primitive metadata values, so non-primitives are coerced to str(...) and None values are dropped. Cause: ChromaDB rejects non-primitive metadata (str, int, float, bool only). PraisonAI coerces dict / list / other types to str(...), and drops None values, so the ChromaDB write never fails. Fix (if you need round-trippable structured metadata): serialise it yourself with json.dumps(...) into a str field, or switch to a metadata-native backend like mongodb, mem0, or dakera.
See Metadata types (ChromaDB / RAG backend) for the full coercion table.

Common Error Scenarios

User Interaction Flow

Step-by-Step Resolution

  1. User runs Agent(memory="mem0") without extras
  2. PraisonAI raises ImportError: mem0ai is not installed. Run: pip install 'praisonaiagents[memory]'
  3. User runs the suggested install command
  4. User re-runs the agent code — either works or shows next error (missing API key)
  5. User sets MEM0_API_KEY environment variable
  6. Agent works successfully

Dakera adapter not loading

Symptom: ImportError when using memory="dakera" or memory={"provider": "dakera", ...}.Install the extra:
Or equivalently:
The exact error message when the package is missing:
Explicit provider now raises immediately: Using provider="dakera" raises this ImportError with the install hint instead of silently falling back to SQLite.If the server is unreachable: Ensure Dakera is running at the configured URL (default http://localhost:3000). See dakera-ai/dakera-deploy for Docker Compose setup.

SQLite memory: errors after upgrade

ValueError: Invalid table name

Symptom: ValueError: Invalid table name: … Allowed tables: long_term, short_termCause: Custom code called an internal SQLite helper with a table name other than short_term or long_term.Fix: Use the public API — search_short_term() and search_long_term() — instead of private _search_sqlite* methods.

AttributeError: missing connection helper

Symptom: AttributeError: … has no attribute '_get_stm_conn' (or _get_ltm_conn')Cause: Previously this returned an empty list silently; it now surfaces. The memory object lacks the SQLite connection mixin.Fix: Use Memory(provider="sqlite", …) rather than instantiating mixins directly. Subclasses must implement _get_stm_conn and _get_ltm_conn.

Dakera Adapter Not Loading

Symptom: Running with provider="dakera" raises:
Fix: Install the Dakera extra:
This error surfaces because explicit provider="dakera" now raises a helpful hint instead of silently falling back to SQLite (fix landed in PR #2591 follow-up commit bbddfe3e).

My other agent’s memory disappeared when I called reset_long_term()

Older builds reset long-term memory by wiping every collection in the shared Chroma persistent directory, so calling reset_long_term() on one agent also erased sibling agents that shared the same path. reset_long_term() now deletes only this instance’s own collection and re-initializes it — other agents sharing the same rag_db_path keep their data. A failed reset also raises now instead of silently reporting success. Give each agent a distinct collection_name when they share a persistent path so resets stay isolated:
See Memory Configuration → Chroma Collection Name.

Best Practices

Begin with memory=True for prototyping, then switch to memory="mem0" for production when you need advanced features.
Add "praisonaiagents[memory]" to your requirements.txt or pyproject.toml to ensure consistent environments.
Use MEM0_API_KEY environment variables rather than hardcoding API keys in your source code.
The default file-based memory works great for development and doesn’t require any external dependencies or API keys.

Memory Concepts

Understanding different types of memory and storage options

Advanced Memory

Multi-tiered memory with quality scoring and graph support

Dakera Memory

Self-hosted, decay-weighted vector recall via the Dakera server.

Memory Consolidation

Merge, promote, and prune memories under a loss-bounded guard.