@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.
Files changed (220) hide show
  1. package/NOTICE +95 -1151
  2. package/README.md +1 -2
  3. package/bare-imports.json +0 -5
  4. package/dist/client/api/bci-transcribe.js +2 -1
  5. package/dist/client/api/download-asset.js +2 -1
  6. package/dist/client/api/finetune.js +6 -5
  7. package/dist/client/api/index.d.ts +1 -0
  8. package/dist/client/api/index.js +1 -0
  9. package/dist/client/api/load-model.d.ts +11 -8
  10. package/dist/client/api/load-model.js +6 -6
  11. package/dist/client/api/subscribe-logs.d.ts +28 -0
  12. package/dist/client/api/subscribe-logs.js +43 -0
  13. package/dist/client/api/text-to-speech.js +2 -1
  14. package/dist/client/config-loader/config-utils.js +2 -4
  15. package/dist/client/config-loader/resolve-config.bare.js +4 -3
  16. package/dist/client/parse-input.d.ts +3 -0
  17. package/dist/client/parse-input.js +14 -0
  18. package/dist/client/rpc/node-rpc-client.js +8 -2
  19. package/dist/client/rpc/rpc-client.js +39 -7
  20. package/dist/commands/bundle/constants.js +2 -1
  21. package/dist/examples/bci/bci-filesystem-streaming.js +14 -14
  22. package/dist/examples/bci/bci-filesystem.js +17 -13
  23. package/dist/examples/cache-management.js +38 -38
  24. package/dist/examples/cancel-by-request-id.js +9 -9
  25. package/dist/examples/completion-events.js +20 -14
  26. package/dist/examples/completion-stop-reason.js +13 -7
  27. package/dist/examples/concurrent-completion-collision.js +7 -7
  28. package/dist/examples/config-reload.js +7 -8
  29. package/dist/examples/default-config-usage.js +4 -4
  30. package/dist/examples/delegated-inference/composite.js +14 -10
  31. package/dist/examples/delegated-inference/consumer-profiled.js +13 -13
  32. package/dist/examples/delegated-inference/consumer.js +16 -12
  33. package/dist/examples/delegated-inference/provider.js +12 -12
  34. package/dist/examples/diffusion-esrgan-upscale.js +19 -15
  35. package/dist/examples/diffusion-flux2-klein-img2img.js +16 -11
  36. package/dist/examples/diffusion-flux2-klein.js +14 -9
  37. package/dist/examples/diffusion-img2img.js +9 -10
  38. package/dist/examples/diffusion-img2vid.js +17 -12
  39. package/dist/examples/diffusion-simple.js +1 -1
  40. package/dist/examples/diffusion-txt2img.js +14 -9
  41. package/dist/examples/diffusion-txt2vid.js +15 -10
  42. package/dist/examples/download-with-blind-relays.js +16 -21
  43. package/dist/examples/download-with-cancel.js +15 -16
  44. package/dist/examples/embed-multi-gpu.js +3 -4
  45. package/dist/examples/embed-p2p.js +11 -7
  46. package/dist/examples/finetune/llamacpp-finetune.js +7 -7
  47. package/dist/examples/kv-cache-cleanup.js +35 -35
  48. package/dist/examples/kv-cache-custom-key.js +24 -24
  49. package/dist/examples/kv-cache-example.js +9 -9
  50. package/dist/examples/llamacpp-cache.js +18 -14
  51. package/dist/examples/llamacpp-dynamic-tools.js +15 -9
  52. package/dist/examples/llamacpp-filesystem.js +15 -9
  53. package/dist/examples/llamacpp-http.js +12 -10
  54. package/dist/examples/llamacpp-multi-gpu.js +4 -4
  55. package/dist/examples/llamacpp-multimodal.js +13 -9
  56. package/dist/examples/llamacpp-p2p.js +8 -4
  57. package/dist/examples/llamacpp-sharded.js +5 -5
  58. package/dist/examples/llamacpp-structured-output.js +15 -9
  59. package/dist/examples/logging-file-transport.js +3 -3
  60. package/dist/examples/logging-global.d.ts +2 -0
  61. package/dist/examples/logging-global.js +34 -0
  62. package/dist/examples/logging-streaming.js +7 -10
  63. package/dist/examples/mcp-websearch.js +24 -18
  64. package/dist/examples/multi-model-demo.js +17 -11
  65. package/dist/examples/ocr-fasttext.js +14 -16
  66. package/dist/examples/parallel-download.js +7 -7
  67. package/dist/examples/plugins.js +40 -28
  68. package/dist/examples/profiling/basic.js +16 -10
  69. package/dist/examples/profiling/per-call.js +17 -11
  70. package/dist/examples/quickstart.bare.d.ts +2 -0
  71. package/dist/examples/quickstart.bare.js +18 -0
  72. package/dist/examples/quickstart.js +10 -3
  73. package/dist/examples/rag/rag-chromadb.js +18 -14
  74. package/dist/examples/rag/rag-hyperdb/cancellation.js +17 -14
  75. package/dist/examples/rag/rag-hyperdb/ingest.js +14 -12
  76. package/dist/examples/rag/rag-hyperdb/pipeline.js +19 -17
  77. package/dist/examples/rag/rag-hyperdb/workspaces.js +31 -27
  78. package/dist/examples/rag/rag-lancedb.js +12 -8
  79. package/dist/examples/rag/rag-sqlite.js +11 -7
  80. package/dist/examples/registry-query.js +17 -17
  81. package/dist/examples/seed-p2p.js +10 -6
  82. package/dist/examples/suspend-resume.js +20 -16
  83. package/dist/examples/tools/llamacpp-native-tools.js +24 -18
  84. package/dist/examples/tools/llamacpp-tools-gemma4.js +14 -8
  85. package/dist/examples/tools/llamacpp-tools-harmony-multiturn.js +20 -14
  86. package/dist/examples/tools/llamacpp-tools-pythonic.js +14 -8
  87. package/dist/examples/tools/llamacpp-tools-qwen35.js +14 -8
  88. package/dist/examples/transcription/parakeet-ctc-filesystem.js +12 -9
  89. package/dist/examples/transcription/parakeet-microphone-record.js +15 -9
  90. package/dist/examples/transcription/parakeet-microphone-stream.js +15 -9
  91. package/dist/examples/transcription/parakeet-sortformer-streaming.js +12 -6
  92. package/dist/examples/transcription/parakeet-sortformer.js +3 -5
  93. package/dist/examples/transcription/parakeet-tdt-filesystem.js +13 -10
  94. package/dist/examples/transcription/whispercpp-filesystem-streaming.js +16 -17
  95. package/dist/examples/transcription/whispercpp-filesystem.js +14 -10
  96. package/dist/examples/transcription/whispercpp-microphone-conversation.js +10 -10
  97. package/dist/examples/transcription/whispercpp-microphone-record.js +6 -6
  98. package/dist/examples/transcription/whispercpp-prompt.js +14 -10
  99. package/dist/examples/translation/translation-bergamot-batch.js +11 -7
  100. package/dist/examples/translation/translation-bergamot-pivot.js +13 -9
  101. package/dist/examples/translation/translation-bergamot.js +8 -4
  102. package/dist/examples/translation/translation-indic.js +8 -4
  103. package/dist/examples/translation/translation-llm-afriquegemma.js +7 -3
  104. package/dist/examples/translation/translation-llm-context.js +8 -4
  105. package/dist/examples/translation/translation-llm.js +7 -3
  106. package/dist/examples/translation/translation-stream.js +4 -4
  107. package/dist/examples/tts/chatterbox.js +19 -11
  108. package/dist/examples/tts/llm-to-tts-streaming.js +27 -14
  109. package/dist/examples/tts/supertonic-multilingual.js +18 -14
  110. package/dist/examples/tts/supertonic.js +19 -15
  111. package/dist/examples/tts/utils.js +1 -1
  112. package/dist/examples/vla-pi05.js +18 -14
  113. package/dist/examples/vla-smolvla.js +18 -14
  114. package/dist/examples/voice-assistant/voice-assistant.js +12 -12
  115. package/dist/index.d.ts +3 -4
  116. package/dist/index.js +3 -4
  117. package/dist/logging/client-logger.js +2 -1
  118. package/dist/logging/index.d.ts +1 -1
  119. package/dist/logging/index.js +1 -1
  120. package/dist/logging/namespaces.d.ts +1 -0
  121. package/dist/logging/namespaces.js +2 -0
  122. package/dist/logging/server-logger.js +1 -4
  123. package/dist/logging/utils.js +6 -1
  124. package/dist/models/registry/index.d.ts +17 -0
  125. package/dist/models/registry/index.js +20 -1
  126. package/dist/models/registry/models.d.ts +1062 -38
  127. package/dist/models/registry/models.js +3546 -2490
  128. package/dist/pear/pre.js +2 -2
  129. package/dist/schemas/bci-config.d.ts +37 -0
  130. package/dist/schemas/bci-config.js +2 -0
  131. package/dist/schemas/bci.d.ts +2 -0
  132. package/dist/schemas/common.d.ts +171 -94
  133. package/dist/schemas/completion-stream.d.ts +6 -3
  134. package/dist/schemas/completion-stream.js +10 -2
  135. package/dist/schemas/download-asset.d.ts +5 -5
  136. package/dist/schemas/engine-addon-map.d.ts +1 -1
  137. package/dist/schemas/engine-addon-map.js +6 -3
  138. package/dist/schemas/error.js +6 -1
  139. package/dist/schemas/llamacpp-config.d.ts +27 -8
  140. package/dist/schemas/llamacpp-config.js +19 -2
  141. package/dist/schemas/load-model.d.ts +4170 -570
  142. package/dist/schemas/load-model.js +85 -26
  143. package/dist/schemas/logging-stream.js +7 -1
  144. package/dist/schemas/model-src-utils.d.ts +6 -6
  145. package/dist/schemas/model-types.d.ts +14 -15
  146. package/dist/schemas/model-types.js +10 -11
  147. package/dist/schemas/ocr.d.ts +10 -8
  148. package/dist/schemas/ocr.js +8 -6
  149. package/dist/schemas/plugin.d.ts +6 -5
  150. package/dist/schemas/plugin.js +4 -4
  151. package/dist/schemas/rag.d.ts +4 -4
  152. package/dist/schemas/registry.d.ts +8 -8
  153. package/dist/schemas/registry.js +1 -1
  154. package/dist/schemas/reload-config.d.ts +6 -6
  155. package/dist/schemas/sdcpp-config.d.ts +12 -12
  156. package/dist/schemas/sdk-config.d.ts +171 -117
  157. package/dist/schemas/sdk-config.js +5 -5
  158. package/dist/schemas/sdk-errors-client.d.ts +1 -0
  159. package/dist/schemas/sdk-errors-client.js +7 -2
  160. package/dist/schemas/text-to-speech.d.ts +157 -13
  161. package/dist/schemas/text-to-speech.js +70 -7
  162. package/dist/schemas/transcription-config.d.ts +5 -1
  163. package/dist/schemas/transcription-config.js +2 -0
  164. package/dist/schemas/transcription.d.ts +3 -0
  165. package/dist/schemas/transcription.js +2 -1
  166. package/dist/schemas/translate.d.ts +6 -6
  167. package/dist/schemas/translate.js +2 -3
  168. package/dist/schemas/translation-config.d.ts +20 -20
  169. package/dist/server/bare/hyperswarm.js +3 -3
  170. package/dist/server/bare/ops/transcribe.js +46 -15
  171. package/dist/server/bare/plugins/bci-whispercpp-transcription/args.d.ts +3 -0
  172. package/dist/server/bare/plugins/bci-whispercpp-transcription/args.js +13 -0
  173. package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.d.ts +41 -0
  174. package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.js +6 -11
  175. package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.d.ts +75 -0
  176. package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.js +11 -0
  177. package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.d.ts +16 -10
  178. package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.js +25 -18
  179. package/dist/server/bare/plugins/index.d.ts +1 -1
  180. package/dist/server/bare/plugins/index.js +1 -1
  181. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.d.ts +10 -0
  182. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.js +29 -0
  183. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +4 -22
  184. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +15 -7
  185. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +7 -7
  186. package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +2 -0
  187. package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +10 -10
  188. package/dist/server/bare/plugins/tts-ggml/plugin.d.ts +14 -8
  189. package/dist/server/bare/plugins/tts-ggml/plugin.js +12 -0
  190. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +3 -1
  191. package/dist/server/bare/registry/logging-stream-registry.d.ts +4 -2
  192. package/dist/server/bare/registry/logging-stream-registry.js +12 -7
  193. package/dist/server/bare/registry/model-config-utils.js +2 -2
  194. package/dist/server/bare/registry/registry-client.js +1 -1
  195. package/dist/server/bare/runtime-lifecycle.d.ts +9 -0
  196. package/dist/server/bare/runtime-lifecycle.js +24 -0
  197. package/dist/server/bare/types/addon-responses.d.ts +1 -0
  198. package/dist/server/env.js +7 -10
  199. package/dist/server/plugins/registry.js +2 -4
  200. package/dist/server/rpc/handlers/load-model/handler.js +2 -4
  201. package/dist/server/rpc/handlers/load-model/http.js +253 -51
  202. package/dist/server/rpc/handlers/logging-stream.js +4 -2
  203. package/dist/server/rpc/handlers/plugin-invoke.js +5 -16
  204. package/dist/server/utils/completion-normalizer.js +13 -4
  205. package/dist/server/utils/worker-lock.js +5 -5
  206. package/dist/server/worker-core.d.ts +1 -1
  207. package/dist/server/worker-core.js +28 -18
  208. package/dist/utils/errors-client.d.ts +3 -0
  209. package/dist/utils/errors-client.js +5 -0
  210. package/dist/utils/errors-server.d.ts +2 -0
  211. package/dist/utils/errors-server.js +3 -0
  212. package/dist/utils/zod-error.d.ts +3 -0
  213. package/dist/utils/zod-error.js +4 -0
  214. package/package.json +21 -24
  215. package/dist/polyfills/bare-globals.d.ts +0 -2
  216. package/dist/polyfills/bare-globals.js +0 -4
  217. package/dist/polyfills/bare-globals.noop.d.ts +0 -2
  218. package/dist/polyfills/bare-globals.noop.js +0 -1
  219. /package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/ops/ocr-stream.d.ts +0 -0
  220. /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("🔧 RAG Pipeline Example (Segregated Flow)\n");
6
- console.log(`🔍 Query: "${query}"`);
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: (progress) => {
11
- console.log(`Loading model... ${progress.percentage.toFixed(1)}%`);
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("\n📝 Step 1: Chunking documents...");
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(` Created ${chunks.length} chunks`);
33
- console.log("\n🧠 Step 2: Generating embeddings (batch)...");
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(` Generated ${embeddedDocs.length} embeddings`);
43
- console.log("\n💾 Step 3: Saving to vector database...");
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(` Saved ${saved}/${saveResult.length} documents`);
50
- console.log("\n🔎 Step 4: Searching...");
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("\n📋 Top 3 most similar documents:");
61
+ console.log("▸ Top 3 most similar documents:");
58
62
  results.forEach((result, index) => {
59
- console.log("=".repeat(50) + " Top result:");
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(`🗑️ Deleted '${workspace}' workspace`);
69
+ console.log(`▸ Deleted '${workspace}' workspace`);
68
70
  await unloadModel({ modelId });
69
71
  }
70
72
  catch (error) {
71
- console.error("❌ Error:", 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("🚀 RAG Workspaces with Chunking Example\n");
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) => process.stdout.write(`\rLoading: ${Math.round(p.percentage * 100)}%`),
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("📚 Ingesting medical articles with chunking...");
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(`✅ Created ${medicalResult.processed.length} chunks from medical articles`);
89
+ console.log(`▸ Created ${medicalResult.processed.length} chunks from medical articles`);
85
90
  // Ingest tech docs without chunking
86
- console.log("\n📚 Ingesting tech documents...");
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(`✅ Ingested ${techResult.processed.length} tech documents`);
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🔍 Running searches:");
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(` ✓ Score: ${results[0].score.toFixed(3)}`);
107
- console.log(` ✓ Match: ${results[0].content.substring(0, 80)}...`);
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(` ✗ No results (workspace isolation working correctly)`);
115
+ console.log(` ▸ No results (workspace isolation working correctly)`);
111
116
  }
112
117
  }
113
118
  // Test a third workspace
114
- console.log("\n📁 Testing 'general' workspace...");
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(`General workspace: ${generalSearch?.[0]?.content === "General workspace content for testing" ? "✅ Working" : "❌ Failed"}`);
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🔄 Reindexing medical workspace...");
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
- const pct = total > 0 ? Math.round((current / total) * 100) : 0;
134
- console.log(` [${stage}] ${current}/${total} (${pct}%)`);
138
+ console.log(`▸ ${stage} ${current}/${total}`);
135
139
  },
136
140
  });
137
- console.log(`${reindexResult.reindexed ? "✅ Reindex completed" : "⚠️ Reindex returned false"} for medical workspace`);
141
+ console.log(`▸ ${reindexResult.reindexed ? "Reindex completed" : "Reindex returned false"} for medical workspace`);
138
142
  if (reindexResult.details) {
139
- console.log(" Details:", reindexResult.details);
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(` Verification search: ${reindexVerify.length > 0 ? "✅ Working" : "❌ Failed"}`);
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🗑️ Deleted one medical chunk");
160
+ console.log("\n▸ Deleted one medical chunk");
157
161
  }
158
162
  // List all workspaces
159
- console.log("\n📂 Listing workspaces...");
163
+ console.log("\n▸ Listing workspaces...");
160
164
  const workspaces = await ragListWorkspaces();
161
165
  workspaces.forEach((ws) => {
162
- console.log(` • ${ws.name} (${ws.open ? "open" : "closed"})`);
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🗑️ Closing and deleting workspaces...");
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("❌ Error:", 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(`🔍 Query: "${query}"`);
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: (progress) => {
12
- console.log(`Loading model... ${progress.percentage.toFixed(1)}%`);
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(`Table doesn't exist, no need to drop: ${String(e)}`);
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("📚 Embedding documents...");
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("🔎 Searching for similar documents...");
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📋 Top 3 most similar documents:");
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("❌ Error:", 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(`🔍 Query: "${query}"`);
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: (progress) => {
13
- console.log(`Loading model... ${progress.percentage.toFixed(1)}%`);
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("📚 Embedding documents...");
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("🔎 Searching for similar documents...");
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📋 Top 3 most similar documents:");
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("❌ Error:", 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(` Found ${allModels.length} models in registry\n`);
7
+ console.log(`▸ Found ${allModels.length} models in registry\n`);
8
8
  // Show first 5 models as sample
9
- console.log(" Sample models:");
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(` Found ${whisperModels.length} whisper-related models\n`);
17
+ console.log(`▸ Found ${whisperModels.length} whisper-related models\n`);
18
18
  // Search by engine (using canonical ModelType enum)
19
- console.log(`Searching by engine (${ModelType.llamacppEmbedding})...`);
19
+ console.log(`▸ Searching by engine (${ModelType.llamacppEmbedding})...`);
20
20
  const embedModels = await modelRegistrySearch({
21
21
  engine: ModelType.llamacppEmbedding,
22
22
  });
23
- console.log(` Found ${embedModels.length} embedding models`);
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(` Found ${q4Models.length} Q4 quantized models`);
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(` Found ${transcriptionModels.length} transcription models`);
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(` Found ${q4LlmModels.length} Q4 LLM models`);
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(`Getting specific model: ${sampleModel.registrySource}/${sampleModel.registryPath}`);
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("Error:", 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: (progress) => {
6
- console.log(progress);
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("✅ Model loaded and seeding started!");
11
- console.log("📡 Seeding service is running... Press Ctrl+C to stop");
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("❌ Error:", error);
18
+ console.error("✖", error);
15
19
  process.exit(1);
16
20
  });
17
21
  process.on("SIGINT", () => {
18
- console.log("\n🛑 Seeding service stopped");
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: (progress) => {
7
- console.log(progress);
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("✅ Model loaded\n");
11
- console.log(`📊 Lifecycle state: ${await state()}\n`);
14
+ console.log("▸ Model loaded\n");
15
+ console.log(`▸ Lifecycle state: ${await state()}\n`);
12
16
  // Run a completion before suspending
13
- console.log("--- Completion before suspend ---");
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("\n");
26
+ console.log("");
23
27
  // Suspend all networking and storage (e.g. app going to background)
24
- console.log("⏸️ Suspending...");
28
+ console.log("▸ Suspending...");
25
29
  await suspend();
26
- console.log(`📊 Lifecycle state: ${await state()}\n`);
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(`🚫 Operation blocked while suspended (${name})`);
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💤 Simulating 3 seconds in background...");
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("▶️ Resuming...");
51
+ console.log("▸ Resuming...");
48
52
  await resume();
49
- console.log(`📊 Lifecycle state: ${await state()}\n`);
53
+ console.log(`▸ Lifecycle state: ${await state()}\n`);
50
54
  // Run another completion after resuming
51
- console.log("--- Completion after resume ---");
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("\n");
64
+ console.log("");
61
65
  await unloadModel({ modelId });
62
- console.log("✅ Model unloaded");
66
+ console.log("▸ Model unloaded");
63
67
  process.exit(0);
64
68
  }
65
69
  catch (error) {
66
- console.error("❌ Error:", 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: (progress) => console.log(`Loading: ${progress.percentage.toFixed(1)}%`),
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(`✅ Model loaded successfully! Model ID: ${modelId}`);
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🤖 AI Response:");
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→ Tool Call Detected: ${evt.call.name}(${JSON.stringify(evt.call.arguments)})`);
34
- console.log(` ID: ${evt.call.id}`);
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📋 Parsed Tool Calls:");
46
+ console.log("\n\n▸ Parsed Tool Calls:");
41
47
  if (toolCalls.length > 0) {
42
48
  for (const call of toolCalls) {
43
- console.log(` - ${call.name}(${JSON.stringify(call.arguments)})`);
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(` ✓ Arguments validated with Zod`);
54
+ console.log(`▸ Arguments validated with Zod`);
49
55
  }
50
56
  else {
51
- console.log(` ✗ Validation failed:`, validated.error);
57
+ console.log(`✖ Validation failed:`, validated.error);
52
58
  }
53
59
  }
54
60
  }
55
61
  }
56
62
  else {
57
- console.log(" No tool calls detected in response");
63
+ console.log("▸ No tool calls detected in response");
58
64
  }
59
- console.log("\n📊 Performance Stats:", stats);
65
+ console.log("\n▸ Performance Stats:", stats);
60
66
  if (toolCalls.length > 0) {
61
- console.log("\n\n🔧 Simulating Tool Execution...");
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(` ✓ ${call.name}: ${result}`);
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🤖 Follow-up Response with Tool Results:");
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📊 Follow-up Stats:", followUpStats);
94
+ console.log("\n\n▸ Follow-up Stats:", followUpStats);
89
95
  }
90
- console.log("\n\n🎉 Completed!");
96
+ console.log("\n\n▸ Completed!");
91
97
  await unloadModel({ modelId, clearStorage: false });
92
98
  }
93
99
  catch (error) {
94
- console.error("❌ Error:", error);
100
+ console.error("✖", error);
95
101
  process.exit(1);
96
102
  }