atulya-crewai
Persistent memory for AI agent crews via Atulya. Give your CrewAI crews long-term memory with fact extraction, entity tracking, and temporal awareness.
Features
- Drop-in Storage Backend - Implements CrewAI's
Storageinterface forExternalMemory - Automatic Memory Flow - CrewAI automatically stores task outputs and retrieves relevant memories
- Per-Agent Banks - Optionally give each agent its own isolated memory bank
- Reflect Tool - Agents can explicitly reason over memories with disposition-aware synthesis
- Simple Configuration - Configure once, use everywhere
Installation
pip install atulya-crewai
Quick Start
from atulya_crewai import configure, AtulyaStorage
from crewai.memory.external.external_memory import ExternalMemory
from crewai import Agent, Crew, Task
# Step 1: Configure connection
configure(atulya_api_url="http://localhost:8888")
# Step 2: Create crew with Atulya-backed memory
crew = Crew(
agents=[
Agent(role="Researcher", goal="Find information", backstory="..."),
Agent(role="Writer", goal="Write reports", backstory="..."),
],
tasks=[
Task(description="Research AI trends", expected_output="Report"),
],
external_memory=ExternalMemory(
storage=AtulyaStorage(bank_id="my-crew")
),
)
crew.kickoff()
That's it. CrewAI will automatically:
- Query memories at the start of each task
- Store task outputs to Atulya after each task completes
Memories persist across crew runs, so your crew learns over time.
Per-Agent Memory Banks
Give each agent its own isolated memory bank:
storage = AtulyaStorage(
bank_id="my-crew",
per_agent_banks=True, # Researcher -> "my-crew-researcher", Writer -> "my-crew-writer"
)
Or use a custom bank resolver for full control:
storage = AtulyaStorage(
bank_id="my-crew",
bank_resolver=lambda base, agent: f"{base}-{agent.lower()}" if agent else base,
)
Reflect Tool
CrewAI's storage interface only supports save/search/reset. To give agents access to Atulya's reflect (disposition-aware memory synthesis), add it as a tool:
from atulya_crewai import AtulyaReflectTool
reflect_tool = AtulyaReflectTool(
bank_id="my-crew",
budget="mid",
reflect_context="You are helping a software team track decisions.",
)
agent = Agent(
role="Analyst",
goal="Analyze project history",
backstory="...",
tools=[reflect_tool],
)
When the agent calls this tool, it gets a synthesized, contextual answer based on all relevant memories — not just raw facts.
Bank Missions
Set a mission to guide how Atulya processes and organizes memories:
storage = AtulyaStorage(
bank_id="my-crew",
mission="Track software architecture decisions, technical debt, and team preferences.",
)
Configuration
Global Configuration
from atulya_crewai import configure
configure(
atulya_api_url="http://localhost:8888", # Default: production API
api_key="your-api-key", # Or set ATULYA_API_KEY env var
budget="mid", # Recall budget: low/mid/high
max_tokens=4096, # Max tokens for recall results
tags=["env:prod"], # Tags for stored memories
recall_tags=["scope:global"], # Tags to filter recall
recall_tags_match="any", # Tag match mode: any/all/any_strict/all_strict
verbose=True, # Enable logging
)
Per-Storage Overrides
Constructor arguments override global configuration:
storage = AtulyaStorage(
bank_id="my-crew",
budget="high", # Override global budget
max_tokens=8192, # Override global max_tokens
tags=["team:alpha"], # Override global tags
)
Examples
See the CrewAI memory example in the Atulya Cookbook for a complete working demo with a Researcher + Writer crew.
Configuration Reference
| Parameter | Default | Description |
|---|---|---|
atulya_api_url |
Production API | Atulya API URL |
api_key |
ATULYA_API_KEY env |
API key for authentication |
budget |
"mid" |
Recall budget level (low/mid/high) |
max_tokens |
4096 |
Maximum tokens for recall results |
tags |
None |
Tags applied when storing memories |
recall_tags |
None |
Tags to filter when searching |
recall_tags_match |
"any" |
Tag matching mode |
per_agent_banks |
False |
Give each agent its own bank |
bank_resolver |
None |
Custom (bank_id, agent) -> bank_id function |
mission |
None |
Bank mission for memory organization |
verbose |
False |
Enable verbose logging |
Release files for atulya-crewai 0.8.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| atulya_crewai-0.8.7.tar.gz | 250.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| atulya_crewai-0.8.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 261.0 kB
Release files / atulya_crewai-0.8.7.tar.gz
| Download URL | atulya_crewai-0.8.7.tar.gz |
|---|---|
| Size | 250.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b8c5914b4870f4949c9a57c28799328c85f95c12cba58d981d9deac615b2d607
|
|
BLAKE2b-256 checksum How to use checksums |
93c8a7215d654b53cece2edcbbd97d2048efa492e778f23ddc9358c77e91c987
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Release files / atulya_crewai-0.8.7-py3-none-any.whl
| Download URL | atulya_crewai-0.8.7-py3-none-any.whl |
|---|---|
| Size | 11.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
29dac8afdf37e228e12b4e449b9d770df08827c5865065322e29294c0a7b61e8
|
|
BLAKE2b-256 checksum How to use checksums |
7545a24f333e5b58cb30f78ed06f5a11e8dfcdb98a572bf4c1bf6996078f630b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|