@qvac/sdk 0.13.4 → 0.14.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.
- 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/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/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
|
@@ -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
|
}
|
|
@@ -1,55 +1,55 @@
|
|
|
1
1
|
import { modelRegistryList, modelRegistrySearch, modelRegistryGetModel, ModelType, close, } from "@qvac/sdk";
|
|
2
2
|
try {
|
|
3
|
-
console.log("QVAC Model Registry Query Examples\n");
|
|
3
|
+
console.log("▸ QVAC Model Registry Query Examples\n");
|
|
4
4
|
// List all available models
|
|
5
|
-
console.log("Listing all models in QVAC model registry...");
|
|
5
|
+
console.log("▸ Listing all models in QVAC model registry...");
|
|
6
6
|
const allModels = await modelRegistryList();
|
|
7
|
-
console.log(
|
|
7
|
+
console.log(`▸ Found ${allModels.length} models in registry\n`);
|
|
8
8
|
// Show first 5 models as sample
|
|
9
|
-
console.log("
|
|
9
|
+
console.log("▸ Sample models:");
|
|
10
10
|
allModels.slice(0, 5).forEach((model) => {
|
|
11
11
|
console.log(` - ${model.name} (${model.addon}, ${model.engine}, ${formatSize(model.expectedSize)})`);
|
|
12
12
|
});
|
|
13
13
|
console.log();
|
|
14
14
|
// Search with text filter
|
|
15
|
-
console.log('Searching for "whisper" models...');
|
|
15
|
+
console.log('▸ Searching for "whisper" models...');
|
|
16
16
|
const whisperModels = await modelRegistrySearch({ filter: "whisper" });
|
|
17
|
-
console.log(
|
|
17
|
+
console.log(`▸ Found ${whisperModels.length} whisper-related models\n`);
|
|
18
18
|
// Search by engine (using canonical ModelType enum)
|
|
19
|
-
console.log(
|
|
19
|
+
console.log(`▸ Searching by engine (${ModelType.llamacppEmbedding})...`);
|
|
20
20
|
const embedModels = await modelRegistrySearch({
|
|
21
21
|
engine: ModelType.llamacppEmbedding,
|
|
22
22
|
});
|
|
23
|
-
console.log(
|
|
23
|
+
console.log(`▸ Found ${embedModels.length} embedding models`);
|
|
24
24
|
embedModels.slice(0, 3).forEach((model) => {
|
|
25
25
|
console.log(` - ${model.name} (${model.quantization})`);
|
|
26
26
|
});
|
|
27
27
|
console.log();
|
|
28
28
|
// Search by quantization
|
|
29
|
-
console.log("Searching for Q4 quantized models...");
|
|
29
|
+
console.log("▸ Searching for Q4 quantized models...");
|
|
30
30
|
const q4Models = await modelRegistrySearch({ quantization: "q4" });
|
|
31
|
-
console.log(
|
|
31
|
+
console.log(`▸ Found ${q4Models.length} Q4 quantized models`);
|
|
32
32
|
q4Models.slice(0, 3).forEach((model) => {
|
|
33
33
|
console.log(` - ${model.name}`);
|
|
34
34
|
});
|
|
35
35
|
console.log();
|
|
36
36
|
// Search by addon/model type
|
|
37
|
-
console.log("Searching for transcription models...");
|
|
37
|
+
console.log("▸ Searching for transcription models...");
|
|
38
38
|
const transcriptionModels = await modelRegistrySearch({
|
|
39
39
|
addon: "whisper",
|
|
40
40
|
});
|
|
41
|
-
console.log(
|
|
41
|
+
console.log(`▸ Found ${transcriptionModels.length} transcription models`);
|
|
42
42
|
transcriptionModels.slice(0, 3).forEach((model) => {
|
|
43
43
|
console.log(` - ${model.name}`);
|
|
44
44
|
});
|
|
45
45
|
console.log();
|
|
46
46
|
// Combined search: engine + quantization
|
|
47
|
-
console.log("Searching for Q4 LLM models...");
|
|
47
|
+
console.log("▸ Searching for Q4 LLM models...");
|
|
48
48
|
const q4LlmModels = await modelRegistrySearch({
|
|
49
49
|
engine: ModelType.llamacppCompletion,
|
|
50
50
|
quantization: "q4",
|
|
51
51
|
});
|
|
52
|
-
console.log(
|
|
52
|
+
console.log(`▸ Found ${q4LlmModels.length} Q4 LLM models`);
|
|
53
53
|
q4LlmModels.slice(0, 3).forEach((model) => {
|
|
54
54
|
console.log(` - ${model.name} (${model.quantization})`);
|
|
55
55
|
});
|
|
@@ -57,7 +57,7 @@ try {
|
|
|
57
57
|
// Get specific model (if we have at least one model)
|
|
58
58
|
const sampleModel = allModels[0];
|
|
59
59
|
if (sampleModel) {
|
|
60
|
-
console.log(
|
|
60
|
+
console.log(`▸ Getting specific model: ${sampleModel.registrySource}/${sampleModel.registryPath}`);
|
|
61
61
|
const model = await modelRegistryGetModel(sampleModel.registryPath, sampleModel.registrySource);
|
|
62
62
|
console.log(" Model details:");
|
|
63
63
|
console.log(` - Name: ${model.name}`);
|
|
@@ -68,12 +68,12 @@ try {
|
|
|
68
68
|
console.log(` - Checksum: ${model.sha256Checksum.slice(0, 16)}...`);
|
|
69
69
|
console.log();
|
|
70
70
|
}
|
|
71
|
-
console.log("QVAC model registry query examples completed successfully!");
|
|
71
|
+
console.log("▸ QVAC model registry query examples completed successfully!");
|
|
72
72
|
void close();
|
|
73
73
|
process.exit(0);
|
|
74
74
|
}
|
|
75
75
|
catch (error) {
|
|
76
|
-
console.error("
|
|
76
|
+
console.error("✖", error);
|
|
77
77
|
process.exit(1);
|
|
78
78
|
}
|
|
79
79
|
function formatSize(bytes) {
|
|
@@ -2,20 +2,24 @@ import { LLAMA_3_2_1B_INST_Q4_0, downloadAsset } from "@qvac/sdk";
|
|
|
2
2
|
await downloadAsset({
|
|
3
3
|
assetSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
4
4
|
seed: true,
|
|
5
|
-
onProgress: (
|
|
6
|
-
|
|
5
|
+
onProgress: (p) => {
|
|
6
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
7
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
8
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
9
|
+
if (p.percentage >= 100)
|
|
10
|
+
process.stderr.write("\n");
|
|
7
11
|
},
|
|
8
12
|
})
|
|
9
13
|
.then(() => {
|
|
10
|
-
console.log("
|
|
11
|
-
console.log("
|
|
14
|
+
console.log("▸ Model loaded and seeding started!");
|
|
15
|
+
console.log("▸ Seeding service is running... Press Ctrl+C to stop");
|
|
12
16
|
})
|
|
13
17
|
.catch((error) => {
|
|
14
|
-
console.error("
|
|
18
|
+
console.error("✖", error);
|
|
15
19
|
process.exit(1);
|
|
16
20
|
});
|
|
17
21
|
process.on("SIGINT", () => {
|
|
18
|
-
console.log("\n
|
|
22
|
+
console.log("\n▸ Seeding service stopped");
|
|
19
23
|
process.exit(0);
|
|
20
24
|
});
|
|
21
25
|
process.stdin.resume();
|
|
@@ -3,14 +3,18 @@ try {
|
|
|
3
3
|
// Load a model
|
|
4
4
|
const modelId = await loadModel({
|
|
5
5
|
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
6
|
-
onProgress: (
|
|
7
|
-
|
|
6
|
+
onProgress: (p) => {
|
|
7
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
8
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
9
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
10
|
+
if (p.percentage >= 100)
|
|
11
|
+
process.stderr.write("\n");
|
|
8
12
|
},
|
|
9
13
|
});
|
|
10
|
-
console.log("
|
|
11
|
-
console.log(
|
|
14
|
+
console.log("▸ Model loaded\n");
|
|
15
|
+
console.log(`▸ Lifecycle state: ${await state()}\n`);
|
|
12
16
|
// Run a completion before suspending
|
|
13
|
-
console.log("
|
|
17
|
+
console.log("▸ Completion before suspend");
|
|
14
18
|
const result1 = completion({
|
|
15
19
|
modelId,
|
|
16
20
|
history: [{ role: "user", content: "Say hello in one word" }],
|
|
@@ -19,11 +23,11 @@ try {
|
|
|
19
23
|
for await (const token of result1.tokenStream) {
|
|
20
24
|
process.stdout.write(token);
|
|
21
25
|
}
|
|
22
|
-
console.log("
|
|
26
|
+
console.log("");
|
|
23
27
|
// Suspend all networking and storage (e.g. app going to background)
|
|
24
|
-
console.log("
|
|
28
|
+
console.log("▸ Suspending...");
|
|
25
29
|
await suspend();
|
|
26
|
-
console.log(
|
|
30
|
+
console.log(`▸ Lifecycle state: ${await state()}\n`);
|
|
27
31
|
try {
|
|
28
32
|
await completion({
|
|
29
33
|
modelId,
|
|
@@ -34,21 +38,21 @@ try {
|
|
|
34
38
|
catch (error) {
|
|
35
39
|
const name = error.name;
|
|
36
40
|
if (name === "LIFECYCLE_OPERATION_BLOCKED") {
|
|
37
|
-
console.log(
|
|
41
|
+
console.log(`▸ Operation blocked while suspended (${name})`);
|
|
38
42
|
}
|
|
39
43
|
else {
|
|
40
44
|
throw error;
|
|
41
45
|
}
|
|
42
46
|
}
|
|
43
47
|
// Simulate time in background
|
|
44
|
-
console.log("\n
|
|
48
|
+
console.log("\n▸ Simulating 3 seconds in background...");
|
|
45
49
|
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
46
50
|
// Resume when returning to foreground
|
|
47
|
-
console.log("
|
|
51
|
+
console.log("▸ Resuming...");
|
|
48
52
|
await resume();
|
|
49
|
-
console.log(
|
|
53
|
+
console.log(`▸ Lifecycle state: ${await state()}\n`);
|
|
50
54
|
// Run another completion after resuming
|
|
51
|
-
console.log("
|
|
55
|
+
console.log("▸ Completion after resume");
|
|
52
56
|
const result2 = completion({
|
|
53
57
|
modelId,
|
|
54
58
|
history: [{ role: "user", content: "Say goodbye in one word" }],
|
|
@@ -57,12 +61,12 @@ try {
|
|
|
57
61
|
for await (const token of result2.tokenStream) {
|
|
58
62
|
process.stdout.write(token);
|
|
59
63
|
}
|
|
60
|
-
console.log("
|
|
64
|
+
console.log("");
|
|
61
65
|
await unloadModel({ modelId });
|
|
62
|
-
console.log("
|
|
66
|
+
console.log("▸ Model unloaded");
|
|
63
67
|
process.exit(0);
|
|
64
68
|
}
|
|
65
69
|
catch (error) {
|
|
66
|
-
console.error("
|
|
70
|
+
console.error("✖", error);
|
|
67
71
|
process.exit(1);
|
|
68
72
|
}
|
|
@@ -7,9 +7,15 @@ try {
|
|
|
7
7
|
ctx_size: 4096,
|
|
8
8
|
tools: true,
|
|
9
9
|
},
|
|
10
|
-
onProgress: (
|
|
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");
|
|
16
|
+
},
|
|
11
17
|
});
|
|
12
|
-
console.log(
|
|
18
|
+
console.log(`▸ Model loaded successfully! Model ID: ${modelId}`);
|
|
13
19
|
const history = [
|
|
14
20
|
{
|
|
15
21
|
role: "system",
|
|
@@ -20,8 +26,8 @@ try {
|
|
|
20
26
|
content: "What's the weather in Tokyo and my horoscope for Aquarius?",
|
|
21
27
|
},
|
|
22
28
|
];
|
|
23
|
-
console.log("\n
|
|
24
|
-
console.log("(Streaming with tool definitions in prompt)\n");
|
|
29
|
+
console.log("\n▸ AI Response:");
|
|
30
|
+
console.log("▸ (Streaming with tool definitions in prompt)\n");
|
|
25
31
|
const result = completion({ modelId, history, stream: true, tools });
|
|
26
32
|
const tokensTask = (async () => {
|
|
27
33
|
for await (const token of result.tokenStream) {
|
|
@@ -30,38 +36,38 @@ try {
|
|
|
30
36
|
})();
|
|
31
37
|
const toolsTask = (async () => {
|
|
32
38
|
for await (const evt of result.toolCallStream) {
|
|
33
|
-
console.log(`\n\n
|
|
34
|
-
console.log(
|
|
39
|
+
console.log(`\n\n▸ Tool Call Detected: ${evt.call.name}(${JSON.stringify(evt.call.arguments)})`);
|
|
40
|
+
console.log(`▸ ID: ${evt.call.id}`);
|
|
35
41
|
}
|
|
36
42
|
})();
|
|
37
43
|
await Promise.all([tokensTask, toolsTask]);
|
|
38
44
|
const stats = await result.stats;
|
|
39
45
|
const toolCalls = await result.toolCalls;
|
|
40
|
-
console.log("\n\n
|
|
46
|
+
console.log("\n\n▸ Parsed Tool Calls:");
|
|
41
47
|
if (toolCalls.length > 0) {
|
|
42
48
|
for (const call of toolCalls) {
|
|
43
|
-
console.log(
|
|
49
|
+
console.log(`▸ ${call.name}(${JSON.stringify(call.arguments)})`);
|
|
44
50
|
const schema = toolSchemas[call.name];
|
|
45
51
|
if (schema) {
|
|
46
52
|
const validated = schema.safeParse(call.arguments);
|
|
47
53
|
if (validated.success) {
|
|
48
|
-
console.log(
|
|
54
|
+
console.log(`▸ Arguments validated with Zod`);
|
|
49
55
|
}
|
|
50
56
|
else {
|
|
51
|
-
console.log(
|
|
57
|
+
console.log(`✖ Validation failed:`, validated.error);
|
|
52
58
|
}
|
|
53
59
|
}
|
|
54
60
|
}
|
|
55
61
|
}
|
|
56
62
|
else {
|
|
57
|
-
console.log("
|
|
63
|
+
console.log("▸ No tool calls detected in response");
|
|
58
64
|
}
|
|
59
|
-
console.log("\n
|
|
65
|
+
console.log("\n▸ Performance Stats:", stats);
|
|
60
66
|
if (toolCalls.length > 0) {
|
|
61
|
-
console.log("\n\n
|
|
67
|
+
console.log("\n\n▸ Simulating Tool Execution...");
|
|
62
68
|
const toolResults = toolCalls.map((call) => {
|
|
63
69
|
const result = mockExecute(call.name, call.arguments);
|
|
64
|
-
console.log(
|
|
70
|
+
console.log(`▸ ${call.name}: ${result}`);
|
|
65
71
|
return { toolCallId: call.id, result };
|
|
66
72
|
});
|
|
67
73
|
history.push({
|
|
@@ -74,7 +80,7 @@ try {
|
|
|
74
80
|
content: toolResult.result,
|
|
75
81
|
});
|
|
76
82
|
}
|
|
77
|
-
console.log("\n\n
|
|
83
|
+
console.log("\n\n▸ Follow-up Response with Tool Results:");
|
|
78
84
|
const followUpResult = completion({
|
|
79
85
|
modelId,
|
|
80
86
|
history,
|
|
@@ -85,12 +91,12 @@ try {
|
|
|
85
91
|
process.stdout.write(token);
|
|
86
92
|
}
|
|
87
93
|
const followUpStats = await followUpResult.stats;
|
|
88
|
-
console.log("\n\n
|
|
94
|
+
console.log("\n\n▸ Follow-up Stats:", followUpStats);
|
|
89
95
|
}
|
|
90
|
-
console.log("\n\n
|
|
96
|
+
console.log("\n\n▸ Completed!");
|
|
91
97
|
await unloadModel({ modelId, clearStorage: false });
|
|
92
98
|
}
|
|
93
99
|
catch (error) {
|
|
94
|
-
console.error("
|
|
100
|
+
console.error("✖", error);
|
|
95
101
|
process.exit(1);
|
|
96
102
|
}
|