@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
@@ -24,9 +24,15 @@ try {
24
24
  modelSrc,
25
25
  modelType: "llamacpp-completion",
26
26
  modelConfig: { ctx_size: 4096, tools: true },
27
- onProgress: (progress) => console.log(`Loading: ${progress.percentage.toFixed(1)}%`),
27
+ onProgress: (p) => {
28
+ const mb = (n) => (n / 1e6).toFixed(1);
29
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
30
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
31
+ if (p.percentage >= 100)
32
+ process.stderr.write("\n");
33
+ },
28
34
  });
29
- console.log(`Model loaded: ${modelId}`);
35
+ console.log(`▸ Model loaded: ${modelId}`);
30
36
  const history = [
31
37
  {
32
38
  role: "system",
@@ -46,27 +52,27 @@ try {
46
52
  const toolsTask = (async () => {
47
53
  for await (const evt of result.toolCallStream) {
48
54
  if (evt.type === "toolCall") {
49
- console.log(`\n-> ${evt.call.name}(${JSON.stringify(evt.call.arguments)})`);
55
+ console.log(`\n▸ ${evt.call.name}(${JSON.stringify(evt.call.arguments)})`);
50
56
  }
51
57
  }
52
58
  })();
53
59
  await Promise.all([tokensTask, toolsTask]);
54
60
  const toolCalls = await result.toolCalls;
55
- console.log("\n\nFinal tool calls:");
61
+ console.log("\n\n▸ Final tool calls:");
56
62
  if (toolCalls.length > 0) {
57
63
  for (const call of toolCalls) {
58
- console.log(` - ${call.name}(${JSON.stringify(call.arguments)})`);
64
+ console.log(`▸ ${call.name}(${JSON.stringify(call.arguments)})`);
59
65
  const toolResult = mockExecute(call.name, call.arguments);
60
- console.log(` result: ${toolResult}`);
66
+ console.log(`▸ result: ${toolResult}`);
61
67
  }
62
68
  }
63
69
  else {
64
- console.log(" (none)");
70
+ console.log("▸ (none)");
65
71
  }
66
72
  await unloadModel({ modelId, clearStorage: false });
67
73
  }
68
74
  catch (error) {
69
- console.error("Error:", error);
75
+ console.error("✖", error);
70
76
  if (modelId)
71
77
  await unloadModel({ modelId, clearStorage: false }).catch(() => { });
72
78
  process.exit(1);
@@ -15,9 +15,15 @@ try {
15
15
  modelId = await loadModel({
16
16
  modelSrc: GPT_OSS_20B_INST_Q4_K_M,
17
17
  modelConfig: { ctx_size: 4096, tools: true },
18
- onProgress: (progress) => console.log(`Loading: ${progress.percentage.toFixed(1)}%`),
18
+ onProgress: (p) => {
19
+ const mb = (n) => (n / 1e6).toFixed(1);
20
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
21
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
22
+ if (p.percentage >= 100)
23
+ process.stderr.write("\n");
24
+ },
19
25
  });
20
- console.log(`✅ Model loaded: ${modelId}`);
26
+ console.log(`▸ Model loaded: ${modelId}`);
21
27
  const history = [
22
28
  {
23
29
  role: "system",
@@ -29,20 +35,20 @@ try {
29
35
  },
30
36
  ];
31
37
  for (let turn = 1; turn <= MAX_TURNS; turn++) {
32
- console.log(`\n========== TURN ${turn} ==========`);
38
+ console.log(`\n▸ ========== TURN ${turn} ==========`);
33
39
  const result = completion({ modelId, history, tools, stream: true });
34
40
  for await (const token of result.tokenStream) {
35
41
  process.stdout.write(token);
36
42
  }
37
43
  console.log();
38
44
  const final = await result.final;
39
- console.log(`\n--- TURN ${turn} SUMMARY ---`);
40
- console.log(`[sdk toolCalls] ${final.toolCalls.length}`);
45
+ console.log(`\n▸ --- TURN ${turn} SUMMARY ---`);
46
+ console.log(`▸ [sdk toolCalls] ${final.toolCalls.length}`);
41
47
  for (const call of final.toolCalls) {
42
- console.log(` → ${call.name}(${JSON.stringify(call.arguments)})`);
48
+ console.log(`▸ ${call.name}(${JSON.stringify(call.arguments)})`);
43
49
  }
44
50
  if (final.toolCalls.length === 0) {
45
- console.log(`\n🎉 Final response received — exiting loop.`);
51
+ console.log(`\n▸ Final response received — exiting loop.`);
46
52
  break;
47
53
  }
48
54
  // Raw, not result.text — GPT-OSS needs its own framed output in history
@@ -51,31 +57,31 @@ try {
51
57
  history.push({ role: "assistant", content: assistantContent });
52
58
  for (const call of final.toolCalls) {
53
59
  const toolResult = mockExecute(call.name, call.arguments);
54
- console.log(` ✓ mock-executed ${call.name}: ${toolResult}`);
60
+ console.log(`▸ mock-executed ${call.name}: ${toolResult}`);
55
61
  history.push({ role: "tool", content: toolResult });
56
62
  }
57
63
  if (turn === MAX_TURNS) {
58
- console.log(`\n⚠️ MAX_TURNS (${MAX_TURNS}) reached — stopping.`);
64
+ console.log(`\n▸ MAX_TURNS (${MAX_TURNS}) reached — stopping.`);
59
65
  }
60
66
  }
61
- console.log(`\n========== HISTORY ==========`);
67
+ console.log(`\n▸ ========== HISTORY ==========`);
62
68
  for (const msg of history) {
63
69
  const preview = msg.content.slice(0, 120).replace(/\n/g, "\\n");
64
- console.log(`[${msg.role}] ${preview}${msg.content.length > 120 ? "…" : ""}`);
70
+ console.log(`▸ [${msg.role}] ${preview}${msg.content.length > 120 ? "…" : ""}`);
65
71
  }
66
72
  }
67
73
  catch (error) {
68
- console.error("❌ Error:", error);
74
+ console.error("✖", error);
69
75
  process.exit(1);
70
76
  }
71
77
  finally {
72
78
  if (modelId) {
73
79
  try {
74
80
  await unloadModel({ modelId, clearStorage: false });
75
- console.log(`\n[unload] done`);
81
+ console.log(`\n▸ [unload] done`);
76
82
  }
77
83
  catch (unloadError) {
78
- console.error("[unload] failed:", unloadError);
84
+ console.error("✖ [unload] failed:", unloadError);
79
85
  }
80
86
  }
81
87
  }
@@ -6,9 +6,15 @@ try {
6
6
  modelSrc: LFM_TOOL_HF,
7
7
  modelType: "llamacpp-completion",
8
8
  modelConfig: { ctx_size: 4096, tools: true },
9
- onProgress: (progress) => console.log(`Loading: ${progress.percentage.toFixed(1)}%`),
9
+ onProgress: (p) => {
10
+ const mb = (n) => (n / 1e6).toFixed(1);
11
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
12
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
13
+ if (p.percentage >= 100)
14
+ process.stderr.write("\n");
15
+ },
10
16
  });
11
- console.log(`✅ Model loaded: ${modelId}`);
17
+ console.log(`▸ Model loaded: ${modelId}`);
12
18
  const history = [
13
19
  {
14
20
  role: "system",
@@ -19,7 +25,7 @@ try {
19
25
  content: "What's the weather in Tokyo and my horoscope for Aquarius?",
20
26
  },
21
27
  ];
22
- console.log("\n🤖 Streaming...\n");
28
+ console.log("\n▸ Streaming...\n");
23
29
  const result = completion({ modelId, history, stream: true, tools });
24
30
  const tokensTask = (async () => {
25
31
  for await (const token of result.tokenStream) {
@@ -28,23 +34,23 @@ try {
28
34
  })();
29
35
  const toolsTask = (async () => {
30
36
  for await (const evt of result.toolCallStream) {
31
- console.log(`\n→ ${evt.call.name}(${JSON.stringify(evt.call.arguments)})`);
37
+ console.log(`\n▸ ${evt.call.name}(${JSON.stringify(evt.call.arguments)})`);
32
38
  }
33
39
  })();
34
40
  await Promise.all([tokensTask, toolsTask]);
35
41
  const toolCalls = await result.toolCalls;
36
- console.log("\n\n📋 Final tool calls:");
42
+ console.log("\n\n▸ Final tool calls:");
37
43
  if (toolCalls.length > 0) {
38
44
  for (const call of toolCalls) {
39
- console.log(` - ${call.name}(${JSON.stringify(call.arguments)})`);
45
+ console.log(`▸ ${call.name}(${JSON.stringify(call.arguments)})`);
40
46
  }
41
47
  }
42
48
  else {
43
- console.log(" (none)");
49
+ console.log("▸ (none)");
44
50
  }
45
51
  await unloadModel({ modelId });
46
52
  }
47
53
  catch (error) {
48
- console.error("❌ Error:", error);
54
+ console.error("✖", error);
49
55
  process.exit(1);
50
56
  }
@@ -20,9 +20,15 @@ try {
20
20
  modelSrc,
21
21
  modelType: "llamacpp-completion",
22
22
  modelConfig: { ctx_size: 4096, tools: true },
23
- onProgress: (progress) => console.log(`Loading: ${progress.percentage.toFixed(1)}%`),
23
+ onProgress: (p) => {
24
+ const mb = (n) => (n / 1e6).toFixed(1);
25
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
26
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
27
+ if (p.percentage >= 100)
28
+ process.stderr.write("\n");
29
+ },
24
30
  });
25
- console.log(`Model loaded: ${modelId}`);
31
+ console.log(`▸ Model loaded: ${modelId}`);
26
32
  const history = [
27
33
  {
28
34
  role: "system",
@@ -42,27 +48,27 @@ try {
42
48
  const toolsTask = (async () => {
43
49
  for await (const evt of result.toolCallStream) {
44
50
  if (evt.type === "toolCall") {
45
- console.log(`\n-> ${evt.call.name}(${JSON.stringify(evt.call.arguments)})`);
51
+ console.log(`\n▸ ${evt.call.name}(${JSON.stringify(evt.call.arguments)})`);
46
52
  }
47
53
  }
48
54
  })();
49
55
  await Promise.all([tokensTask, toolsTask]);
50
56
  const toolCalls = await result.toolCalls;
51
- console.log("\n\nFinal tool calls:");
57
+ console.log("\n\n▸ Final tool calls:");
52
58
  if (toolCalls.length > 0) {
53
59
  for (const call of toolCalls) {
54
- console.log(` - ${call.name}(${JSON.stringify(call.arguments)})`);
60
+ console.log(`▸ ${call.name}(${JSON.stringify(call.arguments)})`);
55
61
  const toolResult = mockExecute(call.name, call.arguments);
56
- console.log(` result: ${toolResult}`);
62
+ console.log(`▸ result: ${toolResult}`);
57
63
  }
58
64
  }
59
65
  else {
60
- console.log(" (none)");
66
+ console.log("▸ (none)");
61
67
  }
62
68
  await unloadModel({ modelId, clearStorage: false });
63
69
  }
64
70
  catch (error) {
65
- console.error("Error:", error);
71
+ console.error("✖", error);
66
72
  if (modelId)
67
73
  await unloadModel({ modelId, clearStorage: false }).catch(() => { });
68
74
  process.exit(1);
@@ -21,24 +21,27 @@ if (!args[0]) {
21
21
  const audioFilePath = args[0];
22
22
  const parakeetModelSrc = args[1] ?? PARAKEET_CTC_0_6B_Q8_0;
23
23
  try {
24
- console.log("Loading Parakeet CTC model...");
24
+ console.log("▸ Loading Parakeet CTC model...");
25
25
  const modelId = await loadModel({
26
26
  modelSrc: parakeetModelSrc,
27
27
  modelType: "parakeet-transcription",
28
- onProgress: (progress) => {
29
- console.log(`Download progress: ${progress.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");
30
34
  },
31
35
  });
32
- console.log(`Parakeet CTC model loaded with ID: ${modelId}`);
33
- console.log("Transcribing audio...");
36
+ console.log(`▸ Parakeet CTC model loaded with ID: ${modelId}`);
37
+ console.log("▸ Transcribing audio...");
34
38
  const text = await transcribe({ modelId, audioChunk: audioFilePath });
35
- console.log("Transcription result:");
36
39
  console.log(text);
37
- console.log("Unloading model...");
40
+ console.log("▸ Unloading model...");
38
41
  await unloadModel({ modelId });
39
- console.log("Done");
42
+ console.log("▸ Done");
40
43
  }
41
44
  catch (error) {
42
- console.error("❌ Error:", error);
45
+ console.error("✖", error);
43
46
  process.exit(1);
44
47
  }
@@ -23,22 +23,28 @@ try {
23
23
  throw new Error("FFmpeg not found");
24
24
  }
25
25
  catch {
26
- console.error("FFmpeg is required. Install it and try again.");
26
+ console.error("✖ FFmpeg is required. Install it and try again.");
27
27
  process.exit(1);
28
28
  }
29
- console.log("Loading Parakeet model...");
29
+ console.log("▸ Loading Parakeet model...");
30
30
  const modelId = await loadModel({
31
31
  modelSrc: PARAKEET_TDT_0_6B_V3_Q8_0,
32
- onProgress: (p) => console.log(`Download: ${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.\n");
40
+ console.log("▸ Model loaded.");
35
41
  const ffmpeg = startMicrophone({
36
42
  sampleRate: SAMPLE_RATE,
37
43
  format: "s16le",
38
44
  });
39
45
  let buffer = Buffer.alloc(0);
40
46
  let processing = false;
41
- console.log("Listening... speak and pause to see transcriptions.\n");
47
+ console.log("▸ Listening... speak and pause to see transcriptions.");
42
48
  ffmpeg.stdout.on("data", (chunk) => {
43
49
  buffer = Buffer.concat([buffer, chunk]);
44
50
  if (buffer.length >= CHUNK_SIZE && !processing) {
@@ -49,11 +55,11 @@ ffmpeg.stdout.on("data", (chunk) => {
49
55
  try {
50
56
  const text = await transcribe({ modelId, audioChunk });
51
57
  if (text.trim() && !text.includes("[No speech detected]")) {
52
- console.log(`> ${text.trim()}`);
58
+ console.log(text.trim());
53
59
  }
54
60
  }
55
61
  catch (err) {
56
- console.error("Transcription error:", err instanceof Error ? err.message : err);
62
+ console.error("✖", err instanceof Error ? err.message : err);
57
63
  }
58
64
  finally {
59
65
  processing = false;
@@ -62,10 +68,10 @@ ffmpeg.stdout.on("data", (chunk) => {
62
68
  }
63
69
  });
64
70
  async function cleanup() {
65
- console.log("\n\nStopping...");
71
+ console.log("\n▸ Stopping...");
66
72
  ffmpeg.kill();
67
73
  await unloadModel({ modelId });
68
- console.log("Done.");
74
+ console.log("▸ Done.");
69
75
  }
70
76
  process.on("SIGINT", () => void cleanup());
71
77
  process.on("SIGTERM", () => void cleanup());
@@ -21,17 +21,17 @@ try {
21
21
  throw new Error("FFmpeg not found");
22
22
  }
23
23
  catch {
24
- console.error("Error: FFmpeg is required. Install it and try again.");
24
+ console.error("✖ FFmpeg is required. Install it and try again.");
25
25
  process.exit(1);
26
26
  }
27
27
  let modelId = null;
28
28
  let ffmpeg = null;
29
29
  async function cleanup() {
30
- console.log("\n\nStopping...");
30
+ console.log("\n▸ Stopping...");
31
31
  ffmpeg?.kill();
32
32
  if (modelId)
33
33
  await unloadModel({ modelId });
34
- console.log("Done.");
34
+ console.log("▸ Done.");
35
35
  }
36
36
  process.on("SIGINT", () => {
37
37
  void cleanup().finally(() => process.exit(0));
@@ -40,12 +40,18 @@ process.on("SIGTERM", () => {
40
40
  void cleanup().finally(() => process.exit(0));
41
41
  });
42
42
  try {
43
- console.log("Loading Parakeet (EOU) streaming model...");
43
+ console.log("▸ Loading Parakeet (EOU) streaming model...");
44
44
  modelId = await loadModel({
45
45
  modelSrc: PARAKEET_EOU_120M_V1_Q8_0,
46
- onProgress: (p) => console.log(`Download: ${p.percentage.toFixed(1)}%`),
46
+ onProgress: (p) => {
47
+ const mb = (n) => (n / 1e6).toFixed(1);
48
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
49
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
50
+ if (p.percentage >= 100)
51
+ process.stderr.write("\n");
52
+ },
47
53
  });
48
- console.log("Model loaded.\n");
54
+ console.log("▸ Model loaded.");
49
55
  ffmpeg = startMicrophone({ sampleRate: SAMPLE_RATE, format: "s16le" });
50
56
  const session = await transcribeStream({
51
57
  modelId,
@@ -55,7 +61,7 @@ try {
55
61
  },
56
62
  });
57
63
  ffmpeg.stdout.on("data", (chunk) => session.write(chunk));
58
- console.log("Listening... speak and pause to see transcripts. End-of-turn boundaries fire when the EOU model emits an <EOU> token.\n");
64
+ console.log("▸ Listening... speak and pause to see transcripts. End-of-turn boundaries fire when the EOU model emits an <EOU> token.");
59
65
  for await (const event of session) {
60
66
  switch (event.type) {
61
67
  case "text":
@@ -64,7 +70,7 @@ try {
64
70
  }
65
71
  break;
66
72
  case "endOfTurn":
67
- console.log("\n[endOfTurn] turn boundary detected\n");
73
+ console.log("\n▸ [endOfTurn] turn boundary detected");
68
74
  break;
69
75
  }
70
76
  }
@@ -72,7 +78,7 @@ try {
72
78
  process.exit(0);
73
79
  }
74
80
  catch (error) {
75
- console.error("Error:", error);
81
+ console.error("✖", error);
76
82
  await cleanup();
77
83
  process.exit(1);
78
84
  }
@@ -70,20 +70,26 @@ function readS16leFromWav(wavPath) {
70
70
  const loadOptions = {
71
71
  modelType: "parakeet-transcription",
72
72
  modelConfig: { ...SORTFORMER_V21_AOSC_LOAD_CONFIG },
73
- onProgress: (p) => console.log(`Download: ${p.percentage.toFixed(1)}%`),
73
+ onProgress: (p) => {
74
+ const mb = (n) => (n / 1e6).toFixed(1);
75
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
76
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
77
+ if (p.percentage >= 100)
78
+ process.stderr.write("\n");
79
+ },
74
80
  ...(sortformerOverride
75
81
  ? { modelSrc: sortformerOverride }
76
82
  : { modelSrc: PARAKEET_SORTFORMER_4SPK_V2_1_Q8_0 }),
77
83
  };
78
84
  try {
79
- console.log("Loading Sortformer v2.1 with streaming + AOSC (load-time config)...");
85
+ console.log("▸ Loading Sortformer v2.1 with streaming + AOSC (load-time config)...");
80
86
  modelId = await loadModel(loadOptions);
81
- console.log(`Model loaded: ${modelId}\n`);
87
+ console.log(`▸ Model loaded: ${modelId}`);
82
88
  const session = await transcribeStream({
83
89
  modelId,
84
90
  parakeetStreamingConfig: { chunkMs: STREAM_CHUNK_MS },
85
91
  });
86
- console.log(`Streaming ${audioFilePath} in ${STREAM_CHUNK_MS}ms chunks (wall-clock paced)...\n`);
92
+ console.log(`▸ Streaming ${audioFilePath} in ${STREAM_CHUNK_MS}ms chunks (wall-clock paced)...`);
87
93
  const pcm = await readS16leFromWav(audioFilePath);
88
94
  const trailingSilenceMs = 1500;
89
95
  const trailingBytes = new Uint8Array(Math.floor((trailingSilenceMs / 1000) * SAMPLE_RATE) * BYTES_PER_S16_SAMPLE);
@@ -109,13 +115,13 @@ try {
109
115
  console.log(event.text.trim());
110
116
  }
111
117
  }
112
- console.log("\n=== Streaming diarization transcript ===");
118
+ console.log("\n▸ Streaming diarization transcript");
113
119
  console.log(lines.join("\n") || "(no speaker lines emitted)");
114
120
  await cleanup();
115
121
  process.exit(0);
116
122
  }
117
123
  catch (error) {
118
- console.error("❌ Error:", error);
124
+ console.error("✖", error);
119
125
  await cleanup();
120
126
  process.exit(1);
121
127
  }
@@ -59,17 +59,15 @@ try {
59
59
  await unloadModel({ modelId: tdtModelId });
60
60
  // ── Step 3: Merge consecutive same-speaker segments and print ──
61
61
  const merged = mergeSpeakers(results);
62
- console.log("\n=== DIARIZED TRANSCRIPTION ===");
63
- console.log("=".repeat(60));
62
+ console.log("\n▸ Diarized transcription");
64
63
  for (const entry of merged) {
65
64
  console.log(`Speaker ${entry.speaker} (${entry.start.toFixed(2)}s - ${entry.end.toFixed(2)}s):`);
66
65
  console.log(` ${entry.text}\n`);
67
66
  }
68
- console.log("=".repeat(60));
69
- console.log("\nDone!");
67
+ console.log("▸ Done");
70
68
  }
71
69
  catch (error) {
72
- console.error("❌ Error:", error);
70
+ console.error("✖", error);
73
71
  process.exit(1);
74
72
  }
75
73
  // ── Helpers ──
@@ -21,25 +21,28 @@ if (!args[0]) {
21
21
  const audioFilePath = args[0];
22
22
  const parakeetModelSrc = args[1] ?? PARAKEET_TDT_0_6B_V3_Q8_0;
23
23
  try {
24
- console.log("Starting Parakeet transcription example...");
25
- console.log("Loading Parakeet model...");
24
+ console.log("▸ Starting Parakeet transcription example...");
25
+ console.log("▸ Loading Parakeet model...");
26
26
  const modelId = await loadModel({
27
27
  modelSrc: parakeetModelSrc,
28
28
  modelType: "parakeet-transcription",
29
- onProgress: (progress) => {
30
- console.log(`Download progress: ${progress.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");
31
35
  },
32
36
  });
33
- console.log(`Parakeet model loaded with ID: ${modelId}`);
34
- console.log("Transcribing audio...");
37
+ console.log(`▸ Parakeet model loaded with ID: ${modelId}`);
38
+ console.log("▸ Transcribing audio...");
35
39
  const text = await transcribe({ modelId, audioChunk: audioFilePath });
36
- console.log("Transcription result:");
37
40
  console.log(text);
38
- console.log("Unloading Parakeet model...");
41
+ console.log("▸ Unloading Parakeet model...");
39
42
  await unloadModel({ modelId });
40
- console.log("Parakeet model unloaded successfully");
43
+ console.log("▸ Parakeet model unloaded successfully");
41
44
  }
42
45
  catch (error) {
43
- console.error("❌ Error:", error);
46
+ console.error("✖", error);
44
47
  process.exit(1);
45
48
  }
@@ -23,10 +23,10 @@ const SAMPLE_RATE = 16000;
23
23
  const BYTES_PER_SAMPLE = 4; // f32le
24
24
  const CHUNK_SIZE = Math.floor(0.1 * SAMPLE_RATE) * BYTES_PER_SAMPLE; // 100ms chunks
25
25
  try {
26
- console.log("=== transcribeStream file test ===");
27
- console.log(`File: ${SAMPLE_FILE}`);
28
- console.log(`Chunk size: ${CHUNK_SIZE} bytes (100ms)\n`);
29
- console.log("Loading model...");
26
+ console.log("▸ transcribeStream file test");
27
+ console.log(`▸ File: ${SAMPLE_FILE}`);
28
+ console.log(`▸ Chunk size: ${CHUNK_SIZE} bytes (100ms)`);
29
+ console.log("▸ Loading model...");
30
30
  const modelId = await loadModel({
31
31
  modelSrc: WHISPER_TINY,
32
32
  modelConfig: {
@@ -48,10 +48,10 @@ try {
48
48
  },
49
49
  },
50
50
  });
51
- console.log(`Model loaded: ${modelId}\n`);
52
- console.log("Opening live session...");
51
+ console.log(`▸ Model loaded: ${modelId}`);
52
+ console.log("▸ Opening live session...");
53
53
  const session = await transcribeStream({ modelId, metadata: true });
54
- console.log("Session open. Streaming audio...\n");
54
+ console.log("▸ Session open. Streaming audio...");
55
55
  const ffmpeg = spawn("ffmpeg", [
56
56
  "-i",
57
57
  SAMPLE_FILE,
@@ -75,8 +75,8 @@ try {
75
75
  });
76
76
  ffmpeg.on("close", () => {
77
77
  const durationSec = totalBytes / (SAMPLE_RATE * BYTES_PER_SAMPLE);
78
- console.log(`Audio streamed: ${totalBytes} bytes (~${durationSec.toFixed(1)}s)`);
79
- console.log("Waiting for transcription...\n");
78
+ console.log(`▸ Audio streamed: ${totalBytes} bytes (~${durationSec.toFixed(1)}s)`);
79
+ console.log("▸ Waiting for transcription...");
80
80
  session.end();
81
81
  });
82
82
  const segments = [];
@@ -84,22 +84,21 @@ try {
84
84
  segments.push(segment);
85
85
  const start = (segment.startMs / 1000).toFixed(2);
86
86
  const end = (segment.endMs / 1000).toFixed(2);
87
- console.log(` [${segments.length}] [${start}s → ${end}s] (id=${segment.id}, append=${segment.append}) ${segment.text.trim()}`);
87
+ console.log(`▸ [${segments.length}] [${start}s → ${end}s] (id=${segment.id}, append=${segment.append}) ${segment.text.trim()}`);
88
88
  }
89
- console.log("\n=== Results ===");
90
- console.log(`Segments: ${segments.length}`);
89
+ console.log(`\n▸ Segments: ${segments.length}`);
91
90
  if (segments.length > 0) {
92
- console.log(`Transcript: ${segments.map((s) => s.text.trim()).join(" ")}`);
91
+ console.log(segments.map((s) => s.text.trim()).join(" "));
93
92
  }
94
93
  else {
95
- console.log("WARNING: No transcription segments received!");
94
+ console.log("▸ No transcription segments received!");
96
95
  }
97
- console.log("\nUnloading model...");
96
+ console.log("▸ Unloading model...");
98
97
  await unloadModel({ modelId });
99
- console.log("Done.");
98
+ console.log("▸ Done.");
100
99
  process.exit(0);
101
100
  }
102
101
  catch (error) {
103
- console.error("Error:", error);
102
+ console.error("✖", error);
104
103
  process.exit(1);
105
104
  }
@@ -7,9 +7,9 @@ if (!args[0]) {
7
7
  }
8
8
  const audioFilePath = args[0];
9
9
  try {
10
- console.log("🎤 Starting Whisper transcription example...");
10
+ console.log("▸ Starting Whisper transcription example...");
11
11
  // Load the Whisper model
12
- console.log("📥 Loading Whisper model...");
12
+ console.log("▸ Loading Whisper model...");
13
13
  const modelId = await loadModel({
14
14
  modelSrc: WHISPER_TINY,
15
15
  modelConfig: {
@@ -47,19 +47,23 @@ try {
47
47
  gpu_device: 0,
48
48
  },
49
49
  },
50
- onProgress: (progress) => {
51
- console.log(progress);
50
+ onProgress: (p) => {
51
+ const mb = (n) => (n / 1e6).toFixed(1);
52
+ const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
53
+ process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
54
+ if (p.percentage >= 100)
55
+ process.stderr.write("\n");
52
56
  },
53
57
  });
54
- console.log(`✅ Whisper model loaded with ID: ${modelId}`);
58
+ console.log(`▸ Whisper model loaded with ID: ${modelId}`);
55
59
  // Perform transcription with per-segment metadata
56
- console.log("🎧 Transcribing audio...");
60
+ console.log("▸ Transcribing audio...");
57
61
  const segments = await transcribe({
58
62
  modelId,
59
63
  audioChunk: audioFilePath,
60
64
  metadata: true,
61
65
  });
62
- console.log("📝 Transcription result:");
66
+ console.log("▸ Transcription result:");
63
67
  for (const segment of segments) {
64
68
  const start = (segment.startMs / 1000).toFixed(2);
65
69
  const end = (segment.endMs / 1000).toFixed(2);
@@ -70,11 +74,11 @@ try {
70
74
  .join("")
71
75
  .trim()}`);
72
76
  // Unload the model when done
73
- console.log("🧹 Unloading Whisper model...");
77
+ console.log("▸ Unloading Whisper model...");
74
78
  await unloadModel({ modelId });
75
- console.log("✅ Whisper model unloaded successfully");
79
+ console.log("▸ Whisper model unloaded successfully");
76
80
  }
77
81
  catch (error) {
78
- console.error("❌ Error:", error);
82
+ console.error("✖", error);
79
83
  process.exit(1);
80
84
  }