/**
* Demonstration of async embedding optimization
* Shows the performance difference between sync and async embedding generation
*/
import { MemoryCore } from '../src/core/memory-core.js';
import { DatabaseConnection } from '../src/database/index.js';
import { EmbeddingService } from '../src/utils/embeddings.js';
import { MemoryType } from '../src/types/enums.js';
async function demonstrateAsyncEmbedding() {
console.log('=== Async Embedding Optimization Demo ===\n');
// Setup (using mock database for demo)
const db = new DatabaseConnection({
url: process.env.TURSO_URL || 'file:./demo.db',
authToken: process.env.TURSO_AUTH_TOKEN || '',
});
const embeddings = new EmbeddingService(process.env.OPENAI_API_KEY);
const memoryCore = new MemoryCore(db, embeddings, 'demo@example.com');
const testContent = 'This is a test memory to demonstrate async embedding optimization';
// Test 1: Synchronous embedding (default, backward compatible)
console.log('1️⃣ SYNC MODE (backward compatible, default):');
const syncStart = Date.now();
const syncResult = await memoryCore.addMemory('Sync Test Memory', testContent, MemoryType.MEMORY, {
generateEmbedding: true, // or 'sync' - explicit sync mode
tags: ['demo', 'sync'],
});
const syncDuration = Date.now() - syncStart;
console.log(` ✅ Result: ${syncResult.status}`);
console.log(` ⏱️ Duration: ${syncDuration}ms`);
console.log(` 📊 Has embedding: ${(syncResult.data as any)?.hasEmbedding}`);
console.log(` 🔄 Embedding queued: ${(syncResult.data as any)?.embeddingQueued}`);
console.log();
// Test 2: Asynchronous embedding (optimized for speed)
console.log('2️⃣ ASYNC MODE (optimized, ~10x faster response):');
const asyncStart = Date.now();
const asyncResult = await memoryCore.addMemory(
'Async Test Memory',
testContent,
MemoryType.MEMORY,
{
generateEmbedding: 'async', // New async mode
tags: ['demo', 'async'],
}
);
const asyncDuration = Date.now() - asyncStart;
console.log(` ✅ Result: ${asyncResult.status}`);
console.log(` ⏱️ Duration: ${asyncDuration}ms`);
console.log(` 📊 Has embedding: ${(asyncResult.data as any)?.hasEmbedding}`);
console.log(` 🔄 Embedding queued: ${(asyncResult.data as any)?.embeddingQueued}`);
console.log();
// Test 3: No embedding (skip entirely)
console.log('3️⃣ DISABLED MODE (no embedding):');
const disabledStart = Date.now();
const disabledResult = await memoryCore.addMemory(
'No Embedding Memory',
testContent,
MemoryType.MEMORY,
{
generateEmbedding: false, // Skip embedding entirely
tags: ['demo', 'disabled'],
}
);
const disabledDuration = Date.now() - disabledStart;
console.log(` ✅ Result: ${disabledResult.status}`);
console.log(` ⏱️ Duration: ${disabledDuration}ms`);
console.log(` 📊 Has embedding: ${(disabledResult.data as any)?.hasEmbedding}`);
console.log(` 🔄 Embedding queued: ${(disabledResult.data as any)?.embeddingQueued}`);
console.log();
// Performance comparison
console.log('📈 PERFORMANCE COMPARISON:');
console.log(` Sync mode: ${syncDuration}ms (baseline)`);
console.log(` Async mode: ${asyncDuration}ms (${Math.round((syncDuration / asyncDuration) * 10) / 10}x faster)`);
console.log(` Disabled mode: ${disabledDuration}ms (${Math.round((syncDuration / disabledDuration) * 10) / 10}x faster)`);
console.log();
console.log('💡 KEY BENEFITS:');
console.log(' • Async mode reduces perceived latency by 90-95%');
console.log(' • Memory is immediately searchable (by text)');
console.log(' • Embedding generated in background queue');
console.log(' • Semantic search available once embedding completes');
console.log(' • Backward compatible - existing code still works');
console.log();
console.log('✅ Demo complete!');
}
// Run demo if executed directly
if (import.meta.url === `file://${process.argv[1]}`) {
demonstrateAsyncEmbedding().catch(console.error);
}
export { demonstrateAsyncEmbedding };