--- 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 ```bash Python pip install supermemory ``` ```bash TypeScript npm install supermemory ``` ```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" }); ``` ## API Mapping ### Session Management ```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"] ``` ### Adding Memories ```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"] }) ``` ### Searching ```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 }) ``` ### Getting All Memories ```python Zep AI memories = client.memory.get(session_id="user_123") ``` ```python Supermemory documents = client.documents.list({ "containerTag": ["user_123"], "limit": 100 }) ``` ## 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 ```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 }) ``` ## 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: ```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!") ``` ### 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)