# Fix "ModuleNotFoundError: No module named 'agno.memory.v2'" (Agno v1 v2+ memory migration)

> Source: <https://dev.to/memorysync_rafay/fix-modulenotfounderror-no-module-named-agnomemoryv2-agno-v1-v2-memory-migration-onl>
> Published: 2026-10-25 16:40:14+00:00

*Disclosure: I'm Mohammed, founder of MemorySync. I drafted this with AI assistance and checked it against Agno's official migration guide and a real install. Code status: on Oct 25, 2026 I installed agno 3.1.10 (Python 3.13) and reproduced the errors below. I then ran the "after" imports, the Agent construction and `get_user_memories` successfully. No model was called (no key), so memory creation itself was not run.*

You upgrade Agno and memory code that used to work fails on import:

```
ModuleNotFoundError: No module named 'agno.memory.v2'
```

or, in VS Code / Pylance:

```
Import "agno.memory.v2.memory" could not be resolved
```

often with a companion:

```
ModuleNotFoundError: No module named 'agno.storage'
```

This was reported in [agno-agi/agno#5017](https://github.com/agno-agi/agno/issues/5017) (Agno 2.1.4, Python 3.11). The maintainers' answer was to follow the memory section of the v2 migration guide. I reproduced all three errors on Agno 3.1.10:

``` python
$ python -c "from agno.memory.v2.memory import Memory"
ModuleNotFoundError: No module named 'agno.memory.v2'
$ python -c "from agno.storage.sqlite import SqliteStorage"
ModuleNotFoundError: No module named 'agno.storage'
```

Agno v2 removed the v1 memory and storage modules rather than aliasing them. Per the [v2 migration guide](https://docs.agno.com/other/v2-migration):

`Storage` classes moved from `agno/storage` to `agno/db` and are now called `Db` classes. One instance serves agents, teams and workflows, and the `mode` and `table_name` parameters are gone.`MemoryDb` classes are deprecated in favour of the main `Memory` class is deprecated. You set `update_memory_on_run=True` on an Agent that has a `db`.
**v1 (breaks):**

``` python
from agno.agent import Agent
from agno.memory.v2.db.sqlite import SqliteMemoryDb
from agno.memory.v2.memory import Memory
from agno.storage.sqlite import SqliteStorage

memory = Memory(db=SqliteMemoryDb(table_name="user_memories", db_file="agno.db"))
storage = SqliteStorage(table_name="agent_sessions", db_file="agno.db")
agent = Agent(memory=memory, storage=storage, enable_user_memories=True)
```

**v2+ (ran on 3.1.10):**

``` python
from agno.agent import Agent
from agno.db.sqlite import SqliteDb

db = SqliteDb(db_file="agno.db")          # sessions AND memories
agent = Agent(db=db, update_memory_on_run=True)

print(agent.get_user_memories(user_id="john@example.com"))  # [] until a run stores something
```

Things to check after the swap:

`user_id` on every run.`SqliteDb` takes `session_table=` and `memory_table=` instead of `table_name=`.` MemoryManager` (`from agno.memory import MemoryManager`) and pass `memory_manager=` to the Agent. The parameter names I found on the current `Agent` are `memory_manager`, `enable_agentic_memory`, `update_memory_on_run` and `add_memories_to_context`.` TypeError: UserMemory.__init__() got an unexpected keyword argument 'summaries'`.
If you get `ImportError: The SQLAlchemy asyncio module requires that the Python 'greenlet' library is installed` when importing `agno.db.sqlite`, run `pip install greenlet`. I hit this on a clean Python 3.13 venv.

`update_memory_on_run` writes to whatever `Db` you pass. If you want sessions to stay local but user memories to live in a hosted store shared across instances, MemorySync's `agno-memorysync` package backs Agno's `MemoryManager` ([guide](https://docs.memorysync.io/guides/agno?utm_source=devto&utm_medium=organic_page&utm_campaign=v5_oct25&utm_content=pseo_agno-memory-v2-module-not-found)). The guide says it needs agno 2.8+, and this constructed fine on 3.1.10:

``` python
from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.memory import MemoryManager
from agno_memorysync import MemorySyncDb   # pip install agno-memorysync; needs MEMORYSYNC_API_KEY

agent = Agent(
    db=SqliteDb(db_file="agent.db"),                  # sessions: local
    memory_manager=MemoryManager(db=MemorySyncDb()),  # memories: hosted
    update_memory_on_run=True,
    user_id="customer-42",
)
```

The guide notes that `MemorySyncDb` is memory-only on purpose. Pointing sessions at it raises `MemorySyncMemoryOnlyError`, so keep `db=` local.

**Is there a compatibility shim for `agno.memory.v2`?** Not in 3.1.10. The import fails. Update the imports.

**Do I still need a separate storage object?** No. One `Db` instance handles sessions, memories, metrics, evals and knowledge in separate tables.

**My memories are stored but never show up in replies.** If you pass a verbatim `system_message=`, it replaces Agno's built system prompt, which is where memories are injected. Use `instructions=` instead. (This tip is from MemorySync's Agno guide and applies to any memory db.)

**Which Agno version is current?** PyPI served 3.1.10 on Oct 25, 2026. The v2 migration steps above still applied to it.

To see a stored fact survive a reload before wiring anything in: **[try MemorySync in your browser](https://memorysync.io/try?utm_source=devto&utm_medium=organic_page&utm_campaign=v5_oct25&utm_content=pseo_agno-memory-v2-module-not-found)**. No signup is needed.

`summaries` TypeError):
