supermemory/packages/agent-framework-python/README.md
Dhravya 984297b62d
Add Supermemory integration for Microsoft Agent Framework (#775)
## Summary

This PR introduces comprehensive Supermemory integration for the Microsoft Agent Framework, providing three complementary approaches to add persistent memory capabilities to agents: middleware for automatic memory injection, context providers for session-based memory management, and tools for explicit memory operations.

## Key Changes

- **SupermemoryChatMiddleware**: Automatic memory injection middleware that fetches relevant memories from Supermemory before LLM calls and optionally saves conversations. Supports three modes:
  - `"profile"`: Injects all static and dynamic profile memories
  - `"query"`: Searches for memories relevant to the current user message
  - `"full"`: Combines both profile and query modes

- **SupermemoryContextProvider**: Idiomatic context provider following the Agent Framework pattern (similar to built-in Mem0 integration). Integrates with the session pipeline via `before_run()` and `after_run()` hooks for automatic memory retrieval and storage.

- **SupermemoryTools**: FunctionTool-compatible tools that agents can use for explicit memory operations:
  - `search_memories()`: Search for specific memories
  - `add_memory()`: Add new memories
  - `get_profile()`: Retrieve user profile

- **Utility Functions**: Helper functions for:
  - Memory deduplication across static, dynamic, and search result sources
  - Profile-to-markdown conversion for LLM consumption
  - Message extraction and conversation formatting
  - Logging with configurable verbosity

- **Exception Hierarchy**: Custom exceptions for better error handling:
  - `SupermemoryConfigurationError`: Missing/invalid configuration
  - `SupermemoryAPIError`: API request failures
  - `SupermemoryNetworkError`: Network connectivity issues
  - `SupermemoryMemoryOperationError`: Memory operation failures

- **Comprehensive Documentation**: README with quick start examples, configuration options, and API reference for all three integration approaches.

- **Test Suite**: Unit tests covering middleware, context provider, tools, and utility functions with proper mocking and error scenarios.

## Implementation Details

- Supports both async (aiohttp) and sync (requests) HTTP clients with automatic fallback
- Handles multiple message formats (dict, objects with attributes, content arrays)
- Configurable memory storage with optional conversation grouping via `conversation_id`
- Environment variable fallback for API key configuration (`SUPERMEMORY_API_KEY`)
- Background task management for non-blocking memory operations in middleware
- Proper async/sync compatibility for the Supermemory SDK

https://claude.ai/code/session_012idB5y6UGK3zmeFULgTc4z
2026-03-10 01:49:45 +00:00

357 lines
9.1 KiB
Markdown

# Supermemory Microsoft Agent Framework SDK
Memory tools and middleware for [Microsoft Agent Framework](https://github.com/microsoft/agent-framework) with [Supermemory](https://supermemory.ai) integration.
This package provides both **automatic memory injection middleware** and **manual memory tools** for the Microsoft Agent Framework.
## Installation
Install using uv (recommended):
```bash
uv add --prerelease=allow supermemory-agent-framework
```
Or with pip:
```bash
pip install --pre supermemory-agent-framework
```
> **Note:** The `--prerelease=allow` / `--pre` flag is required because `agent-framework-core` depends on pre-release versions of Azure packages.
For async HTTP support (recommended):
```bash
uv add supermemory-agent-framework[async]
# or
pip install supermemory-agent-framework[async]
```
## Quick Start
### Automatic Memory Injection (Recommended)
The easiest way to add memory capabilities is using the `SupermemoryChatMiddleware`:
```python
import asyncio
from agent_framework.openai import OpenAIResponsesClient
from supermemory_agent_framework import (
SupermemoryChatMiddleware,
SupermemoryMiddlewareOptions,
)
async def main():
# Create Supermemory middleware
middleware = SupermemoryChatMiddleware(
container_tag="user-123",
options=SupermemoryMiddlewareOptions(
mode="full", # "profile", "query", or "full"
verbose=True, # Enable logging
add_memory="always" # Automatically save conversations
),
)
# Create agent with middleware
agent = OpenAIResponsesClient().as_agent(
name="MemoryAgent",
instructions="You are a helpful assistant with memory.",
middleware=[middleware],
)
# Use normally - memories are automatically injected!
response = await agent.run(
"What's my favorite programming language?"
)
print(response.text)
asyncio.run(main())
```
### Context Provider (Recommended for Sessions)
The most idiomatic way to add memory in Agent Framework, using the same pattern as the built-in Mem0 integration:
```python
import asyncio
from agent_framework import AgentSession
from agent_framework.openai import OpenAIResponsesClient
from supermemory_agent_framework import SupermemoryContextProvider
async def main():
# Create context provider
provider = SupermemoryContextProvider(
container_tag="user-123",
api_key="your-supermemory-api-key",
mode="full",
store_conversations=True,
)
# Create agent with context provider
agent = OpenAIResponsesClient().as_agent(
name="MemoryAgent",
instructions="You are a helpful assistant with memory.",
context_providers=[provider],
)
# Use with a session - memories are automatically fetched and injected
session = AgentSession()
response = await agent.run(
"What's my favorite programming language?",
session=session,
)
print(response.text)
asyncio.run(main())
```
### Using Memory Tools
For explicit tool-based memory access:
```python
import asyncio
from agent_framework.openai import OpenAIResponsesClient
from supermemory_agent_framework import SupermemoryTools
async def main():
# Create memory tools
tools = SupermemoryTools(
api_key="your-supermemory-api-key",
config={"project_id": "my-project"},
)
# Create agent
agent = OpenAIResponsesClient().as_agent(
name="MemoryAgent",
instructions="You are a helpful assistant with access to user memories.",
)
# Run with memory tools
response = await agent.run(
"Remember that I prefer tea over coffee",
tools=tools.get_tools(),
)
print(response.text)
asyncio.run(main())
```
### Combining Middleware and Tools
For maximum flexibility, use both middleware (automatic context injection) and tools (explicit memory operations):
```python
import asyncio
from agent_framework.openai import OpenAIResponsesClient
from supermemory_agent_framework import (
SupermemoryChatMiddleware,
SupermemoryMiddlewareOptions,
SupermemoryTools,
)
async def main():
api_key = "your-supermemory-api-key"
middleware = SupermemoryChatMiddleware(
container_tag="user-123",
options=SupermemoryMiddlewareOptions(mode="full"),
api_key=api_key,
)
tools = SupermemoryTools(api_key=api_key)
agent = OpenAIResponsesClient().as_agent(
name="MemoryAgent",
instructions="You are a helpful assistant with memory.",
middleware=[middleware],
)
# Middleware injects context automatically,
# tools let the agent explicitly search/add memories
response = await agent.run(
"What do you remember about me?",
tools=tools.get_tools(),
)
print(response.text)
asyncio.run(main())
```
## Middleware Configuration
### Memory Modes
#### `"profile"` mode (default)
Injects all static and dynamic profile memories into every request.
```python
SupermemoryMiddlewareOptions(mode="profile")
```
#### `"query"` mode
Searches for memories relevant to the current user message.
```python
SupermemoryMiddlewareOptions(mode="query")
```
#### `"full"` mode
Combines both profile and query modes.
```python
SupermemoryMiddlewareOptions(mode="full")
```
### Memory Storage
```python
# Always save conversations as memories
SupermemoryMiddlewareOptions(add_memory="always")
# Never save conversations (default)
SupermemoryMiddlewareOptions(add_memory="never")
```
### Complete Configuration
```python
SupermemoryMiddlewareOptions(
conversation_id="chat-session-456", # Group messages into conversations
verbose=True, # Enable detailed logging
mode="full", # Use both profile and query
add_memory="always" # Auto-save conversations
)
```
## API Reference
### SupermemoryTools
Memory tools that integrate with Agent Framework's tool system.
```python
tools = SupermemoryTools(
api_key="your-api-key",
config={
"project_id": "my-project", # or use container_tags
"base_url": "https://custom.com", # optional
}
)
# Get FunctionTool instances for Agent.run()
agent_tools = tools.get_tools()
# Or use directly
result = await tools.search_memories("user preferences")
result = await tools.add_memory("User prefers dark mode")
result = await tools.get_profile()
```
### SupermemoryChatMiddleware
Chat middleware for automatic memory injection.
```python
middleware = SupermemoryChatMiddleware(
container_tag="user-123", # Memory scope identifier
options=SupermemoryMiddlewareOptions(...),
api_key="your-api-key", # Or set SUPERMEMORY_API_KEY env var
)
```
### with_supermemory_middleware()
Convenience function for creating middleware:
```python
middleware = with_supermemory_middleware(
"user-123",
SupermemoryMiddlewareOptions(mode="full"),
)
```
### SupermemoryContextProvider
Context provider for the Agent Framework session pipeline (like Mem0):
```python
provider = SupermemoryContextProvider(
container_tag="user-123",
api_key="your-api-key", # Or set SUPERMEMORY_API_KEY env var
mode="full", # "profile", "query", or "full"
store_conversations=True, # Save conversations after each run
conversation_id="chat-456", # Optional grouping ID
context_prompt="## Memories\n...", # Custom header for injected memories
verbose=True, # Enable logging
)
```
## Error Handling
```python
from supermemory_agent_framework import (
SupermemoryConfigurationError,
SupermemoryAPIError,
SupermemoryNetworkError,
SupermemoryMemoryOperationError,
)
try:
middleware = SupermemoryChatMiddleware("user-123")
except SupermemoryConfigurationError as e:
print(f"Configuration issue: {e}")
```
### Exception Types
- **`SupermemoryError`** - Base class for all Supermemory exceptions
- **`SupermemoryConfigurationError`** - Missing API keys, invalid configuration
- **`SupermemoryAPIError`** - API request failures (includes status codes)
- **`SupermemoryNetworkError`** - Network connectivity issues
- **`SupermemoryMemoryOperationError`** - Memory search/add operation failures
- **`SupermemoryTimeoutError`** - Operation timeouts
## Environment Variables
- `SUPERMEMORY_API_KEY` - Your Supermemory API key (required)
- `OPENAI_API_KEY` - Your OpenAI API key (required for OpenAI-based agents)
## Dependencies
### Required
- `agent-framework-core>=1.0.0rc3` - Microsoft Agent Framework
- `supermemory>=3.1.0` - Supermemory client
- `requests>=2.25.0` - HTTP requests (fallback)
### Optional
- `aiohttp>=3.8.0` - Async HTTP requests (recommended)
## Development
```bash
# Setup
cd packages/agent-framework-python
uv sync --dev
# Run tests
uv run pytest
# Type checking
uv run mypy src/supermemory_agent_framework
# Formatting
uv run black src/ tests/
uv run isort src/ tests/
```
## License
MIT License - see LICENSE file for details.
## Links
- [Supermemory](https://supermemory.ai) - Infinite context memory platform
- [Microsoft Agent Framework](https://github.com/microsoft/agent-framework) - AI agent framework
- [Documentation](https://docs.supermemory.ai) - Full API documentation