@ruvector/ruvllm 0.2.4 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +413 -293
  2. package/bin/cli.js +619 -2
  3. package/dist/cjs/benchmarks/embedding-benchmark.d.ts +102 -0
  4. package/dist/cjs/benchmarks/embedding-benchmark.d.ts.map +1 -0
  5. package/dist/cjs/benchmarks/embedding-benchmark.js +436 -0
  6. package/dist/cjs/benchmarks/index.d.ts +34 -0
  7. package/dist/cjs/benchmarks/index.d.ts.map +1 -0
  8. package/dist/cjs/benchmarks/index.js +132 -0
  9. package/dist/cjs/benchmarks/model-comparison.d.ts +71 -0
  10. package/dist/cjs/benchmarks/model-comparison.d.ts.map +1 -0
  11. package/dist/cjs/benchmarks/model-comparison.js +476 -0
  12. package/dist/cjs/benchmarks/routing-benchmark.d.ts +70 -0
  13. package/dist/cjs/benchmarks/routing-benchmark.d.ts.map +1 -0
  14. package/dist/cjs/benchmarks/routing-benchmark.js +289 -0
  15. package/dist/cjs/contrastive.d.ts +229 -0
  16. package/dist/cjs/contrastive.d.ts.map +1 -0
  17. package/dist/cjs/contrastive.js +589 -0
  18. package/dist/cjs/engine.d.ts +3 -0
  19. package/dist/cjs/engine.d.ts.map +1 -1
  20. package/dist/cjs/engine.js +26 -6
  21. package/dist/cjs/index.d.ts +4 -0
  22. package/dist/cjs/index.d.ts.map +1 -1
  23. package/dist/cjs/index.js +9 -1
  24. package/dist/cjs/models.d.ts +129 -0
  25. package/dist/cjs/models.d.ts.map +1 -0
  26. package/dist/cjs/models.js +323 -0
  27. package/dist/cjs/native.d.ts +3 -3
  28. package/dist/cjs/native.d.ts.map +1 -1
  29. package/dist/cjs/native.js +1 -1
  30. package/dist/cjs/rlm/controller.d.ts +245 -0
  31. package/dist/cjs/rlm/controller.d.ts.map +1 -0
  32. package/dist/cjs/rlm/controller.js +554 -0
  33. package/dist/cjs/rlm/index.d.ts +62 -0
  34. package/dist/cjs/rlm/index.d.ts.map +1 -0
  35. package/dist/cjs/rlm/index.js +97 -0
  36. package/dist/cjs/rlm/training.d.ts +333 -0
  37. package/dist/cjs/rlm/training.d.ts.map +1 -0
  38. package/dist/cjs/rlm/training.js +680 -0
  39. package/dist/cjs/rlm/types.d.ts +189 -0
  40. package/dist/cjs/rlm/types.d.ts.map +1 -0
  41. package/dist/cjs/rlm/types.js +10 -0
  42. package/dist/esm/benchmarks/embedding-benchmark.d.ts +102 -0
  43. package/dist/esm/benchmarks/embedding-benchmark.d.ts.map +1 -0
  44. package/dist/esm/benchmarks/embedding-benchmark.js +427 -0
  45. package/dist/esm/benchmarks/index.d.ts +34 -0
  46. package/dist/esm/benchmarks/index.d.ts.map +1 -0
  47. package/dist/esm/benchmarks/index.js +110 -0
  48. package/dist/esm/benchmarks/model-comparison.d.ts +71 -0
  49. package/dist/esm/benchmarks/model-comparison.d.ts.map +1 -0
  50. package/dist/esm/benchmarks/model-comparison.js +434 -0
  51. package/dist/esm/benchmarks/routing-benchmark.d.ts +70 -0
  52. package/dist/esm/benchmarks/routing-benchmark.d.ts.map +1 -0
  53. package/dist/esm/benchmarks/routing-benchmark.js +283 -0
  54. package/dist/esm/contrastive.d.ts +229 -0
  55. package/dist/esm/contrastive.d.ts.map +1 -0
  56. package/dist/esm/contrastive.js +578 -0
  57. package/dist/esm/engine.d.ts +3 -0
  58. package/dist/esm/engine.d.ts.map +1 -1
  59. package/dist/esm/engine.js +26 -6
  60. package/dist/esm/index.d.ts +4 -0
  61. package/dist/esm/index.d.ts.map +1 -1
  62. package/dist/esm/index.js +9 -1
  63. package/dist/esm/models.d.ts +129 -0
  64. package/dist/esm/models.d.ts.map +1 -0
  65. package/dist/esm/models.js +282 -0
  66. package/dist/esm/native.d.ts +3 -3
  67. package/dist/esm/native.d.ts.map +1 -1
  68. package/dist/esm/native.js +1 -1
  69. package/dist/esm/rlm/controller.d.ts +245 -0
  70. package/dist/esm/rlm/controller.d.ts.map +1 -0
  71. package/dist/esm/rlm/controller.js +550 -0
  72. package/dist/esm/rlm/index.d.ts +62 -0
  73. package/dist/esm/rlm/index.d.ts.map +1 -0
  74. package/dist/esm/rlm/index.js +71 -0
  75. package/dist/esm/rlm/training.d.ts +333 -0
  76. package/dist/esm/rlm/training.d.ts.map +1 -0
  77. package/dist/esm/rlm/training.js +672 -0
  78. package/dist/esm/rlm/types.d.ts +189 -0
  79. package/dist/esm/rlm/types.d.ts.map +1 -0
  80. package/dist/esm/rlm/types.js +9 -0
  81. package/package.json +13 -8
  82. package/scripts/ensemble-model-compare.js +287 -0
  83. package/scripts/huggingface/README.md +537 -0
  84. package/scripts/huggingface/publish.sh +112 -0
  85. package/scripts/hybrid-model-compare.js +373 -0
  86. package/scripts/improved-model-compare.js +288 -0
  87. package/scripts/optimized-model-compare.js +364 -0
  88. package/scripts/real-model-compare.js +280 -0
  89. package/scripts/training/agentic-flow-capabilities.json +329 -0
  90. package/scripts/training/claude-code-synth.js +505 -0
  91. package/scripts/training/claude-flow-capabilities.json +1322 -0
  92. package/scripts/training/claude-hard-negatives.js +222 -0
  93. package/scripts/training/contrastive-finetune.js +517 -0
  94. package/scripts/training/ecosystem-triplets.jsonl +1467 -0
  95. package/scripts/training/generate-ecosystem-triplets.js +1324 -0
  96. package/scripts/training/rlm-dataset.js +671 -0
  97. package/scripts/training/routing-dataset.js +634 -0
  98. package/scripts/training/ruvector-capabilities.json +798 -0
  99. package/scripts/training/validate-ecosystem.js +381 -0
  100. package/scripts/training/validation-results.json +23 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * RuvLTRA Benchmark Suite
3
+ *
4
+ * Comprehensive benchmarks for evaluating RuvLTRA models
5
+ * on Claude Code-specific use cases.
6
+ */
7
+ export * from './routing-benchmark';
8
+ export * from './embedding-benchmark';
9
+ export * from './model-comparison';
10
+ import { runRoutingBenchmark, formatRoutingResults, ROUTING_TEST_CASES, } from './routing-benchmark';
11
+ import { runEmbeddingBenchmark, formatEmbeddingResults, SIMILARITY_TEST_PAIRS, SEARCH_TEST_CASES, CLUSTER_TEST_CASES, } from './embedding-benchmark';
12
+ /**
13
+ * Run all benchmarks with a given model
14
+ */
15
+ export function runFullBenchmark(router, embedder, similarityFn, modelName = 'unknown') {
16
+ const routing = runRoutingBenchmark(router);
17
+ const embedding = runEmbeddingBenchmark(embedder, similarityFn);
18
+ return {
19
+ routing,
20
+ embedding,
21
+ timestamp: new Date().toISOString(),
22
+ model: modelName,
23
+ };
24
+ }
25
+ /**
26
+ * Format full benchmark results
27
+ */
28
+ export function formatFullResults(results) {
29
+ const lines = [];
30
+ lines.push('');
31
+ lines.push('╔═══════════════════════════════════════════════════════════════════════════╗');
32
+ lines.push('║ RUVLTRA BENCHMARK SUITE ║');
33
+ lines.push('║ Claude Code Use Case Evaluation ║');
34
+ lines.push('╠═══════════════════════════════════════════════════════════════════════════╣');
35
+ lines.push(`║ Model: ${results.model.padEnd(64)}║`);
36
+ lines.push(`║ Date: ${results.timestamp.padEnd(64)}║`);
37
+ lines.push('╚═══════════════════════════════════════════════════════════════════════════╝');
38
+ lines.push(formatRoutingResults(results.routing));
39
+ lines.push(formatEmbeddingResults(results.embedding));
40
+ // Overall assessment
41
+ lines.push('');
42
+ lines.push('═══════════════════════════════════════════════════════════════');
43
+ lines.push(' OVERALL ASSESSMENT');
44
+ lines.push('═══════════════════════════════════════════════════════════════');
45
+ const routingScore = results.routing.accuracy;
46
+ const embeddingScore = (results.embedding.similarityAccuracy +
47
+ results.embedding.searchMRR +
48
+ results.embedding.clusterPurity) / 3;
49
+ const overallScore = (routingScore + embeddingScore) / 2;
50
+ lines.push('');
51
+ lines.push(` Routing Score: ${(routingScore * 100).toFixed(1)}%`);
52
+ lines.push(` Embedding Score: ${(embeddingScore * 100).toFixed(1)}%`);
53
+ lines.push(` ─────────────────────────`);
54
+ lines.push(` Overall Score: ${(overallScore * 100).toFixed(1)}%`);
55
+ lines.push('');
56
+ if (overallScore >= 0.8) {
57
+ lines.push(' ✓ EXCELLENT - Highly suitable for Claude Code workflows');
58
+ }
59
+ else if (overallScore >= 0.6) {
60
+ lines.push(' ~ GOOD - Suitable for most Claude Code use cases');
61
+ }
62
+ else if (overallScore >= 0.4) {
63
+ lines.push(' ~ ACCEPTABLE - May work but consider alternatives');
64
+ }
65
+ else {
66
+ lines.push(' ✗ NEEDS IMPROVEMENT - Consider different model or fine-tuning');
67
+ }
68
+ lines.push('');
69
+ lines.push('═══════════════════════════════════════════════════════════════');
70
+ return lines.join('\n');
71
+ }
72
+ /**
73
+ * Compare two models
74
+ */
75
+ export function compareModels(results1, results2) {
76
+ const lines = [];
77
+ lines.push('');
78
+ lines.push('╔═══════════════════════════════════════════════════════════════════════════╗');
79
+ lines.push('║ MODEL COMPARISON ║');
80
+ lines.push('╚═══════════════════════════════════════════════════════════════════════════╝');
81
+ lines.push('');
82
+ const metrics = [
83
+ { name: 'Routing Accuracy', v1: results1.routing.accuracy, v2: results2.routing.accuracy },
84
+ { name: 'Similarity Detection', v1: results1.embedding.similarityAccuracy, v2: results2.embedding.similarityAccuracy },
85
+ { name: 'Search MRR', v1: results1.embedding.searchMRR, v2: results2.embedding.searchMRR },
86
+ { name: 'Search NDCG', v1: results1.embedding.searchNDCG, v2: results2.embedding.searchNDCG },
87
+ { name: 'Cluster Purity', v1: results1.embedding.clusterPurity, v2: results2.embedding.clusterPurity },
88
+ { name: 'Routing Latency (ms)', v1: results1.routing.avgLatencyMs, v2: results2.routing.avgLatencyMs, lowerBetter: true },
89
+ ];
90
+ lines.push(`${'Metric'.padEnd(25)} ${results1.model.padEnd(15)} ${results2.model.padEnd(15)} Winner`);
91
+ lines.push('─'.repeat(70));
92
+ for (const m of metrics) {
93
+ const val1 = m.lowerBetter ? m.v1 : m.v1;
94
+ const val2 = m.lowerBetter ? m.v2 : m.v2;
95
+ let winner;
96
+ if (m.lowerBetter) {
97
+ winner = val1 < val2 ? results1.model : val2 < val1 ? results2.model : 'tie';
98
+ }
99
+ else {
100
+ winner = val1 > val2 ? results1.model : val2 > val1 ? results2.model : 'tie';
101
+ }
102
+ const v1Str = m.lowerBetter ? val1.toFixed(2) : (val1 * 100).toFixed(1) + '%';
103
+ const v2Str = m.lowerBetter ? val2.toFixed(2) : (val2 * 100).toFixed(1) + '%';
104
+ lines.push(`${m.name.padEnd(25)} ${v1Str.padEnd(15)} ${v2Str.padEnd(15)} ${winner}`);
105
+ }
106
+ return lines.join('\n');
107
+ }
108
+ // Export constants for external use
109
+ export { ROUTING_TEST_CASES, SIMILARITY_TEST_PAIRS, SEARCH_TEST_CASES, CLUSTER_TEST_CASES, };
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmVuY2htYXJrcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBRW5DLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBRXBCLGtCQUFrQixHQUVuQixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsa0JBQWtCLEdBRW5CLE1BQU0sdUJBQXVCLENBQUM7QUFTL0I7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLE1BQStELEVBQy9ELFFBQW9DLEVBQ3BDLFlBQWtELEVBQ2xELFlBQW9CLFNBQVM7SUFFN0IsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRWhFLE9BQU87UUFDTCxPQUFPO1FBQ1AsU0FBUztRQUNULFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtRQUNuQyxLQUFLLEVBQUUsU0FBUztLQUNqQixDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQTZCO0lBQzdELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsS0FBSyxDQUFDLElBQUksQ0FBQywrRUFBK0UsQ0FBQyxDQUFDO0lBQzVGLEtBQUssQ0FBQyxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztJQUM1RixLQUFLLENBQUMsSUFB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QztRQUMvRSxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM5RSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRTlFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxvQ0FBb0M7QUFDcEMsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsaUJBQWlCLEVBQ2pCLGtCQUFrQixHQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSdXZMVFJBIEJlbmNobWFyayBTdWl0ZVxuICpcbiAqIENvbXByZWhlbnNpdmUgYmVuY2htYXJrcyBmb3IgZXZhbHVhdGluZyBSdXZMVFJBIG1vZGVsc1xuICogb24gQ2xhdWRlIENvZGUtc3BlY2lmaWMgdXNlIGNhc2VzLlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcm91dGluZy1iZW5jaG1hcmsnO1xuZXhwb3J0ICogZnJvbSAnLi9lbWJlZGRpbmctYmVuY2htYXJrJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWwtY29tcGFyaXNvbic7XG5cbmltcG9ydCB7XG4gIHJ1blJvdXRpbmdCZW5jaG1hcmssXG4gIGZvcm1hdFJvdXRpbmdSZXN1bHRzLFxuICBiYXNlbGluZUtleXdvcmRSb3V0ZXIsXG4gIFJPVVRJTkdfVEVTVF9DQVNFUyxcbiAgdHlwZSBSb3V0aW5nQmVuY2htYXJrUmVzdWx0cyxcbn0gZnJvbSAnLi9yb3V0aW5nLWJlbmNobWFyayc7XG5cbmltcG9ydCB7XG4gIHJ1bkVtYmVkZGluZ0JlbmNobWFyayxcbiAgZm9ybWF0RW1iZWRkaW5nUmVzdWx0cyxcbiAgU0lNSUxBUklUWV9URVNUX1BBSVJTLFxuICBTRUFSQ0hfVEVTVF9DQVNFUyxcbiAgQ0xVU1RFUl9URVNUX0NBU0VTLFxuICB0eXBlIEVtYmVkZGluZ0JlbmNobWFya1Jlc3VsdHMsXG59IGZyb20gJy4vZW1iZWRkaW5nLWJlbmNobWFyayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVsbEJlbmNobWFya1Jlc3VsdHMge1xuICByb3V0aW5nOiBSb3V0aW5nQmVuY2htYXJrUmVzdWx0cztcbiAgZW1iZWRkaW5nOiBFbWJlZGRpbmdCZW5jaG1hcmtSZXN1bHRzO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgbW9kZWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSdW4gYWxsIGJlbmNobWFya3Mgd2l0aCBhIGdpdmVuIG1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5GdWxsQmVuY2htYXJrKFxuICByb3V0ZXI6ICh0YXNrOiBzdHJpbmcpID0+IHsgYWdlbnQ6IHN0cmluZzsgY29uZmlkZW5jZTogbnVtYmVyIH0sXG4gIGVtYmVkZGVyOiAodGV4dDogc3RyaW5nKSA9PiBudW1iZXJbXSxcbiAgc2ltaWxhcml0eUZuOiAoYTogbnVtYmVyW10sIGI6IG51bWJlcltdKSA9PiBudW1iZXIsXG4gIG1vZGVsTmFtZTogc3RyaW5nID0gJ3Vua25vd24nXG4pOiBGdWxsQmVuY2htYXJrUmVzdWx0cyB7XG4gIGNvbnN0IHJvdXRpbmcgPSBydW5Sb3V0aW5nQmVuY2htYXJrKHJvdXRlcik7XG4gIGNvbnN0IGVtYmVkZGluZyA9IHJ1bkVtYmVkZGluZ0JlbmNobWFyayhlbWJlZGRlciwgc2ltaWxhcml0eUZuKTtcblxuICByZXR1cm4ge1xuICAgIHJvdXRpbmcsXG4gICAgZW1iZWRkaW5nLFxuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIG1vZGVsOiBtb2RlbE5hbWUsXG4gIH07XG59XG5cbi8qKlxuICogRm9ybWF0IGZ1bGwgYmVuY2htYXJrIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZ1bGxSZXN1bHRzKHJlc3VsdHM6IEZ1bGxCZW5jaG1hcmtSZXN1bHRzKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgbGluZXMucHVzaCgnJyk7XG4gIGxpbmVzLnB1c2goJ+KVlOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVlycpO1xuICBsaW5lcy5wdXNoKCfilZEgICAgICAgICAgICAgICAgICAgIFJVVkxUUkEgQkVOQ0hNQVJLIFNVSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilZEnKTtcbiAgbGluZXMucHVzaCgn4pWRICAgICAgICAgICAgQ2xhdWRlIENvZGUgVXNlIENhc2UgRXZhbHVhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pWRJyk7XG4gIGxpbmVzLnB1c2goJ+KVoOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVoycpO1xuICBsaW5lcy5wdXNoKGDilZEgIE1vZGVsOiAke3Jlc3VsdHMubW9kZWwucGFkRW5kKDY0KX3ilZFgKTtcbiAgbGluZXMucHVzaChg4pWRICBEYXRlOiAgJHtyZXN1bHRzLnRpbWVzdGFtcC5wYWRFbmQoNjQpfeKVkWApO1xuICBsaW5lcy5wdXNoKCfilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0nKTtcblxuICBsaW5lcy5wdXNoKGZvcm1hdFJvdXRpbmdSZXN1bHRzKHJlc3VsdHMucm91dGluZykpO1xuICBsaW5lcy5wdXNoKGZvcm1hdEVtYmVkZGluZ1Jlc3VsdHMocmVzdWx0cy5lbWJlZGRpbmcpKTtcblxuICAvLyBPdmVyYWxsIGFzc2Vzc21lbnRcbiAgbGluZXMucHVzaCgnJyk7XG4gIGxpbmVzLnB1c2goJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpO1xuICBsaW5lcy5wdXNoKCcgICAgICAgICAgICAgICAgICAgICAgT1ZFUkFMTCBBU1NFU1NNRU5UJyk7XG4gIGxpbmVzLnB1c2goJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpO1xuXG4gIGNvbnN0IHJvdXRpbmdTY29yZSA9IHJlc3VsdHMucm91dGluZy5hY2N1cmFjeTtcbiAgY29uc3QgZW1iZWRkaW5nU2NvcmUgPSAoXG4gICAgcmVzdWx0cy5lbWJlZGRpbmcuc2ltaWxhcml0eUFjY3VyYWN5ICtcbiAgICByZXN1bHRzLmVtYmVkZGluZy5zZWFyY2hNUlIgK1xuICAgIHJlc3VsdHMuZW1iZWRkaW5nLmNsdXN0ZXJQdXJpdHlcbiAgKSAvIDM7XG5cbiAgY29uc3Qgb3ZlcmFsbFNjb3JlID0gKHJvdXRpbmdTY29yZSArIGVtYmVkZGluZ1Njb3JlKSAvIDI7XG5cbiAgbGluZXMucHVzaCgnJyk7XG4gIGxpbmVzLnB1c2goYCAgUm91dGluZyBTY29yZTogICAkeyhyb3V0aW5nU2NvcmUgKiAxMDApLnRvRml4ZWQoMSl9JWApO1xuICBsaW5lcy5wdXNoKGAgIEVtYmVkZGluZyBTY29yZTogJHsoZW1iZWRkaW5nU2NvcmUgKiAxMDApLnRvRml4ZWQoMSl9JWApO1xuICBsaW5lcy5wdXNoKGAgIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgGApO1xuICBsaW5lcy5wdXNoKGAgIE92ZXJhbGwgU2NvcmU6ICAgJHsob3ZlcmFsbFNjb3JlICogMTAwKS50b0ZpeGVkKDEpfSVgKTtcbiAgbGluZXMucHVzaCgnJyk7XG5cbiAgaWYgKG92ZXJhbGxTY29yZSA+PSAwLjgpIHtcbiAgICBsaW5lcy5wdXNoKCcgIOKckyBFWENFTExFTlQgLSBIaWdobHkgc3VpdGFibGUgZm9yIENsYXVkZSBDb2RlIHdvcmtmbG93cycpO1xuICB9IGVsc2UgaWYgKG92ZXJhbGxTY29yZSA+PSAwLjYpIHtcbiAgICBsaW5lcy5wdXNoKCcgIH4gR09PRCAtIFN1aXRhYmxlIGZvciBtb3N0IENsYXVkZSBDb2RlIHVzZSBjYXNlcycpO1xuICB9IGVsc2UgaWYgKG92ZXJhbGxTY29yZSA+PSAwLjQpIHtcbiAgICBsaW5lcy5wdXNoKCcgIH4gQUNDRVBUQUJMRSAtIE1heSB3b3JrIGJ1dCBjb25zaWRlciBhbHRlcm5hdGl2ZXMnKTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lcy5wdXNoKCcgIOKclyBORUVEUyBJTVBST1ZFTUVOVCAtIENvbnNpZGVyIGRpZmZlcmVudCBtb2RlbCBvciBmaW5lLXR1bmluZycpO1xuICB9XG5cbiAgbGluZXMucHVzaCgnJyk7XG4gIGxpbmVzLnB1c2goJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpO1xuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBDb21wYXJlIHR3byBtb2RlbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVNb2RlbHMoXG4gIHJlc3VsdHMxOiBGdWxsQmVuY2htYXJrUmVzdWx0cyxcbiAgcmVzdWx0czI6IEZ1bGxCZW5jaG1hcmtSZXN1bHRzXG4pOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICBsaW5lcy5wdXNoKCcnKTtcbiAgbGluZXMucHVzaCgn4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXJyk7XG4gIGxpbmVzLnB1c2goJ+KVkSAgICAgICAgICAgICAgICAgICAgICAgTU9ERUwgQ09NUEFSSVNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKVkScpO1xuICBsaW5lcy5wdXNoKCfilZrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZ0nKTtcbiAgbGluZXMucHVzaCgnJyk7XG5cbiAgY29uc3QgbWV0cmljcyA9IFtcbiAgICB7IG5hbWU6ICdSb3V0aW5nIEFjY3VyYWN5JywgdjE6IHJlc3VsdHMxLnJvdXRpbmcuYWNjdXJhY3ksIHYyOiByZXN1bHRzMi5yb3V0aW5nLmFjY3VyYWN5IH0sXG4gICAgeyBuYW1lOiAnU2ltaWxhcml0eSBEZXRlY3Rpb24nLCB2MTogcmVzdWx0czEuZW1iZWRkaW5nLnNpbWlsYXJpdHlBY2N1cmFjeSwgdjI6IHJlc3VsdHMyLmVtYmVkZGluZy5zaW1pbGFyaXR5QWNjdXJhY3kgfSxcbiAgICB7IG5hbWU6ICdTZWFyY2ggTVJSJywgdjE6IHJlc3VsdHMxLmVtYmVkZGluZy5zZWFyY2hNUlIsIHYyOiByZXN1bHRzMi5lbWJlZGRpbmcuc2VhcmNoTVJSIH0sXG4gICAgeyBuYW1lOiAnU2VhcmNoIE5EQ0cnLCB2MTogcmVzdWx0czEuZW1iZWRkaW5nLnNlYXJjaE5EQ0csIHYyOiByZXN1bHRzMi5lbWJlZGRpbmcuc2VhcmNoTkRDRyB9LFxuICAgIHsgbmFtZTogJ0NsdXN0ZXIgUHVyaXR5JywgdjE6IHJlc3VsdHMxLmVtYmVkZGluZy5jbHVzdGVyUHVyaXR5LCB2MjogcmVzdWx0czIuZW1iZWRkaW5nLmNsdXN0ZXJQdXJpdHkgfSxcbiAgICB7IG5hbWU6ICdSb3V0aW5nIExhdGVuY3kgKG1zKScsIHYxOiByZXN1bHRzMS5yb3V0aW5nLmF2Z0xhdGVuY3lNcywgdjI6IHJlc3VsdHMyLnJvdXRpbmcuYXZnTGF0ZW5jeU1zLCBsb3dlckJldHRlcjogdHJ1ZSB9LFxuICBdO1xuXG4gIGxpbmVzLnB1c2goYCR7J01ldHJpYycucGFkRW5kKDI1KX0gJHtyZXN1bHRzMS5tb2RlbC5wYWRFbmQoMTUpfSAke3Jlc3VsdHMyLm1vZGVsLnBhZEVuZCgxNSl9IFdpbm5lcmApO1xuICBsaW5lcy5wdXNoKCfilIAnLnJlcGVhdCg3MCkpO1xuXG4gIGZvciAoY29uc3QgbSBvZiBtZXRyaWNzKSB7XG4gICAgY29uc3QgdmFsMSA9IG0ubG93ZXJCZXR0ZXIgPyBtLnYxIDogbS52MTtcbiAgICBjb25zdCB2YWwyID0gbS5sb3dlckJldHRlciA/IG0udjIgOiBtLnYyO1xuXG4gICAgbGV0IHdpbm5lcjogc3RyaW5nO1xuICAgIGlmIChtLmxvd2VyQmV0dGVyKSB7XG4gICAgICB3aW5uZXIgPSB2YWwxIDwgdmFsMiA/IHJlc3VsdHMxLm1vZGVsIDogdmFsMiA8IHZhbDEgPyByZXN1bHRzMi5tb2RlbCA6ICd0aWUnO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5uZXIgPSB2YWwxID4gdmFsMiA/IHJlc3VsdHMxLm1vZGVsIDogdmFsMiA+IHZhbDEgPyByZXN1bHRzMi5tb2RlbCA6ICd0aWUnO1xuICAgIH1cblxuICAgIGNvbnN0IHYxU3RyID0gbS5sb3dlckJldHRlciA/IHZhbDEudG9GaXhlZCgyKSA6ICh2YWwxICogMTAwKS50b0ZpeGVkKDEpICsgJyUnO1xuICAgIGNvbnN0IHYyU3RyID0gbS5sb3dlckJldHRlciA/IHZhbDIudG9GaXhlZCgyKSA6ICh2YWwyICogMTAwKS50b0ZpeGVkKDEpICsgJyUnO1xuXG4gICAgbGluZXMucHVzaChgJHttLm5hbWUucGFkRW5kKDI1KX0gJHt2MVN0ci5wYWRFbmQoMTUpfSAke3YyU3RyLnBhZEVuZCgxNSl9ICR7d2lubmVyfWApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG4vLyBFeHBvcnQgY29uc3RhbnRzIGZvciBleHRlcm5hbCB1c2VcbmV4cG9ydCB7XG4gIFJPVVRJTkdfVEVTVF9DQVNFUyxcbiAgU0lNSUxBUklUWV9URVNUX1BBSVJTLFxuICBTRUFSQ0hfVEVTVF9DQVNFUyxcbiAgQ0xVU1RFUl9URVNUX0NBU0VTLFxufTtcbiJdfQ==
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Model Comparison Benchmark
3
+ *
4
+ * Head-to-head comparison between:
5
+ * - Qwen2.5-0.5B-Instruct (base model)
6
+ * - RuvLTRA Claude Code 0.5B (fine-tuned for Claude Code)
7
+ *
8
+ * Tests routing accuracy and embedding quality for Claude Code use cases.
9
+ */
10
+ import { type RoutingBenchmarkResults } from './routing-benchmark';
11
+ import { type EmbeddingBenchmarkResults } from './embedding-benchmark';
12
+ /** Model configuration */
13
+ export interface ModelConfig {
14
+ id: string;
15
+ name: string;
16
+ url: string;
17
+ filename: string;
18
+ sizeBytes: number;
19
+ description: string;
20
+ }
21
+ /** Comparison models */
22
+ export declare const COMPARISON_MODELS: Record<string, ModelConfig>;
23
+ /** Comparison result */
24
+ export interface ComparisonResult {
25
+ modelId: string;
26
+ modelName: string;
27
+ routing: RoutingBenchmarkResults;
28
+ embedding: EmbeddingBenchmarkResults;
29
+ overallScore: number;
30
+ }
31
+ /** Full comparison results */
32
+ export interface FullComparisonResults {
33
+ timestamp: string;
34
+ baseline: ComparisonResult;
35
+ models: ComparisonResult[];
36
+ winner: string;
37
+ summary: string;
38
+ }
39
+ /**
40
+ * Get models directory
41
+ */
42
+ export declare function getModelsDir(): string;
43
+ /**
44
+ * Check if model is downloaded
45
+ */
46
+ export declare function isModelDownloaded(modelId: string): boolean;
47
+ /**
48
+ * Download a model with progress
49
+ */
50
+ export declare function downloadModel(modelId: string, onProgress?: (percent: number, speed: number) => void): Promise<string>;
51
+ /**
52
+ * Run comparison for a single model
53
+ */
54
+ export declare function runModelComparison(modelId: string, modelName: string, embedder: (text: string) => number[]): ComparisonResult;
55
+ /**
56
+ * Format comparison results
57
+ */
58
+ export declare function formatComparisonResults(results: FullComparisonResults): string;
59
+ /**
60
+ * Run full comparison
61
+ */
62
+ export declare function runFullComparison(): Promise<FullComparisonResults>;
63
+ declare const _default: {
64
+ COMPARISON_MODELS: Record<string, ModelConfig>;
65
+ runFullComparison: typeof runFullComparison;
66
+ formatComparisonResults: typeof formatComparisonResults;
67
+ downloadModel: typeof downloadModel;
68
+ isModelDownloaded: typeof isModelDownloaded;
69
+ };
70
+ export default _default;
71
+ //# sourceMappingURL=model-comparison.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-comparison.d.ts","sourceRoot":"","sources":["../../../src/benchmarks/model-comparison.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH,OAAO,EAML,KAAK,uBAAuB,EAC7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAE/B,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAwB;AACxB,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAiBzD,CAAC;AAEF,wBAAwB;AACxB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,uBAAuB,CAAC;IACjC,SAAS,EAAE,yBAAyB,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,8BAA8B;AAC9B,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAS1D;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,MAAM,CAAC,CA2EjB;AAyJD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,GACnC,gBAAgB,CAyBlB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CA8E9E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAqGxE;;;;;;;;AAED,wBAME"}