@vivantel/virage-cli 0.1.1
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.
- package/dist/bin/virage.d.ts +3 -0
- package/dist/bin/virage.d.ts.map +1 -0
- package/dist/bin/virage.js +366 -0
- package/dist/bin/virage.js.map +1 -0
- package/dist/cli/benchmark.d.ts +6 -0
- package/dist/cli/benchmark.d.ts.map +1 -0
- package/dist/cli/benchmark.js +26 -0
- package/dist/cli/benchmark.js.map +1 -0
- package/dist/cli/chunks-report.d.ts +2 -0
- package/dist/cli/chunks-report.d.ts.map +1 -0
- package/dist/cli/chunks-report.js +74 -0
- package/dist/cli/chunks-report.js.map +1 -0
- package/dist/cli/dashboard.d.ts +7 -0
- package/dist/cli/dashboard.d.ts.map +1 -0
- package/dist/cli/dashboard.js +164 -0
- package/dist/cli/dashboard.js.map +1 -0
- package/dist/cli/evaluate.d.ts +9 -0
- package/dist/cli/evaluate.d.ts.map +1 -0
- package/dist/cli/evaluate.js +64 -0
- package/dist/cli/evaluate.js.map +1 -0
- package/dist/cli/experiment.d.ts +13 -0
- package/dist/cli/experiment.d.ts.map +1 -0
- package/dist/cli/experiment.js +95 -0
- package/dist/cli/experiment.js.map +1 -0
- package/dist/cli/file-detect.d.ts +11 -0
- package/dist/cli/file-detect.d.ts.map +1 -0
- package/dist/cli/file-detect.js +46 -0
- package/dist/cli/file-detect.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +381 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/report.d.ts +2 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +96 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/store-cmd.d.ts +10 -0
- package/dist/cli/store-cmd.d.ts.map +1 -0
- package/dist/cli/store-cmd.js +50 -0
- package/dist/cli/store-cmd.js.map +1 -0
- package/dist/cli/validate.d.ts +2 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +72 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/cli/viz.d.ts +7 -0
- package/dist/cli/viz.d.ts.map +1 -0
- package/dist/cli/viz.js +163 -0
- package/dist/cli/viz.js.map +1 -0
- package/dist/dashboard-ui/assets/index-BD53Fj5e.js +40 -0
- package/dist/dashboard-ui/assets/index-Boh3NVMF.css +1 -0
- package/dist/dashboard-ui/index.html +13 -0
- package/dist/logger/consola-logger.d.ts +18 -0
- package/dist/logger/consola-logger.d.ts.map +1 -0
- package/dist/logger/consola-logger.js +76 -0
- package/dist/logger/consola-logger.js.map +1 -0
- package/dist/logger/index.d.ts +4 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +6 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/progress/progress-bar.d.ts +6 -0
- package/dist/progress/progress-bar.d.ts.map +1 -0
- package/dist/progress/progress-bar.js +23 -0
- package/dist/progress/progress-bar.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virage.d.ts","sourceRoot":"","sources":["../../src/bin/virage.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { config } from "dotenv";
|
|
4
|
+
import { loadConfig, Orchestrator, RagError, defaultChunksFile, defaultEmbeddingsDb, getVirageDir, } from "@vivantel/virage-core";
|
|
5
|
+
import { createLogger } from "../logger/index.js";
|
|
6
|
+
import { createProgressBar } from "../progress/progress-bar.js";
|
|
7
|
+
import { runInit } from "../cli/init.js";
|
|
8
|
+
import { runValidate } from "../cli/validate.js";
|
|
9
|
+
import { runEvaluate } from "../cli/evaluate.js";
|
|
10
|
+
import { runExperimentRun, runExperimentCompare, runExperimentList, } from "../cli/experiment.js";
|
|
11
|
+
import { runBenchmarkEmbedder } from "../cli/benchmark.js";
|
|
12
|
+
import { runStoreStats, runStorePerf } from "../cli/store-cmd.js";
|
|
13
|
+
import { runReport } from "../cli/report.js";
|
|
14
|
+
import { runChunksReport } from "../cli/chunks-report.js";
|
|
15
|
+
import { runVizEmbeddings } from "../cli/viz.js";
|
|
16
|
+
import { runDashboard } from "../cli/dashboard.js";
|
|
17
|
+
config({ quiet: true });
|
|
18
|
+
// Expand -vvv etc. into individual -v flags before commander parses
|
|
19
|
+
const argv = process.argv.flatMap((arg) => /^-v+$/.test(arg)
|
|
20
|
+
? arg
|
|
21
|
+
.slice(1)
|
|
22
|
+
.split("")
|
|
23
|
+
.map((c) => `-${c}`)
|
|
24
|
+
: [arg]);
|
|
25
|
+
const program = new Command();
|
|
26
|
+
function handleError(error) {
|
|
27
|
+
console.error("ā Error:", error instanceof Error ? error.message : error);
|
|
28
|
+
if (error instanceof RagError && error.suggestion) {
|
|
29
|
+
console.error(" š”", error.suggestion);
|
|
30
|
+
}
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
async function runOnce(options) {
|
|
34
|
+
const cfg = await loadConfig(options.config, options.logger);
|
|
35
|
+
const bars = { chunk: null, embed: null, upload: null };
|
|
36
|
+
try {
|
|
37
|
+
const orchestrator = new Orchestrator({
|
|
38
|
+
...cfg,
|
|
39
|
+
options: {
|
|
40
|
+
...cfg.options,
|
|
41
|
+
force: options.force || cfg.options?.force,
|
|
42
|
+
skipUpload: options.noUpload || cfg.options?.skipUpload,
|
|
43
|
+
dryRun: options.dryRun || cfg.options?.dryRun,
|
|
44
|
+
chunksFile: options.chunksOut || cfg.options?.chunksFile,
|
|
45
|
+
embeddingsFile: options.embeddingsOut || cfg.options?.embeddingsFile,
|
|
46
|
+
logger: options.logger,
|
|
47
|
+
onChunkProgress: (done, total) => {
|
|
48
|
+
if (!bars.chunk)
|
|
49
|
+
bars.chunk = createProgressBar("Chunking", total);
|
|
50
|
+
bars.chunk.update(done);
|
|
51
|
+
},
|
|
52
|
+
onEmbedProgress: (done, total) => {
|
|
53
|
+
if (!bars.embed)
|
|
54
|
+
bars.embed = createProgressBar("Embedding", total);
|
|
55
|
+
bars.embed.update(done);
|
|
56
|
+
},
|
|
57
|
+
onUploadProgress: (done, total) => {
|
|
58
|
+
if (!bars.upload)
|
|
59
|
+
bars.upload = createProgressBar("Uploading", total);
|
|
60
|
+
bars.upload.update(done);
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
await orchestrator.run();
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
bars.chunk?.stop();
|
|
68
|
+
bars.embed?.stop();
|
|
69
|
+
bars.upload?.stop();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
program
|
|
73
|
+
.name("virage")
|
|
74
|
+
.description("RAG pipeline CLI ā run 'virage update' to index, or a subcommand for diagnostics")
|
|
75
|
+
.version("2.0.0")
|
|
76
|
+
.option("-v, --verbose", "Increase verbosity (stackable: -v, -vv ⦠-vvvvv)", (_, prev) => prev + 1, 0)
|
|
77
|
+
.action(() => program.outputHelp());
|
|
78
|
+
program
|
|
79
|
+
.command("update")
|
|
80
|
+
.description("Run the RAG indexing pipeline")
|
|
81
|
+
.option("-c, --config <path>", "Path to config file", "./virage.config.json")
|
|
82
|
+
.option("-f, --force", "Force full rebuild", false)
|
|
83
|
+
.option("--no-upload", "Skip upload to vector store")
|
|
84
|
+
.option("--dry-run", "Show what would change without uploading", false)
|
|
85
|
+
.option("--chunks-out <path>", "Output path for chunks.json")
|
|
86
|
+
.option("--embeddings-out <path>", "Output path for embeddings.json")
|
|
87
|
+
.option("--watch", "Re-run pipeline on file changes", false)
|
|
88
|
+
.action(async (cmdOpts) => {
|
|
89
|
+
const verbose = program.opts().verbose;
|
|
90
|
+
const logger = createLogger(verbose);
|
|
91
|
+
const runOptions = {
|
|
92
|
+
config: cmdOpts.config,
|
|
93
|
+
force: cmdOpts.force,
|
|
94
|
+
noUpload: !cmdOpts.upload,
|
|
95
|
+
dryRun: cmdOpts.dryRun,
|
|
96
|
+
chunksOut: cmdOpts.chunksOut,
|
|
97
|
+
embeddingsOut: cmdOpts.embeddingsOut,
|
|
98
|
+
logger,
|
|
99
|
+
};
|
|
100
|
+
logger.info("š Virage");
|
|
101
|
+
try {
|
|
102
|
+
await runOnce(runOptions);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
handleError(error);
|
|
106
|
+
}
|
|
107
|
+
if (!cmdOpts.watch)
|
|
108
|
+
return;
|
|
109
|
+
// Watch mode
|
|
110
|
+
const { default: chokidar } = await import("chokidar");
|
|
111
|
+
const cfg = await loadConfig(cmdOpts.config, logger).catch(() => null);
|
|
112
|
+
const patterns = cfg
|
|
113
|
+
? cfg.chunkers.flatMap((c) => c.patterns)
|
|
114
|
+
: [];
|
|
115
|
+
const watched = [cmdOpts.config, ...patterns];
|
|
116
|
+
logger.info("šļø Watching for changes...");
|
|
117
|
+
let debounce = null;
|
|
118
|
+
chokidar
|
|
119
|
+
.watch(watched, { ignoreInitial: true })
|
|
120
|
+
.on("all", (event, path) => {
|
|
121
|
+
if (debounce)
|
|
122
|
+
clearTimeout(debounce);
|
|
123
|
+
debounce = setTimeout(async () => {
|
|
124
|
+
logger.info(`š Change detected (${event}: ${path}), re-running...`);
|
|
125
|
+
try {
|
|
126
|
+
await runOnce(runOptions);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
130
|
+
}
|
|
131
|
+
}, 500);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
program
|
|
135
|
+
.command("init")
|
|
136
|
+
.description("Generate a virage.config.json template interactively")
|
|
137
|
+
.action(async () => {
|
|
138
|
+
try {
|
|
139
|
+
await runInit();
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
if (error.name === "ExitPromptError") {
|
|
143
|
+
console.log("\nCancelled.");
|
|
144
|
+
process.exit(0);
|
|
145
|
+
}
|
|
146
|
+
handleError(error);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
program
|
|
150
|
+
.command("validate")
|
|
151
|
+
.description("Validate config without running the pipeline")
|
|
152
|
+
.option("-c, --config <path>", "Path to config file", "./virage.config.json")
|
|
153
|
+
.action(async (opts) => {
|
|
154
|
+
try {
|
|
155
|
+
await runValidate(opts.config);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
handleError(error);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
program
|
|
162
|
+
.command("evaluate")
|
|
163
|
+
.description("Evaluate retrieval quality against an eval dataset")
|
|
164
|
+
.option("-c, --config <path>", "Path to config file", "./virage.config.json")
|
|
165
|
+
.option("-d, --dataset <path>", "Eval dataset path", "./eval/queries.json")
|
|
166
|
+
.option("--with-llm-judge", "Enable RAGAS LLM-as-judge metrics")
|
|
167
|
+
.option("--threshold-mrr <n>", "Fail if MRR is below this threshold", parseFloat)
|
|
168
|
+
.option("--ci", "Exit with code 1 if quality gate fails")
|
|
169
|
+
.action(async (opts) => {
|
|
170
|
+
try {
|
|
171
|
+
await runEvaluate({
|
|
172
|
+
config: opts.config,
|
|
173
|
+
dataset: opts.dataset,
|
|
174
|
+
withLlmJudge: opts.withLlmJudge ?? false,
|
|
175
|
+
thresholdMrr: opts.thresholdMrr,
|
|
176
|
+
ci: opts.ci ?? false,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
handleError(error);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
program
|
|
184
|
+
.command("report")
|
|
185
|
+
.description("Show observability report from telemetry files")
|
|
186
|
+
.option("--dir <path>", "Directory containing telemetry.json files", getVirageDir())
|
|
187
|
+
.action(async (opts) => {
|
|
188
|
+
try {
|
|
189
|
+
await runReport(opts.dir);
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
handleError(error);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
program
|
|
196
|
+
.command("eval-generate")
|
|
197
|
+
.description("Generate an eval dataset from existing chunks")
|
|
198
|
+
.option("--chunks <path>", "Chunks file path", defaultChunksFile())
|
|
199
|
+
.option("--output <path>", "Output dataset path", "./eval/queries.json")
|
|
200
|
+
.option("--include-negatives", "Add negative examples")
|
|
201
|
+
.option("--paraphrase-ratio <n>", "Fraction of queries to paraphrase (requires LLM judge)", parseFloat, 0)
|
|
202
|
+
.action(async (opts) => {
|
|
203
|
+
try {
|
|
204
|
+
const { readFile } = await import("fs/promises");
|
|
205
|
+
const raw = JSON.parse(await readFile(opts.chunks, "utf-8"));
|
|
206
|
+
const chunks = Array.isArray(raw)
|
|
207
|
+
? raw
|
|
208
|
+
: (raw.chunks ?? []);
|
|
209
|
+
const { generateEvalDataset } = await import("@vivantel/virage-core");
|
|
210
|
+
await generateEvalDataset(chunks, {
|
|
211
|
+
includeNegatives: opts.includeNegatives ?? false,
|
|
212
|
+
paraphraseRatio: opts.paraphraseRatio,
|
|
213
|
+
}, opts.output);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
handleError(error);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
const viz = program.command("viz").description("Visualization tools");
|
|
220
|
+
viz
|
|
221
|
+
.command("embeddings")
|
|
222
|
+
.description("Generate a 2D visualization of the embedding space")
|
|
223
|
+
.option("--embeddings <path>", "Embeddings DB path", defaultEmbeddingsDb())
|
|
224
|
+
.option("--output <path>", "Output HTML file", "umap.html")
|
|
225
|
+
.option("--projection <type>", "Projection type: umap or tsne", "umap")
|
|
226
|
+
.action(async (opts) => {
|
|
227
|
+
try {
|
|
228
|
+
await runVizEmbeddings({
|
|
229
|
+
dbPath: opts.embeddings,
|
|
230
|
+
output: opts.output,
|
|
231
|
+
projection: opts.projection,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
handleError(error);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
const chunks = program.command("chunks").description("Chunk analysis tools");
|
|
239
|
+
chunks
|
|
240
|
+
.command("report")
|
|
241
|
+
.description("Show chunk cohesion report")
|
|
242
|
+
.option("--file <path>", "Chunks file path", defaultChunksFile())
|
|
243
|
+
.action(async (opts) => {
|
|
244
|
+
try {
|
|
245
|
+
await runChunksReport(opts.file);
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
handleError(error);
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
program
|
|
252
|
+
.command("dashboard")
|
|
253
|
+
.description("Start a local RAG monitoring dashboard")
|
|
254
|
+
.option("--port <n>", "Port to serve on", parseInt, 3000)
|
|
255
|
+
.option("--chunks <path>", "Chunks file path", defaultChunksFile())
|
|
256
|
+
.option("--embeddings <path>", "Embeddings DB path", defaultEmbeddingsDb())
|
|
257
|
+
.action(async (opts) => {
|
|
258
|
+
try {
|
|
259
|
+
await runDashboard({
|
|
260
|
+
port: opts.port,
|
|
261
|
+
chunksFile: opts.chunks,
|
|
262
|
+
dbPath: opts.embeddings,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
handleError(error);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
const benchmark = program
|
|
270
|
+
.command("benchmark")
|
|
271
|
+
.description("Performance benchmarking tools");
|
|
272
|
+
benchmark
|
|
273
|
+
.command("embedder")
|
|
274
|
+
.description("Benchmark a local HuggingFace embedding model")
|
|
275
|
+
.option("--model <id>", "HuggingFace model ID", "Xenova/all-MiniLM-L6-v2")
|
|
276
|
+
.option("--device <device>", "'cpu' or 'webgpu'", "cpu")
|
|
277
|
+
.action(async (opts) => {
|
|
278
|
+
try {
|
|
279
|
+
await runBenchmarkEmbedder({
|
|
280
|
+
model: opts.model,
|
|
281
|
+
device: opts.device,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
handleError(error);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
const store = program.command("store").description("Vector store diagnostics");
|
|
289
|
+
store
|
|
290
|
+
.command("stats")
|
|
291
|
+
.description("Show vector index quality metrics")
|
|
292
|
+
.option("-c, --config <path>", "Path to config file", "./virage.config.json")
|
|
293
|
+
.action(async (opts) => {
|
|
294
|
+
try {
|
|
295
|
+
await runStoreStats({ config: opts.config });
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
handleError(error);
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
store
|
|
302
|
+
.command("perf")
|
|
303
|
+
.description("Show query performance report")
|
|
304
|
+
.option("-c, --config <path>", "Path to config file", "./virage.config.json")
|
|
305
|
+
.option("--timeframe <hours>", "Timeframe in hours", parseInt, 24)
|
|
306
|
+
.action(async (opts) => {
|
|
307
|
+
try {
|
|
308
|
+
await runStorePerf({
|
|
309
|
+
config: opts.config,
|
|
310
|
+
timeframeHours: opts.timeframe,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
handleError(error);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
const experiment = program
|
|
318
|
+
.command("experiment")
|
|
319
|
+
.description("Experiment tracking and statistical comparison");
|
|
320
|
+
experiment
|
|
321
|
+
.command("run")
|
|
322
|
+
.description("Run an experiment and save results")
|
|
323
|
+
.requiredOption("--name <name>", "Experiment name")
|
|
324
|
+
.option("-c, --config <path>", "Path to config file", "./virage.config.json")
|
|
325
|
+
.option("-d, --dataset <path>", "Eval dataset path", "./eval/queries.json")
|
|
326
|
+
.action(async (opts) => {
|
|
327
|
+
try {
|
|
328
|
+
await runExperimentRun({
|
|
329
|
+
name: opts.name,
|
|
330
|
+
config: opts.config,
|
|
331
|
+
dataset: opts.dataset,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
handleError(error);
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
experiment
|
|
339
|
+
.command("list")
|
|
340
|
+
.description("List saved experiment runs")
|
|
341
|
+
.action(async () => {
|
|
342
|
+
try {
|
|
343
|
+
await runExperimentList();
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
handleError(error);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
experiment
|
|
350
|
+
.command("compare")
|
|
351
|
+
.description("Compare two experiment runs with bootstrap significance test")
|
|
352
|
+
.requiredOption("--baseline <id>", "Baseline run name or id")
|
|
353
|
+
.requiredOption("--candidate <id>", "Candidate run name or id")
|
|
354
|
+
.action(async (opts) => {
|
|
355
|
+
try {
|
|
356
|
+
await runExperimentCompare({
|
|
357
|
+
baseline: opts.baseline,
|
|
358
|
+
candidate: opts.candidate,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
handleError(error);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
program.parse(argv);
|
|
366
|
+
//# sourceMappingURL=virage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virage.js","sourceRoot":"","sources":["../../src/bin/virage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/cli/benchmark.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;CAC1B;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export async function runBenchmarkEmbedder(opts) {
|
|
2
|
+
console.log(`š¬ Benchmarking embedder: ${opts.model}`);
|
|
3
|
+
console.log(` Device: ${opts.device}`);
|
|
4
|
+
let benchmarkEmbedder;
|
|
5
|
+
try {
|
|
6
|
+
const pkg = "@vivantel/virage-embedder-transformers";
|
|
7
|
+
const mod = await import(pkg);
|
|
8
|
+
benchmarkEmbedder = mod.benchmarkEmbedder;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
console.error("ā @vivantel/virage-embedder-transformers is not installed.\n" +
|
|
12
|
+
" Install it with: npm install @vivantel/virage-embedder-transformers");
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
console.log("ā³ Running benchmark (this may take a moment for model download)...\n");
|
|
16
|
+
const result = await benchmarkEmbedder(opts.model, { device: opts.device });
|
|
17
|
+
console.log("š Benchmark Results");
|
|
18
|
+
console.log("ā".repeat(40));
|
|
19
|
+
console.log(` Model : ${result.model}`);
|
|
20
|
+
console.log(` Dimensions : ${result.dimensions}`);
|
|
21
|
+
console.log(` Tokens/sec : ${result.tokensPerSec.toLocaleString()}`);
|
|
22
|
+
console.log(` Memory delta : ${result.memoryMB} MB`);
|
|
23
|
+
console.log(` First query latency: ${result.firstQueryLatencyMs} ms`);
|
|
24
|
+
console.log("ā".repeat(40));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=benchmark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/cli/benchmark.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAA8B;IAE9B,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAEzC,IAAI,iBASF,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,wCAAwC,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,iBAAiB,GAAG,GAAG,CAAC,iBAA6C,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CACX,8DAA8D;YAC5D,wEAAwE,CAC3E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CACT,sEAAsE,CACvE,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAE5E,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,mBAAmB,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunks-report.d.ts","sourceRoot":"","sources":["../../src/cli/chunks-report.ts"],"names":[],"mappings":"AAmCA,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DvE"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { readFile } from "fs/promises";
|
|
2
|
+
function isChunkArray(val) {
|
|
3
|
+
return (Array.isArray(val) &&
|
|
4
|
+
val.length > 0 &&
|
|
5
|
+
typeof val[0].content === "string");
|
|
6
|
+
}
|
|
7
|
+
function computeCohesion(chunks) {
|
|
8
|
+
const sentenceEnd = /[.!?\n]\s*$/;
|
|
9
|
+
const midSentence = chunks.filter((c) => !sentenceEnd.test(c.content));
|
|
10
|
+
const cohesion = 1 - midSentence.length / chunks.length;
|
|
11
|
+
const suggestion = cohesion < 0.5
|
|
12
|
+
? `Low cohesion ā consider switching to 'semantic' strategy for better sentence boundaries`
|
|
13
|
+
: cohesion < 0.8
|
|
14
|
+
? `Moderate cohesion ā increase maxTokens or use 'markdown-headers' for structured content`
|
|
15
|
+
: "Good cohesion";
|
|
16
|
+
return { cohesion, midSentenceCuts: midSentence.length, suggestion };
|
|
17
|
+
}
|
|
18
|
+
export async function runChunksReport(chunksFile) {
|
|
19
|
+
let raw;
|
|
20
|
+
try {
|
|
21
|
+
raw = await readFile(chunksFile, "utf-8");
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
console.error(`ā Could not read chunks file "${chunksFile}".\n` +
|
|
25
|
+
` Run the pipeline first to generate chunks.`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
let parsed;
|
|
29
|
+
try {
|
|
30
|
+
parsed = JSON.parse(raw);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
console.error(`ā "${chunksFile}" is not valid JSON`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
// chunks.json can be a bare array or an object with a chunks property
|
|
37
|
+
let chunks;
|
|
38
|
+
if (isChunkArray(parsed)) {
|
|
39
|
+
chunks = parsed;
|
|
40
|
+
}
|
|
41
|
+
else if (parsed &&
|
|
42
|
+
typeof parsed === "object" &&
|
|
43
|
+
"chunks" in parsed &&
|
|
44
|
+
isChunkArray(parsed.chunks)) {
|
|
45
|
+
chunks = parsed.chunks;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
console.error(`ā Unexpected chunks file format in "${chunksFile}"`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
// Group by strategy
|
|
52
|
+
const byStrategy = new Map();
|
|
53
|
+
for (const chunk of chunks) {
|
|
54
|
+
const strategy = chunk.metadata?.strategy ?? "unknown";
|
|
55
|
+
const group = byStrategy.get(strategy) ?? [];
|
|
56
|
+
group.push(chunk);
|
|
57
|
+
byStrategy.set(strategy, group);
|
|
58
|
+
}
|
|
59
|
+
console.log(`\nš Chunk Cohesion Report (${chunks.length} total chunks)`);
|
|
60
|
+
console.log("ā".repeat(60));
|
|
61
|
+
for (const [strategy, group] of byStrategy) {
|
|
62
|
+
const sizes = group.map((c) => c.content.length);
|
|
63
|
+
const avgSize = Math.round(sizes.reduce((s, v) => s + v, 0) / sizes.length);
|
|
64
|
+
const { cohesion, midSentenceCuts, suggestion } = computeCohesion(group);
|
|
65
|
+
console.log(`\n Strategy: ${strategy}`);
|
|
66
|
+
console.log(` Chunks : ${group.length}`);
|
|
67
|
+
console.log(` Avg size : ${avgSize} chars`);
|
|
68
|
+
console.log(` Cohesion : ${(cohesion * 100).toFixed(1)}%`);
|
|
69
|
+
console.log(` Mid-sentence cuts: ${midSentenceCuts}`);
|
|
70
|
+
console.log(` š” ${suggestion}`);
|
|
71
|
+
}
|
|
72
|
+
console.log("\n" + "ā".repeat(60));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=chunks-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunks-report.js","sourceRoot":"","sources":["../../src/cli/chunks-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/cli/dashboard.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AA6CD,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDxE"}
|