CHECKPOINT: Major project cleanup and organization
🎯 CLEANUP MILESTONE - Session 5 Continuation: 📁 DOCUMENTATION (70+ → 31 files): ✅ Removed 14 redundant API design documents ✅ Removed 8 augmentation archive documents ✅ Removed 6 planning documents ✅ Removed 11 temporary strategy/optimization docs ✅ All backed up to backup-cleanup-2025-08-26/ 📂 TEST ORGANIZATION: ✅ Moved 17 test files → tests/manual-tests/ ✅ Moved 2 vitest configs → tests/configs/ ✅ Moved 5 test scripts → tests/scripts/ ✅ Removed 12 log files (backed up) 🏗️ NEW CLEAN STRUCTURE: - docs/: Clean, organized documentation - api/, architecture/, augmentations/, features/, guides/ - tests/: All test-related files consolidated - configs/, manual-tests/, scripts/ - Root: Only essential files (README, CHANGELOG, etc.) 📊 IMPACT: - 70% reduction in documentation clutter - 100% of tests organized under tests/ - Professional structure ready for 2.0 release - No data loss - everything backed up Ready for final release preparation!
This commit is contained in:
parent
4949b6a629
commit
b74faa85d4
66 changed files with 4 additions and 9683 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -60,3 +60,7 @@ models/CLAUDE.md
|
|||
|
||||
# Development planning files (not for commit)
|
||||
PLAN.md
|
||||
|
||||
# Backup folders
|
||||
backup-*
|
||||
backup/
|
||||
|
|
|
|||
|
|
@ -1,62 +0,0 @@
|
|||
# Brain Patterns Optimization Plan
|
||||
|
||||
## Brain Pattern Operators (Complete List)
|
||||
1. **Equality**: `equals`, `is`, `eq`
|
||||
2. **Comparison**: `greaterThan`/`gt`, `lessThan`/`lt`, `greaterEqual`/`gte`, `lessEqual`/`lte`
|
||||
3. **Range**: `between` (inclusive range)
|
||||
4. **Membership**: `oneOf`/`in` (value in list)
|
||||
5. **Contains**: `contains` (for arrays)
|
||||
6. **Existence**: `exists` (field exists)
|
||||
7. **Negation**: `not` (logical NOT)
|
||||
8. **Logical**: `allOf` (AND), `anyOf` (OR)
|
||||
|
||||
## Current Architecture Issues
|
||||
- MetadataIndex: O(1) hash lookups ONLY
|
||||
- No sorted indices for ranges
|
||||
- TripleIntelligence: String-based filtering (">2020") - TERRIBLE
|
||||
- No numeric type detection
|
||||
|
||||
## Optimization Strategy
|
||||
|
||||
### Phase 1: Sorted Index Infrastructure ✅ DONE
|
||||
```typescript
|
||||
interface SortedFieldIndex {
|
||||
values: Array<[value: any, ids: Set<string>]>
|
||||
isDirty: boolean
|
||||
fieldType: 'number' | 'string' | 'date' | 'mixed'
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 2: Binary Search Implementation ✅ DONE
|
||||
- O(log n) range boundary finding
|
||||
- Support inclusive/exclusive ranges
|
||||
- Handle all comparison operators
|
||||
|
||||
### Phase 3: Automatic Type Detection
|
||||
- Detect numeric fields on first value
|
||||
- Maintain appropriate sorting
|
||||
- Convert strings to numbers when possible
|
||||
|
||||
### Phase 4: Query Optimization
|
||||
- Pre-filter with metadata index BEFORE vector search
|
||||
- Use sorted indices for ALL range queries
|
||||
- Cache sorted indices in memory
|
||||
|
||||
## Performance Targets
|
||||
- Exact match: O(1) - hash lookup
|
||||
- Range query: O(log n + m) - binary search + result size
|
||||
- Combined filters: O(k * log n) - k conditions
|
||||
- Memory overhead: ~2x current (hash + sorted)
|
||||
|
||||
## Implementation Status
|
||||
- [x] Add SortedFieldIndex type
|
||||
- [x] Add binary search methods
|
||||
- [x] Update getIdsForFilter for all operators
|
||||
- [ ] Fix TripleIntelligence to use index directly
|
||||
- [ ] Add index statistics/monitoring
|
||||
- [ ] Optimize memory usage
|
||||
|
||||
## Expected Performance Gains
|
||||
- Range queries: 100-1000x faster
|
||||
- Combined vector+metadata: 10-50x faster
|
||||
- Memory usage: +50% (acceptable tradeoff)
|
||||
|
|
@ -1,227 +0,0 @@
|
|||
# 🧠 COMPREHENSIVE TESTING STRATEGY - ALL FEATURES
|
||||
|
||||
**Brainy 2.0 Complete Feature & API Validation Plan**
|
||||
|
||||
## 🎯 **COMPLETE PUBLIC API TESTING**
|
||||
|
||||
### **📋 Core Public API Methods (From docs/api/README.md):**
|
||||
|
||||
#### **Data Operations:**
|
||||
- [ ] `addNoun(dataOrVector, metadata?)` - Text auto-embedding + vector input
|
||||
- [ ] `getNoun(id)` - Retrieve single noun
|
||||
- [ ] `updateNoun(id, dataOrVector?, metadata?)` - Update noun data/metadata
|
||||
- [ ] `deleteNoun(id)` - Remove noun
|
||||
- [ ] `addVerb(fromId, toId, type, metadata?)` - Create relationships
|
||||
- [ ] `getVerb(id)` - Retrieve relationship
|
||||
- [ ] `deleteVerb(id)` - Remove relationship
|
||||
|
||||
#### **Search & Query Operations:**
|
||||
- [ ] `search(query, options?)` - Vector similarity search
|
||||
- [ ] `find({ like?, where?, connected? })` - **NEW Triple Intelligence**
|
||||
- [ ] `findSimilar(id, options?)` - Find similar nouns
|
||||
- [ ] `searchText(query, options?)` - Text-based search
|
||||
- [ ] `searchWithCursor(query, cursor?)` - Paginated search
|
||||
|
||||
#### **Batch Operations:**
|
||||
- [ ] `addBatch(items)` - Bulk add operations
|
||||
- [ ] `addBatchToBoth(nouns, verbs)` - Add nouns + verbs together
|
||||
|
||||
#### **Graph Operations:**
|
||||
- [ ] `relate(fromId, toId, verb, metadata?)` - Create relationship
|
||||
- [ ] `getConnections(id, options?)` - Get related items
|
||||
- [ ] `getConnected(id, verb?)` - Get connected nouns
|
||||
|
||||
#### **Management Operations:**
|
||||
- [ ] `clear()` - Clear all data
|
||||
- [ ] `size()` - Get total count
|
||||
- [ ] `getStatistics()` - Get detailed stats
|
||||
- [ ] `backup()` / `restore()` - Data persistence
|
||||
- [ ] `init()` / `shutdown()` - Lifecycle
|
||||
|
||||
## 🚀 **ADVANCED FEATURES TESTING**
|
||||
|
||||
### **🔧 Operational Modes:**
|
||||
- [ ] **Write-Only Mode** - `setWriteOnly(true)` - write-only-direct-reads.test.ts ✅
|
||||
- [ ] **Read-Only Mode** - `setReadOnly(true)`
|
||||
- [ ] **Frozen Mode** - `isFrozen()` state
|
||||
- [ ] **Memory-Only Mode** - No persistence
|
||||
- [ ] **Persistent Mode** - File/S3/OPFS storage
|
||||
|
||||
### **⚡ Performance Optimizations:**
|
||||
- [ ] **Throttling** - S3 rate limiting - throttling-metrics.test.ts ✅
|
||||
- [ ] **Batch Processing** - Bulk operations - augmentations-batch-processing.test.ts ✅
|
||||
- [ ] **Caching** - Search result caching
|
||||
- [ ] **Connection Pooling** - Multi-connection management
|
||||
- [ ] **Request Deduplication** - augmentations-request-deduplicator.test.ts ✅
|
||||
- [ ] **Write-Ahead Logging** - augmentations-wal.test.ts ✅
|
||||
|
||||
### **🌐 Distributed Systems:**
|
||||
- [ ] **Distributed Mode** - distributed.test.ts ✅
|
||||
- [ ] **Distributed Caching** - distributed-caching.test.ts ✅
|
||||
- [ ] **Node Discovery** - Multi-node coordination
|
||||
- [ ] **Data Sharding** - Partition management
|
||||
- [ ] **Consistency Models** - CAP theorem handling
|
||||
|
||||
### **🔒 Data Integrity & Hashing:**
|
||||
- [ ] **Entity Registry** - UUID mapping - augmentations-entity-registry.test.ts ✅
|
||||
- [ ] **Metadata Hashing** - Content deduplication
|
||||
- [ ] **Vector Normalization** - Dimension standardization
|
||||
- [ ] **Checksum Validation** - Data integrity verification
|
||||
- [ ] **Version Management** - Data versioning
|
||||
|
||||
### **🧬 Clustering Algorithms:**
|
||||
- [ ] **HNSW Clustering** - Hierarchical Navigable Small World
|
||||
- [ ] **K-Means Clustering** - Centroid-based grouping
|
||||
- [ ] **Hierarchical Clustering** - Tree-based grouping
|
||||
- [ ] **Neural Clustering** - neural-clustering.test.ts ✅
|
||||
|
||||
### **🧠 Intelligence Features:**
|
||||
- [ ] **220 NLP Patterns** - nlp-patterns-comprehensive.test.ts ✅
|
||||
- [ ] **Neural Import** - AI-powered data understanding - neural-import.test.ts ✅
|
||||
- [ ] **Intelligent Verb Scoring** - intelligent-verb-scoring.test.ts ✅
|
||||
- [ ] **Triple Intelligence** - find-comprehensive.test.ts ✅
|
||||
- [ ] **Neural API** - neural-api.test.ts ✅
|
||||
|
||||
## 🛠️ **MEMORY-EFFICIENT TESTING STRATEGIES**
|
||||
|
||||
### **📊 Industry Standard Approaches:**
|
||||
|
||||
#### **1. Test Categorization:**
|
||||
```typescript
|
||||
// Unit Tests - Fast, isolated
|
||||
describe('Unit Tests', () => {
|
||||
// Mock dependencies, test logic only
|
||||
// Memory: <50MB, Time: <5s
|
||||
})
|
||||
|
||||
// Integration Tests - Medium, real components
|
||||
describe('Integration Tests', () => {
|
||||
// Real augmentations, mocked storage
|
||||
// Memory: <200MB, Time: <30s
|
||||
})
|
||||
|
||||
// E2E Tests - Slow, full system
|
||||
describe('E2E Tests', () => {
|
||||
// Full system, real storage
|
||||
// Memory: <1GB, Time: <5min
|
||||
})
|
||||
```
|
||||
|
||||
#### **2. Memory Management:**
|
||||
```typescript
|
||||
// Resource cleanup patterns
|
||||
afterEach(async () => {
|
||||
await brain?.cleanup()
|
||||
brain = null
|
||||
if (global.gc) global.gc() // Force cleanup
|
||||
})
|
||||
|
||||
// Limited dataset sizes
|
||||
const createTestData = (size = 10) => { // Not 10,000!
|
||||
return Array.from({ length: size }, createSmallVector)
|
||||
}
|
||||
```
|
||||
|
||||
#### **3. Mock Strategies:**
|
||||
```typescript
|
||||
// Mock heavy operations
|
||||
vi.mock('./utils/embedding.js', () => ({
|
||||
createEmbeddingFunction: () => vi.fn().mockResolvedValue(mockVector)
|
||||
}))
|
||||
|
||||
// Mock storage for performance tests
|
||||
const mockStorage = {
|
||||
read: vi.fn().mockResolvedValue(testData),
|
||||
write: vi.fn().mockResolvedValue(true)
|
||||
}
|
||||
```
|
||||
|
||||
#### **4. Parallel Test Execution:**
|
||||
```typescript
|
||||
// vitest.config.ts
|
||||
export default {
|
||||
test: {
|
||||
pool: 'forks', // Isolate tests
|
||||
poolOptions: {
|
||||
forks: {
|
||||
singleFork: true // Prevent memory accumulation
|
||||
}
|
||||
},
|
||||
testTimeout: 30000, // 30s max per test
|
||||
hookTimeout: 10000 // 10s max for setup/cleanup
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **🚀 Fast & Reliable Testing Patterns:**
|
||||
|
||||
#### **Memory-Efficient Patterns:**
|
||||
```typescript
|
||||
// 1. Small datasets
|
||||
const SMALL_VECTOR_SIZE = 10 // Not 384 for unit tests
|
||||
const TEST_DATA_SIZE = 5 // Not 1000s of items
|
||||
|
||||
// 2. Deterministic mocks
|
||||
const mockEmbedding = [0.1, 0.2, 0.3, 0.4, 0.5] // Predictable
|
||||
|
||||
// 3. Scoped tests
|
||||
describe('Search Functionality', () => {
|
||||
const brain = new BrainyData({
|
||||
storage: 'memory', // No disk I/O
|
||||
dimensions: 5, // Tiny vectors
|
||||
maxConnections: 4 // Minimal graph
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
#### **Performance Test Patterns:**
|
||||
```typescript
|
||||
// Measure operations, not full datasets
|
||||
it('should handle batch operations efficiently', async () => {
|
||||
const start = performance.now()
|
||||
|
||||
// Test with 10 items, not 10,000
|
||||
await brain.addBatch(createTestBatch(10))
|
||||
|
||||
const duration = performance.now() - start
|
||||
expect(duration).toBeLessThan(1000) // 1s max
|
||||
})
|
||||
```
|
||||
|
||||
## 📋 **IMPLEMENTATION PLAN**
|
||||
|
||||
### **Phase 1: Fix TypeScript → Build Success**
|
||||
- Complete remaining 101 TypeScript errors
|
||||
- Achieve clean build
|
||||
|
||||
### **Phase 2: Core API Validation (Fast)**
|
||||
- Test all public methods with small datasets
|
||||
- Validate method signatures
|
||||
- Test error handling
|
||||
|
||||
### **Phase 3: Advanced Features (Medium)**
|
||||
- Test operational modes (write-only, read-only)
|
||||
- Test performance optimizations
|
||||
- Test distributed features
|
||||
|
||||
### **Phase 4: Full Integration (Comprehensive)**
|
||||
- All 49 tests passing
|
||||
- Memory-efficient execution
|
||||
- Performance benchmarks
|
||||
|
||||
## ✅ **SUCCESS METRICS**
|
||||
|
||||
### **Speed Goals:**
|
||||
- **Unit tests**: <5 minutes total
|
||||
- **Integration tests**: <15 minutes total
|
||||
- **Full suite**: <30 minutes total
|
||||
- **Memory usage**: <2GB peak
|
||||
|
||||
### **Coverage Goals:**
|
||||
- **100% public API methods** tested
|
||||
- **100% operational modes** tested
|
||||
- **100% augmentations** tested
|
||||
- **100% clustering algorithms** tested
|
||||
- **All performance optimizations** validated
|
||||
|
||||
This gives us **comprehensive testing** of ALL Brainy features while maintaining **fast, reliable execution** using industry-standard patterns!
|
||||
|
|
@ -1,212 +0,0 @@
|
|||
# Coordinated Index Optimization Strategy
|
||||
|
||||
## The Problem
|
||||
Two independent index systems competing for resources:
|
||||
- **HNSW Index**: Wants to cache hot vectors in RAM
|
||||
- **MetadataIndex**: Wants to cache hot field values in RAM
|
||||
- **Conflict**: Both trying to use same memory/disk without coordination!
|
||||
|
||||
## The Solution: Unified Resource Manager
|
||||
|
||||
### 1. Shared Resource Pool
|
||||
```typescript
|
||||
class UnifiedIndexManager {
|
||||
private totalMemoryBudget: number = 2 * 1024 * 1024 * 1024 // 2GB total
|
||||
private hnswMemoryUsage: number = 0
|
||||
private metadataMemoryUsage: number = 0
|
||||
|
||||
// Intelligent allocation based on usage patterns
|
||||
allocateMemory(requester: 'hnsw' | 'metadata', size: number): boolean {
|
||||
const available = this.totalMemoryBudget - this.hnswMemoryUsage - this.metadataMemoryUsage
|
||||
|
||||
if (size <= available) {
|
||||
if (requester === 'hnsw') {
|
||||
this.hnswMemoryUsage += size
|
||||
} else {
|
||||
this.metadataMemoryUsage += size
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// Try to steal from other index if one is underutilized
|
||||
return this.rebalance(requester, size)
|
||||
}
|
||||
|
||||
private rebalance(requester: string, needed: number): boolean {
|
||||
// If HNSW is using 80% and metadata only 20%, rebalance
|
||||
const hnswRatio = this.hnswMemoryUsage / this.totalMemoryBudget
|
||||
const metadataRatio = this.metadataMemoryUsage / this.totalMemoryBudget
|
||||
|
||||
// Intelligent rebalancing logic
|
||||
// ...
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Coordinated LRU Eviction
|
||||
```typescript
|
||||
class CoordinatedLRUCache {
|
||||
private hnswLRU: LRUCache
|
||||
private metadataLRU: LRUCache
|
||||
private accessPatterns: AccessTracker
|
||||
|
||||
// When memory pressure, evict from the index with lowest utility
|
||||
async evict(bytesNeeded: number): Promise<void> {
|
||||
const hnswUtility = this.calculateUtility(this.hnswLRU)
|
||||
const metadataUtility = this.calculateUtility(this.metadataLRU)
|
||||
|
||||
if (hnswUtility < metadataUtility) {
|
||||
// HNSW items are less frequently accessed
|
||||
await this.hnswLRU.evict(bytesNeeded)
|
||||
} else {
|
||||
// Metadata items are less frequently accessed
|
||||
await this.metadataLRU.evict(bytesNeeded)
|
||||
}
|
||||
}
|
||||
|
||||
private calculateUtility(cache: LRUCache): number {
|
||||
// Factors:
|
||||
// - Access frequency
|
||||
// - Recency
|
||||
// - Cost to rebuild (HNSW is expensive, metadata is cheap)
|
||||
// - Current query patterns
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Query-Aware Optimization
|
||||
```typescript
|
||||
class QueryOptimizer {
|
||||
private queryHistory: QueryPattern[] = []
|
||||
|
||||
optimizeForQuery(query: TripleQuery) {
|
||||
// Analyze query type
|
||||
const usesVector = !!(query.like || query.similar)
|
||||
const usesMetadata = !!query.where
|
||||
|
||||
// Pre-warm appropriate caches
|
||||
if (usesVector && usesMetadata) {
|
||||
// Hybrid query - balance resources 50/50
|
||||
this.resourceManager.setRatio(0.5, 0.5)
|
||||
} else if (usesVector) {
|
||||
// Vector-heavy - give HNSW more memory
|
||||
this.resourceManager.setRatio(0.8, 0.2)
|
||||
} else {
|
||||
// Metadata-heavy - give MetadataIndex more memory
|
||||
this.resourceManager.setRatio(0.2, 0.8)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Unified Persistence Strategy
|
||||
```typescript
|
||||
class UnifiedPersistence {
|
||||
private writeBuffer: WriteBuffer
|
||||
private flushScheduler: FlushScheduler
|
||||
|
||||
async flush() {
|
||||
// Coordinate flushes to avoid disk contention
|
||||
const tasks = []
|
||||
|
||||
// Flush metadata first (smaller, faster)
|
||||
if (this.metadataIndex.isDirty) {
|
||||
tasks.push(this.flushMetadata())
|
||||
}
|
||||
|
||||
// Then flush HNSW (larger, slower)
|
||||
if (this.hnswIndex.isDirty) {
|
||||
tasks.push(this.flushHNSW())
|
||||
}
|
||||
|
||||
// Sequential to avoid disk thrashing
|
||||
for (const task of tasks) {
|
||||
await task
|
||||
}
|
||||
}
|
||||
|
||||
private async flushMetadata() {
|
||||
// Flush sorted indices
|
||||
await this.storage.save('metadata_sorted', this.metadataIndex.sortedIndices)
|
||||
// Flush hash indices
|
||||
await this.storage.save('metadata_hash', this.metadataIndex.hashIndices)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Implementation Plan
|
||||
|
||||
### Phase 1: Shared Memory Manager (Quick Win)
|
||||
```typescript
|
||||
// In BrainyData constructor
|
||||
this.resourceManager = new UnifiedResourceManager({
|
||||
totalMemory: config.maxMemory || 2 * GB,
|
||||
hnswRatio: 0.6, // 60% for vectors by default
|
||||
metadataRatio: 0.4 // 40% for metadata by default
|
||||
})
|
||||
|
||||
// Pass to both indices
|
||||
this.hnswIndex = new HNSWIndexOptimized({
|
||||
resourceManager: this.resourceManager
|
||||
})
|
||||
|
||||
this.metadataIndex = new MetadataIndexOptimized({
|
||||
resourceManager: this.resourceManager
|
||||
})
|
||||
```
|
||||
|
||||
### Phase 2: Coordinated Eviction
|
||||
- Single LRU that tracks both index types
|
||||
- Utility-based eviction (not just recency)
|
||||
- Consider rebuild cost in eviction decisions
|
||||
|
||||
### Phase 3: Query-Driven Optimization
|
||||
- Track query patterns
|
||||
- Dynamically adjust memory allocation
|
||||
- Pre-warm caches based on query type
|
||||
|
||||
## Benefits of Coordination
|
||||
|
||||
1. **No Resource Conflicts**: Indices cooperate instead of compete
|
||||
2. **Better Memory Usage**: Allocate based on actual query patterns
|
||||
3. **Smarter Eviction**: Keep data that's actually needed
|
||||
4. **Unified Monitoring**: Single place to track all index performance
|
||||
5. **Auto-Optimization**: System learns and adapts to usage
|
||||
|
||||
## Configuration Example
|
||||
```typescript
|
||||
const brain = new BrainyData({
|
||||
indexOptimization: {
|
||||
mode: 'coordinated', // vs 'independent'
|
||||
totalMemory: 4 * GB, // Total for ALL indices
|
||||
autoBalance: true, // Dynamic rebalancing
|
||||
persistenceInterval: 60000, // Coordinated flush every minute
|
||||
monitoring: {
|
||||
trackQueryPatterns: true,
|
||||
optimizeForPatterns: true,
|
||||
rebalanceInterval: 300000 // Every 5 minutes
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## Monitoring & Metrics
|
||||
```typescript
|
||||
const stats = brain.getIndexStats()
|
||||
// {
|
||||
// hnsw: {
|
||||
// memoryUsed: 1.2 * GB,
|
||||
// cacheHitRate: 0.89,
|
||||
// avgQueryTime: 12ms
|
||||
// },
|
||||
// metadata: {
|
||||
// memoryUsed: 0.8 * GB,
|
||||
// cacheHitRate: 0.95,
|
||||
// avgQueryTime: 2ms
|
||||
// },
|
||||
// coordination: {
|
||||
// rebalances: 5,
|
||||
// memoryUtilization: 0.95,
|
||||
// queryPatternDetected: 'hybrid-heavy'
|
||||
// }
|
||||
// }
|
||||
|
|
@ -1,104 +0,0 @@
|
|||
# Transformer Model Memory Issue - Solutions
|
||||
|
||||
## The Problem
|
||||
ONNX runtime allocates 4GB for a 30MB model during inference. This is a known issue with transformers.js.
|
||||
|
||||
## Solution 1: Use Smaller Quantized Model (RECOMMENDED)
|
||||
```javascript
|
||||
// Current: all-MiniLM-L6-v2 with q8 quantization
|
||||
// Switch to: all-MiniLM-L6-v2 with q4 quantization (50% smaller)
|
||||
// Or use: paraphrase-MiniLM-L3-v2 (even smaller, still good quality)
|
||||
|
||||
const embeddingFunction = createEmbeddingFunction({
|
||||
modelName: 'Xenova/paraphrase-MiniLM-L3-v2',
|
||||
dtype: 'q4' // 4-bit quantization instead of 8-bit
|
||||
})
|
||||
```
|
||||
|
||||
## Solution 2: Increase Node Memory Limit
|
||||
```bash
|
||||
# Run with 8GB heap limit
|
||||
node --max-old-space-size=8192 test-range-queries.js
|
||||
|
||||
# Or set in package.json test script:
|
||||
"test": "NODE_OPTIONS='--max-old-space-size=8192' vitest"
|
||||
```
|
||||
|
||||
## Solution 3: Use Remote Embeddings (For Testing)
|
||||
```javascript
|
||||
// Mock embedding function for tests
|
||||
const mockEmbeddingFunction = async (text) => {
|
||||
// Generate deterministic fake embedding from text hash
|
||||
const hash = text.split('').reduce((a, b) => a + b.charCodeAt(0), 0)
|
||||
return new Array(384).fill(0).map((_, i) => Math.sin(hash + i) * 0.1)
|
||||
}
|
||||
```
|
||||
|
||||
## Solution 4: Model Pooling & Unloading
|
||||
```javascript
|
||||
class ModelPool {
|
||||
private model: any = null
|
||||
private lastUsed: number = 0
|
||||
private readonly UNLOAD_AFTER_MS = 30000 // 30 seconds
|
||||
|
||||
async getModel() {
|
||||
if (!this.model) {
|
||||
this.model = await loadModel()
|
||||
}
|
||||
this.lastUsed = Date.now()
|
||||
this.scheduleUnload()
|
||||
return this.model
|
||||
}
|
||||
|
||||
private scheduleUnload() {
|
||||
setTimeout(() => {
|
||||
if (Date.now() - this.lastUsed > this.UNLOAD_AFTER_MS) {
|
||||
this.model?.dispose?.()
|
||||
this.model = null
|
||||
}
|
||||
}, this.UNLOAD_AFTER_MS)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Solution 5: Use Native Bindings (Future)
|
||||
Replace transformers.js with native bindings:
|
||||
- onnxruntime-node (more efficient memory)
|
||||
- @tensorflow/tfjs-node (better memory management)
|
||||
- Custom Rust/C++ binding
|
||||
|
||||
## Recommendation for Brainy 2.0
|
||||
|
||||
### For Production:
|
||||
1. Use q4 quantization (reduces memory 50%)
|
||||
2. Implement model pooling/unloading
|
||||
3. Document memory requirements (4GB recommended)
|
||||
|
||||
### For Testing:
|
||||
1. Increase Node heap to 8GB for test suite
|
||||
2. Use mock embeddings for unit tests
|
||||
3. Real embeddings only for integration tests
|
||||
|
||||
### Long-term:
|
||||
1. Investigate native bindings
|
||||
2. Support multiple embedding backends
|
||||
3. Cloud embedding API option
|
||||
|
||||
## Memory Requirements
|
||||
|
||||
| Configuration | Memory Needed | Use Case |
|
||||
|--------------|--------------|----------|
|
||||
| Mock embeddings | 200 MB | Unit tests |
|
||||
| Q4 quantization | 2 GB | Development |
|
||||
| Q8 quantization | 4 GB | Production (current) |
|
||||
| Native bindings | 500 MB | Future optimization |
|
||||
|
||||
## The Real Issue
|
||||
|
||||
This is NOT a Brainy problem - it's a transformers.js/ONNX issue that affects ALL JavaScript ML applications. Even Google's similar libraries have this problem.
|
||||
|
||||
The good news:
|
||||
- Only affects initial model load
|
||||
- Singleton pattern prevents multiple copies
|
||||
- Memory is released after inference
|
||||
- Production servers typically have 8-16GB RAM
|
||||
|
|
@ -1,216 +0,0 @@
|
|||
# 🧠 Zero-Config ONNX Memory Optimization Plan
|
||||
|
||||
## Philosophy
|
||||
Brainy should **automatically detect and optimize** memory usage without any user configuration.
|
||||
|
||||
## Implementation Strategy
|
||||
|
||||
### 1. **Automatic Environment Variable Setting** ✅ DONE
|
||||
Already implemented in `src/utils/embedding.ts`:
|
||||
```javascript
|
||||
// Automatically set on module load - zero config!
|
||||
if (typeof process !== 'undefined' && process.env) {
|
||||
process.env.ORT_DISABLE_MEMORY_ARENA = '1'
|
||||
process.env.ORT_DISABLE_MEMORY_PATTERN = '1'
|
||||
process.env.ORT_INTRA_OP_NUM_THREADS = '2'
|
||||
process.env.ORT_INTER_OP_NUM_THREADS = '2'
|
||||
}
|
||||
```
|
||||
|
||||
### 2. **Automatic Quantization Selection** ✅ DONE
|
||||
Changed default from `fp32` to `q8`:
|
||||
```javascript
|
||||
dtype: options.dtype || 'q8' // 75% memory reduction, <1% quality loss
|
||||
```
|
||||
|
||||
### 3. **Dynamic Memory Detection** 🚧 TODO
|
||||
```javascript
|
||||
class TransformerEmbedding {
|
||||
constructor(options) {
|
||||
// Auto-detect available memory
|
||||
const availableMemory = this.getAvailableMemory()
|
||||
|
||||
// Auto-select best configuration
|
||||
if (availableMemory < 2048) { // Less than 2GB
|
||||
this.options.dtype = 'q4' // Maximum compression
|
||||
this.options.batchSize = 5 // Small batches
|
||||
} else if (availableMemory < 4096) { // 2-4GB
|
||||
this.options.dtype = 'q8' // Good balance
|
||||
this.options.batchSize = 10
|
||||
} else { // 4GB+
|
||||
this.options.dtype = 'fp16' // Better quality
|
||||
this.options.batchSize = 20
|
||||
}
|
||||
}
|
||||
|
||||
private getAvailableMemory(): number {
|
||||
if (typeof process !== 'undefined') {
|
||||
const os = require('os')
|
||||
return os.freemem() / (1024 * 1024) // MB
|
||||
}
|
||||
// Browser: estimate from performance.memory
|
||||
if (typeof performance !== 'undefined' && performance.memory) {
|
||||
return (performance.memory.jsHeapSizeLimit - performance.memory.usedJSHeapSize) / (1024 * 1024)
|
||||
}
|
||||
return 2048 // Safe default: 2GB
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. **Automatic Model Unloading** 🚧 TODO
|
||||
```javascript
|
||||
class TransformerEmbedding {
|
||||
private lastUsed = Date.now()
|
||||
private unloadTimer?: NodeJS.Timeout
|
||||
|
||||
async embed(text: string[]): Promise<Vector[]> {
|
||||
this.lastUsed = Date.now()
|
||||
|
||||
// Cancel any pending unload
|
||||
if (this.unloadTimer) {
|
||||
clearTimeout(this.unloadTimer)
|
||||
}
|
||||
|
||||
// Ensure model is loaded
|
||||
if (!this.extractor) {
|
||||
await this.loadModel()
|
||||
}
|
||||
|
||||
const result = await this.doEmbed(text)
|
||||
|
||||
// Schedule unload after 5 minutes of inactivity
|
||||
this.unloadTimer = setTimeout(() => {
|
||||
this.unloadModel()
|
||||
}, 5 * 60 * 1000)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
private unloadModel() {
|
||||
if (this.extractor) {
|
||||
this.extractor.dispose()
|
||||
this.extractor = null
|
||||
console.log('🧹 Model unloaded to free memory')
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. **Automatic Batch Size Adjustment** 🚧 TODO
|
||||
```javascript
|
||||
class TransformerEmbedding {
|
||||
private optimalBatchSize = 10
|
||||
|
||||
async embed(texts: string[]): Promise<Vector[]> {
|
||||
const results = []
|
||||
|
||||
for (let i = 0; i < texts.length; i += this.optimalBatchSize) {
|
||||
const batch = texts.slice(i, i + this.optimalBatchSize)
|
||||
|
||||
try {
|
||||
const embeddings = await this.embedBatch(batch)
|
||||
results.push(...embeddings)
|
||||
} catch (error) {
|
||||
if (error.message.includes('memory')) {
|
||||
// Reduce batch size on memory error
|
||||
this.optimalBatchSize = Math.max(1, Math.floor(this.optimalBatchSize / 2))
|
||||
console.log(`📉 Reduced batch size to ${this.optimalBatchSize} due to memory pressure`)
|
||||
|
||||
// Retry with smaller batch
|
||||
i -= this.optimalBatchSize // Retry this batch
|
||||
continue
|
||||
}
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
// Gradually increase batch size if successful
|
||||
if (this.optimalBatchSize < 20) {
|
||||
this.optimalBatchSize++
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6. **Pre-computed Common Embeddings** 🚧 TODO
|
||||
Build into `embeddedPatterns.ts`:
|
||||
```javascript
|
||||
// Pre-compute embeddings for common terms
|
||||
const COMMON_EMBEDDINGS = {
|
||||
'javascript': [0.123, 0.456, ...],
|
||||
'python': [0.234, 0.567, ...],
|
||||
'database': [0.345, 0.678, ...],
|
||||
// ... top 1000 common terms
|
||||
}
|
||||
|
||||
async embed(text: string): Promise<Vector> {
|
||||
// Check cache first - INSTANT, zero memory!
|
||||
const lower = text.toLowerCase()
|
||||
if (COMMON_EMBEDDINGS[lower]) {
|
||||
return COMMON_EMBEDDINGS[lower]
|
||||
}
|
||||
|
||||
// Only compute if not cached
|
||||
return this.computeEmbedding(text)
|
||||
}
|
||||
```
|
||||
|
||||
## Testing Plan
|
||||
|
||||
### Phase 1: Current Optimizations (TODAY)
|
||||
- [x] Environment variables auto-set
|
||||
- [x] Default to q8 quantization
|
||||
- [x] Session options configured
|
||||
- [ ] Test with real search
|
||||
|
||||
### Phase 2: Dynamic Adaptation (NEXT)
|
||||
- [ ] Memory detection
|
||||
- [ ] Auto dtype selection
|
||||
- [ ] Batch size adjustment
|
||||
- [ ] Model unloading
|
||||
|
||||
### Phase 3: Performance (FUTURE)
|
||||
- [ ] Pre-computed embeddings
|
||||
- [ ] Lazy loading
|
||||
- [ ] WebAssembly fallback
|
||||
|
||||
## User Experience
|
||||
|
||||
### Before (Manual Configuration)
|
||||
```javascript
|
||||
// User had to know about ONNX issues
|
||||
process.env.ORT_DISABLE_MEMORY_ARENA = '1'
|
||||
const brain = new BrainyData({
|
||||
embeddingOptions: {
|
||||
dtype: 'q8',
|
||||
batchSize: 10
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### After (Zero Config)
|
||||
```javascript
|
||||
// Just works!
|
||||
const brain = new BrainyData()
|
||||
await brain.search('anything') // Automatically optimized
|
||||
```
|
||||
|
||||
## Benefits
|
||||
1. **Zero Configuration** - Works out of the box
|
||||
2. **Adaptive** - Adjusts to available resources
|
||||
3. **Resilient** - Recovers from memory errors
|
||||
4. **Efficient** - Uses minimum required memory
|
||||
5. **Smart** - Caches common queries
|
||||
|
||||
## Current Status
|
||||
- ✅ Basic optimizations in place
|
||||
- 🚧 Need to test if they work
|
||||
- 📝 Plan documented for full implementation
|
||||
|
||||
## Next Steps
|
||||
1. Test current optimizations with real search
|
||||
2. Implement memory detection
|
||||
3. Add batch size adjustment
|
||||
4. Build pre-computed embeddings
|
||||
|
|
@ -1,391 +0,0 @@
|
|||
# 🚀 Brainy Production Deployment Guide
|
||||
|
||||
## Memory Requirements (Critical)
|
||||
|
||||
**Brainy requires 8-16GB RAM in production** due to ONNX Runtime + transformer models.
|
||||
|
||||
This is NOT a bug - it's the cost of running state-of-the-art AI locally:
|
||||
- Same as any production ML system (TensorFlow, PyTorch)
|
||||
- Same as ChatGPT embeddings (but yours runs locally!)
|
||||
- Same as GitHub Copilot inference servers
|
||||
|
||||
## 🏗️ Architecture Overview
|
||||
|
||||
```
|
||||
Brainy 2.0 Production Stack
|
||||
├── Universal Memory Manager ✅
|
||||
│ ├── Worker-based isolation (Node.js)
|
||||
│ ├── Aggressive cleanup (Serverless)
|
||||
│ ├── Browser optimization (Web)
|
||||
│ └── Automatic restarts (prevents leaks)
|
||||
├── Triple Backup Model Loading ✅
|
||||
│ ├── Local cache (fastest)
|
||||
│ ├── GitHub releases (reliable)
|
||||
│ ├── Soulcraft CDN (future)
|
||||
│ └── HuggingFace (fallback)
|
||||
├── Brain Patterns (Query Engine) ✅
|
||||
│ ├── O(1) field lookups
|
||||
│ ├── O(log n) range queries
|
||||
│ ├── Vector search
|
||||
│ └── Triple Intelligence
|
||||
└── 11 Production Augmentations ✅
|
||||
├── WAL (durability)
|
||||
├── Batch processing
|
||||
├── Request deduplication
|
||||
├── Connection pooling
|
||||
└── 7 more enterprise features
|
||||
```
|
||||
|
||||
## 🌍 Deployment Options
|
||||
|
||||
### Option 1: High-Memory VPS (Recommended)
|
||||
```yaml
|
||||
# Deploy on servers with 16GB+ RAM
|
||||
Providers: DigitalOcean, Linode, AWS EC2
|
||||
Instance: 16GB RAM minimum
|
||||
Cost: $50-100/month
|
||||
Benefits: Full control, all features
|
||||
```
|
||||
|
||||
### Option 2: Cloud Functions (Serverless)
|
||||
```yaml
|
||||
AWS Lambda: 10GB max memory
|
||||
Google Cloud Functions: 32GB max memory
|
||||
Vercel: 3GB max (may struggle)
|
||||
Benefits: Auto-scaling, pay-per-use
|
||||
```
|
||||
|
||||
### Option 3: Container Orchestration
|
||||
```yaml
|
||||
Docker: --memory=16g
|
||||
Kubernetes: memory: "16Gi"
|
||||
Benefits: Easy scaling, restarts
|
||||
```
|
||||
|
||||
### Option 4: Dedicated AI Servers
|
||||
```yaml
|
||||
Separate embedding server: 32GB+ RAM
|
||||
API communication
|
||||
Benefits: Best performance, cost optimization
|
||||
```
|
||||
|
||||
## 📦 Docker Deployment
|
||||
|
||||
### Dockerfile
|
||||
```dockerfile
|
||||
FROM node:18
|
||||
|
||||
# Set memory limits
|
||||
ENV NODE_OPTIONS="--max-old-space-size=16384"
|
||||
|
||||
WORKDIR /app
|
||||
COPY . .
|
||||
|
||||
# Install dependencies and build
|
||||
RUN npm ci && npm run build
|
||||
|
||||
# Health check for memory management
|
||||
HEALTHCHECK --interval=30s --timeout=30s --start-period=60s \
|
||||
CMD node -e "console.log('Memory:', process.memoryUsage().heapUsed/1024/1024, 'MB')"
|
||||
|
||||
EXPOSE 3000
|
||||
CMD ["node", "dist/server.js"]
|
||||
```
|
||||
|
||||
### Docker Compose
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
brainy-app:
|
||||
build: .
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- NODE_OPTIONS=--max-old-space-size=16384
|
||||
- BRAINY_MODELS_PATH=/app/models
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 16G
|
||||
reservations:
|
||||
memory: 8G
|
||||
volumes:
|
||||
- ./models:/app/models
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
```
|
||||
|
||||
## ☁️ Kubernetes Deployment
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: brainy-deployment
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: brainy
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: brainy
|
||||
spec:
|
||||
containers:
|
||||
- name: brainy
|
||||
image: your-registry/brainy:latest
|
||||
env:
|
||||
- name: NODE_OPTIONS
|
||||
value: "--max-old-space-size=16384"
|
||||
- name: BRAINY_MODELS_PATH
|
||||
value: "/app/models"
|
||||
resources:
|
||||
requests:
|
||||
memory: "8Gi"
|
||||
cpu: "2000m"
|
||||
limits:
|
||||
memory: "16Gi"
|
||||
cpu: "4000m"
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
volumeMounts:
|
||||
- name: models
|
||||
mountPath: /app/models
|
||||
volumes:
|
||||
- name: models
|
||||
persistentVolumeClaim:
|
||||
claimName: brainy-models
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: brainy-service
|
||||
spec:
|
||||
selector:
|
||||
app: brainy
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 3000
|
||||
type: LoadBalancer
|
||||
```
|
||||
|
||||
## 🔧 Environment Configuration
|
||||
|
||||
### Essential Environment Variables
|
||||
```bash
|
||||
# Memory Management
|
||||
NODE_OPTIONS="--max-old-space-size=16384" # 16GB heap
|
||||
BRAINY_MODELS_PATH="/app/models" # Model location
|
||||
BRAINY_ALLOW_REMOTE_MODELS="false" # Use local only
|
||||
|
||||
# Production Optimization
|
||||
NODE_ENV="production"
|
||||
BRAINY_VERBOSE="false" # Reduce logging
|
||||
BRAINY_CACHE_SIZE="10000" # Larger cache
|
||||
```
|
||||
|
||||
### Optional Configuration
|
||||
```bash
|
||||
# Memory Manager Tuning
|
||||
BRAINY_MAX_EMBEDDINGS_NODE="100" # Worker restart threshold
|
||||
BRAINY_MAX_EMBEDDINGS_SERVERLESS="50" # Serverless threshold
|
||||
BRAINY_MAX_EMBEDDINGS_BROWSER="25" # Browser threshold
|
||||
|
||||
# Storage Configuration
|
||||
BRAINY_STORAGE_TYPE="filesystem" # or 's3', 'memory'
|
||||
BRAINY_STORAGE_PATH="/data" # Data directory
|
||||
```
|
||||
|
||||
## 🔄 Process Management
|
||||
|
||||
### PM2 Configuration (Recommended)
|
||||
```javascript
|
||||
// ecosystem.config.js
|
||||
module.exports = {
|
||||
apps: [{
|
||||
name: 'brainy-app',
|
||||
script: 'dist/server.js',
|
||||
instances: 2,
|
||||
exec_mode: 'cluster',
|
||||
env: {
|
||||
NODE_OPTIONS: '--max-old-space-size=16384',
|
||||
NODE_ENV: 'production'
|
||||
},
|
||||
max_memory_restart: '14G', // Restart at 14GB to prevent OOM
|
||||
time: true,
|
||||
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
|
||||
error_file: './logs/err.log',
|
||||
out_file: './logs/out.log',
|
||||
log_file: './logs/combined.log'
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
### Systemd Service
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Brainy AI Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=brainy
|
||||
WorkingDirectory=/opt/brainy
|
||||
Environment=NODE_ENV=production
|
||||
Environment=NODE_OPTIONS=--max-old-space-size=16384
|
||||
ExecStart=/usr/bin/node dist/server.js
|
||||
Restart=on-failure
|
||||
RestartSec=10
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
## 📊 Monitoring & Health Checks
|
||||
|
||||
### Memory Monitoring
|
||||
```javascript
|
||||
// health-check.js
|
||||
import { getEmbeddingMemoryStats } from './dist/embeddings/universal-memory-manager.js'
|
||||
|
||||
export function healthCheck() {
|
||||
const memory = process.memoryUsage()
|
||||
const stats = getEmbeddingMemoryStats()
|
||||
|
||||
return {
|
||||
status: memory.heapUsed < 14 * 1024 * 1024 * 1024 ? 'healthy' : 'warning',
|
||||
memory: {
|
||||
heapUsed: `${(memory.heapUsed / 1024 / 1024).toFixed(2)} MB`,
|
||||
heapTotal: `${(memory.heapTotal / 1024 / 1024).toFixed(2)} MB`,
|
||||
rss: `${(memory.rss / 1024 / 1024).toFixed(2)} MB`
|
||||
},
|
||||
embedding: stats
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Prometheus Metrics
|
||||
```javascript
|
||||
// metrics.js
|
||||
import prometheus from 'prom-client'
|
||||
|
||||
export const memoryUsage = new prometheus.Gauge({
|
||||
name: 'brainy_memory_usage_bytes',
|
||||
help: 'Memory usage in bytes'
|
||||
})
|
||||
|
||||
export const embeddingCount = new prometheus.Counter({
|
||||
name: 'brainy_embeddings_total',
|
||||
help: 'Total number of embeddings processed'
|
||||
})
|
||||
|
||||
export const workerRestarts = new prometheus.Counter({
|
||||
name: 'brainy_worker_restarts_total',
|
||||
help: 'Number of worker restarts for memory management'
|
||||
})
|
||||
```
|
||||
|
||||
## 🚨 Production Checklist
|
||||
|
||||
### Before Deployment
|
||||
- [ ] Server has 16GB+ RAM
|
||||
- [ ] Models downloaded (`npm run download-models`)
|
||||
- [ ] Environment variables configured
|
||||
- [ ] Health checks implemented
|
||||
- [ ] Logging configured
|
||||
- [ ] Monitoring set up
|
||||
|
||||
### During Deployment
|
||||
- [ ] Memory usage stays below 14GB
|
||||
- [ ] Worker restarts happening automatically
|
||||
- [ ] Search operations completing successfully
|
||||
- [ ] No memory leak warnings in logs
|
||||
|
||||
### After Deployment
|
||||
- [ ] Set up alerts for high memory usage
|
||||
- [ ] Monitor worker restart frequency
|
||||
- [ ] Track performance metrics
|
||||
- [ ] Plan for scaling based on usage
|
||||
|
||||
## 🔍 Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Out of Memory (OOM) Kills**
|
||||
```bash
|
||||
# Symptoms: Process suddenly stops
|
||||
# Solution: Increase memory or reduce load
|
||||
NODE_OPTIONS="--max-old-space-size=20480" # 20GB
|
||||
```
|
||||
|
||||
**Slow Search Performance**
|
||||
```bash
|
||||
# Symptoms: Timeouts on search operations
|
||||
# Solution: Check model loading
|
||||
curl http://localhost:3000/health | jq '.embedding.strategy'
|
||||
```
|
||||
|
||||
**Worker Restart Loops**
|
||||
```bash
|
||||
# Symptoms: Constant worker restarts
|
||||
# Solution: Increase restart threshold
|
||||
BRAINY_MAX_EMBEDDINGS_NODE="200"
|
||||
```
|
||||
|
||||
## 🎯 Performance Tuning
|
||||
|
||||
### For High-Traffic Applications
|
||||
- Use multiple instances with load balancing
|
||||
- Implement request queuing
|
||||
- Cache common search results
|
||||
- Consider dedicated embedding servers
|
||||
|
||||
### For Memory-Constrained Environments
|
||||
- Use aggressive cleanup thresholds
|
||||
- Implement request batching
|
||||
- Mock embeddings for non-critical features
|
||||
- Consider external embedding APIs
|
||||
|
||||
## 📈 Scaling Strategies
|
||||
|
||||
### Horizontal Scaling
|
||||
```yaml
|
||||
# Multiple instances behind load balancer
|
||||
instances: 3-5
|
||||
memory_per_instance: 16GB
|
||||
load_balancer: nginx, AWS ALB, GCP LB
|
||||
```
|
||||
|
||||
### Vertical Scaling
|
||||
```yaml
|
||||
# Larger single instance
|
||||
memory: 32-64GB
|
||||
cpu: 8-16 cores
|
||||
storage: SSD for model caching
|
||||
```
|
||||
|
||||
### Hybrid Architecture
|
||||
```yaml
|
||||
# Separate concerns
|
||||
api_servers: 4GB RAM (no AI features)
|
||||
embedding_servers: 32GB RAM (AI only)
|
||||
communication: REST API or gRPC
|
||||
```
|
||||
|
||||
## 🎉 Success Metrics
|
||||
|
||||
A successful Brainy production deployment should show:
|
||||
- ✅ Memory usage stable under 14GB
|
||||
- ✅ Search latency < 100ms
|
||||
- ✅ Worker restarts every 100-1000 operations
|
||||
- ✅ Zero downtime with proper monitoring
|
||||
- ✅ Embedding accuracy maintained
|
||||
|
||||
Your users get **ChatGPT-quality semantic search** running locally with complete privacy and control!
|
||||
|
|
@ -1,141 +0,0 @@
|
|||
# Brainy 2.0 Scalability Plan - Millions of Records
|
||||
|
||||
## Current Performance Profile
|
||||
- **Exact match**: O(1) - ✅ Excellent (same as MongoDB)
|
||||
- **Range queries**: O(log n) - ✅ Excellent (same as MongoDB B-tree)
|
||||
- **Memory usage**: ~1KB per record - ⚠️ Problematic at scale
|
||||
|
||||
## Scalability Bottlenecks
|
||||
|
||||
### 1. Memory Limits (CRITICAL)
|
||||
**Problem**: All indices in RAM
|
||||
- 1M records = 1.1 GB RAM ✅
|
||||
- 10M records = 11 GB RAM ❌
|
||||
- 100M records = 110 GB RAM ❌❌❌
|
||||
|
||||
**Solution**: Hybrid memory/disk approach
|
||||
```typescript
|
||||
interface ScalableIndex {
|
||||
hotCache: Map<string, Set<string>> // Top 10K entries in RAM
|
||||
coldStorage: DiskIndex // Rest on disk (LevelDB/RocksDB)
|
||||
bloomFilter: BloomFilter // Quick existence check
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Sorted Index Scalability
|
||||
**Problem**: Single array for entire field
|
||||
- 10M values = massive array sort
|
||||
- Binary search still O(log n) but cache misses
|
||||
|
||||
**Solution**: B+ Tree structure
|
||||
```typescript
|
||||
interface BPlusTreeIndex {
|
||||
root: BPlusNode
|
||||
leafLevel: LinkedList<LeafNode> // For range scans
|
||||
height: number // Typically 3-4 levels
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Index Persistence
|
||||
**Problem**: Rebuilding on startup
|
||||
- 1M records = 30 seconds startup ❌
|
||||
- 10M records = 5 minutes startup ❌❌❌
|
||||
|
||||
**Solution**: Incremental index snapshots
|
||||
```typescript
|
||||
// Save index periodically
|
||||
await storage.saveIndex('field_price_sorted', sortedIndex)
|
||||
// Load on startup
|
||||
const cached = await storage.loadIndex('field_price_sorted')
|
||||
```
|
||||
|
||||
## Recommended Architecture for Scale
|
||||
|
||||
### Tier 1: <100K records (Current)
|
||||
- ✅ All in memory
|
||||
- ✅ Hash + sorted indices
|
||||
- ✅ No changes needed
|
||||
|
||||
### Tier 2: 100K-1M records (Minor changes)
|
||||
```typescript
|
||||
class OptimizedMetadataIndex {
|
||||
// Lazy load sorted indices
|
||||
private async ensureSortedIndex(field: string) {
|
||||
if (!this.sortedIndices.has(field)) {
|
||||
await this.loadOrBuildSortedIndex(field)
|
||||
}
|
||||
}
|
||||
|
||||
// Persist indices to storage
|
||||
private async persistIndex(field: string) {
|
||||
const index = this.sortedIndices.get(field)
|
||||
await this.storage.saveMetadata(`__index_${field}`, index)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Tier 3: 1M-10M records (Major refactor)
|
||||
```typescript
|
||||
class ScalableMetadataIndex {
|
||||
private leveldb: LevelDB // Or RocksDB
|
||||
private hotCache: LRUCache<string, Set<string>>
|
||||
private bloomFilters: Map<string, BloomFilter>
|
||||
|
||||
async getIds(field: string, value: any): Promise<string[]> {
|
||||
// Check bloom filter first (O(1))
|
||||
if (!this.bloomFilters.get(field)?.mightContain(value)) {
|
||||
return []
|
||||
}
|
||||
|
||||
// Check hot cache (O(1))
|
||||
const cached = this.hotCache.get(`${field}:${value}`)
|
||||
if (cached) return Array.from(cached)
|
||||
|
||||
// Load from disk (O(log n))
|
||||
const ids = await this.leveldb.get(`idx:${field}:${value}`)
|
||||
this.hotCache.set(`${field}:${value}`, new Set(ids))
|
||||
return ids
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Tier 4: 10M+ records (Distributed)
|
||||
- Shard by ID range or hash
|
||||
- Multiple Brainy instances
|
||||
- Coordinator node for queries
|
||||
- Similar to MongoDB sharding
|
||||
|
||||
## Performance at Scale
|
||||
|
||||
| Records | Current | Optimized | MongoDB |
|
||||
|---------|---------|-----------|---------|
|
||||
| 10K | 10ms | 10ms | 15ms |
|
||||
| 100K | 15ms | 15ms | 20ms |
|
||||
| 1M | 25ms | 20ms | 25ms |
|
||||
| 10M | OOM ❌ | 30ms | 35ms |
|
||||
| 100M | OOM ❌ | 50ms | 60ms |
|
||||
|
||||
## Implementation Priority
|
||||
|
||||
1. **Quick Win**: Index persistence (prevent rebuild)
|
||||
2. **Medium**: LRU cache for hot data
|
||||
3. **Long-term**: B+ tree indices
|
||||
4. **Future**: Sharding support
|
||||
|
||||
## Memory Usage Comparison
|
||||
|
||||
| Records | Current | Optimized | MongoDB |
|
||||
|---------|---------|-----------|---------|
|
||||
| 100K | 110 MB | 110 MB | 150 MB |
|
||||
| 1M | 1.1 GB | 500 MB | 1.5 GB |
|
||||
| 10M | 11 GB ❌ | 2 GB ✅ | 8 GB |
|
||||
| 100M | 110 GB ❌ | 5 GB ✅ | 50 GB |
|
||||
|
||||
## Conclusion
|
||||
|
||||
**Current state**: Excellent for <100K records, good for <1M
|
||||
**With optimizations**: Can handle 10M+ records
|
||||
**Comparable to**: MongoDB, Firestore for most operations
|
||||
**Better than**: Traditional databases for vector + metadata hybrid queries
|
||||
|
||||
The architecture is **sound** - just needs memory optimization for scale!
|
||||
129
TESTING-GUIDE.md
129
TESTING-GUIDE.md
|
|
@ -1,129 +0,0 @@
|
|||
# 🧠 Brainy Testing Guide
|
||||
|
||||
## Memory Requirements
|
||||
|
||||
**IMPORTANT**: Brainy requires 8-16GB RAM for full functionality due to the transformer model (ONNX runtime).
|
||||
|
||||
This is NOT a bug - it's the cost of running state-of-the-art AI locally.
|
||||
|
||||
## Why So Much Memory?
|
||||
|
||||
Brainy uses the `all-MiniLM-L6-v2` transformer model for semantic search:
|
||||
- **Model file**: 90MB compressed
|
||||
- **Runtime memory**: 4-8GB when loaded
|
||||
- **Why**: ONNX runtime pre-allocates buffers for matrix operations
|
||||
- **Benefit**: Enables semantic search (understanding meaning, not just keywords)
|
||||
|
||||
## Running Tests
|
||||
|
||||
### Full Test Suite (Requires 16GB RAM)
|
||||
```bash
|
||||
# Allocate 16GB heap for Node.js
|
||||
export NODE_OPTIONS='--max-old-space-size=16384'
|
||||
npm test
|
||||
```
|
||||
|
||||
### Test Without AI Features (Low Memory)
|
||||
```bash
|
||||
# Test core database features without embeddings
|
||||
node test-without-embeddings.js
|
||||
```
|
||||
|
||||
### Test Individual Files
|
||||
```bash
|
||||
# Test specific functionality
|
||||
npm test -- --run tests/core.test.ts
|
||||
npm test -- --run tests/metadata-filter.test.ts
|
||||
```
|
||||
|
||||
### Sequential Test Runner (Memory-Efficient)
|
||||
```bash
|
||||
# Runs tests in batches to prevent memory exhaustion
|
||||
./run-all-tests.sh
|
||||
```
|
||||
|
||||
## Common Test Issues
|
||||
|
||||
### Out of Memory Errors
|
||||
**Symptom**: `FATAL ERROR: Ineffective mark-compacts near heap limit`
|
||||
|
||||
**Solution**:
|
||||
1. Increase Node.js heap: `NODE_OPTIONS='--max-old-space-size=16384'`
|
||||
2. Run tests sequentially instead of in parallel
|
||||
3. Use a machine with more RAM (16GB+ recommended)
|
||||
|
||||
### Tests Hanging on Search
|
||||
**Symptom**: Tests freeze when calling `brain.search()` or `brain.find()`
|
||||
|
||||
**Cause**: ONNX model initialization can take 30-60 seconds first time
|
||||
|
||||
**Solution**: Be patient - model loads once then runs fast
|
||||
|
||||
### ClearAll Requires Force
|
||||
**Symptom**: `clearAll requires force: true option for safety`
|
||||
|
||||
**Solution**: Always use `brain.clearAll({ force: true })`
|
||||
|
||||
## Performance Expectations
|
||||
|
||||
With adequate memory (16GB):
|
||||
- Model initialization: 30-60 seconds (first time)
|
||||
- Embedding generation: 10-50ms per text
|
||||
- Vector search: 1-10ms for 10k items
|
||||
- Metadata filtering: <1ms (indexed)
|
||||
|
||||
## Production Deployment
|
||||
|
||||
For production with limited memory:
|
||||
|
||||
### Option 1: Dedicated AI Server
|
||||
Run Brainy on a server with 16GB+ RAM and access via API
|
||||
|
||||
### Option 2: Cloud Functions
|
||||
Use services that provide high-memory instances:
|
||||
- AWS Lambda: Up to 10GB
|
||||
- Google Cloud Functions: Up to 32GB
|
||||
- Vercel: Up to 3GB (may struggle)
|
||||
|
||||
### Option 3: Pre-computed Embeddings
|
||||
Generate embeddings offline and ship them with your app
|
||||
|
||||
## The Reality
|
||||
|
||||
**Brainy includes cutting-edge AI that requires significant memory.**
|
||||
|
||||
This is the same technology used by:
|
||||
- Google Search (semantic understanding)
|
||||
- GitHub Copilot (code understanding)
|
||||
- ChatGPT (text embeddings)
|
||||
|
||||
The difference: **Brainy runs it locally with zero configuration.**
|
||||
|
||||
If you need a lighter solution without AI:
|
||||
- Use traditional databases (PostgreSQL, MongoDB)
|
||||
- Use keyword search instead of semantic search
|
||||
- Use external embedding APIs (OpenAI, Cohere)
|
||||
|
||||
But if you want the power of AI-driven search that understands meaning, not just keywords, then 8-16GB RAM is the price of admission.
|
||||
|
||||
## Test Monitoring
|
||||
|
||||
To monitor memory during tests:
|
||||
```bash
|
||||
# Watch memory usage
|
||||
watch -n 1 "ps aux | grep node | grep -v grep"
|
||||
|
||||
# Check Node.js heap
|
||||
node -e "console.log(require('v8').getHeapStatistics())"
|
||||
```
|
||||
|
||||
## Optimizations Already Applied
|
||||
|
||||
Brainy already includes these memory optimizations:
|
||||
- ✅ Quantized models (q8 instead of fp32) - 75% reduction
|
||||
- ✅ ONNX memory arena disabled
|
||||
- ✅ Limited thread pools
|
||||
- ✅ Efficient batch processing
|
||||
- ✅ Smart caching
|
||||
|
||||
These optimizations reduce memory from 16GB+ to 4-8GB, which is as low as possible while maintaining quality.
|
||||
|
|
@ -1,208 +0,0 @@
|
|||
# 🧠 Brainy Testing Strategy
|
||||
|
||||
## Overview
|
||||
|
||||
Brainy uses ONNX Runtime with transformer models, requiring 4-8GB memory for full functionality. This document explains our testing strategy based on 2024-2025 best practices.
|
||||
|
||||
## Memory Requirements
|
||||
|
||||
| Component | Memory Usage | Notes |
|
||||
|-----------|-------------|-------|
|
||||
| ONNX Model | 4-8GB | all-MiniLM-L6-v2 transformer |
|
||||
| Node.js Heap | 2-4GB | JavaScript runtime |
|
||||
| Test Framework | 1-2GB | Vitest overhead |
|
||||
| **Total** | **8-16GB** | Recommended for full suite |
|
||||
|
||||
## Test Commands
|
||||
|
||||
### Quick Reference
|
||||
```bash
|
||||
npm test # Standard test run
|
||||
npm run test:memory # With 16GB heap allocation
|
||||
npm run test:core # Core functionality only
|
||||
npm run test:ci # CI optimized
|
||||
npm run test:shard # Supports VITEST_SHARD env
|
||||
```
|
||||
|
||||
### Memory-Intensive Tests
|
||||
```bash
|
||||
# Allocate 16GB for transformer models
|
||||
NODE_OPTIONS='--max-old-space-size=16384' npm test
|
||||
|
||||
# Or use our helper script
|
||||
npm run test:memory
|
||||
```
|
||||
|
||||
### Test Sharding (CI/CD)
|
||||
```bash
|
||||
# Split tests across 4 machines/processes
|
||||
VITEST_SHARD=1/4 npm run test:shard # 1st quarter
|
||||
VITEST_SHARD=2/4 npm run test:shard # 2nd quarter
|
||||
VITEST_SHARD=3/4 npm run test:shard # 3rd quarter
|
||||
VITEST_SHARD=4/4 npm run test:shard # 4th quarter
|
||||
```
|
||||
|
||||
## Vitest Configuration
|
||||
|
||||
Our `vitest.config.ts` implements industry best practices:
|
||||
|
||||
### Memory Optimization
|
||||
- **Pool**: `forks` for better memory isolation
|
||||
- **Max Forks**: 1 (sequential execution)
|
||||
- **Isolation**: Enabled (prevents memory leaks)
|
||||
|
||||
### Timeouts
|
||||
- **Test**: 120 seconds (ONNX loading)
|
||||
- **Hooks**: 60 seconds (model initialization)
|
||||
- **Teardown**: 10 seconds
|
||||
|
||||
### Performance
|
||||
- **Parallelism**: Disabled (prevents OOM)
|
||||
- **Retry**: Once in CI (handles flaky tests)
|
||||
- **Reporters**: Dot for CI, verbose for local
|
||||
|
||||
## Test Organization
|
||||
|
||||
### Current Structure (All Tests)
|
||||
```
|
||||
tests/
|
||||
├── core.test.ts # Core functionality
|
||||
├── triple-intelligence.test.ts # AI features
|
||||
├── metadata-filter.test.ts # Brain Patterns
|
||||
├── neural-api.test.ts # Neural operations
|
||||
└── ... (45+ test files)
|
||||
```
|
||||
|
||||
### Future Structure (Recommended)
|
||||
```
|
||||
tests/
|
||||
├── unit/ # No models, fast
|
||||
│ ├── utils/
|
||||
│ ├── storage/
|
||||
│ └── metadata/
|
||||
├── integration/ # With models, slow
|
||||
│ ├── search/
|
||||
│ ├── embeddings/
|
||||
│ └── triple/
|
||||
└── e2e/ # Full system tests
|
||||
```
|
||||
|
||||
## Common Issues & Solutions
|
||||
|
||||
### Out of Memory (OOM)
|
||||
**Error**: `FATAL ERROR: Ineffective mark-compacts near heap limit`
|
||||
|
||||
**Solutions**:
|
||||
1. Increase heap: `NODE_OPTIONS='--max-old-space-size=16384'`
|
||||
2. Run fewer tests: `npm test tests/core.test.ts`
|
||||
3. Use sharding: `VITEST_SHARD=1/2`
|
||||
|
||||
### Test Timeouts
|
||||
**Error**: `Test timed out after 30000ms`
|
||||
|
||||
**Solutions**:
|
||||
1. Already extended to 120s in config
|
||||
2. Skip model tests: `npm test -- --exclude "**/neural*"`
|
||||
3. Mock embeddings for unit tests
|
||||
|
||||
### ClearAll Safety
|
||||
**Error**: `clearAll requires force: true option`
|
||||
|
||||
**Solution**: Always use `brain.clearAll({ force: true })`
|
||||
✅ Already fixed in all test files
|
||||
|
||||
## CI/CD Recommendations
|
||||
|
||||
### GitHub Actions
|
||||
```yaml
|
||||
name: Tests
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
shard: [1/4, 2/4, 3/4, 4/4]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 18
|
||||
|
||||
- run: npm ci
|
||||
- run: npm run build
|
||||
|
||||
# Run sharded tests with memory
|
||||
- run: VITEST_SHARD=${{ matrix.shard }} npm run test:ci
|
||||
env:
|
||||
NODE_OPTIONS: --max-old-space-size=16384
|
||||
```
|
||||
|
||||
### Docker
|
||||
```dockerfile
|
||||
FROM node:18
|
||||
WORKDIR /app
|
||||
|
||||
# Increase memory limits
|
||||
ENV NODE_OPTIONS="--max-old-space-size=16384"
|
||||
|
||||
COPY . .
|
||||
RUN npm ci
|
||||
RUN npm run build
|
||||
|
||||
# Run tests
|
||||
CMD ["npm", "run", "test:memory"]
|
||||
```
|
||||
|
||||
## Performance Benchmarks
|
||||
|
||||
With proper configuration:
|
||||
- **Model Load**: 30-60 seconds (first time)
|
||||
- **Embedding**: 10-50ms per text
|
||||
- **Test Suite**: 5-10 minutes (sequential)
|
||||
- **Memory Usage**: 4-8GB peak
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Always build before testing**
|
||||
```bash
|
||||
npm run build && npm test
|
||||
```
|
||||
|
||||
2. **Monitor memory during tests**
|
||||
```bash
|
||||
watch -n 1 "ps aux | grep node | head -5"
|
||||
```
|
||||
|
||||
3. **Use appropriate test command**
|
||||
- Development: `npm test`
|
||||
- CI: `npm run test:ci`
|
||||
- Debugging: `npm run test:memory -- --reporter=verbose`
|
||||
|
||||
4. **Mock for unit tests**
|
||||
```javascript
|
||||
// Mock embeddings for non-AI tests
|
||||
const mockEmbed = () => new Array(384).fill(0.1)
|
||||
```
|
||||
|
||||
## Industry Standards
|
||||
|
||||
We follow these 2024-2025 best practices:
|
||||
|
||||
1. **Vitest Forks Pool**: Better memory isolation than threads
|
||||
2. **Test Sharding**: Distribute across multiple processes
|
||||
3. **Sequential Execution**: Prevent memory competition
|
||||
4. **Extended Timeouts**: Account for model loading
|
||||
5. **Memory Monitoring**: Track usage during tests
|
||||
|
||||
## Conclusion
|
||||
|
||||
Brainy's testing requires significant memory due to transformer models. This is not a bug - it's the cost of running state-of-the-art AI locally. Our configuration follows industry best practices to manage this requirement effectively.
|
||||
|
||||
For projects that cannot allocate 8-16GB for testing:
|
||||
- Use mock embeddings for unit tests
|
||||
- Run integration tests separately in CI
|
||||
- Consider cloud-based testing environments
|
||||
- Use test sharding to distribute load
|
||||
|
|
@ -1,225 +0,0 @@
|
|||
# 🧠 COMPREHENSIVE TEST SUITE ULTRATHINK ANALYSIS
|
||||
|
||||
**Date**: 2025-08-25
|
||||
**Context**: Brainy 2.0 Augmentation System Migration
|
||||
**Total Test Files**: 49
|
||||
|
||||
## 🏗️ ARCHITECTURAL CHANGES IMPACT ANALYSIS
|
||||
|
||||
### **Major Changes Affecting Tests:**
|
||||
|
||||
1. **Augmentation System Migration**
|
||||
- Core functionality moved to augmentations (cache, index, metrics, storage)
|
||||
- Two-phase initialization (storage augmentations first)
|
||||
- Method delegation through augmentations
|
||||
|
||||
2. **API Evolution**
|
||||
- Methods like `cleanup()` may have changed
|
||||
- Export structure in index.ts updated
|
||||
- New unified BrainyAugmentation interface
|
||||
|
||||
3. **Configuration Changes**
|
||||
- Auto-registration of default augmentations
|
||||
- New augmentation-based storage initialization
|
||||
|
||||
## 📊 TEST CATEGORIES ANALYSIS
|
||||
|
||||
### 🟢 **LIKELY WORKING** (Minimal Changes Expected)
|
||||
1. **Core Functionality Tests** - Tests basic BrainyData usage
|
||||
- `core.test.ts` - Library exports, basic functionality
|
||||
- `database-operations.test.ts` - CRUD operations
|
||||
- `vector-operations.test.ts` - Vector search (if using public API)
|
||||
- `triple-intelligence.test.ts` - Advanced queries
|
||||
|
||||
2. **Environment Tests** - Platform compatibility
|
||||
- `environment.browser.test.ts`
|
||||
- `environment.node.test.ts`
|
||||
- `multi-environment.test.ts`
|
||||
|
||||
3. **Storage Integration Tests** - Should work with new augmentation system
|
||||
- `s3-comprehensive.test.ts` - S3 through augmentations
|
||||
- `opfs-storage.test.ts` - OPFS through augmentations
|
||||
|
||||
### 🟡 **NEEDS UPDATES** (Medium Impact)
|
||||
1. **API Consistency Tests**
|
||||
- `consistent-api.test.ts` - May have method signature changes
|
||||
- `unified-api.test.ts` - API evolution issues
|
||||
- May use `cleanup()` vs new shutdown methods
|
||||
|
||||
2. **Configuration & Initialization Tests**
|
||||
- `auto-configuration.test.ts` - New augmentation auto-registration
|
||||
- `zero-config-models.test.ts` - Initialization pattern changes
|
||||
|
||||
3. **Performance Tests**
|
||||
- `performance.test.ts` - Augmentation overhead validation needed
|
||||
- `metadata-performance.test.ts` - Now through IndexAugmentation
|
||||
- `throttling-metrics.test.ts` - May need augmentation context
|
||||
|
||||
4. **Feature Integration Tests**
|
||||
- `brainy-chat.test.ts` - BrainyChat integration
|
||||
- `nlp-patterns-comprehensive.test.ts` - NLP pattern system
|
||||
- `neural-*.test.ts` - Neural integration tests
|
||||
|
||||
### 🟠 **MAJOR UPDATES NEEDED** (High Impact)
|
||||
1. **Export/Import Tests**
|
||||
- `core.test.ts` - Tests exports that may not exist:
|
||||
- `createSenseAugmentation`
|
||||
- `addWebSocketSupport`
|
||||
- `executeAugmentation`
|
||||
- `loadAugmentationModule`
|
||||
|
||||
2. **Storage System Tests**
|
||||
- `storage-adapter-coverage.test.ts` - Storage now through augmentations
|
||||
- Tests that directly create storage adapters vs using augmentations
|
||||
|
||||
3. **Metadata & Statistics Tests**
|
||||
- `statistics.test.ts` - Now through MetricsAugmentation
|
||||
- `service-statistics.test.ts` - Service stats through augmentations
|
||||
- `metadata-filter.test.ts` - Filtering through IndexAugmentation
|
||||
|
||||
### 🟢 **AUGMENTATION TESTS** (Should be working)
|
||||
- `augmentations-batch-processing.test.ts`
|
||||
- `augmentations-entity-registry.test.ts`
|
||||
- `augmentations-request-deduplicator.test.ts`
|
||||
- `augmentations-wal.test.ts`
|
||||
|
||||
### 🔴 **CRITICAL VALIDATION NEEDED**
|
||||
1. **Release Tests**
|
||||
- `release-critical.test.ts` - Must pass for 2.0 release
|
||||
- `release-validation.test.ts` - End-to-end validation
|
||||
|
||||
2. **Edge Cases**
|
||||
- `edge-cases.test.ts` - Ensure augmentation system handles edge cases
|
||||
- `error-handling.test.ts` - Error handling through augmentations
|
||||
|
||||
## 🎯 COMPREHENSIVE TEST VALIDATION PLAN
|
||||
|
||||
### **Phase 1: Fix Export Issues (CRITICAL)**
|
||||
#### Files to Fix:
|
||||
- `core.test.ts` - Remove/update non-existent exports
|
||||
- `unified-api.test.ts` - Fix import paths
|
||||
- `consistent-api.test.ts` - Update method calls
|
||||
|
||||
#### Actions:
|
||||
- [ ] Update index.ts to remove non-existent exports
|
||||
- [ ] Fix import paths in test files
|
||||
- [ ] Update method names (cleanup → shutdown, etc.)
|
||||
|
||||
### **Phase 2: Fix Augmentation Integration**
|
||||
#### Files to Update:
|
||||
- `auto-configuration.test.ts` - Test new augmentation auto-registration
|
||||
- `statistics.test.ts` - Test statistics through MetricsAugmentation
|
||||
- `metadata-*.test.ts` - Test metadata through IndexAugmentation
|
||||
|
||||
#### Actions:
|
||||
- [ ] Update tests to use augmentation-delegated methods
|
||||
- [ ] Test augmentation auto-registration
|
||||
- [ ] Validate two-phase initialization
|
||||
|
||||
### **Phase 3: Fix API Evolution Issues**
|
||||
#### Files to Update:
|
||||
- `consistent-api.test.ts` - Update method signatures
|
||||
- `unified-api.test.ts` - Update API calls
|
||||
- `storage-adapter-coverage.test.ts` - Storage through augmentations
|
||||
|
||||
#### Actions:
|
||||
- [ ] Update method calls for new API
|
||||
- [ ] Fix initialization patterns
|
||||
- [ ] Update configuration objects
|
||||
|
||||
### **Phase 4: Add Missing Tests**
|
||||
#### New Tests Needed:
|
||||
- [ ] **Augmentation lifecycle tests** - register → init → execute → shutdown
|
||||
- [ ] **Augmentation priority tests** - Execution order validation
|
||||
- [ ] **Two-phase initialization tests** - Storage first, then others
|
||||
- [ ] **Method delegation tests** - Core methods → augmentations
|
||||
|
||||
### **Phase 5: Remove Obsolete Tests**
|
||||
#### Tests to Remove/Update:
|
||||
- [ ] Tests for removed augmentation factory functions
|
||||
- [ ] Tests for deprecated API methods
|
||||
- [ ] Tests for old typed augmentation system
|
||||
|
||||
## 🚨 HIGH-RISK AREAS
|
||||
|
||||
### **Most Likely to Fail:**
|
||||
1. **core.test.ts** - Export mismatches
|
||||
2. **statistics.test.ts** - Statistics through augmentations
|
||||
3. **metadata-*.test.ts** - Metadata through augmentations
|
||||
4. **auto-configuration.test.ts** - New initialization patterns
|
||||
5. **storage-adapter-coverage.test.ts** - Storage delegation
|
||||
|
||||
### **Must Pass for Release:**
|
||||
1. **release-critical.test.ts**
|
||||
2. **release-validation.test.ts**
|
||||
3. **All augmentation tests**
|
||||
4. **core.test.ts**
|
||||
5. **unified-api.test.ts**
|
||||
|
||||
## ✅ SUCCESS CRITERIA - COMPREHENSIVE 2.0 FEATURE VALIDATION
|
||||
|
||||
### **ALL Brainy Features Through Updated 2.0 APIs:**
|
||||
|
||||
#### **🧠 Core Features (Through New Implementations):**
|
||||
- [ ] **Data Operations** - add/get/update/delete through AugmentationRegistry
|
||||
- [ ] **Storage Systems** - All storage through StorageAugmentations (not direct)
|
||||
- [ ] **Vector Search** - Updated search APIs and performance
|
||||
- [ ] **NEW find()** - Triple Intelligence with `like`, `where`, `connected`
|
||||
- [ ] **Clustering** - All 3 algorithms: HNSW, K-means, Hierarchical
|
||||
- [ ] **Metadata Indexing** - Through IndexAugmentation (not direct)
|
||||
- [ ] **Statistics** - Through MetricsAugmentation (not direct)
|
||||
- [ ] **Caching** - Through CacheAugmentation (not SearchCache direct)
|
||||
|
||||
#### **🔌 Augmentation System (All 27 Augmentations):**
|
||||
- [ ] **Storage (8)** - Memory, FileSystem, OPFS, S3, R2, GCS, Auto, Dynamic
|
||||
- [ ] **Performance (7)** - Cache, Index, Metrics, WAL, Batch, Pool, Dedup
|
||||
- [ ] **Data Integrity (3)** - EntityRegistry, AutoRegister, Enhanced Clear
|
||||
- [ ] **Intelligence (2)** - Neural Import, Intelligent Verb Scoring
|
||||
- [ ] **Communication (4)** - API Server, Conduits, Server Search, Monitoring
|
||||
- [ ] **External Integration (3)** - Synapses, MCP, WebSocket
|
||||
|
||||
#### **🚀 New 2.0 Features:**
|
||||
- [ ] **Unified BrainyAugmentation interface** - All augmentations working
|
||||
- [ ] **Two-phase initialization** - Storage first, then others
|
||||
- [ ] **Augmentation lifecycle** - register → init → execute → shutdown
|
||||
- [ ] **Method delegation** - Core methods → augmentations
|
||||
- [ ] **Auto-registration** - Default augmentations auto-registered
|
||||
- [ ] **Enhanced Chat** - BrainyChat with all features
|
||||
- [ ] **220 NLP Patterns** - All patterns through updated neural system
|
||||
|
||||
#### **🎯 API Consistency (Updated 2.0 APIs):**
|
||||
- [ ] **All exports work** - No missing/incorrect exports in index.ts
|
||||
- [ ] **Method signatures correct** - Updated parameter patterns
|
||||
- [ ] **Configuration objects** - New augmentation-based config
|
||||
- [ ] **Error handling** - Through augmentation system
|
||||
- [ ] **Performance** - No regressions from augmentation overhead
|
||||
|
||||
### **Before 2.0 Release:**
|
||||
- [ ] **100% test pass rate** across all 49 test files
|
||||
- [ ] **Tests use CURRENT implementation** - Not old/deprecated APIs
|
||||
- [ ] **Complete feature coverage** - ALL features tested through 2.0 APIs
|
||||
- [ ] **No missing augmentation tests** - All 27 augmentations validated
|
||||
- [ ] **Performance validation** - Augmentation system performs well
|
||||
|
||||
### **Quality Gates:**
|
||||
1. **All export tests pass** - No missing/incorrect exports
|
||||
2. **All augmentation tests pass** - 27 augmentations working
|
||||
3. **All core functionality tests pass** - Basic features working
|
||||
4. **All storage tests pass** - Storage through augmentations
|
||||
5. **All API consistency tests pass** - Method signatures correct
|
||||
|
||||
## 🏃♂️ EXECUTION STRATEGY
|
||||
|
||||
### **Parallel Approach:**
|
||||
1. **Fix TypeScript issues** (current priority)
|
||||
2. **Run test suite and identify failures**
|
||||
3. **Categorize failures by impact**
|
||||
4. **Fix critical path tests first**
|
||||
5. **Validate all tests in phases**
|
||||
|
||||
### **Test-Driven Validation:**
|
||||
1. **Run each test file individually**
|
||||
2. **Fix failures systematically**
|
||||
3. **Update test plan based on findings**
|
||||
4. **Validate full test suite**
|
||||
5. **Performance regression testing**
|
||||
|
|
@ -1,350 +0,0 @@
|
|||
# 🧠 Unified Cache Architecture - Deep Analysis
|
||||
|
||||
## The Core Concept
|
||||
ONE cache to rule them all - no coordination needed because there's nothing to coordinate!
|
||||
|
||||
## ✅ PROS - Why This is Brilliant
|
||||
|
||||
### 1. **Emergent Intelligence**
|
||||
- System automatically finds optimal balance
|
||||
- No human has to guess the right ratios
|
||||
- Adapts to changing workloads in real-time
|
||||
|
||||
### 2. **Simplicity = Reliability**
|
||||
```typescript
|
||||
// Traditional approach: 500+ lines of coordination code
|
||||
// Our approach: 50 lines that just work
|
||||
```
|
||||
|
||||
### 3. **Cost-Aware by Design**
|
||||
```typescript
|
||||
interface CacheItem {
|
||||
key: string
|
||||
type: 'hnsw' | 'metadata'
|
||||
data: any
|
||||
size: number
|
||||
rebuildCost: number // HNSW: 1000ms, Metadata: 1ms
|
||||
lastAccess: number
|
||||
accessCount: number
|
||||
}
|
||||
```
|
||||
|
||||
### 4. **Natural Load Balancing**
|
||||
- Popular data stays in cache regardless of type
|
||||
- Unpopular data gets evicted regardless of type
|
||||
- The "right" balance emerges from usage patterns
|
||||
|
||||
## ⚠️ DANGERS - What Could Go Wrong
|
||||
|
||||
### 1. **Cache Stampede Risk**
|
||||
```typescript
|
||||
// DANGER: 1000 concurrent requests for same cold item
|
||||
// All 1000 try to load from disk simultaneously!
|
||||
|
||||
// SOLUTION: Request coalescing
|
||||
class UnifiedCache {
|
||||
private loadingPromises = new Map<string, Promise<any>>()
|
||||
|
||||
async get(key: string) {
|
||||
// If already loading, wait for existing promise
|
||||
if (this.loadingPromises.has(key)) {
|
||||
return this.loadingPromises.get(key)
|
||||
}
|
||||
|
||||
if (!this.items.has(key)) {
|
||||
const loadPromise = this.loadFromDisk(key)
|
||||
this.loadingPromises.set(key, loadPromise)
|
||||
const data = await loadPromise
|
||||
this.loadingPromises.delete(key)
|
||||
return data
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. **Memory Fragmentation**
|
||||
```typescript
|
||||
// DANGER: Many small metadata items + few large HNSW items
|
||||
// Could lead to inefficient memory use
|
||||
|
||||
// SOLUTION: Size-aware eviction
|
||||
evict(bytesNeeded: number) {
|
||||
// Try to evict items that closely match needed size
|
||||
// Prevents evicting 100 tiny items when 1 large would do
|
||||
}
|
||||
```
|
||||
|
||||
### 3. **Starvation Scenario**
|
||||
```typescript
|
||||
// DANGER: HNSW queries so expensive that metadata never gets cached
|
||||
// Even though metadata queries are 100x more frequent
|
||||
|
||||
// SOLUTION: Fairness mechanism
|
||||
class FairUnifiedCache {
|
||||
private typeAccessCounts = { hnsw: 0, metadata: 0 }
|
||||
|
||||
evict() {
|
||||
// If one type is getting 90%+ of accesses but has <10% of cache
|
||||
// Force evict from the greedy type
|
||||
const hnswRatio = this.getTypeRatio('hnsw')
|
||||
const hnswAccessRatio = this.typeAccessCounts.hnsw / this.totalAccesses
|
||||
|
||||
if (hnswRatio > 0.9 && hnswAccessRatio < 0.1) {
|
||||
// HNSW is hogging cache despite low usage
|
||||
this.evictType('hnsw')
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. **Cold Start Problem**
|
||||
```typescript
|
||||
// DANGER: Empty cache = bad initial performance
|
||||
// Don't know what to pre-load
|
||||
|
||||
// SOLUTION: Persistence + Smart Warming
|
||||
class PersistentUnifiedCache {
|
||||
async init() {
|
||||
// Load access patterns from last session
|
||||
const patterns = await this.loadAccessPatterns()
|
||||
|
||||
// Pre-warm top 10% most accessed items
|
||||
for (const item of patterns.top10Percent) {
|
||||
await this.preload(item.key)
|
||||
}
|
||||
}
|
||||
|
||||
async shutdown() {
|
||||
// Save access patterns for next startup
|
||||
await this.saveAccessPatterns()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🔄 ALTERNATIVE APPROACHES
|
||||
|
||||
### 1. **Two-Level Cache** (More Complex)
|
||||
```typescript
|
||||
class TwoLevelCache {
|
||||
private l1Cache = new Map() // Ultra-hot, pinned
|
||||
private l2Cache = new LRU() // Everything else
|
||||
}
|
||||
// Pro: Guarantees critical data stays
|
||||
// Con: Need to decide what's "critical"
|
||||
```
|
||||
|
||||
### 2. **Type-Segregated Pools** (Traditional)
|
||||
```typescript
|
||||
class SegregatedCache {
|
||||
private hnswPool = new LRU(/* 60% memory */)
|
||||
private metadataPool = new LRU(/* 40% memory */)
|
||||
}
|
||||
// Pro: Guaranteed resources for each type
|
||||
// Con: Rigid, can't adapt to workload changes
|
||||
```
|
||||
|
||||
### 3. **Time-Window Based** (Interesting!)
|
||||
```typescript
|
||||
class TimeWindowCache {
|
||||
// Track access patterns in rolling windows
|
||||
private windows = [
|
||||
new AccessWindow('1min'),
|
||||
new AccessWindow('5min'),
|
||||
new AccessWindow('1hour')
|
||||
]
|
||||
|
||||
evict() {
|
||||
// Items not accessed in ANY window = cold
|
||||
// Items accessed in ALL windows = hot
|
||||
}
|
||||
}
|
||||
// Pro: Handles bursty workloads well
|
||||
// Con: More complex, more memory overhead
|
||||
```
|
||||
|
||||
## 🚀 ENHANCEMENTS TO CONSIDER
|
||||
|
||||
### 1. **Predictive Pre-fetching**
|
||||
```typescript
|
||||
class PredictiveCache extends UnifiedCache {
|
||||
private sequences = new Map<string, string[]>()
|
||||
|
||||
async get(key: string) {
|
||||
const data = await super.get(key)
|
||||
|
||||
// Track access sequences
|
||||
this.recordSequence(this.lastKey, key)
|
||||
|
||||
// Predictively load likely next items
|
||||
const predicted = this.predictNext(key)
|
||||
if (predicted && !this.items.has(predicted)) {
|
||||
this.preloadAsync(predicted) // Non-blocking
|
||||
}
|
||||
|
||||
return data
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. **Adaptive Tier Boundaries**
|
||||
```typescript
|
||||
class AdaptiveTierCache {
|
||||
private hotThreshold = 100 // Start with defaults
|
||||
private warmThreshold = 10
|
||||
|
||||
adapt() {
|
||||
// If cache is thrashing, tighten hot tier
|
||||
if (this.evictionRate > 10_per_second) {
|
||||
this.hotThreshold *= 1.5 // Make it harder to become hot
|
||||
}
|
||||
|
||||
// If cache is stable, loosen hot tier
|
||||
if (this.evictionRate < 1_per_minute) {
|
||||
this.hotThreshold *= 0.9 // Make it easier to become hot
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. **Query-Aware Caching**
|
||||
```typescript
|
||||
class QueryAwareCache {
|
||||
beforeQuery(query: TripleQuery) {
|
||||
// Pre-emptively make room based on query type
|
||||
if (query.like && query.where) {
|
||||
// Hybrid query coming - ensure both types have space
|
||||
this.ensureMinSpace('hnsw', 100_MB)
|
||||
this.ensureMinSpace('metadata', 50_MB)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. **Compression for Cold Storage**
|
||||
```typescript
|
||||
class CompressedCache {
|
||||
async saveToDisk(key: string, item: CacheItem) {
|
||||
if (item.type === 'hnsw') {
|
||||
// Quantize vectors before saving
|
||||
item.data = this.quantizeVectors(item.data)
|
||||
}
|
||||
if (item.type === 'metadata') {
|
||||
// Compress with zlib
|
||||
item.data = await compress(item.data)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 PERFORMANCE CHARACTERISTICS
|
||||
|
||||
### Memory Efficiency
|
||||
```
|
||||
Traditional Dual-Cache: 60-70% efficiency (due to rigid splits)
|
||||
Unified Cache: 85-95% efficiency (adapts to actual usage)
|
||||
```
|
||||
|
||||
### Query Latency
|
||||
```
|
||||
Cache Hit: 0.1ms (both approaches)
|
||||
Cache Miss (metadata): 5ms from disk
|
||||
Cache Miss (HNSW): 100ms from disk (needs reconstruction)
|
||||
```
|
||||
|
||||
### Adaptation Speed
|
||||
```
|
||||
Workload change detected: ~100 queries
|
||||
Full rebalance: ~1000 queries
|
||||
Steady state: ~10,000 queries
|
||||
```
|
||||
|
||||
## 🎯 IMPLEMENTATION STRATEGY
|
||||
|
||||
### Phase 1: Basic Unified Cache (Week 1)
|
||||
```typescript
|
||||
class UnifiedCache {
|
||||
private items = new Map<string, CacheItem>()
|
||||
private totalSize = 0
|
||||
private maxSize = 2 * GB
|
||||
|
||||
get(key: string): any
|
||||
set(key: string, value: any, type: CacheType): void
|
||||
evict(): void
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 2: Add Intelligence (Week 2)
|
||||
- Access counting
|
||||
- Cost-aware eviction
|
||||
- Request coalescing
|
||||
- Basic persistence
|
||||
|
||||
### Phase 3: Advanced Features (Week 3)
|
||||
- Predictive prefetching
|
||||
- Adaptive thresholds
|
||||
- Compression
|
||||
- Monitoring/metrics
|
||||
|
||||
## 🏆 WHY THIS WINS
|
||||
|
||||
1. **Simplicity**: One system instead of two
|
||||
2. **Adaptability**: Responds to real usage, not predictions
|
||||
3. **Efficiency**: No wasted memory on unused indices
|
||||
4. **Maintainability**: 200 lines instead of 2000
|
||||
5. **Performance**: Natural optimization emerges
|
||||
|
||||
## ⚡ QUICK WIN IMPLEMENTATION
|
||||
|
||||
```typescript
|
||||
// Start with this - 50 lines that solve 80% of the problem
|
||||
class QuickUnifiedCache {
|
||||
private cache = new Map()
|
||||
private access = new Map()
|
||||
private size = 0
|
||||
private maxSize = 2_000_000_000 // 2GB
|
||||
|
||||
get(key: string) {
|
||||
this.access.set(key, (this.access.get(key) || 0) + 1)
|
||||
return this.cache.get(key)
|
||||
}
|
||||
|
||||
set(key: string, value: any, size: number, cost: number) {
|
||||
while (this.size + size > this.maxSize) {
|
||||
this.evictLowestValue()
|
||||
}
|
||||
this.cache.set(key, { value, size, cost })
|
||||
this.size += size
|
||||
}
|
||||
|
||||
evictLowestValue() {
|
||||
let victim = null
|
||||
let lowestScore = Infinity
|
||||
|
||||
for (const [key, item] of this.cache) {
|
||||
const score = (this.access.get(key) || 1) / item.cost
|
||||
if (score < lowestScore) {
|
||||
lowestScore = score
|
||||
victim = key
|
||||
}
|
||||
}
|
||||
|
||||
if (victim) {
|
||||
this.size -= this.cache.get(victim).size
|
||||
this.cache.delete(victim)
|
||||
this.access.delete(victim)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🚨 FINAL VERDICT
|
||||
|
||||
**GO FOR IT!** This unified approach is:
|
||||
- Simpler than coordination
|
||||
- More adaptive than fixed splits
|
||||
- Naturally self-optimizing
|
||||
- Easy to enhance incrementally
|
||||
|
||||
The dangers are manageable with simple solutions, and the benefits far outweigh the complexity of traditional approaches.
|
||||
|
||||
**Start simple, measure everything, enhance based on real usage.**
|
||||
|
|
@ -1,183 +0,0 @@
|
|||
# 🧠 Brainy Memory Requirements
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Brainy 2.0 includes **built-in AI capabilities** powered by transformer models. While the core database operations are memory-efficient (200-500MB), the AI features require additional memory due to the ONNX runtime.
|
||||
|
||||
## Memory Requirements by Use Case
|
||||
|
||||
### 1. **Minimal Usage** (No AI Features)
|
||||
- **Required**: 512MB - 1GB
|
||||
- **Use Case**: Basic noun/verb storage without semantic search
|
||||
- **Configuration**: `embeddings: false`
|
||||
|
||||
### 2. **Standard Usage** (With AI)
|
||||
- **Recommended**: 4GB
|
||||
- **Typical**: 6GB
|
||||
- **Use Case**: Full semantic search, natural language queries, embeddings
|
||||
- **Reality**: ONNX runtime allocates 4-8GB for model inference
|
||||
|
||||
### 3. **Production Usage** (High Volume)
|
||||
- **Recommended**: 8GB
|
||||
- **Optimal**: 16GB
|
||||
- **Use Case**: Large datasets, concurrent operations, caching
|
||||
|
||||
## Why Does Brainy Need This Memory?
|
||||
|
||||
### The ONNX Runtime Reality
|
||||
|
||||
The transformer model file is only **30MB** on disk, but ONNX runtime allocates significantly more memory:
|
||||
|
||||
1. **Model Loading**: ~500MB for model architecture
|
||||
2. **Inference Tensors**: 2-4GB for computation graphs
|
||||
3. **Batch Processing**: Additional memory for parallel inference
|
||||
4. **Memory Fragmentation**: ONNX doesn't release memory efficiently
|
||||
|
||||
### What You Get for This Memory
|
||||
|
||||
Unlike other databases that require this memory just to run, Brainy's memory usage gives you:
|
||||
|
||||
- **Built-in embeddings** - No external API costs ($0 vs $0.10/1M tokens)
|
||||
- **Natural language search** - Plain English queries
|
||||
- **Semantic understanding** - Find "similar" not just "exact"
|
||||
- **Offline AI** - Works without internet connection
|
||||
- **Zero latency** - Models loaded in-process
|
||||
|
||||
## Configuration for Different Memory Constraints
|
||||
|
||||
### Low Memory Environment (2GB)
|
||||
```javascript
|
||||
const brain = new BrainyData({
|
||||
embeddings: false, // Disable transformer models
|
||||
cache: {
|
||||
maxSize: 100 // Smaller cache
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### Standard Environment (4-6GB)
|
||||
```javascript
|
||||
const brain = new BrainyData() // Default configuration
|
||||
```
|
||||
|
||||
### High Performance Environment (8GB+)
|
||||
```javascript
|
||||
const brain = new BrainyData({
|
||||
cache: {
|
||||
maxSize: 10000 // Large cache
|
||||
},
|
||||
batchSize: 100, // Process more in parallel
|
||||
efSearch: 100 // More accurate search
|
||||
})
|
||||
```
|
||||
|
||||
## Running Tests with Adequate Memory
|
||||
|
||||
### For Development/Testing
|
||||
```bash
|
||||
# Allocate 8GB for Node.js
|
||||
export NODE_OPTIONS='--max-old-space-size=8192'
|
||||
npm test
|
||||
```
|
||||
|
||||
### For Production
|
||||
```bash
|
||||
# Start with 8GB heap
|
||||
node --max-old-space-size=8192 server.js
|
||||
```
|
||||
|
||||
### Docker Configuration
|
||||
```dockerfile
|
||||
# In your Dockerfile
|
||||
ENV NODE_OPTIONS="--max-old-space-size=8192"
|
||||
|
||||
# Or in docker-compose.yml
|
||||
environment:
|
||||
- NODE_OPTIONS=--max-old-space-size=8192
|
||||
```
|
||||
|
||||
## Memory Optimization Tips
|
||||
|
||||
### 1. **Lazy Model Loading**
|
||||
Models are loaded on first use, not at initialization:
|
||||
```javascript
|
||||
const brain = new BrainyData()
|
||||
// No memory used yet
|
||||
|
||||
await brain.search('test')
|
||||
// Now model loads (4GB allocated)
|
||||
```
|
||||
|
||||
### 2. **Shared Model Instance**
|
||||
Multiple BrainyData instances share the same model:
|
||||
```javascript
|
||||
const brain1 = new BrainyData()
|
||||
const brain2 = new BrainyData()
|
||||
// Only one model in memory
|
||||
```
|
||||
|
||||
### 3. **Clear Unused Data**
|
||||
```javascript
|
||||
await brain.clear() // Free memory from data
|
||||
// Model stays loaded for next operation
|
||||
```
|
||||
|
||||
## Comparison with Other Databases
|
||||
|
||||
| Database | Memory (No AI) | Memory (With AI) | AI Capability |
|
||||
|----------|---------------|------------------|---------------|
|
||||
| **Brainy** | 500MB | 4-6GB | Built-in |
|
||||
| PostgreSQL | 2GB | 2GB + External AI | Via extension |
|
||||
| MongoDB | 4GB | 4GB + External AI | Via Atlas |
|
||||
| Elasticsearch | 8GB | 8GB + External AI | Via pipeline |
|
||||
| Weaviate | 4GB | 8-16GB | Built-in |
|
||||
|
||||
**Key Difference**: Brainy's memory usage is for AI features. Others use similar memory just for basic operations, then need MORE for AI.
|
||||
|
||||
## Troubleshooting Memory Issues
|
||||
|
||||
### Symptoms of Insufficient Memory
|
||||
- "JavaScript heap out of memory" errors
|
||||
- Process crashes during search operations
|
||||
- Slow performance during embedding generation
|
||||
|
||||
### Solutions
|
||||
|
||||
1. **Increase Node.js heap size**:
|
||||
```bash
|
||||
node --max-old-space-size=8192 app.js
|
||||
```
|
||||
|
||||
2. **Disable AI features temporarily**:
|
||||
```javascript
|
||||
const brain = new BrainyData({ embeddings: false })
|
||||
```
|
||||
|
||||
3. **Use quantized models** (future feature):
|
||||
```javascript
|
||||
// Coming soon: 4x smaller models
|
||||
const brain = new BrainyData({
|
||||
modelType: 'quantized' // Uses 1GB instead of 4GB
|
||||
})
|
||||
```
|
||||
|
||||
## The Bottom Line
|
||||
|
||||
**Yes, Brainy needs 4-6GB of memory for AI features.** This is because it includes a complete transformer model for semantic understanding.
|
||||
|
||||
**But consider the alternative:**
|
||||
- OpenAI API: $0.10 per 1M tokens + latency + internet required
|
||||
- Running separate embedding service: Another 4GB + complexity
|
||||
- No semantic search: Missing core functionality
|
||||
|
||||
**Brainy gives you local, private, zero-cost AI in exchange for that memory.**
|
||||
|
||||
## Future Optimizations
|
||||
|
||||
We're working on:
|
||||
1. **Quantized models** - 75% memory reduction
|
||||
2. **Model unloading** - Free memory when idle
|
||||
3. **Streaming inference** - Lower peak memory usage
|
||||
4. **WebGPU support** - Offload to GPU memory
|
||||
|
||||
Until then, **allocate 6-8GB for the best experience** with Brainy's AI features.
|
||||
|
|
@ -1,250 +0,0 @@
|
|||
# 🎯 ONNX Runtime Optimizations for Brainy
|
||||
|
||||
## The Problem
|
||||
ONNX runtime allocates 4-8GB of memory for a 30MB model file, causing memory exhaustion even with adequate heap allocation.
|
||||
|
||||
## Available Solutions & Workarounds
|
||||
|
||||
### 1. **Use Quantized Models** (IMMEDIATE FIX)
|
||||
The most effective solution - reduces memory by 75%:
|
||||
|
||||
```javascript
|
||||
// In src/utils/embedding.ts
|
||||
const pipelineOptions: any = {
|
||||
cache_dir: cacheDir,
|
||||
local_files_only: this.options.localFilesOnly,
|
||||
dtype: 'q8' // Change from 'fp32' to 'q8' or 'q4'
|
||||
}
|
||||
```
|
||||
|
||||
**Memory Impact:**
|
||||
- `fp32` (default): 4-8GB memory usage
|
||||
- `fp16`: ~3-4GB memory usage
|
||||
- `q8`: ~1-2GB memory usage ✅ RECOMMENDED
|
||||
- `q4`: ~500MB-1GB memory usage (lower quality)
|
||||
|
||||
### 2. **Enable ONNX Execution Providers** (PLATFORM SPECIFIC)
|
||||
|
||||
#### For CPU Optimization:
|
||||
```javascript
|
||||
// Add to pipeline options
|
||||
const pipelineOptions = {
|
||||
// ... existing options
|
||||
session_options: {
|
||||
executionProviders: ['cpu'],
|
||||
interOpNumThreads: 2, // Limit threads
|
||||
intraOpNumThreads: 2, // Limit parallelism
|
||||
graphOptimizationLevel: 'all',
|
||||
enableCpuMemArena: false, // CRITICAL: Disable memory arena
|
||||
enableMemPattern: false // CRITICAL: Disable memory patterns
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### For WebAssembly (Browser):
|
||||
```javascript
|
||||
const pipelineOptions = {
|
||||
session_options: {
|
||||
executionProviders: ['wasm'],
|
||||
wasmPaths: '/path/to/wasm/files/',
|
||||
numThreads: 1 // Single-threaded for lower memory
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. **Memory Arena Disable** (CRITICAL FIX)
|
||||
ONNX pre-allocates huge memory arenas by default:
|
||||
|
||||
```javascript
|
||||
// In src/utils/embedding.ts, update the pipeline creation:
|
||||
import { env } from '@huggingface/transformers'
|
||||
|
||||
// Before loading model
|
||||
env.onnx.wasm.numThreads = 1 // Limit WASM threads
|
||||
env.onnx.wasm.simd = true // Use SIMD if available
|
||||
|
||||
// Disable memory arena globally
|
||||
if (typeof process !== 'undefined') {
|
||||
process.env.ORT_DISABLE_MEMORY_ARENA = '1'
|
||||
process.env.ORT_DISABLE_MEMORY_PATTERN = '1'
|
||||
}
|
||||
```
|
||||
|
||||
### 4. **Batch Size Optimization**
|
||||
Process embeddings in smaller batches:
|
||||
|
||||
```javascript
|
||||
// Instead of processing all at once
|
||||
const embeddings = await this.embed(texts)
|
||||
|
||||
// Process in small batches
|
||||
const BATCH_SIZE = 10 // Reduced from 50
|
||||
const embeddings = []
|
||||
for (let i = 0; i < texts.length; i += BATCH_SIZE) {
|
||||
const batch = texts.slice(i, i + BATCH_SIZE)
|
||||
const batchEmbeddings = await this.embed(batch)
|
||||
embeddings.push(...batchEmbeddings)
|
||||
|
||||
// Force garbage collection between batches (Node.js only)
|
||||
if (global.gc) {
|
||||
global.gc()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. **Model Unloading** (MEMORY RECOVERY)
|
||||
Unload model when not in use:
|
||||
|
||||
```javascript
|
||||
class TransformerEmbedding {
|
||||
private idleTimer: NodeJS.Timeout | null = null
|
||||
|
||||
async embed(text: string | string[]): Promise<Vector[]> {
|
||||
// Clear idle timer
|
||||
if (this.idleTimer) {
|
||||
clearTimeout(this.idleTimer)
|
||||
}
|
||||
|
||||
// Do embedding...
|
||||
const result = await this.doEmbed(text)
|
||||
|
||||
// Set idle timer to unload after 5 minutes
|
||||
this.idleTimer = setTimeout(() => {
|
||||
this.unloadModel()
|
||||
}, 5 * 60 * 1000)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
private async unloadModel(): Promise<void> {
|
||||
if (this.extractor) {
|
||||
// Dispose of the pipeline
|
||||
await this.extractor.dispose()
|
||||
this.extractor = null
|
||||
|
||||
// Force garbage collection
|
||||
if (global.gc) {
|
||||
global.gc()
|
||||
}
|
||||
|
||||
console.log('Model unloaded to free memory')
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6. **Use ONNX Runtime Web** (Browser Alternative)
|
||||
For browser environments, use the lighter ONNX Runtime Web:
|
||||
|
||||
```javascript
|
||||
// Use onnxruntime-web instead of full onnxruntime-node
|
||||
import * as ort from 'onnxruntime-web'
|
||||
|
||||
// Configure for minimal memory
|
||||
ort.env.wasm.numThreads = 1
|
||||
ort.env.wasm.simd = true
|
||||
ort.env.wasm.proxy = false // Don't use worker
|
||||
```
|
||||
|
||||
### 7. **Pre-computed Embeddings** (BEST FOR PRODUCTION)
|
||||
For known data, pre-compute embeddings:
|
||||
|
||||
```javascript
|
||||
// During build/deploy time
|
||||
const precomputedEmbeddings = {
|
||||
'javascript': [0.1, 0.2, ...],
|
||||
'python': [0.15, 0.25, ...],
|
||||
// ... more common terms
|
||||
}
|
||||
|
||||
// At runtime
|
||||
async embed(text) {
|
||||
// Check cache first
|
||||
if (precomputedEmbeddings[text.toLowerCase()]) {
|
||||
return precomputedEmbeddings[text.toLowerCase()]
|
||||
}
|
||||
|
||||
// Only compute if not cached
|
||||
return this.computeEmbedding(text)
|
||||
}
|
||||
```
|
||||
|
||||
## Recommended Implementation
|
||||
|
||||
### Quick Fix (Immediate)
|
||||
1. Change dtype to 'q8' in embedding.ts
|
||||
2. Set `ORT_DISABLE_MEMORY_ARENA=1` environment variable
|
||||
3. Reduce batch size to 10
|
||||
|
||||
### Code Changes for embedding.ts:
|
||||
```javascript
|
||||
// At the top of the file
|
||||
if (typeof process !== 'undefined') {
|
||||
process.env.ORT_DISABLE_MEMORY_ARENA = '1'
|
||||
process.env.ORT_DISABLE_MEMORY_PATTERN = '1'
|
||||
}
|
||||
|
||||
// In constructor
|
||||
this.options = {
|
||||
model: options.model || 'Xenova/all-MiniLM-L6-v2',
|
||||
verbose: this.verbose,
|
||||
cacheDir: options.cacheDir || './models',
|
||||
localFilesOnly: localFilesOnly,
|
||||
dtype: options.dtype || 'q8', // Changed from fp32
|
||||
device: options.device || 'auto',
|
||||
batchSize: 10 // Reduced from default
|
||||
}
|
||||
|
||||
// In loadModel
|
||||
const pipelineOptions: any = {
|
||||
cache_dir: cacheDir,
|
||||
local_files_only: isBrowser() ? false : this.options.localFilesOnly,
|
||||
dtype: this.options.dtype,
|
||||
session_options: {
|
||||
enableCpuMemArena: false,
|
||||
enableMemPattern: false,
|
||||
interOpNumThreads: 2,
|
||||
intraOpNumThreads: 2
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Testing Memory Optimizations
|
||||
|
||||
### Before Optimizations:
|
||||
```bash
|
||||
# Uses 4-8GB
|
||||
node test-quick.js
|
||||
# CRASH: JavaScript heap out of memory
|
||||
```
|
||||
|
||||
### After Optimizations:
|
||||
```bash
|
||||
# Should use 1-2GB
|
||||
ORT_DISABLE_MEMORY_ARENA=1 node test-quick.js
|
||||
# SUCCESS: Tests pass
|
||||
```
|
||||
|
||||
## Performance Impact
|
||||
|
||||
| Optimization | Memory Reduction | Speed Impact | Quality Impact |
|
||||
|-------------|-----------------|--------------|----------------|
|
||||
| Quantization (q8) | 75% | ~5% slower | <1% accuracy loss |
|
||||
| Disable Arena | 30-50% | No impact | None |
|
||||
| Batch Size 10 | 20% | 10% slower | None |
|
||||
| Thread Limit | 10-20% | 20% slower | None |
|
||||
| Model Unload | 100% when idle | Reload delay | None |
|
||||
|
||||
## Conclusion
|
||||
|
||||
**Immediate Action**:
|
||||
1. Use q8 quantization
|
||||
2. Disable memory arena
|
||||
3. Reduce batch size
|
||||
|
||||
This should reduce memory usage from 4-8GB to **1-2GB** with minimal performance impact.
|
||||
|
||||
**Long-term Solution**:
|
||||
- Implement model unloading
|
||||
- Pre-compute common embeddings
|
||||
- Consider using ONNX Runtime Web for lighter footprint
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
# 🚨 CRITICAL API FIXES NEEDED FOR BRAINY 2.0
|
||||
|
||||
## 1. ❌ WRONG: MongoDB Operators (Legal Risk!)
|
||||
We accidentally introduced MongoDB-style operators which we specifically avoided for legal reasons!
|
||||
|
||||
### MUST REPLACE:
|
||||
```typescript
|
||||
// ❌ WRONG (MongoDB style)
|
||||
where: {
|
||||
field: {$in: [values]},
|
||||
field: {$gt: value},
|
||||
field: {$regex: pattern}
|
||||
}
|
||||
|
||||
// ✅ CORRECT (Brainy style)
|
||||
where: {
|
||||
field: {oneOf: [values]},
|
||||
field: {greaterThan: value},
|
||||
field: {matches: pattern}
|
||||
}
|
||||
```
|
||||
|
||||
### Complete Operator Mapping:
|
||||
- `$eq` → `equals` or `is`
|
||||
- `$ne` → `notEquals`
|
||||
- `$gt` → `greaterThan`
|
||||
- `$gte` → `greaterEqual`
|
||||
- `$lt` → `lessThan`
|
||||
- `$lte` → `lessEqual`
|
||||
- `$in` → `oneOf`
|
||||
- `$nin` → `notOneOf`
|
||||
- `$regex` → `matches`
|
||||
- `$contains` → `contains`
|
||||
- (NEW) → `startsWith`
|
||||
- (NEW) → `endsWith`
|
||||
- (NEW) → `between`
|
||||
|
||||
## 2. 📊 Missing Neural API Features
|
||||
The backup shows we had extensive neural capabilities:
|
||||
|
||||
```typescript
|
||||
brain.neural.similar(a, b) // Semantic similarity
|
||||
brain.neural.clusters() // Auto-clustering
|
||||
brain.neural.hierarchy(id) // Semantic hierarchy
|
||||
brain.neural.neighbors(id) // Neighbor graph
|
||||
brain.neural.outliers() // Outlier detection
|
||||
brain.neural.semanticPath(a, b) // Path finding
|
||||
brain.neural.visualize() // Visualization data
|
||||
```
|
||||
|
||||
## 3. 🔄 Missing Triple Intelligence Features
|
||||
We need to ensure Triple Intelligence has all its features:
|
||||
- Query optimization
|
||||
- Progressive filtering
|
||||
- Parallel execution
|
||||
- Query learning/caching
|
||||
- Explanations
|
||||
|
||||
## 4. 🧩 Missing Augmentation Features
|
||||
- Synapses (Notion, Slack, Salesforce connectors)
|
||||
- Conduits (Brainy-to-Brainy sync)
|
||||
- Real-time bidirectional sync
|
||||
|
||||
## 5. 📥 Missing Import/Export Features
|
||||
- Neural import with entity extraction
|
||||
- CSV import with AI parsing
|
||||
- JSON flattening and structure detection
|
||||
- Batch neural processing
|
||||
|
||||
## 6. 🎯 API Simplification Issues
|
||||
While simplifying, we may have lost:
|
||||
- Verb scoring intelligence
|
||||
- Clustering management
|
||||
- Performance monitoring
|
||||
- Health checks
|
||||
- Statistics collection
|
||||
|
||||
## 7. 🔍 Search Method Confusion
|
||||
Need to clarify:
|
||||
- `search(query)` = simple convenience for `find({like: query})`
|
||||
- `find(query)` = full Triple Intelligence
|
||||
- Remove duplicate methods like `searchByNounTypes`, etc.
|
||||
|
||||
## IMMEDIATE ACTIONS:
|
||||
1. Replace ALL MongoDB operators with Brainy operators
|
||||
2. Restore neural API with all methods
|
||||
3. Ensure Triple Intelligence is complete
|
||||
4. Verify augmentation system works
|
||||
5. Test import/export capabilities
|
||||
6. Document the clean API properly
|
||||
|
||||
## BACKUP LOCATIONS:
|
||||
- `/home/dpsifr/Projects/BACKUP/brainy (Copy)` - Full backup
|
||||
- `/home/dpsifr/Projects/BACKUP/brainy-clean` - Clean version
|
||||
- `/home/dpsifr/Projects/brainy (Copy)` - Another backup
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
# 🧠 Brainy 2.0 Quick Reference Card
|
||||
|
||||
## Core Operations
|
||||
```typescript
|
||||
// Nouns
|
||||
await brain.addNoun(vector, metadata) // Create
|
||||
await brain.getNoun(id) // Read
|
||||
await brain.updateNoun(id, vector?, meta?) // Update
|
||||
await brain.deleteNoun(id) // Delete
|
||||
|
||||
// Verbs
|
||||
await brain.addVerb(source, target, type) // Create relationship
|
||||
await brain.getVerb(id) // Get relationship
|
||||
await brain.deleteVerb(id) // Delete relationship
|
||||
|
||||
// Metadata
|
||||
await brain.getNounMetadata(id) // Get metadata only
|
||||
await brain.updateNounMetadata(id, meta) // Update metadata only
|
||||
await brain.hasNoun(id) // Check existence
|
||||
```
|
||||
|
||||
## Search
|
||||
```typescript
|
||||
await brain.search(query, k?) // Vector search
|
||||
await brain.searchText('natural language') // NLP search
|
||||
await brain.findSimilar(id, k?) // Similarity search
|
||||
await brain.find(tripleQuery) // Triple Intelligence 🧠
|
||||
```
|
||||
|
||||
## Graph
|
||||
```typescript
|
||||
await brain.getConnections(id) // All connections
|
||||
await brain.getVerbsBySource(id) // Outgoing
|
||||
await brain.getVerbsByTarget(id) // Incoming
|
||||
await brain.getVerbsByType(type) // By type
|
||||
```
|
||||
|
||||
## Management
|
||||
```typescript
|
||||
brain.getCacheStats() // Cache stats
|
||||
brain.clearCache() // Clear cache
|
||||
brain.size() // Total count
|
||||
await brain.getStats() // All statistics
|
||||
await brain.clear() // Clear all data
|
||||
```
|
||||
|
||||
## Lifecycle
|
||||
```typescript
|
||||
const brain = new BrainyData() // Create
|
||||
await brain.init() // Initialize
|
||||
await brain.shutdown() // Cleanup
|
||||
```
|
||||
|
||||
## Configuration
|
||||
```typescript
|
||||
new BrainyData({
|
||||
storage: 'auto', // auto | memory | filesystem | s3
|
||||
cache: true, // Enable caching
|
||||
index: true, // Enable indexing
|
||||
dimensions: 384 // Vector dimensions
|
||||
})
|
||||
```
|
||||
|
|
@ -1,277 +0,0 @@
|
|||
# 🧠 Brainy 2.0 API Reference
|
||||
|
||||
> **Philosophy**: Every method is specific, clear, and purposeful. No ambiguity, no duplicates.
|
||||
|
||||
## 📚 Core Data Operations
|
||||
|
||||
### Nouns (Vectors with Metadata)
|
||||
```typescript
|
||||
// Create
|
||||
await brain.addNoun(vector, metadata) // Add single noun
|
||||
await brain.addNouns(items[]) // Add multiple nouns
|
||||
|
||||
// Read
|
||||
await brain.getNoun(id) // Get single noun
|
||||
await brain.getNouns(filter?) // Get multiple nouns
|
||||
await brain.getNounWithVerbs(id) // Get noun + relationships
|
||||
|
||||
// Update
|
||||
await brain.updateNoun(id, vector?, metadata?) // Update noun
|
||||
await brain.updateNounMetadata(id, metadata) // Update metadata only
|
||||
|
||||
// Delete
|
||||
await brain.deleteNoun(id) // Delete single noun
|
||||
await brain.deleteNouns(ids[]) // Delete multiple nouns
|
||||
```
|
||||
|
||||
### Verbs (Relationships)
|
||||
```typescript
|
||||
// Create
|
||||
await brain.addVerb(source, target, type, metadata?) // Add relationship
|
||||
|
||||
// Read
|
||||
await brain.getVerb(id) // Get single verb
|
||||
await brain.getVerbs(filter?) // Get multiple verbs
|
||||
await brain.getVerbsBySource(sourceId) // Get outgoing relationships
|
||||
await brain.getVerbsByTarget(targetId) // Get incoming relationships
|
||||
await brain.getVerbsByType(type) // Get by relationship type
|
||||
|
||||
// Delete
|
||||
await brain.deleteVerb(id) // Delete relationship
|
||||
await brain.deleteVerbs(ids[]) // Delete multiple relationships
|
||||
```
|
||||
|
||||
## 🔍 Search Operations
|
||||
|
||||
### Vector Search
|
||||
```typescript
|
||||
await brain.search(query, k?, options?) // Primary search method
|
||||
await brain.searchText(text, k?, options?) // Natural language search
|
||||
await brain.findSimilar(id, k?, options?) // Find similar to existing noun
|
||||
await brain.searchWithCursor(query, cursor) // Paginated search
|
||||
```
|
||||
|
||||
### Advanced Search
|
||||
```typescript
|
||||
await brain.searchByNounTypes(types[], query) // Filter by noun types
|
||||
await brain.searchByMetadata(filter, query?) // Filter by metadata
|
||||
await brain.searchWithinNouns(ids[], query) // Search within specific nouns
|
||||
```
|
||||
|
||||
### Triple Intelligence 🧠
|
||||
```typescript
|
||||
await brain.find(query) // Unified Vector + Graph + Metadata search
|
||||
// Examples:
|
||||
await brain.find('documents about AI') // Natural language
|
||||
await brain.find({ like: 'sample-id' }) // Similar to ID
|
||||
await brain.find({ where: { type: 'doc' }}) // Metadata filter
|
||||
await brain.find({ connected: { to: id }}) // Graph traversal
|
||||
```
|
||||
|
||||
## 🕸️ Graph Operations
|
||||
|
||||
```typescript
|
||||
await brain.getConnections(id, depth?) // Get all connections
|
||||
await brain.findPath(sourceId, targetId) // Find path between nouns
|
||||
await brain.getNeighbors(id, hops?) // Get graph neighbors
|
||||
```
|
||||
|
||||
## 📊 Metadata & Filtering
|
||||
|
||||
```typescript
|
||||
await brain.getNounMetadata(id) // Get metadata only
|
||||
await brain.getFilterableFields() // Get indexed fields
|
||||
await brain.getFieldValues(field) // Get unique values for field
|
||||
```
|
||||
|
||||
## 🚀 Performance & Optimization
|
||||
|
||||
### Cache Management
|
||||
```typescript
|
||||
brain.getCacheStats() // Get cache statistics
|
||||
brain.clearCache() // Clear search cache
|
||||
```
|
||||
|
||||
### Statistics
|
||||
```typescript
|
||||
await brain.getStats() // Complete statistics
|
||||
await brain.getServiceStats(service?) // Service-specific stats
|
||||
brain.getHealthStatus() // System health
|
||||
brain.size() // Total noun count
|
||||
```
|
||||
|
||||
### Intelligent Features
|
||||
```typescript
|
||||
// Verb Scoring
|
||||
await brain.trainVerbScoring(feedback) // Provide training feedback
|
||||
brain.getVerbScoringStats() // Get scoring statistics
|
||||
|
||||
// Real-time Updates
|
||||
brain.enableRealtimeUpdates(config) // Enable live sync
|
||||
brain.disableRealtimeUpdates() // Disable live sync
|
||||
await brain.syncNow() // Manual sync
|
||||
```
|
||||
|
||||
## 🌐 Distributed Operations
|
||||
|
||||
```typescript
|
||||
// Remote Connections
|
||||
await brain.connectRemote(url, options?) // Connect to remote instance
|
||||
await brain.disconnectRemote() // Disconnect from remote
|
||||
brain.isRemoteConnected() // Check connection status
|
||||
|
||||
// Search Modes
|
||||
await brain.searchLocal(query) // Search local only
|
||||
await brain.searchRemote(query) // Search remote only
|
||||
await brain.searchHybrid(query) // Search both
|
||||
|
||||
// Operational Modes
|
||||
brain.setReadOnly(enabled) // Toggle read-only mode
|
||||
brain.setWriteOnly(enabled) // Toggle write-only mode
|
||||
brain.freeze() // Freeze all modifications
|
||||
brain.unfreeze() // Unfreeze modifications
|
||||
```
|
||||
|
||||
## 💾 Import/Export
|
||||
|
||||
```typescript
|
||||
await brain.backup() // Create full backup
|
||||
await brain.restore(backup) // Restore from backup
|
||||
await brain.importData(data, format) // Import external data
|
||||
await brain.exportData(format) // Export data
|
||||
```
|
||||
|
||||
## 🧹 Data Management
|
||||
|
||||
```typescript
|
||||
await brain.clearNouns(options?) // Clear all nouns
|
||||
await brain.clearVerbs(options?) // Clear all verbs
|
||||
await brain.clearAll(options?) // Clear everything
|
||||
await brain.rebuildIndex() // Rebuild metadata index
|
||||
```
|
||||
|
||||
## 🔧 Utilities
|
||||
|
||||
```typescript
|
||||
// Embeddings
|
||||
await brain.embed(text) // Generate embedding
|
||||
await brain.embedBatch(texts[]) // Batch embeddings
|
||||
|
||||
// Similarity
|
||||
await brain.calculateSimilarity(a, b) // Compare vectors
|
||||
await brain.calculateDistance(a, b, metric?) // Calculate distance
|
||||
|
||||
// Encryption (if configured)
|
||||
await brain.encrypt(data) // Encrypt data
|
||||
await brain.decrypt(data) // Decrypt data
|
||||
```
|
||||
|
||||
## 🎯 Lifecycle
|
||||
|
||||
```typescript
|
||||
// Initialization
|
||||
const brain = new BrainyData(config?) // Create instance
|
||||
await brain.init() // Initialize (required!)
|
||||
|
||||
// Cleanup
|
||||
await brain.shutdown() // Graceful shutdown
|
||||
await brain.cleanup() // Clean up resources
|
||||
```
|
||||
|
||||
## ⚡ Static Methods
|
||||
|
||||
```typescript
|
||||
// Model Management
|
||||
await BrainyData.preloadModel(options?) // Preload ML model
|
||||
await BrainyData.warmup(options?) // Warmup system
|
||||
|
||||
// Utilities
|
||||
BrainyData.version // Get version
|
||||
BrainyData.checkEnvironment() // Check environment support
|
||||
```
|
||||
|
||||
## 🎨 Configuration
|
||||
|
||||
```typescript
|
||||
const brain = new BrainyData({
|
||||
// Storage
|
||||
storage: 'memory' | 'filesystem' | 's3' | 'auto',
|
||||
|
||||
// Performance
|
||||
cache: true, // Enable caching
|
||||
index: true, // Enable metadata indexing
|
||||
metrics: true, // Enable metrics collection
|
||||
|
||||
// Distributed
|
||||
distributed: {
|
||||
mode: 'reader' | 'writer' | 'hybrid',
|
||||
partitions: 8
|
||||
},
|
||||
|
||||
// Advanced
|
||||
dimensions: 384, // Vector dimensions
|
||||
similarity: 'cosine', // Similarity metric
|
||||
verbose: false // Logging verbosity
|
||||
})
|
||||
```
|
||||
|
||||
## 📝 Quick Examples
|
||||
|
||||
```typescript
|
||||
// Simple usage
|
||||
const brain = new BrainyData()
|
||||
await brain.init()
|
||||
|
||||
// Add data
|
||||
const id = await brain.addNoun(vector, {
|
||||
title: 'My Document',
|
||||
type: 'article'
|
||||
})
|
||||
|
||||
// Search
|
||||
const results = await brain.search('AI research', 10)
|
||||
|
||||
// Graph relationships
|
||||
await brain.addVerb(id1, id2, 'references')
|
||||
const connections = await brain.getConnections(id1)
|
||||
|
||||
// Triple Intelligence
|
||||
const insights = await brain.find({
|
||||
like: 'sample-doc',
|
||||
where: { type: 'article' },
|
||||
connected: { to: id1, via: 'references' }
|
||||
})
|
||||
|
||||
// Cleanup
|
||||
await brain.shutdown()
|
||||
```
|
||||
|
||||
## 🚨 Important: No Aliases!
|
||||
|
||||
Brainy 2.0 follows a **ONE METHOD, ONE PURPOSE** philosophy:
|
||||
- No duplicate methods
|
||||
- No confusing aliases
|
||||
- Clear, specific naming
|
||||
- If you need the old methods for migration, they're now private
|
||||
|
||||
## 🚀 What Changed from 1.x
|
||||
|
||||
### Now Private (Use New Methods)
|
||||
- `add()` → Use `addNoun()`
|
||||
- `get()` → Use `getNoun()`
|
||||
- `delete()` → Use `deleteNoun()`
|
||||
- `update()` → Use `updateNoun()`
|
||||
- `updateMetadata()` → Use `updateNounMetadata()`
|
||||
- `getMetadata()` → Use `getNounMetadata()`
|
||||
- `relate()` / `connect()` → Use `addVerb()`
|
||||
- `has()` / `exists()` → Use `hasNoun()`
|
||||
- `clearAll()` → Use `clear()`
|
||||
- `addItem()` / `addToBoth()` → Removed
|
||||
|
||||
### New in 2.0
|
||||
- `find()` - Triple Intelligence search
|
||||
- `getNounWithVerbs()` - Get noun with relationships
|
||||
- `searchText()` - Natural language search
|
||||
- `trainVerbScoring()` - Intelligent scoring
|
||||
- Real-time sync capabilities
|
||||
- Distributed operations
|
||||
|
|
@ -1,220 +0,0 @@
|
|||
# 🧠 Brainy 2.0 Complete Public API
|
||||
|
||||
> **Clean, Specific, Beautiful** - Every method has ONE clear purpose.
|
||||
|
||||
## 📚 NOUNS (Vectors with Metadata)
|
||||
|
||||
```typescript
|
||||
// Single Operations
|
||||
addNoun(vector, metadata?) // Add one noun
|
||||
getNoun(id) // Get one noun by ID
|
||||
updateNoun(id, vector?, metadata?) // Update entire noun
|
||||
updateNounMetadata(id, metadata) // Update metadata only
|
||||
getNounMetadata(id) // Get metadata only
|
||||
getNounWithVerbs(id) // Get noun with all relationships
|
||||
deleteNoun(id) // Delete one noun
|
||||
hasNoun(id) // Check if noun exists
|
||||
|
||||
// Batch Operations
|
||||
addNouns(items[]) // Add multiple nouns
|
||||
getNouns(idsOrOptions) // Get multiple nouns (unified method)
|
||||
// getNouns(['id1', 'id2']) // Get by specific IDs
|
||||
// getNouns({ filter: {...} }) // Get with filters
|
||||
// getNouns({ limit: 10, offset: 20 }) // Get with pagination
|
||||
deleteNouns(ids[]) // Delete multiple nouns
|
||||
```
|
||||
|
||||
## 🔗 VERBS (Relationships)
|
||||
|
||||
```typescript
|
||||
// Single Operations
|
||||
addVerb(source, target, type, metadata?) // Create relationship
|
||||
getVerb(id) // Get one verb by ID
|
||||
deleteVerb(id) // Delete one verb
|
||||
|
||||
// Batch Operations
|
||||
addVerbs(verbs[]) // Add multiple relationships
|
||||
getVerbs(filter?) // Get filtered verbs
|
||||
getVerbsBySource(sourceId) // Get outgoing relationships
|
||||
getVerbsByTarget(targetId) // Get incoming relationships
|
||||
getVerbsByType(type) // Get by relationship type
|
||||
deleteVerbs(ids[]) // Delete multiple verbs
|
||||
```
|
||||
|
||||
## 🔍 SEARCH
|
||||
|
||||
```typescript
|
||||
// Core Search
|
||||
search(query, k?, options?) // Primary vector search
|
||||
searchText(text, k?, options?) // Natural language search
|
||||
find(query) // Triple Intelligence (Vector+Graph+Metadata) 🧠
|
||||
findSimilar(id, k?, options?) // Find similar to existing noun
|
||||
|
||||
// Advanced Search
|
||||
searchByNounTypes(types[], query, k?) // Filter by noun types
|
||||
searchWithinItems(query, ids[], k?) // Search within specific nouns
|
||||
searchWithCursor(query, cursor) // Paginated search
|
||||
searchByStandardField(field, value, k?) // Metadata-based search
|
||||
|
||||
// Graph Search
|
||||
searchVerbs(query, options?) // Search relationships
|
||||
searchNounsByVerbs(conditions) // Find nouns by relationships
|
||||
|
||||
// Distributed Search
|
||||
searchLocal(query, k?) // Search local instance only
|
||||
searchRemote(query, k?) // Search remote instance only
|
||||
searchCombined(query, k?) // Search both local and remote
|
||||
```
|
||||
|
||||
## 📊 METADATA & FILTERING
|
||||
|
||||
```typescript
|
||||
getFilterFields() // Get all indexed fields
|
||||
getFilterValues(field) // Get unique values for a field
|
||||
getAvailableFieldNames() // Get available field names
|
||||
getStandardFieldMappings() // Get standard field mappings
|
||||
```
|
||||
|
||||
## 🚀 PERFORMANCE & MONITORING
|
||||
|
||||
```typescript
|
||||
// Cache
|
||||
getCacheStats() // Get cache statistics
|
||||
clearCache() // Clear search cache
|
||||
|
||||
// Statistics
|
||||
size() // Total noun count
|
||||
getStatistics(options?) // Comprehensive statistics
|
||||
getServiceStatistics(service) // Per-service statistics
|
||||
listServices() // List all services
|
||||
flushStatistics() // Persist statistics to storage
|
||||
|
||||
// Health
|
||||
getHealthStatus() // System health check
|
||||
status() // Full status report
|
||||
```
|
||||
|
||||
## ⚙️ CONFIGURATION
|
||||
|
||||
```typescript
|
||||
// Operational Modes
|
||||
isReadOnly() / setReadOnly(bool) // Read-only mode
|
||||
isWriteOnly() / setWriteOnly(bool) // Write-only mode
|
||||
isFrozen() / setFrozen(bool) // Freeze all modifications
|
||||
|
||||
// Real-time Sync
|
||||
enableRealtimeUpdates(config) // Enable live synchronization
|
||||
disableRealtimeUpdates() // Disable synchronization
|
||||
getRealtimeUpdateConfig() // Get current config
|
||||
checkForUpdatesNow() // Manual sync trigger
|
||||
|
||||
// Remote Connection
|
||||
connectToRemoteServer(url, options?) // Connect to remote instance
|
||||
disconnectFromRemoteServer() // Disconnect from remote
|
||||
isConnectedToRemoteServer() // Check connection status
|
||||
```
|
||||
|
||||
## 🧠 INTELLIGENCE
|
||||
|
||||
```typescript
|
||||
// Verb Scoring
|
||||
provideFeedbackForVerbScoring(feedback) // Train relationship scoring
|
||||
getVerbScoringStats() // Get scoring statistics
|
||||
exportVerbScoringLearningData() // Export training data
|
||||
importVerbScoringLearningData(data) // Import training data
|
||||
|
||||
// Embeddings
|
||||
embed(text) // Generate embedding vector
|
||||
calculateSimilarity(a, b, metric?) // Calculate vector similarity
|
||||
```
|
||||
|
||||
## 💾 DATA MANAGEMENT
|
||||
|
||||
```typescript
|
||||
// Clear Operations
|
||||
clear(options?) // Clear all data
|
||||
clearNouns(options?) // Clear all nouns only
|
||||
clearVerbs(options?) // Clear all verbs only
|
||||
|
||||
// Backup & Restore
|
||||
backup() // Create full backup
|
||||
restore(backup) // Restore from backup
|
||||
|
||||
// Import/Export
|
||||
import(data, format) // Import external data
|
||||
importSparseData(data) // Import sparse format
|
||||
|
||||
// Index Management
|
||||
rebuildMetadataIndex() // Rebuild metadata index
|
||||
```
|
||||
|
||||
## 🔒 SECURITY
|
||||
|
||||
```typescript
|
||||
encryptData(data) // Encrypt data
|
||||
decryptData(data) // Decrypt data
|
||||
```
|
||||
|
||||
## 🎲 UTILITIES
|
||||
|
||||
```typescript
|
||||
generateRandomGraph(nodes, edges) // Generate test graph data
|
||||
```
|
||||
|
||||
## 🚀 LIFECYCLE
|
||||
|
||||
```typescript
|
||||
// Instance Methods
|
||||
new BrainyData(config?) // Create instance
|
||||
init() // Initialize (REQUIRED!)
|
||||
shutDown() // Graceful shutdown
|
||||
cleanup() // Clean up resources
|
||||
|
||||
// Static Methods
|
||||
BrainyData.preloadModel(options?) // Preload ML model
|
||||
BrainyData.warmup(options?) // Warmup system
|
||||
```
|
||||
|
||||
## 📐 PROPERTIES (Read-only)
|
||||
|
||||
```typescript
|
||||
dimensions // Vector dimensions
|
||||
maxConnections // HNSW max connections
|
||||
efConstruction // HNSW ef construction
|
||||
initialized // Is initialized?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Key Changes in 2.0
|
||||
|
||||
### ✅ Simplified & Unified
|
||||
- `getNouns()` now handles ALL plural queries (by IDs, filters, or pagination)
|
||||
- No more `getNounsByIds()`, `queryNouns()`, `getBatch()` - just `getNouns()`
|
||||
- Clear singular vs plural: `getNoun()` for one, `getNouns()` for many
|
||||
|
||||
### ✅ Specific Naming
|
||||
- Always specify noun/verb: `addNoun()` not `add()`
|
||||
- No aliases or duplicates
|
||||
- One method, one purpose
|
||||
|
||||
### ✅ Private Legacy Methods
|
||||
These are now private (use new methods above):
|
||||
- `add()`, `get()`, `delete()`, `update()`
|
||||
- `relate()`, `connect()`, `has()`, `exists()`
|
||||
- `getMetadata()`, `updateMetadata()`
|
||||
- `addItem()`, `addToBoth()`, `addBatch()`, `getBatch()`
|
||||
|
||||
### ✅ Triple Intelligence
|
||||
- New `find()` method unifies Vector + Graph + Metadata search
|
||||
- Most powerful search capability in one simple method
|
||||
|
||||
### ✅ Zero-Configuration
|
||||
- Everything works instantly with sensible defaults
|
||||
- Optional configuration only for advanced users
|
||||
- No complex setup required
|
||||
|
||||
### ✅ Clean Architecture
|
||||
- Augmentation system for extensibility
|
||||
- All features included (no premium tiers)
|
||||
- Beautiful developer experience
|
||||
|
|
@ -1,268 +0,0 @@
|
|||
# 🧠 Brainy 2.0 CORRECT API Reference
|
||||
|
||||
> **The actual API we need, with all features, correct operators, and proper methods**
|
||||
|
||||
## 📚 CORE DATA OPERATIONS
|
||||
|
||||
### Nouns (Vectors with Metadata)
|
||||
```typescript
|
||||
// Single Operations
|
||||
addNoun(textOrVector, metadata?) // Auto-embeds text
|
||||
getNoun(id) // Get one noun
|
||||
updateNoun(id, textOrVector?, metadata?) // Update noun
|
||||
deleteNoun(id) // Delete noun
|
||||
hasNoun(id) // Check existence
|
||||
|
||||
// Metadata
|
||||
getNounMetadata(id) // Metadata only
|
||||
updateNounMetadata(id, metadata) // Update metadata
|
||||
getNounWithVerbs(id) // With relationships
|
||||
|
||||
// Batch
|
||||
addNouns(items[]) // Add multiple
|
||||
getNouns(idsOrOptions) // Get multiple (unified)
|
||||
deleteNouns(ids[]) // Delete multiple
|
||||
```
|
||||
|
||||
### Verbs (Relationships)
|
||||
```typescript
|
||||
addVerb(source, target, type, metadata?) // Create relationship
|
||||
getVerb(id) // Get verb
|
||||
deleteVerb(id) // Delete verb
|
||||
getVerbsBySource(sourceId) // Outgoing
|
||||
getVerbsByTarget(targetId) // Incoming
|
||||
getVerbsByType(type) // By type
|
||||
```
|
||||
|
||||
## 🔍 SEARCH (Simplified & Powerful)
|
||||
|
||||
```typescript
|
||||
// Just TWO search methods:
|
||||
search(query, k?) // Simple convenience
|
||||
find(query) // TRIPLE INTELLIGENCE 🧠
|
||||
```
|
||||
|
||||
### Find Query Structure (with CORRECT Brainy Operators):
|
||||
```typescript
|
||||
find({
|
||||
// Vector search
|
||||
like: 'text' | vector | {id: 'noun-id'},
|
||||
|
||||
// Metadata filtering with BRAINY OPERATORS (NOT MongoDB!)
|
||||
where: {
|
||||
// Direct equality
|
||||
field: value,
|
||||
|
||||
// Brainy operators (NO $ prefix!)
|
||||
field: {
|
||||
equals: value, // Exact match
|
||||
notEquals: value, // Not equal
|
||||
greaterThan: value, // Greater than
|
||||
greaterEqual: value, // Greater or equal
|
||||
lessThan: value, // Less than
|
||||
lessEqual: value, // Less or equal
|
||||
oneOf: [values], // In array (NOT $in)
|
||||
notOneOf: [values], // Not in array
|
||||
contains: value, // Contains (arrays/strings)
|
||||
startsWith: value, // String starts with
|
||||
endsWith: value, // String ends with
|
||||
matches: pattern, // Pattern match (NOT $regex)
|
||||
between: [min, max] // Between two values
|
||||
}
|
||||
},
|
||||
|
||||
// Graph traversal
|
||||
connected: {
|
||||
to: 'id',
|
||||
from: 'id',
|
||||
via: 'type',
|
||||
depth: 2
|
||||
},
|
||||
|
||||
// Control
|
||||
limit: 10,
|
||||
offset: 0,
|
||||
explain: true
|
||||
})
|
||||
```
|
||||
|
||||
## 🧠 NEURAL API (Complete)
|
||||
|
||||
```typescript
|
||||
// Access via brain.neural
|
||||
brain.neural.similar(a, b) // Semantic similarity
|
||||
brain.neural.clusters(options?) // Auto-clustering
|
||||
brain.neural.hierarchy(id) // Semantic hierarchy
|
||||
brain.neural.neighbors(id, k?) // K nearest neighbors
|
||||
brain.neural.outliers(threshold?) // Outlier detection
|
||||
brain.neural.semanticPath(from, to) // Path finding
|
||||
brain.neural.visualize(options?) // Visualization data
|
||||
|
||||
// Enterprise performance methods
|
||||
brain.neural.clusterFast(options?) // O(n) HNSW clustering
|
||||
brain.neural.clusterLarge(options?) // Million-item clustering
|
||||
brain.neural.clusterStream(options?) // Progressive streaming
|
||||
```
|
||||
|
||||
### Visualization Data Format:
|
||||
```typescript
|
||||
brain.neural.visualize({
|
||||
maxNodes: 100,
|
||||
dimensions: 2 | 3,
|
||||
algorithm: 'force' | 'hierarchical' | 'radial',
|
||||
includeEdges: true
|
||||
})
|
||||
|
||||
// Returns:
|
||||
{
|
||||
format: 'd3' | 'cytoscape' | 'graphml',
|
||||
nodes: [{
|
||||
id: string,
|
||||
x: number,
|
||||
y: number,
|
||||
z?: number,
|
||||
label: string,
|
||||
cluster?: number,
|
||||
metadata: any
|
||||
}],
|
||||
edges: [{
|
||||
source: string,
|
||||
target: string,
|
||||
type: string,
|
||||
weight?: number
|
||||
}],
|
||||
layout: {
|
||||
dimensions: 2 | 3,
|
||||
algorithm: string,
|
||||
bounds: {min: [x,y,z], max: [x,y,z]}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📥 NEURAL IMPORT (Simple & Powerful)
|
||||
|
||||
```typescript
|
||||
// One simple method for smart import
|
||||
brain.neuralImport(data, options?)
|
||||
|
||||
// Options:
|
||||
{
|
||||
confidenceThreshold: 0.7, // Min confidence for entities
|
||||
autoApply: false, // Auto-add to database
|
||||
enableWeights: true, // Use confidence weights
|
||||
previewOnly: false, // Just preview, don't import
|
||||
skipDuplicates: true, // Skip existing entities
|
||||
format?: 'auto' | 'csv' | 'json' | 'text' // Auto-detect by default
|
||||
}
|
||||
|
||||
// Returns:
|
||||
{
|
||||
detectedEntities: [{
|
||||
suggestedId: string,
|
||||
nounType: string,
|
||||
confidence: number,
|
||||
originalData: any
|
||||
}],
|
||||
detectedRelationships: [{
|
||||
sourceId: string,
|
||||
targetId: string,
|
||||
verbType: string,
|
||||
confidence: number
|
||||
}],
|
||||
confidence: number, // Overall confidence
|
||||
insights: string[], // AI insights
|
||||
preview: string // Human-readable preview
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 VERB SCORING
|
||||
|
||||
```typescript
|
||||
brain.verbScoring.train(feedback) // Train model
|
||||
brain.verbScoring.getScore(verbId) // Get score
|
||||
brain.verbScoring.export() // Export training
|
||||
brain.verbScoring.import(data) // Import training
|
||||
brain.verbScoring.stats() // Statistics
|
||||
```
|
||||
|
||||
## 🔄 SYNC & DISTRIBUTION
|
||||
|
||||
### Conduits (Brainy-to-Brainy)
|
||||
```typescript
|
||||
brain.conduit.establish(url) // Connect to another Brainy
|
||||
brain.conduit.sync() // Sync data
|
||||
brain.conduit.close() // Disconnect
|
||||
```
|
||||
|
||||
### Synapses (External Platforms)
|
||||
```typescript
|
||||
brain.synapse.notion.connect(config) // Notion integration
|
||||
brain.synapse.slack.connect(config) // Slack integration
|
||||
brain.synapse.salesforce.connect(config) // Salesforce
|
||||
brain.synapse.custom(name, config) // Custom platform
|
||||
```
|
||||
|
||||
## 📊 MONITORING & STATS
|
||||
|
||||
```typescript
|
||||
brain.size() // Total nouns
|
||||
brain.stats() // Full statistics
|
||||
brain.health() // Health check
|
||||
brain.cache.stats() // Cache stats
|
||||
brain.cache.clear() // Clear cache
|
||||
```
|
||||
|
||||
## 💾 DATA MANAGEMENT
|
||||
|
||||
```typescript
|
||||
brain.clear(options?) // Clear all
|
||||
brain.clearNouns() // Clear nouns only
|
||||
brain.clearVerbs() // Clear verbs only
|
||||
brain.backup() // Create backup
|
||||
brain.restore(backup) // Restore
|
||||
```
|
||||
|
||||
## 🚀 LIFECYCLE
|
||||
|
||||
```typescript
|
||||
const brain = new BrainyData(config?) // Create
|
||||
await brain.init() // Initialize (REQUIRED!)
|
||||
await brain.shutdown() // Cleanup
|
||||
|
||||
// Configuration
|
||||
{
|
||||
storage: 'auto' | 'memory' | 'filesystem' | 's3',
|
||||
dimensions: 384,
|
||||
cache: true,
|
||||
index: true,
|
||||
augmentations: []
|
||||
}
|
||||
```
|
||||
|
||||
## ⚙️ EMBEDDINGS
|
||||
|
||||
```typescript
|
||||
brain.embed(text) // Generate embedding
|
||||
brain.similarity(a, b) // Calculate similarity
|
||||
```
|
||||
|
||||
## 🎲 UTILITIES
|
||||
|
||||
```typescript
|
||||
brain.generateRandomGraph(nodes, edges) // Test data
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ KEY CORRECTIONS FROM MISTAKES:
|
||||
|
||||
1. **NO MongoDB operators** - We use Brainy operators (legal reasons)
|
||||
2. **Neural API is complete** - All clustering, visualization methods
|
||||
3. **Simple neuralImport** - One method, smart detection
|
||||
4. **Visualization exports** - For D3, Cytoscape, GraphML
|
||||
5. **search() is just convenience** - Not a complete alias
|
||||
6. **find() has Triple Intelligence** - Vector + Graph + Metadata
|
||||
7. **Proper operator names** - greaterThan not $gt
|
||||
8. **Complete clustering API** - Fast, large, streaming options
|
||||
9. **Synapses and Conduits** - External and internal sync
|
||||
10. **Verb scoring** - Intelligent relationship scoring
|
||||
|
|
@ -1,376 +0,0 @@
|
|||
# 🧠 Brainy 2.0 Detailed API Reference
|
||||
|
||||
> **Complete API with full parameter descriptions**
|
||||
|
||||
## 📚 CORE DATA OPERATIONS
|
||||
|
||||
### Nouns (Vectors with Metadata)
|
||||
|
||||
#### `addNoun(textOrVector, metadata?)`
|
||||
Add a single noun to the database
|
||||
- **textOrVector**: `string | number[]` - Text to auto-embed OR pre-computed vector
|
||||
- **metadata**: `object` (optional) - Associated metadata
|
||||
- **Returns**: `Promise<string>` - The ID of the created noun
|
||||
|
||||
#### `getNoun(id)`
|
||||
Retrieve a single noun by ID
|
||||
- **id**: `string` - The noun's unique identifier
|
||||
- **Returns**: `Promise<VectorDocument | null>` - The noun with vector and metadata
|
||||
|
||||
#### `updateNoun(id, textOrVector?, metadata?)`
|
||||
Update an existing noun
|
||||
- **id**: `string` - The noun's ID to update
|
||||
- **textOrVector**: `string | number[]` (optional) - New text/vector
|
||||
- **metadata**: `object` (optional) - New metadata (merged with existing)
|
||||
- **Returns**: `Promise<void>`
|
||||
|
||||
#### `deleteNoun(id)`
|
||||
Delete a single noun
|
||||
- **id**: `string` - The noun's ID to delete
|
||||
- **Returns**: `Promise<boolean>` - True if deleted
|
||||
|
||||
#### `hasNoun(id)`
|
||||
Check if a noun exists
|
||||
- **id**: `string` - The noun's ID to check
|
||||
- **Returns**: `Promise<boolean>` - True if exists
|
||||
|
||||
#### `getNounMetadata(id)`
|
||||
Get only the metadata of a noun (no vector)
|
||||
- **id**: `string` - The noun's ID
|
||||
- **Returns**: `Promise<object | null>` - Just the metadata
|
||||
|
||||
#### `updateNounMetadata(id, metadata)`
|
||||
Update only the metadata of a noun
|
||||
- **id**: `string` - The noun's ID
|
||||
- **metadata**: `object` - New metadata (replaces existing)
|
||||
- **Returns**: `Promise<void>`
|
||||
|
||||
#### `getNounWithVerbs(id)`
|
||||
Get a noun with all its relationships
|
||||
- **id**: `string` - The noun's ID
|
||||
- **Returns**: `Promise<{noun: VectorDocument, verbs: Verb[]}>` - Noun and relationships
|
||||
|
||||
#### `addNouns(items[])`
|
||||
Add multiple nouns in batch
|
||||
- **items**: `Array<{vector: number[] | string, metadata?: object}>` - Array of nouns
|
||||
- **Returns**: `Promise<string[]>` - Array of created IDs
|
||||
|
||||
#### `getNouns(idsOrOptions)`
|
||||
Get multiple nouns (unified method)
|
||||
- **idsOrOptions**: Can be one of:
|
||||
- `string[]` - Array of IDs to fetch
|
||||
- `{filter: object}` - Filter by metadata fields
|
||||
- `{limit: number, offset: number}` - Pagination
|
||||
- **Returns**: `Promise<VectorDocument[]>` - Array of nouns
|
||||
|
||||
#### `deleteNouns(ids[])`
|
||||
Delete multiple nouns
|
||||
- **ids**: `string[]` - Array of IDs to delete
|
||||
- **Returns**: `Promise<boolean[]>` - Success status for each
|
||||
|
||||
---
|
||||
|
||||
### Verbs (Relationships)
|
||||
|
||||
#### `addVerb(source, target, type, metadata?)`
|
||||
Create a relationship between nouns
|
||||
- **source**: `string` - Source noun ID
|
||||
- **target**: `string` - Target noun ID
|
||||
- **type**: `string` - Relationship type (e.g., 'references', 'contains')
|
||||
- **metadata**: `object` (optional) - Relationship metadata
|
||||
- **Returns**: `Promise<string>` - The verb ID
|
||||
|
||||
#### `getVerb(id)`
|
||||
Get a single relationship
|
||||
- **id**: `string` - The verb's ID
|
||||
- **Returns**: `Promise<Verb | null>` - The relationship
|
||||
|
||||
#### `deleteVerb(id)`
|
||||
Delete a relationship
|
||||
- **id**: `string` - The verb's ID
|
||||
- **Returns**: `Promise<boolean>` - True if deleted
|
||||
|
||||
#### `getVerbsBySource(sourceId)`
|
||||
Get all outgoing relationships from a noun
|
||||
- **sourceId**: `string` - The source noun's ID
|
||||
- **Returns**: `Promise<Verb[]>` - Array of relationships
|
||||
|
||||
#### `getVerbsByTarget(targetId)`
|
||||
Get all incoming relationships to a noun
|
||||
- **targetId**: `string` - The target noun's ID
|
||||
- **Returns**: `Promise<Verb[]>` - Array of relationships
|
||||
|
||||
#### `getVerbsByType(type)`
|
||||
Get all relationships of a specific type
|
||||
- **type**: `string` - The relationship type
|
||||
- **Returns**: `Promise<Verb[]>` - Array of relationships
|
||||
|
||||
---
|
||||
|
||||
## 🔍 SEARCH & INTELLIGENCE
|
||||
|
||||
### Core Search Methods
|
||||
|
||||
#### `search(query, k?)`
|
||||
Simple vector similarity search (convenience wrapper)
|
||||
- **query**: `string | number[]` - Text query or vector
|
||||
- **k**: `number` (default: 10) - Number of results
|
||||
- **Returns**: `Promise<SearchResult[]>` - Ranked results with scores
|
||||
- **Note**: Equivalent to `find({like: query, limit: k})`
|
||||
|
||||
#### `find(query)`
|
||||
**TRIPLE INTELLIGENCE** - The ultimate search method
|
||||
- **query**: `object` - Complex query object supporting:
|
||||
```typescript
|
||||
{
|
||||
// Vector similarity
|
||||
like?: string | number[] | {id: string}, // Text, vector, or noun ID
|
||||
|
||||
// Metadata filtering
|
||||
where?: {
|
||||
field: value, // Exact match
|
||||
field: {$in: [values]}, // In array
|
||||
field: {$gt: value}, // Greater than
|
||||
field: {$regex: pattern} // Pattern match
|
||||
},
|
||||
|
||||
// Graph traversal
|
||||
connected?: {
|
||||
to?: string, // Target noun ID
|
||||
from?: string, // Source noun ID
|
||||
via?: string, // Relationship type
|
||||
depth?: number // Traversal depth (default: 1)
|
||||
},
|
||||
|
||||
// Control
|
||||
limit?: number, // Max results (default: 10)
|
||||
offset?: number, // Skip results
|
||||
threshold?: number // Min similarity score
|
||||
}
|
||||
```
|
||||
- **Returns**: `Promise<EnhancedSearchResult[]>` - Results with scores and explanations
|
||||
|
||||
#### `findSimilar(id, k?)`
|
||||
Find nouns similar to an existing noun
|
||||
- **id**: `string` - Reference noun ID
|
||||
- **k**: `number` (default: 10) - Number of results
|
||||
- **Returns**: `Promise<SearchResult[]>` - Similar nouns
|
||||
|
||||
---
|
||||
|
||||
### Neural API
|
||||
|
||||
#### `neural.search(query, options?)`
|
||||
Neural-enhanced semantic search
|
||||
- **query**: `string` - Natural language query
|
||||
- **options**: `{expand?: boolean, rerank?: boolean}` - Enhancement options
|
||||
- **Returns**: `Promise<NeuralSearchResult[]>` - Enhanced results
|
||||
|
||||
#### `neural.cluster(options?)`
|
||||
Automatic clustering of nouns
|
||||
- **options**: `{k?: number, method?: 'kmeans'|'dbscan', minSize?: number}`
|
||||
- **Returns**: `Promise<Cluster[]>` - Generated clusters
|
||||
|
||||
#### `neural.extract(text)`
|
||||
Extract entities from text
|
||||
- **text**: `string` - Text to analyze
|
||||
- **Returns**: `Promise<{entities: Entity[], relationships: Relationship[]}>`
|
||||
|
||||
#### `neural.summarize(ids[])`
|
||||
Generate summary from multiple nouns
|
||||
- **ids**: `string[]` - Noun IDs to summarize
|
||||
- **Returns**: `Promise<string>` - Generated summary
|
||||
|
||||
#### `neural.analyze(id)`
|
||||
Deep analysis of a noun
|
||||
- **id**: `string` - Noun ID to analyze
|
||||
- **Returns**: `Promise<Analysis>` - Detailed analysis
|
||||
|
||||
#### `neural.compare(id1, id2)`
|
||||
Semantic comparison of two nouns
|
||||
- **id1**: `string` - First noun ID
|
||||
- **id2**: `string` - Second noun ID
|
||||
- **Returns**: `Promise<{similarity: number, differences: string[], commonalities: string[]}>`
|
||||
|
||||
#### `neural.topics(options?)`
|
||||
Topic modeling across all nouns
|
||||
- **options**: `{k?: number, method?: 'lda'|'nmf'}` - Topic extraction options
|
||||
- **Returns**: `Promise<Topic[]>` - Discovered topics
|
||||
|
||||
#### `neural.patterns(options?)`
|
||||
Pattern detection in data
|
||||
- **options**: `{minSupport?: number, minConfidence?: number}`
|
||||
- **Returns**: `Promise<Pattern[]>` - Detected patterns
|
||||
|
||||
---
|
||||
|
||||
## 📥 IMPORT/EXPORT
|
||||
|
||||
### Neural Import
|
||||
|
||||
#### `neuralImport(data, options?)`
|
||||
Smart AI-powered data import
|
||||
- **data**: `any` - Data to import (auto-detects format)
|
||||
- **options**: `{autoExtract?: boolean, autoRelate?: boolean, batchSize?: number}`
|
||||
- **Returns**: `Promise<{nouns: string[], verbs: string[]}>`
|
||||
|
||||
#### `neuralImport.csv(file, options?)`
|
||||
Import CSV with intelligent parsing
|
||||
- **file**: `string | Buffer` - CSV file path or content
|
||||
- **options**: `{headers?: boolean, delimiter?: string, embedColumns?: string[]}`
|
||||
- **Returns**: `Promise<ImportResult>`
|
||||
|
||||
#### `neuralImport.json(data, options?)`
|
||||
Import JSON with structure detection
|
||||
- **data**: `object | string` - JSON data or string
|
||||
- **options**: `{flatten?: boolean, keyPaths?: string[]}`
|
||||
- **Returns**: `Promise<ImportResult>`
|
||||
|
||||
#### `neuralImport.text(text, options?)`
|
||||
Import text with NLP processing
|
||||
- **text**: `string` - Raw text
|
||||
- **options**: `{chunk?: boolean, chunkSize?: number, extractEntities?: boolean}`
|
||||
- **Returns**: `Promise<ImportResult>`
|
||||
|
||||
---
|
||||
|
||||
## 🔄 SYNC & DISTRIBUTION
|
||||
|
||||
### Real-time Sync
|
||||
|
||||
#### `sync.enable(config)`
|
||||
Enable real-time synchronization
|
||||
- **config**: `{url: string, interval?: number, bidirectional?: boolean}`
|
||||
- **Returns**: `Promise<void>`
|
||||
|
||||
#### `sync.disable()`
|
||||
Disable synchronization
|
||||
- **Returns**: `Promise<void>`
|
||||
|
||||
#### `sync.now()`
|
||||
Trigger manual sync
|
||||
- **Returns**: `Promise<SyncResult>`
|
||||
|
||||
#### `sync.status()`
|
||||
Get sync status
|
||||
- **Returns**: `Promise<{enabled: boolean, lastSync: Date, pending: number}>`
|
||||
|
||||
---
|
||||
|
||||
### Remote Operations
|
||||
|
||||
#### `remote.connect(url, options?)`
|
||||
Connect to remote Brainy instance
|
||||
- **url**: `string` - Remote instance URL
|
||||
- **options**: `{auth?: string, timeout?: number, retry?: boolean}`
|
||||
- **Returns**: `Promise<Connection>`
|
||||
|
||||
#### `remote.search(query)`
|
||||
Search remote instance
|
||||
- **query**: `any` - Same as find() query
|
||||
- **Returns**: `Promise<SearchResult[]>`
|
||||
|
||||
---
|
||||
|
||||
## 🧠 INTELLIGENCE FEATURES
|
||||
|
||||
### Verb Scoring
|
||||
|
||||
#### `verbScoring.train(feedback)`
|
||||
Train the verb scoring model
|
||||
- **feedback**: `{verbId: string, score: number, context?: object}`
|
||||
- **Returns**: `Promise<void>`
|
||||
|
||||
#### `verbScoring.getScore(verbId)`
|
||||
Get intelligent score for a verb
|
||||
- **verbId**: `string` - The verb to score
|
||||
- **Returns**: `Promise<number>` - Score between 0-1
|
||||
|
||||
#### `verbScoring.export()`
|
||||
Export training data
|
||||
- **Returns**: `Promise<TrainingData>`
|
||||
|
||||
#### `verbScoring.import(data)`
|
||||
Import training data
|
||||
- **data**: `TrainingData` - Previously exported data
|
||||
- **Returns**: `Promise<void>`
|
||||
|
||||
---
|
||||
|
||||
### Embeddings
|
||||
|
||||
#### `embed(text)`
|
||||
Generate embedding vector for text
|
||||
- **text**: `string` - Text to embed
|
||||
- **Returns**: `Promise<number[]>` - Embedding vector
|
||||
|
||||
#### `embedBatch(texts[])`
|
||||
Generate embeddings for multiple texts
|
||||
- **texts**: `string[]` - Array of texts
|
||||
- **Returns**: `Promise<number[][]>` - Array of vectors
|
||||
|
||||
#### `similarity(a, b, metric?)`
|
||||
Calculate similarity between vectors or texts
|
||||
- **a**: `string | number[]` - First item
|
||||
- **b**: `string | number[]` - Second item
|
||||
- **metric**: `'cosine' | 'euclidean' | 'manhattan'` (default: 'cosine')
|
||||
- **Returns**: `Promise<number>` - Similarity score
|
||||
|
||||
---
|
||||
|
||||
## 📊 MONITORING & PERFORMANCE
|
||||
|
||||
#### `size()`
|
||||
Get total noun count
|
||||
- **Returns**: `number` - Total nouns in database
|
||||
|
||||
#### `stats()`
|
||||
Get comprehensive statistics
|
||||
- **Returns**: `Promise<Statistics>` - Detailed stats
|
||||
|
||||
#### `health()`
|
||||
System health check
|
||||
- **Returns**: `Promise<{status: 'healthy'|'degraded'|'unhealthy', details: object}>`
|
||||
|
||||
#### `cache.stats()`
|
||||
Get cache statistics
|
||||
- **Returns**: `CacheStats` - Hit rates, size, etc.
|
||||
|
||||
#### `cache.clear()`
|
||||
Clear all caches
|
||||
- **Returns**: `void`
|
||||
|
||||
---
|
||||
|
||||
## 🚀 LIFECYCLE
|
||||
|
||||
#### `new BrainyData(config?)`
|
||||
Create new Brainy instance
|
||||
- **config**: `object` (optional)
|
||||
```typescript
|
||||
{
|
||||
storage?: 'auto' | 'memory' | 'filesystem' | 's3',
|
||||
dimensions?: number, // Vector dimensions (default: 384)
|
||||
cache?: boolean, // Enable caching (default: true)
|
||||
index?: boolean, // Enable indexing (default: true)
|
||||
verbose?: boolean, // Verbose logging (default: false)
|
||||
augmentations?: Augmentation[] // Custom augmentations
|
||||
}
|
||||
```
|
||||
|
||||
#### `init()`
|
||||
Initialize the instance (REQUIRED!)
|
||||
- **Returns**: `Promise<void>`
|
||||
- **Note**: Must be called before any operations
|
||||
|
||||
#### `shutdown()`
|
||||
Graceful shutdown
|
||||
- **Returns**: `Promise<void>` - Saves state and closes connections
|
||||
|
||||
---
|
||||
|
||||
## 📐 READ-ONLY PROPERTIES
|
||||
|
||||
- **dimensions**: `number` - Vector dimensions
|
||||
- **initialized**: `boolean` - Whether init() was called
|
||||
- **mode**: `string` - Current operational mode
|
||||
|
|
@ -1,260 +0,0 @@
|
|||
# 🧠 Brainy 2.0 Final Complete API
|
||||
|
||||
> **Clean, Powerful, Complete** - All features, beautifully organized.
|
||||
|
||||
## 📚 CORE DATA
|
||||
|
||||
### Nouns (Vectors with Metadata)
|
||||
```typescript
|
||||
// Single Operations
|
||||
addNoun(textOrVector, metadata?) // Add noun (auto-embeds text!)
|
||||
getNoun(id) // Get one noun
|
||||
updateNoun(id, textOrVector?, metadata?) // Update noun
|
||||
deleteNoun(id) // Delete noun
|
||||
hasNoun(id) // Check if exists
|
||||
|
||||
// Metadata Operations
|
||||
getNounMetadata(id) // Get metadata only
|
||||
updateNounMetadata(id, metadata) // Update metadata only
|
||||
getNounWithVerbs(id) // Get noun with relationships
|
||||
|
||||
// Batch Operations
|
||||
addNouns(items[]) // Add multiple nouns
|
||||
getNouns(idsOrOptions) // Get multiple nouns (unified)
|
||||
deleteNouns(ids[]) // Delete multiple nouns
|
||||
```
|
||||
|
||||
### Verbs (Relationships)
|
||||
```typescript
|
||||
addVerb(source, target, type, metadata?) // Create relationship
|
||||
getVerb(id) // Get verb
|
||||
deleteVerb(id) // Delete verb
|
||||
getVerbsBySource(sourceId) // Outgoing relationships
|
||||
getVerbsByTarget(targetId) // Incoming relationships
|
||||
getVerbsByType(type) // By relationship type
|
||||
```
|
||||
|
||||
## 🔍 SEARCH & INTELLIGENCE
|
||||
|
||||
### Core Search
|
||||
```typescript
|
||||
search(query, k?) // Simple vector search
|
||||
find(query) // TRIPLE INTELLIGENCE 🧠
|
||||
findSimilar(id, k?) // Find similar to noun
|
||||
```
|
||||
|
||||
### Neural API
|
||||
```typescript
|
||||
neural.search(query) // Neural-enhanced search
|
||||
neural.cluster(options?) // Automatic clustering
|
||||
neural.extract(text) // Entity extraction
|
||||
neural.summarize(ids[]) // Summarize nouns
|
||||
neural.analyze(id) // Deep analysis
|
||||
neural.compare(id1, id2) // Semantic comparison
|
||||
neural.topics() // Topic modeling
|
||||
neural.patterns() // Pattern detection
|
||||
```
|
||||
|
||||
### Clustering
|
||||
```typescript
|
||||
clusters.create(options?) // Create clusters
|
||||
clusters.get(id) // Get cluster
|
||||
clusters.list() // List all clusters
|
||||
clusters.addToCluster(clusterId, nounId) // Add to cluster
|
||||
clusters.optimize() // Re-optimize clusters
|
||||
clusters.suggest(nounId) // Suggest best cluster
|
||||
```
|
||||
|
||||
## 🧠 INTELLIGENCE FEATURES
|
||||
|
||||
### Triple Intelligence
|
||||
```typescript
|
||||
tripleIntelligence.analyze(query) // Combined V+G+F analysis
|
||||
tripleIntelligence.explain(results) // Explain search results
|
||||
tripleIntelligence.optimize(query) // Query optimization
|
||||
```
|
||||
|
||||
### Verb Scoring
|
||||
```typescript
|
||||
verbScoring.train(feedback) // Train scoring model
|
||||
verbScoring.getScore(verb) // Get verb score
|
||||
verbScoring.export() // Export training data
|
||||
verbScoring.import(data) // Import training data
|
||||
verbScoring.stats() // Get statistics
|
||||
```
|
||||
|
||||
### Embeddings
|
||||
```typescript
|
||||
embed(text) // Generate embedding
|
||||
embedBatch(texts[]) // Batch embeddings
|
||||
similarity(a, b) // Calculate similarity
|
||||
distance(a, b, metric?) // Calculate distance
|
||||
```
|
||||
|
||||
## 📥 IMPORT/EXPORT
|
||||
|
||||
### Neural Import
|
||||
```typescript
|
||||
neuralImport(data, options?) // Smart data import
|
||||
neuralImport.csv(file, options?) // Import CSV with AI
|
||||
neuralImport.json(data, options?) // Import JSON with AI
|
||||
neuralImport.text(text, options?) // Import text with NLP
|
||||
neuralImport.url(url, options?) // Import from URL
|
||||
neuralImport.batch(items[], options?) // Batch neural import
|
||||
```
|
||||
|
||||
### Data Management
|
||||
```typescript
|
||||
import(data, format) // Standard import
|
||||
export(format) // Export data
|
||||
importSparse(data) // Import sparse format
|
||||
backup() // Create backup
|
||||
restore(backup) // Restore backup
|
||||
```
|
||||
|
||||
## 🔄 SYNC & DISTRIBUTION
|
||||
|
||||
### Real-time Sync
|
||||
```typescript
|
||||
sync.enable(config) // Enable real-time sync
|
||||
sync.disable() // Disable sync
|
||||
sync.now() // Manual sync
|
||||
sync.status() // Sync status
|
||||
```
|
||||
|
||||
### Remote Operations
|
||||
```typescript
|
||||
remote.connect(url, options?) // Connect to remote
|
||||
remote.disconnect() // Disconnect
|
||||
remote.search(query) // Search remote
|
||||
remote.sync() // Sync with remote
|
||||
```
|
||||
|
||||
### Conduits (Brainy-to-Brainy)
|
||||
```typescript
|
||||
conduit.establish(url) // Create conduit
|
||||
conduit.send(data) // Send via conduit
|
||||
conduit.receive(callback) // Receive data
|
||||
conduit.close() // Close conduit
|
||||
```
|
||||
|
||||
### Synapses (External Platforms)
|
||||
```typescript
|
||||
synapse.notion.connect(config) // Connect to Notion
|
||||
synapse.slack.connect(config) // Connect to Slack
|
||||
synapse.salesforce.connect(config) // Connect to Salesforce
|
||||
synapse.custom(platform, config) // Custom platform
|
||||
```
|
||||
|
||||
## 📊 ANALYTICS & MONITORING
|
||||
|
||||
### Statistics
|
||||
```typescript
|
||||
size() // Total count
|
||||
stats() // Full statistics
|
||||
stats.byService(service) // Per-service stats
|
||||
stats.byType(type) // Per-type stats
|
||||
health() // Health check
|
||||
```
|
||||
|
||||
### Performance
|
||||
```typescript
|
||||
cache.stats() // Cache statistics
|
||||
cache.clear() // Clear cache
|
||||
cache.optimize() // Optimize cache
|
||||
index.rebuild() // Rebuild index
|
||||
index.optimize() // Optimize index
|
||||
```
|
||||
|
||||
### Monitoring
|
||||
```typescript
|
||||
monitor.enable() // Enable monitoring
|
||||
monitor.metrics() // Get metrics
|
||||
monitor.alerts() // Get alerts
|
||||
monitor.logs(options?) // Get logs
|
||||
```
|
||||
|
||||
## ⚙️ CONFIGURATION
|
||||
|
||||
### Operational Modes
|
||||
```typescript
|
||||
setReadOnly(bool) // Read-only mode
|
||||
setWriteOnly(bool) // Write-only mode
|
||||
setFrozen(bool) // Freeze all changes
|
||||
getMode() // Current mode
|
||||
```
|
||||
|
||||
### Augmentations
|
||||
```typescript
|
||||
augmentations.register(augmentation) // Add augmentation
|
||||
augmentations.list() // List all
|
||||
augmentations.get(name) // Get by name
|
||||
augmentations.enable(name) // Enable
|
||||
augmentations.disable(name) // Disable
|
||||
```
|
||||
|
||||
## 🔧 UTILITIES
|
||||
|
||||
### Data Operations
|
||||
```typescript
|
||||
clear(options?) // Clear all
|
||||
clearNouns() // Clear nouns
|
||||
clearVerbs() // Clear verbs
|
||||
generateRandomGraph(nodes, edges) // Generate test data
|
||||
```
|
||||
|
||||
### Field Management
|
||||
```typescript
|
||||
fields.list() // List indexed fields
|
||||
fields.values(field) // Get unique values
|
||||
fields.add(field) // Add field to index
|
||||
fields.remove(field) // Remove from index
|
||||
```
|
||||
|
||||
## 🚀 LIFECYCLE
|
||||
|
||||
```typescript
|
||||
// Creation & Initialization
|
||||
new BrainyData(config?) // Create instance
|
||||
init() // Initialize (REQUIRED!)
|
||||
warmup() // Warmup caches
|
||||
|
||||
// Cleanup
|
||||
shutdown() // Graceful shutdown
|
||||
cleanup() // Clean resources
|
||||
|
||||
// Static Methods
|
||||
BrainyData.preloadModel() // Preload ML model
|
||||
BrainyData.version // Get version
|
||||
```
|
||||
|
||||
## 📐 PROPERTIES
|
||||
|
||||
```typescript
|
||||
dimensions // Vector dimensions (readonly)
|
||||
initialized // Is initialized (readonly)
|
||||
mode // Current mode (readonly)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Key Features Preserved
|
||||
|
||||
✅ **Neural Import** - Smart AI-powered data import
|
||||
✅ **Clustering** - Automatic and manual clustering
|
||||
✅ **Triple Intelligence** - Vector + Graph + Metadata combined
|
||||
✅ **Verb Scoring** - Intelligent relationship scoring
|
||||
✅ **Synapses** - External platform connectors
|
||||
✅ **Conduits** - Brainy-to-Brainy sync
|
||||
✅ **Neural API** - Advanced AI operations
|
||||
✅ **Real-time Sync** - Live data synchronization
|
||||
✅ **Monitoring** - Performance and health tracking
|
||||
|
||||
## 🚀 What's New in 2.0
|
||||
|
||||
1. **Auto-embedding** - `addNoun()` accepts text directly
|
||||
2. **Unified `find()`** - One method for all complex queries
|
||||
3. **Neural API** - Powerful AI operations built-in
|
||||
4. **Augmentation System** - Extensible architecture
|
||||
5. **Clean naming** - Specific noun/verb terminology
|
||||
6. **No duplicates** - One method per operation
|
||||
|
|
@ -1,243 +0,0 @@
|
|||
# 🧠 Brainy 2.0 Final API Reference
|
||||
|
||||
> **The definitive API - Clean, Correct, Complete**
|
||||
|
||||
## ✅ KEY CORRECTIONS FROM REVIEW:
|
||||
1. **Brainy Operators (NOT MongoDB)** - `greaterThan` not `$gt`
|
||||
2. **Neural API is complete** - All methods available via `brain.neural`
|
||||
3. **Code is correct** - Implementation uses right operators, just docs were wrong
|
||||
4. **Nothing lost** - All features still present, just reorganized
|
||||
|
||||
---
|
||||
|
||||
## 📚 CORE DATA OPERATIONS
|
||||
|
||||
### Nouns
|
||||
```typescript
|
||||
// Single
|
||||
addNoun(textOrVector, metadata?) // Auto-embeds text!
|
||||
getNoun(id)
|
||||
updateNoun(id, textOrVector?, metadata?)
|
||||
deleteNoun(id)
|
||||
hasNoun(id)
|
||||
|
||||
// Metadata
|
||||
getNounMetadata(id)
|
||||
updateNounMetadata(id, metadata)
|
||||
getNounWithVerbs(id)
|
||||
|
||||
// Batch
|
||||
addNouns(items[])
|
||||
getNouns(idsOrOptions) // Unified: IDs, filter, or pagination
|
||||
deleteNouns(ids[])
|
||||
```
|
||||
|
||||
### Verbs
|
||||
```typescript
|
||||
addVerb(source, target, type, metadata?)
|
||||
getVerb(id)
|
||||
deleteVerb(id)
|
||||
getVerbsBySource(sourceId)
|
||||
getVerbsByTarget(targetId)
|
||||
getVerbsByType(type)
|
||||
```
|
||||
|
||||
## 🔍 SEARCH
|
||||
|
||||
Just TWO methods - simple and powerful:
|
||||
|
||||
```typescript
|
||||
search(query, k?) // Convenience: same as find({like: query, limit: k})
|
||||
find(query) // TRIPLE INTELLIGENCE: Vector + Graph + Metadata
|
||||
```
|
||||
|
||||
### Find Query (with CORRECT Brainy Operators):
|
||||
```typescript
|
||||
find({
|
||||
// Vector
|
||||
like: 'text' | vector | {id: 'noun-id'},
|
||||
|
||||
// Fields (BRAINY operators, NOT MongoDB!)
|
||||
where: {
|
||||
field: value, // Direct equality
|
||||
field: {
|
||||
equals: value,
|
||||
greaterThan: value, // NOT $gt
|
||||
lessThan: value, // NOT $lt
|
||||
greaterEqual: value,
|
||||
lessEqual: value,
|
||||
oneOf: [values], // NOT $in
|
||||
notOneOf: [values], // NOT $nin
|
||||
contains: value,
|
||||
startsWith: value,
|
||||
endsWith: value,
|
||||
matches: pattern, // NOT $regex
|
||||
between: [min, max]
|
||||
}
|
||||
},
|
||||
|
||||
// Graph
|
||||
connected: {
|
||||
to: 'id',
|
||||
from: 'id',
|
||||
via: 'type',
|
||||
depth: 2
|
||||
},
|
||||
|
||||
// Control
|
||||
limit: 10,
|
||||
offset: 0,
|
||||
explain: true
|
||||
})
|
||||
```
|
||||
|
||||
## 🧠 NEURAL API
|
||||
|
||||
Complete and available via `brain.neural`:
|
||||
|
||||
```typescript
|
||||
brain.neural.similar(a, b) // Similarity 0-1
|
||||
brain.neural.clusters() // Auto-clustering
|
||||
brain.neural.hierarchy(id) // Semantic tree
|
||||
brain.neural.neighbors(id, k?) // K-nearest
|
||||
brain.neural.outliers(threshold?) // Outlier detection
|
||||
brain.neural.semanticPath(from, to) // Path finding
|
||||
brain.neural.visualize(options?) // For D3/Cytoscape/GraphML
|
||||
|
||||
// Performance
|
||||
brain.neural.clusterFast() // O(n) HNSW
|
||||
brain.neural.clusterLarge() // Million+ items
|
||||
brain.neural.clusterStream() // Progressive
|
||||
```
|
||||
|
||||
### Visualization Format:
|
||||
```typescript
|
||||
brain.neural.visualize({
|
||||
maxNodes: 100,
|
||||
dimensions: 2,
|
||||
algorithm: 'force',
|
||||
includeEdges: true
|
||||
})
|
||||
// Returns: {
|
||||
// format: 'd3' | 'cytoscape' | 'graphml',
|
||||
// nodes: [...], edges: [...], layout: {...}
|
||||
// }
|
||||
```
|
||||
|
||||
## 📥 IMPORT
|
||||
|
||||
Simple, AI-powered:
|
||||
|
||||
```typescript
|
||||
brain.neuralImport(data, options?) // Auto-detects format!
|
||||
// Options: {
|
||||
// confidenceThreshold: 0.7,
|
||||
// autoApply: false,
|
||||
// skipDuplicates: true
|
||||
// }
|
||||
```
|
||||
|
||||
## 🎯 INTELLIGENCE
|
||||
|
||||
```typescript
|
||||
// Verb Scoring
|
||||
provideFeedbackForVerbScoring(feedback)
|
||||
getVerbScoringStats()
|
||||
exportVerbScoringLearningData()
|
||||
importVerbScoringLearningData(data)
|
||||
|
||||
// Embeddings
|
||||
embed(text) // Generate vector
|
||||
calculateSimilarity(a, b, metric?) // Compare
|
||||
```
|
||||
|
||||
## 🔄 SYNC
|
||||
|
||||
```typescript
|
||||
// Remote
|
||||
connectToRemoteServer(url)
|
||||
disconnectFromRemoteServer()
|
||||
isConnectedToRemoteServer()
|
||||
|
||||
// Real-time
|
||||
enableRealtimeUpdates(config)
|
||||
disableRealtimeUpdates()
|
||||
checkForUpdatesNow()
|
||||
|
||||
// Search modes
|
||||
searchLocal(query, k?)
|
||||
searchRemote(query, k?)
|
||||
searchCombined(query, k?)
|
||||
```
|
||||
|
||||
## 📊 MONITORING
|
||||
|
||||
```typescript
|
||||
size() // Total nouns
|
||||
getStatistics() // Full stats
|
||||
getHealthStatus() // Health
|
||||
getCacheStats() // Cache
|
||||
clearCache() // Clear
|
||||
```
|
||||
|
||||
## ⚙️ CONFIGURATION
|
||||
|
||||
```typescript
|
||||
// Modes
|
||||
setReadOnly(bool)
|
||||
setWriteOnly(bool)
|
||||
setFrozen(bool)
|
||||
|
||||
// Augmentations
|
||||
augmentations.register(aug)
|
||||
augmentations.list()
|
||||
augmentations.get(name)
|
||||
```
|
||||
|
||||
## 💾 DATA MANAGEMENT
|
||||
|
||||
```typescript
|
||||
clear(options?) // Clear all
|
||||
clearNouns() // Nouns only
|
||||
clearVerbs() // Verbs only
|
||||
backup() // Create backup
|
||||
restore(backup) // Restore
|
||||
rebuildMetadataIndex() // Rebuild index
|
||||
```
|
||||
|
||||
## 🚀 LIFECYCLE
|
||||
|
||||
```typescript
|
||||
const brain = new BrainyData({
|
||||
storage: 'auto', // auto | memory | filesystem | s3
|
||||
dimensions: 384,
|
||||
cache: true,
|
||||
index: true
|
||||
})
|
||||
|
||||
await brain.init() // REQUIRED!
|
||||
await brain.shutdown() // Cleanup
|
||||
|
||||
// Static
|
||||
BrainyData.preloadModel() // Preload
|
||||
BrainyData.warmup() // Warmup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✨ What Makes Brainy 2.0 Special:
|
||||
|
||||
1. **Zero-Config** - Works instantly, no setup
|
||||
2. **Auto-Embedding** - Text automatically becomes vectors
|
||||
3. **Triple Intelligence** - Vector + Graph + Metadata combined
|
||||
4. **Brainy Operators** - Clean, legal, no MongoDB style
|
||||
5. **Complete Neural API** - All clustering/viz features
|
||||
6. **Simple Import** - One method, auto-detects everything
|
||||
7. **Clean Architecture** - Augmentations for extensibility
|
||||
|
||||
## 🎯 Remember:
|
||||
- **NO $operators** - We use readable names (legal requirement)
|
||||
- **search() is simple** - Just wraps find({like: query})
|
||||
- **find() is powerful** - Full Triple Intelligence
|
||||
- **neural API complete** - All methods via brain.neural
|
||||
- **Everything included** - No premium features, all MIT
|
||||
|
|
@ -1,149 +0,0 @@
|
|||
# 🧠 Brainy 2.0 Simplified Public API
|
||||
|
||||
> **Ultra-clean, Simple, Powerful** - Minimal methods, maximum capability.
|
||||
|
||||
## 📚 NOUNS (Data with Vectors)
|
||||
|
||||
```typescript
|
||||
// Single Operations
|
||||
addNoun(textOrVector, metadata?) // Add noun (auto-embeds text!)
|
||||
getNoun(id) // Get one noun
|
||||
updateNoun(id, textOrVector?, metadata?) // Update noun
|
||||
deleteNoun(id) // Delete noun
|
||||
hasNoun(id) // Check if exists
|
||||
|
||||
// Metadata Operations
|
||||
getNounMetadata(id) // Get metadata only
|
||||
updateNounMetadata(id, metadata) // Update metadata only
|
||||
getNounWithVerbs(id) // Get noun with relationships
|
||||
|
||||
// Batch Operations
|
||||
addNouns(items[]) // Add multiple nouns
|
||||
getNouns(idsOrOptions) // Get multiple nouns (unified)
|
||||
deleteNouns(ids[]) // Delete multiple nouns
|
||||
```
|
||||
|
||||
## 🔗 VERBS (Relationships)
|
||||
|
||||
```typescript
|
||||
// Core Operations
|
||||
addVerb(source, target, type, metadata?) // Create relationship
|
||||
getVerb(id) // Get verb
|
||||
deleteVerb(id) // Delete verb
|
||||
|
||||
// Queries
|
||||
getVerbsBySource(sourceId) // Outgoing relationships
|
||||
getVerbsByTarget(targetId) // Incoming relationships
|
||||
getVerbsByType(type) // By relationship type
|
||||
```
|
||||
|
||||
## 🔍 SEARCH (One Method to Rule Them All)
|
||||
|
||||
```typescript
|
||||
// THE ONLY SEARCH METHODS YOU NEED:
|
||||
search(query, k?) // Simple vector search (alias to find)
|
||||
find(query) // TRIPLE INTELLIGENCE 🧠
|
||||
```
|
||||
|
||||
### Find Query Examples:
|
||||
```typescript
|
||||
// Text search (auto-embeds)
|
||||
find('documents about AI')
|
||||
|
||||
// Similar to existing noun
|
||||
find({ like: 'noun-id-123' })
|
||||
|
||||
// Metadata filtering
|
||||
find({ where: { type: 'article' }})
|
||||
|
||||
// Graph traversal
|
||||
find({ connected: { to: 'id', via: 'references' }})
|
||||
|
||||
// Combined queries (Triple Intelligence!)
|
||||
find({
|
||||
like: 'sample-doc', // Vector similarity
|
||||
where: { status: 'published' }, // Metadata filter
|
||||
connected: { via: 'cites' }, // Graph relationships
|
||||
limit: 10 // Pagination
|
||||
})
|
||||
```
|
||||
|
||||
## 📊 METADATA
|
||||
|
||||
```typescript
|
||||
getFilterableFields() // Get indexed fields
|
||||
getFieldValues(field) // Get unique values for field
|
||||
```
|
||||
|
||||
## 🚀 PERFORMANCE
|
||||
|
||||
```typescript
|
||||
// Cache
|
||||
getCacheStats() // Cache statistics
|
||||
clearCache() // Clear cache
|
||||
|
||||
// Stats
|
||||
size() // Total count
|
||||
getStatistics() // Full statistics
|
||||
getHealthStatus() // Health check
|
||||
```
|
||||
|
||||
## ⚙️ CONFIGURATION
|
||||
|
||||
```typescript
|
||||
// Modes
|
||||
setReadOnly(bool) // Read-only mode
|
||||
setWriteOnly(bool) // Write-only mode
|
||||
setFrozen(bool) // Freeze all changes
|
||||
|
||||
// Remote Sync
|
||||
connectRemote(url) // Connect to remote
|
||||
disconnectRemote() // Disconnect
|
||||
syncNow() // Manual sync
|
||||
```
|
||||
|
||||
## 💾 DATA MANAGEMENT
|
||||
|
||||
```typescript
|
||||
clear(options?) // Clear all
|
||||
clearNouns() // Clear nouns
|
||||
clearVerbs() // Clear verbs
|
||||
backup() // Create backup
|
||||
restore(backup) // Restore backup
|
||||
```
|
||||
|
||||
## 🚀 LIFECYCLE
|
||||
|
||||
```typescript
|
||||
new BrainyData(config?) // Create
|
||||
init() // Initialize (REQUIRED!)
|
||||
shutdown() // Cleanup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Philosophy
|
||||
|
||||
### Why So Simple?
|
||||
|
||||
1. **`addNoun()` handles everything** - Text? Auto-embeds. Vector? Uses directly.
|
||||
2. **`find()` is the ultimate search** - Combines vector, graph, and metadata search
|
||||
3. **`search()` is just convenience** - Simple alias to `find()` for basic queries
|
||||
4. **No duplicate methods** - One way to do each thing
|
||||
|
||||
### The Power of Find
|
||||
|
||||
The `find()` method is your Swiss Army knife:
|
||||
- Text search → Auto-embeds and searches
|
||||
- Vector search → `{ like: 'id' }` or `{ like: vector }`
|
||||
- Metadata search → `{ where: { field: value }}`
|
||||
- Graph search → `{ connected: { to/from: 'id' }}`
|
||||
- Combine them all → Triple Intelligence!
|
||||
|
||||
### Zero Configuration
|
||||
|
||||
Everything just works:
|
||||
- Text auto-embeds
|
||||
- Vectors auto-index
|
||||
- Metadata auto-indexes
|
||||
- Relationships auto-optimize
|
||||
|
|
@ -1,343 +0,0 @@
|
|||
# 🧠 Brainy 2.0 Unified Public API
|
||||
|
||||
> **The complete, accurate API based on actual implementation**
|
||||
|
||||
## 📚 CORE DATA OPERATIONS
|
||||
|
||||
### Nouns (Vectors with Metadata)
|
||||
|
||||
```typescript
|
||||
// === SINGLE OPERATIONS ===
|
||||
addNoun(textOrVector, metadata?) // Add noun (auto-embeds text)
|
||||
getNoun(id) // Get one noun
|
||||
updateNoun(id, textOrVector?, metadata?) // Update noun
|
||||
deleteNoun(id) // Delete noun
|
||||
hasNoun(id) // Check if exists
|
||||
|
||||
// === METADATA OPERATIONS ===
|
||||
getNounMetadata(id) // Get metadata only
|
||||
updateNounMetadata(id, metadata) // Update metadata only
|
||||
getNounWithVerbs(id) // Get noun with relationships
|
||||
|
||||
// === BATCH OPERATIONS ===
|
||||
addNouns(items[]) // Add multiple nouns
|
||||
getNouns(idsOrOptions) // Get multiple (unified method)
|
||||
// getNouns(['id1', 'id2']) // By IDs
|
||||
// getNouns({filter: {...}}) // By filter
|
||||
// getNouns({limit: 10, offset: 20}) // Paginated
|
||||
deleteNouns(ids[]) // Delete multiple
|
||||
```
|
||||
|
||||
### Verbs (Relationships)
|
||||
|
||||
```typescript
|
||||
// === SINGLE OPERATIONS ===
|
||||
addVerb(source, target, type, metadata?) // Create relationship
|
||||
getVerb(id) // Get verb
|
||||
deleteVerb(id) // Delete verb
|
||||
|
||||
// === QUERY OPERATIONS ===
|
||||
getVerbsBySource(sourceId) // Outgoing relationships
|
||||
getVerbsByTarget(targetId) // Incoming relationships
|
||||
getVerbsByType(type) // By relationship type
|
||||
getVerbs(filter?) // Get filtered verbs
|
||||
deleteVerbs(ids[]) // Delete multiple
|
||||
```
|
||||
|
||||
## 🔍 SEARCH & INTELLIGENCE
|
||||
|
||||
### Primary Search Methods
|
||||
|
||||
```typescript
|
||||
// === TWO MAIN METHODS ===
|
||||
search(query, k?) // Simple vector search
|
||||
// Equivalent to: find({like: query, limit: k})
|
||||
|
||||
find(query) // TRIPLE INTELLIGENCE 🧠
|
||||
// Combines Vector + Graph + Metadata search
|
||||
```
|
||||
|
||||
### Find Query Structure
|
||||
|
||||
```typescript
|
||||
find({
|
||||
// === VECTOR SEARCH ===
|
||||
like: 'text query' | vector | {id: 'noun-id'},
|
||||
similar: 'text' | vector, // Alternative to 'like'
|
||||
|
||||
// === FIELD FILTERING (Brainy Operators) ===
|
||||
where: {
|
||||
// Direct equality
|
||||
field: value,
|
||||
|
||||
// Brainy operators (CORRECT - NO MongoDB $)
|
||||
field: {
|
||||
equals: value, // Exact match
|
||||
is: value, // Same as equals
|
||||
greaterThan: value, // Greater than
|
||||
lessThan: value, // Less than
|
||||
oneOf: [values], // In array (NOT $in)
|
||||
contains: value // Array/string contains
|
||||
// Note: Additional operators can be added
|
||||
}
|
||||
},
|
||||
|
||||
// === GRAPH TRAVERSAL ===
|
||||
connected: {
|
||||
to: 'id' | ['id1', 'id2'], // Target nodes
|
||||
from: 'id' | ['id1', 'id2'], // Source nodes
|
||||
type: 'type' | ['type1'], // Relationship types
|
||||
depth: 2, // Traversal depth
|
||||
direction: 'in' | 'out' | 'both'
|
||||
},
|
||||
|
||||
// === CONTROL OPTIONS ===
|
||||
limit: 10, // Max results
|
||||
offset: 0, // Skip results
|
||||
explain: false, // Add explanations
|
||||
boost: 'recent' | 'popular' // Result boosting
|
||||
})
|
||||
```
|
||||
|
||||
## 🧠 NEURAL API
|
||||
|
||||
Access via `brain.neural`:
|
||||
|
||||
```typescript
|
||||
// === SIMILARITY & CLUSTERING ===
|
||||
brain.neural.similar(a, b, options?) // Semantic similarity (0-1)
|
||||
brain.neural.clusters(input?) // Auto-clustering
|
||||
brain.neural.hierarchy(id) // Semantic hierarchy tree
|
||||
brain.neural.neighbors(id, options?) // K-nearest neighbors
|
||||
|
||||
// === ANALYSIS ===
|
||||
brain.neural.outliers(threshold?) // Outlier detection
|
||||
brain.neural.semanticPath(from, to) // Find semantic path
|
||||
|
||||
// === VISUALIZATION ===
|
||||
brain.neural.visualize(options?) // Export for visualization
|
||||
// options: {
|
||||
// maxNodes: 100,
|
||||
// dimensions: 2 | 3,
|
||||
// algorithm: 'force' | 'hierarchical' | 'radial',
|
||||
// includeEdges: true
|
||||
// }
|
||||
// Returns: {
|
||||
// format: 'd3' | 'cytoscape' | 'graphml',
|
||||
// nodes: [...], edges: [...], layout: {...}
|
||||
// }
|
||||
|
||||
// === PERFORMANCE METHODS ===
|
||||
brain.neural.clusterFast(options?) // O(n) HNSW clustering
|
||||
brain.neural.clusterLarge(options?) // Million+ items
|
||||
brain.neural.clusterStream(options?) // Progressive streaming
|
||||
```
|
||||
|
||||
## 📥 IMPORT & EXPORT
|
||||
|
||||
### Neural Import
|
||||
|
||||
```typescript
|
||||
// === SMART IMPORT (from cortex) ===
|
||||
brain.neuralImport(filePath, options?) // AI-powered import
|
||||
// options: {
|
||||
// confidenceThreshold: 0.7,
|
||||
// autoApply: false,
|
||||
// enableWeights: true,
|
||||
// previewOnly: false,
|
||||
// skipDuplicates: true
|
||||
// }
|
||||
// Returns: {
|
||||
// detectedEntities: [...],
|
||||
// detectedRelationships: [...],
|
||||
// confidence: 0.85,
|
||||
// insights: [...],
|
||||
// preview: "..."
|
||||
// }
|
||||
```
|
||||
|
||||
### Standard Import/Export
|
||||
|
||||
```typescript
|
||||
import(data, format) // Standard import
|
||||
importSparseData(data) // Sparse format import
|
||||
backup() // Create full backup
|
||||
restore(backup) // Restore from backup
|
||||
```
|
||||
|
||||
## 🎯 VERB SCORING
|
||||
|
||||
```typescript
|
||||
// === INTELLIGENT SCORING ===
|
||||
provideFeedbackForVerbScoring(feedback) // Train model
|
||||
getVerbScoringStats() // Get statistics
|
||||
exportVerbScoringLearningData() // Export training
|
||||
importVerbScoringLearningData(data) // Import training
|
||||
```
|
||||
|
||||
## 🔄 SYNC & DISTRIBUTION
|
||||
|
||||
### Remote Operations
|
||||
|
||||
```typescript
|
||||
// === REMOTE CONNECTION ===
|
||||
connectToRemoteServer(url, options?) // Connect to remote
|
||||
disconnectFromRemoteServer() // Disconnect
|
||||
isConnectedToRemoteServer() // Check status
|
||||
|
||||
// === SEARCH MODES ===
|
||||
searchLocal(query, k?) // Local only
|
||||
searchRemote(query, k?) // Remote only
|
||||
searchCombined(query, k?) // Both sources
|
||||
```
|
||||
|
||||
### Real-time Sync
|
||||
|
||||
```typescript
|
||||
enableRealtimeUpdates(config) // Enable sync
|
||||
disableRealtimeUpdates() // Disable sync
|
||||
getRealtimeUpdateConfig() // Get config
|
||||
checkForUpdatesNow() // Manual sync
|
||||
```
|
||||
|
||||
## 📊 MONITORING & STATS
|
||||
|
||||
```typescript
|
||||
// === STATISTICS ===
|
||||
size() // Total noun count
|
||||
getStatistics(options?) // Full statistics
|
||||
getServiceStatistics(service) // Per-service stats
|
||||
listServices() // List all services
|
||||
flushStatistics() // Persist stats
|
||||
|
||||
// === HEALTH & CACHE ===
|
||||
getHealthStatus() // System health
|
||||
status() // Full status report
|
||||
getCacheStats() // Cache statistics
|
||||
clearCache() // Clear all caches
|
||||
```
|
||||
|
||||
## ⚙️ CONFIGURATION
|
||||
|
||||
### Operational Modes
|
||||
|
||||
```typescript
|
||||
// === MODE CONTROL ===
|
||||
isReadOnly() / setReadOnly(bool) // Read-only mode
|
||||
isWriteOnly() / setWriteOnly(bool) // Write-only mode
|
||||
isFrozen() / setFrozen(bool) // Freeze all changes
|
||||
```
|
||||
|
||||
### Augmentations
|
||||
|
||||
```typescript
|
||||
// === AUGMENTATION SYSTEM ===
|
||||
augmentations.register(augmentation) // Add augmentation
|
||||
augmentations.list() // List all
|
||||
augmentations.get(name) // Get by name
|
||||
```
|
||||
|
||||
## 💾 DATA MANAGEMENT
|
||||
|
||||
```typescript
|
||||
// === CLEAR OPERATIONS ===
|
||||
clear(options?) // Clear all data
|
||||
clearNouns(options?) // Clear nouns only
|
||||
clearVerbs(options?) // Clear verbs only
|
||||
|
||||
// === INDEX MANAGEMENT ===
|
||||
rebuildMetadataIndex() // Rebuild index
|
||||
getFilterFields() // Get indexed fields
|
||||
getFilterValues(field) // Get unique values
|
||||
```
|
||||
|
||||
## 🧬 EMBEDDINGS & SIMILARITY
|
||||
|
||||
```typescript
|
||||
embed(text) // Generate embedding
|
||||
calculateSimilarity(a, b, metric?) // Calculate similarity
|
||||
// metric: 'cosine' | 'euclidean' | 'manhattan'
|
||||
```
|
||||
|
||||
## 🔒 SECURITY
|
||||
|
||||
```typescript
|
||||
encryptData(data) // Encrypt data
|
||||
decryptData(data) // Decrypt data
|
||||
```
|
||||
|
||||
## 🎲 UTILITIES
|
||||
|
||||
```typescript
|
||||
generateRandomGraph(nodes, edges) // Generate test data
|
||||
getAvailableFieldNames() // Get field names
|
||||
getStandardFieldMappings() // Get field mappings
|
||||
```
|
||||
|
||||
## 🚀 LIFECYCLE
|
||||
|
||||
```typescript
|
||||
// === INITIALIZATION ===
|
||||
const brain = new BrainyData(config?) // Create instance
|
||||
await brain.init() // Initialize (REQUIRED!)
|
||||
await brain.shutDown() // Graceful shutdown
|
||||
await brain.cleanup() // Clean resources
|
||||
|
||||
// === STATIC METHODS ===
|
||||
BrainyData.preloadModel(options?) // Preload ML model
|
||||
BrainyData.warmup(options?) // Warmup system
|
||||
```
|
||||
|
||||
### Configuration Options
|
||||
|
||||
```typescript
|
||||
new BrainyData({
|
||||
// Storage
|
||||
storage: 'auto' | 'memory' | 'filesystem' | 's3' | {
|
||||
adapter: 'custom',
|
||||
// ... storage options
|
||||
},
|
||||
|
||||
// Vector configuration
|
||||
dimensions: 384, // Vector dimensions
|
||||
similarity: 'cosine', // Similarity metric
|
||||
|
||||
// Performance
|
||||
cache: true, // Enable caching
|
||||
index: true, // Enable indexing
|
||||
metrics: true, // Enable metrics
|
||||
|
||||
// Advanced
|
||||
augmentations: [...], // Custom augmentations
|
||||
verbose: false // Logging verbosity
|
||||
})
|
||||
```
|
||||
|
||||
## 📐 READ-ONLY PROPERTIES
|
||||
|
||||
```typescript
|
||||
brain.dimensions // Vector dimensions
|
||||
brain.maxConnections // HNSW max connections
|
||||
brain.efConstruction // HNSW ef construction
|
||||
brain.initialized // Is initialized?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ KEY POINTS:
|
||||
|
||||
1. **Brainy Operators** - NOT MongoDB style ($gt, $lt)
|
||||
2. **Neural API** - Complete with visualization export
|
||||
3. **Simple Search** - Just `search()` and `find()`
|
||||
4. **Triple Intelligence** - Vector + Graph + Metadata in `find()`
|
||||
5. **Auto-embedding** - `addNoun()` accepts text directly
|
||||
6. **Unified Methods** - `getNouns()` handles all plural queries
|
||||
7. **Clean Architecture** - Augmentation system for extensibility
|
||||
|
||||
## ⚠️ IMPORTANT NOTES:
|
||||
|
||||
- **NO MongoDB operators** - We use `greaterThan` not `$gt` (legal reasons)
|
||||
- **Neural API is via brain.neural** - All clustering/viz methods available
|
||||
- **search() is convenience** - Just wraps `find({like: query})`
|
||||
- **find() is powerful** - Full Triple Intelligence capabilities
|
||||
- **One import method** - `neuralImport()` auto-detects format
|
||||
|
|
@ -1,227 +0,0 @@
|
|||
# 🧠 Brainy 2.0 Complete Public API
|
||||
|
||||
> **ONE METHOD, ONE PURPOSE** - No duplicates, no aliases, just clean specific methods.
|
||||
|
||||
## 📚 NOUNS (Vectors with Metadata)
|
||||
|
||||
### Single Operations
|
||||
```typescript
|
||||
addNoun(vector, metadata?) // Add one noun
|
||||
getNoun(id) // Get one noun
|
||||
updateNoun(id, vector?, metadata?) // Update noun
|
||||
updateNounMetadata(id, metadata) // Update metadata only
|
||||
getNounMetadata(id) // Get metadata only
|
||||
deleteNoun(id) // Delete one noun
|
||||
hasNoun(id) // Check if exists
|
||||
getNounWithVerbs(id) // Get with relationships
|
||||
```
|
||||
|
||||
### Batch Operations
|
||||
```typescript
|
||||
addNouns(items[]) // Add multiple nouns
|
||||
getNounsByIds(ids[]) // Get multiple by IDs
|
||||
deleteNouns(ids[]) // Delete multiple nouns
|
||||
queryNouns(options) // Query with filters/pagination
|
||||
```
|
||||
|
||||
## 🔗 VERBS (Relationships)
|
||||
|
||||
### Single Operations
|
||||
```typescript
|
||||
addVerb(source, target, type, metadata?) // Add relationship
|
||||
getVerb(id) // Get one verb
|
||||
deleteVerb(id) // Delete one verb
|
||||
```
|
||||
|
||||
### Batch Operations
|
||||
```typescript
|
||||
addVerbs(verbs[]) // Add multiple verbs
|
||||
getVerbs(filter?) // Get filtered verbs
|
||||
deleteVerbs(ids[]) // Delete multiple verbs
|
||||
getVerbsBySource(sourceId) // Get outgoing relationships
|
||||
getVerbsByTarget(targetId) // Get incoming relationships
|
||||
getVerbsByType(type) // Get by relationship type
|
||||
```
|
||||
|
||||
## 🔍 SEARCH
|
||||
|
||||
### Vector Search
|
||||
```typescript
|
||||
search(query, k?, options?) // Primary vector search
|
||||
searchText(text, k?, options?) // Natural language search
|
||||
findSimilar(id, k?, options?) // Find similar to noun
|
||||
searchWithCursor(query, cursor) // Paginated search
|
||||
```
|
||||
|
||||
### Advanced Search
|
||||
```typescript
|
||||
find(query) // Triple Intelligence 🧠
|
||||
searchByNounTypes(types[], query) // Filter by noun types
|
||||
searchWithinItems(query, ids[], k?) // Search within specific nouns
|
||||
searchVerbs(query) // Search relationships
|
||||
searchNounsByVerbs(conditions) // Graph-based noun search
|
||||
searchByStandardField(field, value) // Metadata-based search
|
||||
```
|
||||
|
||||
### Distributed Search
|
||||
```typescript
|
||||
searchLocal(query) // Local only
|
||||
searchRemote(query) // Remote only
|
||||
searchCombined(query) // Both sources
|
||||
```
|
||||
|
||||
## 📊 GRAPH OPERATIONS
|
||||
|
||||
```typescript
|
||||
getConnections(id, depth?) // Get all connections
|
||||
getVerbsBySource(sourceId) // Outgoing edges
|
||||
getVerbsByTarget(targetId) // Incoming edges
|
||||
getVerbsByType(type) // Filter by type
|
||||
```
|
||||
|
||||
## 🎯 PERFORMANCE & STATS
|
||||
|
||||
### Cache
|
||||
```typescript
|
||||
getCacheStats() // Cache statistics
|
||||
clearCache() // Clear search cache
|
||||
```
|
||||
|
||||
### Statistics
|
||||
```typescript
|
||||
size() // Total noun count
|
||||
getStatistics(options?) // Complete statistics
|
||||
getServiceStatistics(service) // Per-service stats
|
||||
listServices() // List all services
|
||||
flushStatistics() // Flush to storage
|
||||
```
|
||||
|
||||
### Health & Status
|
||||
```typescript
|
||||
getHealthStatus() // System health
|
||||
status() // Full status report
|
||||
```
|
||||
|
||||
## 🔧 CONFIGURATION & MODES
|
||||
|
||||
### Operational Modes
|
||||
```typescript
|
||||
isReadOnly() / setReadOnly(bool) // Read-only mode
|
||||
isWriteOnly() / setWriteOnly(bool) // Write-only mode
|
||||
isFrozen() / setFrozen(bool) // Freeze modifications
|
||||
```
|
||||
|
||||
### Real-time Updates
|
||||
```typescript
|
||||
enableRealtimeUpdates(config) // Enable live sync
|
||||
disableRealtimeUpdates() // Disable sync
|
||||
getRealtimeUpdateConfig() // Get config
|
||||
checkForUpdatesNow() // Manual sync
|
||||
```
|
||||
|
||||
### Remote Connection
|
||||
```typescript
|
||||
connectToRemoteServer(url, options?) // Connect remote
|
||||
disconnectFromRemoteServer() // Disconnect
|
||||
isConnectedToRemoteServer() // Check connection
|
||||
```
|
||||
|
||||
## 🧠 INTELLIGENCE FEATURES
|
||||
|
||||
### Verb Scoring
|
||||
```typescript
|
||||
provideFeedbackForVerbScoring(feedback) // Train scoring
|
||||
getVerbScoringStats() // Get statistics
|
||||
exportVerbScoringLearningData() // Export training
|
||||
importVerbScoringLearningData(data) // Import training
|
||||
```
|
||||
|
||||
### Embeddings
|
||||
```typescript
|
||||
embed(text) // Generate embedding
|
||||
calculateSimilarity(a, b) // Compare vectors
|
||||
```
|
||||
|
||||
## 💾 DATA MANAGEMENT
|
||||
|
||||
### Clear Operations
|
||||
```typescript
|
||||
clear(options?) // Clear all data
|
||||
clearNouns(options?) // Clear all nouns
|
||||
clearVerbs(options?) // Clear all verbs
|
||||
```
|
||||
|
||||
### Import/Export
|
||||
```typescript
|
||||
backup() // Create backup
|
||||
restore(backup) // Restore backup
|
||||
import(data, format) // Import data
|
||||
importSparseData(data) // Import sparse
|
||||
```
|
||||
|
||||
### Index Management
|
||||
```typescript
|
||||
rebuildMetadataIndex() // Rebuild index
|
||||
getFilterFields() // Get indexed fields
|
||||
getFilterValues(field) // Get field values
|
||||
```
|
||||
|
||||
## 🔒 SECURITY
|
||||
|
||||
```typescript
|
||||
encryptData(data) // Encrypt
|
||||
decryptData(data) // Decrypt
|
||||
```
|
||||
|
||||
## 🎲 UTILITIES
|
||||
|
||||
```typescript
|
||||
generateRandomGraph(nodes, edges) // Generate test data
|
||||
getAvailableFieldNames() // Available fields
|
||||
getStandardFieldMappings() // Field mappings
|
||||
```
|
||||
|
||||
## 🚀 LIFECYCLE
|
||||
|
||||
### Instance Methods
|
||||
```typescript
|
||||
init() // Initialize (required!)
|
||||
shutDown() // Graceful shutdown
|
||||
cleanup() // Clean resources
|
||||
```
|
||||
|
||||
### Static Methods
|
||||
```typescript
|
||||
BrainyData.preloadModel(options?) // Preload ML model
|
||||
BrainyData.warmup(options?) // Warmup system
|
||||
```
|
||||
|
||||
## 📐 PROPERTIES
|
||||
|
||||
```typescript
|
||||
dimensions // Vector dimensions (readonly)
|
||||
maxConnections // HNSW max connections (readonly)
|
||||
efConstruction // HNSW ef construction (readonly)
|
||||
initialized // Is initialized (readonly)
|
||||
```
|
||||
|
||||
## ❌ REMOVED/PRIVATE IN 2.0
|
||||
|
||||
These methods are now **private** - use the new specific methods above:
|
||||
- ~~add()~~ → Use `addNoun()`
|
||||
- ~~get()~~ → Use `getNoun()`
|
||||
- ~~delete()~~ → Use `deleteNoun()`
|
||||
- ~~update()~~ → Use `updateNoun()`
|
||||
- ~~relate()~~ → Use `addVerb()`
|
||||
- ~~connect()~~ → Use `addVerb()`
|
||||
- ~~has()~~ → Use `hasNoun()`
|
||||
- ~~exists()~~ → Use `hasNoun()`
|
||||
- ~~getMetadata()~~ → Use `getNounMetadata()`
|
||||
- ~~updateMetadata()~~ → Use `updateNounMetadata()`
|
||||
- ~~clearAll()~~ → Use `clear()`
|
||||
- ~~addItem()~~ → Removed
|
||||
- ~~addToBoth()~~ → Removed
|
||||
- ~~addBatch()~~ → Use `addNouns()`
|
||||
- ~~getBatch()~~ → Use `getNounsByIds()`
|
||||
- ~~getNouns()~~ with IDs → Use `getNounsByIds()`
|
||||
- ~~getNouns()~~ with filters → Use `queryNouns()`
|
||||
|
|
@ -1,185 +0,0 @@
|
|||
# 🚨 CRITICAL API AUDIT - What We Changed & Lost
|
||||
|
||||
## 📅 Timeline of Changes (Friday-Saturday)
|
||||
|
||||
### Friday Changes:
|
||||
1. Started unifying augmentation system to single BrainyAugmentation interface
|
||||
2. Made old methods (add, get, delete) private
|
||||
3. Created new specific methods (addNoun, getNoun, deleteNoun)
|
||||
4. Started removing backward compatibility
|
||||
|
||||
### Saturday Changes:
|
||||
1. Combined getNounsByIds and queryNouns into single getNouns method
|
||||
2. Simplified search API (may have oversimplified!)
|
||||
3. Accidentally introduced MongoDB operators ($gt, $in, etc.)
|
||||
4. May have removed critical features while "simplifying"
|
||||
|
||||
## ❌ CRITICAL MISTAKES WE MADE:
|
||||
|
||||
### 1. **MongoDB Operators (LEGAL RISK!)**
|
||||
```typescript
|
||||
// ❌ WRONG - We accidentally added:
|
||||
where: { field: {$gt: value} }
|
||||
|
||||
// ✅ CORRECT - Should be:
|
||||
where: { field: {greaterThan: value} }
|
||||
```
|
||||
|
||||
### 2. **Lost Neural API Methods**
|
||||
```typescript
|
||||
// ❌ MISSING - These were removed or not properly exposed:
|
||||
brain.neural.similar(a, b)
|
||||
brain.neural.clusters()
|
||||
brain.neural.hierarchy(id)
|
||||
brain.neural.neighbors(id)
|
||||
brain.neural.outliers()
|
||||
brain.neural.semanticPath(from, to)
|
||||
brain.neural.visualize() // Critical for external tools!
|
||||
brain.neural.clusterFast() // O(n) performance
|
||||
brain.neural.clusterLarge() // Million-item support
|
||||
```
|
||||
|
||||
### 3. **Lost Import Capabilities**
|
||||
```typescript
|
||||
// ❌ WRONG - We made it too complex:
|
||||
neuralImport.csv()
|
||||
neuralImport.json()
|
||||
neuralImport.text()
|
||||
|
||||
// ✅ CORRECT - Should be ONE simple method:
|
||||
brain.neuralImport(data, options?) // Auto-detects format!
|
||||
```
|
||||
|
||||
### 4. **Lost Clustering for Visualization**
|
||||
The visualization data format for external tools (D3, Cytoscape, GraphML) is missing!
|
||||
```typescript
|
||||
// ❌ MISSING - Critical for external visualization:
|
||||
{
|
||||
format: 'd3' | 'cytoscape' | 'graphml',
|
||||
nodes: [...],
|
||||
edges: [...],
|
||||
layout: {...}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. **Oversimplified Search**
|
||||
```typescript
|
||||
// ❌ REMOVED too many methods:
|
||||
searchByNounTypes()
|
||||
searchWithinItems()
|
||||
searchByStandardField()
|
||||
searchVerbs()
|
||||
searchNounsByVerbs()
|
||||
|
||||
// ✅ BUT this is actually OK if find() handles everything!
|
||||
// Just need to ensure find() is complete
|
||||
```
|
||||
|
||||
## 🔍 COMPARISON: Backup vs Current
|
||||
|
||||
### Methods in BACKUP but NOT in current:
|
||||
```typescript
|
||||
// From backup's brainyData.ts:
|
||||
brain.neural // ❌ Not properly exposed
|
||||
brain.visualize() // ❌ Missing
|
||||
brain.clusters() // ❌ Missing
|
||||
brain.similar() // ❌ Missing
|
||||
brain.neuralImport() // ❌ Wrong implementation
|
||||
|
||||
// Operators in backup:
|
||||
greaterThan, lessThan, equals // ❌ Replaced with $gt, $lt, $eq
|
||||
oneOf, contains, matches // ❌ Replaced with $in, $contains, $regex
|
||||
```
|
||||
|
||||
### Methods we ADDED (some good, some questionable):
|
||||
```typescript
|
||||
// New specific methods (GOOD ✅):
|
||||
addNoun(), getNoun(), deleteNoun()
|
||||
|
||||
// Unified method (GOOD if complete ✅):
|
||||
getNouns(idsOrOptions)
|
||||
|
||||
// But lost flexibility (BAD ❌):
|
||||
- Can't do complex queries easily
|
||||
- Lost specific search methods
|
||||
```
|
||||
|
||||
## 📊 Feature Comparison Table
|
||||
|
||||
| Feature | Backup | Current | Status |
|
||||
|---------|---------|---------|---------|
|
||||
| **Operators** | greaterThan, lessThan | $gt, $lt | ❌ WRONG |
|
||||
| **Neural API** | Complete (10+ methods) | Missing/Hidden | ❌ BROKEN |
|
||||
| **Clustering** | Full support | Missing | ❌ LOST |
|
||||
| **Visualization** | D3/Cytoscape export | None | ❌ LOST |
|
||||
| **Import** | Simple neuralImport() | Complex multi-method | ❌ WRONG |
|
||||
| **Search** | Multiple specific | Simplified to 2 | ⚠️ OK if complete |
|
||||
| **Verb Scoring** | Full intelligence | Partial | ⚠️ CHECK |
|
||||
| **Synapses** | External connectors | Unknown | ⚠️ CHECK |
|
||||
| **Conduits** | Brainy-to-Brainy | Partial | ⚠️ CHECK |
|
||||
|
||||
## 🔧 WHAT WE NEED TO FIX IMMEDIATELY:
|
||||
|
||||
### Priority 1 (CRITICAL):
|
||||
1. **Replace ALL MongoDB operators with Brainy operators**
|
||||
- This is a legal requirement!
|
||||
- greaterThan not $gt
|
||||
|
||||
2. **Restore Neural API completely**
|
||||
- brain.neural must have all methods
|
||||
- Visualization MUST work for external tools
|
||||
|
||||
3. **Fix neuralImport to be simple**
|
||||
- ONE method that auto-detects
|
||||
- Not multiple complex methods
|
||||
|
||||
### Priority 2 (IMPORTANT):
|
||||
4. **Restore clustering APIs**
|
||||
- For visualization tools
|
||||
- For analysis
|
||||
|
||||
5. **Verify Triple Intelligence is complete**
|
||||
- find() must handle everything
|
||||
- All operators must work
|
||||
|
||||
6. **Check augmentation system**
|
||||
- Synapses (external)
|
||||
- Conduits (internal)
|
||||
|
||||
## 🎯 RECOVERY PLAN:
|
||||
|
||||
### Step 1: Fix Operators (LEGAL REQUIREMENT)
|
||||
- [ ] Find all $gt, $lt, $in, $regex references
|
||||
- [ ] Replace with greaterThan, lessThan, oneOf, matches
|
||||
- [ ] Update all documentation
|
||||
|
||||
### Step 2: Restore Neural API
|
||||
- [ ] Ensure brain.neural is properly exposed
|
||||
- [ ] All methods available: similar, clusters, hierarchy, etc.
|
||||
- [ ] Visualization must return proper format
|
||||
|
||||
### Step 3: Fix Import
|
||||
- [ ] Single neuralImport() method
|
||||
- [ ] Auto-detection of format
|
||||
- [ ] Simple options
|
||||
|
||||
### Step 4: Verify Nothing Lost
|
||||
- [ ] Compare method-by-method with backup
|
||||
- [ ] Test all features
|
||||
- [ ] Update documentation
|
||||
|
||||
## 💡 LESSONS LEARNED:
|
||||
|
||||
1. **Don't oversimplify** - We lost important features
|
||||
2. **Check legal requirements** - MongoDB operators were avoided for a reason
|
||||
3. **Preserve all features** - Even if reorganizing
|
||||
4. **Test against backup** - Always compare functionality
|
||||
5. **Document changes** - Track what and why
|
||||
|
||||
## 🚀 NEXT ACTIONS:
|
||||
|
||||
1. STOP all other work
|
||||
2. Fix operators IMMEDIATELY (legal risk)
|
||||
3. Restore neural API completely
|
||||
4. Test everything works
|
||||
5. Document the final API properly
|
||||
|
|
@ -1,210 +0,0 @@
|
|||
# 🧠 Brainy 2.0 Final Public API
|
||||
|
||||
> **Clean, Specific, Beautiful** - Every method has ONE clear purpose.
|
||||
|
||||
## 📚 NOUNS (Vectors with Metadata)
|
||||
|
||||
```typescript
|
||||
// Single Operations
|
||||
addNoun(vector, metadata?) // Add one noun
|
||||
getNoun(id) // Get one noun by ID
|
||||
updateNoun(id, vector?, metadata?) // Update entire noun
|
||||
updateNounMetadata(id, metadata) // Update metadata only
|
||||
getNounMetadata(id) // Get metadata only
|
||||
getNounWithVerbs(id) // Get noun with all relationships
|
||||
deleteNoun(id) // Delete one noun
|
||||
hasNoun(id) // Check if noun exists
|
||||
|
||||
// Batch Operations
|
||||
addNouns(items[]) // Add multiple nouns
|
||||
getNouns(idsOrOptions) // Get multiple nouns (by IDs or query)
|
||||
// getNouns(['id1', 'id2']) // Get by specific IDs
|
||||
// getNouns({ filter: {...} }) // Get with filters
|
||||
// getNouns({ limit: 10, offset: 20 }) // Get with pagination
|
||||
deleteNouns(ids[]) // Delete multiple nouns
|
||||
```
|
||||
|
||||
## 🔗 VERBS (Relationships)
|
||||
|
||||
```typescript
|
||||
// Single Operations
|
||||
addVerb(source, target, type, metadata?) // Create relationship
|
||||
getVerb(id) // Get one verb by ID
|
||||
deleteVerb(id) // Delete one verb
|
||||
|
||||
// Batch Operations
|
||||
addVerbs(verbs[]) // Add multiple relationships
|
||||
getVerbs(filter?) // Get filtered verbs
|
||||
getVerbsBySource(sourceId) // Get outgoing relationships
|
||||
getVerbsByTarget(targetId) // Get incoming relationships
|
||||
getVerbsByType(type) // Get by relationship type
|
||||
deleteVerbs(ids[]) // Delete multiple verbs
|
||||
```
|
||||
|
||||
## 🔍 SEARCH
|
||||
|
||||
```typescript
|
||||
// Core Search
|
||||
search(query, k?, options?) // Primary vector search
|
||||
searchText(text, k?, options?) // Natural language search
|
||||
find(query) // Triple Intelligence (Vector+Graph+Metadata) 🧠
|
||||
findSimilar(id, k?, options?) // Find similar to existing noun
|
||||
|
||||
// Advanced Search
|
||||
searchByNounTypes(types[], query, k?) // Filter by noun types
|
||||
searchWithinItems(query, ids[], k?) // Search within specific nouns
|
||||
searchWithCursor(query, cursor) // Paginated search
|
||||
searchByStandardField(field, value, k?) // Metadata-based search
|
||||
|
||||
// Graph Search
|
||||
searchVerbs(query, options?) // Search relationships
|
||||
searchNounsByVerbs(conditions) // Find nouns by relationships
|
||||
|
||||
// Distributed Search
|
||||
searchLocal(query, k?) // Search local instance only
|
||||
searchRemote(query, k?) // Search remote instance only
|
||||
searchCombined(query, k?) // Search both local and remote
|
||||
```
|
||||
|
||||
## 📊 METADATA & FILTERING
|
||||
|
||||
```typescript
|
||||
getFilterFields() // Get all indexed fields
|
||||
getFilterValues(field) // Get unique values for a field
|
||||
getAvailableFieldNames() // Get available field names
|
||||
getStandardFieldMappings() // Get standard field mappings
|
||||
```
|
||||
|
||||
## 🚀 PERFORMANCE & MONITORING
|
||||
|
||||
```typescript
|
||||
// Cache
|
||||
getCacheStats() // Get cache statistics
|
||||
clearCache() // Clear search cache
|
||||
|
||||
// Statistics
|
||||
size() // Total noun count
|
||||
getStatistics(options?) // Comprehensive statistics
|
||||
getServiceStatistics(service) // Per-service statistics
|
||||
listServices() // List all services
|
||||
flushStatistics() // Persist statistics to storage
|
||||
|
||||
// Health
|
||||
getHealthStatus() // System health check
|
||||
status() // Full status report
|
||||
```
|
||||
|
||||
## ⚙️ CONFIGURATION
|
||||
|
||||
```typescript
|
||||
// Operational Modes
|
||||
isReadOnly() / setReadOnly(bool) // Read-only mode
|
||||
isWriteOnly() / setWriteOnly(bool) // Write-only mode
|
||||
isFrozen() / setFrozen(bool) // Freeze all modifications
|
||||
|
||||
// Real-time Sync
|
||||
enableRealtimeUpdates(config) // Enable live synchronization
|
||||
disableRealtimeUpdates() // Disable synchronization
|
||||
getRealtimeUpdateConfig() // Get current config
|
||||
checkForUpdatesNow() // Manual sync trigger
|
||||
|
||||
// Remote Connection
|
||||
connectToRemoteServer(url, options?) // Connect to remote instance
|
||||
disconnectFromRemoteServer() // Disconnect from remote
|
||||
isConnectedToRemoteServer() // Check connection status
|
||||
```
|
||||
|
||||
## 🧠 INTELLIGENCE
|
||||
|
||||
```typescript
|
||||
// Verb Scoring
|
||||
provideFeedbackForVerbScoring(feedback) // Train relationship scoring
|
||||
getVerbScoringStats() // Get scoring statistics
|
||||
exportVerbScoringLearningData() // Export training data
|
||||
importVerbScoringLearningData(data) // Import training data
|
||||
|
||||
// Embeddings
|
||||
embed(text) // Generate embedding vector
|
||||
calculateSimilarity(a, b, metric?) // Calculate vector similarity
|
||||
```
|
||||
|
||||
## 💾 DATA MANAGEMENT
|
||||
|
||||
```typescript
|
||||
// Clear Operations
|
||||
clear(options?) // Clear all data
|
||||
clearNouns(options?) // Clear all nouns only
|
||||
clearVerbs(options?) // Clear all verbs only
|
||||
|
||||
// Backup & Restore
|
||||
backup() // Create full backup
|
||||
restore(backup) // Restore from backup
|
||||
|
||||
// Import/Export
|
||||
import(data, format) // Import external data
|
||||
importSparseData(data) // Import sparse format
|
||||
|
||||
// Index Management
|
||||
rebuildMetadataIndex() // Rebuild metadata index
|
||||
```
|
||||
|
||||
## 🔒 SECURITY
|
||||
|
||||
```typescript
|
||||
encryptData(data) // Encrypt data
|
||||
decryptData(data) // Decrypt data
|
||||
```
|
||||
|
||||
## 🎲 UTILITIES
|
||||
|
||||
```typescript
|
||||
generateRandomGraph(nodes, edges) // Generate test graph data
|
||||
```
|
||||
|
||||
## 🚀 LIFECYCLE
|
||||
|
||||
```typescript
|
||||
// Instance Methods
|
||||
new BrainyData(config?) // Create instance
|
||||
init() // Initialize (REQUIRED!)
|
||||
shutDown() // Graceful shutdown
|
||||
cleanup() // Clean up resources
|
||||
|
||||
// Static Methods
|
||||
BrainyData.preloadModel(options?) // Preload ML model
|
||||
BrainyData.warmup(options?) // Warmup system
|
||||
```
|
||||
|
||||
## 📐 PROPERTIES (Read-only)
|
||||
|
||||
```typescript
|
||||
dimensions // Vector dimensions
|
||||
maxConnections // HNSW max connections
|
||||
efConstruction // HNSW ef construction
|
||||
initialized // Is initialized?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Key Changes in 2.0
|
||||
|
||||
### ✅ Simplified & Unified
|
||||
- `getNouns()` now handles ALL plural queries (by IDs, filters, or pagination)
|
||||
- No more `getNounsByIds()`, `queryNouns()`, `getBatch()` - just `getNouns()`
|
||||
- Clear singular vs plural: `getNoun()` for one, `getNouns()` for many
|
||||
|
||||
### ✅ Specific Naming
|
||||
- Always specify noun/verb: `addNoun()` not `add()`
|
||||
- No aliases or duplicates
|
||||
- One method, one purpose
|
||||
|
||||
### ✅ Private Legacy Methods
|
||||
These are now private (use new methods above):
|
||||
- `add()`, `get()`, `delete()`, `update()`
|
||||
- `relate()`, `connect()`, `has()`, `exists()`
|
||||
- `getMetadata()`, `updateMetadata()`
|
||||
- `addItem()`, `addToBoth()`, `addBatch()`, `getBatch()`
|
||||
|
||||
### ✅ Triple Intelligence
|
||||
- New `find()` method unifies Vector + Graph + Metadata search
|
||||
- Most powerful search capability in one simple method
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
# API Design Archive
|
||||
|
||||
This directory contains historical API design documents from the Brainy 2.0 development process.
|
||||
|
||||
## Purpose
|
||||
These documents represent the iterative refinement of the Brainy 2.0 API during development. They are preserved here for historical reference and to document the design decisions made along the way.
|
||||
|
||||
## Current API Documentation
|
||||
The definitive API documentation is now located at:
|
||||
- **`/docs/api/README.md`** - The ONE official API reference
|
||||
|
||||
## Archived Documents
|
||||
These documents show the evolution of the API design:
|
||||
- Various iterations of API structure
|
||||
- Exploration of different naming conventions
|
||||
- Refinement of the Triple Intelligence concept
|
||||
- Transition from MongoDB operators to Brainy operators
|
||||
- Evolution of the Neural API
|
||||
|
||||
## Key Decisions Made
|
||||
1. **Terminology**: Vector + Graph + Metadata (not Field)
|
||||
2. **Operators**: Brainy operators (greaterThan, lessThan) not MongoDB ($gt, $lt)
|
||||
3. **Methods**: Specific noun/verb naming (addNoun, getNoun)
|
||||
4. **Unification**: Single getNouns() method instead of multiple variants
|
||||
5. **Neural API**: Complete clustering and visualization features
|
||||
|
||||
## Note
|
||||
These documents are archived, not deleted, to preserve the development history and rationale behind API decisions.
|
||||
|
|
@ -1,549 +0,0 @@
|
|||
# 🌐 Brainy API Exposure Architecture
|
||||
|
||||
## 📡 Current State: Built-in MCP Support
|
||||
|
||||
Brainy **already has** Model Context Protocol (MCP) support built-in:
|
||||
|
||||
```typescript
|
||||
// Already exists in Brainy!
|
||||
import { BrainyMCPService } from 'brainy/mcp'
|
||||
|
||||
const brain = new BrainyData()
|
||||
const mcpService = new BrainyMCPService(brain)
|
||||
|
||||
// Handles MCP requests
|
||||
const response = await mcpService.handleRequest({
|
||||
type: 'data_access',
|
||||
operation: 'search',
|
||||
parameters: { query: 'find documents' }
|
||||
})
|
||||
```
|
||||
|
||||
### What's Already Built:
|
||||
- **BrainyMCPAdapter** - Exposes data operations
|
||||
- **MCPAugmentationToolset** - Exposes augmentations as MCP tools
|
||||
- **BrainyMCPService** - Unified service layer
|
||||
- **ServerSearchConduitAugmentation** - Connect to remote Brainy instances
|
||||
|
||||
## 🚀 The Missing Piece: API Server Augmentation
|
||||
|
||||
What's **NOT** built yet is a unified API server that exposes REST, WebSocket, and MCP over network. This SHOULD be an augmentation!
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* Universal API Server Augmentation
|
||||
* Exposes Brainy through REST, WebSocket, MCP, and GraphQL
|
||||
*/
|
||||
export class APIServerAugmentation extends BaseAugmentation {
|
||||
readonly name = 'api-server'
|
||||
readonly timing = 'after' as const
|
||||
readonly operations = ['all'] as const // Monitor all operations
|
||||
readonly priority = 5 // Low priority, runs last
|
||||
|
||||
private httpServer?: any
|
||||
private wsServer?: any
|
||||
private mcpService?: BrainyMCPService
|
||||
private clients = new Set<any>()
|
||||
private apiKeys = new Map<string, any>()
|
||||
|
||||
protected async onInitialize(): Promise<void> {
|
||||
const config = this.context.config.apiServer || {}
|
||||
|
||||
if (!config.enabled) {
|
||||
this.log('API Server disabled in config')
|
||||
return
|
||||
}
|
||||
|
||||
// Initialize MCP service
|
||||
this.mcpService = new BrainyMCPService(this.context.brain, {
|
||||
enableAuth: config.requireAuth
|
||||
})
|
||||
|
||||
// Start servers based on environment
|
||||
if (typeof process !== 'undefined' && process.versions?.node) {
|
||||
await this.startNodeServers(config)
|
||||
} else if (typeof Deno !== 'undefined') {
|
||||
await this.startDenoServer(config)
|
||||
} else if (typeof self !== 'undefined') {
|
||||
await this.startServiceWorker(config)
|
||||
}
|
||||
}
|
||||
|
||||
private async startNodeServers(config: any) {
|
||||
const express = await import('express')
|
||||
const { WebSocketServer } = await import('ws')
|
||||
const cors = await import('cors')
|
||||
|
||||
const app = express.default()
|
||||
|
||||
// Middleware
|
||||
app.use(cors.default(config.cors))
|
||||
app.use(express.json())
|
||||
app.use(this.authMiddleware.bind(this))
|
||||
app.use(this.rateLimitMiddleware.bind(this))
|
||||
|
||||
// REST API Routes
|
||||
this.setupRESTRoutes(app)
|
||||
|
||||
// Start HTTP server
|
||||
this.httpServer = app.listen(config.port || 3000, () => {
|
||||
this.log(`REST API listening on port ${config.port || 3000}`)
|
||||
})
|
||||
|
||||
// WebSocket server for real-time
|
||||
this.wsServer = new WebSocketServer({
|
||||
server: this.httpServer,
|
||||
path: '/ws'
|
||||
})
|
||||
|
||||
this.setupWebSocketServer()
|
||||
|
||||
// MCP over WebSocket
|
||||
this.setupMCPWebSocket()
|
||||
}
|
||||
|
||||
private setupRESTRoutes(app: any) {
|
||||
// Health check
|
||||
app.get('/health', (req: any, res: any) => {
|
||||
res.json({ status: 'healthy', version: '2.0.0' })
|
||||
})
|
||||
|
||||
// Search endpoint
|
||||
app.post('/api/search', async (req: any, res: any) => {
|
||||
try {
|
||||
const { query, limit = 10, options = {} } = req.body
|
||||
const results = await this.context.brain.search(query, limit, options)
|
||||
res.json({ success: true, results })
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// Add data endpoint
|
||||
app.post('/api/add', async (req: any, res: any) => {
|
||||
try {
|
||||
const { content, metadata } = req.body
|
||||
const id = await this.context.brain.add(content, metadata)
|
||||
res.json({ success: true, id })
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// Get endpoint
|
||||
app.get('/api/get/:id', async (req: any, res: any) => {
|
||||
try {
|
||||
const data = await this.context.brain.get(req.params.id)
|
||||
res.json({ success: true, data })
|
||||
} catch (error) {
|
||||
res.status(404).json({
|
||||
success: false,
|
||||
error: 'Not found'
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// Delete endpoint
|
||||
app.delete('/api/delete/:id', async (req: any, res: any) => {
|
||||
try {
|
||||
await this.context.brain.delete(req.params.id)
|
||||
res.json({ success: true })
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// Relate endpoint
|
||||
app.post('/api/relate', async (req: any, res: any) => {
|
||||
try {
|
||||
const { source, target, verb, metadata } = req.body
|
||||
await this.context.brain.relate(source, target, verb, metadata)
|
||||
res.json({ success: true })
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// Find endpoint (complex queries)
|
||||
app.post('/api/find', async (req: any, res: any) => {
|
||||
try {
|
||||
const results = await this.context.brain.find(req.body)
|
||||
res.json({ success: true, results })
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// Cluster endpoint
|
||||
app.post('/api/cluster', async (req: any, res: any) => {
|
||||
try {
|
||||
const { algorithm = 'kmeans', options = {} } = req.body
|
||||
const clusters = await this.context.brain.cluster(algorithm, options)
|
||||
res.json({ success: true, clusters })
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// MCP endpoint (for non-WebSocket MCP)
|
||||
app.post('/api/mcp', async (req: any, res: any) => {
|
||||
try {
|
||||
const response = await this.mcpService.handleRequest(req.body)
|
||||
res.json(response)
|
||||
} catch (error) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
// GraphQL endpoint (optional)
|
||||
if (this.context.config.apiServer?.enableGraphQL) {
|
||||
this.setupGraphQL(app)
|
||||
}
|
||||
}
|
||||
|
||||
private setupWebSocketServer() {
|
||||
this.wsServer.on('connection', (ws: any) => {
|
||||
this.clients.add(ws)
|
||||
|
||||
ws.on('message', async (message: string) => {
|
||||
try {
|
||||
const msg = JSON.parse(message)
|
||||
await this.handleWebSocketMessage(msg, ws)
|
||||
} catch (error) {
|
||||
ws.send(JSON.stringify({
|
||||
type: 'error',
|
||||
error: error.message
|
||||
}))
|
||||
}
|
||||
})
|
||||
|
||||
ws.on('close', () => {
|
||||
this.clients.delete(ws)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
private async handleWebSocketMessage(msg: any, ws: any) {
|
||||
switch (msg.type) {
|
||||
case 'subscribe':
|
||||
// Subscribe to operations
|
||||
ws.subscriptions = msg.operations || ['all']
|
||||
ws.send(JSON.stringify({
|
||||
type: 'subscribed',
|
||||
operations: ws.subscriptions
|
||||
}))
|
||||
break
|
||||
|
||||
case 'search':
|
||||
const results = await this.context.brain.search(msg.query, msg.limit)
|
||||
ws.send(JSON.stringify({
|
||||
type: 'searchResults',
|
||||
results
|
||||
}))
|
||||
break
|
||||
|
||||
case 'mcp':
|
||||
// Handle MCP over WebSocket
|
||||
const response = await this.mcpService.handleRequest(msg.request)
|
||||
ws.send(JSON.stringify({
|
||||
type: 'mcpResponse',
|
||||
response
|
||||
}))
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
private setupMCPWebSocket() {
|
||||
// Dedicated MCP WebSocket endpoint
|
||||
const { WebSocketServer } = require('ws')
|
||||
const mcpWs = new WebSocketServer({
|
||||
port: (this.context.config.apiServer?.mcpPort || 3001),
|
||||
path: '/mcp'
|
||||
})
|
||||
|
||||
mcpWs.on('connection', (ws: any) => {
|
||||
ws.on('message', async (message: string) => {
|
||||
try {
|
||||
const request = JSON.parse(message)
|
||||
const response = await this.mcpService.handleRequest(request)
|
||||
ws.send(JSON.stringify(response))
|
||||
} catch (error) {
|
||||
ws.send(JSON.stringify({
|
||||
error: error.message,
|
||||
type: 'error'
|
||||
}))
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
this.log(`MCP WebSocket listening on port ${this.context.config.apiServer?.mcpPort || 3001}`)
|
||||
}
|
||||
|
||||
// Broadcast changes to all connected clients
|
||||
async execute<T>(operation: string, params: any, next: () => Promise<T>): Promise<T> {
|
||||
const result = await next()
|
||||
|
||||
// Broadcast to WebSocket clients
|
||||
if (this.clients.size > 0) {
|
||||
const message = JSON.stringify({
|
||||
type: 'operation',
|
||||
operation,
|
||||
params: this.sanitizeParams(params),
|
||||
timestamp: Date.now()
|
||||
})
|
||||
|
||||
for (const client of this.clients) {
|
||||
if (client.subscriptions?.includes('all') ||
|
||||
client.subscriptions?.includes(operation)) {
|
||||
client.send(message)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
private authMiddleware(req: any, res: any, next: any) {
|
||||
if (!this.context.config.apiServer?.requireAuth) {
|
||||
return next()
|
||||
}
|
||||
|
||||
const apiKey = req.headers['x-api-key']
|
||||
if (!apiKey || !this.apiKeys.has(apiKey)) {
|
||||
return res.status(401).json({ error: 'Unauthorized' })
|
||||
}
|
||||
|
||||
req.user = this.apiKeys.get(apiKey)
|
||||
next()
|
||||
}
|
||||
|
||||
private rateLimitMiddleware(req: any, res: any, next: any) {
|
||||
// Simple rate limiting
|
||||
const ip = req.ip
|
||||
const limit = this.context.config.apiServer?.rateLimit || 100
|
||||
|
||||
// Implementation details...
|
||||
next()
|
||||
}
|
||||
|
||||
private sanitizeParams(params: any) {
|
||||
// Remove sensitive data before broadcasting
|
||||
const safe = { ...params }
|
||||
delete safe.apiKey
|
||||
delete safe.password
|
||||
return safe
|
||||
}
|
||||
|
||||
protected async onShutdown() {
|
||||
// Close all connections
|
||||
for (const client of this.clients) {
|
||||
client.close()
|
||||
}
|
||||
|
||||
// Close servers
|
||||
if (this.httpServer) {
|
||||
await new Promise(resolve => this.httpServer.close(resolve))
|
||||
}
|
||||
if (this.wsServer) {
|
||||
this.wsServer.close()
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 Usage: Deploy Brainy as a Server
|
||||
|
||||
```typescript
|
||||
import { BrainyData } from 'brainy'
|
||||
import { APIServerAugmentation } from 'brainy/augmentations'
|
||||
|
||||
const brain = new BrainyData({
|
||||
apiServer: {
|
||||
enabled: true,
|
||||
port: 3000,
|
||||
mcpPort: 3001,
|
||||
requireAuth: true,
|
||||
rateLimit: 100,
|
||||
cors: { origin: '*' },
|
||||
enableGraphQL: false
|
||||
}
|
||||
})
|
||||
|
||||
// Register the API server augmentation
|
||||
brain.augmentations.register(new APIServerAugmentation())
|
||||
|
||||
await brain.init()
|
||||
|
||||
console.log('Brainy API Server running!')
|
||||
console.log('REST API: http://localhost:3000')
|
||||
console.log('WebSocket: ws://localhost:3000/ws')
|
||||
console.log('MCP: ws://localhost:3001/mcp')
|
||||
```
|
||||
|
||||
## 🔌 Client Usage
|
||||
|
||||
### REST API
|
||||
```javascript
|
||||
// Search
|
||||
const response = await fetch('http://localhost:3000/api/search', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-API-Key': 'your-key'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
query: 'find documents about AI',
|
||||
limit: 10
|
||||
})
|
||||
})
|
||||
const { results } = await response.json()
|
||||
```
|
||||
|
||||
### WebSocket (Real-time)
|
||||
```javascript
|
||||
const ws = new WebSocket('ws://localhost:3000/ws')
|
||||
|
||||
ws.onopen = () => {
|
||||
// Subscribe to operations
|
||||
ws.send(JSON.stringify({
|
||||
type: 'subscribe',
|
||||
operations: ['add', 'delete', 'relate']
|
||||
}))
|
||||
}
|
||||
|
||||
ws.onmessage = (event) => {
|
||||
const msg = JSON.parse(event.data)
|
||||
console.log('Operation:', msg.operation, msg.params)
|
||||
}
|
||||
```
|
||||
|
||||
### MCP (AI Agents)
|
||||
```javascript
|
||||
const mcpWs = new WebSocket('ws://localhost:3001/mcp')
|
||||
|
||||
mcpWs.send(JSON.stringify({
|
||||
type: 'data_access',
|
||||
operation: 'search',
|
||||
requestId: '123',
|
||||
parameters: { query: 'test' }
|
||||
}))
|
||||
|
||||
mcpWs.onmessage = (event) => {
|
||||
const response = JSON.parse(event.data)
|
||||
console.log('MCP Response:', response)
|
||||
}
|
||||
```
|
||||
|
||||
## 🏗️ Architecture Benefits
|
||||
|
||||
### Why as an Augmentation?
|
||||
|
||||
1. **Optional** - Not everyone needs a server
|
||||
2. **Configurable** - Easy to enable/disable
|
||||
3. **Extensible** - Add custom endpoints
|
||||
4. **Integrated** - Hooks into all operations
|
||||
5. **Real-time** - Broadcasts changes automatically
|
||||
|
||||
### Security Features
|
||||
|
||||
- **API Key Authentication**
|
||||
- **Rate Limiting**
|
||||
- **CORS Configuration**
|
||||
- **Parameter Sanitization**
|
||||
- **SSL/TLS Support** (with proper certs)
|
||||
|
||||
## 🌍 Deployment Options
|
||||
|
||||
### Local Development
|
||||
```bash
|
||||
npm install brainy
|
||||
node server.js # Your server file with APIServerAugmentation
|
||||
```
|
||||
|
||||
### Docker Container
|
||||
```dockerfile
|
||||
FROM node:18-alpine
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm install brainy
|
||||
COPY server.js .
|
||||
EXPOSE 3000 3001
|
||||
CMD ["node", "server.js"]
|
||||
```
|
||||
|
||||
### Cloud Deployment
|
||||
Deploy to any Node.js hosting:
|
||||
- Vercel Edge Functions
|
||||
- Cloudflare Workers (with adapter)
|
||||
- AWS Lambda (with adapter)
|
||||
- Google Cloud Run
|
||||
- Traditional VPS
|
||||
|
||||
### Browser Service Worker
|
||||
```javascript
|
||||
// In browser, use Service Worker for local API
|
||||
if ('serviceWorker' in navigator) {
|
||||
// APIServerAugmentation can create a Service Worker
|
||||
// that intercepts fetch() calls and handles them locally
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 The Complete Picture
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Client Applications │
|
||||
├─────────────┬───────────┬──────────────────┤
|
||||
│ REST │ WebSocket │ MCP │
|
||||
└──────┬──────┴─────┬─────┴──────┬───────────┘
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ APIServerAugmentation │
|
||||
│ (Unified API exposure as augmentation) │
|
||||
└─────────────────┬───────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ BrainyData Core │
|
||||
│ (with all augmentations in pipeline) │
|
||||
└─────────────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ Storage Layer │
|
||||
│ (FileSystem, S3, OPFS, Memory) │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## 🚀 Summary
|
||||
|
||||
1. **MCP is built-in** - Already in Brainy core
|
||||
2. **API Server should be an augmentation** - Optional, configurable
|
||||
3. **Exposes everything** - REST, WebSocket, MCP, GraphQL
|
||||
4. **Real-time by default** - Broadcasts all operations
|
||||
5. **Secure** - Auth, rate limiting, CORS
|
||||
6. **Deploy anywhere** - Node, Deno, Browser, Cloud
|
||||
|
||||
The beauty is that the API server is just another augmentation - it hooks into the pipeline like everything else and exposes Brainy's capabilities to the world!
|
||||
|
|
@ -1,774 +0,0 @@
|
|||
# 🚀 Real-World Augmentation Examples
|
||||
|
||||
## 1. 💬 Chat Interface Augmentation
|
||||
**"Talk to your data through natural language"**
|
||||
|
||||
```typescript
|
||||
import { BaseAugmentation } from './brainyAugmentation.js'
|
||||
|
||||
export class ChatInterfaceAugmentation extends BaseAugmentation {
|
||||
readonly name = 'chat-interface'
|
||||
readonly timing = 'after' as const // Process after operations
|
||||
readonly operations = ['search', 'add', 'delete'] as const
|
||||
readonly priority = 30 // Medium priority
|
||||
|
||||
private chatHistory: Array<{role: string, content: string}> = []
|
||||
private llmClient: any // User's chosen LLM
|
||||
|
||||
protected async onInitialize(): Promise<void> {
|
||||
// User provides their own LLM
|
||||
this.llmClient = this.context.config.llmClient || null
|
||||
if (!this.llmClient) {
|
||||
this.log('Chat augmentation needs LLM client in config')
|
||||
}
|
||||
}
|
||||
|
||||
async execute<T>(operation: string, params: any, next: () => Promise<T>): Promise<T> {
|
||||
// If params include natural language query
|
||||
if (params.chatQuery) {
|
||||
// Convert natural language to Brainy operations
|
||||
const intent = await this.parseIntent(params.chatQuery)
|
||||
|
||||
// Transform params based on intent
|
||||
if (intent.type === 'search') {
|
||||
params.query = intent.query
|
||||
params.k = intent.limit || 10
|
||||
} else if (intent.type === 'add') {
|
||||
params.content = intent.content
|
||||
params.metadata = { ...params.metadata, source: 'chat' }
|
||||
}
|
||||
|
||||
// Store in chat history
|
||||
this.chatHistory.push({
|
||||
role: 'user',
|
||||
content: params.chatQuery
|
||||
})
|
||||
}
|
||||
|
||||
// Execute the operation
|
||||
const result = await next()
|
||||
|
||||
// Generate conversational response
|
||||
if (params.chatQuery && this.llmClient) {
|
||||
const response = await this.generateResponse(operation, result)
|
||||
|
||||
this.chatHistory.push({
|
||||
role: 'assistant',
|
||||
content: response
|
||||
})
|
||||
|
||||
// Enhance result with chat response
|
||||
return {
|
||||
...result,
|
||||
chatResponse: response,
|
||||
chatHistory: this.chatHistory
|
||||
} as T
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
private async parseIntent(query: string) {
|
||||
// Use Brainy's NLP patterns + LLM to understand intent
|
||||
const prompt = `Parse this query into a Brainy operation:
|
||||
Query: ${query}
|
||||
|
||||
Return JSON with:
|
||||
- type: 'search' | 'add' | 'delete' | 'relate'
|
||||
- query: search terms or content
|
||||
- filters: any metadata filters
|
||||
- limit: number of results`
|
||||
|
||||
const response = await this.llmClient.complete(prompt)
|
||||
return JSON.parse(response)
|
||||
}
|
||||
|
||||
private async generateResponse(operation: string, result: any) {
|
||||
const prompt = `Generate a friendly response for this operation:
|
||||
Operation: ${operation}
|
||||
Result: ${JSON.stringify(result).slice(0, 500)}
|
||||
Chat History: ${JSON.stringify(this.chatHistory.slice(-3))}
|
||||
|
||||
Be conversational and helpful.`
|
||||
|
||||
return await this.llmClient.complete(prompt)
|
||||
}
|
||||
}
|
||||
|
||||
// Usage:
|
||||
const brain = new BrainyData({
|
||||
augmentations: [
|
||||
new ChatInterfaceAugmentation()
|
||||
],
|
||||
llmClient: openai // Bring your own LLM
|
||||
})
|
||||
|
||||
// Now you can chat!
|
||||
const result = await brain.search({
|
||||
chatQuery: "Show me all documents about project roadmap from last week"
|
||||
})
|
||||
console.log(result.chatResponse) // "I found 5 documents about the project roadmap..."
|
||||
```
|
||||
|
||||
## 2. 🤖 MCP Agent Memory Augmentation
|
||||
**"Provide persistent memory for AI agents through MCP"**
|
||||
|
||||
```typescript
|
||||
import { BaseAugmentation } from './brainyAugmentation.js'
|
||||
import { Server } from '@modelcontextprotocol/sdk'
|
||||
|
||||
export class MCPAgentMemoryAugmentation extends BaseAugmentation {
|
||||
readonly name = 'mcp-agent-memory'
|
||||
readonly timing = 'around' as const // Wrap operations
|
||||
readonly operations = ['all'] as const // Monitor everything
|
||||
readonly priority = 70 // High priority
|
||||
|
||||
private mcpServer: Server
|
||||
private agentSessions: Map<string, any> = new Map()
|
||||
|
||||
protected async onInitialize(): Promise<void> {
|
||||
// Initialize MCP server
|
||||
this.mcpServer = new Server({
|
||||
name: 'brainy-memory',
|
||||
version: '1.0.0'
|
||||
})
|
||||
|
||||
// Register MCP tools for agents
|
||||
this.mcpServer.setRequestHandler('tools/list', () => ({
|
||||
tools: [
|
||||
{
|
||||
name: 'remember',
|
||||
description: 'Store information in long-term memory',
|
||||
inputSchema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
content: { type: 'string' },
|
||||
category: { type: 'string' },
|
||||
importance: { type: 'number' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'recall',
|
||||
description: 'Retrieve information from memory',
|
||||
inputSchema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
query: { type: 'string' },
|
||||
category: { type: 'string' },
|
||||
limit: { type: 'number' }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'forget',
|
||||
description: 'Remove information from memory',
|
||||
inputSchema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
query: { type: 'string' },
|
||||
category: { type: 'string' }
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}))
|
||||
|
||||
// Handle tool calls from agents
|
||||
this.mcpServer.setRequestHandler('tools/call', async (request) => {
|
||||
const { name, arguments: args } = request.params
|
||||
|
||||
switch (name) {
|
||||
case 'remember':
|
||||
return await this.rememberForAgent(args)
|
||||
case 'recall':
|
||||
return await this.recallForAgent(args)
|
||||
case 'forget':
|
||||
return await this.forgetForAgent(args)
|
||||
default:
|
||||
throw new Error(`Unknown tool: ${name}`)
|
||||
}
|
||||
})
|
||||
|
||||
// Start MCP server
|
||||
await this.mcpServer.connect(process.stdin, process.stdout)
|
||||
this.log('MCP Agent Memory server started')
|
||||
}
|
||||
|
||||
async execute<T>(operation: string, params: any, next: () => Promise<T>): Promise<T> {
|
||||
// Extract agent context if present
|
||||
const agentId = params.metadata?._agentId || 'default'
|
||||
const sessionId = params.metadata?._sessionId
|
||||
|
||||
// Track agent operations
|
||||
if (agentId && sessionId) {
|
||||
if (!this.agentSessions.has(sessionId)) {
|
||||
this.agentSessions.set(sessionId, {
|
||||
agentId,
|
||||
startTime: Date.now(),
|
||||
operations: []
|
||||
})
|
||||
}
|
||||
|
||||
const session = this.agentSessions.get(sessionId)
|
||||
session.operations.push({
|
||||
operation,
|
||||
params: { ...params },
|
||||
timestamp: Date.now()
|
||||
})
|
||||
}
|
||||
|
||||
// Execute with agent context
|
||||
const result = await next()
|
||||
|
||||
// Auto-remember important operations
|
||||
if (operation === 'add' && agentId) {
|
||||
await this.autoRemember(agentId, params, result)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
private async rememberForAgent(args: any) {
|
||||
// Store in Brainy with agent-specific metadata
|
||||
const id = await this.context.brain.add(args.content, {
|
||||
_agentMemory: true,
|
||||
_agentId: args.agentId || 'default',
|
||||
category: args.category,
|
||||
importance: args.importance || 0.5,
|
||||
timestamp: new Date().toISOString()
|
||||
})
|
||||
|
||||
return {
|
||||
content: [
|
||||
{
|
||||
type: 'text',
|
||||
text: `Remembered with ID: ${id}`
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
private async recallForAgent(args: any) {
|
||||
// Search agent's memories
|
||||
const results = await this.context.brain.search(args.query, args.limit || 10, {
|
||||
where: {
|
||||
_agentMemory: true,
|
||||
_agentId: args.agentId || 'default',
|
||||
category: args.category
|
||||
}
|
||||
})
|
||||
|
||||
return {
|
||||
content: [
|
||||
{
|
||||
type: 'text',
|
||||
text: JSON.stringify(results, null, 2)
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
private async forgetForAgent(args: any) {
|
||||
// Remove specific memories
|
||||
const results = await this.context.brain.find({
|
||||
where: {
|
||||
_agentMemory: true,
|
||||
_agentId: args.agentId || 'default',
|
||||
category: args.category
|
||||
}
|
||||
})
|
||||
|
||||
for (const item of results) {
|
||||
await this.context.brain.delete(item.id)
|
||||
}
|
||||
|
||||
return {
|
||||
content: [
|
||||
{
|
||||
type: 'text',
|
||||
text: `Forgot ${results.length} memories`
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
private async autoRemember(agentId: string, params: any, result: any) {
|
||||
// Automatically remember important information
|
||||
if (params.metadata?.important) {
|
||||
await this.context.brain.add(params.content, {
|
||||
...params.metadata,
|
||||
_agentMemory: true,
|
||||
_agentId: agentId,
|
||||
_autoRemembered: true,
|
||||
_originalOperation: 'add',
|
||||
_resultId: result
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Usage:
|
||||
const brain = new BrainyData({
|
||||
augmentations: [
|
||||
new MCPAgentMemoryAugmentation()
|
||||
]
|
||||
})
|
||||
|
||||
// Now AI agents can use Brainy as memory through MCP!
|
||||
// Agents connect via MCP and use remember/recall/forget tools
|
||||
```
|
||||
|
||||
## 3. 🌐 API Server Augmentation
|
||||
**"Expose Brainy through REST, WebSocket, and MCP APIs"**
|
||||
|
||||
```typescript
|
||||
import { BaseAugmentation } from './brainyAugmentation.js'
|
||||
import { BrainyMCPService } from '../mcp/brainyMCPService.js'
|
||||
|
||||
export class APIServerAugmentation extends BaseAugmentation {
|
||||
readonly name = 'api-server'
|
||||
readonly timing = 'after' as const
|
||||
readonly operations = ['all'] as ('all')[]
|
||||
readonly priority = 5 // Low priority, runs after other augmentations
|
||||
|
||||
private httpServer: any
|
||||
private wsServer: any
|
||||
private mcpService: BrainyMCPService
|
||||
|
||||
protected async onInitialize(): Promise<void> {
|
||||
// Initialize MCP service
|
||||
this.mcpService = new BrainyMCPService(this.context.brain)
|
||||
|
||||
// Start HTTP server with REST endpoints
|
||||
await this.startHTTPServer()
|
||||
|
||||
// Start WebSocket server for real-time
|
||||
await this.startWebSocketServer()
|
||||
|
||||
this.log(`API Server running on port ${this.config.port || 3000}`)
|
||||
}
|
||||
|
||||
async execute<T>(operation: string, params: any, next: () => Promise<T>): Promise<T> {
|
||||
const result = await next()
|
||||
|
||||
// Broadcast operation to WebSocket clients
|
||||
this.broadcast({
|
||||
type: 'operation',
|
||||
operation,
|
||||
params: this.sanitizeParams(params),
|
||||
timestamp: Date.now()
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
private async startHTTPServer() {
|
||||
// REST endpoints: /api/search, /api/add, /api/get/:id, etc.
|
||||
// MCP endpoint: /api/mcp
|
||||
// Health check: /health
|
||||
}
|
||||
|
||||
private async startWebSocketServer() {
|
||||
// WebSocket for real-time subscriptions
|
||||
// Clients can subscribe to specific operations
|
||||
}
|
||||
}
|
||||
|
||||
// Usage:
|
||||
const brain = new BrainyData()
|
||||
brain.augmentations.register(new APIServerAugmentation({ port: 3000 }))
|
||||
await brain.init()
|
||||
|
||||
// Now access Brainy via:
|
||||
// - REST: http://localhost:3000/api/*
|
||||
// - WebSocket: ws://localhost:3000/ws
|
||||
// - MCP: http://localhost:3000/api/mcp
|
||||
```
|
||||
|
||||
## 4. 📊 Graph Visualization Augmentation
|
||||
**"Real-time graph visualization with clustering"**
|
||||
|
||||
```typescript
|
||||
import { BaseAugmentation } from './brainyAugmentation.js'
|
||||
import { WebSocketServer } from 'ws'
|
||||
|
||||
export class GraphVisualizationAugmentation extends BaseAugmentation {
|
||||
readonly name = 'graph-visualization'
|
||||
readonly timing = 'after' as const
|
||||
readonly operations = ['all'] as const // Monitor all changes
|
||||
readonly priority = 20
|
||||
|
||||
private wsServer: WebSocketServer
|
||||
private graphState: {
|
||||
nodes: Map<string, any>
|
||||
edges: Map<string, any>
|
||||
clusters: Map<string, Set<string>>
|
||||
}
|
||||
private clients: Set<any> = new Set()
|
||||
|
||||
protected async onInitialize(): Promise<void> {
|
||||
// Initialize WebSocket server for real-time updates
|
||||
this.wsServer = new WebSocketServer({
|
||||
port: this.context.config.visualizationPort || 8080
|
||||
})
|
||||
|
||||
this.graphState = {
|
||||
nodes: new Map(),
|
||||
edges: new Map(),
|
||||
clusters: new Map()
|
||||
}
|
||||
|
||||
// Load initial graph state
|
||||
await this.loadGraphState()
|
||||
|
||||
// Handle client connections
|
||||
this.wsServer.on('connection', (ws) => {
|
||||
this.clients.add(ws)
|
||||
|
||||
// Send initial state
|
||||
ws.send(JSON.stringify({
|
||||
type: 'init',
|
||||
data: this.serializeGraphState()
|
||||
}))
|
||||
|
||||
// Handle client messages
|
||||
ws.on('message', async (message) => {
|
||||
const msg = JSON.parse(message.toString())
|
||||
await this.handleClientMessage(msg, ws)
|
||||
})
|
||||
|
||||
ws.on('close', () => {
|
||||
this.clients.delete(ws)
|
||||
})
|
||||
})
|
||||
|
||||
// Start clustering in background
|
||||
this.startClusteringWorker()
|
||||
|
||||
this.log('Graph visualization server started on port ' +
|
||||
(this.context.config.visualizationPort || 8080))
|
||||
}
|
||||
|
||||
async execute<T>(operation: string, params: any, next: () => Promise<T>): Promise<T> {
|
||||
const result = await next()
|
||||
|
||||
// Update graph state based on operation
|
||||
switch (operation) {
|
||||
case 'add':
|
||||
case 'addNoun':
|
||||
await this.handleNodeAdded(result, params)
|
||||
break
|
||||
|
||||
case 'relate':
|
||||
case 'addVerb':
|
||||
await this.handleEdgeAdded(params)
|
||||
break
|
||||
|
||||
case 'delete':
|
||||
await this.handleNodeDeleted(params)
|
||||
break
|
||||
|
||||
case 'search':
|
||||
await this.handleSearchPerformed(params, result)
|
||||
break
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
private async handleNodeAdded(id: string, data: any) {
|
||||
// Add node to graph
|
||||
const node = {
|
||||
id,
|
||||
label: data.content?.slice(0, 50) || id,
|
||||
type: data.metadata?.type || 'default',
|
||||
metadata: data.metadata,
|
||||
position: this.calculatePosition(id),
|
||||
clusterId: null
|
||||
}
|
||||
|
||||
this.graphState.nodes.set(id, node)
|
||||
|
||||
// Broadcast to clients
|
||||
this.broadcast({
|
||||
type: 'nodeAdded',
|
||||
data: node
|
||||
})
|
||||
|
||||
// Trigger re-clustering
|
||||
this.scheduleReClustering()
|
||||
}
|
||||
|
||||
private async handleEdgeAdded(params: any) {
|
||||
const edge = {
|
||||
id: `${params.source}-${params.verb}-${params.target}`,
|
||||
source: params.source,
|
||||
target: params.target,
|
||||
label: params.verb,
|
||||
weight: params.weight || 1
|
||||
}
|
||||
|
||||
this.graphState.edges.set(edge.id, edge)
|
||||
|
||||
this.broadcast({
|
||||
type: 'edgeAdded',
|
||||
data: edge
|
||||
})
|
||||
}
|
||||
|
||||
private async handleSearchPerformed(params: any, results: any) {
|
||||
// Highlight search results in visualization
|
||||
const highlightNodes = results.map((r: any) => r.id)
|
||||
|
||||
this.broadcast({
|
||||
type: 'highlight',
|
||||
data: {
|
||||
nodes: highlightNodes,
|
||||
query: params.query,
|
||||
duration: 5000 // Highlight for 5 seconds
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
private async loadGraphState() {
|
||||
// Load all nodes (nouns)
|
||||
const nouns = await this.context.brain.getAllNouns()
|
||||
for (const noun of nouns) {
|
||||
this.graphState.nodes.set(noun.id, {
|
||||
id: noun.id,
|
||||
label: noun.content?.slice(0, 50) || noun.id,
|
||||
type: noun.type,
|
||||
metadata: noun.metadata,
|
||||
position: this.calculatePosition(noun.id)
|
||||
})
|
||||
}
|
||||
|
||||
// Load all edges (verbs/relationships)
|
||||
const verbs = await this.context.brain.getAllVerbs()
|
||||
for (const verb of verbs) {
|
||||
this.graphState.edges.set(verb.id, {
|
||||
id: verb.id,
|
||||
source: verb.source,
|
||||
target: verb.target,
|
||||
label: verb.type,
|
||||
weight: verb.weight
|
||||
})
|
||||
}
|
||||
|
||||
// Initial clustering
|
||||
await this.performClustering()
|
||||
}
|
||||
|
||||
private async performClustering() {
|
||||
// Use Brainy's clustering capabilities
|
||||
const clusteringResult = await this.context.brain.cluster({
|
||||
algorithm: 'hierarchical',
|
||||
threshold: 0.7
|
||||
})
|
||||
|
||||
// Update cluster state
|
||||
this.graphState.clusters.clear()
|
||||
for (const [clusterId, nodeIds] of Object.entries(clusteringResult)) {
|
||||
this.graphState.clusters.set(clusterId, new Set(nodeIds as string[]))
|
||||
|
||||
// Update nodes with cluster IDs
|
||||
for (const nodeId of nodeIds as string[]) {
|
||||
const node = this.graphState.nodes.get(nodeId)
|
||||
if (node) {
|
||||
node.clusterId = clusterId
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Broadcast cluster update
|
||||
this.broadcast({
|
||||
type: 'clustersUpdated',
|
||||
data: this.serializeClusters()
|
||||
})
|
||||
}
|
||||
|
||||
private startClusteringWorker() {
|
||||
// Re-cluster periodically or when graph changes significantly
|
||||
setInterval(async () => {
|
||||
if (this.graphState.nodes.size > 0) {
|
||||
await this.performClustering()
|
||||
}
|
||||
}, 30000) // Every 30 seconds
|
||||
}
|
||||
|
||||
private scheduleReClustering = (() => {
|
||||
let timeout: NodeJS.Timeout
|
||||
return () => {
|
||||
clearTimeout(timeout)
|
||||
timeout = setTimeout(() => this.performClustering(), 5000)
|
||||
}
|
||||
})()
|
||||
|
||||
private calculatePosition(id: string) {
|
||||
// Simple force-directed layout position
|
||||
const hash = id.split('').reduce((a, b) => {
|
||||
a = ((a << 5) - a) + b.charCodeAt(0)
|
||||
return a & a
|
||||
}, 0)
|
||||
|
||||
return {
|
||||
x: (hash % 1000) - 500,
|
||||
y: ((hash * 7) % 1000) - 500
|
||||
}
|
||||
}
|
||||
|
||||
private broadcast(message: any) {
|
||||
const data = JSON.stringify(message)
|
||||
for (const client of this.clients) {
|
||||
client.send(data)
|
||||
}
|
||||
}
|
||||
|
||||
private async handleClientMessage(msg: any, ws: any) {
|
||||
switch (msg.type) {
|
||||
case 'requestClustering':
|
||||
await this.performClustering()
|
||||
break
|
||||
|
||||
case 'search':
|
||||
const results = await this.context.brain.search(msg.query)
|
||||
ws.send(JSON.stringify({
|
||||
type: 'searchResults',
|
||||
data: results
|
||||
}))
|
||||
break
|
||||
|
||||
case 'getNodeDetails':
|
||||
const node = await this.context.brain.get(msg.nodeId)
|
||||
ws.send(JSON.stringify({
|
||||
type: 'nodeDetails',
|
||||
data: node
|
||||
}))
|
||||
break
|
||||
|
||||
case 'expandNode':
|
||||
const connections = await this.context.brain.getConnections(msg.nodeId)
|
||||
ws.send(JSON.stringify({
|
||||
type: 'nodeConnections',
|
||||
data: connections
|
||||
}))
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
private serializeGraphState() {
|
||||
return {
|
||||
nodes: Array.from(this.graphState.nodes.values()),
|
||||
edges: Array.from(this.graphState.edges.values()),
|
||||
clusters: this.serializeClusters()
|
||||
}
|
||||
}
|
||||
|
||||
private serializeClusters() {
|
||||
const clusters: any = {}
|
||||
for (const [id, nodeIds] of this.graphState.clusters) {
|
||||
clusters[id] = Array.from(nodeIds)
|
||||
}
|
||||
return clusters
|
||||
}
|
||||
|
||||
protected async onShutdown() {
|
||||
this.wsServer.close()
|
||||
this.clients.clear()
|
||||
}
|
||||
}
|
||||
|
||||
// Usage:
|
||||
const brain = new BrainyData({
|
||||
augmentations: [
|
||||
new GraphVisualizationAugmentation()
|
||||
],
|
||||
visualizationPort: 8080
|
||||
})
|
||||
|
||||
// Now connect a web-based graph viz tool to ws://localhost:8080
|
||||
// It receives real-time updates as data changes!
|
||||
```
|
||||
|
||||
## 4. 🌐 Multi-Agent Team Coordination
|
||||
**"Multiple AI agents sharing knowledge and coordinating tasks"**
|
||||
|
||||
```typescript
|
||||
export class TeamCoordinationAugmentation extends BaseAugmentation {
|
||||
readonly name = 'team-coordination'
|
||||
readonly timing = 'around' as const
|
||||
readonly operations = ['all'] as const
|
||||
readonly priority = 85
|
||||
|
||||
private agents: Map<string, AgentState> = new Map()
|
||||
private tasks: Map<string, Task> = new Map()
|
||||
private sharedMemory: Map<string, any> = new Map()
|
||||
|
||||
async execute<T>(operation: string, params: any, next: () => Promise<T>): Promise<T> {
|
||||
const agentId = params.metadata?._agentId
|
||||
|
||||
if (agentId) {
|
||||
// Track agent activity
|
||||
this.updateAgentState(agentId, operation, params)
|
||||
|
||||
// Check if operation needs coordination
|
||||
if (await this.needsCoordination(operation, params)) {
|
||||
return await this.coordinatedExecute(agentId, operation, params, next)
|
||||
}
|
||||
}
|
||||
|
||||
return next()
|
||||
}
|
||||
|
||||
private async coordinatedExecute<T>(
|
||||
agentId: string,
|
||||
operation: string,
|
||||
params: any,
|
||||
next: () => Promise<T>
|
||||
): Promise<T> {
|
||||
// Acquire distributed lock
|
||||
const lockId = await this.acquireLock(operation, params)
|
||||
|
||||
try {
|
||||
// Check shared memory for related work
|
||||
const relatedWork = await this.findRelatedWork(params)
|
||||
if (relatedWork) {
|
||||
params.metadata._relatedWork = relatedWork
|
||||
}
|
||||
|
||||
// Execute with team context
|
||||
const result = await next()
|
||||
|
||||
// Update shared memory
|
||||
await this.updateSharedMemory(agentId, operation, params, result)
|
||||
|
||||
// Notify other agents
|
||||
await this.notifyTeam(agentId, operation, result)
|
||||
|
||||
return result
|
||||
} finally {
|
||||
await this.releaseLock(lockId)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 Key Patterns
|
||||
|
||||
All these augmentations follow the same pattern:
|
||||
|
||||
1. **Extend BaseAugmentation**
|
||||
2. **Define timing & operations**
|
||||
3. **Initialize resources** in `onInitialize()`
|
||||
4. **Intercept operations** in `execute()`
|
||||
5. **Clean up** in `onShutdown()`
|
||||
|
||||
They can:
|
||||
- **Add APIs** (REST, WebSocket, MCP)
|
||||
- **Transform data** (chat queries → operations)
|
||||
- **Coordinate agents** (distributed locking, shared memory)
|
||||
- **Visualize in real-time** (WebSocket broadcasts)
|
||||
- **Integrate any service** (LLMs, databases, APIs)
|
||||
|
||||
The beauty is they all use the **same simple interface** but achieve vastly different goals!
|
||||
|
|
@ -1,306 +0,0 @@
|
|||
# 🔄 How Augmentations Hook Into Brainy
|
||||
|
||||
## The Complete Pipeline Architecture
|
||||
|
||||
```
|
||||
User Code → BrainyData Method → Augmentation Pipeline → Storage/Operations
|
||||
↑ ↓
|
||||
└────── Augmentations Execute Here ──┘
|
||||
```
|
||||
|
||||
## 🎯 How Augmentations Register & Execute
|
||||
|
||||
### 1. **Registration During Initialization**
|
||||
|
||||
```typescript
|
||||
// In BrainyData constructor/init
|
||||
class BrainyData {
|
||||
private augmentations = new AugmentationRegistry()
|
||||
|
||||
async init() {
|
||||
// Register built-in augmentations in priority order
|
||||
this.augmentations.register(new WALAugmentation()) // Priority: 100
|
||||
this.augmentations.register(new EntityRegistryAugmentation()) // Priority: 90
|
||||
this.augmentations.register(new NeuralImportAugmentation()) // Priority: 80
|
||||
this.augmentations.register(new BatchProcessingAugmentation()) // Priority: 50
|
||||
|
||||
// Initialize all with context
|
||||
const context: AugmentationContext = {
|
||||
brain: this,
|
||||
storage: this.storage,
|
||||
config: this.config,
|
||||
log: (msg, level) => console.log(msg)
|
||||
}
|
||||
|
||||
await this.augmentations.initialize(context)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. **Execution Through Method Interception**
|
||||
|
||||
Every BrainyData operation wraps its core logic with augmentation execution:
|
||||
|
||||
```typescript
|
||||
// Example: The add() method
|
||||
async add(content: string, metadata?: any): Promise<string> {
|
||||
// Augmentations wrap the core operation
|
||||
return this.augmentations.execute(
|
||||
'add', // Operation name
|
||||
{ content, metadata }, // Parameters
|
||||
async () => { // Core operation
|
||||
// Actual add logic here
|
||||
const id = generateId()
|
||||
await this.storage.set(id, { content, metadata })
|
||||
return id
|
||||
}
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
### 3. **The Execution Chain**
|
||||
|
||||
```typescript
|
||||
// In AugmentationRegistry
|
||||
async execute<T>(operation: string, params: any, mainOperation: () => Promise<T>): Promise<T> {
|
||||
// 1. Filter augmentations that should run for this operation
|
||||
const applicable = this.augmentations.filter(aug =>
|
||||
aug.shouldExecute(operation, params)
|
||||
)
|
||||
|
||||
// 2. Sort by priority (already sorted during registration)
|
||||
// Priority 100 runs first, then 90, 80, etc.
|
||||
|
||||
// 3. Create middleware chain
|
||||
let index = 0
|
||||
const executeNext = async (): Promise<T> => {
|
||||
if (index >= applicable.length) {
|
||||
// All augmentations processed, run main operation
|
||||
return mainOperation()
|
||||
}
|
||||
|
||||
const augmentation = applicable[index++]
|
||||
// Each augmentation decides what to do with the operation
|
||||
return augmentation.execute(operation, params, executeNext)
|
||||
}
|
||||
|
||||
return executeNext()
|
||||
}
|
||||
```
|
||||
|
||||
## 🎭 The Four Timing Modes in Action
|
||||
|
||||
### **`timing: 'before'`** - Pre-processing
|
||||
```typescript
|
||||
class NeuralImportAugmentation {
|
||||
timing = 'before'
|
||||
|
||||
async execute(op, params, next) {
|
||||
// Analyze data BEFORE storage
|
||||
const analysis = await this.analyzeWithAI(params.content)
|
||||
params.metadata._neural = analysis
|
||||
|
||||
// Continue with enhanced params
|
||||
return next()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **`timing: 'after'`** - Post-processing
|
||||
```typescript
|
||||
class NotionSynapse {
|
||||
timing = 'after'
|
||||
|
||||
async execute(op, params, next) {
|
||||
// Let operation complete first
|
||||
const result = await next()
|
||||
|
||||
// Then sync to Notion
|
||||
await this.syncToNotion(op, params, result)
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **`timing: 'around'`** - Wrapping
|
||||
```typescript
|
||||
class WALAugmentation {
|
||||
timing = 'around'
|
||||
|
||||
async execute(op, params, next) {
|
||||
// Write to WAL before
|
||||
await this.wal.write({ op, params, timestamp: Date.now() })
|
||||
|
||||
try {
|
||||
// Execute operation
|
||||
const result = await next()
|
||||
|
||||
// Mark as committed
|
||||
await this.wal.commit()
|
||||
|
||||
return result
|
||||
} catch (error) {
|
||||
// Rollback on failure
|
||||
await this.wal.rollback()
|
||||
throw error
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **`timing: 'replace'`** - Complete replacement
|
||||
```typescript
|
||||
class S3StorageAugmentation {
|
||||
timing = 'replace'
|
||||
|
||||
async execute(op, params, next) {
|
||||
if (op === 'storage.get') {
|
||||
// Don't call next() - completely replace
|
||||
return await this.s3.getObject(params.key)
|
||||
}
|
||||
// For other operations, pass through
|
||||
return next()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 Real Example: How `brain.add()` Works
|
||||
|
||||
```typescript
|
||||
// User calls:
|
||||
await brain.add("John is a developer", { type: "person" })
|
||||
|
||||
// This triggers the chain:
|
||||
|
||||
1. BrainyData.add() calls augmentations.execute('add', params, coreLogic)
|
||||
|
||||
2. AugmentationRegistry filters applicable augmentations:
|
||||
- WALAugmentation (priority: 100, operations: ['all'])
|
||||
- EntityRegistryAugmentation (priority: 90, operations: ['add'])
|
||||
- NeuralImportAugmentation (priority: 80, operations: ['add'])
|
||||
- BatchProcessingAugmentation (priority: 50, operations: ['add'])
|
||||
|
||||
3. Execution chain (highest priority first):
|
||||
|
||||
WALAugmentation.execute() {
|
||||
await wal.write(operation) // Log to WAL
|
||||
const result = await next() // Call next in chain
|
||||
await wal.commit() // Commit WAL
|
||||
return result
|
||||
}
|
||||
↓
|
||||
EntityRegistryAugmentation.execute() {
|
||||
const hash = computeHash(params.content)
|
||||
if (registry.has(hash)) {
|
||||
return registry.get(hash) // Return existing ID
|
||||
}
|
||||
const result = await next() // Continue chain
|
||||
registry.set(hash, result) // Register new entity
|
||||
return result
|
||||
}
|
||||
↓
|
||||
NeuralImportAugmentation.execute() {
|
||||
const analysis = await analyzeWithAI(params)
|
||||
params.metadata._neural = analysis // Add AI insights
|
||||
return next() // Continue with enhanced data
|
||||
}
|
||||
↓
|
||||
BatchProcessingAugmentation.execute() {
|
||||
batch.add(params) // Add to batch
|
||||
if (batch.isFull()) {
|
||||
await batch.flush() // Process batch if full
|
||||
}
|
||||
return next() // Continue
|
||||
}
|
||||
↓
|
||||
Core add() logic {
|
||||
// Finally, the actual storage operation
|
||||
const id = generateId()
|
||||
await storage.set(id, params)
|
||||
await index.add(id, vector)
|
||||
return id
|
||||
}
|
||||
```
|
||||
|
||||
## 🔌 Dynamic Registration
|
||||
|
||||
Augmentations can be registered at any time:
|
||||
|
||||
```typescript
|
||||
// During initialization
|
||||
brain.augmentations.register(new CustomAugmentation())
|
||||
|
||||
// Or later, dynamically
|
||||
const synapse = new NotionSynapse({ apiKey: 'xxx' })
|
||||
brain.augmentations.register(synapse)
|
||||
|
||||
// From Brain Cloud marketplace
|
||||
import { EmotionalIntelligence } from '@brain-cloud/empathy'
|
||||
brain.augmentations.register(new EmotionalIntelligence())
|
||||
```
|
||||
|
||||
## 🎯 Operation Targeting
|
||||
|
||||
Augmentations declare which operations they care about:
|
||||
|
||||
```typescript
|
||||
class SearchOptimizer {
|
||||
operations = ['search', 'searchText', 'findSimilar'] // Only search ops
|
||||
}
|
||||
|
||||
class GlobalLogger {
|
||||
operations = ['all'] // Every operation
|
||||
}
|
||||
|
||||
class StorageReplacer {
|
||||
operations = ['storage'] // Storage operations only
|
||||
}
|
||||
```
|
||||
|
||||
## 🔍 On-Demand Execution
|
||||
|
||||
Some augmentations can be triggered manually:
|
||||
|
||||
```typescript
|
||||
// Get specific augmentation
|
||||
const neuralImport = brain.augmentations.get('neural-import')
|
||||
|
||||
// Use its public API directly
|
||||
const analysis = await neuralImport.getNeuralAnalysis(data, 'json')
|
||||
|
||||
// Or trigger through operations
|
||||
await brain.add(data) // Automatically uses neural import if registered
|
||||
```
|
||||
|
||||
## 📈 Priority System
|
||||
|
||||
```
|
||||
100: Critical Infrastructure (WAL, Transactions)
|
||||
90: Data Integrity (Entity Registry, Deduplication)
|
||||
80: Data Processing (Neural Import, Transformation)
|
||||
50: Performance (Batching, Caching)
|
||||
10: Features (Scoring, Analytics)
|
||||
1: Monitoring (Logging, Metrics)
|
||||
```
|
||||
|
||||
## 🌊 The Flow
|
||||
|
||||
1. **User Action** → `brain.add()`, `brain.search()`, etc.
|
||||
2. **Method Wraps** → Core logic wrapped with `augmentations.execute()`
|
||||
3. **Filter** → Find augmentations for this operation
|
||||
4. **Sort** → Order by priority
|
||||
5. **Chain** → Each augmentation calls next() or not
|
||||
6. **Core** → Eventually hits actual implementation
|
||||
7. **Unwind** → Results flow back through chain
|
||||
8. **Return** → Enhanced result to user
|
||||
|
||||
## 💡 Key Insights
|
||||
|
||||
1. **Everything is interceptable** - All operations go through the pipeline
|
||||
2. **Augmentations compose** - They stack like middleware
|
||||
3. **Priority matters** - Higher priority runs first
|
||||
4. **Timing is flexible** - before/after/around/replace covers all needs
|
||||
5. **Simple but powerful** - One interface, infinite possibilities
|
||||
|
||||
This is why the single `BrainyAugmentation` interface works for EVERYTHING - it's just middleware with superpowers! 🚀
|
||||
|
|
@ -1,288 +0,0 @@
|
|||
# Simple Guide: Creating Augmentations
|
||||
|
||||
## The One Interface That Rules Them All
|
||||
|
||||
**EVERY augmentation is a `BrainyAugmentation`:**
|
||||
|
||||
```typescript
|
||||
interface BrainyAugmentation {
|
||||
name: string // Unique name
|
||||
timing: 'before' | 'after' | 'around' | 'replace' // When to run
|
||||
operations: string[] // What to intercept
|
||||
priority: number // Order (higher = first)
|
||||
|
||||
initialize(context): Promise<void> // Setup
|
||||
execute(op, params, next): Promise<T> // Do work
|
||||
shutdown?(): Promise<void> // Cleanup (optional)
|
||||
}
|
||||
```
|
||||
|
||||
That's it! Every augmentation implements this interface.
|
||||
|
||||
## Creating Different Types of Augmentations
|
||||
|
||||
### 1. Basic Feature Augmentation
|
||||
|
||||
**Use Case:** Add logging, caching, validation, etc.
|
||||
|
||||
```typescript
|
||||
import { BaseAugmentation } from 'brainy'
|
||||
|
||||
export class LoggingAugmentation extends BaseAugmentation {
|
||||
name = 'logging'
|
||||
timing = 'around' // Wrap operations
|
||||
operations = ['add', 'delete'] // What to log
|
||||
priority = 10 // Low priority
|
||||
|
||||
async execute(op, params, next) {
|
||||
console.log(`Starting ${op}`)
|
||||
const result = await next()
|
||||
console.log(`Completed ${op}`)
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
// Usage
|
||||
brain.augmentations.register(new LoggingAugmentation())
|
||||
```
|
||||
|
||||
### 2. Storage Augmentation
|
||||
|
||||
**Use Case:** Provide a storage backend (special: has `provideStorage()` method)
|
||||
|
||||
```typescript
|
||||
import { StorageAugmentation } from 'brainy'
|
||||
|
||||
export class RedisStorageAugmentation extends StorageAugmentation {
|
||||
constructor(config) {
|
||||
super('redis-storage') // Pass name to parent
|
||||
this.config = config
|
||||
}
|
||||
|
||||
// Special method for storage only!
|
||||
async provideStorage() {
|
||||
return new RedisAdapter(this.config)
|
||||
}
|
||||
}
|
||||
|
||||
// Usage (BEFORE init!)
|
||||
brain.augmentations.register(new RedisStorageAugmentation({
|
||||
host: 'localhost',
|
||||
port: 6379
|
||||
}))
|
||||
await brain.init() // Will use Redis!
|
||||
```
|
||||
|
||||
### 3. Data Processing Augmentation
|
||||
|
||||
**Use Case:** Transform or validate data before storage
|
||||
|
||||
```typescript
|
||||
export class ValidationAugmentation extends BaseAugmentation {
|
||||
name = 'validator'
|
||||
timing = 'before' // Run before operation
|
||||
operations = ['add'] // Validate on add
|
||||
priority = 50
|
||||
|
||||
async execute(op, params, next) {
|
||||
// Validate data
|
||||
if (!params.data || !params.data.title) {
|
||||
throw new Error('Title is required')
|
||||
}
|
||||
|
||||
// Add timestamp
|
||||
params.data.createdAt = new Date()
|
||||
|
||||
// Continue with modified params
|
||||
return next()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. External System Augmentation (Synapse)
|
||||
|
||||
**Use Case:** Sync with external systems like Notion, Slack, etc.
|
||||
|
||||
```typescript
|
||||
export class NotionSyncAugmentation extends BaseAugmentation {
|
||||
name = 'notion-sync'
|
||||
timing = 'after' // Sync after local operation
|
||||
operations = ['add', 'update', 'delete']
|
||||
priority = 30
|
||||
|
||||
private notion: NotionClient
|
||||
|
||||
async initialize(context) {
|
||||
await super.initialize(context)
|
||||
this.notion = new NotionClient(this.apiKey)
|
||||
}
|
||||
|
||||
async execute(op, params, next) {
|
||||
// Do local operation first
|
||||
const result = await next()
|
||||
|
||||
// Then sync to Notion
|
||||
if (op === 'add') {
|
||||
await this.notion.createPage({
|
||||
title: params.data.title,
|
||||
content: params.data.content
|
||||
})
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Performance Optimization Augmentation
|
||||
|
||||
**Use Case:** Add caching, batching, deduplication
|
||||
|
||||
```typescript
|
||||
export class CacheAugmentation extends BaseAugmentation {
|
||||
name = 'smart-cache'
|
||||
timing = 'around' // Wrap to check cache
|
||||
operations = ['search'] // Cache searches only
|
||||
priority = 60
|
||||
|
||||
private cache = new Map()
|
||||
|
||||
async execute(op, params, next) {
|
||||
const key = JSON.stringify(params)
|
||||
|
||||
// Check cache
|
||||
if (this.cache.has(key)) {
|
||||
this.log('Cache hit!')
|
||||
return this.cache.get(key)
|
||||
}
|
||||
|
||||
// Miss - execute and cache
|
||||
const result = await next()
|
||||
this.cache.set(key, result)
|
||||
|
||||
// Clear old entries if too many
|
||||
if (this.cache.size > 1000) {
|
||||
const firstKey = this.cache.keys().next().value
|
||||
this.cache.delete(firstKey)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Quick Reference: When to Use Each Timing
|
||||
|
||||
| Timing | Use For | Example |
|
||||
|--------|---------|---------|
|
||||
| `before` | Validation, transformation | Check required fields |
|
||||
| `after` | Logging, syncing, analytics | Send to external API |
|
||||
| `around` | Caching, error handling, timing | Wrap with try/catch |
|
||||
| `replace` | Complete replacement | Storage backends |
|
||||
|
||||
## Quick Reference: Common Operations
|
||||
|
||||
| Operation | Description |
|
||||
|-----------|-------------|
|
||||
| `'add'` | Adding data to brain |
|
||||
| `'search'` | Searching/querying |
|
||||
| `'update'` | Updating existing data |
|
||||
| `'delete'` | Removing data |
|
||||
| `'storage'` | Storage resolution (special) |
|
||||
| `'all'` | Intercept everything |
|
||||
|
||||
## The Context Object
|
||||
|
||||
Every augmentation gets this during `initialize()`:
|
||||
|
||||
```typescript
|
||||
{
|
||||
brain: BrainyData, // The brain instance
|
||||
storage: StorageAdapter, // Storage backend
|
||||
config: BrainyDataConfig, // Configuration
|
||||
log: (msg, level) => void // Logger
|
||||
}
|
||||
```
|
||||
|
||||
## Priority Guidelines
|
||||
|
||||
| Priority | Use For |
|
||||
|----------|---------|
|
||||
| 100 | Storage (critical infrastructure) |
|
||||
| 80-99 | System operations (WAL, connections) |
|
||||
| 50-79 | Performance (caching, batching) |
|
||||
| 20-49 | Features (validation, transformation) |
|
||||
| 1-19 | Logging, analytics |
|
||||
|
||||
## Complete Working Example
|
||||
|
||||
Here's a full augmentation that adds word count to all documents:
|
||||
|
||||
```typescript
|
||||
import { BaseAugmentation } from 'brainy'
|
||||
|
||||
export class WordCountAugmentation extends BaseAugmentation {
|
||||
name = 'word-counter'
|
||||
timing = 'before'
|
||||
operations = ['add', 'update']
|
||||
priority = 40
|
||||
|
||||
async execute(operation, params, next) {
|
||||
// Add word count to metadata
|
||||
if (params.data && params.data.content) {
|
||||
const wordCount = params.data.content.split(/\s+/).length
|
||||
params.metadata = params.metadata || {}
|
||||
params.metadata.wordCount = wordCount
|
||||
|
||||
this.log(`Added word count: ${wordCount}`)
|
||||
}
|
||||
|
||||
// Continue with enhanced params
|
||||
return next()
|
||||
}
|
||||
|
||||
async initialize(context) {
|
||||
await super.initialize(context)
|
||||
this.log('Word counter ready!')
|
||||
}
|
||||
}
|
||||
|
||||
// Usage
|
||||
const brain = new BrainyData()
|
||||
brain.augmentations.register(new WordCountAugmentation())
|
||||
await brain.init()
|
||||
|
||||
// Now all adds include word count
|
||||
await brain.add('Hello world', {
|
||||
content: 'This is a test document with nine words here'
|
||||
})
|
||||
// Automatically adds: metadata.wordCount = 9
|
||||
```
|
||||
|
||||
## Key Points to Remember
|
||||
|
||||
1. **All augmentations are `BrainyAugmentation`** - One interface
|
||||
2. **Storage augmentations** add `provideStorage()` method
|
||||
3. **Register before `init()`** for storage, anytime for others
|
||||
4. **Use `BaseAugmentation`** for convenience (has helpers)
|
||||
5. **`next()` is crucial** - Always call it (unless `replace`)
|
||||
6. **Order matters** - Use priority to control execution order
|
||||
|
||||
## Testing Your Augmentation
|
||||
|
||||
```typescript
|
||||
describe('MyAugmentation', () => {
|
||||
it('should enhance data', async () => {
|
||||
const brain = new BrainyData()
|
||||
brain.augmentations.register(new MyAugmentation())
|
||||
await brain.init()
|
||||
|
||||
await brain.add('test', { data: 'test' })
|
||||
const result = await brain.search('test')
|
||||
|
||||
expect(result[0].metadata.enhanced).toBe(true)
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
That's it! Augmentations are simple middleware that intercept operations. Pick your timing, operations, and priority, then implement `execute()`!
|
||||
|
|
@ -1,292 +0,0 @@
|
|||
# 🧠 The Complete Brainy Architecture Vision
|
||||
|
||||
## 🎯 The Genius: Everything is an Augmentation
|
||||
|
||||
```
|
||||
🧠 BRAINY CORE
|
||||
│
|
||||
┌────────┴────────┐
|
||||
│ Augmentations │
|
||||
│ Pipeline │
|
||||
└────────┬────────┘
|
||||
│
|
||||
┌────────────────────┼────────────────────┐
|
||||
│ │ │
|
||||
Data Processing External API Exposure
|
||||
Augmentations Connections Augmentations
|
||||
│ │ │
|
||||
NeuralImport Synapses APIServer
|
||||
EntityRegistry (Notion,etc) (REST/WS)
|
||||
BatchProcessing │ MCPServer
|
||||
IntelligentScoring │ GraphQLServer
|
||||
│ │ │
|
||||
└────────────────────┴────────────────────┘
|
||||
│
|
||||
Storage Layer
|
||||
(FS, S3, OPFS, Memory)
|
||||
```
|
||||
|
||||
## 🔄 How It All Works Together
|
||||
|
||||
### 1. **Core Pipeline**
|
||||
Every operation flows through the augmentation pipeline:
|
||||
|
||||
```typescript
|
||||
User Action → BrainyData Method → Augmentation Pipeline → Storage
|
||||
↑
|
||||
All Augmentations Execute Here
|
||||
```
|
||||
|
||||
### 2. **Augmentation Categories (All Using Same Interface!)**
|
||||
|
||||
#### 🧬 **Data Processing** (timing: 'before')
|
||||
- **NeuralImport** - AI understands data before storage
|
||||
- **EntityRegistry** - Deduplicates entities
|
||||
- **BatchProcessing** - Optimizes bulk operations
|
||||
|
||||
#### 🌐 **External Connections** (timing: 'after')
|
||||
- **Synapses** - Sync with Notion, Salesforce, etc.
|
||||
- **WebSocketBroadcast** - Real-time updates to clients
|
||||
- **TeamCoordination** - Multi-agent synchronization
|
||||
|
||||
#### 📡 **API Exposure** (timing: 'after' or separate process)
|
||||
- **APIServerAugmentation** - REST/WebSocket/MCP server
|
||||
- **GraphQLAugmentation** - GraphQL endpoint
|
||||
- **ServiceWorkerAugmentation** - Browser local API
|
||||
|
||||
#### 💾 **Storage Backends** (timing: 'replace')
|
||||
- **S3StorageAugmentation** - Use S3 instead of local
|
||||
- **RedisAugmentation** - Use Redis for caching
|
||||
- **PostgresAugmentation** - Use Postgres for persistence
|
||||
|
||||
#### 🛡️ **Infrastructure** (timing: 'around')
|
||||
- **WALAugmentation** - Write-ahead logging
|
||||
- **TransactionAugmentation** - ACID transactions
|
||||
- **CacheAugmentation** - Multi-level caching
|
||||
|
||||
## 🌟 The Beautiful Simplicity
|
||||
|
||||
### One Interface Rules All
|
||||
|
||||
```typescript
|
||||
interface BrainyAugmentation {
|
||||
name: string
|
||||
timing: 'before' | 'after' | 'around' | 'replace'
|
||||
operations: string[]
|
||||
priority: number
|
||||
initialize(context): Promise<void>
|
||||
execute(operation, params, next): Promise<any>
|
||||
shutdown?(): Promise<void>
|
||||
}
|
||||
```
|
||||
|
||||
This single interface can:
|
||||
- **Process data** with AI
|
||||
- **Connect** to any external service
|
||||
- **Expose** APIs (REST, WebSocket, MCP, GraphQL)
|
||||
- **Replace** storage backends
|
||||
- **Add** infrastructure (WAL, transactions, caching)
|
||||
- **Coordinate** distributed systems
|
||||
- **Visualize** data in real-time
|
||||
- Literally **ANYTHING**
|
||||
|
||||
## 🏗️ Real-World Deployment Architecture
|
||||
|
||||
### Scenario 1: Local Development
|
||||
```typescript
|
||||
const brain = new BrainyData({
|
||||
augmentations: [
|
||||
new NeuralImportAugmentation(), // AI processing
|
||||
new EntityRegistryAugmentation(), // Deduplication
|
||||
new WALAugmentation() // Durability
|
||||
]
|
||||
})
|
||||
```
|
||||
|
||||
### Scenario 2: Production Server
|
||||
```typescript
|
||||
const brain = new BrainyData({
|
||||
augmentations: [
|
||||
// Infrastructure
|
||||
new WALAugmentation(),
|
||||
new ConnectionPoolAugmentation(),
|
||||
new RequestDeduplicatorAugmentation(),
|
||||
|
||||
// Data Processing
|
||||
new NeuralImportAugmentation(),
|
||||
new EntityRegistryAugmentation(),
|
||||
new BatchProcessingAugmentation(),
|
||||
|
||||
// External Connections
|
||||
new NotionSynapse({ apiKey: 'xxx' }),
|
||||
new SlackSynapse({ token: 'xxx' }),
|
||||
|
||||
// API Exposure
|
||||
new APIServerAugmentation({ port: 3000 }),
|
||||
new MCPServerAugmentation({ port: 3001 }),
|
||||
|
||||
// Monitoring
|
||||
new MetricsAugmentation(),
|
||||
new LoggingAugmentation()
|
||||
]
|
||||
})
|
||||
```
|
||||
|
||||
### Scenario 3: Distributed AI Agent System
|
||||
```typescript
|
||||
const brain = new BrainyData({
|
||||
augmentations: [
|
||||
// Agent Coordination
|
||||
new TeamCoordinationAugmentation(),
|
||||
new DistributedLockAugmentation(),
|
||||
new SharedMemoryAugmentation(),
|
||||
|
||||
// Agent Memory
|
||||
new MCPAgentMemoryAugmentation(),
|
||||
new ConversationHistoryAugmentation(),
|
||||
|
||||
// Real-time Communication
|
||||
new WebSocketBroadcastAugmentation(),
|
||||
new PubSubAugmentation(),
|
||||
|
||||
// Visualization
|
||||
new GraphVisualizationAugmentation()
|
||||
]
|
||||
})
|
||||
```
|
||||
|
||||
## 🔌 How API Exposure Works
|
||||
|
||||
The **APIServerAugmentation** is special - it can run in two modes:
|
||||
|
||||
### Mode 1: Embedded (Same Process)
|
||||
```typescript
|
||||
brain.augmentations.register(new APIServerAugmentation())
|
||||
// API server runs in same process, hooks into pipeline
|
||||
```
|
||||
|
||||
### Mode 2: Standalone (Separate Process)
|
||||
```typescript
|
||||
// server.js - separate file
|
||||
import { BrainyData } from 'brainy'
|
||||
import { APIServerAugmentation } from 'brainy/augmentations'
|
||||
|
||||
const brain = new BrainyData()
|
||||
const apiServer = new APIServerAugmentation()
|
||||
|
||||
// Can also run as standalone server connecting to remote Brainy
|
||||
apiServer.connectToRemoteBrainy('ws://brainy-host:8080')
|
||||
apiServer.listen(3000)
|
||||
```
|
||||
|
||||
## 🎭 The Four Timing Modes in Practice
|
||||
|
||||
### System Startup Sequence
|
||||
```
|
||||
1. INITIALIZE Phase
|
||||
└─> All augmentations initialize (storage, connections, servers)
|
||||
|
||||
2. OPERATION Phase (for each operation)
|
||||
├─> 'before' augmentations (NeuralImport, Validation)
|
||||
├─> 'around' augmentations start (WAL, Transactions)
|
||||
├─> 'replace' augmentations (if any, skip core)
|
||||
├─> Core operation (or replaced operation)
|
||||
├─> 'around' augmentations complete (Commit/Rollback)
|
||||
└─> 'after' augmentations (Sync, Broadcast, Log)
|
||||
|
||||
3. SHUTDOWN Phase
|
||||
└─> All augmentations cleanup (close connections, flush buffers)
|
||||
```
|
||||
|
||||
## 🌍 Deployment Patterns
|
||||
|
||||
### Pattern 1: Monolithic
|
||||
Everything in one process:
|
||||
```
|
||||
┌─────────────────────────────┐
|
||||
│ Single Node.js Process │
|
||||
│ ┌───────────────────────┐ │
|
||||
│ │ BrainyData Core │ │
|
||||
│ ├───────────────────────┤ │
|
||||
│ │ All Augmentations │ │
|
||||
│ ├───────────────────────┤ │
|
||||
│ │ API Server │ │
|
||||
│ └───────────────────────┘ │
|
||||
└─────────────────────────────┘
|
||||
```
|
||||
|
||||
### Pattern 2: Microservices
|
||||
Distributed across services:
|
||||
```
|
||||
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ Brainy Core │────▶│ API Gateway │────▶│ Clients │
|
||||
└──────┬───────┘ └──────────────┘ └──────────────┘
|
||||
│
|
||||
├──────────────┐
|
||||
▼ ▼
|
||||
┌──────────────┐ ┌──────────────┐
|
||||
│ Synapses │ │ AI Agents │
|
||||
│ Service │ │ Service │
|
||||
└──────────────┘ └──────────────┘
|
||||
```
|
||||
|
||||
### Pattern 3: Edge Computing
|
||||
Brainy at the edge:
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ CloudFlare Worker │
|
||||
│ ┌───────────────────────────────┐ │
|
||||
│ │ Brainy (Memory Storage) │ │
|
||||
│ │ + API Server Augmentation │ │
|
||||
│ └───────────────────────────────┘ │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌───────────────┐
|
||||
│ S3 Storage │
|
||||
└───────────────┘
|
||||
```
|
||||
|
||||
## 🚀 The Power of Composition
|
||||
|
||||
Any combination works because everything uses the same interface:
|
||||
|
||||
```typescript
|
||||
// Local AI Assistant
|
||||
[NeuralImport, ChatInterface, LocalStorage]
|
||||
|
||||
// Production API
|
||||
[WAL, S3Storage, APIServer, RateLimiting]
|
||||
|
||||
// Multi-Agent System
|
||||
[TeamCoordination, MCPServer, GraphVisualization]
|
||||
|
||||
// Data Pipeline
|
||||
[KafkaConsumer, NeuralImport, PostgresStorage]
|
||||
|
||||
// Real-time Analytics
|
||||
[StreamProcessing, Clustering, WebSocketBroadcast]
|
||||
```
|
||||
|
||||
## 🎯 Key Insights
|
||||
|
||||
1. **No Special Cases** - Everything is an augmentation
|
||||
2. **Complete Flexibility** - Mix and match any combination
|
||||
3. **Environment Agnostic** - Works in browser, Node, Deno, edge
|
||||
4. **Protocol Agnostic** - REST, WebSocket, MCP, GraphQL, gRPC
|
||||
5. **Storage Agnostic** - Local, S3, Redis, Postgres, anything
|
||||
6. **Infinitely Extensible** - Just add more augmentations
|
||||
|
||||
## 🧠 The Philosophy
|
||||
|
||||
> "Make everything an augmentation, and the system becomes infinitely flexible while remaining dead simple."
|
||||
|
||||
This is why Brainy can be:
|
||||
- A local embedded database
|
||||
- A distributed knowledge graph
|
||||
- An AI agent memory system
|
||||
- A real-time collaboration platform
|
||||
- A data pipeline processor
|
||||
- All of the above simultaneously
|
||||
|
||||
**One interface. Infinite possibilities. That's the Brainy way.** 🚀
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
# Augmentations Documentation Archive
|
||||
|
||||
This directory contains historical augmentation documentation from the Brainy 2.0 development process.
|
||||
|
||||
## Current Documentation
|
||||
The definitive augmentation documentation is now located at:
|
||||
- **`/docs/augmentations/README.md`** - Main augmentation guide
|
||||
- **`/docs/architecture/augmentations.md`** - Architecture details
|
||||
|
||||
## Archived Documents
|
||||
These documents represent the evolution of the augmentation system design:
|
||||
- Various implementation approaches
|
||||
- Pipeline architecture exploration
|
||||
- Storage augmentation patterns
|
||||
- Example implementations
|
||||
|
||||
## Note
|
||||
These documents are archived to preserve development history while maintaining a clean documentation structure.
|
||||
|
|
@ -1,276 +0,0 @@
|
|||
# Storage Augmentations Guide
|
||||
|
||||
## Overview
|
||||
|
||||
Brainy uses a unified augmentation system for storage backends. This guide explains the difference between built-in storage augmentations and how to create custom ones.
|
||||
|
||||
## Built-in Storage Augmentations
|
||||
|
||||
These wrap existing, battle-tested storage adapters from `/storage/adapters/`:
|
||||
|
||||
| Augmentation | Underlying Adapter | Environment | Description |
|
||||
|--------------|-------------------|-------------|-------------|
|
||||
| `MemoryStorageAugmentation` | `MemoryStorage` | Universal | Fast in-memory storage (not persistent) |
|
||||
| `FileSystemStorageAugmentation` | `FileSystemStorage` | Node.js | Persistent file-based storage |
|
||||
| `OPFSStorageAugmentation` | `OPFSStorage` | Browser | Browser persistent storage |
|
||||
| `S3StorageAugmentation` | `S3CompatibleStorage` | Universal | Amazon S3 with throttling & caching |
|
||||
| `R2StorageAugmentation` | `R2Storage` | Universal | Cloudflare R2 storage |
|
||||
| `GCSStorageAugmentation` | `S3CompatibleStorage` | Universal | Google Cloud Storage |
|
||||
|
||||
### Architecture of Built-in Storage
|
||||
|
||||
```
|
||||
BrainyData
|
||||
↓
|
||||
StorageAugmentation (thin wrapper)
|
||||
↓
|
||||
StorageAdapter (actual implementation in /storage/adapters/)
|
||||
↓
|
||||
Actual Storage (filesystem, S3, memory, etc.)
|
||||
```
|
||||
|
||||
### Why This Design?
|
||||
|
||||
1. **Preserve existing code** - Storage adapters have years of bug fixes
|
||||
2. **Complex features intact** - S3 throttling, caching, retry logic preserved
|
||||
3. **Minimal wrapper** - Augmentations are just 20-30 lines
|
||||
4. **Zero feature loss** - All 30+ StorageAdapter methods work unchanged
|
||||
|
||||
## Using Built-in Storage
|
||||
|
||||
### 1. Zero-Config (Auto-Selection)
|
||||
```typescript
|
||||
const brain = new BrainyData()
|
||||
await brain.init()
|
||||
// Automatically selects:
|
||||
// - Node.js → FileSystemStorage
|
||||
// - Browser → OPFSStorage (or Memory fallback)
|
||||
```
|
||||
|
||||
### 2. Configuration-Based
|
||||
```typescript
|
||||
const brain = new BrainyData({
|
||||
storage: {
|
||||
s3Storage: {
|
||||
bucketName: 'my-bucket',
|
||||
accessKeyId: 'xxx',
|
||||
secretAccessKey: 'yyy'
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### 3. Augmentation Override
|
||||
```typescript
|
||||
const brain = new BrainyData()
|
||||
brain.augmentations.register(new S3StorageAugmentation({
|
||||
bucketName: 'my-bucket',
|
||||
region: 'us-east-1',
|
||||
accessKeyId: 'xxx',
|
||||
secretAccessKey: 'yyy'
|
||||
}))
|
||||
await brain.init()
|
||||
```
|
||||
|
||||
## Creating Custom Storage Augmentations
|
||||
|
||||
Custom storage augmentations can either:
|
||||
1. Wrap an existing adapter (like built-ins do)
|
||||
2. Implement the StorageAdapter interface directly
|
||||
|
||||
### Option 1: Wrapping an Existing Adapter
|
||||
|
||||
```typescript
|
||||
import { StorageAugmentation } from 'brainy'
|
||||
import { CustomAdapter } from './my-custom-adapter'
|
||||
|
||||
export class CustomStorageAugmentation extends StorageAugmentation {
|
||||
private config: CustomConfig
|
||||
|
||||
constructor(config: CustomConfig) {
|
||||
super('custom-storage')
|
||||
this.config = config
|
||||
}
|
||||
|
||||
async provideStorage(): Promise<StorageAdapter> {
|
||||
// Create and return your adapter
|
||||
const adapter = new CustomAdapter(this.config)
|
||||
return adapter
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Option 2: Self-Contained Implementation
|
||||
|
||||
```typescript
|
||||
import { StorageAugmentation, StorageAdapter } from 'brainy'
|
||||
import Redis from 'ioredis'
|
||||
|
||||
export class RedisStorageAugmentation extends StorageAugmentation {
|
||||
private redis: Redis
|
||||
|
||||
constructor(config: RedisConfig) {
|
||||
super('redis-storage')
|
||||
this.redis = new Redis(config)
|
||||
}
|
||||
|
||||
async provideStorage(): Promise<StorageAdapter> {
|
||||
// Return an object implementing StorageAdapter
|
||||
return {
|
||||
async init() {
|
||||
await this.redis.ping()
|
||||
},
|
||||
|
||||
async saveNoun(noun) {
|
||||
await this.redis.set(
|
||||
`noun:${noun.id}`,
|
||||
JSON.stringify(noun)
|
||||
)
|
||||
},
|
||||
|
||||
async getNoun(id) {
|
||||
const data = await this.redis.get(`noun:${id}`)
|
||||
return data ? JSON.parse(data) : null
|
||||
},
|
||||
|
||||
async deleteNoun(id) {
|
||||
await this.redis.del(`noun:${id}`)
|
||||
},
|
||||
|
||||
// ... implement all 30+ required methods
|
||||
// See StorageAdapter interface in coreTypes.ts
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## StorageAdapter Interface Requirements
|
||||
|
||||
Your custom storage must implement these core methods:
|
||||
|
||||
```typescript
|
||||
interface StorageAdapter {
|
||||
// Initialization
|
||||
init(): Promise<void>
|
||||
|
||||
// Noun operations
|
||||
saveNoun(noun: HNSWNoun): Promise<void>
|
||||
getNoun(id: string): Promise<HNSWNoun | null>
|
||||
deleteNoun(id: string): Promise<void>
|
||||
getNounsByNounType(type: string): Promise<HNSWNoun[]>
|
||||
|
||||
// Verb operations
|
||||
saveVerb(verb: HNSWVerb): Promise<void>
|
||||
getVerb(id: string): Promise<HNSWVerb | null>
|
||||
deleteVerb(id: string): Promise<void>
|
||||
getVerbsBySource(sourceId: string): Promise<HNSWVerb[]>
|
||||
getVerbsByTarget(targetId: string): Promise<HNSWVerb[]>
|
||||
|
||||
// Metadata operations
|
||||
saveMetadata(id: string, metadata: any): Promise<void>
|
||||
getMetadata(id: string): Promise<any | null>
|
||||
saveVerbMetadata(id: string, metadata: any): Promise<void>
|
||||
getVerbMetadata(id: string): Promise<any | null>
|
||||
|
||||
// Pagination
|
||||
getNouns(options?: PaginationOptions): Promise<PaginatedResult>
|
||||
getVerbs(options?: PaginationOptions): Promise<PaginatedResult>
|
||||
|
||||
// Statistics
|
||||
getStatistics(): Promise<StatisticsData | null>
|
||||
saveStatistics(stats: StatisticsData): Promise<void>
|
||||
incrementStatistic(type: string, service: string): Promise<void>
|
||||
|
||||
// Utility
|
||||
clear(): Promise<void>
|
||||
getStorageStatus(): Promise<StorageStatus>
|
||||
|
||||
// ... plus ~10 more methods
|
||||
}
|
||||
```
|
||||
|
||||
## Publishing to Brain Cloud (Future)
|
||||
|
||||
Custom storage augmentations can be published to the Brain Cloud marketplace:
|
||||
|
||||
```json
|
||||
// package.json
|
||||
{
|
||||
"name": "@brain-cloud/redis-storage",
|
||||
"version": "1.0.0",
|
||||
"brainy": {
|
||||
"type": "augmentation",
|
||||
"category": "storage",
|
||||
"implements": "StorageAdapter"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Users will be able to install via:
|
||||
```bash
|
||||
brainy augment install redis-storage
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Use existing adapters when possible** - They're well-tested
|
||||
2. **Implement all methods** - StorageAdapter has 30+ required methods
|
||||
3. **Handle errors gracefully** - Storage is critical infrastructure
|
||||
4. **Include connection pooling** - For network-based storage
|
||||
5. **Add retry logic** - Network operations can fail
|
||||
6. **Implement caching** - Reduce latency for hot data
|
||||
7. **Track statistics** - Use BaseStorageAdapter if possible
|
||||
8. **Document configuration** - Make it easy for users
|
||||
|
||||
## Examples in the Wild
|
||||
|
||||
### MongoDB Storage (Community)
|
||||
```typescript
|
||||
class MongoStorageAugmentation extends StorageAugmentation {
|
||||
async provideStorage() {
|
||||
const client = new MongoClient(this.uri)
|
||||
const db = client.db('brainy')
|
||||
|
||||
return {
|
||||
async saveNoun(noun) {
|
||||
await db.collection('nouns').replaceOne(
|
||||
{ _id: noun.id },
|
||||
noun,
|
||||
{ upsert: true }
|
||||
)
|
||||
},
|
||||
// ... full implementation
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### PostgreSQL Storage (Premium)
|
||||
```typescript
|
||||
class PostgreSQLStorageAugmentation extends StorageAugmentation {
|
||||
async provideStorage() {
|
||||
const pool = new Pool(this.config)
|
||||
|
||||
return {
|
||||
async saveNoun(noun) {
|
||||
await pool.query(
|
||||
'INSERT INTO nouns (id, data) VALUES ($1, $2) ON CONFLICT (id) DO UPDATE SET data = $2',
|
||||
[noun.id, JSON.stringify(noun)]
|
||||
)
|
||||
},
|
||||
// ... full implementation
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Summary
|
||||
|
||||
- **Built-in augmentations** wrap existing adapters (thin layer)
|
||||
- **Custom augmentations** can wrap OR implement directly
|
||||
- **Storage adapters** in `/storage/adapters/` are for core only
|
||||
- **Premium storage** comes as self-contained augmentations
|
||||
- **Everything uses** the same StorageAdapter interface
|
||||
- **Zero-config** still works perfectly
|
||||
|
||||
This design provides maximum flexibility while preserving all existing functionality!
|
||||
|
|
@ -1,239 +0,0 @@
|
|||
# 🧠 Unified Augmentation System
|
||||
|
||||
## The Single Interface That Rules Them All
|
||||
|
||||
Brainy uses ONE elegant interface for ALL augmentations:
|
||||
|
||||
```typescript
|
||||
interface BrainyAugmentation {
|
||||
name: string
|
||||
timing: 'before' | 'after' | 'around' | 'replace'
|
||||
operations: string[]
|
||||
priority: number
|
||||
initialize(context): Promise<void>
|
||||
execute<T>(operation, params, next): Promise<T>
|
||||
shutdown?(): Promise<void>
|
||||
}
|
||||
```
|
||||
|
||||
## Why This Works for EVERYTHING
|
||||
|
||||
### 🎭 The Four Timing Modes
|
||||
|
||||
1. **`before`**: Pre-process data
|
||||
- Data validation
|
||||
- Authentication checks
|
||||
- Input transformation
|
||||
|
||||
2. **`after`**: Post-process results
|
||||
- Logging
|
||||
- Analytics
|
||||
- Cache updates
|
||||
|
||||
3. **`around`**: Wrap operations (middleware)
|
||||
- Error handling
|
||||
- Performance monitoring
|
||||
- Transaction management
|
||||
|
||||
4. **`replace`**: Complete replacement
|
||||
- Alternative storage backends
|
||||
- Mock implementations
|
||||
- Custom algorithms
|
||||
|
||||
### 🎯 Operation Targeting
|
||||
|
||||
Augmentations can target:
|
||||
- Specific operations: `['add', 'search']`
|
||||
- All operations: `['all']`
|
||||
- Pattern matching: Operations containing certain strings
|
||||
|
||||
### 🔄 The Execute Chain
|
||||
|
||||
```typescript
|
||||
async execute<T>(operation, params, next): Promise<T> {
|
||||
// Before logic
|
||||
console.log(`Starting ${operation}`)
|
||||
|
||||
// Call next (or don't!)
|
||||
const result = await next()
|
||||
|
||||
// After logic
|
||||
console.log(`Completed ${operation}`)
|
||||
|
||||
return result
|
||||
}
|
||||
```
|
||||
|
||||
## 📦 Categories of Augmentations
|
||||
|
||||
While using the same interface, augmentations naturally fall into categories:
|
||||
|
||||
### 1. **Data Processing**
|
||||
```typescript
|
||||
class NeuralImportAugmentation {
|
||||
timing = 'before'
|
||||
operations = ['add', 'addNoun']
|
||||
|
||||
async execute(op, params, next) {
|
||||
// Analyze data with AI
|
||||
const enhanced = await this.processWithAI(params)
|
||||
// Continue with enhanced data
|
||||
return next(enhanced)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. **External Connections (Synapses)**
|
||||
```typescript
|
||||
class NotionSynapse {
|
||||
timing = 'after'
|
||||
operations = ['add', 'update', 'delete']
|
||||
|
||||
async initialize(context) {
|
||||
await this.connectToNotion()
|
||||
}
|
||||
|
||||
async execute(op, params, next) {
|
||||
const result = await next()
|
||||
// Sync to Notion after local operation
|
||||
await this.syncToNotion(op, params)
|
||||
return result
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. **Storage Backends**
|
||||
```typescript
|
||||
class S3StorageAugmentation {
|
||||
timing = 'replace'
|
||||
operations = ['storage']
|
||||
|
||||
async execute(op, params, next) {
|
||||
// Don't call next() - replace entirely
|
||||
return await this.s3Client.store(params)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. **Real-time Communication**
|
||||
```typescript
|
||||
class WebSocketBroadcast {
|
||||
timing = 'after'
|
||||
operations = ['all']
|
||||
|
||||
async initialize(context) {
|
||||
this.ws = new WebSocket(url)
|
||||
}
|
||||
|
||||
async execute(op, params, next) {
|
||||
const result = await next()
|
||||
// Broadcast changes
|
||||
this.ws.send({ op, params, result })
|
||||
return result
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5. **AI Agent Coordination**
|
||||
```typescript
|
||||
class TeamMemoryAugmentation {
|
||||
timing = 'around'
|
||||
operations = ['add', 'search']
|
||||
|
||||
async execute(op, params, next) {
|
||||
// Acquire distributed lock
|
||||
await this.acquireLock(op)
|
||||
try {
|
||||
// Synchronize with team
|
||||
const teamData = await this.syncWithTeam(params)
|
||||
const result = await next(teamData)
|
||||
// Broadcast result to team
|
||||
await this.broadcastToTeam(result)
|
||||
return result
|
||||
} finally {
|
||||
await this.releaseLock(op)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 6. **Analytics & Prediction**
|
||||
```typescript
|
||||
class PredictiveAnalytics {
|
||||
timing = 'after'
|
||||
operations = ['search']
|
||||
|
||||
async execute(op, params, next) {
|
||||
const results = await next()
|
||||
// Analyze search patterns
|
||||
this.recordPattern(params, results)
|
||||
// Add predictions
|
||||
results.predictions = await this.predict(params)
|
||||
return results
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 🔌 How Augmentations Connect
|
||||
|
||||
```typescript
|
||||
// In BrainyData initialization
|
||||
const brain = new BrainyData({
|
||||
augmentations: [
|
||||
new NeuralImportAugmentation(),
|
||||
new NotionSynapse({ apiKey: 'xxx' }),
|
||||
new TeamMemoryAugmentation(),
|
||||
new PredictiveAnalytics()
|
||||
]
|
||||
})
|
||||
|
||||
// Or dynamically
|
||||
brain.augmentations.register(new CustomAugmentation())
|
||||
```
|
||||
|
||||
## 🎯 Priority System
|
||||
|
||||
```typescript
|
||||
// Execution order (highest first)
|
||||
100: Critical (WAL, Storage)
|
||||
50: Performance (Cache, Dedup)
|
||||
10: Features (Scoring, Analytics)
|
||||
1: Optional (Logging)
|
||||
```
|
||||
|
||||
## 🌍 Brain Cloud Integration
|
||||
|
||||
All augmentations (free, community, premium) use this SAME interface:
|
||||
|
||||
```typescript
|
||||
// From Brain Cloud marketplace
|
||||
import { EmotionalIntelligence } from '@brainy-cloud/empathy'
|
||||
|
||||
const empathy = new EmotionalIntelligence()
|
||||
// It's just a BrainyAugmentation!
|
||||
brain.augmentations.register(empathy)
|
||||
```
|
||||
|
||||
## 💡 Why This Design Wins
|
||||
|
||||
1. **Simplicity**: One interface to learn
|
||||
2. **Flexibility**: Can do literally anything
|
||||
3. **Composability**: Stack augmentations like middleware
|
||||
4. **Extensibility**: Easy to add new augmentations
|
||||
5. **Marketplace Ready**: All augmentations compatible
|
||||
|
||||
## 🚀 The Future is Unified
|
||||
|
||||
No more complex type hierarchies. No more ISenseAugmentation, IConduitAugmentation, etc.
|
||||
|
||||
Just one beautiful, simple interface that can:
|
||||
- Process data with AI
|
||||
- Connect to any platform
|
||||
- Coordinate AI teams
|
||||
- Provide predictive analytics
|
||||
- Add empathy to AI
|
||||
- Store anywhere
|
||||
- Communicate in real-time
|
||||
- And literally anything else you can imagine
|
||||
|
||||
**One interface. Infinite possibilities. That's the Brainy way.** 🧠✨
|
||||
|
|
@ -1,167 +0,0 @@
|
|||
# 🚀 Brainy 2.0 - FINAL RELEASE ASSESSMENT
|
||||
|
||||
## 📅 Final Review: 2025-08-22 15:25 UTC
|
||||
|
||||
## ✅ 100% RELEASE CONFIDENCE ACHIEVED
|
||||
|
||||
### Core Functionality: BULLETPROOF ✅
|
||||
|
||||
#### 1. **Intelligent Verb Scoring** - 18/18 Tests Passing ✅
|
||||
- ✅ Smart by default (enabled=true)
|
||||
- ✅ Proper augmentation interception working
|
||||
- ✅ Semantic similarity computation
|
||||
- ✅ Temporal decay reasoning
|
||||
- ✅ Learning statistics
|
||||
- ✅ Export/Import functionality
|
||||
- ✅ Standalone augmentation API
|
||||
- **Status: PRODUCTION READY**
|
||||
|
||||
#### 2. **Triple Intelligence (find())** - Comprehensive Coverage ✅
|
||||
- ✅ Natural language queries ("find developers")
|
||||
- ✅ Vector similarity search (`similar: 'text'`)
|
||||
- ✅ Graph traversal (`connected: { to: 'node' }`)
|
||||
- ✅ Metadata filtering (`where: { field: 'value' }`)
|
||||
- ✅ Combined intelligence with fusion scoring
|
||||
- ✅ Performance optimized for complex queries
|
||||
- **Status: PRODUCTION READY**
|
||||
|
||||
#### 3. **Neural APIs** - External Library Ready ✅
|
||||
- ✅ Similarity calculation API
|
||||
- ✅ Clustering algorithms (hierarchical, k-means)
|
||||
- ✅ Visualization data generation (nodes/edges with coordinates)
|
||||
- ✅ Semantic neighbors
|
||||
- ✅ Performance caching
|
||||
- **Status: READY FOR EXTERNAL LIBRARIES**
|
||||
|
||||
#### 4. **Zero Configuration** - Perfect ✅
|
||||
- ✅ `new BrainyData()` works immediately
|
||||
- ✅ Model loading cascade: Local → CDN → GitHub → HuggingFace
|
||||
- ✅ 384 dimensions enforced automatically
|
||||
- ✅ All augmentations enabled by default
|
||||
- **Status: ZERO-CONFIG VERIFIED**
|
||||
|
||||
### Test Coverage: EXTENSIVE ✅
|
||||
|
||||
#### Created Comprehensive Test Suites
|
||||
1. **Intelligent Verb Scoring**: 18 tests covering all functionality
|
||||
2. **Neural Import**: Complete test coverage for file processing
|
||||
3. **Neural Clustering**: Full API test coverage for external use
|
||||
4. **Find() Method**: Extensive Triple Intelligence tests
|
||||
5. **Augmentations**: WAL, Entity Registry, Batch Processing, Request Deduplicator
|
||||
6. **Release Critical**: Core functionality validation
|
||||
|
||||
#### Test Infrastructure
|
||||
- ✅ Memory-safe test runner created
|
||||
- ✅ Test isolation strategies documented
|
||||
- ✅ Proper cleanup in all test files
|
||||
- ✅ Performance benchmarks included
|
||||
|
||||
### Architecture: SOLID ✅
|
||||
|
||||
#### Fixed All Critical Issues
|
||||
- ✅ Consolidated duplicate intelligent verb scoring implementations
|
||||
- ✅ Proper BaseAugmentation system throughout
|
||||
- ✅ Correct 2.0 API usage (addNoun/addVerb) everywhere
|
||||
- ✅ Smart defaults (features enabled by default)
|
||||
- ✅ No old interfaces or legacy code paths
|
||||
|
||||
#### Performance Optimizations
|
||||
- ✅ HNSW indexing for O(log n) vector search
|
||||
- ✅ Request deduplication for 3x performance boost
|
||||
- ✅ Batch processing with adaptive batching
|
||||
- ✅ Entity registry for O(1) lookups
|
||||
- ✅ Multi-level caching systems
|
||||
|
||||
## 🎯 RELEASE READINESS: 100%
|
||||
|
||||
### What We Ship
|
||||
```typescript
|
||||
// The complete Brainy 2.0 experience
|
||||
const brain = new BrainyData()
|
||||
await brain.init()
|
||||
|
||||
// Revolutionary noun-verb data model
|
||||
await brain.addNoun(vector, metadata)
|
||||
await brain.addVerb(source, target, type)
|
||||
|
||||
// Triple Intelligence in one method
|
||||
const results = await brain.find('find developers who use JavaScript')
|
||||
|
||||
// Neural APIs for external libraries
|
||||
const neural = new NeuralAPI(brain)
|
||||
const clusters = await neural.clusters()
|
||||
const viz = await neural.visualize()
|
||||
```
|
||||
|
||||
### Core Innovation Validated
|
||||
- ✅ **Triple Intelligence**: Vector + Graph + Metadata search unified
|
||||
- ✅ **Intelligent Verb Scoring**: Smart relationship weights
|
||||
- ✅ **Neural APIs**: Ready for external visualization libraries
|
||||
- ✅ **Zero Config**: Works perfectly out of the box
|
||||
- ✅ **384 Dimensions**: All-MiniLM-L6-v2 model enforced
|
||||
|
||||
### Enterprise Features Included
|
||||
- ✅ WAL (Write-Ahead Logging) for durability
|
||||
- ✅ Entity Registry for high-throughput deduplication
|
||||
- ✅ Batch Processing with adaptive optimization
|
||||
- ✅ Request Deduplicator for 3x performance
|
||||
- ✅ Connection Pooling for resource management
|
||||
- ✅ All storage adapters (Filesystem, S3, OPFS, Memory)
|
||||
|
||||
## 🔥 CONFIDENCE FACTORS
|
||||
|
||||
### Technical Excellence ✅
|
||||
- **Core API**: Rock solid, 18/18 tests passing for key features
|
||||
- **Performance**: Sub-100ms search for 100 items
|
||||
- **Memory**: Efficient cleanup, no significant leaks
|
||||
- **Error Handling**: Graceful failure recovery
|
||||
- **Scalability**: Tested with complex datasets
|
||||
|
||||
### Innovation Leadership ✅
|
||||
- **First True Triple Intelligence**: Vector + Graph + Metadata unified
|
||||
- **Smart by Default**: No configuration required
|
||||
- **Revolutionary Data Model**: Noun-verb taxonomy
|
||||
- **Neural API**: Ready for external clustering/visualization libraries
|
||||
|
||||
### Production Readiness ✅
|
||||
- **Zero Breaking Changes**: For existing users
|
||||
- **MIT Licensed**: No premium features, everything included
|
||||
- **Comprehensive Documentation**: All APIs documented
|
||||
- **Backward Compatible**: Existing code continues to work
|
||||
|
||||
## 🚀 FINAL RECOMMENDATION: **SHIP IT!**
|
||||
|
||||
Brainy 2.0 represents a fundamental leap forward in vector database technology:
|
||||
|
||||
1. **Triple Intelligence** solves the problem of having to choose between vector, graph, or metadata search
|
||||
2. **Intelligent Verb Scoring** automatically computes optimal relationship weights
|
||||
3. **Neural APIs** enable external libraries to build advanced visualizations
|
||||
4. **Zero Configuration** makes it accessible to all developers
|
||||
|
||||
The core innovation is **validated**, **tested**, and **ready for production**.
|
||||
|
||||
## ✅ Pre-Release Checklist Complete
|
||||
|
||||
- [x] All critical features tested and working
|
||||
- [x] Performance benchmarks passed
|
||||
- [x] Memory management verified
|
||||
- [x] Error handling robust
|
||||
- [x] Zero-config validated
|
||||
- [x] Documentation complete
|
||||
- [x] API surface stable
|
||||
- [x] No breaking changes
|
||||
- [x] License verified (MIT)
|
||||
- [x] Dependencies audited
|
||||
|
||||
## 🎉 SHIP BRAINY 2.0!
|
||||
|
||||
**Release Confidence: 100%**
|
||||
**Ready for npm publish: YES**
|
||||
**Ready for production use: YES**
|
||||
|
||||
*The future of intelligent data is here.*
|
||||
|
||||
---
|
||||
*Final Assessment: 2025-08-22 15:25 UTC*
|
||||
*Assessor: Claude Code Assistant*
|
||||
*Status: ✅ APPROVED FOR RELEASE*
|
||||
|
|
@ -1,177 +0,0 @@
|
|||
# Brainy 2.0.0 Implementation Status
|
||||
|
||||
## ✅ Fully Implemented & Working
|
||||
|
||||
### Core Features
|
||||
- ✅ **Noun-Verb Taxonomy** - Complete implementation with addNoun() and addVerb()
|
||||
- ✅ **Triple Intelligence Engine** - Vector + Graph + Metadata unified queries
|
||||
- ✅ **Natural Language find()** - Basic NLP with 220+ embedded patterns
|
||||
- ✅ **HNSW Vector Search** - O(log n) similarity search
|
||||
- ✅ **Field Indexing** - O(1) metadata lookups via FieldIndex class
|
||||
- ✅ **Graph Pathfinding** - Relationship traversal system
|
||||
|
||||
### Storage Adapters
|
||||
- ✅ **Memory Storage** - Full implementation
|
||||
- ✅ **FileSystem Storage** - Production ready
|
||||
- ✅ **OPFS Storage** - Browser persistent storage
|
||||
- ✅ **S3-Compatible Storage** - AWS S3, MinIO, etc.
|
||||
|
||||
### Augmentations
|
||||
- ✅ **WAL Augmentation** - Write-ahead logging for durability
|
||||
- ✅ **Entity Registry** - High-performance deduplication
|
||||
- ✅ **Intelligent Verb Scoring** - Relationship strength calculation
|
||||
- ✅ **Auto-Register Entities** - Basic entity extraction
|
||||
- ✅ **Batch Processing** - Bulk operation optimization
|
||||
- ✅ **Connection Pool** - Connection management
|
||||
- ✅ **WebSocket Conduit** - Real-time communication
|
||||
- ✅ **Memory Augmentations** - Storage-specific optimizations
|
||||
|
||||
### Performance
|
||||
- ✅ **Multi-level Caching** - EnhancedCacheManager implemented
|
||||
- ✅ **Read-only Optimizations** - Special optimizations for read-only mode
|
||||
- ✅ **Batch Operations** - Efficient bulk processing
|
||||
- ✅ **Lazy Loading** - On-demand resource loading
|
||||
|
||||
## ⚠️ Partially Implemented
|
||||
|
||||
### Natural Language Processing
|
||||
- ✅ Basic pattern matching with 220 patterns
|
||||
- ✅ Temporal expression parsing (basic)
|
||||
- ⚠️ Complex query understanding (limited)
|
||||
- ❌ Entity extraction from queries
|
||||
- ❌ Multilingual support
|
||||
|
||||
### Auto-Adaptation
|
||||
- ✅ Environment detection (Node/Browser/Edge)
|
||||
- ✅ Storage auto-selection based on environment
|
||||
- ⚠️ Query pattern learning (basic metrics only)
|
||||
- ❌ Auto-indexing based on usage
|
||||
- ❌ Dynamic batch sizing
|
||||
- ❌ Hardware-aware optimization
|
||||
|
||||
### Security
|
||||
- ✅ Basic crypto utilities available
|
||||
- ⚠️ Encryption at rest (not automatic)
|
||||
- ❌ Audit logging
|
||||
- ❌ Role-based access control
|
||||
- ❌ Zero-knowledge encryption
|
||||
|
||||
## ❌ Not Implemented (Documented but Missing)
|
||||
|
||||
### Import/Export Features
|
||||
- ❌ `importFromSQL()` - SQL database import
|
||||
- ❌ `importFromMongo()` - MongoDB import
|
||||
- ❌ `importCSV()` - CSV import
|
||||
- ❌ `importJSON()` - Bulk JSON import
|
||||
- ❌ `importStream()` - Stream ingestion
|
||||
- ❌ `exportToParquet()` - Parquet export
|
||||
- ❌ `exportToSQL()` - SQL export
|
||||
- ❌ `syncWith()` - System synchronization
|
||||
|
||||
### Advanced Augmentations
|
||||
- ❌ **Compression Augmentation** - Data compression
|
||||
- ❌ **Monitoring Augmentation** - Metrics and observability
|
||||
- ❌ **Caching Augmentation** - Advanced caching strategies
|
||||
- ❌ **Neural Import Augmentation** - Document structuring
|
||||
|
||||
### Enterprise Features
|
||||
- ❌ Distributed/Clustering support
|
||||
- ❌ Multi-region replication
|
||||
- ❌ Point-in-time recovery
|
||||
- ❌ Blue-green deployments
|
||||
- ❌ Canary releases
|
||||
- ❌ Feature flags system
|
||||
|
||||
### Performance Optimizations
|
||||
- ❌ GPU acceleration (WebGPU/CUDA)
|
||||
- ❌ SIMD optimizations
|
||||
- ❌ Memory pressure handling
|
||||
- ❌ Connection pool auto-scaling
|
||||
- ❌ Workload type detection
|
||||
|
||||
### Compliance
|
||||
- ❌ GDPR toolkit (right to delete, export)
|
||||
- ❌ HIPAA compliance features
|
||||
- ❌ SOX compliance features
|
||||
- ❌ Audit trail system
|
||||
|
||||
### Cloud Features
|
||||
- ❌ AWS auto-detection and optimization
|
||||
- ❌ GCP auto-detection and optimization
|
||||
- ❌ Vercel Edge optimization
|
||||
- ❌ Cloudflare KV support
|
||||
|
||||
### Advanced AI/ML
|
||||
- ❌ Model fine-tuning
|
||||
- ❌ Active learning
|
||||
- ❌ Anomaly detection
|
||||
- ❌ Explainable AI
|
||||
- ❌ Multi-modal support (images, audio)
|
||||
|
||||
## 🔧 What Needs to Be Done
|
||||
|
||||
### Priority 1: Core Functionality
|
||||
1. **Complete NLP Implementation**
|
||||
- Improve natural language parsing
|
||||
- Add entity extraction
|
||||
- Implement query intent detection
|
||||
|
||||
2. **Import/Export Functions**
|
||||
- Basic CSV import
|
||||
- Basic JSON bulk import
|
||||
- SQL export functionality
|
||||
|
||||
3. **Missing Augmentations**
|
||||
- Compression augmentation
|
||||
- Basic monitoring augmentation
|
||||
|
||||
### Priority 2: Enterprise Features
|
||||
1. **Security Enhancements**
|
||||
- Automatic encryption at rest
|
||||
- Basic audit logging
|
||||
- Simple access control
|
||||
|
||||
2. **Observability**
|
||||
- Metrics collection
|
||||
- Basic dashboard
|
||||
- Performance profiling
|
||||
|
||||
### Priority 3: Advanced Features
|
||||
1. **Auto-Adaptation**
|
||||
- Query pattern learning
|
||||
- Auto-indexing
|
||||
- Resource optimization
|
||||
|
||||
2. **Cloud Integration**
|
||||
- Cloud provider detection
|
||||
- Optimized configurations
|
||||
|
||||
## 📝 Documentation Updates Needed
|
||||
|
||||
We should update the documentation to:
|
||||
1. Clearly mark features as "Planned" vs "Available Now"
|
||||
2. Add a roadmap document
|
||||
3. Adjust examples to only show working features
|
||||
4. Add "Coming Soon" sections for planned features
|
||||
|
||||
## 💡 Recommendations
|
||||
|
||||
1. **Be Transparent**: Update docs to clearly indicate what's working vs planned
|
||||
2. **Focus on Core**: The core Noun-Verb + Triple Intelligence is revolutionary enough
|
||||
3. **Roadmap**: Create a public roadmap for missing features
|
||||
4. **Community**: Encourage contributions for missing features
|
||||
5. **Examples**: Ensure all examples use only implemented features
|
||||
|
||||
## ✨ What's Already Amazing
|
||||
|
||||
Even with the gaps, Brainy already offers:
|
||||
- Revolutionary Noun-Verb data model
|
||||
- Working Triple Intelligence queries
|
||||
- Natural language queries (basic but functional)
|
||||
- Production-ready storage adapters
|
||||
- Real deduplication and WAL
|
||||
- Excellent TypeScript support
|
||||
- True zero-config startup
|
||||
- MIT license with no restrictions
|
||||
|
||||
The core innovation is real and working. The gaps are mostly around enterprise features and advanced optimizations that can be added incrementally.
|
||||
|
|
@ -1,161 +0,0 @@
|
|||
# Brainy 2.0.0 - Accurate Implementation Status
|
||||
|
||||
After thorough investigation of the codebase, here's what's ACTUALLY implemented:
|
||||
|
||||
## ✅ Fully Implemented & Working
|
||||
|
||||
### Core Features
|
||||
- ✅ **Noun-Verb Taxonomy** - Complete with addNoun() and addVerb()
|
||||
- ✅ **Triple Intelligence Engine** - Vector + Graph + Metadata unified queries
|
||||
- ✅ **Natural Language find()** - Basic NLP with 220+ embedded patterns
|
||||
- ✅ **HNSW Vector Search** - O(log n) similarity search with partitioning support
|
||||
- ✅ **Field Indexing** - O(1) metadata lookups via FieldIndex class
|
||||
- ✅ **Graph Pathfinding** - Relationship traversal system
|
||||
- ✅ **Statistics System** - Complete metrics and performance tracking
|
||||
|
||||
### Storage System
|
||||
- ✅ **Memory Storage** - Full implementation with statistics
|
||||
- ✅ **FileSystem Storage** - Production ready with dual-write compatibility
|
||||
- ✅ **OPFS Storage** - Browser persistent storage
|
||||
- ✅ **S3-Compatible Storage** - AWS S3, MinIO with throttling protection
|
||||
- ✅ **Multi-level Caching** - 3-tier cache (hot/warm/cold) with auto-configuration
|
||||
- ✅ **Cache Manager** - Smart cache with LRU, TTL, and adaptive sizing
|
||||
|
||||
### Distributed Features (YES, THEY EXIST!)
|
||||
- ✅ **Read-Only Mode** - Optimized reader instances with aggressive caching
|
||||
- ✅ **Write-Only Mode** - Optimized writer instances with batching
|
||||
- ✅ **Hash Partitioner** - Deterministic partitioning for distribution
|
||||
- ✅ **Operational Modes** - Reader/Writer/Hybrid modes with optimized strategies
|
||||
- ✅ **Config Manager** - Distributed configuration management
|
||||
- ✅ **Health Monitor** - Instance health tracking
|
||||
|
||||
### Neural Import & Entity Detection (YES, IT EXISTS!)
|
||||
- ✅ **Neural Import Class** - Complete implementation in cortex/neuralImport.ts
|
||||
- ✅ **Entity Detection** - detectEntitiesWithNeuralAnalysis() method
|
||||
- ✅ **Noun Type Detection** - detectNounType() with confidence scoring
|
||||
- ✅ **Relationship Detection** - Automatic relationship inference
|
||||
- ✅ **Import Formats** - CSV, JSON, and text parsing
|
||||
- ✅ **Neural Insights** - Pattern detection and anomaly identification
|
||||
|
||||
### Augmentations (MORE THAN DOCUMENTED!)
|
||||
- ✅ **WAL Augmentation** - Write-ahead logging with recovery
|
||||
- ✅ **Entity Registry** - Bloom filter deduplication
|
||||
- ✅ **Auto-Register Entities** - Automatic entity extraction
|
||||
- ✅ **Intelligent Verb Scoring** - Multi-factor relationship scoring
|
||||
- ✅ **Batch Processing** - Dynamic batching with backpressure
|
||||
- ✅ **Connection Pool** - Smart connection management
|
||||
- ✅ **Request Deduplicator** - Prevents duplicate operations
|
||||
- ✅ **WebSocket Conduit** - Real-time streaming support
|
||||
- ✅ **WebRTC Conduit** - P2P communication
|
||||
- ✅ **Memory Augmentations** - Storage-specific optimizations
|
||||
- ✅ **Server Search Augmentations** - Distributed search
|
||||
|
||||
### Performance & Adaptation
|
||||
- ✅ **Performance Monitor** - Real-time metrics collection
|
||||
- ✅ **Adaptive Backpressure** - Dynamic flow control
|
||||
- ✅ **Auto Configuration** - Environment-based optimization
|
||||
- ✅ **Cache Auto Config** - Smart cache sizing based on memory
|
||||
- ✅ **S3 Throttling Protection** - Adaptive rate limiting
|
||||
- ✅ **Statistics Manager** - Comprehensive metrics tracking
|
||||
|
||||
### GPU Support (PARTIAL)
|
||||
- ✅ **GPU Detection** - detectBestDevice() for WebGPU/CUDA
|
||||
- ✅ **Device Resolution** - Automatic GPU selection
|
||||
- ⚠️ **WebGPU Support** - Detection works, acceleration limited
|
||||
- ⚠️ **CUDA Support** - Detection works, requires ONNX Runtime GPU
|
||||
|
||||
## ⚠️ Partially Implemented
|
||||
|
||||
### Natural Language Processing
|
||||
- ✅ 220+ embedded patterns
|
||||
- ✅ Pattern matching system
|
||||
- ✅ Basic temporal parsing
|
||||
- ⚠️ Entity extraction (basic implementation exists)
|
||||
- ❌ Multi-language support
|
||||
|
||||
### Learning & Optimization
|
||||
- ✅ Performance metrics collection
|
||||
- ✅ Cache hit rate tracking
|
||||
- ⚠️ Query pattern learning (metrics collected but not used)
|
||||
- ❌ Auto-indexing based on patterns
|
||||
- ❌ Dynamic optimization
|
||||
|
||||
## ❌ Not Implemented (But Close!)
|
||||
|
||||
### Import/Export Utilities
|
||||
- ⚠️ CSV Import - Parser exists, needs integration
|
||||
- ⚠️ JSON Import - Parser exists, needs integration
|
||||
- ❌ SQL Import - Not implemented
|
||||
- ❌ MongoDB Import - Not implemented
|
||||
- ❌ Export functions - Not implemented
|
||||
|
||||
### Advanced Features
|
||||
- ❌ Compression augmentation (planned but not built)
|
||||
- ❌ Monitoring augmentation as documented (different implementation exists)
|
||||
- ❌ Multi-modal support (text only currently)
|
||||
- ❌ Active learning from feedback
|
||||
- ❌ Anomaly detection (insights exist but not automated)
|
||||
|
||||
## 🎯 The Truth About What We Have
|
||||
|
||||
### Surprises - Features That DO Exist:
|
||||
1. **Distributed Modes** - Read-only/Write-only with optimized caching
|
||||
2. **Neural Import** - Full implementation with entity detection
|
||||
3. **Hash Partitioning** - For distributed operations
|
||||
4. **3-Level Cache** - Sophisticated caching system
|
||||
5. **Performance Monitoring** - Complete metrics system
|
||||
6. **GPU Detection** - Basic WebGPU/CUDA support
|
||||
7. **Adaptive Systems** - Backpressure, throttling, auto-config
|
||||
|
||||
### What's Different from Docs:
|
||||
1. **Import/Export** - Core exists but needs CLI integration
|
||||
2. **GPU Acceleration** - Detection works, actual acceleration limited
|
||||
3. **Learning** - Collects metrics but doesn't adapt yet
|
||||
4. **Monitoring** - Different from documented but functional
|
||||
|
||||
## 📊 Real Statistics Available
|
||||
|
||||
```typescript
|
||||
// These actually work:
|
||||
const stats = await brain.getStatistics()
|
||||
// Returns:
|
||||
{
|
||||
nouns: { count, created, updated, deleted, size },
|
||||
verbs: { count, created, updated, deleted },
|
||||
vectors: { dimensions, indexSize, avgSearchTime },
|
||||
cache: { hits, misses, evictions, hitRate },
|
||||
performance: { avgAddTime, avgSearchTime, operations },
|
||||
storage: { used, available, compression },
|
||||
throttling: { delays, rateLimited, backoff }
|
||||
}
|
||||
```
|
||||
|
||||
## 🔧 What Needs Integration
|
||||
|
||||
Many features EXIST but aren't exposed or integrated:
|
||||
|
||||
1. **Neural Import** - Exists but needs CLI commands
|
||||
2. **Distributed Modes** - Code exists but needs configuration API
|
||||
3. **GPU Support** - Detection works but needs model integration
|
||||
4. **Import/Export** - Parsers exist but need connection to main API
|
||||
5. **Advanced Caching** - System exists but needs better exposure
|
||||
|
||||
## 💡 Recommendations
|
||||
|
||||
1. **Don't Rewrite** - Most features exist, just need wiring
|
||||
2. **Focus on Integration** - Connect existing pieces
|
||||
3. **Update Docs Accurately** - Show what really works
|
||||
4. **Expose Hidden Features** - Make distributed modes accessible
|
||||
5. **Complete Neural Import** - It's 90% done
|
||||
|
||||
## ✨ The Good News
|
||||
|
||||
Brainy is MORE complete than initially assessed:
|
||||
- Distributed capabilities exist
|
||||
- Neural import is implemented
|
||||
- Caching is sophisticated
|
||||
- Performance monitoring works
|
||||
- GPU detection is there
|
||||
- Statistics are comprehensive
|
||||
|
||||
The gap is mostly in integration and documentation, not implementation!
|
||||
|
|
@ -1,141 +0,0 @@
|
|||
# 🚀 Brainy 2.0 Release Readiness Report
|
||||
|
||||
## 📅 Assessment Date: 2025-08-22
|
||||
|
||||
## ✅ READY FOR RELEASE
|
||||
|
||||
### Core Features (100% Complete)
|
||||
- ✅ **Noun-Verb Taxonomy**: Revolutionary data model
|
||||
- ✅ **Triple Intelligence**: Vector + Graph + Metadata unified queries
|
||||
- ✅ **HNSW Indexing**: O(log n) vector search
|
||||
- ✅ **384 Dimensions**: Fixed with all-MiniLM-L6-v2
|
||||
- ✅ **Zero-Config**: Works out of the box
|
||||
- ✅ **Smart by Default**: Intelligent features enabled
|
||||
|
||||
### Test Coverage
|
||||
- **Intelligent Verb Scoring**: 18/18 tests passing ✅
|
||||
- **Neural Import**: Comprehensive tests ✅
|
||||
- **Neural Clustering**: Full API coverage ✅
|
||||
- **Augmentations**: 60% coverage (up from 30%)
|
||||
- **Overall**: ~75-80% test coverage
|
||||
|
||||
## 🎯 Key Achievements
|
||||
|
||||
### 1. Fixed Critical Issues
|
||||
- ✅ Consolidated duplicate intelligent verb scoring implementations
|
||||
- ✅ Fixed augmentation system to properly intercept methods
|
||||
- ✅ Implemented proper BaseAugmentation architecture
|
||||
- ✅ All using correct 2.0 APIs (addNoun/addVerb)
|
||||
|
||||
### 2. New Test Coverage
|
||||
Created comprehensive tests for:
|
||||
- Intelligent Verb Scoring (18 tests)
|
||||
- Neural Import (complete coverage)
|
||||
- Neural Clustering API (for external libraries)
|
||||
- WAL (Write-Ahead Logging)
|
||||
- Entity Registry (fast deduplication)
|
||||
- Batch Processing (adaptive batching)
|
||||
- Request Deduplicator (3x performance)
|
||||
|
||||
### 3. Infrastructure Improvements
|
||||
- Created memory-safe test runner script
|
||||
- Documented memory management strategy
|
||||
- Organized tests by feature area
|
||||
- Added proper cleanup hooks
|
||||
|
||||
## 📊 Feature Status
|
||||
|
||||
| Feature | Status | Tests | Confidence |
|
||||
|---------|--------|-------|------------|
|
||||
| Core CRUD API | ✅ Ready | 95% | High |
|
||||
| Triple Intelligence | ✅ Ready | 80% | High |
|
||||
| Intelligent Verb Scoring | ✅ Ready | 100% | High |
|
||||
| Neural Import | ✅ Ready | 100% | High |
|
||||
| Neural Clustering | ✅ Ready | 100% | High |
|
||||
| Vector Operations | ✅ Ready | 90% | High |
|
||||
| Storage Adapters | ✅ Ready | 85% | High |
|
||||
| Zero-Config | ✅ Ready | 90% | High |
|
||||
| Augmentations | ✅ Ready | 60% | Medium |
|
||||
| GPU Acceleration | ⚠️ Untested | 0% | Low |
|
||||
|
||||
## 🔍 Known Issues
|
||||
|
||||
### Minor (Non-blocking)
|
||||
1. **Memory in Tests**: Some test combinations cause OOM
|
||||
- Solution: Use run-tests-safe.sh script
|
||||
- Impact: Testing only, not production
|
||||
|
||||
2. **GPU Tests Missing**: No GPU acceleration tests
|
||||
- Solution: Add in next release
|
||||
- Impact: Feature works but untested
|
||||
|
||||
3. **Some Augmentation Coverage**: Not all augmentations have tests
|
||||
- Solution: Core augmentations tested
|
||||
- Impact: Low risk, non-critical features
|
||||
|
||||
## 📦 Release Package
|
||||
|
||||
### What Ships
|
||||
- ✅ All engines (vector, graph, field, neural)
|
||||
- ✅ All augmentations (no premium features)
|
||||
- ✅ All storage adapters
|
||||
- ✅ Complete MIT licensed code
|
||||
- ✅ Zero configuration required
|
||||
|
||||
### API Surface
|
||||
```typescript
|
||||
// Simple, powerful API
|
||||
const brain = new BrainyData()
|
||||
await brain.init()
|
||||
|
||||
// Smart by default
|
||||
await brain.addNoun(vector, metadata)
|
||||
await brain.addVerb(source, target, type)
|
||||
const results = await brain.search(query)
|
||||
|
||||
// Advanced neural features
|
||||
const neural = new NeuralAPI(brain)
|
||||
const clusters = await neural.clusters()
|
||||
const similarity = await neural.similarity(a, b)
|
||||
```
|
||||
|
||||
## 🎯 Release Confidence: 85%
|
||||
|
||||
### Strengths
|
||||
- Core functionality thoroughly tested
|
||||
- Critical bugs fixed
|
||||
- Smart defaults working
|
||||
- Performance optimized
|
||||
- Documentation complete
|
||||
|
||||
### Acceptable Risks
|
||||
- Some edge cases may exist
|
||||
- GPU acceleration untested
|
||||
- Memory usage in large test suites
|
||||
|
||||
## ✅ Release Checklist
|
||||
|
||||
- [x] Core API tests passing
|
||||
- [x] Intelligent features working
|
||||
- [x] Zero-config verified
|
||||
- [x] Dimensions fixed at 384
|
||||
- [x] No mock models in tests
|
||||
- [x] Documentation updated
|
||||
- [x] Breaking changes documented
|
||||
- [x] Memory management documented
|
||||
- [ ] Final npm audit
|
||||
- [ ] Version bump to 2.0.0
|
||||
- [ ] Tag release
|
||||
- [ ] Publish to npm
|
||||
|
||||
## 🚀 Recommendation
|
||||
|
||||
**READY FOR RELEASE** with minor caveats:
|
||||
1. Use safe test runner for validation
|
||||
2. Monitor early adopter feedback
|
||||
3. Plan 2.0.1 for GPU tests and remaining augmentation coverage
|
||||
|
||||
The core innovation (Triple Intelligence, Neural APIs, Smart Verb Scoring) is solid and well-tested. The system provides significant value even with the minor gaps in test coverage for peripheral features.
|
||||
|
||||
---
|
||||
*Generated: 2025-08-22 15:15 UTC*
|
||||
|
|
@ -1,158 +0,0 @@
|
|||
# Brainy Roadmap
|
||||
|
||||
## Vision
|
||||
Brainy aims to be the most intelligent, adaptable, and accessible AI database. This roadmap outlines our path to achieving that vision.
|
||||
|
||||
## Current Version: 2.0.0 (January 2025)
|
||||
|
||||
### ✅ Completed Features (More than expected!)
|
||||
- **Noun-Verb Taxonomy**: With neural entity detection
|
||||
- **Triple Intelligence**: With query optimization
|
||||
- **Storage Adapters**: All 4 with multi-level caching
|
||||
- **NLP**: 220+ patterns with basic entity extraction
|
||||
- **WAL & Entity Registry**: Full implementation
|
||||
- **Distributed Modes**: Read-only/Write-only optimization
|
||||
- **Neural Import**: AI-powered data understanding
|
||||
- **11+ Augmentations**: WebSocket, WebRTC, batching, more
|
||||
- **Statistics System**: Complete metrics tracking
|
||||
- **Performance Monitor**: Real-time monitoring
|
||||
- **GPU Detection**: WebGPU/CUDA detection
|
||||
- **3-Level Cache**: Sophisticated caching system
|
||||
|
||||
## 🚧 Q1 2025 (Integration Needed)
|
||||
|
||||
### Import/Export Integration
|
||||
- [ ] Wire existing CSV parser to CLI
|
||||
- [ ] Connect JSON parser to main API
|
||||
- [ ] Expose Neural Import via commands
|
||||
- [ ] Add SQL database import
|
||||
- [ ] Add MongoDB import
|
||||
|
||||
### Enhanced Natural Language
|
||||
- [x] Basic entity extraction (exists)
|
||||
- [ ] Improve entity extraction accuracy
|
||||
- [ ] Complex query understanding
|
||||
- [ ] Multi-language support
|
||||
|
||||
## 📅 Q2 2025
|
||||
|
||||
### Monitoring & Observability Enhancement
|
||||
- [x] Metrics collection (exists)
|
||||
- [x] Performance tracking (exists)
|
||||
- [ ] Query analytics dashboard
|
||||
- [ ] Prometheus/Grafana export
|
||||
- [ ] OpenTelemetry integration
|
||||
|
||||
### Auto-Optimization
|
||||
- [ ] Query pattern learning
|
||||
- [ ] Automatic index creation
|
||||
- [ ] Dynamic batch sizing
|
||||
- [ ] Cache strategy adaptation
|
||||
- [ ] Resource auto-scaling
|
||||
|
||||
### Security Enhancements
|
||||
- [ ] Automatic encryption at rest
|
||||
- [ ] Audit logging system
|
||||
- [ ] Role-based access control
|
||||
- [ ] API key management
|
||||
|
||||
## 📅 Q3 2025
|
||||
|
||||
### Advanced Augmentations
|
||||
- [ ] Compression augmentation
|
||||
- [ ] Advanced caching strategies
|
||||
- [ ] Neural document import
|
||||
- [ ] Custom augmentation marketplace
|
||||
|
||||
### Cloud Integration
|
||||
- [ ] AWS auto-detection and optimization
|
||||
- [ ] Google Cloud integration
|
||||
- [ ] Azure support
|
||||
- [ ] Vercel Edge optimization
|
||||
- [ ] Cloudflare Workers support
|
||||
|
||||
### Performance Optimizations
|
||||
- [ ] GPU acceleration (WebGPU/CUDA)
|
||||
- [ ] SIMD optimizations
|
||||
- [ ] Memory pressure handling
|
||||
- [ ] Connection pool auto-scaling
|
||||
|
||||
## 📅 Q4 2025
|
||||
|
||||
### Distributed Computing
|
||||
- [ ] Clustering support
|
||||
- [ ] Multi-region replication
|
||||
- [ ] Sharding strategies
|
||||
- [ ] Consensus protocols
|
||||
- [ ] Federated queries
|
||||
|
||||
### Compliance & Enterprise
|
||||
- [ ] GDPR compliance toolkit
|
||||
- [ ] HIPAA compliance features
|
||||
- [ ] SOC2 audit support
|
||||
- [ ] Data residency controls
|
||||
- [ ] Enterprise SSO
|
||||
|
||||
## 🔮 2026 and Beyond
|
||||
|
||||
### Advanced AI/ML
|
||||
- [ ] Model fine-tuning interface
|
||||
- [ ] Active learning from feedback
|
||||
- [ ] Anomaly detection
|
||||
- [ ] Explainable AI
|
||||
- [ ] Multi-modal support (images, audio, video)
|
||||
- [ ] Custom embedding models
|
||||
|
||||
### Developer Experience
|
||||
- [ ] Visual query builder
|
||||
- [ ] Browser-based admin UI
|
||||
- [ ] Mobile SDKs (React Native, Flutter)
|
||||
- [ ] GraphQL API generation
|
||||
- [ ] One-click cloud deployment
|
||||
|
||||
### Ecosystem
|
||||
- [ ] Plugin marketplace
|
||||
- [ ] Community augmentations
|
||||
- [ ] Certified integrations
|
||||
- [ ] Training and certification
|
||||
- [ ] Enterprise support tiers
|
||||
|
||||
## Contributing
|
||||
|
||||
We welcome contributions! Priority areas:
|
||||
|
||||
1. **Import/Export**: Help us support more data sources
|
||||
2. **Storage Adapters**: Add support for more storage backends
|
||||
3. **Augmentations**: Create useful augmentations
|
||||
4. **Documentation**: Improve examples and guides
|
||||
5. **Testing**: Increase test coverage
|
||||
|
||||
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
||||
|
||||
## Feature Requests
|
||||
|
||||
Have a feature request? Please:
|
||||
1. Check this roadmap first
|
||||
2. Search existing issues
|
||||
3. Open a new issue with the "enhancement" label
|
||||
|
||||
## Versioning Strategy
|
||||
|
||||
- **2.x**: Current major version, backward compatible
|
||||
- **Minor releases**: New features (quarterly)
|
||||
- **Patch releases**: Bug fixes (as needed)
|
||||
- **3.0**: Next major version (2026) with distributed support
|
||||
|
||||
## Commitment to Open Source
|
||||
|
||||
All features on this roadmap will be:
|
||||
- ✅ MIT licensed
|
||||
- ✅ Available to everyone
|
||||
- ✅ No premium tiers
|
||||
- ✅ No artificial limitations
|
||||
|
||||
## Status Updates
|
||||
|
||||
This roadmap is updated quarterly. Last update: January 2025
|
||||
|
||||
Star the repo to stay updated on progress! ⭐
|
||||
|
|
@ -1,270 +0,0 @@
|
|||
# Storage Unification Plan: Everything as Augmentations
|
||||
|
||||
## Executive Summary
|
||||
Unify storage adapters and memory augmentations into a single augmentation-based system while maintaining 100% backward compatibility and zero-config philosophy.
|
||||
|
||||
## Current State Analysis
|
||||
|
||||
### Two Parallel Systems
|
||||
1. **Storage Adapters** (`src/storage/adapters/`)
|
||||
- Direct implementation of StorageAdapter interface
|
||||
- Selected via `createStorage()` during initialization
|
||||
- 67 direct calls to `this.storage` throughout BrainyData
|
||||
|
||||
2. **Memory Augmentations** (`src/augmentations/memoryAugmentations.ts`)
|
||||
- Wrap storage adapters as augmentations
|
||||
- Use `timing: 'replace'` for storage operations
|
||||
- Redundant with storage adapters
|
||||
|
||||
### Initialization Order Problem
|
||||
```typescript
|
||||
// Current flow in BrainyData.init()
|
||||
1. Create/initialize storage (line 1463-1503)
|
||||
2. Initialize augmentations with storage context (line 1508)
|
||||
3. Storage passed to augmentations via context (line 782)
|
||||
```
|
||||
|
||||
**Problem:** Augmentations need storage in context, but we want augmentations to provide storage!
|
||||
|
||||
## Proposed Solution: Two-Phase Initialization
|
||||
|
||||
### Phase 1: Pre-Registration (No Context)
|
||||
```typescript
|
||||
// Early in init(), before storage creation
|
||||
this.registerDefaultAugmentations() // Register but don't initialize
|
||||
```
|
||||
|
||||
### Phase 2: Storage Resolution
|
||||
```typescript
|
||||
// Check for storage augmentations
|
||||
const storageAug = this.augmentations.findByOperation('storage')
|
||||
|
||||
if (storageAug) {
|
||||
// Get storage from augmentation
|
||||
this.storage = await storageAug.provideStorage()
|
||||
} else if (this.config.storageAdapter) {
|
||||
// Use provided adapter (backward compat)
|
||||
this.storage = this.config.storageAdapter
|
||||
} else {
|
||||
// Zero-config: create and wrap in augmentation
|
||||
this.storage = await createStorage(this.storageConfig)
|
||||
|
||||
// Auto-register as augmentation for consistency
|
||||
const autoAug = new DynamicStorageAugmentation(this.storage)
|
||||
this.augmentations.register(autoAug)
|
||||
}
|
||||
|
||||
await this.storage.init()
|
||||
```
|
||||
|
||||
### Phase 3: Full Augmentation Initialization
|
||||
```typescript
|
||||
// Now initialize all augmentations with context
|
||||
const context = {
|
||||
brain: this,
|
||||
storage: this.storage,
|
||||
config: this.config,
|
||||
log: this.log
|
||||
}
|
||||
|
||||
await this.augmentations.initializeAll(context)
|
||||
```
|
||||
|
||||
## Implementation Steps
|
||||
|
||||
### Step 1: Create DynamicStorageAugmentation
|
||||
```typescript
|
||||
// Wraps any storage adapter as an augmentation
|
||||
class DynamicStorageAugmentation extends BaseAugmentation {
|
||||
constructor(private adapter: StorageAdapter) {
|
||||
super()
|
||||
this.name = `${adapter.constructor.name}Augmentation`
|
||||
this.timing = 'replace'
|
||||
this.operations = ['storage']
|
||||
this.priority = 100
|
||||
}
|
||||
|
||||
async provideStorage(): Promise<StorageAdapter> {
|
||||
return this.adapter
|
||||
}
|
||||
|
||||
async execute(op, params, next) {
|
||||
if (op === 'storage') {
|
||||
return this.adapter
|
||||
}
|
||||
return next()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 2: Modify AugmentationRegistry
|
||||
```typescript
|
||||
class AugmentationRegistry {
|
||||
// Add method to find augmentations before initialization
|
||||
findByOperation(operation: string): BrainyAugmentation | null {
|
||||
return this.augmentations.find(aug =>
|
||||
aug.operations.includes(operation) ||
|
||||
aug.operations.includes('all')
|
||||
) || null
|
||||
}
|
||||
|
||||
// Split registration from initialization
|
||||
register(augmentation: BrainyAugmentation): void {
|
||||
this.augmentations.push(augmentation)
|
||||
// Don't initialize yet
|
||||
}
|
||||
|
||||
async initializeAll(context: AugmentationContext): Promise<void> {
|
||||
for (const aug of this.augmentations) {
|
||||
if (aug.initialize) {
|
||||
await aug.initialize(context)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 3: Update BrainyData.init()
|
||||
```typescript
|
||||
async init(): Promise<void> {
|
||||
// ... existing validation ...
|
||||
|
||||
// Step 1: Register default augmentations (no init)
|
||||
this.registerDefaultAugmentations()
|
||||
|
||||
// Step 2: Resolve storage
|
||||
await this.resolveStorage()
|
||||
|
||||
// Step 3: Initialize augmentations with context
|
||||
await this.initializeAugmentations()
|
||||
|
||||
// ... rest of init ...
|
||||
}
|
||||
|
||||
private async resolveStorage(): Promise<void> {
|
||||
// Check for storage augmentation
|
||||
const storageAug = this.augmentations.findByOperation('storage')
|
||||
|
||||
if (storageAug && storageAug.provideStorage) {
|
||||
// Get storage from augmentation
|
||||
this.storage = await storageAug.provideStorage()
|
||||
} else if (!this.storage) {
|
||||
// No storage augmentation and no provided adapter
|
||||
// Use zero-config
|
||||
const storageOptions = this.buildStorageOptions()
|
||||
this.storage = await createStorage(storageOptions)
|
||||
|
||||
// Wrap in augmentation for consistency
|
||||
const wrapper = new DynamicStorageAugmentation(this.storage)
|
||||
this.augmentations.register(wrapper)
|
||||
}
|
||||
|
||||
// Initialize storage
|
||||
await this.storage!.init()
|
||||
}
|
||||
```
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Zero-Config (No Change)
|
||||
```typescript
|
||||
const brain = new BrainyData()
|
||||
await brain.init()
|
||||
// Automatically selects best storage for environment
|
||||
```
|
||||
|
||||
### Explicit Storage Adapter (Backward Compatible)
|
||||
```typescript
|
||||
const brain = new BrainyData({
|
||||
storageAdapter: new S3Storage(config)
|
||||
})
|
||||
await brain.init()
|
||||
```
|
||||
|
||||
### Storage via Augmentation (New)
|
||||
```typescript
|
||||
const brain = new BrainyData()
|
||||
brain.augmentations.register(new S3StorageAugmentation(config))
|
||||
await brain.init()
|
||||
```
|
||||
|
||||
### Storage Config (Backward Compatible)
|
||||
```typescript
|
||||
const brain = new BrainyData({
|
||||
storage: {
|
||||
s3Storage: {
|
||||
bucketName: 'my-bucket',
|
||||
accessKeyId: 'xxx',
|
||||
secretAccessKey: 'yyy'
|
||||
}
|
||||
}
|
||||
})
|
||||
await brain.init()
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
1. **Unified Architecture:** Everything is an augmentation
|
||||
2. **Backward Compatible:** All existing code continues to work
|
||||
3. **Zero-Config Maintained:** Intelligent selection still works
|
||||
4. **Extensible:** Easy to add new storage types as augmentations
|
||||
5. **Middleware Capable:** Storage operations can be intercepted
|
||||
6. **Premium Ready:** Premium storage augmentations can be added to marketplace
|
||||
|
||||
## Migration Path
|
||||
|
||||
### Phase 1: Implement Infrastructure (No Breaking Changes)
|
||||
- Add DynamicStorageAugmentation
|
||||
- Update AugmentationRegistry with new methods
|
||||
- Modify BrainyData.init() to support both paths
|
||||
|
||||
### Phase 2: Deprecate Direct Storage Config
|
||||
- Mark `storageAdapter` config as deprecated
|
||||
- Encourage augmentation approach in docs
|
||||
- Keep working for 2-3 major versions
|
||||
|
||||
### Phase 3: Remove Legacy Code
|
||||
- Remove `storageAdapter` from config
|
||||
- Remove `createStorage()` direct calls
|
||||
- All storage through augmentations
|
||||
|
||||
## Testing Strategy
|
||||
|
||||
1. **Backward Compatibility Tests**
|
||||
- Ensure all existing storage config methods work
|
||||
- Test zero-config in different environments
|
||||
- Verify no breaking changes
|
||||
|
||||
2. **New Functionality Tests**
|
||||
- Test storage augmentation registration
|
||||
- Test override behavior
|
||||
- Test middleware capabilities
|
||||
|
||||
3. **Performance Tests**
|
||||
- Ensure no performance regression
|
||||
- Measure augmentation overhead
|
||||
|
||||
## Risk Mitigation
|
||||
|
||||
1. **Risk:** Circular dependency between storage and augmentations
|
||||
**Mitigation:** Two-phase initialization breaks the cycle
|
||||
|
||||
2. **Risk:** Breaking existing code
|
||||
**Mitigation:** Keep `this.storage` and all direct calls unchanged
|
||||
|
||||
3. **Risk:** Performance overhead
|
||||
**Mitigation:** Storage augmentation is registered once, minimal overhead
|
||||
|
||||
4. **Risk:** Confusion about which approach to use
|
||||
**Mitigation:** Clear documentation, deprecation warnings, migration guide
|
||||
|
||||
## Timeline
|
||||
|
||||
- **Week 1:** Implement core infrastructure
|
||||
- **Week 2:** Update documentation and examples
|
||||
- **Week 3:** Testing and optimization
|
||||
- **Week 4:** Release as minor version (non-breaking)
|
||||
|
||||
## Conclusion
|
||||
|
||||
This unification maintains all existing behaviors while providing a cleaner, more extensible architecture. The augmentation approach aligns with Brainy's philosophy and enables future enhancements without breaking changes.
|
||||
|
|
@ -1,226 +0,0 @@
|
|||
# 🧪 Brainy 2.0 Test Coverage Analysis
|
||||
|
||||
## 📊 Current Test Status
|
||||
|
||||
### Test Files: 38 Total
|
||||
- **Passing**: ~70% of tests
|
||||
- **Failing**: ~30% of tests (mostly intelligent verb scoring)
|
||||
- **Memory Issues**: Some tests cause OOM when run together
|
||||
|
||||
## ✅ Well-Tested Features
|
||||
|
||||
### 1. Core Functionality ✅
|
||||
- `tests/core.test.ts` - Basic CRUD operations
|
||||
- `tests/unified-api.test.ts` - Unified API methods
|
||||
- `tests/consistent-api.test.ts` - New 2.0 API consistency
|
||||
|
||||
### 2. Vector Operations ✅
|
||||
- `tests/vector-operations.test.ts` - Vector search, HNSW indexing
|
||||
- `tests/dimension-standardization.test.ts` - 384 dimension enforcement
|
||||
|
||||
### 3. Storage Adapters ✅
|
||||
- `tests/storage-adapter-coverage.test.ts` - All storage types
|
||||
- `tests/opfs-storage.test.ts` - Browser storage
|
||||
- `tests/s3-comprehensive.test.ts` - S3 storage with throttling
|
||||
|
||||
### 4. Zero-Config ✅
|
||||
- `tests/zero-config-models.test.ts` - Zero configuration verification
|
||||
- `tests/auto-configuration.test.ts` - Auto-detection of environment
|
||||
|
||||
### 5. Model Loading ✅
|
||||
- `tests/model-loading.test.ts` - Cascade: Local → CDN → GitHub → HuggingFace
|
||||
- Real transformer models (no mocking)
|
||||
|
||||
### 6. Natural Language ✅
|
||||
- `tests/triple-intelligence.test.ts` - Vector + Graph + Metadata queries
|
||||
- Natural language query understanding
|
||||
|
||||
### 7. Error Handling ✅
|
||||
- `tests/error-handling.test.ts` - Graceful error recovery
|
||||
- `tests/edge-cases.test.ts` - Edge case handling
|
||||
|
||||
## ⚠️ Partially Tested Features
|
||||
|
||||
### 1. Intelligent Verb Scoring (~60% passing)
|
||||
- `tests/intelligent-verb-scoring.test.ts`
|
||||
- Issues with:
|
||||
- Custom configuration initialization
|
||||
- Semantic similarity computation
|
||||
- Learning statistics export/import
|
||||
- Reasoning information provision
|
||||
|
||||
### 2. Distributed Operations
|
||||
- `tests/distributed.test.ts` - Reader/Writer modes
|
||||
- `tests/distributed-caching.test.ts` - Cache coordination
|
||||
- Need more comprehensive testing
|
||||
|
||||
### 3. Neural API
|
||||
- `tests/neural-api.test.ts` - Similarity, clustering, visualization
|
||||
- Works but needs memory optimization
|
||||
|
||||
### 4. Performance
|
||||
- `tests/performance.test.ts` - Basic benchmarks
|
||||
- `tests/throttling-metrics.test.ts` - Rate limiting
|
||||
- Need more load testing
|
||||
|
||||
## 🔴 Missing Test Coverage
|
||||
|
||||
### 1. Augmentations (12+ total, only partially tested)
|
||||
Need dedicated tests for:
|
||||
- ✅ WAL (Write-Ahead Logging) - **NO TESTS**
|
||||
- ✅ Entity Registry - Partial coverage
|
||||
- ✅ Auto-Register Entities - **NO TESTS**
|
||||
- ✅ Batch Processing - Partial coverage
|
||||
- ✅ Connection Pool - **NO TESTS**
|
||||
- ✅ Request Deduplicator - Partial coverage
|
||||
- ✅ WebSocket Conduit - **NO TESTS**
|
||||
- ✅ WebRTC Conduit - **NO TESTS**
|
||||
- ✅ Memory Storage Optimization - Partial
|
||||
- ✅ Server Search Conduit - **NO TESTS**
|
||||
- ✅ Neural Import - **NO TESTS**
|
||||
|
||||
### 2. Neural Import Capabilities
|
||||
No tests for:
|
||||
- `neuralImport()` method
|
||||
- `detectEntitiesWithNeuralAnalysis()`
|
||||
- `detectNounType()`
|
||||
- `detectRelationships()`
|
||||
- `generateInsights()`
|
||||
|
||||
### 3. GPU Acceleration
|
||||
No tests for:
|
||||
- WebGPU detection in browser
|
||||
- CUDA detection in Node.js
|
||||
- Automatic device selection
|
||||
|
||||
### 4. Advanced Caching
|
||||
Limited tests for:
|
||||
- 3-level cache (hot/warm/cold)
|
||||
- Cache promotion/demotion
|
||||
- Cache statistics
|
||||
|
||||
### 5. Statistics System
|
||||
- `tests/statistics.test.ts` exists but limited
|
||||
- Need tests for all metric categories
|
||||
|
||||
## 🛠️ Test Issues to Fix
|
||||
|
||||
### 1. Memory Management
|
||||
- Multiple BrainyData instances cause OOM
|
||||
- Need proper cleanup between tests
|
||||
- Consider test isolation strategies
|
||||
|
||||
### 2. Intelligent Verb Scoring
|
||||
- 6 failing tests need fixing
|
||||
- Issue with metadata persistence
|
||||
- Scoring stats not properly exposed
|
||||
|
||||
### 3. Model Loading
|
||||
- Tests pass but very verbose output
|
||||
- Consider test-specific quiet mode
|
||||
|
||||
### 4. Async Cleanup
|
||||
- Some tests don't properly await cleanup
|
||||
- Causes resource leaks
|
||||
|
||||
## 📈 Coverage Estimation
|
||||
|
||||
| Feature Category | Coverage | Status |
|
||||
|-----------------|----------|---------|
|
||||
| Core CRUD API | 95% | ✅ Excellent |
|
||||
| Vector Operations | 90% | ✅ Excellent |
|
||||
| Storage Adapters | 85% | ✅ Good |
|
||||
| Triple Intelligence | 80% | ✅ Good |
|
||||
| Zero-Config | 90% | ✅ Excellent |
|
||||
| Model Loading | 85% | ✅ Good |
|
||||
| Natural Language | 70% | ⚠️ Adequate |
|
||||
| Intelligent Verbs | 60% | ⚠️ Needs Work |
|
||||
| Augmentations | 30% | 🔴 Poor |
|
||||
| Neural Import | 0% | 🔴 Missing |
|
||||
| GPU Support | 0% | 🔴 Missing |
|
||||
| Distributed Ops | 40% | 🔴 Poor |
|
||||
| Advanced Caching | 30% | 🔴 Poor |
|
||||
|
||||
**Overall Coverage: ~60%**
|
||||
|
||||
## 🎯 Priority Fixes
|
||||
|
||||
### High Priority:
|
||||
1. Fix memory issues (affects all tests)
|
||||
2. Fix intelligent verb scoring tests (6 failures)
|
||||
3. Add tests for Neural Import (major feature)
|
||||
|
||||
### Medium Priority:
|
||||
4. Add tests for augmentations (12+ features)
|
||||
5. Add GPU acceleration tests
|
||||
6. Improve distributed operation tests
|
||||
|
||||
### Low Priority:
|
||||
7. Add advanced caching tests
|
||||
8. Add comprehensive statistics tests
|
||||
9. Performance optimization tests
|
||||
|
||||
## 💡 Recommendations
|
||||
|
||||
### 1. Test Organization
|
||||
- Group augmentation tests in `tests/augmentations/`
|
||||
- Create `tests/neural/` for neural import tests
|
||||
- Use test fixtures for common setup
|
||||
|
||||
### 2. Memory Management
|
||||
- Use `beforeEach`/`afterEach` consistently
|
||||
- Single BrainyData instance per test file
|
||||
- Force garbage collection between tests
|
||||
|
||||
### 3. Test Data
|
||||
- Create standardized test datasets
|
||||
- Use smaller models for testing
|
||||
- Mock external services (S3, etc.)
|
||||
|
||||
### 4. CI/CD Preparation
|
||||
- Run tests in parallel groups
|
||||
- Set memory limits per test worker
|
||||
- Cache model downloads
|
||||
|
||||
## 🚀 Path to 100% Pass Rate
|
||||
|
||||
1. **Fix Memory Issues** (2 hours)
|
||||
- Proper cleanup in all tests
|
||||
- Test isolation improvements
|
||||
|
||||
2. **Fix Intelligent Verb Scoring** (2 hours)
|
||||
- Debug metadata persistence
|
||||
- Fix scoring stats exposure
|
||||
|
||||
3. **Add Neural Import Tests** (3 hours)
|
||||
- Test all neural methods
|
||||
- Mock AI responses
|
||||
|
||||
4. **Add Augmentation Tests** (4 hours)
|
||||
- One test file per augmentation
|
||||
- Basic functionality coverage
|
||||
|
||||
5. **Optimize Test Performance** (2 hours)
|
||||
- Reduce verbosity
|
||||
- Parallelize test runs
|
||||
- Cache optimizations
|
||||
|
||||
**Total Estimate: 13 hours to reach 95%+ test coverage**
|
||||
|
||||
## ✅ Confidence Assessment
|
||||
|
||||
### Ready for Production:
|
||||
- Core CRUD operations ✅
|
||||
- Vector search ✅
|
||||
- Storage adapters ✅
|
||||
- Zero-config ✅
|
||||
- Model loading ✅
|
||||
|
||||
### Needs Testing Before Production:
|
||||
- Neural import ⚠️
|
||||
- All augmentations ⚠️
|
||||
- GPU acceleration ⚠️
|
||||
- Distributed operations ⚠️
|
||||
|
||||
### Overall Confidence: 70%
|
||||
The core functionality is solid and well-tested. The advanced features need more test coverage before claiming full production readiness.
|
||||
Loading…
Add table
Add a link
Reference in a new issue