Vector Storage
Vector storage provides embedding-based retrieval for memories, documents, and semantic search across the AgentDock platform.
Overview
AgentDock includes a complete vector storage system with production-ready adapters fully integrated with the memory system, plus community-supported adapters for specialized use cases.
Production-Ready Adapters (Memory System Integrated)
1. PostgreSQL + pgvector ✅
- Status: Fully integrated with memory system
- Use Case: Production deployments
- Full vector similarity search
- Scales to millions of vectors
- HNSW and IVFFlat indexes
- Hybrid search capabilities
- Native memory operations support
2. SQLite + sqlite-vec ✅
- Status: Fully integrated with memory system
- Use Case: Development and local testing
- Local vector search
- Zero external dependencies
- Perfect for development
- 768-dimension support
- Native memory operations support
Community Extensions
The following adapters are available as community extensions for specialized use cases:
3. ChromaDB
- Dedicated vector database
- Built-in collections
- Metadata filtering
- REST API interface
4. Qdrant
- High-performance vector search
- Advanced filtering
- Batch operations
- Clustering support
5. Pinecone
- Managed cloud service
- Serverless vector search
- Auto-scaling
- Global replication
AI SDK Integration
AgentDock exports AI SDK's embedding functions directly:
import { embed, embedMany } from 'agentdock-core/llm';
import { createOpenAIModel } from 'agentdock-core/llm';
// Create embedding model
const embeddingModel = createOpenAIModel({
model: 'text-embedding-3-small',
apiKey: process.env.OPENAI_API_KEY
});
// Generate single embedding
const result = await embed({
model: embeddingModel,
value: 'Your text to embed'
});
// Generate batch embeddings
const results = await embedMany({
model: embeddingModel,
values: ['Text 1', 'Text 2', 'Text 3']
});
Architecture
Storage Layer Integration
// Vector operations are part of storage adapters
import { getStorageFactory } from 'agentdock-core';
const factory = getStorageFactory();
const vectorStorage = factory.getProvider({
type: 'postgresql-vector',
config: {
connectionString: process.env.DATABASE_URL,
enableVector: true,
defaultDimension: 1536
}
});
Vector Operations Interface
All vector-enabled adapters implement:
interface VectorOperations {
// Collection management
createCollection(config: VectorCollectionConfig): Promise<void>;
dropCollection(name: string): Promise<void>;
// Vector CRUD
insertVectors(collection: string, vectors: VectorData[]): Promise<void>;
updateVectors(collection: string, vectors: VectorData[]): Promise<void>;
deleteVectors(collection: string, ids: string[]): Promise<void>;
// Search
searchVectors(
collection: string,
queryVector: number[],
options?: VectorSearchOptions
): Promise<VectorSearchResult[]>;
}
Memory System Integration
1. Memory Embeddings
// Generate embeddings for memories
const memoryEmbedding = await embed({
model: embeddingModel,
value: memory.content
});
// Store in vector collection
await vectorStorage.insertVectors('memories', [{
id: memory.id,
vector: memoryEmbedding.embedding,
metadata: {
agentId: memory.agentId,
type: memory.type,
importance: memory.importance
}
}]);
2. Semantic Memory Recall
// Generate query embedding
const queryEmbedding = await embed({
model: embeddingModel,
value: userQuery
});
// Search similar memories
const similarMemories = await vectorStorage.searchVectors(
'memories',
queryEmbedding.embedding,
{
k: 10,
filter: { agentId: currentAgentId },
includeScore: true
}
);
3. Batch Processing
// Batch embed memories for efficiency
const memoryTexts = memories.map(m => m.content);
const embeddings = await embedMany({
model: embeddingModel,
values: memoryTexts
});
// Batch insert
const vectorData = memories.map((memory, i) => ({
id: memory.id,
vector: embeddings.embeddings[i],
metadata: {
agentId: memory.agentId,
type: memory.type,
createdAt: memory.createdAt
}
}));
await vectorStorage.insertVectors('memories', vectorData);
Production Configurations
PostgreSQL + pgvector (Recommended)
// Production setup with pgvector
const vectorStorage = factory.getProvider({
type: 'postgresql-vector',
config: {
connectionString: process.env.DATABASE_URL,
enableVector: true,
defaultDimension: 1536,
defaultMetric: VectorMetric.COSINE,
ivfflat: {
lists: 100, // For 1M vectors
probes: 10 // Query accuracy
}
}
});
Embedding Model Selection
// Cost-optimized embedding
const smallModel = createOpenAIModel({
model: 'text-embedding-3-small', // $0.02/1M tokens
apiKey: process.env.OPENAI_API_KEY
});
// Quality-optimized embedding
const largeModel = createOpenAIModel({
model: 'text-embedding-3-large', // $0.13/1M tokens
apiKey: process.env.OPENAI_API_KEY
});
Performance Optimization
1. Batch Operations
- Process embeddings in batches of 100-1000
- Use
embedMany
for multiple texts - Batch vector insertions
2. Caching Strategy
// Cache embeddings to avoid re-computation
const embeddingCache = new Map<string, number[]>();
async function getCachedEmbedding(text: string): Promise<number[]> {
const hash = createHash(text);
if (embeddingCache.has(hash)) {
return embeddingCache.get(hash)!;
}
const result = await embed({ model, value: text });
embeddingCache.set(hash, result.embedding);
return result.embedding;
}
3. Index Optimization
- Use IVFFlat for large datasets (>100K vectors)
- Tune
lists
parameter: sqrt(num_vectors) - Increase
probes
for better accuracy
Cost Management
Embedding Costs (OpenAI)
- text-embedding-3-small: $0.02 per 1M tokens
- text-embedding-3-large: $0.13 per 1M tokens
- ada-002: $0.10 per 1M tokens (legacy)
Cost Optimization Strategies
- Use smaller models for non-critical content
- Cache embeddings aggressively
- Batch operations to reduce API calls
- Filter content before embedding
- Use dimension reduction when appropriate
Common Use Cases
1. Semantic Memory Search
Find memories related to current context
2. Document Retrieval
RAG implementation for knowledge bases
3. Similarity Matching
Find similar conversations or patterns
4. Concept Clustering
Group related memories automatically
5. Context Building
Retrieve relevant history for agents
Migration Guide
From Placeholder to Real Embeddings
// Before: ChromaDB placeholder
const embeddingFunction = new DefaultEmbeddingFunction();
// After: Real embeddings
const embeddingFunction = {
async generate(documents: string[]): Promise<number[][]> {
const result = await embedMany({
model: embeddingModel,
values: documents
});
return result.embeddings;
}
};
Monitoring and Debugging
Vector Storage Metrics
- Index size and performance
- Query latency (p50, p95, p99)
- Embedding generation time
- Cache hit rates
Debug Utilities
// Check vector similarity
import { cosineSimilarity } from 'agentdock-core/evaluation';
const similarity = cosineSimilarity(vector1, vector2);
console.log(`Similarity: ${similarity}`);
Next Steps
With vector storage fully implemented, the memory system can now:
- Generate real embeddings for all memory types
- Perform semantic search at scale
- Build memory networks with vector similarity
- Enable hybrid search (vector + metadata)
- Support multi-modal embeddings (future)