@qvac/sdk 0.13.5 → 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 (221) 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/expo-rpc-client.js +2 -11
  19. package/dist/client/rpc/node-rpc-client.js +8 -2
  20. package/dist/client/rpc/rpc-client.js +39 -7
  21. package/dist/commands/bundle/constants.js +2 -1
  22. package/dist/examples/bci/bci-filesystem-streaming.js +14 -14
  23. package/dist/examples/bci/bci-filesystem.js +17 -13
  24. package/dist/examples/cache-management.js +38 -38
  25. package/dist/examples/cancel-by-request-id.js +9 -9
  26. package/dist/examples/completion-events.js +20 -14
  27. package/dist/examples/completion-stop-reason.js +13 -7
  28. package/dist/examples/concurrent-completion-collision.js +7 -7
  29. package/dist/examples/config-reload.js +7 -8
  30. package/dist/examples/default-config-usage.js +4 -4
  31. package/dist/examples/delegated-inference/composite.js +14 -10
  32. package/dist/examples/delegated-inference/consumer-profiled.js +13 -13
  33. package/dist/examples/delegated-inference/consumer.js +16 -12
  34. package/dist/examples/delegated-inference/provider.js +12 -12
  35. package/dist/examples/diffusion-esrgan-upscale.js +19 -15
  36. package/dist/examples/diffusion-flux2-klein-img2img.js +16 -11
  37. package/dist/examples/diffusion-flux2-klein.js +14 -9
  38. package/dist/examples/diffusion-img2img.js +9 -10
  39. package/dist/examples/diffusion-img2vid.js +17 -12
  40. package/dist/examples/diffusion-simple.js +1 -1
  41. package/dist/examples/diffusion-txt2img.js +14 -9
  42. package/dist/examples/diffusion-txt2vid.js +15 -10
  43. package/dist/examples/download-with-blind-relays.js +16 -21
  44. package/dist/examples/download-with-cancel.js +15 -16
  45. package/dist/examples/embed-multi-gpu.js +3 -4
  46. package/dist/examples/embed-p2p.js +11 -7
  47. package/dist/examples/finetune/llamacpp-finetune.js +7 -7
  48. package/dist/examples/kv-cache-cleanup.js +35 -35
  49. package/dist/examples/kv-cache-custom-key.js +24 -24
  50. package/dist/examples/kv-cache-example.js +9 -9
  51. package/dist/examples/llamacpp-cache.js +18 -14
  52. package/dist/examples/llamacpp-dynamic-tools.js +15 -9
  53. package/dist/examples/llamacpp-filesystem.js +15 -9
  54. package/dist/examples/llamacpp-http.js +12 -10
  55. package/dist/examples/llamacpp-multi-gpu.js +4 -4
  56. package/dist/examples/llamacpp-multimodal.js +13 -9
  57. package/dist/examples/llamacpp-p2p.js +8 -4
  58. package/dist/examples/llamacpp-sharded.js +5 -5
  59. package/dist/examples/llamacpp-structured-output.js +15 -9
  60. package/dist/examples/logging-file-transport.js +3 -3
  61. package/dist/examples/logging-global.d.ts +2 -0
  62. package/dist/examples/logging-global.js +34 -0
  63. package/dist/examples/logging-streaming.js +7 -10
  64. package/dist/examples/mcp-websearch.js +24 -18
  65. package/dist/examples/multi-model-demo.js +17 -11
  66. package/dist/examples/ocr-fasttext.js +14 -16
  67. package/dist/examples/parallel-download.js +7 -7
  68. package/dist/examples/plugins.js +40 -28
  69. package/dist/examples/profiling/basic.js +16 -10
  70. package/dist/examples/profiling/per-call.js +17 -11
  71. package/dist/examples/quickstart.bare.d.ts +2 -0
  72. package/dist/examples/quickstart.bare.js +18 -0
  73. package/dist/examples/quickstart.js +10 -3
  74. package/dist/examples/rag/rag-chromadb.js +18 -14
  75. package/dist/examples/rag/rag-hyperdb/cancellation.js +17 -14
  76. package/dist/examples/rag/rag-hyperdb/ingest.js +14 -12
  77. package/dist/examples/rag/rag-hyperdb/pipeline.js +19 -17
  78. package/dist/examples/rag/rag-hyperdb/workspaces.js +31 -27
  79. package/dist/examples/rag/rag-lancedb.js +12 -8
  80. package/dist/examples/rag/rag-sqlite.js +11 -7
  81. package/dist/examples/registry-query.js +17 -17
  82. package/dist/examples/seed-p2p.js +10 -6
  83. package/dist/examples/suspend-resume.js +20 -16
  84. package/dist/examples/tools/llamacpp-native-tools.js +24 -18
  85. package/dist/examples/tools/llamacpp-tools-gemma4.js +14 -8
  86. package/dist/examples/tools/llamacpp-tools-harmony-multiturn.js +20 -14
  87. package/dist/examples/tools/llamacpp-tools-pythonic.js +14 -8
  88. package/dist/examples/tools/llamacpp-tools-qwen35.js +14 -8
  89. package/dist/examples/transcription/parakeet-ctc-filesystem.js +12 -9
  90. package/dist/examples/transcription/parakeet-microphone-record.js +15 -9
  91. package/dist/examples/transcription/parakeet-microphone-stream.js +15 -9
  92. package/dist/examples/transcription/parakeet-sortformer-streaming.js +12 -6
  93. package/dist/examples/transcription/parakeet-sortformer.js +3 -5
  94. package/dist/examples/transcription/parakeet-tdt-filesystem.js +13 -10
  95. package/dist/examples/transcription/whispercpp-filesystem-streaming.js +16 -17
  96. package/dist/examples/transcription/whispercpp-filesystem.js +14 -10
  97. package/dist/examples/transcription/whispercpp-microphone-conversation.js +10 -10
  98. package/dist/examples/transcription/whispercpp-microphone-record.js +6 -6
  99. package/dist/examples/transcription/whispercpp-prompt.js +14 -10
  100. package/dist/examples/translation/translation-bergamot-batch.js +11 -7
  101. package/dist/examples/translation/translation-bergamot-pivot.js +13 -9
  102. package/dist/examples/translation/translation-bergamot.js +8 -4
  103. package/dist/examples/translation/translation-indic.js +8 -4
  104. package/dist/examples/translation/translation-llm-afriquegemma.js +7 -3
  105. package/dist/examples/translation/translation-llm-context.js +8 -4
  106. package/dist/examples/translation/translation-llm.js +7 -3
  107. package/dist/examples/translation/translation-stream.js +4 -4
  108. package/dist/examples/tts/chatterbox.js +19 -11
  109. package/dist/examples/tts/llm-to-tts-streaming.js +27 -14
  110. package/dist/examples/tts/supertonic-multilingual.js +18 -14
  111. package/dist/examples/tts/supertonic.js +19 -15
  112. package/dist/examples/tts/utils.js +1 -1
  113. package/dist/examples/vla-pi05.js +18 -14
  114. package/dist/examples/vla-smolvla.js +18 -14
  115. package/dist/examples/voice-assistant/voice-assistant.js +12 -12
  116. package/dist/index.d.ts +3 -4
  117. package/dist/index.js +3 -4
  118. package/dist/logging/client-logger.js +2 -1
  119. package/dist/logging/index.d.ts +1 -1
  120. package/dist/logging/index.js +1 -1
  121. package/dist/logging/namespaces.d.ts +1 -0
  122. package/dist/logging/namespaces.js +2 -0
  123. package/dist/logging/server-logger.js +1 -4
  124. package/dist/logging/utils.js +6 -1
  125. package/dist/models/registry/index.d.ts +17 -0
  126. package/dist/models/registry/index.js +20 -1
  127. package/dist/models/registry/models.d.ts +1062 -38
  128. package/dist/models/registry/models.js +3546 -2490
  129. package/dist/pear/pre.js +2 -2
  130. package/dist/schemas/bci-config.d.ts +37 -0
  131. package/dist/schemas/bci-config.js +2 -0
  132. package/dist/schemas/bci.d.ts +2 -0
  133. package/dist/schemas/common.d.ts +171 -94
  134. package/dist/schemas/completion-stream.d.ts +6 -3
  135. package/dist/schemas/completion-stream.js +10 -2
  136. package/dist/schemas/download-asset.d.ts +5 -5
  137. package/dist/schemas/engine-addon-map.d.ts +1 -1
  138. package/dist/schemas/engine-addon-map.js +6 -3
  139. package/dist/schemas/error.js +6 -1
  140. package/dist/schemas/llamacpp-config.d.ts +27 -8
  141. package/dist/schemas/llamacpp-config.js +19 -2
  142. package/dist/schemas/load-model.d.ts +4170 -570
  143. package/dist/schemas/load-model.js +85 -26
  144. package/dist/schemas/logging-stream.js +7 -1
  145. package/dist/schemas/model-src-utils.d.ts +6 -6
  146. package/dist/schemas/model-types.d.ts +14 -15
  147. package/dist/schemas/model-types.js +10 -11
  148. package/dist/schemas/ocr.d.ts +10 -8
  149. package/dist/schemas/ocr.js +8 -6
  150. package/dist/schemas/plugin.d.ts +6 -5
  151. package/dist/schemas/plugin.js +4 -4
  152. package/dist/schemas/rag.d.ts +4 -4
  153. package/dist/schemas/registry.d.ts +8 -8
  154. package/dist/schemas/registry.js +1 -1
  155. package/dist/schemas/reload-config.d.ts +6 -6
  156. package/dist/schemas/sdcpp-config.d.ts +12 -12
  157. package/dist/schemas/sdk-config.d.ts +171 -117
  158. package/dist/schemas/sdk-config.js +5 -5
  159. package/dist/schemas/sdk-errors-client.d.ts +1 -0
  160. package/dist/schemas/sdk-errors-client.js +7 -2
  161. package/dist/schemas/text-to-speech.d.ts +157 -13
  162. package/dist/schemas/text-to-speech.js +70 -7
  163. package/dist/schemas/transcription-config.d.ts +5 -1
  164. package/dist/schemas/transcription-config.js +2 -0
  165. package/dist/schemas/transcription.d.ts +3 -0
  166. package/dist/schemas/transcription.js +2 -1
  167. package/dist/schemas/translate.d.ts +6 -6
  168. package/dist/schemas/translate.js +2 -3
  169. package/dist/schemas/translation-config.d.ts +20 -20
  170. package/dist/server/bare/hyperswarm.js +3 -3
  171. package/dist/server/bare/ops/transcribe.js +46 -15
  172. package/dist/server/bare/plugins/bci-whispercpp-transcription/args.d.ts +3 -0
  173. package/dist/server/bare/plugins/bci-whispercpp-transcription/args.js +13 -0
  174. package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.d.ts +41 -0
  175. package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.js +6 -11
  176. package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.d.ts +75 -0
  177. package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.js +11 -0
  178. package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.d.ts +16 -10
  179. package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.js +25 -18
  180. package/dist/server/bare/plugins/index.d.ts +1 -1
  181. package/dist/server/bare/plugins/index.js +1 -1
  182. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.d.ts +10 -0
  183. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.js +29 -0
  184. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +4 -22
  185. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +15 -7
  186. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +7 -7
  187. package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +2 -0
  188. package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +10 -10
  189. package/dist/server/bare/plugins/tts-ggml/plugin.d.ts +14 -8
  190. package/dist/server/bare/plugins/tts-ggml/plugin.js +12 -0
  191. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +3 -1
  192. package/dist/server/bare/registry/logging-stream-registry.d.ts +4 -2
  193. package/dist/server/bare/registry/logging-stream-registry.js +12 -7
  194. package/dist/server/bare/registry/model-config-utils.js +2 -2
  195. package/dist/server/bare/registry/registry-client.js +1 -1
  196. package/dist/server/bare/runtime-lifecycle.d.ts +9 -0
  197. package/dist/server/bare/runtime-lifecycle.js +24 -0
  198. package/dist/server/bare/types/addon-responses.d.ts +1 -0
  199. package/dist/server/env.js +7 -10
  200. package/dist/server/plugins/registry.js +2 -4
  201. package/dist/server/rpc/handlers/load-model/handler.js +2 -4
  202. package/dist/server/rpc/handlers/load-model/http.js +253 -51
  203. package/dist/server/rpc/handlers/logging-stream.js +4 -2
  204. package/dist/server/rpc/handlers/plugin-invoke.js +5 -16
  205. package/dist/server/utils/completion-normalizer.js +13 -4
  206. package/dist/server/utils/worker-lock.js +5 -5
  207. package/dist/server/worker-core.d.ts +1 -1
  208. package/dist/server/worker-core.js +28 -18
  209. package/dist/utils/errors-client.d.ts +3 -0
  210. package/dist/utils/errors-client.js +5 -0
  211. package/dist/utils/errors-server.d.ts +2 -0
  212. package/dist/utils/errors-server.js +3 -0
  213. package/dist/utils/zod-error.d.ts +3 -0
  214. package/dist/utils/zod-error.js +4 -0
  215. package/package.json +21 -24
  216. package/dist/polyfills/bare-globals.d.ts +0 -2
  217. package/dist/polyfills/bare-globals.js +0 -4
  218. package/dist/polyfills/bare-globals.noop.d.ts +0 -2
  219. package/dist/polyfills/bare-globals.noop.js +0 -1
  220. /package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/ops/ocr-stream.d.ts +0 -0
  221. /package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/ops/ocr-stream.js +0 -0
@@ -1,24 +1,28 @@
1
- import { loadModel, textToSpeech, unloadModel, TTS_EN_SUPERTONIC_Q8_0, } from "@qvac/sdk";
1
+ import { loadModel, textToSpeech, unloadModel, TTS_MULTILINGUAL_SUPERTONIC3_Q8_0, } from "@qvac/sdk";
2
2
  import { createWav, playAudio, int16ArrayToBuffer, createWavHeader, } from "./utils.js";
3
- // Supertonic TTS (GGML): fast English synthesis with baked-in voices.
3
+ // Supertonic 3 TTS (GGML): fast multilingual synthesis with baked-in voices.
4
4
  // Uses registry model constants — downloads automatically from QVAC Registry.
5
5
  const SUPERTONIC_SAMPLE_RATE = 44100;
6
6
  try {
7
7
  const modelId = await loadModel({
8
- modelSrc: TTS_EN_SUPERTONIC_Q8_0,
8
+ modelSrc: TTS_MULTILINGUAL_SUPERTONIC3_Q8_0,
9
9
  modelConfig: {
10
10
  ttsEngine: "supertonic",
11
11
  language: "en",
12
12
  voice: "F1",
13
13
  ttsSpeed: 1.05,
14
- ttsNumInferenceSteps: 5,
14
+ ttsNumInferenceSteps: 5
15
15
  },
16
- onProgress: (progress) => {
17
- console.log(progress);
16
+ onProgress: (p) => {
17
+ const mb = (n) => (n / 1e6).toFixed(1);
18
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
19
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
20
+ if (p.percentage >= 100)
21
+ process.stderr.write("\n");
18
22
  },
19
23
  });
20
- console.log(`Model loaded: ${modelId}`);
21
- console.log("🎵 Testing Text-to-Speech...");
24
+ console.log(`▸ Model loaded: ${modelId}`);
25
+ console.log("▸ Testing Text-to-Speech...");
22
26
  const result = textToSpeech({
23
27
  modelId,
24
28
  text: `QVAC SDK is the canonical entry point to QVAC. Written in TypeScript, it provides all QVAC capabilities through a unified interface while also abstracting away the complexity of running your application in a JS environment other than Bare. Supported JS environments include Bare, Node.js, Expo and Bun.`,
@@ -26,23 +30,23 @@ try {
26
30
  stream: false,
27
31
  });
28
32
  const audioBuffer = await result.buffer;
29
- console.log(`TTS complete. Total samples: ${audioBuffer.length}`);
30
- console.log("💾 Saving audio to file...");
33
+ console.log(`▸ TTS complete. Total samples: ${audioBuffer.length}`);
34
+ console.log("▸ Saving audio to file...");
31
35
  createWav(audioBuffer, SUPERTONIC_SAMPLE_RATE, "supertonic-output.wav");
32
- console.log("✅ Audio saved to supertonic-output.wav");
33
- console.log("🔊 Playing audio...");
36
+ console.log("▸ Audio saved to supertonic-output.wav");
37
+ console.log("▸ Playing audio...");
34
38
  const audioData = int16ArrayToBuffer(audioBuffer);
35
39
  const wavBuffer = Buffer.concat([
36
40
  createWavHeader(audioData.length, SUPERTONIC_SAMPLE_RATE),
37
41
  audioData,
38
42
  ]);
39
43
  playAudio(wavBuffer);
40
- console.log("✅ Audio playback complete");
44
+ console.log("▸ Audio playback complete");
41
45
  await unloadModel({ modelId });
42
- console.log("Model unloaded");
46
+ console.log("▸ Model unloaded");
43
47
  process.exit(0);
44
48
  }
45
49
  catch (error) {
46
- console.error("❌ Error:", error);
50
+ console.error("✖", error);
47
51
  process.exit(1);
48
52
  }
@@ -44,7 +44,7 @@ export function createWav(audioBuffer, sampleRate, filename) {
44
44
  const wavHeader = createWavHeader(audioData.length, sampleRate);
45
45
  const wavFile = Buffer.concat([wavHeader, audioData]);
46
46
  writeFileSync(filename, wavFile);
47
- console.log(`WAV file saved as: ${filename}`);
47
+ console.log(`▸ WAV file saved as: ${filename}`);
48
48
  }
49
49
  /**
50
50
  * Play a WAV buffer by streaming it into ffplay over stdin.
@@ -22,21 +22,25 @@ import { close, loadModel, PI05_BASE_Q_AGGRESSIVE, unloadModel, vla, vlaHparams,
22
22
  const modelSrcOverride = process.argv[2];
23
23
  const modelSrc = modelSrcOverride ?? PI05_BASE_Q_AGGRESSIVE;
24
24
  try {
25
- console.log("Loading π₀.₅ (pi05) model...");
25
+ console.log("▸ Loading π₀.₅ (pi05) model...");
26
26
  const modelId = await loadModel({
27
27
  modelSrc,
28
28
  modelType: "ggml-vla",
29
29
  modelConfig: { backend: "cpu" },
30
- onProgress: (p) => typeof modelSrc === "string"
31
- ? undefined
32
- : process.stdout.write(`\rDownloading: ${p.percentage.toFixed(1)}%`),
30
+ onProgress: (p) => {
31
+ const mb = (n) => (n / 1e6).toFixed(1);
32
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
33
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
34
+ if (p.percentage >= 100)
35
+ process.stderr.write("\n");
36
+ },
33
37
  });
34
38
  if (typeof modelSrc !== "string")
35
- process.stdout.write("\n");
36
- console.log(`Model loaded: ${modelId}`);
39
+ process.stderr.write("\n");
40
+ console.log(`▸ Model loaded: ${modelId}`);
37
41
  const { hparams, backendName } = await vlaHparams({ modelId });
38
- console.log(`Backend: ${backendName ?? "(unknown)"}`);
39
- console.log("Hparams:", hparams);
42
+ console.log(`▸ Backend: ${backendName ?? "(unknown)"}`);
43
+ console.log("▸ Hparams:", hparams);
40
44
  // Build synthetic inputs sized to the model's expectations. A real
41
45
  // consumer would: read camera frames, tokenize the instruction with the
42
46
  // model's tokenizer, and (for π₀.₅) inline the robot state into the prompt.
@@ -54,7 +58,7 @@ try {
54
58
  // into the prompt), so pass an empty Float32Array. π₀.₅ requires `noise`.
55
59
  const state = new Float32Array(0);
56
60
  const noise = new Float32Array(hparams.chunkSize * hparams.maxActionDim);
57
- console.log("Running VLA inference...");
61
+ console.log("▸ Running VLA inference...");
58
62
  const { actions, actionDim, chunkSize, stats } = await vla({
59
63
  modelId,
60
64
  images,
@@ -65,20 +69,20 @@ try {
65
69
  mask,
66
70
  noise,
67
71
  });
68
- console.log(`Got ${chunkSize} action steps of dim ${actionDim}.`);
69
- console.log("First step:", Array.from(actions.subarray(0, actionDim)));
72
+ console.log(`▸ Got ${chunkSize} action steps of dim ${actionDim}.`);
73
+ console.log(Array.from(actions.subarray(0, actionDim)));
70
74
  if (stats) {
71
- console.log(`Timing: vision=${stats.vision_ms?.toFixed(0)}ms ` +
75
+ console.log(`▸ Timing: vision=${stats.vision_ms?.toFixed(0)}ms ` +
72
76
  `prefill=${stats.prefill_total_ms?.toFixed(0)}ms ` +
73
77
  `ode=${stats.ode_ms?.toFixed(0)}ms ` +
74
78
  `total=${stats.total_ms?.toFixed(0)}ms`);
75
79
  }
76
80
  await unloadModel({ modelId, clearStorage: false });
77
- console.log("Model unloaded.");
81
+ console.log("▸ Model unloaded.");
78
82
  process.exit(0);
79
83
  }
80
84
  catch (error) {
81
- console.error("π₀.₅ example failed:", error);
85
+ console.error("✖", error);
82
86
  await close();
83
87
  process.exit(1);
84
88
  }
@@ -16,21 +16,25 @@ import { close, loadModel, SMOLVLA_LIBERO_VISION_Q8, unloadModel, vla, vlaHparam
16
16
  const modelSrcOverride = process.argv[2];
17
17
  const modelSrc = modelSrcOverride ?? SMOLVLA_LIBERO_VISION_Q8;
18
18
  try {
19
- console.log("Loading SmolVLA model...");
19
+ console.log("▸ Loading SmolVLA model...");
20
20
  const modelId = await loadModel({
21
21
  modelSrc,
22
22
  modelType: "ggml-vla",
23
23
  modelConfig: { backend: "cpu" },
24
- onProgress: (p) => typeof modelSrc === "string"
25
- ? undefined
26
- : process.stdout.write(`\rDownloading: ${p.percentage.toFixed(1)}%`),
24
+ onProgress: (p) => {
25
+ const mb = (n) => (n / 1e6).toFixed(1);
26
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
27
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
28
+ if (p.percentage >= 100)
29
+ process.stderr.write("\n");
30
+ },
27
31
  });
28
32
  if (typeof modelSrc !== "string")
29
- process.stdout.write("\n");
30
- console.log(`Model loaded: ${modelId}`);
33
+ process.stderr.write("\n");
34
+ console.log(`▸ Model loaded: ${modelId}`);
31
35
  const { hparams, backendName } = await vlaHparams({ modelId });
32
- console.log(`Backend: ${backendName ?? "(unknown)"}`);
33
- console.log("Hparams:", hparams);
36
+ console.log(`▸ Backend: ${backendName ?? "(unknown)"}`);
37
+ console.log("▸ Hparams:", hparams);
34
38
  // Build synthetic inputs sized to the model's expectations. A real
35
39
  // consumer would: read camera frames, tokenize the instruction with the
36
40
  // SmolVLM2 tokenizer, and read the robot's current end-effector pose.
@@ -45,7 +49,7 @@ try {
45
49
  mask[0] = 1;
46
50
  const state = vlaPadState([0, 0, 0, 0, 0, 0], hparams.maxStateDim);
47
51
  const noise = new Float32Array(hparams.chunkSize * hparams.maxActionDim);
48
- console.log("Running VLA inference...");
52
+ console.log("▸ Running VLA inference...");
49
53
  const { actions, actionDim, chunkSize, stats } = await vla({
50
54
  modelId,
51
55
  images: [front, wrist],
@@ -56,20 +60,20 @@ try {
56
60
  mask,
57
61
  noise,
58
62
  });
59
- console.log(`Got ${chunkSize} action steps of dim ${actionDim}.`);
60
- console.log("First step:", Array.from(actions.subarray(0, actionDim)));
63
+ console.log(`▸ Got ${chunkSize} action steps of dim ${actionDim}.`);
64
+ console.log(Array.from(actions.subarray(0, actionDim)));
61
65
  if (stats) {
62
- console.log(`Timing: vision=${stats.vision_ms?.toFixed(0)}ms ` +
66
+ console.log(`▸ Timing: vision=${stats.vision_ms?.toFixed(0)}ms ` +
63
67
  `smollm2=${stats.smollm2_total_ms?.toFixed(0)}ms ` +
64
68
  `ode=${stats.ode_ms?.toFixed(0)}ms ` +
65
69
  `total=${stats.total_ms?.toFixed(0)}ms`);
66
70
  }
67
71
  await unloadModel({ modelId, clearStorage: false });
68
- console.log("Model unloaded.");
72
+ console.log("▸ Model unloaded.");
69
73
  process.exit(0);
70
74
  }
71
75
  catch (error) {
72
- console.error("VLA example failed:", error);
76
+ console.error("✖", error);
73
77
  await close();
74
78
  process.exit(1);
75
79
  }
@@ -69,11 +69,11 @@ function sleep(ms) {
69
69
  for (const tool of ["ffmpeg", "ffplay"]) {
70
70
  const r = spawnSync(tool, ["-version"], { stdio: "ignore" });
71
71
  if (r.error || r.status !== 0) {
72
- console.error(`${tool} not found on PATH. Install ffmpeg (ffplay ships with it) and retry.`);
72
+ console.error(`✖ ${tool} not found on PATH. Install ffmpeg (ffplay ships with it) and retry.`);
73
73
  process.exit(1);
74
74
  }
75
75
  }
76
- console.log("Loading whisper-tiny + Silero VAD...");
76
+ console.log("▸ Loading whisper-tiny + Silero VAD...");
77
77
  const asrModelId = await loadModel({
78
78
  modelSrc: WHISPER_TINY,
79
79
  modelConfig: {
@@ -89,14 +89,14 @@ const asrModelId = await loadModel({
89
89
  vad_params: VAD_PARAMS,
90
90
  },
91
91
  });
92
- console.log("Loading Llama 3.2 1B...");
92
+ console.log("▸ Loading Llama 3.2 1B...");
93
93
  const llmModelId = await loadModel({
94
94
  modelSrc: LLAMA_3_2_1B_INST_Q4_0,
95
95
  modelConfig: {
96
96
  ctx_size: 4096,
97
97
  },
98
98
  });
99
- console.log("Loading Supertonic TTS...");
99
+ console.log("▸ Loading Supertonic TTS...");
100
100
  const ttsModelId = await loadModel({
101
101
  modelSrc: TTS_EN_SUPERTONIC_Q8_0,
102
102
  modelConfig: {
@@ -107,7 +107,7 @@ const ttsModelId = await loadModel({
107
107
  ttsNumInferenceSteps: 5,
108
108
  },
109
109
  });
110
- console.log("All models loaded.\n");
110
+ console.log("▸ All models loaded.\n");
111
111
  const ffmpeg = startMicrophone({
112
112
  sampleRate: MIC_SAMPLE_RATE,
113
113
  format: "f32le",
@@ -129,7 +129,7 @@ async function cleanup() {
129
129
  if (shuttingDown)
130
130
  return;
131
131
  shuttingDown = true;
132
- console.log("\n\nStopping...");
132
+ console.log("\n\n▸ Stopping...");
133
133
  ffmpeg.kill();
134
134
  try {
135
135
  session.end();
@@ -140,21 +140,21 @@ async function cleanup() {
140
140
  await unloadModel({ modelId: ttsModelId }).catch(() => { });
141
141
  await unloadModel({ modelId: llmModelId }).catch(() => { });
142
142
  await unloadModel({ modelId: asrModelId }).catch(() => { });
143
- console.log("Done.");
143
+ console.log("▸ Done.");
144
144
  process.exit(0);
145
145
  }
146
146
  process.on("SIGINT", () => void cleanup());
147
147
  process.on("SIGTERM", () => void cleanup());
148
- console.log("🎙️ Listening. Speak a question and pause. Ctrl+C to quit.\n");
148
+ console.log("▸ Listening. Speak a question and pause. Ctrl+C to quit.\n");
149
149
  for await (const rawText of session) {
150
150
  if (!isMeaningfulTranscript(rawText))
151
151
  continue;
152
152
  const userText = rawText.trim();
153
- console.log(`🗣️ You: ${userText}`);
153
+ console.log(`▸ You: ${userText}`);
154
154
  history.push({ role: "user", content: userText });
155
155
  isSpeaking = true;
156
156
  try {
157
- process.stdout.write("🤖 Assistant: ");
157
+ console.log("▸ Assistant:");
158
158
  const llmResult = completion({
159
159
  modelId: llmModelId,
160
160
  history,
@@ -188,10 +188,10 @@ for await (const rawText of session) {
188
188
  }
189
189
  }
190
190
  catch (turnError) {
191
- console.error("\n⚠️ Turn failed:", turnError instanceof Error ? turnError.message : turnError);
191
+ console.error("\n✖ Turn failed:", turnError instanceof Error ? turnError.message : turnError);
192
192
  }
193
193
  finally {
194
194
  isSpeaking = false;
195
- console.log("\n🎙️ Listening...\n");
195
+ console.log("\n▸ Listening...\n");
196
196
  }
197
197
  }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import "#polyfill-bare-globals";
2
- export { completion, deleteCache, loadModel, downloadAsset, heartbeat, startQVACProvider, stopQVACProvider, unloadModel, transcribe, transcribeStream, bciTranscribe, bciTranscribeStream, embed, finetune, translate, cancel, ragChunk, ragIngest, ragSaveEmbeddings, ragSearch, ragDeleteEmbeddings, ragReindex, ragListWorkspaces, ragCloseWorkspace, ragDeleteWorkspace, textToSpeech, textToSpeechStream, getModelInfo, getLoadedModelInfo, loggingStream, ocr, invokePlugin, invokePluginStream, diffusion, type DiffusionProgressTick, classify, video, type VideoProgressTick, upscale, modelRegistryList, modelRegistrySearch, modelRegistryGetModel, type ModelRegistrySearchParams, suspend, resume, state, vla, vlaHparams, vlaPreprocessImage, vlaPadState, VLA_DEFAULT_IMAGE_SIZE, type FinetuneHandle, } from "./client/api/index";
1
+ export { completion, deleteCache, loadModel, downloadAsset, heartbeat, startQVACProvider, stopQVACProvider, unloadModel, transcribe, transcribeStream, bciTranscribe, bciTranscribeStream, embed, finetune, translate, cancel, ragChunk, ragIngest, ragSaveEmbeddings, ragSearch, ragDeleteEmbeddings, ragReindex, ragListWorkspaces, ragCloseWorkspace, ragDeleteWorkspace, textToSpeech, textToSpeechStream, getModelInfo, getLoadedModelInfo, loggingStream, subscribeServerLogs, type ServerLogHandler, ocr, invokePlugin, invokePluginStream, diffusion, type DiffusionProgressTick, classify, video, type VideoProgressTick, upscale, modelRegistryList, modelRegistrySearch, modelRegistryGetModel, type ModelRegistrySearchParams, suspend, resume, state, vla, vlaHparams, vlaPreprocessImage, vlaPadState, VLA_DEFAULT_IMAGE_SIZE, type FinetuneHandle, } from "./client/api/index";
3
2
  export { close } from "./client/index";
4
3
  export { plugins } from "./client/plugins-factory";
5
4
  export { type LifecycleState, type ModelProgressUpdate, type LoadModelOptions, type LoadCustomPluginModelOptions, type DownloadAssetOptions, type Tool, type ToolCall, type ToolCallWithCall, type ToolCallError, type ToolCallEvent, type CompletionEvent, type CompletionFinal, type CompletionRun, type CompletionStats, type EmbedStats, VERBOSITY, type Attachment, type TranscribeStreamSession, type TranscribeStreamMetadataSession, type TranscribeStreamConversationSession, type TranscribeStreamEvent, type VadStateEvent, type EndOfTurnEvent, type TranscribeSegment, type BciConfig, type BciTranscribeClientParams, type BciTranscribeStreamClientParams, type BciTranscribeStreamSession, type BciTranscribeStreamMetadataSession, type BciStreamOpts, type NeuralInput, type TextToSpeechStreamSession, type TextToSpeechStreamResponse, type TextToSpeechStreamClientParams, type CompletionParams, type ToolDialect, type RagSearchResult, type RagSaveEmbeddingsResult, type RagReindexResult, type RagEmbeddedDoc, type RagDoc, type RagWorkspaceInfo, type RagCloseWorkspaceParams, type RagDeleteWorkspaceParams, type RagIngestStage, type RagReindexStage, type RagSaveStage, SDK_CLIENT_ERROR_CODES, SDK_SERVER_ERROR_CODES, RAG_ERROR_CODES, type QvacConfig, type ModelInfo, type GetModelInfoParams, type GetLoadedModelInfoParams, type LoadedModelInfo, type LoadedInstance, type CacheFileInfo, toolSchema, TOOLS_MODE, type ToolsMode, type McpClient, type McpClientInput, type OCRClientParams, type OCRTextBlock, type OCROptions, type ClassifyClientParams, type ClassificationResult, type DiffusionClientParams, type DiffusionStreamResponse, type DiffusionStats, type VideoClientParams, type VideoStreamResponse, type VideoStats, type UpscaleClientParams, type UpscaleStreamResponse, type UpscaleStats, type VlaConfig, type VlaClientRunParams, type VlaClientRunResult, type VlaHparams, type VlaStats, definePlugin, defineHandler, defineDuplexHandler, type QvacPlugin, type CreateModelParams, type PluginModelResult, type ModelRegistryEntry, type ModelRegistryEntryAddon, PLUGIN_LLM, PLUGIN_EMBEDDING, PLUGIN_WHISPER, PLUGIN_BCI, PLUGIN_NMT, PLUGIN_TTS, PLUGIN_OCR, PLUGIN_DIFFUSION, PLUGIN_VLA, PLUGIN_CLASSIFICATION, SDK_DEFAULT_PLUGINS, type BuiltinPlugin, type ProfilerMode, type FinetuneValidation, type FinetuneRunParams, type FinetuneGetStateParams, type FinetuneStopParams, type FinetuneParams, type FinetuneStatus, type FinetuneProgress, type FinetuneStats, type FinetuneResult, } from "./schemas/index";
@@ -10,8 +9,8 @@ export { SUPPORTED_AUDIO_FORMATS } from "./constants/audio";
10
9
  export { InferenceCancelledError } from "./utils/errors-server";
11
10
  export type { InferenceCancelledPartial } from "./utils/errors-server";
12
11
  export { ContextOverflowError, RequestIdConflictError, RequestNotFoundError, RequestRejectedByPolicyError, } from "./utils/errors-server";
13
- export { BareRuntimeBinaryNotFoundError, WorkerCrashedError, WorkerShutdownError, } from "./utils/errors-client";
14
- export { getLogger, SDK_LOG_ID } from "./logging/index";
12
+ export { BareRuntimeBinaryNotFoundError, WorkerCrashedError, WorkerShutdownError, RequestValidationFailedError, } from "./utils/errors-client";
13
+ export { getLogger, SDK_LOG_ID, SDK_ALL_LOG_ID } from "./logging/index";
15
14
  export type { Logger, LogTransport, LoggerOptions } from "./logging/index";
16
15
  export { profiler } from "./profiling/index";
17
16
  export type { ProfilerRuntimeOptions, ProfilerExport } from "./profiling/index";
package/dist/index.js CHANGED
@@ -1,6 +1,5 @@
1
- import "#polyfill-bare-globals";
2
1
  // Public API exports only
3
- export { completion, deleteCache, loadModel, downloadAsset, heartbeat, startQVACProvider, stopQVACProvider, unloadModel, transcribe, transcribeStream, bciTranscribe, bciTranscribeStream, embed, finetune, translate, cancel, ragChunk, ragIngest, ragSaveEmbeddings, ragSearch, ragDeleteEmbeddings, ragReindex, ragListWorkspaces, ragCloseWorkspace, ragDeleteWorkspace, textToSpeech, textToSpeechStream, getModelInfo, getLoadedModelInfo, loggingStream, ocr, invokePlugin, invokePluginStream, diffusion, classify, video, upscale, modelRegistryList, modelRegistrySearch, modelRegistryGetModel, suspend, resume, state, vla, vlaHparams, vlaPreprocessImage, vlaPadState, VLA_DEFAULT_IMAGE_SIZE, } from "./client/api/index.js";
2
+ export { completion, deleteCache, loadModel, downloadAsset, heartbeat, startQVACProvider, stopQVACProvider, unloadModel, transcribe, transcribeStream, bciTranscribe, bciTranscribeStream, embed, finetune, translate, cancel, ragChunk, ragIngest, ragSaveEmbeddings, ragSearch, ragDeleteEmbeddings, ragReindex, ragListWorkspaces, ragCloseWorkspace, ragDeleteWorkspace, textToSpeech, textToSpeechStream, getModelInfo, getLoadedModelInfo, loggingStream, subscribeServerLogs, ocr, invokePlugin, invokePluginStream, diffusion, classify, video, upscale, modelRegistryList, modelRegistrySearch, modelRegistryGetModel, suspend, resume, state, vla, vlaHparams, vlaPreprocessImage, vlaPadState, VLA_DEFAULT_IMAGE_SIZE, } from "./client/api/index.js";
4
3
  export { close } from "./client/index.js";
5
4
  export { plugins } from "./client/plugins-factory.js";
6
5
  export { VERBOSITY, SDK_CLIENT_ERROR_CODES, SDK_SERVER_ERROR_CODES, RAG_ERROR_CODES, toolSchema, TOOLS_MODE, definePlugin, defineHandler, defineDuplexHandler, PLUGIN_LLM, PLUGIN_EMBEDDING, PLUGIN_WHISPER, PLUGIN_BCI, PLUGIN_NMT, PLUGIN_TTS, PLUGIN_OCR, PLUGIN_DIFFUSION, PLUGIN_VLA, PLUGIN_CLASSIFICATION, SDK_DEFAULT_PLUGINS, } from "./schemas/index.js";
@@ -39,8 +38,8 @@ export { ContextOverflowError, RequestIdConflictError, RequestNotFoundError, Req
39
38
  // spawn because the platform's `bare-runtime-<platform>-<arch>` package is
40
39
  // missing (common under pnpm). Exported so consumers can pattern-match with
41
40
  // `instanceof`.
42
- export { BareRuntimeBinaryNotFoundError, WorkerCrashedError, WorkerShutdownError, } from "./utils/errors-client.js";
41
+ export { BareRuntimeBinaryNotFoundError, WorkerCrashedError, WorkerShutdownError, RequestValidationFailedError, } from "./utils/errors-client.js";
43
42
  // Logging exports
44
- export { getLogger, SDK_LOG_ID } from "./logging/index.js";
43
+ export { getLogger, SDK_LOG_ID, SDK_ALL_LOG_ID } from "./logging/index.js";
45
44
  // Profiler exports
46
45
  export { profiler } from "./profiling/index.js";
@@ -16,7 +16,8 @@ export function getClientLogger(options) {
16
16
  return cached;
17
17
  }
18
18
  }
19
- const logger = getLogger(CLIENT_NAMESPACE, options);
19
+ // The SDK's own logs stay off the console unless the caller opts in.
20
+ const logger = getLogger(CLIENT_NAMESPACE, { enableConsole: false, ...options });
20
21
  if (!options) {
21
22
  setCachedClientLogger(logger);
22
23
  }
@@ -4,7 +4,7 @@ export { createStreamLogger } from "./stream-logger";
4
4
  export { getServerLogger } from "./server-logger";
5
5
  export { getClientLogger } from "./client-logger";
6
6
  export type { Logger, LoggerOptions, LogTransport } from "./types";
7
- export { RAG_NAMESPACE, SDK_LOG_ID, SDK_SERVER_NAMESPACE, type AddonNamespace, } from "./namespaces";
7
+ export { RAG_NAMESPACE, SDK_LOG_ID, SDK_ALL_LOG_ID, SDK_SERVER_NAMESPACE, type AddonNamespace, } from "./namespaces";
8
8
  export { registerAddonLogger, unregisterAddonLogger, createAddonLoggerCallback, clearAllAddonLoggers, } from "./addon";
9
9
  export { summarizeRequest } from "./utils";
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -3,6 +3,6 @@ export { setGlobalLogLevel, setGlobalConsoleOutput, registerLogger, unregisterLo
3
3
  export { createStreamLogger } from "./stream-logger.js";
4
4
  export { getServerLogger } from "./server-logger.js";
5
5
  export { getClientLogger } from "./client-logger.js";
6
- export { RAG_NAMESPACE, SDK_LOG_ID, SDK_SERVER_NAMESPACE, } from "./namespaces.js";
6
+ export { RAG_NAMESPACE, SDK_LOG_ID, SDK_ALL_LOG_ID, SDK_SERVER_NAMESPACE, } from "./namespaces.js";
7
7
  export { registerAddonLogger, unregisterAddonLogger, createAddonLoggerCallback, clearAllAddonLoggers, } from "./addon.js";
8
8
  export { summarizeRequest } from "./utils.js";
@@ -2,5 +2,6 @@ import { type CanonicalModelType } from "../schemas/model-types";
2
2
  export declare const RAG_NAMESPACE: "rag:hyperdb";
3
3
  export type AddonNamespace = CanonicalModelType | typeof RAG_NAMESPACE;
4
4
  export declare const SDK_LOG_ID = "__sdk__";
5
+ export declare const SDK_ALL_LOG_ID = "__all__";
5
6
  export declare const SDK_SERVER_NAMESPACE = "sdk:server";
6
7
  //# sourceMappingURL=namespaces.d.ts.map
@@ -2,5 +2,7 @@ import {} from "../schemas/model-types.js";
2
2
  export const RAG_NAMESPACE = "rag:hyperdb";
3
3
  // Reserved ID for SDK server logs
4
4
  export const SDK_LOG_ID = "__sdk__";
5
+ // Reserved ID for the stream that receives all server-side logs
6
+ export const SDK_ALL_LOG_ID = "__all__";
5
7
  // Namespace for all SDK server logs
6
8
  export const SDK_SERVER_NAMESPACE = "sdk:server";
@@ -5,10 +5,7 @@ export function getServerLogger(options) {
5
5
  if (!options && cachedLogger) {
6
6
  return cachedLogger;
7
7
  }
8
- const logger = createStreamLogger(SDK_LOG_ID, SDK_SERVER_NAMESPACE, {
9
- enableConsole: true, // SDK logs should still print to console
10
- ...options,
11
- });
8
+ const logger = createStreamLogger(SDK_LOG_ID, SDK_SERVER_NAMESPACE, options);
12
9
  if (!options) {
13
10
  cachedLogger = logger;
14
11
  }
@@ -1,6 +1,11 @@
1
- import { LEVEL_PRIORITIES } from "@qvac/logging/constants.js";
1
+ import { LEVEL_PRIORITIES, LOG_LEVELS } from "@qvac/logging/constants.js";
2
2
  import stringify from "fast-safe-stringify";
3
3
  export function isLevelEnabled(messageLevel, currentLevel) {
4
+ // "off" suppresses every emission (console, streams, and transports alike),
5
+ // even though its priority sits above the real levels.
6
+ if (currentLevel === LOG_LEVELS.OFF || messageLevel === LOG_LEVELS.OFF) {
7
+ return false;
8
+ }
4
9
  const messagePriority = LEVEL_PRIORITIES[messageLevel];
5
10
  const currentPriority = LEVEL_PRIORITIES[currentLevel];
6
11
  if (messagePriority === undefined || currentPriority === undefined) {
@@ -1,2 +1,19 @@
1
1
  export * from "./models";
2
+ export declare const BCI_EMBEDDER: {
3
+ readonly name: "BCI_EMBEDDER";
4
+ readonly src: "registry://s3/qvac_models_compiled/bci-whispercpp/2026-05-07/bci-embedder.bin";
5
+ readonly registryPath: "qvac_models_compiled/bci-whispercpp/2026-05-07/bci-embedder.bin";
6
+ readonly registrySource: "s3";
7
+ readonly blobCoreKey: "6309722b3460d91d38ad7526875ecfa29183245826b717949c55ba443093d963";
8
+ readonly blobBlockOffset: 2263987;
9
+ readonly blobBlockLength: 382;
10
+ readonly blobByteOffset: 148361525869;
11
+ readonly modelId: "bci-embedder.bin";
12
+ readonly expectedSize: 25028476;
13
+ readonly sha256Checksum: "cca7eeee5b421675edece9f4bb88b34e53e26b2c30fe65f3b70ae98d294274ff";
14
+ readonly addon: "bci";
15
+ readonly engine: "bci-whispercpp-transcription";
16
+ readonly quantization: "";
17
+ readonly params: "";
18
+ };
2
19
  //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,21 @@
1
- // Re-export all models
1
+ import { models } from "./models.js";
2
+ // Re-export all generated models
2
3
  export * from "./models.js";
4
+ const bciEmbedder = models.find((model) => model.name === "BCI_EMBEDDER");
5
+ export const BCI_EMBEDDER = {
6
+ name: "BCI_EMBEDDER",
7
+ src: `registry://${bciEmbedder.registrySource}/${bciEmbedder.registryPath}`,
8
+ registryPath: bciEmbedder.registryPath,
9
+ registrySource: bciEmbedder.registrySource,
10
+ blobCoreKey: bciEmbedder.blobCoreKey,
11
+ blobBlockOffset: bciEmbedder.blobBlockOffset,
12
+ blobBlockLength: bciEmbedder.blobBlockLength,
13
+ blobByteOffset: bciEmbedder.blobByteOffset,
14
+ modelId: bciEmbedder.modelId,
15
+ expectedSize: bciEmbedder.expectedSize,
16
+ sha256Checksum: bciEmbedder.sha256Checksum,
17
+ addon: bciEmbedder.addon,
18
+ engine: bciEmbedder.engine,
19
+ quantization: bciEmbedder.quantization,
20
+ params: bciEmbedder.params,
21
+ };