@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
@@ -9,19 +9,17 @@
9
9
  * Pass a custom image path, or download the default image into examples/image/:
10
10
  * https://github.com/tetherto/qvac/blob/main/packages/sdk/examples/image/basic_test.bmp
11
11
  */
12
- import { close, loadModel, ocr, OCR_LATIN_RECOGNIZER_1, unloadModel, } from "@qvac/sdk";
12
+ import { close, loadModel, ocr, OCR_LATIN, unloadModel, } from "@qvac/sdk";
13
13
  import path from "path";
14
14
  import { fileURLToPath } from "url";
15
15
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
16
16
  const imagePath = process.argv[2] || path.join(__dirname, "image/basic_test.bmp");
17
17
  try {
18
- console.log("🚀 Loading OCR model...");
18
+ console.log("▸ Loading OCR model...");
19
19
  const modelId = await loadModel({
20
- modelSrc: OCR_LATIN_RECOGNIZER_1,
20
+ modelSrc: OCR_LATIN,
21
21
  modelConfig: {
22
22
  langList: ["en"],
23
- useGPU: true,
24
- timeout: 30000,
25
23
  magRatio: 1.5,
26
24
  defaultRotationAngles: [90, 180, 270],
27
25
  contrastRetry: false,
@@ -29,8 +27,8 @@ try {
29
27
  recognizerBatchSize: 1,
30
28
  },
31
29
  });
32
- console.log(`✅ Model loaded successfully! Model ID: ${modelId}`);
33
- console.log(`\n🔍 Running OCR on: ${imagePath}`);
30
+ console.log(`▸ Model loaded successfully! Model ID: ${modelId}`);
31
+ console.log(`\n▸ Running OCR on: ${imagePath}`);
34
32
  const { blocks } = ocr({
35
33
  modelId,
36
34
  image: imagePath,
@@ -39,24 +37,24 @@ try {
39
37
  },
40
38
  });
41
39
  const result = await blocks;
42
- console.log("\n📝 OCR Results:");
43
- console.log("================================");
40
+ console.log("\n▸ OCR Results:");
41
+ console.log("▸ ================================");
44
42
  for (const block of result) {
45
- console.log(`\n📄 Text: ${block.text}`);
43
+ console.log(block.text);
46
44
  if (block.bbox) {
47
- console.log(` 📍 BBox: [${block.bbox.join(", ")}]`);
45
+ console.log(`▸ BBox: [${block.bbox.join(", ")}]`);
48
46
  }
49
47
  if (block.confidence !== undefined) {
50
- console.log(` ✓ Confidence: ${block.confidence}`);
48
+ console.log(`▸ Confidence: ${block.confidence}`);
51
49
  }
52
50
  }
53
- console.log("\n================================");
54
- console.log("\n🔄 Unloading model...");
51
+ console.log("\n▸ ================================");
52
+ console.log("\n▸ Unloading model...");
55
53
  await unloadModel({ modelId, clearStorage: false });
56
- console.log("✅ Model unloaded successfully.");
54
+ console.log("▸ Model unloaded successfully.");
57
55
  process.exit(0);
58
56
  }
59
57
  catch (error) {
60
- console.error("❌ Error during OCR processing:", error);
58
+ console.error("✖", error);
61
59
  await close();
62
60
  }
@@ -9,7 +9,7 @@ const assets = [
9
9
  { name: "GTE Large FP16", src: GTE_LARGE_FP16 },
10
10
  ];
11
11
  const timers = {};
12
- console.log(`\n=== Parallel Download (${assets.length} assets) ===\n`);
12
+ console.log(`\n▸ Parallel Download (${assets.length} assets)\n`);
13
13
  const wallStart = now();
14
14
  try {
15
15
  const promises = assets.map((asset) => {
@@ -20,18 +20,18 @@ try {
20
20
  const t = timers[asset.name];
21
21
  if (t.firstProgress == null) {
22
22
  t.firstProgress = now();
23
- console.log(`[${asset.name}] first progress at ${((t.firstProgress - wallStart) / 1000).toFixed(1)}s — ${progress.percentage}%`);
23
+ console.log(`▸ [${asset.name}] first progress at ${((t.firstProgress - wallStart) / 1000).toFixed(1)}s — ${progress.percentage}%`);
24
24
  }
25
25
  if (progress.percentage === 100 && t.end == null) {
26
26
  t.end = now();
27
- console.log(`[${asset.name}] done at ${((t.end - wallStart) / 1000).toFixed(1)}s`);
27
+ console.log(`▸ [${asset.name}] done at ${((t.end - wallStart) / 1000).toFixed(1)}s`);
28
28
  }
29
29
  },
30
30
  });
31
31
  });
32
32
  const results = await Promise.allSettled(promises);
33
33
  const wallEnd = now();
34
- console.log(`\n=== Results ===\n`);
34
+ console.log(`\n▸ Results\n`);
35
35
  for (let i = 0; i < assets.length; i++) {
36
36
  const asset = assets[i];
37
37
  const result = results[i];
@@ -42,12 +42,12 @@ try {
42
42
  ? `${((t.firstProgress - t.start) / 1000).toFixed(1)}s`
43
43
  : "N/A";
44
44
  const total = t.end != null ? `${((t.end - t.start) / 1000).toFixed(1)}s` : "N/A";
45
- console.log(`${status} ${asset.name}: first-progress=${timeToFirst}, total=${total}${reason}`);
45
+ console.log(`▸ ${status} ${asset.name}: first-progress=${timeToFirst}, total=${total}${reason}`);
46
46
  }
47
- console.log(`\nWall time: ${((wallEnd - wallStart) / 1000).toFixed(1)}s`);
47
+ console.log(`\n▸ Wall time: ${((wallEnd - wallStart) / 1000).toFixed(1)}s`);
48
48
  void close();
49
49
  }
50
50
  catch (error) {
51
- console.error("❌ Error:", error);
51
+ console.error("✖", error);
52
52
  process.exit(1);
53
53
  }
@@ -18,16 +18,16 @@ const configPath = `${configDir}/config/plugins/plugins.config.json`;
18
18
  const projectRoot = path.resolve(configDir, "..");
19
19
  const qvacOutputDir = path.join(projectRoot, "qvac");
20
20
  // ─── Generate the worker bundle from the plugins config ─────────────────────
21
- console.log(`🔍 Config: ${configPath}`);
22
- console.log(`⚠️ This example will generate a worker bundle in ${qvacOutputDir} and delete it on exit.`);
23
- console.log(" If you have an existing qvac/ folder with bundled files, they will be overwritten and removed.\n");
24
- console.log("🔨 Generating worker bundle from plugins config...\n");
21
+ console.log(`▸ Config: ${configPath}`);
22
+ console.log(`▸ This example will generate a worker bundle in ${qvacOutputDir} and delete it on exit.`);
23
+ console.log("▸ If you have an existing qvac/ folder with bundled files, they will be overwritten and removed.\n");
24
+ console.log("▸ Generating worker bundle from plugins config...\n");
25
25
  try {
26
26
  await bundleSdk({ projectRoot, configPath, quiet: true });
27
27
  }
28
28
  catch (error) {
29
- console.error("❌ Failed to generate worker bundle.");
30
- console.error("❌ Error:", error);
29
+ console.error("✖ Failed to generate worker bundle.");
30
+ console.error("✖", error);
31
31
  process.exit(1);
32
32
  }
33
33
  console.log("");
@@ -35,7 +35,7 @@ console.log("");
35
35
  function cleanup() {
36
36
  if (existsSync(qvacOutputDir)) {
37
37
  rmSync(qvacOutputDir, { recursive: true, force: true });
38
- console.log(`\n🧹 Cleaned up ${qvacOutputDir}`);
38
+ console.log(`\n▸ Cleaned up ${qvacOutputDir}`);
39
39
  }
40
40
  }
41
41
  process.on("exit", cleanup);
@@ -43,34 +43,40 @@ process.on("exit", cleanup);
43
43
  // In a real app, place qvac.config.json (or .js/.ts) in your project root (auto-discovered).
44
44
  process.env["QVAC_CONFIG_PATH"] = configPath;
45
45
  const { completion, translate, embed, loadModel, unloadModel, LLAMA_3_2_1B_INST_Q4_0, BERGAMOT_EN_ES, GTE_LARGE_FP16, } = await import("@qvac/sdk");
46
- console.log("1. LLM Completion (llamacpp-completion plugin)");
46
+ console.log("▸ 1. LLM Completion (llamacpp-completion plugin)");
47
47
  try {
48
48
  const llmModelId = await loadModel({
49
49
  modelSrc: LLAMA_3_2_1B_INST_Q4_0,
50
50
  modelConfig: { ctx_size: 2048 },
51
- onProgress: (p) => console.log(` Loading LLM: ${p.percentage.toFixed(1)}%`),
51
+ onProgress: (p) => {
52
+ const mb = (n) => (n / 1e6).toFixed(1);
53
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
54
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
55
+ if (p.percentage >= 100)
56
+ process.stderr.write("\n");
57
+ },
52
58
  });
53
- console.log(` Model loaded: ${llmModelId}`);
59
+ console.log(`▸ Model loaded: ${llmModelId}`);
54
60
  const question = "What is 2 + 2? Answer in one word.";
55
- console.log(` Question: ${question}`);
61
+ console.log(`▸ Question: ${question}`);
56
62
  const result = completion({
57
63
  modelId: llmModelId,
58
64
  history: [{ role: "user", content: question }],
59
65
  stream: true,
60
66
  });
61
- process.stdout.write(" Response: ");
67
+ console.log("▸ Response:");
62
68
  for await (const token of result.tokenStream) {
63
69
  process.stdout.write(token);
64
70
  }
65
- console.log("\n");
71
+ console.log("");
66
72
  await unloadModel({ modelId: llmModelId });
67
- console.log(" ✅ LLM unloaded\n");
73
+ console.log("▸ LLM unloaded\n");
68
74
  }
69
75
  catch (error) {
70
- console.error(" ❌ LLM failed:", error);
76
+ console.error("✖ LLM failed:", error);
71
77
  process.exit(1);
72
78
  }
73
- console.log("2. Translation (nmtcpp-translation plugin)");
79
+ console.log("▸ 2. Translation (nmtcpp-translation plugin)");
74
80
  try {
75
81
  const nmtModelId = await loadModel({
76
82
  modelSrc: BERGAMOT_EN_ES,
@@ -79,9 +85,15 @@ try {
79
85
  from: "en",
80
86
  to: "es",
81
87
  },
82
- onProgress: (p) => console.log(` Loading NMT: ${p.percentage.toFixed(1)}%`),
88
+ onProgress: (p) => {
89
+ const mb = (n) => (n / 1e6).toFixed(1);
90
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
91
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
92
+ if (p.percentage >= 100)
93
+ process.stderr.write("\n");
94
+ },
83
95
  });
84
- console.log(` Model loaded: ${nmtModelId}`);
96
+ console.log(`▸ Model loaded: ${nmtModelId}`);
85
97
  const text = "Hello, how are you?";
86
98
  const result = translate({
87
99
  modelId: nmtModelId,
@@ -90,33 +102,33 @@ try {
90
102
  stream: false,
91
103
  });
92
104
  const translated = await result.text;
93
- console.log(` "${text}" -> "${translated}"\n`);
105
+ console.log(`"${text}" -> "${translated}"`);
94
106
  await unloadModel({ modelId: nmtModelId });
95
- console.log(" ✅ NMT unloaded\n");
107
+ console.log("▸ NMT unloaded\n");
96
108
  }
97
109
  catch (error) {
98
- console.error(" ❌ Translation failed:", error);
110
+ console.error("✖ Translation failed:", error);
99
111
  process.exit(1);
100
112
  }
101
- console.log("3. Embeddings (llamacpp-embedding plugin NOT in config)");
102
- console.log(" Attempting to load an embeddings model...\n");
113
+ console.log("▸ 3. Embeddings (llamacpp-embedding plugin NOT in config)");
114
+ console.log("▸ Attempting to load an embeddings model...\n");
103
115
  try {
104
116
  const embedModelId = await loadModel({
105
117
  modelSrc: GTE_LARGE_FP16,
106
118
  });
107
119
  await embed({ modelId: embedModelId, text: "test" });
108
- console.error(" ❌ Unexpected: embed succeeded without the plugin!");
120
+ console.error("✖ Unexpected: embed succeeded without the plugin!");
109
121
  process.exit(1);
110
122
  }
111
123
  catch (error) {
112
124
  const message = error instanceof Error ? error.message : String(error);
113
125
  if (message.includes("Plugin not found")) {
114
- console.log(" ✅ Expected PLUGIN_NOT_FOUND error:");
115
- console.log(` ${message}\n`);
126
+ console.log("▸ Expected PLUGIN_NOT_FOUND error:");
127
+ console.log(`▸ ${message}\n`);
116
128
  }
117
129
  else {
118
- console.error(" ❌ Unexpected error:", error);
130
+ console.error("✖ Unexpected error:", error);
119
131
  process.exit(1);
120
132
  }
121
133
  }
122
- console.log("Done! Only the selected plugins were available.");
134
+ console.log("▸ Done! Only the selected plugins were available.");
@@ -5,13 +5,19 @@ try {
5
5
  mode: "verbose",
6
6
  includeServerBreakdown: true,
7
7
  });
8
- console.log("Profiler enabled:", profiler.isEnabled());
8
+ console.log("▸ Profiler enabled:", profiler.isEnabled());
9
9
  const modelId = await loadModel({
10
10
  modelSrc: LLAMA_3_2_1B_INST_Q4_0,
11
- onProgress: (p) => console.log(` ${p.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");
17
+ },
12
18
  });
13
- console.log("Model loaded:", modelId);
14
- console.log("\n→ Running completion...");
19
+ console.log("▸ Model loaded:", modelId);
20
+ console.log("\n▸ Running completion...");
15
21
  const result = completion({
16
22
  modelId,
17
23
  history: [{ role: "user", content: "Say hello in one sentence." }],
@@ -23,12 +29,12 @@ try {
23
29
  console.log();
24
30
  await unloadModel({ modelId });
25
31
  // Export profiling data
26
- console.log("\n=== Profiler Summary ===");
32
+ console.log("\n▸ Profiler Summary");
27
33
  console.log(profiler.exportSummary());
28
- console.log("\n=== Profiler Table ===");
34
+ console.log("\n▸ Profiler Table");
29
35
  console.log(profiler.exportTable());
30
36
  const json = profiler.exportJSON();
31
- console.log("\n=== Load Model Metrics ===");
37
+ console.log("\n▸ Load Model Metrics");
32
38
  // Filter for operation-level event (kind: "handler"), not RPC phase events
33
39
  const loadModelEvent = json.recentEvents?.find((e) => e.op === "loadModel" && e.kind === "handler");
34
40
  if (loadModelEvent) {
@@ -58,15 +64,15 @@ try {
58
64
  ];
59
65
  console.log(" Available ops:", ops.join(", "));
60
66
  }
61
- console.log("\n=== Profiler JSON (structure) ===");
67
+ console.log("\n▸ Profiler JSON (structure)");
62
68
  console.log(" aggregates:", Object.keys(json.aggregates).length, "metrics");
63
69
  console.log(" recentEvents:", json.recentEvents?.length ?? 0, "events");
64
70
  console.log(" config:", json.config);
65
71
  // Disable profiling
66
72
  profiler.disable();
67
- console.log("\nProfiler disabled:", !profiler.isEnabled());
73
+ console.log("\n▸ Profiler disabled:", !profiler.isEnabled());
68
74
  }
69
75
  catch (error) {
70
- console.error("Error:", error);
76
+ console.error("✖", error);
71
77
  process.exit(1);
72
78
  }
@@ -1,29 +1,35 @@
1
1
  import { embed, loadModel, unloadModel, GTE_LARGE_FP16, profiler, } from "@qvac/sdk";
2
2
  try {
3
3
  profiler.disable();
4
- console.log("Profiler globally enabled:", profiler.isEnabled());
4
+ console.log("▸ Profiler globally enabled:", profiler.isEnabled());
5
5
  const modelId = await loadModel({
6
6
  modelSrc: GTE_LARGE_FP16,
7
- onProgress: (p) => console.log(` ${p.percentage.toFixed(1)}%`),
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("Model loaded:", modelId);
10
- console.log("\n=== Embed with per-call profiling ===");
15
+ console.log("▸ Model loaded:", modelId);
16
+ console.log("\n▸ Embed with per-call profiling");
11
17
  const { embedding: embedding1 } = await embed({ modelId, text: "Profile this specific call" }, { profiling: { enabled: true, includeServerBreakdown: true } });
12
- console.log("Embedding dimensions:", embedding1.length);
13
- console.log("\n=== Embed without profiling ===");
18
+ console.log("▸ Embedding dimensions:", embedding1.length);
19
+ console.log("\n▸ Embed without profiling");
14
20
  const { embedding: embedding2 } = await embed({
15
21
  modelId,
16
22
  text: "This call is not profiled",
17
23
  });
18
- console.log("Embedding dimensions:", embedding2.length);
19
- console.log("\n=== Embed with profiling explicitly disabled ===");
24
+ console.log("▸ Embedding dimensions:", embedding2.length);
25
+ console.log("\n▸ Embed with profiling explicitly disabled");
20
26
  const { embedding: embedding3 } = await embed({ modelId, text: "Profiling explicitly disabled for this call" }, { profiling: { enabled: false } });
21
- console.log("Embedding dimensions:", embedding3.length);
27
+ console.log("▸ Embedding dimensions:", embedding3.length);
22
28
  await unloadModel({ modelId });
23
- console.log("\n=== Profiler Summary (per-call data only) ===");
29
+ console.log("\n▸ Profiler Summary (per-call data only)");
24
30
  console.log(profiler.exportSummary());
25
31
  }
26
32
  catch (error) {
27
- console.error("Error:", error);
33
+ console.error("✖", error);
28
34
  process.exit(1);
29
35
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=quickstart.bare.d.ts.map
@@ -0,0 +1,18 @@
1
+ // The Bare quickstart. Bare has no `process` global and does not spawn a worker,
2
+ // so two setup steps come first: install bare-process as the `process` global,
3
+ // then register the plugins this example uses via `plugins([...])`.
4
+ import bareProcess from "bare-process";
5
+ import { plugins, LLAMA_3_2_1B_INST_Q4_0 } from "@qvac/sdk";
6
+ import { llmPlugin } from "@qvac/sdk/llamacpp-completion/plugin.js";
7
+ globalThis.process = bareProcess;
8
+ const { loadModel, completion, unloadModel } = plugins([llmPlugin]);
9
+ // From here it is the same as the Node quickstart.
10
+ const modelId = await loadModel({ modelSrc: LLAMA_3_2_1B_INST_Q4_0 });
11
+ const history = [
12
+ { role: "user", content: "Explain quantum computing in one sentence" },
13
+ ];
14
+ const result = completion({ modelId, history, stream: true });
15
+ for await (const token of result.tokenStream) {
16
+ process.stdout.write(token);
17
+ }
18
+ await unloadModel({ modelId, autoClose: true });
@@ -1,10 +1,17 @@
1
+ // The SDK prints no logs by default. To see its client and server logs, run with
2
+ // QVAC_CONFIG_PATH pointing at a config that sets "loggerConsoleOutput": true
3
+ // (see the Quickstart docs).
1
4
  import { loadModel, LLAMA_3_2_1B_INST_Q4_0, completion, unloadModel, } from "@qvac/sdk";
2
5
  try {
3
6
  // Load a model into memory
4
7
  const modelId = await loadModel({
5
8
  modelSrc: LLAMA_3_2_1B_INST_Q4_0,
6
- onProgress: (progress) => {
7
- console.log(progress);
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");
8
15
  },
9
16
  });
10
17
  // You can use the loaded model multiple times
@@ -22,6 +29,6 @@ try {
22
29
  await unloadModel({ modelId });
23
30
  }
24
31
  catch (error) {
25
- console.error("❌ Error:", error);
32
+ console.error("✖", error);
26
33
  process.exit(1);
27
34
  }
@@ -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
- 🚀 To run this example, you need a ChromaDB server running locally.
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("✅ Connected to ChromaDB server");
24
+ console.log("▸ Connected to ChromaDB server");
25
25
  return client;
26
26
  }
27
27
  catch {
28
- console.error("❌ Failed to connect to ChromaDB server");
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(`🔍 Query: "${query}"`);
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) => console.log(`Loading model... ${Math.round(p.percentage)}%`),
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(`Collection didn't exist, no need to delete: ${String(e)}`);
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("📚 Embedding documents...");
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("🔎 Searching for similar documents...");
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("\n📋 Top 3 most similar documents:");
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("=".repeat(50) + " Top result:");
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("❌ Error:", 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\n");
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: (progress) => {
24
- process.stdout.write(`\r ${progress.percentage.toFixed(1)}%`);
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("\n✅ Model loaded\n");
31
+ console.log("▸ Model loaded");
28
32
  // Generate documents
29
33
  const documents = generateDocuments(200);
30
- console.log(`📄 Processing ${documents.length} documents...\n`);
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
- const pct = total > 0 ? Math.round((current / total) * 100) : 0;
44
- console.log(` [${stage}] ${current}/${total} (${pct}%)`);
47
+ console.log(`▸ ${stage} ${current}/${total}`);
45
48
  if (!cancelled && stage === "embedding" && current > 10) {
46
- console.log("\n🛑 Triggering cancellation...\n");
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("\n⚠️ Ingest completed (cancellation didn't interrupt in time)");
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("✅ Operation cancelled successfully!");
62
- console.log(` Progress updates received: ${progressCount}`);
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("✅ Done");
74
+ console.log("▸ Done");
72
75
  process.exit(0);
73
76
  }
74
77
  catch (error) {
75
- console.error("❌ Error:", 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(`🔍 Query: "${query}"`);
6
+ console.log(`▸ Query: "${query}"`);
7
7
  const modelId = await loadModel({
8
8
  modelSrc: GTE_LARGE_FP16,
9
- onProgress: (progress) => {
10
- console.log(`Loading model... ${progress.percentage.toFixed(1)}%`);
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("📚 Ingesting documents...");
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(`✅ Ingested ${result.processed.length} documents`);
31
- console.log("🔎 Searching for similar documents...");
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("\n📋 Top 3 most similar documents:");
42
+ console.log("▸ Top 3 most similar documents:");
39
43
  results.forEach((result, index) => {
40
- console.log("=".repeat(50) + " Top result:");
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(`\n🗑️ Deleted '${workspace}' workspace`);
50
+ console.log(`▸ Deleted '${workspace}' workspace`);
49
51
  await unloadModel({ modelId });
50
52
  }
51
53
  catch (error) {
52
- console.error("❌ Error:", error);
54
+ console.error("✖", error);
53
55
  process.exit(1);
54
56
  }