ruvector/crates/ruvector-tiny-dancer-node
ruv 18f66c14d3 feat(tiny-dancer): Pandora-pattern value-of-information routing — closed-form Gaussian VoI estimator purchasing (PIR WP28, ADR-331)
Routing as information economics, after "Pandora's AI Model Routing Box:
Efficient Allocation with Costly Value Estimation" (arXiv:2608.20316,
reproduction-from-description — no upstream code): purchase a costlier
estimator only when expected_quality_gain x value_of_success exceeds
estimator cost + priced latency.

- New ruvector_tiny_dancer_core::voi module: Belief / EstimatorSpec /
  VoiConfig / VoiDecision, closed-form Gaussian VoI via the expected-
  improvement integral (s^2 = sigma^4/(sigma^2+tau^2), derivation in
  module docs), greedy index-policy decide(), Bayesian observe(),
  voi_upper_bound() = s*phi(0).
- Non-finite inputs rejected at the choke point before any comparison
  (Wave-3 non-finite-bypass lesson); property tests: never buys above
  the VoI upper bound, free perfect estimator always bought (within
  float representability), posterior variance monotone non-increasing,
  deterministic decisions.
- Optional, off-by-default RouterConfig.voi gate (serde(default)):
  escalation to the powerful model modeled as an estimator purchase
  against the confidence threshold; legacy threshold rule untouched
  when unset. Invalid gates rejected at Router::new.
- Standalone pub API documented for reuse by model selection, retrieval
  depth, verifier calls, and escalation.
- Criterion micro-bench: 3-estimator decision = 43 ns.

Co-Authored-By: claude-flow <ruv@ruv.net>
Claude-Session: https://claude.ai/code/session_016QSCkKnxDjqU49NVVpWMK5
2026-08-22 09:39:20 -04:00
..
src feat(tiny-dancer): Pandora-pattern value-of-information routing — closed-form Gaussian VoI estimator purchasing (PIR WP28, ADR-331) 2026-08-22 09:39:20 -04:00
.npmignore feat: Add NAPI-RS npm packages for tiny-dancer and router 2025-11-27 05:55:06 +00:00
build.rs fix: Fix case sensitivity bug preventing native module from loading 2025-11-21 21:34:52 +00:00
Cargo.toml fix(tiny-dancer): lock-step platform versioning + drop dead release profile 2026-06-15 08:39:20 -04:00
package.json chore: Bump version to 0.1.16 for npm package release 2025-11-27 21:48:12 +00:00
README.md docs: Add README files for all crates and update root README with crates table 2025-11-26 18:15:05 +00:00

Ruvector Tiny Dancer Node

npm Crates.io License: MIT

Node.js bindings for Tiny Dancer neural routing via NAPI-RS.

ruvector-tiny-dancer-node provides native Node.js bindings for production-grade AI agent routing. Run FastGRNN neural inference at native speed for intelligent request routing in server-side applications. Part of the Ruvector ecosystem.

Why Tiny Dancer Node?

  • Native Performance: Rust speed in Node.js
  • Production Ready: Battle-tested in high-throughput systems
  • Async/Await: Non-blocking inference operations
  • TypeScript: Complete type definitions included
  • Multi-Threaded: Leverage all CPU cores

Features

Core Capabilities

  • Neural Inference: FastGRNN model execution
  • Model Training: Train custom routing models
  • Feature Engineering: Request feature extraction
  • Persistent Storage: SQLite-backed model storage
  • Batch Processing: Efficient batch inference

Advanced Features

  • Model Versioning: Manage multiple model versions
  • A/B Testing: Route comparison and testing
  • Metrics: Performance and accuracy tracking
  • Hot Reload: Update models without restart
  • Distributed: Coordinate across instances

Installation

npm install @ruvector/tiny-dancer-node
# or
yarn add @ruvector/tiny-dancer-node
# or
pnpm add @ruvector/tiny-dancer-node

Quick Start

Basic Routing

import { TinyDancer, RouteRequest } from '@ruvector/tiny-dancer-node';

// Create router instance
const router = new TinyDancer({
  modelPath: './models/router.db',
});

// Initialize
await router.init();

// Route request
const result = await router.route({
  query: "What is the weather like today?",
  context: {
    userId: "user-123",
    sessionLength: 5,
  },
  agents: ["weather", "general", "calendar"],
});

console.log(`Route to: ${result.agent} (confidence: ${result.confidence})`);

Model Training

import { TinyDancer, TrainingData } from '@ruvector/tiny-dancer-node';

const router = new TinyDancer();
await router.init();

// Prepare training data
const trainingData: TrainingData[] = [
  {
    query: "What's the weather?",
    correctAgent: "weather",
    context: { category: "weather" },
  },
  {
    query: "Schedule a meeting",
    correctAgent: "calendar",
    context: { category: "scheduling" },
  },
  // ... more examples
];

// Train model
const result = await router.train({
  data: trainingData,
  epochs: 100,
  learningRate: 0.001,
  validationSplit: 0.2,
});

console.log(`Training accuracy: ${result.accuracy}`);
console.log(`Validation accuracy: ${result.validationAccuracy}`);

// Save model
await router.saveModel('./models/custom-router.bin');

Performance Monitoring

import { TinyDancer } from '@ruvector/tiny-dancer-node';

const router = new TinyDancer({ enableMetrics: true });
await router.init();

// Route with metrics
const result = await router.route(request);

// Get performance metrics
const metrics = router.getMetrics();
console.log(`Average latency: ${metrics.avgLatencyMs}ms`);
console.log(`P99 latency: ${metrics.p99LatencyMs}ms`);
console.log(`Requests/sec: ${metrics.requestsPerSecond}`);
console.log(`Cache hit rate: ${metrics.cacheHitRate}`);

API Reference

TinyDancer Class

class TinyDancer {
  constructor(config?: TinyDancerConfig);

  // Lifecycle
  init(): Promise<void>;
  close(): Promise<void>;

  // Routing
  route(request: RouteRequest): Promise<RouteResult>;
  routeBatch(requests: RouteRequest[]): Promise<RouteResult[]>;

  // Training
  train(options: TrainOptions): Promise<TrainResult>;
  loadModel(path: string): Promise<void>;
  saveModel(path: string): Promise<void>;

  // Scoring
  scoreAgents(request: RouteRequest): Promise<AgentScore[]>;

  // Metrics
  getMetrics(): RouterMetrics;
  resetMetrics(): void;
}

Types

interface TinyDancerConfig {
  modelPath?: string;
  enableMetrics?: boolean;
  cacheSize?: number;
  numThreads?: number;
}

interface RouteRequest {
  query: string;
  context?: Record<string, any>;
  agents: string[];
  constraints?: RouteConstraints;
}

interface RouteResult {
  agent: string;
  confidence: number;
  scores: Record<string, number>;
  latencyMs: number;
}

interface TrainOptions {
  data: TrainingData[];
  epochs: number;
  learningRate: number;
  validationSplit?: number;
  batchSize?: number;
}

interface TrainResult {
  accuracy: number;
  validationAccuracy: number;
  loss: number;
  epochs: number;
  trainingTimeMs: number;
}

interface RouterMetrics {
  totalRequests: number;
  avgLatencyMs: number;
  p50LatencyMs: number;
  p99LatencyMs: number;
  requestsPerSecond: number;
  cacheHitRate: number;
}

Express Integration

import express from 'express';
import { TinyDancer } from '@ruvector/tiny-dancer-node';

const app = express();
const router = new TinyDancer();

app.use(express.json());

app.post('/route', async (req, res) => {
  const result = await router.route({
    query: req.body.query,
    context: req.body.context,
    agents: ['agent-a', 'agent-b', 'agent-c'],
  });

  res.json(result);
});

app.listen(3000);

Platform Support

Platform Architecture Status
Linux x64
Linux arm64
macOS x64
macOS arm64 (M1/M2)
Windows x64

Building from Source

# Clone repository
git clone https://github.com/ruvnet/ruvector.git
cd ruvector/crates/ruvector-tiny-dancer-node

# Install dependencies
npm install

# Build native module
npm run build

# Run tests
npm test

Documentation

License

MIT License - see LICENSE for details.


Part of Ruvector - Built by rUv

Star on GitHub

Documentation | npm | GitHub