CrewAI memory integration via Atulya - persistent memory for AI agent crews
Project description
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 |
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file atulya_crewai-0.8.1.tar.gz.
File metadata
- Download URL: atulya_crewai-0.8.1.tar.gz
- Upload date:
- Size: 250.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4aa068286e7f119d5d9ae3558f31c886c0d7ab47e573db0e2e13a60c3cc04482
|
|
| MD5 |
97290a2890067297806fb4c0e0e04acd
|
|
| BLAKE2b-256 |
7acc328e69d4ef59ebf79f0ee0e41ecb2b56df73383e545a37e724fff3d65dcf
|
File details
Details for the file atulya_crewai-0.8.1-py3-none-any.whl.
File metadata
- Download URL: atulya_crewai-0.8.1-py3-none-any.whl
- Upload date:
- Size: 3.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
30a144c6a10582cce1431be7c3ab4b08762e2d5379331edce42ee88b3f70241b
|
|
| MD5 |
27b657280922b2ff1ffe03a335c2a077
|
|
| BLAKE2b-256 |
6a4c71374cd983c3fdbb132ade9e17e810bdd5444af5ff7bc83b4c3ab751e25b
|