Guides / Frameworks

CrewAI

For CrewAI developers whose crews work for people: travellers, customers, students. crewai-recall puts what Recall knows about the person into the task and gives agents tools to look things up and save what they learn.

What memory adds

Without memoryWith Recall
A request from a returning travellerThe crew asks again about diet, budget and flight times.The task starts with the traveller's peer card and the facts that relate to the request.
"I hate early flights," mentioned onceGone after the kickoff.Saved by an agent with recall_remember, or learned from the recorded request.
"What did we book in Porto last spring?"Nobody knows.recall_ask answers from earlier conversations.

Recall is memory, not the crew: CrewAI still plans, delegates and runs the tools.

How it maps onto Recall

In CrewAIIn RecallWhy
Your appWorkspace, from RECALL_WORKSPACE_IDMemory stays inside it.
The person the crew works forPeer user-8412Recall learns about this person; the tools read and write their memory.
The crewPeer travel-crew, not learned aboutIts answers are stored as context; facts are learned about the person.
A request and its answerSession, e.g. trip-lisbonWhat Recall learns from, in order.

Build it

Install the package with pip install crewai-recall and set RECALL_API_KEY (create one at app.recallmem.dev/keys), or RECALL_URL for a server of your own.

Agents with memory tools. recall_tools(user_id) gives an agent recall_search, recall_ask and recall_remember for one person. A {memory} placeholder in the task takes what Recall knows.

from crewai import Agent, Crew, Task
from crewai_recall import recall_context, recall_tools
from recall_memory import PeerConfig, Recall

recall = Recall(workspace_id="travel-crew")

# The crew works for one traveller per run: their id is the Recall peer. `llm` is your
# CrewAI LLM; None uses CrewAI's default.
traveller = "user-8412"
concierge = Agent(
    role="Travel concierge",
    goal="Plan trips the traveller will love",
    backstory="You remember what each traveller likes and never ask twice.",
    tools=recall_tools(traveller, client=recall),
    llm=llm,
)
plan = Task(
    description="{request}\n\nWhat you know about the traveller:\n{memory}",
    expected_output="A day-by-day plan",
    agent=concierge,
)
crew = Crew(agents=[concierge], tasks=[plan])

Each kickoff. recall_context reads the person's card and the facts that relate to the request, with no model call, and goes in with the inputs.

# Memory goes in with the inputs: the card and the facts that relate to this request.
request = "I'm vegetarian and I hate early flights. Plan a weekend in Lisbon."
memory = recall_context(traveller, query=request, client=recall)
result = crew.kickoff(inputs={"request": request, "memory": memory})

Record the conversation. Recall learns from conversations, so store the request and the crew's answer with the SDK:

# Recall learns from conversations: store the request and the crew's answer. The crew is a
# peer Recall does not learn about.
person = recall.peer(traveller)
crew_peer = recall.peer("travel-crew", configuration=PeerConfig(observe_me=False))
recall.session("trip-lisbon").add_messages(
    [person.message(request), crew_peer.message(str(result))]
)

CrewAI's own memory

CrewAI's Memory accepts a custom storage backend, but that interface is a vector store: CrewAI computes the embeddings and the backend stores and searches vectors. Recall learns from text and searches it itself, so it is offered as tools and task context instead. You can leave CrewAI's memory on for what agents learn while working; Recall keeps what matters about the people they work for, across crews and apps.

Settings that matter

SettingUse
recall_tools(user_id, ...)One set of tools per person. Build them per kickoff when one crew definition serves many people.
recall_context(query=...)The request, so the facts that matter for it come first. Without it you get the most frequent facts.
max_conclusionsMost facts in the context (20 by default).
k, reasoning_levelResults per search, and how hard recall_ask thinks: low by default. See Reasoning levels and models.

Cost and speed

recall_context is a context read with no model call: context reads took 0.3 to 0.7 seconds, measured from Europe against the hosted API (Frankfurt), October 2026, small next to a crew's own model calls. recall_search searches facts and messages without a model call, in about a second. recall_ask is one model call of 2 to 4.5 seconds at low. Learning from recorded conversations runs in the background.

Context, search and storage are included. Learning and questions are charged; see pricing and Cost and speed for worked examples.

Privacy and forgetting

The tools send queries, questions and the facts an agent saves to Recall; what you record is up to you. Record the person's request and the crew's answer, not tool output or intermediate steps. To forget someone:

# The traveller deletes their account: erase them, then the trips that hold the answers.
trips = list(person.sessions())
person.delete()
for trip in trips:
    trip.delete()

See Forget a person and Privacy, consent and forgetting.

Pitfalls

Next: Multi-agent systems · Designing workspaces, peers and sessions