mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-05-17 03:56:18 +00:00
## 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
357 lines
9.1 KiB
Markdown
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
|