Setup
Give one or more agents Anona-backed memory tools. Each agent can then search past memories and save new ones as part of its own reasoning, the same way it would use any other tool.as_tools() returns two tools, named Anona: Search memory and Anona: Save memory. Give them to every agent that should share the crew’s memory.
Like any CrewAI tool, these are agent-discretionary: nothing calls them
automatically. The agent’s LLM decides whether and when to reach for a tool
based on its backstory/goal and the task at hand, the same way it decides
whether to use a web-search or file-read tool. Say so explicitly, as in the
backstory above, or the model may never call Anona: Search memory even
though it’s sitting right there in its tool list.
The Anona: prefix is deliberate: if the same agent also has CrewAI’s own
memory enabled (Crew(memory=True) or an agent-level memory=True), CrewAI
auto-attaches its own memory tools too, named Search memory and Save to memory. CrewAI dedups tools by name and silently keeps whichever set was
attached last, so an unprefixed name here could lose to, or quietly
shadow, CrewAI’s own tool with no error and nothing in any log. The prefix
means Anona’s tools and CrewAI’s can coexist on the same agent without either
one going missing.
Why tools, not Crew(memory=...)
CrewAI’s built-in memory (Crew(memory=True) or Memory(storage=...)) does
its own embedding and LLM-driven analysis of everything it stores and
recalls, and hands a pluggable storage backend only a raw vector on
search, never the query text. That can’t be bridged to Anona’s managed,
text-based retrieval without running a local embedding model, which is
exactly the vector database this integration exists to remove. CrewAI’s
memory tools sidestep all of that: an agent calls them with plain text and
gets plain text back, and Anona does the actual search and ranking
server-side.
It also means adopting Anona adds no second LLM requirement on top of
whatever model your agents already use. CrewAI’s built-in memory needs its
own LLM and embedder for content analysis regardless of storage backend;
Anona-backed tools don’t.
Scoping
Passuser_id, agent_id or session_id to the bridge to isolate memory
inside a space, so one crew deployment can serve many end customers without
their memories mixing.
AnonaStorage directly
AnonaStorage(bridge=bridge) also exposes plain save(value) /
search(query) / reset() methods (what as_tools() is built from), if
you want to call Anona from your own code rather than through the generated
tools. reset() is a deliberate no-op that logs a warning: Anona has no
all-or-nothing delete endpoint, and a partial wipe (list-then-delete, with no
transaction) is worse than none. Clear a space from the Anona dashboard
instead.
Failure behaviour
If Anona is unreachable, the search tool reports no memories found and the crew keeps running. The save tool still returns"Saved to memory.", even when the write
failed. The bridge behind every adapter never raises, so there’s no failure
for the tool to report. Read "Saved to memory." as “handed off,” not as
confirmation the memory is durably stored.