@qvac/sdk 0.13.5 → 0.14.1

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 (226) 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/commands/bundle/entry-gen.d.ts +1 -1
  23. package/dist/commands/bundle/entry-gen.js +6 -6
  24. package/dist/commands/bundle/index.js +3 -1
  25. package/dist/commands/bundle/resolve-sdk-import.d.ts +6 -0
  26. package/dist/commands/bundle/resolve-sdk-import.js +60 -0
  27. package/dist/examples/bci/bci-filesystem-streaming.js +14 -14
  28. package/dist/examples/bci/bci-filesystem.js +17 -13
  29. package/dist/examples/cache-management.js +38 -38
  30. package/dist/examples/cancel-by-request-id.js +9 -9
  31. package/dist/examples/completion-events.js +20 -14
  32. package/dist/examples/completion-stop-reason.js +13 -7
  33. package/dist/examples/concurrent-completion-collision.js +7 -7
  34. package/dist/examples/config-reload.js +7 -8
  35. package/dist/examples/default-config-usage.js +4 -4
  36. package/dist/examples/delegated-inference/composite.js +14 -10
  37. package/dist/examples/delegated-inference/consumer-profiled.js +13 -13
  38. package/dist/examples/delegated-inference/consumer.js +16 -12
  39. package/dist/examples/delegated-inference/provider.js +12 -12
  40. package/dist/examples/diffusion-esrgan-upscale.js +19 -15
  41. package/dist/examples/diffusion-flux2-klein-img2img.js +16 -11
  42. package/dist/examples/diffusion-flux2-klein.js +14 -9
  43. package/dist/examples/diffusion-img2img.js +9 -10
  44. package/dist/examples/diffusion-img2vid.js +17 -12
  45. package/dist/examples/diffusion-simple.js +1 -1
  46. package/dist/examples/diffusion-txt2img.js +14 -9
  47. package/dist/examples/diffusion-txt2vid.js +15 -10
  48. package/dist/examples/download-with-blind-relays.js +16 -21
  49. package/dist/examples/download-with-cancel.js +15 -16
  50. package/dist/examples/embed-multi-gpu.js +3 -4
  51. package/dist/examples/embed-p2p.js +11 -7
  52. package/dist/examples/finetune/llamacpp-finetune.js +7 -7
  53. package/dist/examples/kv-cache-cleanup.js +35 -35
  54. package/dist/examples/kv-cache-custom-key.js +24 -24
  55. package/dist/examples/kv-cache-example.js +9 -9
  56. package/dist/examples/llamacpp-cache.js +18 -14
  57. package/dist/examples/llamacpp-dynamic-tools.js +15 -9
  58. package/dist/examples/llamacpp-filesystem.js +15 -9
  59. package/dist/examples/llamacpp-http.js +12 -10
  60. package/dist/examples/llamacpp-multi-gpu.js +4 -4
  61. package/dist/examples/llamacpp-multimodal.js +13 -9
  62. package/dist/examples/llamacpp-p2p.js +8 -4
  63. package/dist/examples/llamacpp-sharded.js +5 -5
  64. package/dist/examples/llamacpp-structured-output.js +15 -9
  65. package/dist/examples/logging-file-transport.js +3 -3
  66. package/dist/examples/logging-global.d.ts +2 -0
  67. package/dist/examples/logging-global.js +34 -0
  68. package/dist/examples/logging-streaming.js +7 -10
  69. package/dist/examples/mcp-websearch.js +24 -18
  70. package/dist/examples/multi-model-demo.js +17 -11
  71. package/dist/examples/ocr-fasttext.js +14 -16
  72. package/dist/examples/parallel-download.js +7 -7
  73. package/dist/examples/plugins.js +40 -28
  74. package/dist/examples/profiling/basic.js +16 -10
  75. package/dist/examples/profiling/per-call.js +17 -11
  76. package/dist/examples/quickstart.bare.d.ts +2 -0
  77. package/dist/examples/quickstart.bare.js +18 -0
  78. package/dist/examples/quickstart.js +10 -3
  79. package/dist/examples/rag/rag-chromadb.js +18 -14
  80. package/dist/examples/rag/rag-hyperdb/cancellation.js +17 -14
  81. package/dist/examples/rag/rag-hyperdb/ingest.js +14 -12
  82. package/dist/examples/rag/rag-hyperdb/pipeline.js +19 -17
  83. package/dist/examples/rag/rag-hyperdb/workspaces.js +31 -27
  84. package/dist/examples/rag/rag-lancedb.js +12 -8
  85. package/dist/examples/rag/rag-sqlite.js +11 -7
  86. package/dist/examples/registry-query.js +17 -17
  87. package/dist/examples/seed-p2p.js +10 -6
  88. package/dist/examples/suspend-resume.js +20 -16
  89. package/dist/examples/tools/llamacpp-native-tools.js +24 -18
  90. package/dist/examples/tools/llamacpp-tools-gemma4.js +14 -8
  91. package/dist/examples/tools/llamacpp-tools-harmony-multiturn.js +20 -14
  92. package/dist/examples/tools/llamacpp-tools-pythonic.js +14 -8
  93. package/dist/examples/tools/llamacpp-tools-qwen35.js +14 -8
  94. package/dist/examples/transcription/parakeet-ctc-filesystem.js +12 -9
  95. package/dist/examples/transcription/parakeet-microphone-record.js +15 -9
  96. package/dist/examples/transcription/parakeet-microphone-stream.js +15 -9
  97. package/dist/examples/transcription/parakeet-sortformer-streaming.js +12 -6
  98. package/dist/examples/transcription/parakeet-sortformer.js +3 -5
  99. package/dist/examples/transcription/parakeet-tdt-filesystem.js +13 -10
  100. package/dist/examples/transcription/whispercpp-filesystem-streaming.js +16 -17
  101. package/dist/examples/transcription/whispercpp-filesystem.js +14 -10
  102. package/dist/examples/transcription/whispercpp-microphone-conversation.js +10 -10
  103. package/dist/examples/transcription/whispercpp-microphone-record.js +6 -6
  104. package/dist/examples/transcription/whispercpp-prompt.js +14 -10
  105. package/dist/examples/translation/translation-bergamot-batch.js +11 -7
  106. package/dist/examples/translation/translation-bergamot-pivot.js +13 -9
  107. package/dist/examples/translation/translation-bergamot.js +8 -4
  108. package/dist/examples/translation/translation-indic.js +8 -4
  109. package/dist/examples/translation/translation-llm-afriquegemma.js +7 -3
  110. package/dist/examples/translation/translation-llm-context.js +8 -4
  111. package/dist/examples/translation/translation-llm.js +7 -3
  112. package/dist/examples/translation/translation-stream.js +4 -4
  113. package/dist/examples/tts/chatterbox.js +19 -11
  114. package/dist/examples/tts/llm-to-tts-streaming.js +27 -14
  115. package/dist/examples/tts/supertonic-multilingual.js +18 -14
  116. package/dist/examples/tts/supertonic.js +19 -15
  117. package/dist/examples/tts/utils.js +1 -1
  118. package/dist/examples/vla-pi05.js +18 -14
  119. package/dist/examples/vla-smolvla.js +18 -14
  120. package/dist/examples/voice-assistant/voice-assistant.js +12 -12
  121. package/dist/index.d.ts +3 -4
  122. package/dist/index.js +3 -4
  123. package/dist/logging/client-logger.js +2 -1
  124. package/dist/logging/index.d.ts +1 -1
  125. package/dist/logging/index.js +1 -1
  126. package/dist/logging/namespaces.d.ts +1 -0
  127. package/dist/logging/namespaces.js +2 -0
  128. package/dist/logging/server-logger.js +1 -4
  129. package/dist/logging/utils.js +6 -1
  130. package/dist/models/registry/index.d.ts +17 -0
  131. package/dist/models/registry/index.js +20 -1
  132. package/dist/models/registry/models.d.ts +1062 -38
  133. package/dist/models/registry/models.js +3546 -2490
  134. package/dist/pear/pre.js +2 -2
  135. package/dist/schemas/bci-config.d.ts +37 -0
  136. package/dist/schemas/bci-config.js +2 -0
  137. package/dist/schemas/bci.d.ts +2 -0
  138. package/dist/schemas/common.d.ts +171 -94
  139. package/dist/schemas/completion-stream.d.ts +6 -3
  140. package/dist/schemas/completion-stream.js +10 -2
  141. package/dist/schemas/download-asset.d.ts +5 -5
  142. package/dist/schemas/engine-addon-map.d.ts +1 -1
  143. package/dist/schemas/engine-addon-map.js +6 -3
  144. package/dist/schemas/error.js +6 -1
  145. package/dist/schemas/llamacpp-config.d.ts +27 -8
  146. package/dist/schemas/llamacpp-config.js +19 -2
  147. package/dist/schemas/load-model.d.ts +4170 -570
  148. package/dist/schemas/load-model.js +85 -26
  149. package/dist/schemas/logging-stream.js +7 -1
  150. package/dist/schemas/model-src-utils.d.ts +6 -6
  151. package/dist/schemas/model-types.d.ts +14 -15
  152. package/dist/schemas/model-types.js +10 -11
  153. package/dist/schemas/ocr.d.ts +10 -8
  154. package/dist/schemas/ocr.js +8 -6
  155. package/dist/schemas/plugin.d.ts +6 -5
  156. package/dist/schemas/plugin.js +4 -4
  157. package/dist/schemas/rag.d.ts +4 -4
  158. package/dist/schemas/registry.d.ts +8 -8
  159. package/dist/schemas/registry.js +1 -1
  160. package/dist/schemas/reload-config.d.ts +6 -6
  161. package/dist/schemas/sdcpp-config.d.ts +12 -12
  162. package/dist/schemas/sdk-config.d.ts +171 -117
  163. package/dist/schemas/sdk-config.js +5 -5
  164. package/dist/schemas/sdk-errors-client.d.ts +1 -0
  165. package/dist/schemas/sdk-errors-client.js +7 -2
  166. package/dist/schemas/text-to-speech.d.ts +157 -13
  167. package/dist/schemas/text-to-speech.js +70 -7
  168. package/dist/schemas/transcription-config.d.ts +5 -1
  169. package/dist/schemas/transcription-config.js +2 -0
  170. package/dist/schemas/transcription.d.ts +3 -0
  171. package/dist/schemas/transcription.js +2 -1
  172. package/dist/schemas/translate.d.ts +6 -6
  173. package/dist/schemas/translate.js +2 -3
  174. package/dist/schemas/translation-config.d.ts +20 -20
  175. package/dist/server/bare/hyperswarm.js +3 -3
  176. package/dist/server/bare/ops/transcribe.js +46 -15
  177. package/dist/server/bare/plugins/bci-whispercpp-transcription/args.d.ts +3 -0
  178. package/dist/server/bare/plugins/bci-whispercpp-transcription/args.js +13 -0
  179. package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.d.ts +41 -0
  180. package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.js +6 -11
  181. package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.d.ts +75 -0
  182. package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.js +11 -0
  183. package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.d.ts +16 -10
  184. package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.js +25 -18
  185. package/dist/server/bare/plugins/index.d.ts +1 -1
  186. package/dist/server/bare/plugins/index.js +1 -1
  187. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.d.ts +10 -0
  188. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.js +29 -0
  189. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +4 -22
  190. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +15 -7
  191. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +7 -7
  192. package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +2 -0
  193. package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +10 -10
  194. package/dist/server/bare/plugins/tts-ggml/plugin.d.ts +14 -8
  195. package/dist/server/bare/plugins/tts-ggml/plugin.js +12 -0
  196. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +3 -1
  197. package/dist/server/bare/registry/logging-stream-registry.d.ts +4 -2
  198. package/dist/server/bare/registry/logging-stream-registry.js +12 -7
  199. package/dist/server/bare/registry/model-config-utils.js +2 -2
  200. package/dist/server/bare/registry/registry-client.js +1 -1
  201. package/dist/server/bare/runtime-lifecycle.d.ts +9 -0
  202. package/dist/server/bare/runtime-lifecycle.js +24 -0
  203. package/dist/server/bare/types/addon-responses.d.ts +1 -0
  204. package/dist/server/env.js +7 -10
  205. package/dist/server/plugins/registry.js +2 -4
  206. package/dist/server/rpc/handlers/load-model/handler.js +2 -4
  207. package/dist/server/rpc/handlers/load-model/http.js +253 -51
  208. package/dist/server/rpc/handlers/logging-stream.js +4 -2
  209. package/dist/server/rpc/handlers/plugin-invoke.js +5 -16
  210. package/dist/server/utils/completion-normalizer.js +13 -4
  211. package/dist/server/utils/worker-lock.js +5 -5
  212. package/dist/server/worker-core.d.ts +1 -1
  213. package/dist/server/worker-core.js +28 -18
  214. package/dist/utils/errors-client.d.ts +3 -0
  215. package/dist/utils/errors-client.js +5 -0
  216. package/dist/utils/errors-server.d.ts +2 -0
  217. package/dist/utils/errors-server.js +3 -0
  218. package/dist/utils/zod-error.d.ts +3 -0
  219. package/dist/utils/zod-error.js +4 -0
  220. package/package.json +21 -24
  221. package/dist/polyfills/bare-globals.d.ts +0 -2
  222. package/dist/polyfills/bare-globals.js +0 -4
  223. package/dist/polyfills/bare-globals.noop.d.ts +0 -2
  224. package/dist/polyfills/bare-globals.noop.js +0 -1
  225. /package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/ops/ocr-stream.d.ts +0 -0
  226. /package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/ops/ocr-stream.js +0 -0
@@ -25,7 +25,7 @@ function terminateProvider(provider) {
25
25
  // The provider's Hyperswarm identity (and therefore its public key) is
26
26
  // generated at startup — it can't be known ahead of time. We parse it from
27
27
  // the provider's stdout where it prints:
28
- // "🆔 Provider Public Key: <hex>"
28
+ // "▸ Provider Public Key: <hex>"
29
29
  function waitForProviderPublicKey(provider) {
30
30
  return new Promise((resolve, reject) => {
31
31
  let output = "";
@@ -53,36 +53,40 @@ function waitForProviderPublicKey(provider) {
53
53
  });
54
54
  }
55
55
  async function runDelegatedCompletion(providerPublicKey) {
56
- console.log("→ Loading model via delegation...");
56
+ console.log("▸ Loading model via delegation...");
57
57
  const modelId = await loadModel({
58
58
  modelSrc: LLAMA_3_2_1B_INST_Q4_0,
59
59
  delegate: {
60
60
  providerPublicKey,
61
61
  timeout: 30_000,
62
62
  },
63
- onProgress: (progress) => {
64
- console.log(` Download: ${progress.percentage.toFixed(1)}%`);
63
+ onProgress: (p) => {
64
+ const mb = (n) => (n / 1e6).toFixed(1);
65
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
66
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
67
+ if (p.percentage >= 100)
68
+ process.stderr.write("\n");
65
69
  },
66
70
  });
67
- console.log(`✅ Model loaded: ${modelId}\n`);
68
- console.log("→ Running delegated completion (streamed)...");
71
+ console.log(`▸ Model loaded: ${modelId}`);
72
+ console.log("▸ Running delegated completion (streamed)...");
69
73
  const response = completion({
70
74
  modelId,
71
75
  history: [{ role: "user", content: "Say hello in exactly 5 words." }],
72
76
  stream: true,
73
77
  });
74
- process.stdout.write(" Response: ");
78
+ console.log("▸ Response:");
75
79
  for await (const token of response.tokenStream) {
76
80
  process.stdout.write(token);
77
81
  }
78
82
  const stats = await response.stats;
79
- console.log(`\n📊 Stats: ${JSON.stringify(stats)}`);
83
+ console.log(`\n▸ Stats: ${JSON.stringify(stats)}`);
80
84
  }
81
85
  const provider = spawnProviderProcess();
82
86
  try {
83
- console.log("🔧 Waiting for provider to start and announce its key...\n");
87
+ console.log("▸ Waiting for provider to start and announce its key...");
84
88
  const publicKey = await waitForProviderPublicKey(provider);
85
- console.log(`\n📡 Provider ready — key: ${publicKey}\n`);
89
+ console.log(`\n▸ Provider ready — key: ${publicKey}\n`);
86
90
  await runDelegatedCompletion(publicKey);
87
91
  void close();
88
92
  }
@@ -1,14 +1,14 @@
1
1
  import { close, completion, LLAMA_3_2_1B_INST_Q4_0, loadModel, profiler, } from "@qvac/sdk";
2
2
  const providerPublicKey = process.argv[2];
3
3
  if (!providerPublicKey) {
4
- console.error("❌ Usage: bun run consumer-profiled.ts <providerPublicKey>");
4
+ console.error("✖ Usage: bun run consumer-profiled.ts <providerPublicKey>");
5
5
  process.exit(1);
6
6
  }
7
7
  try {
8
8
  profiler.enable({ mode: "verbose", includeServerBreakdown: true });
9
- console.log("✓ Profiler enabled");
10
- console.log(`\n🔑 Provider: ${providerPublicKey}\n`);
11
- console.log("→ Loading model (delegated, unary)...");
9
+ console.log("▸ Profiler enabled");
10
+ console.log(`\n▸ Provider: ${providerPublicKey}\n`);
11
+ console.log("▸ Loading model (delegated, unary)...");
12
12
  const modelId = await loadModel({
13
13
  modelSrc: LLAMA_3_2_1B_INST_Q4_0,
14
14
  delegate: {
@@ -16,28 +16,28 @@ try {
16
16
  timeout: 60_000,
17
17
  },
18
18
  });
19
- console.log(`✓ Model loaded: ${modelId}\n`);
20
- console.log("→ Running completion (delegated, streamed)...");
19
+ console.log(`▸ Model loaded: ${modelId}`);
20
+ console.log("▸ Running completion (delegated, streamed)...");
21
21
  const response = completion({
22
22
  modelId,
23
23
  history: [{ role: "user", content: "Say hello in exactly 5 words." }],
24
24
  stream: true,
25
25
  });
26
- process.stdout.write(" Response: ");
26
+ console.log("▸ Response:");
27
27
  for await (const token of response.tokenStream) {
28
28
  process.stdout.write(token);
29
29
  }
30
30
  await response.stats;
31
- console.log("\n✓ Completion done\n");
32
- console.log("=== Profiler Summary ===");
31
+ console.log("\n▸ Completion done\n");
32
+ console.log("▸ Profiler Summary");
33
33
  console.log(profiler.exportSummary());
34
- console.log("=== Profiler Table ===");
34
+ console.log("▸ Profiler Table");
35
35
  console.log(profiler.exportTable());
36
36
  // Look for delegation-specific metrics
37
37
  const json = profiler.exportJSON();
38
38
  const delegationMetrics = Object.keys(json.aggregates).filter((k) => k.includes("delegation") || k.includes("delegated"));
39
39
  if (delegationMetrics.length > 0) {
40
- console.log("=== Delegation Metrics ===");
40
+ console.log("▸ Delegation Metrics");
41
41
  for (const key of delegationMetrics) {
42
42
  const agg = json.aggregates[key];
43
43
  if (agg) {
@@ -46,14 +46,14 @@ try {
46
46
  }
47
47
  }
48
48
  else {
49
- console.log("⚠️ No delegation-specific metrics found");
49
+ console.log("▸ No delegation-specific metrics found");
50
50
  console.log(" (delegation profiling may need to be triggered)");
51
51
  }
52
52
  profiler.disable();
53
53
  void close();
54
54
  }
55
55
  catch (error) {
56
- console.error("❌ Error:", error);
56
+ console.error("✖", error);
57
57
  profiler.disable();
58
58
  process.exit(1);
59
59
  }
@@ -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);