| # ruvector |
|
|
| [](https://www.npmjs.com/package/ruvector) |
| [](https://opensource.org/licenses/MIT) |
| [](https://nodejs.org) |
| [](https://www.npmjs.com/package/ruvector) |
| [](https://github.com/ruvnet/ruvector) |
| [](https://github.com/ruvnet/ruvector) |
| [](https://github.com/ruvnet/ruvector) |
|
|
| **The fastest vector database for Node.jsβbuilt in Rust, runs everywhere** |
|
|
| Ruvector is a next-generation vector database that brings **enterprise-grade semantic search** to Node.js applications. Unlike cloud-only solutions or Python-first databases, Ruvector is designed specifically for JavaScript/TypeScript developers who need **blazing-fast vector similarity search** without the complexity of external services. |
|
|
| > π **Sub-millisecond queries** β’ π― **52,000+ inserts/sec** β’ πΎ **~50 bytes per vector** β’ π **Runs anywhere** |
|
|
| Built by [rUv](https://ruv.io) with production-grade Rust performance and intelligent platform detectionβ**automatically uses native bindings when available, falls back to WebAssembly when needed**. |
|
|
| π **[Visit ruv.io](https://ruv.io)** | π¦ **[GitHub](https://github.com/ruvnet/ruvector)** | π **[Documentation](https://github.com/ruvnet/ruvector/tree/main/docs)** |
|
|
| --- |
|
|
| ## π§ Claude Code Intelligence v2.0 |
|
|
| **Self-learning intelligence for Claude Code** β RuVector provides optimized hooks with ONNX embeddings, AST analysis, and coverage-aware routing. |
|
|
| ```bash |
| # One-command setup with pretrain and agent generation |
| npx ruvector hooks init --pretrain --build-agents quality |
| ``` |
|
|
| ### Core Features |
| - π― **Smart Agent Routing** β Q-learning optimized suggestions with 80%+ accuracy |
| - π **9-Phase Pretrain** β AST, diff, coverage, neural, and graph analysis |
| - π€ **Agent Builder** β Generates optimized `.claude/agents/` configs |
| - π **Co-edit Patterns** β Learns file relationships from git history |
| - πΎ **Vector Memory** β HNSW-indexed semantic recall (150x faster) |
|
|
| ### New in v2.0 |
| - β‘ **ONNX WASM Embeddings** β all-MiniLM-L6-v2 (384d) runs locally, no API needed |
| - π³ **AST Analysis** β Symbol extraction, complexity metrics, import graphs |
| - π **Diff Embeddings** β Semantic change classification with risk scoring |
| - π§ͺ **Coverage Routing** β Test coverage-aware agent selection |
| - π **Graph Algorithms** β MinCut boundaries, Louvain communities, Spectral clustering |
| - π‘οΈ **Security Scanning** β Parallel vulnerability pattern detection |
| - π― **RAG Context** β Semantic retrieval with HNSW indexing |
|
|
| ### Performance |
| | Backend | Read Time | Speedup | |
| |---------|-----------|---------| |
| | ONNX inference | ~400ms | baseline | |
| | HNSW search | ~0.045ms | 8,800x | |
| | Memory cache | ~0.01ms | **40,000x** | |
|
|
| π **[Full Hooks Documentation β](https://github.com/ruvnet/ruvector/blob/main/npm/packages/ruvector/HOOKS.md)** |
|
|
| ### MCP Server Integration |
|
|
| RuVector includes an MCP server for Claude Code with 30+ tools: |
|
|
| ```bash |
| # Add to Claude Code |
| claude mcp add ruvector -- npx ruvector mcp start |
| ``` |
|
|
| **Available MCP Tools:** |
| - `hooks_route`, `hooks_route_enhanced` β Agent routing with signals |
| - `hooks_ast_analyze`, `hooks_ast_complexity` β Code structure analysis |
| - `hooks_diff_analyze`, `hooks_diff_classify` β Change classification |
| - `hooks_coverage_route`, `hooks_coverage_suggest` β Test-aware routing |
| - `hooks_graph_mincut`, `hooks_graph_cluster` β Code boundaries |
| - `hooks_security_scan` β Vulnerability detection |
| - `hooks_rag_context` β Semantic context retrieval |
| - `hooks_attention_info`, `hooks_gnn_info` β Neural capabilities |
|
|
| --- |
|
|
| ## π Why Ruvector? |
|
|
| ### The Problem with Existing Vector Databases |
|
|
| Most vector databases force you to choose between three painful trade-offs: |
|
|
| 1. **Cloud-Only Services** (Pinecone, Weaviate Cloud) - Expensive, vendor lock-in, latency issues, API rate limits |
| 2. **Python-First Solutions** (ChromaDB, Faiss) - Poor Node.js support, require separate Python processes |
| 3. **Self-Hosted Complexity** (Milvus, Qdrant) - Heavy infrastructure, Docker orchestration, operational overhead |
|
|
| **Ruvector eliminates these trade-offs.** |
|
|
| ### The Ruvector Advantage |
|
|
| Ruvector is purpose-built for **modern JavaScript/TypeScript applications** that need vector search: |
|
|
| π― **Native Node.js Integration** |
| - Drop-in npm packageβno Docker, no Python, no external services |
| - Full TypeScript support with complete type definitions |
| - Automatic platform detection with native Rust bindings |
| - Seamless WebAssembly fallback for universal compatibility |
|
|
| β‘ **Production-Grade Performance** |
| - **52,000+ inserts/second** with native Rust (10x faster than Python alternatives) |
| - **<0.5ms query latency** with HNSW indexing and SIMD optimizations |
| - **~50 bytes per vector** with advanced memory optimization |
| - Scales from edge devices to millions of vectors |
|
|
| π§ **Built for AI Applications** |
| - Optimized for LLM embeddings (OpenAI, Cohere, Hugging Face) |
| - Perfect for RAG (Retrieval-Augmented Generation) systems |
| - Agent memory and semantic caching |
| - Real-time recommendation engines |
|
|
| π **Universal Deployment** |
| - **Linux, macOS, Windows** with native performance |
| - **Browser support** via WebAssembly (experimental) |
| - **Edge computing** and serverless environments |
| - **Alpine Linux** and non-glibc systems supported |
|
|
| π° **Zero Operational Costs** |
| - No cloud API fees or usage limits |
| - No infrastructure to manage |
| - No separate database servers |
| - Open source MIT license |
|
|
| ### Key Advantages |
|
|
| - β‘ **Blazing Fast**: <0.5ms p50 latency with native Rust, 10-50ms with WASM fallback |
| - π― **Automatic Platform Detection**: Uses native when available, falls back to WASM seamlessly |
| - π§ **AI-Native**: Built specifically for embeddings, RAG, semantic search, and agent memory |
| - π§ **CLI Tools Included**: Full command-line interface for database management |
| - π **Universal Deployment**: Works on all platformsβLinux, macOS, Windows, even browsers |
| - πΎ **Memory Efficient**: ~50 bytes per vector with advanced quantization |
| - π **Production Ready**: Battle-tested algorithms with comprehensive benchmarks |
| - π **Open Source**: MIT licensed, community-driven |
|
|
| ## π Quick Start Tutorial |
|
|
| ### Step 1: Installation |
|
|
| Install Ruvector with a single npm command: |
|
|
| ```bash |
| npm install ruvector |
| ``` |
|
|
| **What happens during installation:** |
| - npm automatically detects your platform (Linux, macOS, Windows) |
| - Downloads the correct native binary for maximum performance |
| - Falls back to WebAssembly if native binaries aren't available |
| - No additional setup, Docker, or external services required |
|
|
| **Windows Installation (without build tools):** |
| ```bash |
| # Skip native compilation, use WASM fallback |
| npm install ruvector --ignore-scripts |
| |
| # The ONNX WASM runtime (7.4MB) works without build tools |
| # Memory cache provides 40,000x speedup over inference |
| ``` |
|
|
| **Verify installation:** |
| ```bash |
| npx ruvector info |
| ``` |
|
|
| You should see your platform and implementation type (native Rust or WASM fallback). |
|
|
| ### Step 2: Your First Vector Database |
|
|
| Let's create a simple vector database and perform basic operations. This example demonstrates the complete CRUD (Create, Read, Update, Delete) workflow: |
|
|
| ```javascript |
| const { VectorDb } = require('ruvector'); |
| |
| async function tutorial() { |
| // Step 2.1: Create a new vector database |
| // The 'dimensions' parameter must match your embedding model |
| // Common sizes: 128, 384 (sentence-transformers), 768 (BERT), 1536 (OpenAI) |
| const db = new VectorDb({ |
| dimensions: 128, // Vector size - MUST match your embeddings |
| maxElements: 10000, // Maximum vectors (can grow automatically) |
| storagePath: './my-vectors.db' // Persist to disk (omit for in-memory) |
| }); |
| |
| console.log('β
Database created successfully'); |
| |
| // Step 2.2: Insert vectors |
| // In real applications, these would come from an embedding model |
| const documents = [ |
| { id: 'doc1', text: 'Artificial intelligence and machine learning' }, |
| { id: 'doc2', text: 'Deep learning neural networks' }, |
| { id: 'doc3', text: 'Natural language processing' }, |
| ]; |
| |
| for (const doc of documents) { |
| // Generate random vector for demonstration |
| // In production: use OpenAI, Cohere, or sentence-transformers |
| const vector = new Float32Array(128).map(() => Math.random()); |
| |
| await db.insert({ |
| id: doc.id, |
| vector: vector, |
| metadata: { |
| text: doc.text, |
| timestamp: Date.now(), |
| category: 'AI' |
| } |
| }); |
| |
| console.log(`β
Inserted: ${doc.id}`); |
| } |
| |
| // Step 2.3: Search for similar vectors |
| // Create a query vector (in production, this would be from your search query) |
| const queryVector = new Float32Array(128).map(() => Math.random()); |
| |
| const results = await db.search({ |
| vector: queryVector, |
| k: 5, // Return top 5 most similar vectors |
| threshold: 0.7 // Only return results with similarity > 0.7 |
| }); |
| |
| console.log('\nπ Search Results:'); |
| results.forEach((result, index) => { |
| console.log(`${index + 1}. ${result.id} - Score: ${result.score.toFixed(3)}`); |
| console.log(` Text: ${result.metadata.text}`); |
| }); |
| |
| // Step 2.4: Retrieve a specific vector |
| const retrieved = await db.get('doc1'); |
| if (retrieved) { |
| console.log('\nπ Retrieved document:', retrieved.metadata.text); |
| } |
| |
| // Step 2.5: Get database statistics |
| const count = await db.len(); |
| console.log(`\nπ Total vectors in database: ${count}`); |
| |
| // Step 2.6: Delete a vector |
| const deleted = await db.delete('doc1'); |
| console.log(`\nποΈ Deleted doc1: ${deleted ? 'Success' : 'Not found'}`); |
| |
| // Final count |
| const finalCount = await db.len(); |
| console.log(`π Final count: ${finalCount}`); |
| } |
| |
| // Run the tutorial |
| tutorial().catch(console.error); |
| ``` |
|
|
| **Expected Output:** |
| ``` |
| β
Database created successfully |
| β
Inserted: doc1 |
| β
Inserted: doc2 |
| β
Inserted: doc3 |
| |
| π Search Results: |
| 1. doc2 - Score: 0.892 |
| Text: Deep learning neural networks |
| 2. doc1 - Score: 0.856 |
| Text: Artificial intelligence and machine learning |
| 3. doc3 - Score: 0.801 |
| Text: Natural language processing |
| |
| π Retrieved document: Artificial intelligence and machine learning |
| |
| π Total vectors in database: 3 |
| |
| ποΈ Deleted doc1: Success |
| π Final count: 2 |
| ``` |
|
|
| ### Step 3: TypeScript Tutorial |
|
|
| Ruvector provides full TypeScript support with complete type safety. Here's how to use it: |
|
|
| ```typescript |
| import { VectorDb, VectorEntry, SearchQuery, SearchResult } from 'ruvector'; |
| |
| // Step 3.1: Define your custom metadata type |
| interface DocumentMetadata { |
| title: string; |
| content: string; |
| author: string; |
| date: Date; |
| tags: string[]; |
| } |
| |
| async function typescriptTutorial() { |
| // Step 3.2: Create typed database |
| const db = new VectorDb({ |
| dimensions: 384, // sentence-transformers/all-MiniLM-L6-v2 |
| maxElements: 10000, |
| storagePath: './typed-vectors.db' |
| }); |
| |
| // Step 3.3: Type-safe vector entry |
| const entry: VectorEntry<DocumentMetadata> = { |
| id: 'article-001', |
| vector: new Float32Array(384), // Your embedding here |
| metadata: { |
| title: 'Introduction to Vector Databases', |
| content: 'Vector databases enable semantic search...', |
| author: 'Jane Doe', |
| date: new Date('2024-01-15'), |
| tags: ['database', 'AI', 'search'] |
| } |
| }; |
| |
| // Step 3.4: Insert with type checking |
| await db.insert(entry); |
| console.log('β
Inserted typed document'); |
| |
| // Step 3.5: Type-safe search |
| const query: SearchQuery = { |
| vector: new Float32Array(384), |
| k: 10, |
| threshold: 0.8 |
| }; |
| |
| // Step 3.6: Fully typed results |
| const results: SearchResult<DocumentMetadata>[] = await db.search(query); |
| |
| // TypeScript knows the exact shape of metadata |
| results.forEach(result => { |
| console.log(`Title: ${result.metadata.title}`); |
| console.log(`Author: ${result.metadata.author}`); |
| console.log(`Tags: ${result.metadata.tags.join(', ')}`); |
| console.log(`Similarity: ${result.score.toFixed(3)}\n`); |
| }); |
| |
| // Step 3.7: Type-safe retrieval |
| const doc = await db.get('article-001'); |
| if (doc) { |
| // TypeScript autocomplete works perfectly here |
| const publishYear = doc.metadata.date.getFullYear(); |
| console.log(`Published in ${publishYear}`); |
| } |
| } |
| |
| typescriptTutorial().catch(console.error); |
| ``` |
|
|
| **TypeScript Benefits:** |
| - β
Full autocomplete for all methods and properties |
| - β
Compile-time type checking prevents errors |
| - β
IDE IntelliSense shows documentation |
| - β
Custom metadata types for your use case |
| - β
No `any` types - fully typed throughout |
|
|
| ## π― Platform Detection |
|
|
| Ruvector automatically detects the best implementation for your platform: |
|
|
| ```javascript |
| const { getImplementationType, isNative, isWasm } = require('ruvector'); |
| |
| console.log(getImplementationType()); // 'native' or 'wasm' |
| console.log(isNative()); // true if using native Rust |
| console.log(isWasm()); // true if using WebAssembly fallback |
| |
| // Performance varies by implementation: |
| // Native (Rust): <0.5ms latency, 50K+ ops/sec |
| // WASM fallback: 10-50ms latency, ~1K ops/sec |
| ``` |
|
|
| ## π§ CLI Tools |
|
|
| Ruvector includes a full command-line interface for database management: |
|
|
| ### Create Database |
|
|
| ```bash |
| # Create a new vector database |
| npx ruvector create mydb.vec --dimensions 384 --metric cosine |
| |
| # Options: |
| # --dimensions, -d Vector dimensionality (required) |
| # --metric, -m Distance metric (cosine, euclidean, dot) |
| # --max-elements Maximum number of vectors (default: 10000) |
| ``` |
|
|
| ### Insert Vectors |
|
|
| ```bash |
| # Insert vectors from JSON file |
| npx ruvector insert mydb.vec vectors.json |
| |
| # JSON format: |
| # [ |
| # { "id": "doc1", "vector": [0.1, 0.2, ...], "metadata": {...} }, |
| # { "id": "doc2", "vector": [0.3, 0.4, ...], "metadata": {...} } |
| # ] |
| ``` |
|
|
| ### Search Vectors |
|
|
| ```bash |
| # Search for similar vectors |
| npx ruvector search mydb.vec --vector "[0.1,0.2,0.3,...]" --top-k 10 |
| |
| # Options: |
| # --vector, -v Query vector (JSON array) |
| # --top-k, -k Number of results (default: 10) |
| # --threshold Minimum similarity score |
| ``` |
|
|
| ### Database Statistics |
|
|
| ```bash |
| # Show database statistics |
| npx ruvector stats mydb.vec |
| |
| # Output: |
| # Total vectors: 10,000 |
| # Dimensions: 384 |
| # Metric: cosine |
| # Memory usage: ~500 KB |
| # Index type: HNSW |
| ``` |
|
|
| ### Benchmarking |
|
|
| ```bash |
| # Run performance benchmark |
| npx ruvector benchmark --num-vectors 10000 --num-queries 1000 |
| |
| # Options: |
| # --num-vectors Number of vectors to insert |
| # --num-queries Number of search queries |
| # --dimensions Vector dimensionality (default: 128) |
| ``` |
|
|
| ### System Information |
|
|
| ```bash |
| # Show platform and implementation info |
| npx ruvector info |
| |
| # Output: |
| # Platform: linux-x64-gnu |
| # Implementation: native (Rust) |
| # GNN Module: Available |
| # Node.js: v18.17.0 |
| # Performance: <0.5ms p50 latency |
| ``` |
|
|
| ### Install Optional Packages |
|
|
| Ruvector supports optional packages that extend functionality. Use the `install` command to add them: |
|
|
| ```bash |
| # List available packages |
| npx ruvector install |
| |
| # Output: |
| # Available Ruvector Packages: |
| # |
| # gnn not installed |
| # Graph Neural Network layers, tensor compression, differentiable search |
| # npm: @ruvector/gnn |
| # |
| # core β installed |
| # Core vector database with native Rust bindings |
| # npm: @ruvector/core |
| |
| # Install specific package |
| npx ruvector install gnn |
| |
| # Install all optional packages |
| npx ruvector install --all |
| |
| # Interactive selection |
| npx ruvector install -i |
| ``` |
|
|
| The install command auto-detects your package manager (npm, yarn, pnpm, bun). |
|
|
| ### GNN Commands |
|
|
| Ruvector includes Graph Neural Network (GNN) capabilities for advanced tensor compression and differentiable search. |
|
|
| #### GNN Info |
|
|
| ```bash |
| # Show GNN module information |
| npx ruvector gnn info |
| |
| # Output: |
| # GNN Module Information |
| # Status: Available |
| # Platform: linux |
| # Architecture: x64 |
| # |
| # Available Features: |
| # β’ RuvectorLayer - GNN layer with multi-head attention |
| # β’ TensorCompress - Adaptive tensor compression (5 levels) |
| # β’ differentiableSearch - Soft attention-based search |
| # β’ hierarchicalForward - Multi-layer GNN processing |
| ``` |
|
|
| #### GNN Layer |
|
|
| ```bash |
| # Create and test a GNN layer |
| npx ruvector gnn layer -i 128 -h 256 --test |
| |
| # Options: |
| # -i, --input-dim Input dimension (required) |
| # -h, --hidden-dim Hidden dimension (required) |
| # -a, --heads Number of attention heads (default: 4) |
| # -d, --dropout Dropout rate (default: 0.1) |
| # --test Run a test forward pass |
| # -o, --output Save layer config to JSON file |
| ``` |
|
|
| #### GNN Compress |
|
|
| ```bash |
| # Compress embeddings using adaptive tensor compression |
| npx ruvector gnn compress -f embeddings.json -l pq8 -o compressed.json |
| |
| # Options: |
| # -f, --file Input JSON file with embeddings (required) |
| # -l, --level Compression level: none|half|pq8|pq4|binary (default: auto) |
| # -a, --access-freq Access frequency for auto compression (default: 0.5) |
| # -o, --output Output file for compressed data |
| |
| # Compression levels: |
| # none (freq > 0.8) - Full precision, hot data |
| # half (freq > 0.4) - ~50% savings, warm data |
| # pq8 (freq > 0.1) - ~8x compression, cool data |
| # pq4 (freq > 0.01) - ~16x compression, cold data |
| # binary (freq <= 0.01) - ~32x compression, archive |
| ``` |
|
|
| #### GNN Search |
|
|
| ```bash |
| # Differentiable search with soft attention |
| npx ruvector gnn search -q "[1.0,0.0,0.0]" -c candidates.json -k 5 |
| |
| # Options: |
| # -q, --query Query vector as JSON array (required) |
| # -c, --candidates Candidates file - JSON array of vectors (required) |
| # -k, --top-k Number of results (default: 5) |
| # -t, --temperature Softmax temperature (default: 1.0) |
| ``` |
|
|
| ### Attention Commands |
|
|
| Ruvector includes high-performance attention mechanisms for transformer-based operations, hyperbolic embeddings, and graph attention. |
|
|
| ```bash |
| # Install the attention module (optional) |
| npm install @ruvector/attention |
| ``` |
|
|
| #### Attention Mechanisms Reference |
|
|
| | Mechanism | Type | Complexity | When to Use | |
| |-----------|------|------------|-------------| |
| | **DotProductAttention** | Core | O(nΒ²) | Standard scaled dot-product attention for transformers | |
| | **MultiHeadAttention** | Core | O(nΒ²) | Parallel attention heads for capturing different relationships | |
| | **FlashAttention** | Core | O(nΒ²) IO-optimized | Memory-efficient attention for long sequences | |
| | **HyperbolicAttention** | Core | O(nΒ²) | Hierarchical data, tree-like structures, taxonomies | |
| | **LinearAttention** | Core | O(n) | Very long sequences where O(nΒ²) is prohibitive | |
| | **MoEAttention** | Core | O(n*k) | Mixture of Experts routing, specialized attention | |
| | **GraphRoPeAttention** | Graph | O(nΒ²) | Graph data with rotary position embeddings | |
| | **EdgeFeaturedAttention** | Graph | O(nΒ²) | Graphs with rich edge features/attributes | |
| | **DualSpaceAttention** | Graph | O(nΒ²) | Combined Euclidean + hyperbolic representation | |
| | **LocalGlobalAttention** | Graph | O(n*k) | Large graphs with local + global context | |
|
|
| #### Attention Info |
|
|
| ```bash |
| # Show attention module information |
| npx ruvector attention info |
| |
| # Output: |
| # Attention Module Information |
| # Status: Available |
| # Version: 0.1.0 |
| # Platform: linux |
| # Architecture: x64 |
| # |
| # Core Attention Mechanisms: |
| # β’ DotProductAttention - Scaled dot-product attention |
| # β’ MultiHeadAttention - Multi-head self-attention |
| # β’ FlashAttention - Memory-efficient IO-aware attention |
| # β’ HyperbolicAttention - PoincarΓ© ball attention |
| # β’ LinearAttention - O(n) linear complexity attention |
| # β’ MoEAttention - Mixture of Experts attention |
| ``` |
|
|
| #### Attention List |
|
|
| ```bash |
| # List all available attention mechanisms |
| npx ruvector attention list |
| |
| # With verbose details |
| npx ruvector attention list -v |
| ``` |
|
|
| #### Attention Benchmark |
|
|
| ```bash |
| # Benchmark attention mechanisms |
| npx ruvector attention benchmark -d 256 -n 100 -i 100 |
| |
| # Options: |
| # -d, --dimension Vector dimension (default: 256) |
| # -n, --num-vectors Number of vectors (default: 100) |
| # -i, --iterations Benchmark iterations (default: 100) |
| # -t, --types Attention types to benchmark (default: dot,flash,linear) |
| |
| # Example output: |
| # Dimension: 256 |
| # Vectors: 100 |
| # Iterations: 100 |
| # |
| # dot: 0.012ms/op (84,386 ops/sec) |
| # flash: 0.012ms/op (82,844 ops/sec) |
| # linear: 0.066ms/op (15,259 ops/sec) |
| ``` |
|
|
| #### Hyperbolic Operations |
|
|
| ```bash |
| # Calculate PoincarΓ© distance between two points |
| npx ruvector attention hyperbolic -a distance -v "[0.1,0.2,0.3]" -b "[0.4,0.5,0.6]" |
| |
| # Project vector to PoincarΓ© ball |
| npx ruvector attention hyperbolic -a project -v "[1.5,2.0,0.8]" |
| |
| # MΓΆbius addition in hyperbolic space |
| npx ruvector attention hyperbolic -a mobius-add -v "[0.1,0.2]" -b "[0.3,0.4]" |
| |
| # Exponential map (tangent space β PoincarΓ© ball) |
| npx ruvector attention hyperbolic -a exp-map -v "[0.1,0.2,0.3]" |
| |
| # Options: |
| # -a, --action Action: distance|project|mobius-add|exp-map|log-map |
| # -v, --vector Input vector as JSON array (required) |
| # -b, --vector-b Second vector for binary operations |
| # -c, --curvature PoincarΓ© ball curvature (default: 1.0) |
| ``` |
|
|
| #### When to Use Each Attention Type |
|
|
| | Use Case | Recommended Attention | Reason | |
| |----------|----------------------|--------| |
| | **Standard NLP/Transformers** | MultiHeadAttention | Industry standard, well-tested | |
| | **Long Documents (>4K tokens)** | FlashAttention or LinearAttention | Memory efficient | |
| | **Hierarchical Classification** | HyperbolicAttention | Captures tree-like structures | |
| | **Knowledge Graphs** | GraphRoPeAttention | Position-aware graph attention | |
| | **Multi-Relational Graphs** | EdgeFeaturedAttention | Leverages edge attributes | |
| | **Taxonomy/Ontology Search** | DualSpaceAttention | Best of both Euclidean + hyperbolic | |
| | **Large-Scale Graphs** | LocalGlobalAttention | Efficient local + global context | |
| | **Model Routing/MoE** | MoEAttention | Expert selection and routing | |
|
|
| ### β‘ ONNX WASM Embeddings (v2.0) |
|
|
| RuVector includes a pure JavaScript ONNX runtime for local embeddings - no Python, no API calls, no build tools required. |
|
|
| ```bash |
| # Embeddings work out of the box |
| npx ruvector hooks remember "important context" -t project |
| npx ruvector hooks recall "context query" |
| npx ruvector hooks rag-context "how does auth work" |
| ``` |
|
|
| **Model**: all-MiniLM-L6-v2 (384 dimensions, 23MB) |
| - Downloads automatically on first use |
| - Cached in `.ruvector/models/` |
| - SIMD-accelerated when available |
|
|
| **Performance:** |
| | Operation | Time | Notes | |
| |-----------|------|-------| |
| | Model load | ~2s | First use only | |
| | Embedding | ~50ms | Per text chunk | |
| | HNSW search | 0.045ms | 150x faster than brute force | |
| | Cache hit | 0.01ms | 40,000x faster than inference | |
|
|
| **Fallback Chain:** |
| 1. Native SQLite β best persistence |
| 2. WASM SQLite β cross-platform |
| 3. Memory Cache β fastest (no persistence) |
|
|
| ### π§ Self-Learning Hooks v2.0 |
|
|
| Ruvector includes **self-learning intelligence hooks** for Claude Code integration with ONNX embeddings, AST analysis, and coverage-aware routing. |
|
|
| #### Initialize Hooks |
|
|
| ```bash |
| # Initialize hooks in your project |
| npx ruvector hooks init |
| |
| # Options: |
| # --force Overwrite existing configuration |
| # --minimal Minimal configuration (no optional hooks) |
| # --pretrain Initialize + pretrain from git history |
| # --build-agents quality Generate optimized agent configs |
| ``` |
|
|
| This creates `.claude/settings.json` with pre-configured hooks and `CLAUDE.md` with comprehensive documentation. |
|
|
| #### Session Management |
|
|
| ```bash |
| # Start a session (load intelligence data) |
| npx ruvector hooks session-start |
| |
| # End a session (save learned patterns) |
| npx ruvector hooks session-end |
| ``` |
|
|
| #### Pre/Post Edit Hooks |
|
|
| ```bash |
| # Before editing a file - get agent recommendations |
| npx ruvector hooks pre-edit src/index.ts |
| # Output: π€ Recommended: typescript-developer (85% confidence) |
| |
| # After editing - record success/failure for learning |
| npx ruvector hooks post-edit src/index.ts --success |
| npx ruvector hooks post-edit src/index.ts --error "Type error on line 42" |
| ``` |
|
|
| #### Pre/Post Command Hooks |
|
|
| ```bash |
| # Before running a command - risk analysis |
| npx ruvector hooks pre-command "npm test" |
| # Output: β
Risk: LOW, Category: test |
| |
| # After running - record outcome |
| npx ruvector hooks post-command "npm test" --success |
| npx ruvector hooks post-command "npm test" --error "3 tests failed" |
| ``` |
|
|
| #### Agent Routing |
|
|
| ```bash |
| # Get agent recommendation for a task |
| npx ruvector hooks route "fix the authentication bug in login.ts" |
| # Output: π€ Recommended: security-specialist (92% confidence) |
| |
| npx ruvector hooks route "add unit tests for the API" |
| # Output: π€ Recommended: tester (88% confidence) |
| ``` |
|
|
| #### Memory Operations |
|
|
| ```bash |
| # Store context in vector memory |
| npx ruvector hooks remember "API uses JWT tokens with 1h expiry" --type decision |
| npx ruvector hooks remember "Database schema in docs/schema.md" --type reference |
| |
| # Semantic search memory |
| npx ruvector hooks recall "authentication mechanism" |
| # Returns relevant stored memories |
| ``` |
|
|
| #### Context Suggestions |
|
|
| ```bash |
| # Get relevant context for current task |
| npx ruvector hooks suggest-context |
| # Output: Based on recent files, suggests relevant context |
| ``` |
|
|
| #### Intelligence Statistics |
|
|
| ```bash |
| # Show learned patterns and statistics |
| npx ruvector hooks stats |
| |
| # Output: |
| # Patterns: 156 learned |
| # Success rate: 87% |
| # Top agents: rust-developer, tester, reviewer |
| # Memory entries: 42 |
| ``` |
|
|
| #### Swarm Recommendations |
|
|
| ```bash |
| # Get agent recommendation for task type |
| npx ruvector hooks swarm-recommend "code-review" |
| # Output: Recommended agents for code review task |
| ``` |
|
|
| #### AST Analysis (v2.0) |
|
|
| ```bash |
| # Analyze file structure, symbols, imports, complexity |
| npx ruvector hooks ast-analyze src/index.ts --json |
| |
| # Get complexity metrics for multiple files |
| npx ruvector hooks ast-complexity src/*.ts --threshold 15 |
| # Flags files exceeding cyclomatic complexity threshold |
| ``` |
|
|
| #### Diff & Risk Analysis (v2.0) |
|
|
| ```bash |
| # Analyze commit with semantic embeddings and risk scoring |
| npx ruvector hooks diff-analyze HEAD |
| # Output: risk score, category, affected files |
| |
| # Classify change type (feature, bugfix, refactor, docs, test) |
| npx ruvector hooks diff-classify |
| |
| # Find similar past commits via embeddings |
| npx ruvector hooks diff-similar -k 5 |
| |
| # Git churn analysis (hot spots) |
| npx ruvector hooks git-churn --days 30 |
| ``` |
|
|
| #### Coverage-Aware Routing (v2.0) |
|
|
| ```bash |
| # Get coverage-aware routing for a file |
| npx ruvector hooks coverage-route src/api.ts |
| # Output: agent weights based on test coverage |
| |
| # Suggest tests for files based on coverage gaps |
| npx ruvector hooks coverage-suggest src/*.ts |
| ``` |
|
|
| #### Graph Analysis (v2.0) |
|
|
| ```bash |
| # Find optimal code boundaries (MinCut algorithm) |
| npx ruvector hooks graph-mincut src/*.ts |
| |
| # Detect code communities (Louvain/Spectral clustering) |
| npx ruvector hooks graph-cluster src/*.ts --method louvain |
| ``` |
|
|
| #### Security & RAG (v2.0) |
|
|
| ```bash |
| # Parallel security vulnerability scan |
| npx ruvector hooks security-scan src/*.ts |
| |
| # RAG-enhanced context retrieval |
| npx ruvector hooks rag-context "how does auth work" |
| |
| # Enhanced routing with all signals |
| npx ruvector hooks route-enhanced "fix bug" --file src/api.ts |
| ``` |
|
|
| #### Hooks Configuration |
|
|
| The hooks integrate with Claude Code via `.claude/settings.json`: |
|
|
| ```json |
| { |
| "env": { |
| "RUVECTOR_INTELLIGENCE_ENABLED": "true", |
| "RUVECTOR_LEARNING_RATE": "0.1", |
| "RUVECTOR_AST_ENABLED": "true", |
| "RUVECTOR_DIFF_EMBEDDINGS": "true", |
| "RUVECTOR_COVERAGE_ROUTING": "true", |
| "RUVECTOR_GRAPH_ALGORITHMS": "true", |
| "RUVECTOR_SECURITY_SCAN": "true" |
| }, |
| "hooks": { |
| "PreToolUse": [ |
| { |
| "matcher": "Edit|Write|MultiEdit", |
| "hooks": [{ "type": "command", "command": "npx ruvector hooks pre-edit \"$TOOL_INPUT_file_path\"" }] |
| }, |
| { |
| "matcher": "Bash", |
| "hooks": [{ "type": "command", "command": "npx ruvector hooks pre-command \"$TOOL_INPUT_command\"" }] |
| } |
| ], |
| "PostToolUse": [ |
| { |
| "matcher": "Edit|Write|MultiEdit", |
| "hooks": [{ "type": "command", "command": "npx ruvector hooks post-edit \"$TOOL_INPUT_file_path\"" }] |
| } |
| ], |
| "SessionStart": [{ "hooks": [{ "type": "command", "command": "npx ruvector hooks session-start" }] }], |
| "Stop": [{ "hooks": [{ "type": "command", "command": "npx ruvector hooks session-end" }] }] |
| } |
| } |
| ``` |
|
|
| #### How Self-Learning Works |
|
|
| 1. **Pattern Recording**: Every edit and command is recorded with context |
| 2. **Q-Learning**: Success/failure updates agent routing weights |
| 3. **AST Analysis**: Code complexity informs agent selection |
| 4. **Diff Embeddings**: Change patterns improve risk assessment |
| 5. **Coverage Routing**: Test coverage guides testing priorities |
| 6. **Vector Memory**: Decisions and references stored for semantic recall (HNSW indexed) |
| 7. **Continuous Improvement**: The more you use it, the smarter it gets |
|
|
| ## π Performance Benchmarks |
|
|
| Tested on AMD Ryzen 9 5950X, 128-dimensional vectors: |
|
|
| ### Native Performance (Rust) |
|
|
| | Operation | Throughput | Latency (p50) | Latency (p99) | |
| |-----------|------------|---------------|---------------| |
| | Insert | 52,341 ops/sec | 0.019 ms | 0.045 ms | |
| | Search (k=10) | 11,234 ops/sec | 0.089 ms | 0.156 ms | |
| | Search (k=100) | 8,932 ops/sec | 0.112 ms | 0.203 ms | |
| | Delete | 45,678 ops/sec | 0.022 ms | 0.051 ms | |
|
|
| **Memory Usage**: ~50 bytes per 128-dim vector (including index) |
|
|
| ### Comparison with Alternatives |
|
|
| | Database | Insert (ops/sec) | Search (ops/sec) | Memory per Vector | Node.js | Browser | |
| |----------|------------------|------------------|-------------------|---------|---------| |
| | **Ruvector (Native)** | **52,341** | **11,234** | **50 bytes** | β
| β | |
| | **Ruvector (WASM)** | **~1,000** | **~100** | **50 bytes** | β
| β
| |
| | Faiss (HNSW) | 38,200 | 9,800 | 68 bytes | β | β | |
| | Hnswlib | 41,500 | 10,200 | 62 bytes | β
| β | |
| | ChromaDB | ~1,000 | ~20 | 150 bytes | β
| β | |
|
|
| *Benchmarks measured with 100K vectors, 128 dimensions, k=10* |
|
|
| ## π Comparison with Other Vector Databases |
|
|
| Comprehensive comparison of Ruvector against popular vector database solutions: |
|
|
| | Feature | Ruvector | Pinecone | Qdrant | Weaviate | Milvus | ChromaDB | Faiss | |
| |---------|----------|----------|--------|----------|--------|----------|-------| |
| | **Deployment** | |
| | Installation | `npm install` β
| Cloud API βοΈ | Docker π³ | Docker π³ | Docker/K8s π³ | `pip install` π | `pip install` π | |
| | Node.js Native | β
First-class | β API only | β οΈ HTTP API | β οΈ HTTP API | β οΈ HTTP API | β Python | β Python | |
| | Setup Time | < 1 minute | 5-10 minutes | 10-30 minutes | 15-30 minutes | 30-60 minutes | 5 minutes | 5 minutes | |
| | Infrastructure | None required | Managed cloud | Self-hosted | Self-hosted | Self-hosted | Embedded | Embedded | |
| | **Performance** | |
| | Query Latency (p50) | **<0.5ms** | ~2-5ms | ~1-2ms | ~2-3ms | ~3-5ms | ~50ms | ~1ms | |
| | Insert Throughput | **52,341 ops/sec** | ~10,000 ops/sec | ~20,000 ops/sec | ~15,000 ops/sec | ~25,000 ops/sec | ~1,000 ops/sec | ~40,000 ops/sec | |
| | Memory per Vector (128d) | **50 bytes** | ~80 bytes | 62 bytes | ~100 bytes | ~70 bytes | 150 bytes | 68 bytes | |
| | Recall @ k=10 | 95%+ | 93% | 94% | 92% | 96% | 85% | 97% | |
| | **Platform Support** | |
| | Linux | β
Native | βοΈ API | β
Docker | β
Docker | β
Docker | β
Python | β
Python | |
| | macOS | β
Native | βοΈ API | β
Docker | β
Docker | β
Docker | β
Python | β
Python | |
| | Windows | β
Native | βοΈ API | β
Docker | β
Docker | β οΈ WSL2 | β
Python | β
Python | |
| | Browser/WASM | β
Yes | β No | β No | β No | β No | β No | β No | |
| | ARM64 | β
Native | βοΈ API | β
Yes | β
Yes | β οΈ Limited | β
Yes | β
Yes | |
| | Alpine Linux | β
WASM | βοΈ API | β οΈ Build from source | β οΈ Build from source | β No | β
Yes | β
Yes | |
| | **Features** | |
| | Distance Metrics | Cosine, L2, Dot | Cosine, L2, Dot | 11 metrics | 10 metrics | 8 metrics | L2, Cosine, IP | L2, IP, Cosine | |
| | Filtering | β
Metadata | β
Advanced | β
Advanced | β
Advanced | β
Advanced | β
Basic | β Limited | |
| | Persistence | β
File-based | βοΈ Managed | β
Disk | β
Disk | β
Disk | β
DuckDB | β Memory | |
| | Indexing | HNSW | Proprietary | HNSW | HNSW | IVF/HNSW | HNSW | IVF/HNSW | |
| | Quantization | β
PQ | β
Yes | β
Scalar | β
PQ | β
PQ/SQ | β No | β
PQ | |
| | Batch Operations | β
Yes | β
Yes | β
Yes | β
Yes | β
Yes | β
Yes | β
Yes | |
| | **Developer Experience** | |
| | TypeScript Types | β
Full | β
Generated | β οΈ Community | β οΈ Community | β οΈ Community | β οΈ Partial | β No | |
| | Documentation | β
Excellent | β
Excellent | β
Good | β
Good | β
Good | β
Good | β οΈ Technical | |
| | Examples | β
Many | β
Many | β
Good | β
Good | β
Many | β
Good | β οΈ Limited | |
| | CLI Tools | β
Included | β οΈ Limited | β
Yes | β
Yes | β
Yes | β οΈ Basic | β No | |
| | **Operations** | |
| | Monitoring | β
Metrics | β
Dashboard | β
Prometheus | β
Prometheus | β
Prometheus | β οΈ Basic | β No | |
| | Backups | β
File copy | βοΈ Automatic | β
Snapshots | β
Snapshots | β
Snapshots | β
File copy | β Manual | |
| | High Availability | β οΈ App-level | β
Built-in | β
Clustering | β
Clustering | β
Clustering | β No | β No | |
| | Auto-Scaling | β οΈ App-level | β
Automatic | β οΈ Manual | β οΈ Manual | β οΈ K8s HPA | β No | β No | |
| | **Cost** | |
| | Pricing Model | Free (MIT) | Pay-per-use | Free (Apache) | Free (BSD) | Free (Apache) | Free (Apache) | Free (MIT) | |
| | Monthly Cost (1M vectors) | **$0** | ~$70-200 | ~$20-50 (infra) | ~$30-60 (infra) | ~$50-100 (infra) | $0 | $0 | |
| | Monthly Cost (10M vectors) | **$0** | ~$500-1000 | ~$100-200 (infra) | ~$150-300 (infra) | ~$200-400 (infra) | $0 | $0 | |
| | API Rate Limits | None | Yes | None | None | None | None | None | |
| | **Use Cases** | |
| | RAG Systems | β
Excellent | β
Excellent | β
Excellent | β
Excellent | β
Excellent | β
Good | β οΈ Limited | |
| | Serverless | β
Perfect | β
Good | β No | β No | β No | β οΈ Possible | β οΈ Possible | |
| | Edge Computing | β
Excellent | β No | β No | β No | β No | β No | β οΈ Possible | |
| | Production Scale (100M+) | β οΈ Single node | β
Yes | β
Yes | β
Yes | β
Excellent | β οΈ Limited | β οΈ Manual | |
| | Embedded Apps | β
Excellent | β No | β No | β No | β No | β οΈ Possible | β
Good | |
|
|
| ### When to Choose Ruvector |
|
|
| β
**Perfect for:** |
| - **Node.js/TypeScript applications** needing embedded vector search |
| - **Serverless and edge computing** where external services aren't practical |
| - **Rapid prototyping and development** with minimal setup time |
| - **RAG systems** with LangChain, LlamaIndex, or custom implementations |
| - **Cost-sensitive projects** that can't afford cloud API pricing |
| - **Offline-first applications** requiring local vector search |
| - **Browser-based AI** with WebAssembly fallback |
| - **Small to medium scale** (up to 10M vectors per instance) |
|
|
| β οΈ **Consider alternatives for:** |
| - **Massive scale (100M+ vectors)** - Consider Pinecone, Milvus, or Qdrant clusters |
| - **Multi-tenancy requirements** - Weaviate or Qdrant offer better isolation |
| - **Distributed systems** - Milvus provides better horizontal scaling |
| - **Zero-ops cloud solution** - Pinecone handles all infrastructure |
|
|
| ### Why Choose Ruvector Over... |
|
|
| **vs Pinecone:** |
| - β
No API costs (save $1000s/month) |
| - β
No network latency (10x faster queries) |
| - β
No vendor lock-in |
| - β
Works offline and in restricted environments |
| - β No managed multi-region clusters |
|
|
| **vs ChromaDB:** |
| - β
50x faster queries (native Rust vs Python) |
| - β
True Node.js support (not HTTP API) |
| - β
Better TypeScript integration |
| - β
Lower memory usage |
| - β Smaller ecosystem and community |
|
|
| **vs Qdrant:** |
| - β
Zero infrastructure setup |
| - β
Embedded in your app (no Docker) |
| - β
Better for serverless environments |
| - β
Native Node.js bindings |
| - β No built-in clustering or HA |
|
|
| **vs Faiss:** |
| - β
Full Node.js support (Faiss is Python-only) |
| - β
Easier API and better developer experience |
| - β
Built-in persistence and metadata |
| - β οΈ Slightly lower recall at same performance |
|
|
| ## π― Real-World Tutorials |
|
|
| ### Tutorial 1: Building a RAG System with OpenAI |
|
|
| **What you'll learn:** Create a production-ready Retrieval-Augmented Generation system that enhances LLM responses with relevant context from your documents. |
|
|
| **Prerequisites:** |
| ```bash |
| npm install ruvector openai |
| export OPENAI_API_KEY="your-api-key-here" |
| ``` |
|
|
| **Complete Implementation:** |
|
|
| ```javascript |
| const { VectorDb } = require('ruvector'); |
| const OpenAI = require('openai'); |
| |
| class RAGSystem { |
| constructor() { |
| // Initialize OpenAI client |
| this.openai = new OpenAI({ |
| apiKey: process.env.OPENAI_API_KEY |
| }); |
| |
| // Create vector database for OpenAI embeddings |
| // text-embedding-ada-002 produces 1536-dimensional vectors |
| this.db = new VectorDb({ |
| dimensions: 1536, |
| maxElements: 100000, |
| storagePath: './rag-knowledge-base.db' |
| }); |
| |
| console.log('β
RAG System initialized'); |
| } |
| |
| // Step 1: Index your knowledge base |
| async indexDocuments(documents) { |
| console.log(`π Indexing ${documents.length} documents...`); |
| |
| for (let i = 0; i < documents.length; i++) { |
| const doc = documents[i]; |
| |
| // Generate embedding for the document |
| const response = await this.openai.embeddings.create({ |
| model: 'text-embedding-ada-002', |
| input: doc.content |
| }); |
| |
| // Store in vector database |
| await this.db.insert({ |
| id: doc.id || `doc_${i}`, |
| vector: new Float32Array(response.data[0].embedding), |
| metadata: { |
| title: doc.title, |
| content: doc.content, |
| source: doc.source, |
| date: doc.date || new Date().toISOString() |
| } |
| }); |
| |
| console.log(` β
Indexed: ${doc.title}`); |
| } |
| |
| const count = await this.db.len(); |
| console.log(`\nβ
Indexed ${count} documents total`); |
| } |
| |
| // Step 2: Retrieve relevant context for a query |
| async retrieveContext(query, k = 3) { |
| console.log(`π Searching for: "${query}"`); |
| |
| // Generate embedding for the query |
| const response = await this.openai.embeddings.create({ |
| model: 'text-embedding-ada-002', |
| input: query |
| }); |
| |
| // Search for similar documents |
| const results = await this.db.search({ |
| vector: new Float32Array(response.data[0].embedding), |
| k: k, |
| threshold: 0.7 // Only use highly relevant results |
| }); |
| |
| console.log(`π Found ${results.length} relevant documents\n`); |
| |
| return results.map(r => ({ |
| content: r.metadata.content, |
| title: r.metadata.title, |
| score: r.score |
| })); |
| } |
| |
| // Step 3: Generate answer with retrieved context |
| async answer(question) { |
| // Retrieve relevant context |
| const context = await this.retrieveContext(question, 3); |
| |
| if (context.length === 0) { |
| return "I don't have enough information to answer that question."; |
| } |
| |
| // Build prompt with context |
| const contextText = context |
| .map((doc, i) => `[${i + 1}] ${doc.title}\n${doc.content}`) |
| .join('\n\n'); |
| |
| const prompt = `Answer the question based on the following context. If the context doesn't contain the answer, say so. |
| |
| Context: |
| ${contextText} |
| |
| Question: ${question} |
| |
| Answer:`; |
| |
| console.log('π€ Generating answer...\n'); |
| |
| // Generate completion |
| const completion = await this.openai.chat.completions.create({ |
| model: 'gpt-4', |
| messages: [ |
| { role: 'system', content: 'You are a helpful assistant that answers questions based on provided context.' }, |
| { role: 'user', content: prompt } |
| ], |
| temperature: 0.3 // Lower temperature for more factual responses |
| }); |
| |
| return { |
| answer: completion.choices[0].message.content, |
| sources: context.map(c => c.title) |
| }; |
| } |
| } |
| |
| // Example Usage |
| async function main() { |
| const rag = new RAGSystem(); |
| |
| // Step 1: Index your knowledge base |
| const documents = [ |
| { |
| id: 'doc1', |
| title: 'Ruvector Introduction', |
| content: 'Ruvector is a high-performance vector database for Node.js built in Rust. It provides sub-millisecond query latency and supports over 52,000 inserts per second.', |
| source: 'documentation' |
| }, |
| { |
| id: 'doc2', |
| title: 'Vector Databases Explained', |
| content: 'Vector databases store data as high-dimensional vectors, enabling semantic similarity search. They are essential for AI applications like RAG systems and recommendation engines.', |
| source: 'blog' |
| }, |
| { |
| id: 'doc3', |
| title: 'HNSW Algorithm', |
| content: 'Hierarchical Navigable Small World (HNSW) is a graph-based algorithm for approximate nearest neighbor search. It provides excellent recall with low latency.', |
| source: 'research' |
| } |
| ]; |
| |
| await rag.indexDocuments(documents); |
| |
| // Step 2: Ask questions |
| console.log('\n' + '='.repeat(60) + '\n'); |
| |
| const result = await rag.answer('What is Ruvector and what are its performance characteristics?'); |
| |
| console.log('π Answer:', result.answer); |
| console.log('\nπ Sources:', result.sources.join(', ')); |
| } |
| |
| main().catch(console.error); |
| ``` |
|
|
| **Expected Output:** |
| ``` |
| β
RAG System initialized |
| π Indexing 3 documents... |
| β
Indexed: Ruvector Introduction |
| β
Indexed: Vector Databases Explained |
| β
Indexed: HNSW Algorithm |
| |
| β
Indexed 3 documents total |
| |
| ============================================================ |
| |
| π Searching for: "What is Ruvector and what are its performance characteristics?" |
| π Found 2 relevant documents |
| |
| π€ Generating answer... |
| |
| π Answer: Ruvector is a high-performance vector database built in Rust for Node.js applications. Its key performance characteristics include: |
| - Sub-millisecond query latency |
| - Over 52,000 inserts per second |
| - Optimized for semantic similarity search |
| |
| π Sources: Ruvector Introduction, Vector Databases Explained |
| ``` |
|
|
| **Production Tips:** |
| - β
Use batch embedding for better throughput (OpenAI supports up to 2048 texts) |
| - β
Implement caching for frequently asked questions |
| - β
Add error handling for API rate limits |
| - β
Monitor token usage and costs |
| - β
Regularly update your knowledge base |
|
|
| --- |
|
|
| ### Tutorial 2: Semantic Search Engine |
|
|
| **What you'll learn:** Build a semantic search engine that understands meaning, not just keywords. |
|
|
| **Prerequisites:** |
| ```bash |
| npm install ruvector @xenova/transformers |
| ``` |
|
|
| **Complete Implementation:** |
|
|
| ```javascript |
| const { VectorDb } = require('ruvector'); |
| const { pipeline } = require('@xenova/transformers'); |
| |
| class SemanticSearchEngine { |
| constructor() { |
| this.db = null; |
| this.embedder = null; |
| } |
| |
| // Step 1: Initialize the embedding model |
| async initialize() { |
| console.log('π Initializing semantic search engine...'); |
| |
| // Load sentence-transformers model (runs locally, no API needed!) |
| console.log('π₯ Loading embedding model...'); |
| this.embedder = await pipeline( |
| 'feature-extraction', |
| 'Xenova/all-MiniLM-L6-v2' |
| ); |
| |
| // Create vector database (384 dimensions for all-MiniLM-L6-v2) |
| this.db = new VectorDb({ |
| dimensions: 384, |
| maxElements: 50000, |
| storagePath: './semantic-search.db' |
| }); |
| |
| console.log('β
Search engine ready!\n'); |
| } |
| |
| // Step 2: Generate embeddings |
| async embed(text) { |
| const output = await this.embedder(text, { |
| pooling: 'mean', |
| normalize: true |
| }); |
| |
| // Convert to Float32Array |
| return new Float32Array(output.data); |
| } |
| |
| // Step 3: Index documents |
| async indexDocuments(documents) { |
| console.log(`π Indexing ${documents.length} documents...`); |
| |
| for (const doc of documents) { |
| const vector = await this.embed(doc.content); |
| |
| await this.db.insert({ |
| id: doc.id, |
| vector: vector, |
| metadata: { |
| title: doc.title, |
| content: doc.content, |
| category: doc.category, |
| url: doc.url |
| } |
| }); |
| |
| console.log(` β
${doc.title}`); |
| } |
| |
| const count = await this.db.len(); |
| console.log(`\nβ
Indexed ${count} documents\n`); |
| } |
| |
| // Step 4: Semantic search |
| async search(query, options = {}) { |
| const { |
| k = 5, |
| category = null, |
| threshold = 0.3 |
| } = options; |
| |
| console.log(`π Searching for: "${query}"`); |
| |
| // Generate query embedding |
| const queryVector = await this.embed(query); |
| |
| // Search vector database |
| const results = await this.db.search({ |
| vector: queryVector, |
| k: k * 2, // Get more results for filtering |
| threshold: threshold |
| }); |
| |
| // Filter by category if specified |
| let filtered = results; |
| if (category) { |
| filtered = results.filter(r => r.metadata.category === category); |
| } |
| |
| // Return top k after filtering |
| const final = filtered.slice(0, k); |
| |
| console.log(`π Found ${final.length} results\n`); |
| |
| return final.map(r => ({ |
| id: r.id, |
| title: r.metadata.title, |
| content: r.metadata.content, |
| category: r.metadata.category, |
| score: r.score, |
| url: r.metadata.url |
| })); |
| } |
| |
| // Step 5: Find similar documents |
| async findSimilar(documentId, k = 5) { |
| const doc = await this.db.get(documentId); |
| |
| if (!doc) { |
| throw new Error(`Document ${documentId} not found`); |
| } |
| |
| const results = await this.db.search({ |
| vector: doc.vector, |
| k: k + 1 // +1 because the document itself will be included |
| }); |
| |
| // Remove the document itself from results |
| return results |
| .filter(r => r.id !== documentId) |
| .slice(0, k); |
| } |
| } |
| |
| // Example Usage |
| async function main() { |
| const engine = new SemanticSearchEngine(); |
| await engine.initialize(); |
| |
| // Sample documents (in production, load from your database) |
| const documents = [ |
| { |
| id: '1', |
| title: 'Understanding Neural Networks', |
| content: 'Neural networks are computing systems inspired by biological neural networks. They learn to perform tasks by considering examples.', |
| category: 'AI', |
| url: '/docs/neural-networks' |
| }, |
| { |
| id: '2', |
| title: 'Introduction to Machine Learning', |
| content: 'Machine learning is a subset of artificial intelligence that provides systems the ability to learn and improve from experience.', |
| category: 'AI', |
| url: '/docs/machine-learning' |
| }, |
| { |
| id: '3', |
| title: 'Web Development Best Practices', |
| content: 'Modern web development involves responsive design, performance optimization, and accessibility considerations.', |
| category: 'Web', |
| url: '/docs/web-dev' |
| }, |
| { |
| id: '4', |
| title: 'Deep Learning Applications', |
| content: 'Deep learning has revolutionized computer vision, natural language processing, and speech recognition.', |
| category: 'AI', |
| url: '/docs/deep-learning' |
| } |
| ]; |
| |
| // Index documents |
| await engine.indexDocuments(documents); |
| |
| // Example 1: Basic semantic search |
| console.log('Example 1: Basic Search\n' + '='.repeat(60)); |
| const results1 = await engine.search('AI and neural nets'); |
| results1.forEach((result, i) => { |
| console.log(`${i + 1}. ${result.title} (Score: ${result.score.toFixed(3)})`); |
| console.log(` ${result.content.slice(0, 80)}...`); |
| console.log(` Category: ${result.category}\n`); |
| }); |
| |
| // Example 2: Category-filtered search |
| console.log('\nExample 2: Category-Filtered Search\n' + '='.repeat(60)); |
| const results2 = await engine.search('learning algorithms', { |
| category: 'AI', |
| k: 3 |
| }); |
| results2.forEach((result, i) => { |
| console.log(`${i + 1}. ${result.title} (Score: ${result.score.toFixed(3)})`); |
| }); |
| |
| // Example 3: Find similar documents |
| console.log('\n\nExample 3: Find Similar Documents\n' + '='.repeat(60)); |
| const similar = await engine.findSimilar('1', 2); |
| console.log('Documents similar to "Understanding Neural Networks":'); |
| similar.forEach((doc, i) => { |
| console.log(`${i + 1}. ${doc.metadata.title} (Score: ${doc.score.toFixed(3)})`); |
| }); |
| } |
| |
| main().catch(console.error); |
| ``` |
|
|
| **Key Features:** |
| - β
Runs completely locally (no API keys needed) |
| - β
Understands semantic meaning, not just keywords |
| - β
Category filtering for better results |
| - β
"Find similar" functionality |
| - β
Fast: ~10ms query latency |
|
|
| --- |
|
|
| ### Tutorial 3: AI Agent Memory System |
|
|
| **What you'll learn:** Implement a memory system for AI agents that remembers past experiences and learns from them. |
|
|
| **Complete Implementation:** |
|
|
| ```javascript |
| const { VectorDb } = require('ruvector'); |
| |
| class AgentMemory { |
| constructor(agentId) { |
| this.agentId = agentId; |
| |
| // Create separate databases for different memory types |
| this.episodicMemory = new VectorDb({ |
| dimensions: 768, |
| storagePath: `./memory/${agentId}-episodic.db` |
| }); |
| |
| this.semanticMemory = new VectorDb({ |
| dimensions: 768, |
| storagePath: `./memory/${agentId}-semantic.db` |
| }); |
| |
| console.log(`π§ Memory system initialized for agent: ${agentId}`); |
| } |
| |
| // Step 1: Store an experience (episodic memory) |
| async storeExperience(experience) { |
| const { |
| state, |
| action, |
| result, |
| reward, |
| embedding |
| } = experience; |
| |
| const experienceId = `exp_${Date.now()}_${Math.random()}`; |
| |
| await this.episodicMemory.insert({ |
| id: experienceId, |
| vector: new Float32Array(embedding), |
| metadata: { |
| state: state, |
| action: action, |
| result: result, |
| reward: reward, |
| timestamp: Date.now(), |
| type: 'episodic' |
| } |
| }); |
| |
| console.log(`πΎ Stored experience: ${action} -> ${result} (reward: ${reward})`); |
| return experienceId; |
| } |
| |
| // Step 2: Store learned knowledge (semantic memory) |
| async storeKnowledge(knowledge) { |
| const { |
| concept, |
| description, |
| embedding, |
| confidence = 1.0 |
| } = knowledge; |
| |
| const knowledgeId = `know_${Date.now()}`; |
| |
| await this.semanticMemory.insert({ |
| id: knowledgeId, |
| vector: new Float32Array(embedding), |
| metadata: { |
| concept: concept, |
| description: description, |
| confidence: confidence, |
| learned: Date.now(), |
| uses: 0, |
| type: 'semantic' |
| } |
| }); |
| |
| console.log(`π Learned: ${concept}`); |
| return knowledgeId; |
| } |
| |
| // Step 3: Recall similar experiences |
| async recallExperiences(currentState, k = 5) { |
| console.log(`π Recalling similar experiences...`); |
| |
| const results = await this.episodicMemory.search({ |
| vector: new Float32Array(currentState.embedding), |
| k: k, |
| threshold: 0.6 // Only recall reasonably similar experiences |
| }); |
| |
| // Sort by reward to prioritize successful experiences |
| const sorted = results.sort((a, b) => b.metadata.reward - a.metadata.reward); |
| |
| console.log(`π Recalled ${sorted.length} relevant experiences`); |
| |
| return sorted.map(r => ({ |
| state: r.metadata.state, |
| action: r.metadata.action, |
| result: r.metadata.result, |
| reward: r.metadata.reward, |
| similarity: r.score |
| })); |
| } |
| |
| // Step 4: Query knowledge base |
| async queryKnowledge(query, k = 3) { |
| const results = await this.semanticMemory.search({ |
| vector: new Float32Array(query.embedding), |
| k: k |
| }); |
| |
| // Update usage statistics |
| for (const result of results) { |
| const knowledge = await this.semanticMemory.get(result.id); |
| if (knowledge) { |
| knowledge.metadata.uses += 1; |
| // In production, update the entry |
| } |
| } |
| |
| return results.map(r => ({ |
| concept: r.metadata.concept, |
| description: r.metadata.description, |
| confidence: r.metadata.confidence, |
| relevance: r.score |
| })); |
| } |
| |
| // Step 5: Reflect and learn from experiences |
| async reflect() { |
| console.log('\nπ€ Reflecting on experiences...'); |
| |
| // Get all experiences |
| const totalExperiences = await this.episodicMemory.len(); |
| console.log(`π Total experiences: ${totalExperiences}`); |
| |
| // Analyze success rate |
| // In production, you'd aggregate experiences and extract patterns |
| console.log('π‘ Analysis complete'); |
| |
| return { |
| totalExperiences: totalExperiences, |
| knowledgeItems: await this.semanticMemory.len() |
| }; |
| } |
| |
| // Step 6: Get memory statistics |
| async getStats() { |
| return { |
| episodicMemorySize: await this.episodicMemory.len(), |
| semanticMemorySize: await this.semanticMemory.len(), |
| agentId: this.agentId |
| }; |
| } |
| } |
| |
| // Example Usage: Simulated agent learning to navigate |
| async function main() { |
| const agent = new AgentMemory('agent-001'); |
| |
| // Simulate embedding function (in production, use a real model) |
| function embed(text) { |
| return Array(768).fill(0).map(() => Math.random()); |
| } |
| |
| console.log('\n' + '='.repeat(60)); |
| console.log('PHASE 1: Learning from experiences'); |
| console.log('='.repeat(60) + '\n'); |
| |
| // Store some experiences |
| await agent.storeExperience({ |
| state: { location: 'room1', goal: 'room3' }, |
| action: 'move_north', |
| result: 'reached room2', |
| reward: 0.5, |
| embedding: embed('navigating from room1 to room2') |
| }); |
| |
| await agent.storeExperience({ |
| state: { location: 'room2', goal: 'room3' }, |
| action: 'move_east', |
| result: 'reached room3', |
| reward: 1.0, |
| embedding: embed('navigating from room2 to room3') |
| }); |
| |
| await agent.storeExperience({ |
| state: { location: 'room1', goal: 'room3' }, |
| action: 'move_south', |
| result: 'hit wall', |
| reward: -0.5, |
| embedding: embed('failed navigation attempt') |
| }); |
| |
| // Store learned knowledge |
| await agent.storeKnowledge({ |
| concept: 'navigation_strategy', |
| description: 'Moving north then east is efficient for reaching room3 from room1', |
| embedding: embed('navigation strategy knowledge'), |
| confidence: 0.9 |
| }); |
| |
| console.log('\n' + '='.repeat(60)); |
| console.log('PHASE 2: Applying memory'); |
| console.log('='.repeat(60) + '\n'); |
| |
| // Agent encounters a similar situation |
| const currentState = { |
| location: 'room1', |
| goal: 'room3', |
| embedding: embed('navigating from room1 to room3') |
| }; |
| |
| // Recall relevant experiences |
| const experiences = await agent.recallExperiences(currentState, 3); |
| |
| console.log('\nπ Recalled experiences:'); |
| experiences.forEach((exp, i) => { |
| console.log(`${i + 1}. Action: ${exp.action} | Result: ${exp.result} | Reward: ${exp.reward} | Similarity: ${exp.similarity.toFixed(3)}`); |
| }); |
| |
| // Query relevant knowledge |
| const knowledge = await agent.queryKnowledge({ |
| embedding: embed('how to navigate efficiently') |
| }, 2); |
| |
| console.log('\nπ Relevant knowledge:'); |
| knowledge.forEach((k, i) => { |
| console.log(`${i + 1}. ${k.concept}: ${k.description} (confidence: ${k.confidence})`); |
| }); |
| |
| console.log('\n' + '='.repeat(60)); |
| console.log('PHASE 3: Reflection'); |
| console.log('='.repeat(60) + '\n'); |
| |
| // Reflect on learning |
| const stats = await agent.reflect(); |
| const memoryStats = await agent.getStats(); |
| |
| console.log('\nπ Memory Statistics:'); |
| console.log(` Episodic memories: ${memoryStats.episodicMemorySize}`); |
| console.log(` Semantic knowledge: ${memoryStats.semanticMemorySize}`); |
| console.log(` Agent ID: ${memoryStats.agentId}`); |
| } |
| |
| main().catch(console.error); |
| ``` |
|
|
| **Expected Output:** |
| ``` |
| π§ Memory system initialized for agent: agent-001 |
| |
| ============================================================ |
| PHASE 1: Learning from experiences |
| ============================================================ |
| |
| πΎ Stored experience: move_north -> reached room2 (reward: 0.5) |
| πΎ Stored experience: move_east -> reached room3 (reward: 1.0) |
| πΎ Stored experience: move_south -> hit wall (reward: -0.5) |
| π Learned: navigation_strategy |
| |
| ============================================================ |
| PHASE 2: Applying memory |
| ============================================================ |
| |
| π Recalling similar experiences... |
| π Recalled 3 relevant experiences |
| |
| π Recalled experiences: |
| 1. Action: move_east | Result: reached room3 | Reward: 1.0 | Similarity: 0.892 |
| 2. Action: move_north | Result: reached room2 | Reward: 0.5 | Similarity: 0.876 |
| 3. Action: move_south | Result: hit wall | Reward: -0.5 | Similarity: 0.654 |
| |
| π Relevant knowledge: |
| 1. navigation_strategy: Moving north then east is efficient for reaching room3 from room1 (confidence: 0.9) |
| |
| ============================================================ |
| PHASE 3: Reflection |
| ============================================================ |
| |
| π€ Reflecting on experiences... |
| π Total experiences: 3 |
| π‘ Analysis complete |
| |
| π Memory Statistics: |
| Episodic memories: 3 |
| Semantic knowledge: 1 |
| Agent ID: agent-001 |
| ``` |
|
|
| **Use Cases:** |
| - β
Reinforcement learning agents |
| - β
Chatbot conversation history |
| - β
Game AI that learns from gameplay |
| - β
Personal assistant memory |
| - β
Robotic navigation systems |
|
|
| ## ποΈ API Reference |
|
|
| ### Constructor |
|
|
| ```typescript |
| new VectorDb(options: { |
| dimensions: number; // Vector dimensionality (required) |
| maxElements?: number; // Max vectors (default: 10000) |
| storagePath?: string; // Persistent storage path |
| ef_construction?: number; // HNSW construction parameter (default: 200) |
| m?: number; // HNSW M parameter (default: 16) |
| distanceMetric?: string; // 'cosine', 'euclidean', or 'dot' (default: 'cosine') |
| }) |
| ``` |
|
|
| ### Methods |
|
|
| #### insert(entry: VectorEntry): Promise<string> |
| Insert a vector into the database. |
|
|
| ```javascript |
| const id = await db.insert({ |
| id: 'doc_1', |
| vector: new Float32Array([0.1, 0.2, 0.3, ...]), |
| metadata: { title: 'Document 1' } |
| }); |
| ``` |
|
|
| #### search(query: SearchQuery): Promise<SearchResult[]> |
| Search for similar vectors. |
|
|
| ```javascript |
| const results = await db.search({ |
| vector: new Float32Array([0.1, 0.2, 0.3, ...]), |
| k: 10, |
| threshold: 0.7 |
| }); |
| ``` |
|
|
| #### get(id: string): Promise<VectorEntry | null> |
| Retrieve a vector by ID. |
|
|
| ```javascript |
| const entry = await db.get('doc_1'); |
| if (entry) { |
| console.log(entry.vector, entry.metadata); |
| } |
| ``` |
|
|
| #### delete(id: string): Promise<boolean> |
| Remove a vector from the database. |
|
|
| ```javascript |
| const deleted = await db.delete('doc_1'); |
| console.log(deleted ? 'Deleted' : 'Not found'); |
| ``` |
|
|
| #### len(): Promise<number> |
| Get the total number of vectors. |
|
|
| ```javascript |
| const count = await db.len(); |
| console.log(`Total vectors: ${count}`); |
| ``` |
|
|
| ## π¨ Advanced Configuration |
|
|
| ### HNSW Parameters |
|
|
| ```javascript |
| const db = new VectorDb({ |
| dimensions: 384, |
| maxElements: 1000000, |
| ef_construction: 200, // Higher = better recall, slower build |
| m: 16, // Higher = better recall, more memory |
| storagePath: './large-db.db' |
| }); |
| ``` |
|
|
| **Parameter Guidelines:** |
| - `ef_construction`: 100-400 (higher = better recall, slower indexing) |
| - `m`: 8-64 (higher = better recall, more memory) |
| - Default values work well for most use cases |
|
|
| ### Distance Metrics |
|
|
| ```javascript |
| // Cosine similarity (default, best for normalized vectors) |
| const db1 = new VectorDb({ |
| dimensions: 128, |
| distanceMetric: 'cosine' |
| }); |
| |
| // Euclidean distance (L2, best for spatial data) |
| const db2 = new VectorDb({ |
| dimensions: 128, |
| distanceMetric: 'euclidean' |
| }); |
| |
| // Dot product (best for pre-normalized vectors) |
| const db3 = new VectorDb({ |
| dimensions: 128, |
| distanceMetric: 'dot' |
| }); |
| ``` |
|
|
| ### Persistence |
|
|
| ```javascript |
| // Auto-save to disk |
| const persistent = new VectorDb({ |
| dimensions: 128, |
| storagePath: './persistent.db' |
| }); |
| |
| // In-memory only (faster, but data lost on exit) |
| const temporary = new VectorDb({ |
| dimensions: 128 |
| // No storagePath = in-memory |
| }); |
| ``` |
|
|
| ## π¦ Platform Support |
|
|
| Automatically installs the correct implementation for: |
|
|
| ### Native (Rust) - Best Performance |
| - **Linux**: x64, ARM64 (GNU libc) |
| - **macOS**: x64 (Intel), ARM64 (Apple Silicon) |
| - **Windows**: x64 (MSVC) |
|
|
| Performance: **<0.5ms latency**, **50K+ ops/sec** |
|
|
| ### WASM Fallback - Universal Compatibility |
| - Any platform where native module isn't available |
| - Browser environments (experimental) |
| - Alpine Linux (musl) and other non-glibc systems |
|
|
| Performance: **10-50ms latency**, **~1K ops/sec** |
|
|
| **Node.js 18+ required** for all platforms. |
|
|
| ## π§ Building from Source |
|
|
| If you need to rebuild the native module: |
|
|
| ```bash |
| # Install Rust toolchain |
| curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
| |
| # Clone repository |
| git clone https://github.com/ruvnet/ruvector.git |
| cd ruvector |
| |
| # Build native module |
| cd npm/packages/core |
| npm run build:napi |
| |
| # Build wrapper package |
| cd ../ruvector |
| npm install |
| npm run build |
| |
| # Run tests |
| npm test |
| ``` |
|
|
| **Requirements:** |
| - Rust 1.77+ |
| - Node.js 18+ |
| - Cargo |
|
|
| ## π Ecosystem |
|
|
| ### Related Packages |
|
|
| - **[ruvector-core](https://www.npmjs.com/package/ruvector-core)** - Core native bindings (lower-level API) |
| - **[ruvector-wasm](https://www.npmjs.com/package/ruvector-wasm)** - WebAssembly implementation for browsers |
| - **[ruvector-cli](https://www.npmjs.com/package/ruvector-cli)** - Standalone CLI tools |
| - **[@ruvector/rvf](https://www.npmjs.com/package/@ruvector/rvf)** - RVF cognitive container SDK |
| - **[@ruvector/rvf-wasm](https://www.npmjs.com/package/@ruvector/rvf-wasm)** - RVF WASM build for browsers, Deno, and edge |
| - **[rvlite](https://www.npmjs.com/package/rvlite)** - Lightweight vector database with SQL, SPARQL, and Cypher |
|
|
| ### Platform-Specific Packages (auto-installed) |
|
|
| - **[ruvector-core-linux-x64-gnu](https://www.npmjs.com/package/ruvector-core-linux-x64-gnu)** |
| - **[ruvector-core-linux-arm64-gnu](https://www.npmjs.com/package/ruvector-core-linux-arm64-gnu)** |
| - **[ruvector-core-darwin-x64](https://www.npmjs.com/package/ruvector-core-darwin-x64)** |
| - **[ruvector-core-darwin-arm64](https://www.npmjs.com/package/ruvector-core-darwin-arm64)** |
| - **[ruvector-core-win32-x64-msvc](https://www.npmjs.com/package/ruvector-core-win32-x64-msvc)** |
|
|
| --- |
|
|
| ## RVF Cognitive Containers |
|
|
| Ruvector integrates with [RVF (RuVector Format)](https://github.com/ruvnet/ruvector/tree/main/crates/rvf) β a universal binary substrate that stores vectors, models, graphs, compute kernels, and attestation in a single `.rvf` file. |
|
|
| ### Enable RVF Backend |
|
|
| ```bash |
| # Install the optional RVF package |
| npm install @ruvector/rvf |
| |
| # Set backend via environment variable |
| export RUVECTOR_BACKEND=rvf |
| |
| # Or detect automatically (native -> rvf -> wasm fallback) |
| npx ruvector info |
| ``` |
|
|
| ```typescript |
| import { getImplementationType, isRvf } from 'ruvector'; |
| |
| console.log(getImplementationType()); // 'native' | 'rvf' | 'wasm' |
| console.log(isRvf()); // true if RVF backend is active |
| ``` |
|
|
| ### RVF CLI Commands |
|
|
| 8 RVF-specific subcommands are available through the ruvector CLI: |
|
|
| ```bash |
| # Create an RVF store |
| npx ruvector rvf create mydb.rvf -d 384 --metric cosine |
| |
| # Ingest vectors from JSON |
| npx ruvector rvf ingest mydb.rvf --input vectors.json --format json |
| |
| # Query nearest neighbors |
| npx ruvector rvf query mydb.rvf --vector "[0.1,0.2,...]" --k 10 |
| |
| # File status and segment listing |
| npx ruvector rvf status mydb.rvf |
| npx ruvector rvf segments mydb.rvf |
| |
| # COW branching β derive a child file |
| npx ruvector rvf derive mydb.rvf --output child.rvf |
| |
| # Compact and reclaim space |
| npx ruvector rvf compact mydb.rvf |
| |
| # Export to JSON |
| npx ruvector rvf export mydb.rvf --output dump.json |
| ``` |
|
|
| ### RVF Platform Support |
|
|
| | Platform | Runtime | Backend | |
| |----------|---------|---------| |
| | Linux x86_64 / aarch64 | Node.js 18+ | Native (N-API) | |
| | macOS x86_64 / arm64 | Node.js 18+ | Native (N-API) | |
| | Windows x86_64 | Node.js 18+ | Native (N-API) | |
| | Any | Deno | WASM (`@ruvector/rvf-wasm`) | |
| | Any | Browser | WASM (`@ruvector/rvf-wasm`) | |
| | Any | Cloudflare Workers | WASM (`@ruvector/rvf-wasm`) | |
| |
| ### Download Example .rvf Files |
| |
| 45 pre-built example files are available (~11 MB total): |
| |
| ```bash |
| # Download a specific example |
| curl -LO https://raw.githubusercontent.com/ruvnet/ruvector/main/examples/rvf/output/basic_store.rvf |
|
|
| # Popular examples: |
| # basic_store.rvf (152 KB) β 1,000 vectors, dim 128 |
| # semantic_search.rvf (755 KB) β Semantic search with HNSW |
| # rag_pipeline.rvf (303 KB) β RAG pipeline embeddings |
| # agent_memory.rvf (32 KB) β AI agent memory store |
| # self_booting.rvf (31 KB) β Self-booting with kernel |
| # progressive_index.rvf (2.5 MB) β Large-scale HNSW index |
|
|
| # Generate all examples locally |
| cd crates/rvf && cargo run --example generate_all |
| ``` |
| |
| Full catalog: [examples/rvf/output/](https://github.com/ruvnet/ruvector/tree/main/examples/rvf/output) |
| |
| ### Working Examples: Cognitive Containers |
| |
| #### Self-Booting Microservice |
| |
| A single `.rvf` file that contains vectors AND a bootable Linux kernel: |
| |
| ```bash |
| # Build and run the self-booting example |
| cd crates/rvf && cargo run --example self_booting |
| # Output: |
| # Ingested 50 vectors (128 dims) |
| # Pre-kernel query: top-5 results OK (nearest ID=25) |
| # Kernel: 4,640 bytes embedded (x86_64, Hermit) |
| # Witness chain: 5 entries, all verified |
| # File: bootable.rvf (31 KB) β data + runtime in one file |
| ``` |
| |
| ```rust |
| // The pattern: vectors + kernel + witness in one file |
| let mut store = RvfStore::create("bootable.rvf", options)?; |
| store.ingest_batch(&vectors, &ids, None)?; |
| store.embed_kernel(KernelArch::X86_64 as u8, KernelType::Hermit as u8, |
| 0x0018, &kernel_image, 8080, Some("console=ttyS0 quiet"))?; |
| // Result: drop on a VM and it boots as a query service |
| ``` |
| |
| #### Linux Microkernel Distribution |
|
|
| 20-package Linux distro with SSH keys and kernel in a single file: |
|
|
| ```bash |
| cd crates/rvf && cargo run --example linux_microkernel |
| # Output: |
| # Installed 20 packages as vector embeddings |
| # Kernel embedded: Linux x86_64 (4,640 bytes) |
| # SSH keys: Ed25519, signed and verified |
| # Witness chain: 22 entries (1 per package + kernel + SSH) |
| # File: microkernel.rvf (14 KB) β immutable bootable system |
| ``` |
|
|
| Features: package search by embedding similarity, Ed25519 signed SSH keys, witness-audited installs, COW-derived child images for atomic updates. |
|
|
| #### Claude Code AI Appliance |
|
|
| A sealed, bootable AI development environment: |
|
|
| ```bash |
| cd crates/rvf && cargo run --example claude_code_appliance |
| # Output: |
| # 20 dev packages (rust, node, python, docker, ...) |
| # Kernel: Linux x86_64 with SSH on port 2222 |
| # eBPF: XDP distance program for fast-path lookups |
| # Witness chain: 6 entries, all verified |
| # Crypto: Ed25519 signature |
| # File: claude_code_appliance.rvf (17 KB) |
| ``` |
|
|
| #### CLI Full Lifecycle |
|
|
| ```bash |
| # Create β Ingest β Query β Derive β Inspect |
| rvf create vectors.rvf --dimension 384 |
| rvf ingest vectors.rvf --input data.json --format json |
| rvf query vectors.rvf --vector "0.1,0.2,..." --k 10 |
| rvf derive vectors.rvf child.rvf --type filter |
| rvf inspect vectors.rvf |
| |
| # Embed kernel and launch as microVM |
| rvf embed-kernel vectors.rvf --image bzImage |
| rvf launch vectors.rvf --port 8080 |
| |
| # Verify tamper-evident witness chain |
| rvf verify-witness vectors.rvf |
| rvf verify-attestation vectors.rvf |
| ``` |
|
|
| #### Integration Tests (46 passing) |
|
|
| ```bash |
| cd crates/rvf |
| cargo test --workspace |
| # attestation .............. 6 passed |
| # crypto ................... 10 passed |
| # computational_container .. 8 passed |
| # cow_branching ............ 8 passed |
| # cross_platform ........... 6 passed |
| # lineage .................. 4 passed |
| # smoke .................... 4 passed |
| # Total: 46/46 passed |
| ``` |
|
|
| ## π Troubleshooting |
|
|
| ### Native Module Not Loading |
|
|
| If you see "Cannot find module 'ruvector-core-*'": |
| |
| ```bash |
| # Reinstall with optional dependencies |
| npm install --include=optional ruvector |
| |
| # Verify platform |
| npx ruvector info |
| |
| # Check Node.js version (18+ required) |
| node --version |
| ``` |
| |
| ### WASM Fallback Performance |
| |
| If you're using WASM fallback and need better performance: |
| |
| 1. **Install native toolchain** for your platform |
| 2. **Rebuild native module**: `npm rebuild ruvector` |
| 3. **Verify native**: `npx ruvector info` should show "native (Rust)" |
| |
| ### Platform Compatibility |
| |
| - **Alpine Linux**: Uses WASM fallback (musl not supported) |
| - **Windows ARM**: Not yet supported, uses WASM fallback |
| - **Node.js < 18**: Not supported, upgrade to Node.js 18+ |
| |
| ## π Documentation |
| |
| - π [Homepage](https://ruv.io) |
| - π¦ [GitHub Repository](https://github.com/ruvnet/ruvector) |
| - π [Full Documentation](https://github.com/ruvnet/ruvector/tree/main/docs) |
| - π [Getting Started Guide](https://github.com/ruvnet/ruvector/blob/main/docs/guide/GETTING_STARTED.md) |
| - π [API Reference](https://github.com/ruvnet/ruvector/blob/main/docs/api/NODEJS_API.md) |
| - π― [Performance Tuning](https://github.com/ruvnet/ruvector/blob/main/docs/optimization/PERFORMANCE_TUNING_GUIDE.md) |
| - π [Issue Tracker](https://github.com/ruvnet/ruvector/issues) |
| - π¬ [Discussions](https://github.com/ruvnet/ruvector/discussions) |
| |
| ## π€ Contributing |
| |
| We welcome contributions! See [CONTRIBUTING.md](https://github.com/ruvnet/ruvector/blob/main/docs/development/CONTRIBUTING.md) for guidelines. |
| |
| ### Quick Start |
| |
| 1. Fork the repository |
| 2. Create a feature branch: `git checkout -b feature/amazing-feature` |
| 3. Commit changes: `git commit -m 'Add amazing feature'` |
| 4. Push to branch: `git push origin feature/amazing-feature` |
| 5. Open a Pull Request |
| |
| ## π Community & Support |
| |
| - **GitHub**: [github.com/ruvnet/ruvector](https://github.com/ruvnet/ruvector) - β Star and follow |
| - **Discord**: [Join our community](https://discord.gg/ruvnet) - Chat with developers |
| - **Twitter**: [@ruvnet](https://twitter.com/ruvnet) - Follow for updates |
| - **Issues**: [Report bugs](https://github.com/ruvnet/ruvector/issues) |
| |
| ### Enterprise Support |
| |
| Need custom development or consulting? |
| |
| π§ [enterprise@ruv.io](mailto:enterprise@ruv.io) |
| |
| ## π License |
| |
| **MIT License** - see [LICENSE](https://github.com/ruvnet/ruvector/blob/main/LICENSE) for details. |
| |
| Free for commercial and personal use. |
| |
| ## π Acknowledgments |
| |
| Built with battle-tested technologies: |
| |
| - **HNSW**: Hierarchical Navigable Small World graphs |
| - **SIMD**: Hardware-accelerated vector operations via simsimd |
| - **Rust**: Memory-safe, zero-cost abstractions |
| - **NAPI-RS**: High-performance Node.js bindings |
| - **WebAssembly**: Universal browser compatibility |
| |
| --- |
| |
| <div align="center"> |
| |
| **Built with β€οΈ by [rUv](https://ruv.io)** |
| |
| [](https://www.npmjs.com/package/ruvector) |
| [](https://github.com/ruvnet/ruvector) |
| [](https://twitter.com/ruvnet) |
| |
| **[Get Started](https://github.com/ruvnet/ruvector/blob/main/docs/guide/GETTING_STARTED.md)** β’ **[Documentation](https://github.com/ruvnet/ruvector/tree/main/docs)** β’ **[API Reference](https://github.com/ruvnet/ruvector/blob/main/docs/api/NODEJS_API.md)** β’ **[Contributing](https://github.com/ruvnet/ruvector/blob/main/docs/development/CONTRIBUTING.md)** |
| |
| </div> |
| |