mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-05-17 12:20:04 +00:00
Some checks failed
Publish AI SDK / publish (push) Has been cancelled
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
372 lines
8.7 KiB
Text
372 lines
8.7 KiB
Text
---
|
|
title: "Migrating from Zep to Supermemory"
|
|
description: "Quick guide to migrate from Zep to Supermemory"
|
|
sidebarTitle: "From Zep"
|
|
---
|
|
|
|
## Key Differences
|
|
|
|
| Zep AI | Supermemory |
|
|
|--------|-------------|
|
|
| Sessions & Messages | Documents & Container Tags |
|
|
| `session.create()` | Use `containerTags` parameter |
|
|
| `memory.add(session_id, ...)` | `add({containerTag: [...]})` |
|
|
| `memory.search(session_id, {text: ...})` | `search.execute({q: ..., containerTags: [...]})` |
|
|
|
|
## Installation
|
|
|
|
<CodeGroup>
|
|
|
|
```bash Python
|
|
pip install supermemory
|
|
```
|
|
|
|
```bash TypeScript
|
|
npm install supermemory
|
|
```
|
|
|
|
</CodeGroup>
|
|
|
|
<CodeGroup>
|
|
|
|
```python Python
|
|
from supermemory import Supermemory
|
|
client = Supermemory(api_key="your-api-key")
|
|
```
|
|
|
|
```typescript TypeScript
|
|
import { Supermemory } from "supermemory";
|
|
const client = new Supermemory({ apiKey: "your-api-key" });
|
|
```
|
|
|
|
</CodeGroup>
|
|
|
|
## API Mapping
|
|
|
|
### Session Management
|
|
|
|
<CodeGroup>
|
|
|
|
```python Zep AI
|
|
session = client.session.create(
|
|
session_id="user_123",
|
|
user_id="user_123"
|
|
)
|
|
```
|
|
|
|
```python Supermemory
|
|
# No explicit session creation - use containerTag
|
|
containerTag = ["user_123"]
|
|
```
|
|
|
|
</CodeGroup>
|
|
|
|
### Adding Memories
|
|
|
|
<CodeGroup>
|
|
|
|
```python Zep AI
|
|
client.memory.add(
|
|
session_id="user_123",
|
|
memory={"content": "User prefers dark mode"}
|
|
)
|
|
```
|
|
|
|
```python Supermemory
|
|
client.add({
|
|
"content": "User prefers dark mode",
|
|
"containerTag": ["user_123"]
|
|
})
|
|
```
|
|
|
|
</CodeGroup>
|
|
|
|
### Searching
|
|
|
|
<CodeGroup>
|
|
|
|
```python Zep AI
|
|
results = client.memory.search(
|
|
session_id="user_123",
|
|
search_payload={"text": "preferences", "limit": 5}
|
|
)
|
|
```
|
|
|
|
```python Supermemory
|
|
results = client.search.execute({
|
|
"q": "preferences",
|
|
"containerTag": ["user_123"],
|
|
"limit": 5
|
|
})
|
|
```
|
|
|
|
</CodeGroup>
|
|
|
|
### Getting All Memories
|
|
|
|
<CodeGroup>
|
|
|
|
```python Zep AI
|
|
memories = client.memory.get(session_id="user_123")
|
|
```
|
|
|
|
```python Supermemory
|
|
documents = client.documents.list({
|
|
"containerTag": ["user_123"],
|
|
"limit": 100
|
|
})
|
|
```
|
|
|
|
</CodeGroup>
|
|
|
|
## Migration Steps
|
|
|
|
1. **Replace client initialization** - Use Supermemory client instead of Zep
|
|
2. **Map sessions to container tags** - Replace `session_id="user_123"` with `containerTag: ["user_123"]`
|
|
3. **Update method calls** - Use `add()` and `search.execute()` instead of `memory.add()` and `memory.search()`
|
|
4. **Change search parameter** - Use `q` instead of `text`
|
|
5. **Handle async processing** - Documents process asynchronously (status: `queued` → `done`)
|
|
|
|
## Complete Example
|
|
|
|
<CodeGroup>
|
|
|
|
```python Zep AI
|
|
from zep_python import ZepClient
|
|
|
|
client = ZepClient(api_key="...")
|
|
session = client.session.create(session_id="user_123", user_id="user_123")
|
|
|
|
client.memory.add("user_123", {
|
|
"content": "I love Python",
|
|
"role": "user"
|
|
})
|
|
|
|
results = client.memory.search("user_123", {
|
|
"text": "programming",
|
|
"limit": 3
|
|
})
|
|
```
|
|
|
|
```python Supermemory
|
|
from supermemory import Supermemory
|
|
|
|
client = Supermemory(api_key="...")
|
|
containerTag = ["user_123"]
|
|
|
|
client.add({
|
|
"content": "I love Python",
|
|
"containerTag": containerTag,
|
|
"metadata": {"role": "user"}
|
|
})
|
|
|
|
results = client.search.execute({
|
|
"q": "programming",
|
|
"containerTag": containerTag,
|
|
"limit": 3
|
|
})
|
|
```
|
|
|
|
</CodeGroup>
|
|
|
|
## Important Notes
|
|
|
|
- **No session creation needed** - Just use `containerTag` in requests
|
|
- **Messages are documents** - Store with `metadata.role` and `metadata.type`
|
|
- **Async processing** - Documents may take a moment to be searchable
|
|
- **Response structure** - Supermemory returns chunks with scores, not direct memory content
|
|
|
|
## Migrating Existing Data
|
|
|
|
### Quick Migration (All-in-One)
|
|
|
|
Complete migration in one script:
|
|
|
|
<CodeGroup>
|
|
|
|
```typescript TypeScript
|
|
import { ZepClient } from "@getzep/zep-js";
|
|
import { Supermemory } from "supermemory";
|
|
|
|
// Initialize clients
|
|
const zep = new ZepClient({ apiKey: "your_zep_api_key" });
|
|
const supermemory = new Supermemory({ apiKey: "your_supermemory_api_key" });
|
|
|
|
// Export from Zep and import to Supermemory
|
|
const sessionIds = ["session_1", "session_2"]; // Add your session IDs
|
|
|
|
for (const sessionId of sessionIds) {
|
|
const memory = await zep.memory.get(sessionId);
|
|
const memories = memory?.memories || [];
|
|
|
|
for (const mem of memories) {
|
|
if (mem.content) {
|
|
await supermemory.add({
|
|
content: mem.content,
|
|
containerTag: [`session_${sessionId}`, `user_${memory.user_id || "unknown"}`],
|
|
metadata: {
|
|
role: mem.role,
|
|
type: "message",
|
|
original_uuid: mem.uuid,
|
|
...mem.metadata
|
|
}
|
|
});
|
|
console.log(`✅ Imported: ${mem.content.substring(0, 50)}...`);
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log("Migration complete!");
|
|
```
|
|
|
|
```python Python
|
|
from zep_python import ZepClient
|
|
from supermemory import Supermemory
|
|
|
|
# Initialize clients
|
|
zep = ZepClient(api_key="your_zep_api_key")
|
|
supermemory = Supermemory(api_key="your_supermemory_api_key")
|
|
|
|
# Export from Zep and import to Supermemory
|
|
session_ids = ["session_1", "session_2"] # Add your session IDs
|
|
|
|
for session_id in session_ids:
|
|
memory = zep.memory.get(session_id)
|
|
memories = memory.memories if memory else []
|
|
|
|
for mem in memories:
|
|
if mem.content:
|
|
supermemory.add({
|
|
"content": mem.content,
|
|
"containerTag": [f"session_{session_id}", f"user_{memory.user_id or 'unknown'}"],
|
|
"metadata": {
|
|
"role": mem.role,
|
|
"type": "message",
|
|
"original_uuid": mem.uuid,
|
|
**(mem.metadata or {})
|
|
}
|
|
})
|
|
print(f"✅ Imported: {mem.content[:50]}...")
|
|
|
|
print("Migration complete!")
|
|
```
|
|
|
|
</CodeGroup>
|
|
|
|
### Full Migration Script
|
|
|
|
For a complete migration script with error handling, verification, and progress tracking, copy this TypeScript script:
|
|
|
|
```typescript
|
|
import { ZepClient } from "@getzep/zep-js";
|
|
import { Supermemory } from "supermemory";
|
|
import * as dotenv from "dotenv";
|
|
import * as fs from "fs";
|
|
|
|
dotenv.config();
|
|
|
|
interface MigrationStats {
|
|
imported: number;
|
|
failed: number;
|
|
skipped: number;
|
|
}
|
|
|
|
async function migrateFromZep(
|
|
zepApiKey: string,
|
|
supermemoryApiKey: string,
|
|
sessionIds: string[]
|
|
) {
|
|
const zep = new ZepClient({ apiKey: zepApiKey });
|
|
const supermemory = new Supermemory({ apiKey: supermemoryApiKey });
|
|
|
|
const stats: MigrationStats = { imported: 0, failed: 0, skipped: 0 };
|
|
const exportedData: any = {};
|
|
|
|
console.log("🔄 Starting migration...");
|
|
|
|
// Export from Zep
|
|
for (const sessionId of sessionIds) {
|
|
try {
|
|
const session = await zep.session.get(sessionId);
|
|
const memory = await zep.memory.get(sessionId);
|
|
const memories = memory?.memories || [];
|
|
|
|
exportedData[sessionId] = {
|
|
session: { session_id: sessionId, user_id: session?.user_id },
|
|
memories: memories.map((m: any) => ({
|
|
content: m.content,
|
|
role: m.role,
|
|
metadata: m.metadata,
|
|
uuid: m.uuid,
|
|
})),
|
|
};
|
|
|
|
console.log(`✅ Exported ${memories.length} memories from ${sessionId}`);
|
|
} catch (error: any) {
|
|
console.log(`❌ Error exporting ${sessionId}: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
// Save backup
|
|
const backupFile = `zep_export_${Date.now()}.json`;
|
|
fs.writeFileSync(backupFile, JSON.stringify(exportedData, null, 2));
|
|
console.log(`💾 Backup saved to: ${backupFile}`);
|
|
|
|
// Import to Supermemory
|
|
let totalMemories = 0;
|
|
for (const [sessionId, data] of Object.entries(exportedData) as any) {
|
|
const containerTag = ["imported_from_zep", `session_${sessionId}`];
|
|
if (data.session.user_id) {
|
|
containerTag.push(`user_${data.session.user_id}`);
|
|
}
|
|
|
|
for (const memory of data.memories) {
|
|
totalMemories++;
|
|
try {
|
|
if (!memory.content?.trim()) {
|
|
stats.skipped++;
|
|
continue;
|
|
}
|
|
|
|
await supermemory.add({
|
|
content: memory.content,
|
|
containerTag: containerTag,
|
|
metadata: {
|
|
source: "zep_migration",
|
|
role: memory.role,
|
|
type: "message",
|
|
original_uuid: memory.uuid,
|
|
...memory.metadata,
|
|
},
|
|
});
|
|
|
|
stats.imported++;
|
|
console.log(`✅ [${stats.imported}/${totalMemories}] Imported`);
|
|
} catch (error: any) {
|
|
stats.failed++;
|
|
console.log(`❌ Failed: ${error.message}`);
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log("\n📊 Migration Summary:");
|
|
console.log(`✅ Imported: ${stats.imported}`);
|
|
console.log(`⚠️ Skipped: ${stats.skipped}`);
|
|
console.log(`❌ Failed: ${stats.failed}`);
|
|
}
|
|
|
|
// Usage
|
|
const sessionIds = ["session_1", "session_2"]; // Add your session IDs
|
|
migrateFromZep(
|
|
process.env.ZEP_API_KEY!,
|
|
process.env.SUPERMEMORY_API_KEY!,
|
|
sessionIds
|
|
).catch(console.error);
|
|
```
|
|
|
|
|
|
## Resources
|
|
|
|
- [Supermemory SDKs](/integrations/supermemory-sdk)
|
|
- [API Reference](/memory-api/overview)
|
|
- [Search Documentation](/search)
|