@qvac/sdk 0.13.5 → 0.14.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/NOTICE +95 -1151
- package/README.md +1 -2
- package/bare-imports.json +0 -5
- package/dist/client/api/bci-transcribe.js +2 -1
- package/dist/client/api/download-asset.js +2 -1
- package/dist/client/api/finetune.js +6 -5
- package/dist/client/api/index.d.ts +1 -0
- package/dist/client/api/index.js +1 -0
- package/dist/client/api/load-model.d.ts +11 -8
- package/dist/client/api/load-model.js +6 -6
- package/dist/client/api/subscribe-logs.d.ts +28 -0
- package/dist/client/api/subscribe-logs.js +43 -0
- package/dist/client/api/text-to-speech.js +2 -1
- package/dist/client/config-loader/config-utils.js +2 -4
- package/dist/client/config-loader/resolve-config.bare.js +4 -3
- package/dist/client/parse-input.d.ts +3 -0
- package/dist/client/parse-input.js +14 -0
- package/dist/client/rpc/expo-rpc-client.js +2 -11
- package/dist/client/rpc/node-rpc-client.js +8 -2
- package/dist/client/rpc/rpc-client.js +39 -7
- package/dist/commands/bundle/constants.js +2 -1
- package/dist/commands/bundle/entry-gen.d.ts +1 -1
- package/dist/commands/bundle/entry-gen.js +6 -6
- package/dist/commands/bundle/index.js +3 -1
- package/dist/commands/bundle/resolve-sdk-import.d.ts +6 -0
- package/dist/commands/bundle/resolve-sdk-import.js +60 -0
- package/dist/examples/bci/bci-filesystem-streaming.js +14 -14
- package/dist/examples/bci/bci-filesystem.js +17 -13
- package/dist/examples/cache-management.js +38 -38
- package/dist/examples/cancel-by-request-id.js +9 -9
- package/dist/examples/completion-events.js +20 -14
- package/dist/examples/completion-stop-reason.js +13 -7
- package/dist/examples/concurrent-completion-collision.js +7 -7
- package/dist/examples/config-reload.js +7 -8
- package/dist/examples/default-config-usage.js +4 -4
- package/dist/examples/delegated-inference/composite.js +14 -10
- package/dist/examples/delegated-inference/consumer-profiled.js +13 -13
- package/dist/examples/delegated-inference/consumer.js +16 -12
- package/dist/examples/delegated-inference/provider.js +12 -12
- package/dist/examples/diffusion-esrgan-upscale.js +19 -15
- package/dist/examples/diffusion-flux2-klein-img2img.js +16 -11
- package/dist/examples/diffusion-flux2-klein.js +14 -9
- package/dist/examples/diffusion-img2img.js +9 -10
- package/dist/examples/diffusion-img2vid.js +17 -12
- package/dist/examples/diffusion-simple.js +1 -1
- package/dist/examples/diffusion-txt2img.js +14 -9
- package/dist/examples/diffusion-txt2vid.js +15 -10
- package/dist/examples/download-with-blind-relays.js +16 -21
- package/dist/examples/download-with-cancel.js +15 -16
- package/dist/examples/embed-multi-gpu.js +3 -4
- package/dist/examples/embed-p2p.js +11 -7
- package/dist/examples/finetune/llamacpp-finetune.js +7 -7
- package/dist/examples/kv-cache-cleanup.js +35 -35
- package/dist/examples/kv-cache-custom-key.js +24 -24
- package/dist/examples/kv-cache-example.js +9 -9
- package/dist/examples/llamacpp-cache.js +18 -14
- package/dist/examples/llamacpp-dynamic-tools.js +15 -9
- package/dist/examples/llamacpp-filesystem.js +15 -9
- package/dist/examples/llamacpp-http.js +12 -10
- package/dist/examples/llamacpp-multi-gpu.js +4 -4
- package/dist/examples/llamacpp-multimodal.js +13 -9
- package/dist/examples/llamacpp-p2p.js +8 -4
- package/dist/examples/llamacpp-sharded.js +5 -5
- package/dist/examples/llamacpp-structured-output.js +15 -9
- package/dist/examples/logging-file-transport.js +3 -3
- package/dist/examples/logging-global.d.ts +2 -0
- package/dist/examples/logging-global.js +34 -0
- package/dist/examples/logging-streaming.js +7 -10
- package/dist/examples/mcp-websearch.js +24 -18
- package/dist/examples/multi-model-demo.js +17 -11
- package/dist/examples/ocr-fasttext.js +14 -16
- package/dist/examples/parallel-download.js +7 -7
- package/dist/examples/plugins.js +40 -28
- package/dist/examples/profiling/basic.js +16 -10
- package/dist/examples/profiling/per-call.js +17 -11
- package/dist/examples/quickstart.bare.d.ts +2 -0
- package/dist/examples/quickstart.bare.js +18 -0
- package/dist/examples/quickstart.js +10 -3
- package/dist/examples/rag/rag-chromadb.js +18 -14
- package/dist/examples/rag/rag-hyperdb/cancellation.js +17 -14
- package/dist/examples/rag/rag-hyperdb/ingest.js +14 -12
- package/dist/examples/rag/rag-hyperdb/pipeline.js +19 -17
- package/dist/examples/rag/rag-hyperdb/workspaces.js +31 -27
- package/dist/examples/rag/rag-lancedb.js +12 -8
- package/dist/examples/rag/rag-sqlite.js +11 -7
- package/dist/examples/registry-query.js +17 -17
- package/dist/examples/seed-p2p.js +10 -6
- package/dist/examples/suspend-resume.js +20 -16
- package/dist/examples/tools/llamacpp-native-tools.js +24 -18
- package/dist/examples/tools/llamacpp-tools-gemma4.js +14 -8
- package/dist/examples/tools/llamacpp-tools-harmony-multiturn.js +20 -14
- package/dist/examples/tools/llamacpp-tools-pythonic.js +14 -8
- package/dist/examples/tools/llamacpp-tools-qwen35.js +14 -8
- package/dist/examples/transcription/parakeet-ctc-filesystem.js +12 -9
- package/dist/examples/transcription/parakeet-microphone-record.js +15 -9
- package/dist/examples/transcription/parakeet-microphone-stream.js +15 -9
- package/dist/examples/transcription/parakeet-sortformer-streaming.js +12 -6
- package/dist/examples/transcription/parakeet-sortformer.js +3 -5
- package/dist/examples/transcription/parakeet-tdt-filesystem.js +13 -10
- package/dist/examples/transcription/whispercpp-filesystem-streaming.js +16 -17
- package/dist/examples/transcription/whispercpp-filesystem.js +14 -10
- package/dist/examples/transcription/whispercpp-microphone-conversation.js +10 -10
- package/dist/examples/transcription/whispercpp-microphone-record.js +6 -6
- package/dist/examples/transcription/whispercpp-prompt.js +14 -10
- package/dist/examples/translation/translation-bergamot-batch.js +11 -7
- package/dist/examples/translation/translation-bergamot-pivot.js +13 -9
- package/dist/examples/translation/translation-bergamot.js +8 -4
- package/dist/examples/translation/translation-indic.js +8 -4
- package/dist/examples/translation/translation-llm-afriquegemma.js +7 -3
- package/dist/examples/translation/translation-llm-context.js +8 -4
- package/dist/examples/translation/translation-llm.js +7 -3
- package/dist/examples/translation/translation-stream.js +4 -4
- package/dist/examples/tts/chatterbox.js +19 -11
- package/dist/examples/tts/llm-to-tts-streaming.js +27 -14
- package/dist/examples/tts/supertonic-multilingual.js +18 -14
- package/dist/examples/tts/supertonic.js +19 -15
- package/dist/examples/tts/utils.js +1 -1
- package/dist/examples/vla-pi05.js +18 -14
- package/dist/examples/vla-smolvla.js +18 -14
- package/dist/examples/voice-assistant/voice-assistant.js +12 -12
- package/dist/index.d.ts +3 -4
- package/dist/index.js +3 -4
- package/dist/logging/client-logger.js +2 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.js +1 -1
- package/dist/logging/namespaces.d.ts +1 -0
- package/dist/logging/namespaces.js +2 -0
- package/dist/logging/server-logger.js +1 -4
- package/dist/logging/utils.js +6 -1
- package/dist/models/registry/index.d.ts +17 -0
- package/dist/models/registry/index.js +20 -1
- package/dist/models/registry/models.d.ts +1062 -38
- package/dist/models/registry/models.js +3546 -2490
- package/dist/pear/pre.js +2 -2
- package/dist/schemas/bci-config.d.ts +37 -0
- package/dist/schemas/bci-config.js +2 -0
- package/dist/schemas/bci.d.ts +2 -0
- package/dist/schemas/common.d.ts +171 -94
- package/dist/schemas/completion-stream.d.ts +6 -3
- package/dist/schemas/completion-stream.js +10 -2
- package/dist/schemas/download-asset.d.ts +5 -5
- package/dist/schemas/engine-addon-map.d.ts +1 -1
- package/dist/schemas/engine-addon-map.js +6 -3
- package/dist/schemas/error.js +6 -1
- package/dist/schemas/llamacpp-config.d.ts +27 -8
- package/dist/schemas/llamacpp-config.js +19 -2
- package/dist/schemas/load-model.d.ts +4170 -570
- package/dist/schemas/load-model.js +85 -26
- package/dist/schemas/logging-stream.js +7 -1
- package/dist/schemas/model-src-utils.d.ts +6 -6
- package/dist/schemas/model-types.d.ts +14 -15
- package/dist/schemas/model-types.js +10 -11
- package/dist/schemas/ocr.d.ts +10 -8
- package/dist/schemas/ocr.js +8 -6
- package/dist/schemas/plugin.d.ts +6 -5
- package/dist/schemas/plugin.js +4 -4
- package/dist/schemas/rag.d.ts +4 -4
- package/dist/schemas/registry.d.ts +8 -8
- package/dist/schemas/registry.js +1 -1
- package/dist/schemas/reload-config.d.ts +6 -6
- package/dist/schemas/sdcpp-config.d.ts +12 -12
- package/dist/schemas/sdk-config.d.ts +171 -117
- package/dist/schemas/sdk-config.js +5 -5
- package/dist/schemas/sdk-errors-client.d.ts +1 -0
- package/dist/schemas/sdk-errors-client.js +7 -2
- package/dist/schemas/text-to-speech.d.ts +157 -13
- package/dist/schemas/text-to-speech.js +70 -7
- package/dist/schemas/transcription-config.d.ts +5 -1
- package/dist/schemas/transcription-config.js +2 -0
- package/dist/schemas/transcription.d.ts +3 -0
- package/dist/schemas/transcription.js +2 -1
- package/dist/schemas/translate.d.ts +6 -6
- package/dist/schemas/translate.js +2 -3
- package/dist/schemas/translation-config.d.ts +20 -20
- package/dist/server/bare/hyperswarm.js +3 -3
- package/dist/server/bare/ops/transcribe.js +46 -15
- package/dist/server/bare/plugins/bci-whispercpp-transcription/args.d.ts +3 -0
- package/dist/server/bare/plugins/bci-whispercpp-transcription/args.js +13 -0
- package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.d.ts +41 -0
- package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.js +6 -11
- package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.d.ts +75 -0
- package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.js +11 -0
- package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.d.ts +16 -10
- package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.js +25 -18
- package/dist/server/bare/plugins/index.d.ts +1 -1
- package/dist/server/bare/plugins/index.js +1 -1
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.d.ts +10 -0
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.js +29 -0
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +4 -22
- package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +15 -7
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +7 -7
- package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +2 -0
- package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +10 -10
- package/dist/server/bare/plugins/tts-ggml/plugin.d.ts +14 -8
- package/dist/server/bare/plugins/tts-ggml/plugin.js +12 -0
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +3 -1
- package/dist/server/bare/registry/logging-stream-registry.d.ts +4 -2
- package/dist/server/bare/registry/logging-stream-registry.js +12 -7
- package/dist/server/bare/registry/model-config-utils.js +2 -2
- package/dist/server/bare/registry/registry-client.js +1 -1
- package/dist/server/bare/runtime-lifecycle.d.ts +9 -0
- package/dist/server/bare/runtime-lifecycle.js +24 -0
- package/dist/server/bare/types/addon-responses.d.ts +1 -0
- package/dist/server/env.js +7 -10
- package/dist/server/plugins/registry.js +2 -4
- package/dist/server/rpc/handlers/load-model/handler.js +2 -4
- package/dist/server/rpc/handlers/load-model/http.js +253 -51
- package/dist/server/rpc/handlers/logging-stream.js +4 -2
- package/dist/server/rpc/handlers/plugin-invoke.js +5 -16
- package/dist/server/utils/completion-normalizer.js +13 -4
- package/dist/server/utils/worker-lock.js +5 -5
- package/dist/server/worker-core.d.ts +1 -1
- package/dist/server/worker-core.js +28 -18
- package/dist/utils/errors-client.d.ts +3 -0
- package/dist/utils/errors-client.js +5 -0
- package/dist/utils/errors-server.d.ts +2 -0
- package/dist/utils/errors-server.js +3 -0
- package/dist/utils/zod-error.d.ts +3 -0
- package/dist/utils/zod-error.js +4 -0
- package/package.json +21 -24
- package/dist/polyfills/bare-globals.d.ts +0 -2
- package/dist/polyfills/bare-globals.js +0 -4
- package/dist/polyfills/bare-globals.noop.d.ts +0 -2
- package/dist/polyfills/bare-globals.noop.js +0 -1
- /package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/ops/ocr-stream.d.ts +0 -0
- /package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/ops/ocr-stream.js +0 -0
|
@@ -3,7 +3,7 @@ import { embed, loadModel, unloadModel, GTE_LARGE_FP16 } from "@qvac/sdk";
|
|
|
3
3
|
import { ChromaClient } from "chromadb";
|
|
4
4
|
// Setup instructions for ChromaDB server
|
|
5
5
|
const CHROMADB_SETUP_INSTRUCTIONS = `
|
|
6
|
-
|
|
6
|
+
▸ To run this example, you need a ChromaDB server running locally.
|
|
7
7
|
|
|
8
8
|
Setup options:
|
|
9
9
|
|
|
@@ -21,12 +21,12 @@ async function initializeChromaClient() {
|
|
|
21
21
|
const client = new ChromaClient({ host: "localhost", port: 8000 });
|
|
22
22
|
try {
|
|
23
23
|
await client.heartbeat();
|
|
24
|
-
console.log("
|
|
24
|
+
console.log("▸ Connected to ChromaDB server");
|
|
25
25
|
return client;
|
|
26
26
|
}
|
|
27
27
|
catch {
|
|
28
|
-
console.error("
|
|
29
|
-
console.error("Please ensure the server is running on localhost:8000");
|
|
28
|
+
console.error("✖ Failed to connect to ChromaDB server");
|
|
29
|
+
console.error("▸ Please ensure the server is running on localhost:8000");
|
|
30
30
|
console.error(CHROMADB_SETUP_INSTRUCTIONS);
|
|
31
31
|
process.exit(1);
|
|
32
32
|
}
|
|
@@ -34,11 +34,17 @@ async function initializeChromaClient() {
|
|
|
34
34
|
try {
|
|
35
35
|
// Get query from command line or use default
|
|
36
36
|
const query = process.argv[2] || "machine learning algorithms";
|
|
37
|
-
console.log(
|
|
37
|
+
console.log(`▸ Query: "${query}"`);
|
|
38
38
|
const client = await initializeChromaClient();
|
|
39
39
|
const modelId = await loadModel({
|
|
40
40
|
modelSrc: GTE_LARGE_FP16,
|
|
41
|
-
onProgress: (p) =>
|
|
41
|
+
onProgress: (p) => {
|
|
42
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
43
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
44
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
45
|
+
if (p.percentage >= 100)
|
|
46
|
+
process.stderr.write("\n");
|
|
47
|
+
},
|
|
42
48
|
});
|
|
43
49
|
// Sample corpus
|
|
44
50
|
const samples = [
|
|
@@ -81,14 +87,14 @@ try {
|
|
|
81
87
|
await client.deleteCollection({ name: collectionName });
|
|
82
88
|
}
|
|
83
89
|
catch (e) {
|
|
84
|
-
console.warn(
|
|
90
|
+
console.warn(`▸ Collection didn't exist, no need to delete: ${String(e)}`);
|
|
85
91
|
}
|
|
86
92
|
const collection = await client.createCollection({
|
|
87
93
|
name: collectionName,
|
|
88
94
|
embeddingFunction: null,
|
|
89
95
|
});
|
|
90
96
|
// Embed and add documents (we're bringing our own embeddings)
|
|
91
|
-
console.log("
|
|
97
|
+
console.log("▸ Embedding documents...");
|
|
92
98
|
const ids = [];
|
|
93
99
|
const documents = [];
|
|
94
100
|
const embeddings = [];
|
|
@@ -102,7 +108,7 @@ try {
|
|
|
102
108
|
documents,
|
|
103
109
|
embeddings,
|
|
104
110
|
});
|
|
105
|
-
console.log("
|
|
111
|
+
console.log("▸ Searching for similar documents...");
|
|
106
112
|
const { embedding: queryEmbedding } = await embed({ modelId, text: query });
|
|
107
113
|
// Query top 3 by vector similarity and include distances
|
|
108
114
|
const res = await collection.query({
|
|
@@ -110,19 +116,17 @@ try {
|
|
|
110
116
|
nResults: 3,
|
|
111
117
|
include: ["documents", "distances"],
|
|
112
118
|
});
|
|
113
|
-
console.log("
|
|
119
|
+
console.log("▸ Top 3 most similar documents:");
|
|
114
120
|
const docs = res.documents?.[0] ?? [];
|
|
115
121
|
const dists = res.distances?.[0] ?? [];
|
|
116
122
|
for (let i = 0; i < docs.length; i++) {
|
|
117
|
-
console.log(
|
|
118
|
-
console.log(`\n${i + 1}. (Score: ${dists[i]?.toFixed(4)})`);
|
|
123
|
+
console.log(`${i + 1}. (Score: ${dists[i]?.toFixed(4)})`);
|
|
119
124
|
console.log(` ${docs[i]}`);
|
|
120
|
-
console.log("=".repeat(100));
|
|
121
125
|
console.log();
|
|
122
126
|
}
|
|
123
127
|
await unloadModel({ modelId });
|
|
124
128
|
}
|
|
125
129
|
catch (error) {
|
|
126
|
-
console.error("
|
|
130
|
+
console.error("✖", error);
|
|
127
131
|
process.exit(1);
|
|
128
132
|
}
|
|
@@ -15,19 +15,23 @@ function generateDocuments(count) {
|
|
|
15
15
|
});
|
|
16
16
|
}
|
|
17
17
|
try {
|
|
18
|
-
console.log("RAG Cancellation Example
|
|
18
|
+
console.log("▸ RAG Cancellation Example");
|
|
19
19
|
// Load embedding model
|
|
20
|
-
console.log("Loading embedding model...");
|
|
20
|
+
console.log("▸ Loading embedding model...");
|
|
21
21
|
const modelId = await loadModel({
|
|
22
22
|
modelSrc: GTE_LARGE_FP16,
|
|
23
|
-
onProgress: (
|
|
24
|
-
|
|
23
|
+
onProgress: (p) => {
|
|
24
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
25
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
26
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
27
|
+
if (p.percentage >= 100)
|
|
28
|
+
process.stderr.write("\n");
|
|
25
29
|
},
|
|
26
30
|
});
|
|
27
|
-
console.log("
|
|
31
|
+
console.log("▸ Model loaded");
|
|
28
32
|
// Generate documents
|
|
29
33
|
const documents = generateDocuments(200);
|
|
30
|
-
console.log(
|
|
34
|
+
console.log(`▸ Processing ${documents.length} documents...`);
|
|
31
35
|
let progressCount = 0;
|
|
32
36
|
let cancelled = false;
|
|
33
37
|
// Capture the decorated promise so we can cancel by `requestId` (the
|
|
@@ -40,10 +44,9 @@ try {
|
|
|
40
44
|
progressInterval: 50,
|
|
41
45
|
onProgress: (stage, current, total) => {
|
|
42
46
|
progressCount++;
|
|
43
|
-
|
|
44
|
-
console.log(` [${stage}] ${current}/${total} (${pct}%)`);
|
|
47
|
+
console.log(`▸ ${stage} ${current}/${total}`);
|
|
45
48
|
if (!cancelled && stage === "embedding" && current > 10) {
|
|
46
|
-
console.log("
|
|
49
|
+
console.log("▸ Triggering cancellation...");
|
|
47
50
|
cancelled = true;
|
|
48
51
|
void cancel({ requestId: ingest.requestId });
|
|
49
52
|
}
|
|
@@ -51,15 +54,15 @@ try {
|
|
|
51
54
|
});
|
|
52
55
|
try {
|
|
53
56
|
await ingest;
|
|
54
|
-
console.log("
|
|
57
|
+
console.log("▸ Ingest completed (cancellation didn't interrupt in time)");
|
|
55
58
|
}
|
|
56
59
|
catch (error) {
|
|
57
60
|
const msg = error instanceof Error ? error.message : String(error);
|
|
58
61
|
const wasCancelled = msg.toLowerCase().includes("cancel") ||
|
|
59
62
|
msg.toLowerCase().includes("abort");
|
|
60
63
|
if (wasCancelled) {
|
|
61
|
-
console.log("
|
|
62
|
-
console.log(
|
|
64
|
+
console.log("▸ Operation cancelled successfully!");
|
|
65
|
+
console.log(`▸ Progress updates received: ${progressCount}`);
|
|
63
66
|
}
|
|
64
67
|
else {
|
|
65
68
|
throw error;
|
|
@@ -68,10 +71,10 @@ try {
|
|
|
68
71
|
// Cleanup (workspace may not exist if cancelled early)
|
|
69
72
|
await ragCloseWorkspace({ workspace: WORKSPACE, deleteOnClose: true }).catch(() => { });
|
|
70
73
|
await unloadModel({ modelId });
|
|
71
|
-
console.log("
|
|
74
|
+
console.log("▸ Done");
|
|
72
75
|
process.exit(0);
|
|
73
76
|
}
|
|
74
77
|
catch (error) {
|
|
75
|
-
console.error("
|
|
78
|
+
console.error("✖", error);
|
|
76
79
|
process.exit(1);
|
|
77
80
|
}
|
|
@@ -3,11 +3,15 @@ try {
|
|
|
3
3
|
// Get query from command line or use default
|
|
4
4
|
const query = process.argv[2] || "machine learning algorithms";
|
|
5
5
|
const workspace = "ingest-example";
|
|
6
|
-
console.log(
|
|
6
|
+
console.log(`▸ Query: "${query}"`);
|
|
7
7
|
const modelId = await loadModel({
|
|
8
8
|
modelSrc: GTE_LARGE_FP16,
|
|
9
|
-
onProgress: (
|
|
10
|
-
|
|
9
|
+
onProgress: (p) => {
|
|
10
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
11
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
12
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
13
|
+
if (p.percentage >= 100)
|
|
14
|
+
process.stderr.write("\n");
|
|
11
15
|
},
|
|
12
16
|
});
|
|
13
17
|
const samples = [
|
|
@@ -20,35 +24,33 @@ try {
|
|
|
20
24
|
"Cloud computing delivers computing services over the internet, allowing users to access resources like storage, processing power, and applications on-demand from anywhere.",
|
|
21
25
|
"Cybersecurity protects digital systems, networks, and data from malicious attacks, unauthorized access, and various forms of cyber threats through multiple layers of defense.",
|
|
22
26
|
];
|
|
23
|
-
console.log("
|
|
27
|
+
console.log("▸ Ingesting documents...");
|
|
24
28
|
const result = await ragIngest({
|
|
25
29
|
modelId,
|
|
26
30
|
workspace,
|
|
27
31
|
documents: samples,
|
|
28
32
|
chunk: false,
|
|
29
33
|
});
|
|
30
|
-
console.log(
|
|
31
|
-
console.log("
|
|
34
|
+
console.log(`▸ Ingested ${result.processed.length} documents`);
|
|
35
|
+
console.log("▸ Searching for similar documents...");
|
|
32
36
|
const results = await ragSearch({
|
|
33
37
|
modelId,
|
|
34
38
|
workspace,
|
|
35
39
|
query,
|
|
36
40
|
topK: 3,
|
|
37
41
|
});
|
|
38
|
-
console.log("
|
|
42
|
+
console.log("▸ Top 3 most similar documents:");
|
|
39
43
|
results.forEach((result, index) => {
|
|
40
|
-
console.log(
|
|
41
|
-
console.log(`\n${index + 1}. (Score: ${result.score})`);
|
|
44
|
+
console.log(`${index + 1}. (Score: ${result.score})`);
|
|
42
45
|
console.log(` ${result.content}`);
|
|
43
|
-
console.log("=".repeat(100));
|
|
44
46
|
console.log();
|
|
45
47
|
});
|
|
46
48
|
// Cleanup: close and delete workspace
|
|
47
49
|
await ragCloseWorkspace({ workspace, deleteOnClose: true });
|
|
48
|
-
console.log(
|
|
50
|
+
console.log(`▸ Deleted '${workspace}' workspace`);
|
|
49
51
|
await unloadModel({ modelId });
|
|
50
52
|
}
|
|
51
53
|
catch (error) {
|
|
52
|
-
console.error("
|
|
54
|
+
console.error("✖", error);
|
|
53
55
|
process.exit(1);
|
|
54
56
|
}
|
|
@@ -2,13 +2,17 @@ import { loadModel, unloadModel, embed, GTE_LARGE_FP16, ragChunk, ragSaveEmbeddi
|
|
|
2
2
|
try {
|
|
3
3
|
// Get query from command line or use default
|
|
4
4
|
const query = process.argv[2] || "machine learning algorithms";
|
|
5
|
-
console.log("
|
|
6
|
-
console.log(
|
|
5
|
+
console.log("▸ RAG Pipeline Example (Segregated Flow)");
|
|
6
|
+
console.log(`▸ Query: "${query}"`);
|
|
7
7
|
const workspace = "pipeline-example";
|
|
8
8
|
const modelId = await loadModel({
|
|
9
9
|
modelSrc: GTE_LARGE_FP16,
|
|
10
|
-
onProgress: (
|
|
11
|
-
|
|
10
|
+
onProgress: (p) => {
|
|
11
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
12
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
13
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
14
|
+
if (p.percentage >= 100)
|
|
15
|
+
process.stderr.write("\n");
|
|
12
16
|
},
|
|
13
17
|
});
|
|
14
18
|
const samples = [
|
|
@@ -21,7 +25,7 @@ try {
|
|
|
21
25
|
"Cloud computing delivers computing services over the internet, allowing users to access resources like storage, processing power, and applications on-demand from anywhere.",
|
|
22
26
|
"Cybersecurity protects digital systems, networks, and data from malicious attacks, unauthorized access, and various forms of cyber threats through multiple layers of defense.",
|
|
23
27
|
];
|
|
24
|
-
console.log("
|
|
28
|
+
console.log("▸ Step 1: Chunking documents...");
|
|
25
29
|
const chunks = await ragChunk({
|
|
26
30
|
documents: samples,
|
|
27
31
|
chunkOpts: {
|
|
@@ -29,8 +33,8 @@ try {
|
|
|
29
33
|
chunkOverlap: 20,
|
|
30
34
|
},
|
|
31
35
|
});
|
|
32
|
-
console.log(
|
|
33
|
-
console.log("
|
|
36
|
+
console.log(`▸ Created ${chunks.length} chunks`);
|
|
37
|
+
console.log("▸ Step 2: Generating embeddings (batch)...");
|
|
34
38
|
const texts = chunks.map((chunk) => chunk.content);
|
|
35
39
|
const { embedding: embeddings } = await embed({ modelId, text: texts });
|
|
36
40
|
const embeddedDocs = chunks.map((chunk, i) => ({
|
|
@@ -39,35 +43,33 @@ try {
|
|
|
39
43
|
embedding: embeddings[i],
|
|
40
44
|
embeddingModelId: modelId,
|
|
41
45
|
}));
|
|
42
|
-
console.log(
|
|
43
|
-
console.log("
|
|
46
|
+
console.log(`▸ Generated ${embeddedDocs.length} embeddings`);
|
|
47
|
+
console.log("▸ Step 3: Saving to vector database...");
|
|
44
48
|
const saveResult = await ragSaveEmbeddings({
|
|
45
49
|
workspace,
|
|
46
50
|
documents: embeddedDocs,
|
|
47
51
|
});
|
|
48
52
|
const saved = saveResult.filter((r) => r.status === "fulfilled").length;
|
|
49
|
-
console.log(
|
|
50
|
-
console.log("
|
|
53
|
+
console.log(`▸ Saved ${saved}/${saveResult.length} documents`);
|
|
54
|
+
console.log("▸ Step 4: Searching...");
|
|
51
55
|
const results = await ragSearch({
|
|
52
56
|
workspace,
|
|
53
57
|
modelId,
|
|
54
58
|
query,
|
|
55
59
|
topK: 3,
|
|
56
60
|
});
|
|
57
|
-
console.log("
|
|
61
|
+
console.log("▸ Top 3 most similar documents:");
|
|
58
62
|
results.forEach((result, index) => {
|
|
59
|
-
console.log(
|
|
60
|
-
console.log(`\n${index + 1}. (Score: ${result.score})`);
|
|
63
|
+
console.log(`${index + 1}. (Score: ${result.score})`);
|
|
61
64
|
console.log(` ${result.content}`);
|
|
62
|
-
console.log("=".repeat(100));
|
|
63
65
|
console.log();
|
|
64
66
|
});
|
|
65
67
|
// Cleanup: close and delete workspace
|
|
66
68
|
await ragCloseWorkspace({ workspace, deleteOnClose: true });
|
|
67
|
-
console.log(
|
|
69
|
+
console.log(`▸ Deleted '${workspace}' workspace`);
|
|
68
70
|
await unloadModel({ modelId });
|
|
69
71
|
}
|
|
70
72
|
catch (error) {
|
|
71
|
-
console.error("
|
|
73
|
+
console.error("✖", error);
|
|
72
74
|
process.exit(1);
|
|
73
75
|
}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { loadModel, unloadModel, GTE_LARGE_FP16, ragIngest, ragSearch, ragDeleteEmbeddings, ragListWorkspaces, ragCloseWorkspace, ragReindex, } from "@qvac/sdk";
|
|
2
2
|
try {
|
|
3
|
-
console.log("
|
|
3
|
+
console.log("▸ RAG Workspaces with Chunking Example");
|
|
4
4
|
// Load model
|
|
5
5
|
const modelId = await loadModel({
|
|
6
6
|
modelSrc: GTE_LARGE_FP16,
|
|
7
|
-
onProgress: (p) =>
|
|
7
|
+
onProgress: (p) => {
|
|
8
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
9
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
10
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
11
|
+
if (p.percentage >= 100)
|
|
12
|
+
process.stderr.write("\n");
|
|
13
|
+
},
|
|
8
14
|
});
|
|
9
|
-
console.log("\n");
|
|
10
15
|
// Medical articles (will be chunked)
|
|
11
16
|
const medicalArticles = [
|
|
12
17
|
`COVID-19: A Comprehensive Overview
|
|
@@ -68,7 +73,7 @@ try {
|
|
|
68
73
|
"Deep learning neural networks enable breakthroughs in computer vision and natural language processing.",
|
|
69
74
|
];
|
|
70
75
|
// Ingest medical articles with chunking
|
|
71
|
-
console.log("
|
|
76
|
+
console.log("▸ Ingesting medical articles with chunking...");
|
|
72
77
|
const medicalResult = await ragIngest({
|
|
73
78
|
modelId,
|
|
74
79
|
workspace: "medical",
|
|
@@ -81,16 +86,16 @@ try {
|
|
|
81
86
|
splitStrategy: "token",
|
|
82
87
|
},
|
|
83
88
|
});
|
|
84
|
-
console.log(
|
|
89
|
+
console.log(`▸ Created ${medicalResult.processed.length} chunks from medical articles`);
|
|
85
90
|
// Ingest tech docs without chunking
|
|
86
|
-
console.log("\n
|
|
91
|
+
console.log("\n▸ Ingesting tech documents...");
|
|
87
92
|
const techResult = await ragIngest({
|
|
88
93
|
modelId,
|
|
89
94
|
workspace: "technology",
|
|
90
95
|
documents: techDocs,
|
|
91
96
|
chunk: false,
|
|
92
97
|
});
|
|
93
|
-
console.log(
|
|
98
|
+
console.log(`▸ Ingested ${techResult.processed.length} tech documents`);
|
|
94
99
|
// Test searches
|
|
95
100
|
const searches = [
|
|
96
101
|
{ workspace: "medical", query: "COVID symptoms fever", label: "Medical" },
|
|
@@ -98,20 +103,20 @@ try {
|
|
|
98
103
|
{ workspace: "technology", query: "neural networks", label: "Tech" },
|
|
99
104
|
{ workspace: "technology", query: "COVID", label: "Tech (isolation test)" },
|
|
100
105
|
];
|
|
101
|
-
console.log("\n
|
|
106
|
+
console.log("\n▸ Running searches:");
|
|
102
107
|
for (const { workspace, query, label } of searches) {
|
|
103
108
|
const results = await ragSearch({ modelId, workspace, query, topK: 1 });
|
|
104
109
|
console.log(`\n${label}: "${query}"`);
|
|
105
110
|
if (results.length > 0 && results[0]) {
|
|
106
|
-
console.log(`
|
|
107
|
-
console.log(`
|
|
111
|
+
console.log(` Score: ${results[0].score.toFixed(3)}`);
|
|
112
|
+
console.log(` Match: ${results[0].content.substring(0, 80)}...`);
|
|
108
113
|
}
|
|
109
114
|
else {
|
|
110
|
-
console.log(`
|
|
115
|
+
console.log(` ▸ No results (workspace isolation working correctly)`);
|
|
111
116
|
}
|
|
112
117
|
}
|
|
113
118
|
// Test a third workspace
|
|
114
|
-
console.log("\n
|
|
119
|
+
console.log("\n▸ Testing 'general' workspace...");
|
|
115
120
|
await ragIngest({
|
|
116
121
|
modelId,
|
|
117
122
|
workspace: "general",
|
|
@@ -123,20 +128,19 @@ try {
|
|
|
123
128
|
workspace: "general",
|
|
124
129
|
query: "general workspace",
|
|
125
130
|
});
|
|
126
|
-
console.log(
|
|
131
|
+
console.log(`▸ General workspace: ${generalSearch?.[0]?.content === "General workspace content for testing" ? "Working" : "Failed"}`);
|
|
127
132
|
// Reindexing - regenerate embeddings for an existing workspace
|
|
128
|
-
console.log("\n
|
|
133
|
+
console.log("\n▸ Reindexing medical workspace...");
|
|
129
134
|
const reindexResult = await ragReindex({
|
|
130
135
|
workspace: "medical",
|
|
131
136
|
modelId,
|
|
132
137
|
onProgress: (stage, current, total) => {
|
|
133
|
-
|
|
134
|
-
console.log(` [${stage}] ${current}/${total} (${pct}%)`);
|
|
138
|
+
console.log(`▸ ${stage} ${current}/${total}`);
|
|
135
139
|
},
|
|
136
140
|
});
|
|
137
|
-
console.log(
|
|
141
|
+
console.log(`▸ ${reindexResult.reindexed ? "Reindex completed" : "Reindex returned false"} for medical workspace`);
|
|
138
142
|
if (reindexResult.details) {
|
|
139
|
-
console.log("
|
|
143
|
+
console.log("▸ Details:", reindexResult.details);
|
|
140
144
|
}
|
|
141
145
|
// Verify reindexed data still works
|
|
142
146
|
const reindexVerify = await ragSearch({
|
|
@@ -145,7 +149,7 @@ try {
|
|
|
145
149
|
query: "COVID symptoms",
|
|
146
150
|
topK: 1,
|
|
147
151
|
});
|
|
148
|
-
console.log(
|
|
152
|
+
console.log(`▸ Verification search: ${reindexVerify.length > 0 ? "Working" : "Failed"}`);
|
|
149
153
|
// Cleanup example
|
|
150
154
|
const firstChunk = medicalResult.processed.find((p) => p.status === "fulfilled" && p.id);
|
|
151
155
|
if (firstChunk?.id) {
|
|
@@ -153,25 +157,25 @@ try {
|
|
|
153
157
|
workspace: "medical",
|
|
154
158
|
ids: [firstChunk.id],
|
|
155
159
|
});
|
|
156
|
-
console.log("\n
|
|
160
|
+
console.log("\n▸ Deleted one medical chunk");
|
|
157
161
|
}
|
|
158
162
|
// List all workspaces
|
|
159
|
-
console.log("\n
|
|
163
|
+
console.log("\n▸ Listing workspaces...");
|
|
160
164
|
const workspaces = await ragListWorkspaces();
|
|
161
165
|
workspaces.forEach((ws) => {
|
|
162
|
-
console.log(
|
|
166
|
+
console.log(`▸ ${ws.name} (${ws.open ? "open" : "closed"})`);
|
|
163
167
|
});
|
|
164
168
|
// Close and delete all workspaces created in this example
|
|
165
|
-
console.log("\n
|
|
169
|
+
console.log("\n▸ Closing and deleting workspaces...");
|
|
166
170
|
await ragCloseWorkspace({ workspace: "medical", deleteOnClose: true });
|
|
167
|
-
console.log("Deleted 'medical' workspace");
|
|
171
|
+
console.log("▸ Deleted 'medical' workspace");
|
|
168
172
|
await ragCloseWorkspace({ workspace: "technology", deleteOnClose: true });
|
|
169
|
-
console.log("Deleted 'technology' workspace");
|
|
173
|
+
console.log("▸ Deleted 'technology' workspace");
|
|
170
174
|
await ragCloseWorkspace({ workspace: "general", deleteOnClose: true });
|
|
171
|
-
console.log("Deleted 'general' workspace");
|
|
175
|
+
console.log("▸ Deleted 'general' workspace");
|
|
172
176
|
await unloadModel({ modelId });
|
|
173
177
|
}
|
|
174
178
|
catch (error) {
|
|
175
|
-
console.error("
|
|
179
|
+
console.error("✖", error);
|
|
176
180
|
process.exit(1);
|
|
177
181
|
}
|
|
@@ -4,12 +4,16 @@ import * as a from "apache-arrow";
|
|
|
4
4
|
try {
|
|
5
5
|
// Get query from command line or use default
|
|
6
6
|
const query = process.argv[2] || "machine learning algorithms";
|
|
7
|
-
console.log(
|
|
7
|
+
console.log(`▸ Query: "${query}"`);
|
|
8
8
|
const db = await lancedb.connect(".rag-lancedb");
|
|
9
9
|
const modelId = await loadModel({
|
|
10
10
|
modelSrc: GTE_LARGE_FP16,
|
|
11
|
-
onProgress: (
|
|
12
|
-
|
|
11
|
+
onProgress: (p) => {
|
|
12
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
13
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
14
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
15
|
+
if (p.percentage >= 100)
|
|
16
|
+
process.stderr.write("\n");
|
|
13
17
|
},
|
|
14
18
|
});
|
|
15
19
|
const samples = [
|
|
@@ -56,10 +60,10 @@ try {
|
|
|
56
60
|
await db.dropTable("documents");
|
|
57
61
|
}
|
|
58
62
|
catch (e) {
|
|
59
|
-
console.warn(
|
|
63
|
+
console.warn(`▸ Table doesn't exist, no need to drop: ${String(e)}`);
|
|
60
64
|
}
|
|
61
65
|
const documentsTable = await db.createEmptyTable("documents", schema);
|
|
62
|
-
console.log("
|
|
66
|
+
console.log("▸ Embedding documents...");
|
|
63
67
|
const documents = [];
|
|
64
68
|
for (const sample of samples) {
|
|
65
69
|
const { embedding } = await embed({ modelId, text: sample.text });
|
|
@@ -71,13 +75,13 @@ try {
|
|
|
71
75
|
documents.push(record);
|
|
72
76
|
}
|
|
73
77
|
await documentsTable.add(documents);
|
|
74
|
-
console.log("
|
|
78
|
+
console.log("▸ Searching for similar documents...");
|
|
75
79
|
const { embedding: queryEmbedding } = await embed({ modelId, text: query });
|
|
76
80
|
const results = (await documentsTable
|
|
77
81
|
.vectorSearch(queryEmbedding)
|
|
78
82
|
.limit(1)
|
|
79
83
|
.toArray());
|
|
80
|
-
console.log("\n
|
|
84
|
+
console.log("\n▸ Top 3 most similar documents:");
|
|
81
85
|
results.forEach((result, index) => {
|
|
82
86
|
console.log("=".repeat(50) + " Top result:");
|
|
83
87
|
console.log(`\n${index + 1}. (Score: ${result._distance?.toFixed(4)})`);
|
|
@@ -88,6 +92,6 @@ try {
|
|
|
88
92
|
await unloadModel({ modelId });
|
|
89
93
|
}
|
|
90
94
|
catch (error) {
|
|
91
|
-
console.error("
|
|
95
|
+
console.error("✖", error);
|
|
92
96
|
process.exit(1);
|
|
93
97
|
}
|
|
@@ -3,14 +3,18 @@ import sqlite3InitModule from "@sqliteai/sqlite-wasm";
|
|
|
3
3
|
try {
|
|
4
4
|
// Get query from command line or use default
|
|
5
5
|
const query = process.argv[2] || "machine learning algorithms";
|
|
6
|
-
console.log(
|
|
6
|
+
console.log(`▸ Query: "${query}"`);
|
|
7
7
|
// Initialize SQLite with vector extension
|
|
8
8
|
const sqlite3 = await sqlite3InitModule();
|
|
9
9
|
const db = new sqlite3.oo1.DB(":memory:", "c");
|
|
10
10
|
const modelId = await loadModel({
|
|
11
11
|
modelSrc: GTE_LARGE_FP16,
|
|
12
|
-
onProgress: (
|
|
13
|
-
|
|
12
|
+
onProgress: (p) => {
|
|
13
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
14
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
15
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
16
|
+
if (p.percentage >= 100)
|
|
17
|
+
process.stderr.write("\n");
|
|
14
18
|
},
|
|
15
19
|
});
|
|
16
20
|
const samples = [
|
|
@@ -55,7 +59,7 @@ try {
|
|
|
55
59
|
embedding BLOB NOT NULL
|
|
56
60
|
)
|
|
57
61
|
`);
|
|
58
|
-
console.log("
|
|
62
|
+
console.log("▸ Embedding documents...");
|
|
59
63
|
for (const sample of samples) {
|
|
60
64
|
const { embedding } = await embed({ modelId, text: sample.text });
|
|
61
65
|
db.exec({
|
|
@@ -70,7 +74,7 @@ try {
|
|
|
70
74
|
// [Optional] Preload quantized vectors in memory for optimal performance
|
|
71
75
|
db.exec(`SELECT vector_quantize_preload('documents', 'embedding')`);
|
|
72
76
|
// Search for similar documents
|
|
73
|
-
console.log("
|
|
77
|
+
console.log("▸ Searching for similar documents...");
|
|
74
78
|
const { embedding: queryEmbedding } = await embed({ modelId, text: query });
|
|
75
79
|
const results = [];
|
|
76
80
|
// Perform vector search
|
|
@@ -88,7 +92,7 @@ try {
|
|
|
88
92
|
results.push(typedRow);
|
|
89
93
|
},
|
|
90
94
|
});
|
|
91
|
-
console.log("\n
|
|
95
|
+
console.log("\n▸ Top 3 most similar documents:");
|
|
92
96
|
results.forEach((result, index) => {
|
|
93
97
|
console.log("=".repeat(50) + " Top result:");
|
|
94
98
|
console.log(`\n${index + 1}. [ID: ${result.id}] (Score: ${result.distance.toFixed(4)})`);
|
|
@@ -100,6 +104,6 @@ try {
|
|
|
100
104
|
db.close();
|
|
101
105
|
}
|
|
102
106
|
catch (error) {
|
|
103
|
-
console.error("
|
|
107
|
+
console.error("✖", error);
|
|
104
108
|
process.exit(1);
|
|
105
109
|
}
|