@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
@@ -1,20 +1,20 @@
1
1
  import { completion, LLAMA_3_2_1B_INST_Q4_0, loadModel, close, } from "@qvac/sdk";
2
2
  const providerPublicKey = process.argv[2];
3
3
  if (!providerPublicKey) {
4
- console.error("❌ Provider public key is required. Usage: node consumer.ts <provider-public-key> [consumer-seed]");
4
+ console.error("✖ Provider public key is required. Usage: node consumer.ts <provider-public-key> [consumer-seed]");
5
5
  process.exit(1);
6
6
  }
7
7
  try {
8
8
  // Optional: Consumer seed for deterministic consumer identity (for firewall testing)
9
9
  const consumerSeed = process.argv[3];
10
10
  process.env["QVAC_HYPERSWARM_SEED"] = consumerSeed;
11
- console.log(`🚀 Testing delegated inference`);
12
- console.log(`🔑 Provider: ${providerPublicKey}`);
11
+ console.log(`▸ Testing delegated inference`);
12
+ console.log(`▸ Provider: ${providerPublicKey}`);
13
13
  if (consumerSeed) {
14
- console.log(`🔑 Consumer seed: ${consumerSeed.substring(0, 16)}... (deterministic identity)`);
14
+ console.log(`▸ Consumer seed: ${consumerSeed.substring(0, 16)}... (deterministic identity)`);
15
15
  }
16
16
  else {
17
- console.log(`🎲 No consumer seed provided (random identity)`);
17
+ console.log(`▸ No consumer seed provided (random identity)`);
18
18
  }
19
19
  const modelId = await loadModel({
20
20
  modelSrc: LLAMA_3_2_1B_INST_Q4_0,
@@ -28,24 +28,28 @@ try {
28
28
  fallbackToLocal: true, // Optional: Fall back to local inference if delegation fails
29
29
  // forceNewConnection: true, // Optional: Force a new connection instead of reusing cached one
30
30
  },
31
- onProgress: (progress) => {
32
- console.log(`📊 Download progress: ${progress.percentage.toFixed(1)}% (${progress.downloaded}/${progress.total} bytes)`);
31
+ onProgress: (p) => {
32
+ const mb = (n) => (n / 1e6).toFixed(1);
33
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
34
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
35
+ if (p.percentage >= 100)
36
+ process.stderr.write("\n");
33
37
  },
34
38
  });
35
- console.log(`✅ Delegated model registered: ${modelId}`);
39
+ console.log(`▸ Delegated model registered: ${modelId}`);
36
40
  const response = completion({
37
41
  modelId,
38
42
  history: [{ role: "user", content: "Hello!" }],
39
43
  stream: true,
40
44
  });
41
45
  for await (const token of response.tokenStream) {
42
- console.log(`📨 Response: ${token}`);
46
+ process.stdout.write(token);
43
47
  }
44
- console.log("🔍 Stats:", await response.stats);
45
- console.log("\n🎯 Delegation infrastructure working! Server correctly detected and routed the delegated request.");
48
+ console.log("\n▸ Stats:", await response.stats);
49
+ console.log("▸ Delegation infrastructure working! Server correctly detected and routed the delegated request.");
46
50
  void close();
47
51
  }
48
52
  catch (error) {
49
- console.error("❌ Error:", error);
53
+ console.error("✖", error);
50
54
  process.exit(1);
51
55
  }
@@ -6,10 +6,10 @@ if (seed) {
6
6
  }
7
7
  // Optional: Consumer public key for firewall (allow only this consumer)
8
8
  const allowedConsumerPublicKey = process.argv[3];
9
- console.log(`🚀 Starting provider service...`);
9
+ console.log(`▸ Starting provider service...`);
10
10
  try {
11
11
  if (allowedConsumerPublicKey) {
12
- console.log(`🔒 Firewall enabled: only allowing consumer ${allowedConsumerPublicKey}`);
12
+ console.log(`▸ Firewall enabled: only allowing consumer ${allowedConsumerPublicKey}`);
13
13
  }
14
14
  const response = await startQVACProvider({
15
15
  firewall: allowedConsumerPublicKey
@@ -19,34 +19,34 @@ try {
19
19
  }
20
20
  : undefined,
21
21
  });
22
- console.log("✅ Provider service started successfully!");
23
- console.log("🔗 Provider is now available for delegated inference requests");
22
+ console.log("▸ Provider service started successfully!");
23
+ console.log("▸ Provider is now available for delegated inference requests");
24
24
  console.log("");
25
- console.log("📋 Connection Details:");
26
- console.log(` 🆔 Provider Public Key: ${response.publicKey}`);
25
+ console.log("▸ Connection Details:");
26
+ console.log(`▸ Provider Public Key: ${response.publicKey}`);
27
27
  console.log("");
28
- console.log("💡 Consumer command:");
28
+ console.log("▸ Consumer command:");
29
29
  console.log(` node consumer.ts ${response.publicKey}`);
30
30
  console.log("");
31
- console.log("💡 To reproduce this provider identity:");
31
+ console.log("▸ To reproduce this provider identity:");
32
32
  console.log(` node provider.ts ${seed || "<random-seed>"}`);
33
33
  if (!seed) {
34
34
  console.log(" (Note: seed was random this time, set one for reproducible identity)");
35
35
  }
36
36
  console.log("");
37
- console.log("🔒 For firewall testing:");
37
+ console.log("▸ For firewall testing:");
38
38
  console.log(" 1. Generate a consumer seed (64-char hex)");
39
39
  console.log(" 2. Get consumer public key: getConsumerPublicKey(consumerSeed)");
40
40
  console.log(" 3. Restart provider with consumer public key as 2nd argument");
41
41
  console.log(` 4. Run consumer with: node consumer.ts ${response.publicKey} <consumer-seed>`);
42
- console.log("📡 Provider is running... Press Ctrl+C to stop");
42
+ console.log("▸ Provider is running... Press Ctrl+C to stop");
43
43
  process.on("SIGINT", () => {
44
- console.log("\n🛑 Provider service stopped");
44
+ console.log("\n▸ Provider service stopped");
45
45
  process.exit(0);
46
46
  });
47
47
  process.stdin.resume();
48
48
  }
49
49
  catch (error) {
50
- console.error("❌ Error:", error);
50
+ console.error("✖", error);
51
51
  process.exit(1);
52
52
  }
@@ -15,7 +15,7 @@ const negative_prompt = "blurry, low quality, watermark, text";
15
15
  const outputDir = outputDirArg ?? ".";
16
16
  const seed = 42;
17
17
  try {
18
- console.log("Loading SD 2.1 + ESRGAN upscaler...");
18
+ console.log("▸ Loading SD 2.1 + ESRGAN upscaler...");
19
19
  const modelId = await loadModel({
20
20
  modelSrc: SD_V2_1_1B_Q8_0,
21
21
  modelConfig: {
@@ -26,9 +26,15 @@ try {
26
26
  tile_size: 128,
27
27
  },
28
28
  },
29
- onProgress: (p) => console.log(`Loading: ${p.percentage.toFixed(1)}%`),
29
+ onProgress: (p) => {
30
+ const mb = (n) => (n / 1e6).toFixed(1);
31
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
32
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
33
+ if (p.percentage >= 100)
34
+ process.stderr.write("\n");
35
+ },
30
36
  });
31
- console.log(`Model loaded: ${modelId}`);
37
+ console.log(`▸ Model loaded: ${modelId}`);
32
38
  // Source size is intentionally small — each ESRGAN repeat multiplies dimensions.
33
39
  const baseParams = {
34
40
  modelId,
@@ -40,37 +46,35 @@ try {
40
46
  cfg_scale: 7.5,
41
47
  seed,
42
48
  };
43
- console.log(`\nGenerating ESRGAN x4 upscale: "${prompt}"`);
49
+ console.log(`▸ Generating ESRGAN x4 upscale: "${prompt}"`);
44
50
  const single = diffusion({ ...baseParams, upscale: true });
45
51
  for await (const { step, totalSteps } of single.progressStream) {
46
- process.stdout.write(`\rStep ${step}/${totalSteps}\x1b[K`);
52
+ console.log(`▸ step ${step}/${totalSteps}`);
47
53
  }
48
- console.log();
49
54
  const singleBuffers = await single.outputs;
50
55
  for (let i = 0; i < singleBuffers.length; i++) {
51
56
  const out = path.join(outputDir, `sd2_esrgan_x4_seed${seed}_${i}.png`);
52
57
  fs.writeFileSync(out, singleBuffers[i]);
53
- console.log(`Saved: ${out}`);
58
+ console.log(`▸ Saved ${out}`);
54
59
  }
55
- console.log("Stats:", await single.stats);
56
- console.log("\nGenerating ESRGAN two-pass x16 upscale...");
60
+ console.log("▸ Stats:", await single.stats);
61
+ console.log("▸ Generating ESRGAN two-pass x16 upscale...");
57
62
  const twoPass = diffusion({ ...baseParams, upscale: { repeats: 2 } });
58
63
  for await (const { step, totalSteps } of twoPass.progressStream) {
59
- process.stdout.write(`\rStep ${step}/${totalSteps}\x1b[K`);
64
+ console.log(`▸ step ${step}/${totalSteps}`);
60
65
  }
61
- console.log();
62
66
  const twoPassBuffers = await twoPass.outputs;
63
67
  for (let i = 0; i < twoPassBuffers.length; i++) {
64
68
  const out = path.join(outputDir, `sd2_esrgan_x16_seed${seed}_${i}.png`);
65
69
  fs.writeFileSync(out, twoPassBuffers[i]);
66
- console.log(`Saved: ${out}`);
70
+ console.log(`▸ Saved ${out}`);
67
71
  }
68
- console.log("Stats:", await twoPass.stats);
72
+ console.log("▸ Stats:", await twoPass.stats);
69
73
  await unloadModel({ modelId, clearStorage: false });
70
- console.log("Done.");
74
+ console.log("▸ Done");
71
75
  process.exit(0);
72
76
  }
73
77
  catch (error) {
74
- console.error("❌ Error:", error);
78
+ console.error("✖", error);
75
79
  process.exit(1);
76
80
  }
@@ -9,12 +9,12 @@ const diffusionModelSrc = process.argv[5] || FLUX_2_KLEIN_4B_Q4_0;
9
9
  const llmModelSrc = process.argv[6] || QWEN3_4B_Q4_K_M;
10
10
  const vaeModelSrc = process.argv[7] || FLUX_2_KLEIN_4B_VAE;
11
11
  if (!inputPath) {
12
- console.error("❌ Error: input image path is required");
12
+ console.error("✖ input image path is required");
13
13
  console.error("Usage: bun run bare:example dist/examples/diffusion-flux2-klein-img2img.js <inputImage> [prompt] [outputDir] [diffusionModelSrc] [llmModelSrc] [vaeModelSrc]");
14
14
  process.exit(1);
15
15
  }
16
16
  try {
17
- console.log("Loading FLUX.2 [klein] split-layout model...");
17
+ console.log("▸ Loading FLUX.2 [klein] split-layout model...");
18
18
  const modelId = await loadModel({
19
19
  modelSrc: diffusionModelSrc,
20
20
  modelType: "sdcpp-generation",
@@ -25,11 +25,17 @@ try {
25
25
  vaeModelSrc,
26
26
  prediction: "flux2_flow",
27
27
  },
28
- onProgress: (p) => console.log(`Loading: ${p.percentage.toFixed(1)}%`),
28
+ onProgress: (p) => {
29
+ const mb = (n) => (n / 1e6).toFixed(1);
30
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
31
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
32
+ if (p.percentage >= 100)
33
+ process.stderr.write("\n");
34
+ },
29
35
  });
30
- console.log(`Model loaded: ${modelId}`);
36
+ console.log(`▸ Model loaded: ${modelId}`);
31
37
  const init_image = new Uint8Array(fs.readFileSync(inputPath));
32
- console.log(`\nTransforming "${inputPath}" with prompt: "${prompt}"`);
38
+ console.log(`▸ Transforming "${inputPath}" with prompt: "${prompt}"`);
33
39
  const { progressStream, outputs, stats } = diffusion({
34
40
  modelId,
35
41
  prompt,
@@ -40,21 +46,20 @@ try {
40
46
  seed: -1,
41
47
  });
42
48
  for await (const { step, totalSteps } of progressStream) {
43
- process.stdout.write(`\rStep ${step}/${totalSteps}`);
49
+ console.log(`▸ step ${step}/${totalSteps}`);
44
50
  }
45
- console.log();
46
51
  const buffers = await outputs;
47
52
  for (let i = 0; i < buffers.length; i++) {
48
53
  const outputPath = path.join(outputDir, `flux2_img2img_${i}.png`);
49
54
  fs.writeFileSync(outputPath, buffers[i]);
50
- console.log(`Saved: ${outputPath}`);
55
+ console.log(`▸ Saved ${outputPath}`);
51
56
  }
52
- console.log("\nStats:", await stats);
57
+ console.log("▸ Stats:", await stats);
53
58
  await unloadModel({ modelId, clearStorage: false });
54
- console.log("Done.");
59
+ console.log("▸ Done");
55
60
  process.exit(0);
56
61
  }
57
62
  catch (error) {
58
- console.error("❌ Error:", error);
63
+ console.error("✖", error);
59
64
  process.exit(1);
60
65
  }
@@ -7,7 +7,7 @@ const llmModelSrc = process.argv[3] || QWEN3_4B_Q4_K_M;
7
7
  const vaeModelSrc = process.argv[4] || FLUX_2_KLEIN_4B_VAE;
8
8
  const prompt = process.argv[5] || "a futuristic city at sunset, photorealistic";
9
9
  const outputDir = process.argv[6] || ".";
10
- console.log("Loading FLUX.2 [klein] split-layout model...");
10
+ console.log("▸ Loading FLUX.2 [klein] split-layout model...");
11
11
  const modelId = await loadModel({
12
12
  modelSrc: diffusionModelSrc,
13
13
  modelType: "sdcpp-generation",
@@ -17,10 +17,16 @@ const modelId = await loadModel({
17
17
  llmModelSrc,
18
18
  vaeModelSrc,
19
19
  },
20
- onProgress: (p) => console.log(`Loading: ${p.percentage.toFixed(1)}%`),
20
+ onProgress: (p) => {
21
+ const mb = (n) => (n / 1e6).toFixed(1);
22
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
23
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
24
+ if (p.percentage >= 100)
25
+ process.stderr.write("\n");
26
+ },
21
27
  });
22
- console.log(`Model loaded: ${modelId}`);
23
- console.log(`\nGenerating: "${prompt}"`);
28
+ console.log(`▸ Model loaded: ${modelId}`);
29
+ console.log(`▸ Generating: "${prompt}"`);
24
30
  const { progressStream, outputs, stats } = diffusion({
25
31
  modelId,
26
32
  prompt,
@@ -32,16 +38,15 @@ const { progressStream, outputs, stats } = diffusion({
32
38
  seed: -1,
33
39
  });
34
40
  for await (const { step, totalSteps } of progressStream) {
35
- process.stdout.write(`\rStep ${step}/${totalSteps}`);
41
+ console.log(`▸ step ${step}/${totalSteps}`);
36
42
  }
37
- console.log();
38
43
  const buffers = await outputs;
39
44
  for (let i = 0; i < buffers.length; i++) {
40
45
  const outputPath = path.join(outputDir, `flux2_${i}.png`);
41
46
  fs.writeFileSync(outputPath, buffers[i]);
42
- console.log(`Saved: ${outputPath}`);
47
+ console.log(`▸ Saved ${outputPath}`);
43
48
  }
44
- console.log("\nStats:", await stats);
49
+ console.log("▸ Stats:", await stats);
45
50
  await unloadModel({ modelId, clearStorage: false });
46
- console.log("Done.");
51
+ console.log("▸ Done");
47
52
  process.exit(0);
@@ -7,19 +7,19 @@ const prompt = process.argv[3] || "oil painting style, vibrant colors";
7
7
  const outputDir = process.argv[4] || ".";
8
8
  const modelSrc = process.argv[5] || SD_V2_1_1B_Q8_0;
9
9
  if (!inputPath) {
10
- console.error("❌ Error: input image path is required");
10
+ console.error("✖ input image path is required");
11
11
  console.error("Usage: bun run bare:example dist/examples/diffusion-img2img.js <inputImage> [prompt] [outputDir] [modelSrc]");
12
12
  process.exit(1);
13
13
  }
14
14
  try {
15
- console.log("Loading diffusion model...");
15
+ console.log("▸ Loading diffusion model...");
16
16
  const modelId = await loadModel({
17
17
  modelSrc,
18
18
  modelType: "sdcpp-generation",
19
19
  });
20
- console.log(`Model loaded: ${modelId}`);
20
+ console.log(`▸ Model loaded: ${modelId}`);
21
21
  const init_image = new Uint8Array(fs.readFileSync(inputPath));
22
- console.log(`\nTransforming "${inputPath}" with prompt: "${prompt}"`);
22
+ console.log(`▸ Transforming "${inputPath}" with prompt: "${prompt}"`);
23
23
  const { progressStream, outputs, stats } = diffusion({
24
24
  modelId,
25
25
  prompt,
@@ -29,21 +29,20 @@ try {
29
29
  seed: -1,
30
30
  });
31
31
  for await (const { step, totalSteps } of progressStream) {
32
- process.stdout.write(`\rStep ${step}/${totalSteps}`);
32
+ console.log(`▸ step ${step}/${totalSteps}`);
33
33
  }
34
- console.log();
35
34
  const buffers = await outputs;
36
35
  for (let i = 0; i < buffers.length; i++) {
37
36
  const outputPath = path.join(outputDir, `img2img_${i}.png`);
38
37
  fs.writeFileSync(outputPath, buffers[i]);
39
- console.log(`Saved: ${outputPath}`);
38
+ console.log(`▸ Saved ${outputPath}`);
40
39
  }
41
- console.log("\nStats:", await stats);
40
+ console.log("▸ Stats:", await stats);
42
41
  await unloadModel({ modelId, clearStorage: false });
43
- console.log("Done.");
42
+ console.log("▸ Done");
44
43
  process.exit(0);
45
44
  }
46
45
  catch (error) {
47
- console.error("❌ Error:", error);
46
+ console.error("✖", error);
48
47
  process.exit(1);
49
48
  }
@@ -14,17 +14,17 @@ const t5XxlModelSrc = process.argv[6] || UMT5_XXL_FP16;
14
14
  const vaeModelSrc = process.argv[7] || WAN_2_1_COMFYUI_REPACKAGED_VAE;
15
15
  const clipVisionModelSrc = process.argv[8] || CLIP_VISION_H;
16
16
  if (!initImagePath) {
17
- console.error("❌ Error: init image path is required");
17
+ console.error("✖ init image path is required");
18
18
  console.error("Usage: bun run bare:example dist/examples/diffusion-img2vid.js " +
19
19
  "<initImagePath> [prompt] [outputDir] " +
20
20
  "[i2vModelSrc] [t5XxlModelSrc] [vaeModelSrc] [clipVisionModelSrc]");
21
21
  process.exit(1);
22
22
  }
23
23
  try {
24
- console.log("Loading Wan 2.1 I2V model (diffusion + UMT5-XXL + VAE + CLIP vision)...");
24
+ console.log("▸ Loading Wan 2.1 I2V model (diffusion + UMT5-XXL + VAE + CLIP vision)...");
25
25
  const modelId = await loadModel({
26
26
  modelSrc: diffusionModelSrc,
27
- modelType: "diffusion",
27
+ modelType: "sdcpp-generation",
28
28
  modelConfig: {
29
29
  mode: "video",
30
30
  device: "gpu",
@@ -37,11 +37,17 @@ try {
37
37
  vae_on_cpu: true,
38
38
  vae_tiling: true,
39
39
  },
40
- onProgress: (p) => console.log(`Loading: ${p.percentage.toFixed(1)}%`),
40
+ onProgress: (p) => {
41
+ const mb = (n) => (n / 1e6).toFixed(1);
42
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
43
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
44
+ if (p.percentage >= 100)
45
+ process.stderr.write("\n");
46
+ },
41
47
  });
42
- console.log(`Model loaded: ${modelId}`);
48
+ console.log(`▸ Model loaded: ${modelId}`);
43
49
  const init_image = new Uint8Array(fs.readFileSync(initImagePath));
44
- console.log(`\nGenerating video for: "${prompt}"`);
50
+ console.log(`▸ Generating video for: "${prompt}"`);
45
51
  const { progressStream, outputs, stats } = video({
46
52
  modelId,
47
53
  mode: "img2vid",
@@ -58,21 +64,20 @@ try {
58
64
  vae_tiling: true,
59
65
  });
60
66
  for await (const { step, totalSteps } of progressStream) {
61
- process.stdout.write(`\rStep ${step}/${totalSteps}`);
67
+ console.log(`▸ step ${step}/${totalSteps}`);
62
68
  }
63
- console.log();
64
69
  const buffers = await outputs;
65
70
  for (let i = 0; i < buffers.length; i++) {
66
71
  const outputPath = path.join(outputDir, `wan_i2v_${i}.avi`);
67
72
  fs.writeFileSync(outputPath, buffers[i]);
68
- console.log(`Saved: ${outputPath}`);
73
+ console.log(`▸ Saved ${outputPath}`);
69
74
  }
70
- console.log("\nStats:", await stats);
75
+ console.log("▸ Stats:", await stats);
71
76
  await unloadModel({ modelId, clearStorage: false });
72
- console.log("Done.");
77
+ console.log("▸ Done");
73
78
  process.exit(0);
74
79
  }
75
80
  catch (error) {
76
- console.error("❌ Error:", error);
81
+ console.error("✖", error);
77
82
  process.exit(1);
78
83
  }
@@ -12,6 +12,6 @@ const modelId = await loadModel({
12
12
  const { outputs } = diffusion({ modelId, prompt });
13
13
  const buffers = await outputs;
14
14
  fs.writeFileSync("output.png", buffers[0]);
15
- console.log("Saved: output.png");
15
+ console.log("▸ Saved output.png");
16
16
  await unloadModel({ modelId, clearStorage: false });
17
17
  process.exit(0);
@@ -5,7 +5,7 @@ const modelSrc = process.argv[2] || FLUX_2_KLEIN_4B_Q4_0;
5
5
  const prompt = process.argv[3] ||
6
6
  "a photo of a cat sitting on a windowsill, golden hour lighting";
7
7
  const outputDir = process.argv[4] || ".";
8
- console.log(`Loading diffusion model...`);
8
+ console.log(`▸ Loading diffusion model...`);
9
9
  // FLUX.2 models require companion LLM + VAE models
10
10
  const modelId = await loadModel({
11
11
  modelSrc,
@@ -16,10 +16,16 @@ const modelId = await loadModel({
16
16
  llmModelSrc: QWEN3_4B_Q4_K_M,
17
17
  vaeModelSrc: FLUX_2_KLEIN_4B_VAE,
18
18
  },
19
- onProgress: (p) => console.log(`Loading: ${p.percentage.toFixed(1)}%`),
19
+ onProgress: (p) => {
20
+ const mb = (n) => (n / 1e6).toFixed(1);
21
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
22
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
23
+ if (p.percentage >= 100)
24
+ process.stderr.write("\n");
25
+ },
20
26
  });
21
- console.log(`Model loaded: ${modelId}`);
22
- console.log(`\nGenerating: "${prompt}"`);
27
+ console.log(`▸ Model loaded: ${modelId}`);
28
+ console.log(`▸ Generating: "${prompt}"`);
23
29
  const { progressStream, outputs, stats } = diffusion({
24
30
  modelId,
25
31
  prompt,
@@ -31,16 +37,15 @@ const { progressStream, outputs, stats } = diffusion({
31
37
  seed: -1,
32
38
  });
33
39
  for await (const { step, totalSteps } of progressStream) {
34
- process.stdout.write(`\rStep ${step}/${totalSteps}`);
40
+ console.log(`▸ step ${step}/${totalSteps}`);
35
41
  }
36
- console.log();
37
42
  const buffers = await outputs;
38
43
  for (let i = 0; i < buffers.length; i++) {
39
44
  const outputPath = path.join(outputDir, `output_${i}.png`);
40
45
  fs.writeFileSync(outputPath, buffers[i]);
41
- console.log(`Saved: ${outputPath}`);
46
+ console.log(`▸ Saved ${outputPath}`);
42
47
  }
43
- console.log("\nStats:", await stats);
48
+ console.log("▸ Stats:", await stats);
44
49
  await unloadModel({ modelId, clearStorage: false });
45
- console.log("Done.");
50
+ console.log("▸ Done");
46
51
  process.exit(0);
@@ -14,7 +14,7 @@ const vaeModelSrc = process.argv[4] || WAN_2_1_COMFYUI_REPACKAGED_VAE;
14
14
  const prompt = process.argv[5] || "a colorful bird flapping its wings";
15
15
  const outputDir = process.argv[6] || ".";
16
16
  try {
17
- console.log("Loading Wan 2.1 T2V model (diffusion + UMT5-XXL + VAE)...");
17
+ console.log("▸ Loading Wan 2.1 T2V model (diffusion + UMT5-XXL + VAE)...");
18
18
  const modelId = await loadModel({
19
19
  modelSrc: diffusionModelSrc,
20
20
  modelType: "sdcpp-generation",
@@ -29,10 +29,16 @@ try {
29
29
  vae_on_cpu: true,
30
30
  vae_tiling: true,
31
31
  },
32
- onProgress: (p) => console.log(`Loading: ${p.percentage.toFixed(1)}%`),
32
+ onProgress: (p) => {
33
+ const mb = (n) => (n / 1e6).toFixed(1);
34
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
35
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
36
+ if (p.percentage >= 100)
37
+ process.stderr.write("\n");
38
+ },
33
39
  });
34
- console.log(`Model loaded: ${modelId}`);
35
- console.log(`\nGenerating video for: "${prompt}"`);
40
+ console.log(`▸ Model loaded: ${modelId}`);
41
+ console.log(`\n▸ Generating video for: "${prompt}"`);
36
42
  const { progressStream, outputs, stats } = video({
37
43
  modelId,
38
44
  mode: "txt2vid",
@@ -60,21 +66,20 @@ try {
60
66
  vae_tiling: true,
61
67
  });
62
68
  for await (const { step, totalSteps } of progressStream) {
63
- process.stdout.write(`\rStep ${step}/${totalSteps}`);
69
+ console.log(`▸ step ${step}/${totalSteps}`);
64
70
  }
65
- console.log();
66
71
  const buffers = await outputs;
67
72
  for (let i = 0; i < buffers.length; i++) {
68
73
  const outputPath = path.join(outputDir, `wan_t2v_${i}.avi`);
69
74
  fs.writeFileSync(outputPath, buffers[i]);
70
- console.log(`Saved: ${outputPath}`);
75
+ console.log(`▸ Saved ${outputPath}`);
71
76
  }
72
- console.log("\nStats:", await stats);
77
+ console.log("\n▸ Stats:", await stats);
73
78
  await unloadModel({ modelId, clearStorage: false });
74
- console.log("Done.");
79
+ console.log("▸ Done.");
75
80
  process.exit(0);
76
81
  }
77
82
  catch (error) {
78
- console.error("❌ Error:", error);
83
+ console.error("✖", error);
79
84
  process.exit(1);
80
85
  }
@@ -5,44 +5,39 @@ const configDir = import.meta.dirname ?? process.cwd();
5
5
  process.env["QVAC_CONFIG_PATH"] =
6
6
  `${configDir}/config/blind-relay/blind-relay.config.js`;
7
7
  import { downloadAsset, close, LLAMA_3_2_1B_INST_Q4_0, loadModel, getModelInfo, unloadModel, } from "@qvac/sdk";
8
- console.log(`🚀 Download with Blind Relays Example`);
8
+ console.log(`▸ Download with Blind Relays Example`);
9
9
  console.log(`${"=".repeat(60)}\n`);
10
10
  try {
11
11
  // Config is loaded from examples/config/qvac.config.json (set via QVAC_CONFIG_PATH above)
12
12
  // The config contains swarmRelays - an array of Hyperswarm relay public keys
13
13
  // These relays help with NAT traversal and firewall bypassing for P2P downloads
14
- console.log(`📥 Starting model download from Hyperdrive...\n`);
15
- const startTime = Date.now();
14
+ console.log(`▸ Starting model download from Hyperdrive...\n`);
16
15
  const modelId = await loadModel({
17
16
  modelSrc: LLAMA_3_2_1B_INST_Q4_0,
18
17
  });
19
- console.log(`Model loaded with ID: ${modelId}`);
18
+ console.log(`▸ Model loaded with ID: ${modelId}`);
20
19
  const firstStatus = await getModelInfo(LLAMA_3_2_1B_INST_Q4_0);
21
- console.log(`First status: ${JSON.stringify(firstStatus)}`);
20
+ console.log(`▸ First status: ${JSON.stringify(firstStatus)}`);
22
21
  await unloadModel({ modelId });
23
22
  // Download model with progress tracking
24
23
  await downloadAsset({
25
24
  assetSrc: LLAMA_3_2_1B_INST_Q4_0,
26
- onProgress: (progress) => {
27
- const downloadedMB = (progress.downloaded / 1024 / 1024).toFixed(2);
28
- const totalMB = (progress.total / 1024 / 1024).toFixed(2);
29
- const percentage = progress.percentage.toFixed(1);
30
- const elapsedSeconds = (Date.now() - startTime) / 1000;
31
- const speedMBps = (progress.downloaded /
32
- 1024 /
33
- 1024 /
34
- elapsedSeconds).toFixed(2);
35
- console.log(`📊 ${percentage}% - ${downloadedMB}MB / ${totalMB}MB (${speedMBps} MB/s)`);
25
+ onProgress: (p) => {
26
+ const mb = (n) => (n / 1e6).toFixed(1);
27
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
28
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
29
+ if (p.percentage >= 100)
30
+ process.stderr.write("\n");
36
31
  },
37
32
  });
38
- console.log(`\n✅ Model downloaded successfully using blind relays!`);
39
- console.log(`Blind relays helped establish peer connections through NAT/firewalls\n`);
33
+ console.log(`\n▸ Model downloaded successfully using blind relays!`);
34
+ console.log(`▸ Blind relays helped establish peer connections through NAT/firewalls\n`);
40
35
  await close();
41
36
  }
42
37
  catch (error) {
43
- console.error("❌ Error:", error);
44
- console.log(`\nIf download failed, check the relay public keys in:`);
45
- console.log(` examples/config/qvac.config.json`);
46
- console.log(` (Mock keys in this example won't work in practice!)`);
38
+ console.error("✖", error);
39
+ console.log(`\n▸ If download failed, check the relay public keys in:`);
40
+ console.log(`▸ examples/config/qvac.config.json`);
41
+ console.log(`▸ (Mock keys in this example won't work in practice!)`);
47
42
  process.exit(1);
48
43
  }