@qvac/sdk 0.8.3 → 0.9.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 (216) hide show
  1. package/NOTICE +267 -63
  2. package/dist/client/api/diffusion.d.ts +32 -0
  3. package/dist/client/api/diffusion.js +103 -0
  4. package/dist/client/api/embed.d.ts +9 -3
  5. package/dist/client/api/embed.js +4 -1
  6. package/dist/client/api/finetune.d.ts +69 -0
  7. package/dist/client/api/finetune.js +139 -0
  8. package/dist/client/api/get-model-info.d.ts +1 -1
  9. package/dist/client/api/index.d.ts +4 -0
  10. package/dist/client/api/index.js +4 -0
  11. package/dist/client/api/rag.d.ts +1 -1
  12. package/dist/client/api/rag.js +1 -1
  13. package/dist/client/api/resume.d.ts +14 -0
  14. package/dist/client/api/resume.js +20 -0
  15. package/dist/client/api/suspend.d.ts +13 -0
  16. package/dist/client/api/suspend.js +19 -0
  17. package/dist/client/api/transcribe.d.ts +25 -17
  18. package/dist/client/api/transcribe.js +115 -35
  19. package/dist/client/rpc/bare-client.d.ts +5 -1
  20. package/dist/client/rpc/bare-client.js +70 -57
  21. package/dist/client/rpc/expo-rpc-client.d.ts +4 -0
  22. package/dist/client/rpc/expo-rpc-client.js +8 -0
  23. package/dist/client/rpc/node-rpc-client.d.ts +4 -0
  24. package/dist/client/rpc/node-rpc-client.js +8 -0
  25. package/dist/client/rpc/rpc-client.d.ts +13 -0
  26. package/dist/client/rpc/rpc-client.js +131 -1
  27. package/dist/examples/delegated-inference/composite.d.ts +2 -0
  28. package/dist/examples/delegated-inference/composite.js +99 -0
  29. package/dist/examples/diffusion-flux2-klein.d.ts +2 -0
  30. package/dist/examples/diffusion-flux2-klein.js +46 -0
  31. package/dist/examples/diffusion-simple.d.ts +2 -0
  32. package/dist/examples/diffusion-simple.js +17 -0
  33. package/dist/examples/diffusion-txt2img.d.ts +2 -0
  34. package/dist/examples/diffusion-txt2img.js +40 -0
  35. package/dist/examples/embed-p2p.js +2 -2
  36. package/dist/examples/finetune/llamacpp-finetune.d.ts +2 -0
  37. package/dist/examples/finetune/llamacpp-finetune.js +78 -0
  38. package/dist/examples/logging-streaming.js +1 -1
  39. package/dist/examples/mcp-websearch.js +2 -0
  40. package/dist/examples/ocr-fasttext.js +11 -0
  41. package/dist/examples/profiling/per-call.js +3 -3
  42. package/dist/examples/rag/rag-chromadb.js +2 -2
  43. package/dist/examples/rag/rag-hyperdb/pipeline.js +1 -1
  44. package/dist/examples/rag/rag-lancedb.js +2 -2
  45. package/dist/examples/rag/rag-sqlite.js +2 -2
  46. package/dist/examples/suspend-resume.d.ts +2 -0
  47. package/dist/examples/suspend-resume.js +52 -0
  48. package/dist/examples/transcription/parakeet-ctc-filesystem.js +3 -5
  49. package/dist/examples/transcription/parakeet-microphone-record.js +42 -33
  50. package/dist/examples/transcription/parakeet-sortformer.js +13 -3
  51. package/dist/examples/transcription/parakeet-tdt-filesystem.js +5 -7
  52. package/dist/examples/transcription/whispercpp-filesystem-streaming.d.ts +2 -0
  53. package/dist/examples/transcription/whispercpp-filesystem-streaming.js +99 -0
  54. package/dist/examples/transcription/whispercpp-microphone-record.js +78 -299
  55. package/dist/examples/transcription/whispercpp-prompt.js +11 -0
  56. package/dist/examples/translation/translation-llm.js +2 -2
  57. package/dist/examples/tts/supertonic-multilingual.d.ts +2 -0
  58. package/dist/examples/tts/supertonic-multilingual.js +56 -0
  59. package/dist/examples/tts/supertonic.js +12 -7
  60. package/dist/index.d.ts +3 -2
  61. package/dist/index.js +3 -2
  62. package/dist/logging/utils.js +1 -1
  63. package/dist/models/registry/models.d.ts +15176 -4264
  64. package/dist/models/registry/models.js +18657 -7404
  65. package/dist/models/update-models/codegen.js +2 -2
  66. package/dist/models/update-models/naming.js +26 -0
  67. package/dist/pear/pre.js +2 -0
  68. package/dist/polyfills/bare-globals.d.ts +2 -0
  69. package/dist/polyfills/bare-globals.js +4 -0
  70. package/dist/polyfills/bare-globals.noop.d.ts +2 -0
  71. package/dist/polyfills/bare-globals.noop.js +1 -0
  72. package/dist/profiling/exporters.js +16 -11
  73. package/dist/profiling/model-execution.d.ts +16 -0
  74. package/dist/profiling/model-execution.js +33 -0
  75. package/dist/schemas/common.d.ts +967 -198
  76. package/dist/schemas/common.js +16 -1
  77. package/dist/schemas/completion-stream.d.ts +14 -6
  78. package/dist/schemas/completion-stream.js +4 -3
  79. package/dist/schemas/download-asset.d.ts +7 -3
  80. package/dist/schemas/embed.d.ts +19 -0
  81. package/dist/schemas/embed.js +7 -0
  82. package/dist/schemas/engine-addon-map.js +4 -1
  83. package/dist/schemas/finetune.d.ts +620 -0
  84. package/dist/schemas/finetune.js +161 -0
  85. package/dist/schemas/get-model-info.d.ts +2 -0
  86. package/dist/schemas/get-model-info.js +1 -0
  87. package/dist/schemas/index.d.ts +5 -1
  88. package/dist/schemas/index.js +5 -1
  89. package/dist/schemas/llamacpp-config.d.ts +26 -6
  90. package/dist/schemas/llamacpp-config.js +12 -0
  91. package/dist/schemas/load-model.d.ts +4005 -1400
  92. package/dist/schemas/load-model.js +34 -1
  93. package/dist/schemas/model-src-utils.d.ts +10 -2
  94. package/dist/schemas/model-types.d.ts +19 -1
  95. package/dist/schemas/model-types.js +11 -0
  96. package/dist/schemas/ocr.d.ts +2 -0
  97. package/dist/schemas/plugin.d.ts +24 -3
  98. package/dist/schemas/plugin.js +14 -0
  99. package/dist/schemas/profiling.d.ts +4 -0
  100. package/dist/schemas/profiling.js +4 -0
  101. package/dist/schemas/registry.d.ts +18 -0
  102. package/dist/schemas/registry.js +2 -0
  103. package/dist/schemas/reload-config.d.ts +9 -1
  104. package/dist/schemas/resume.d.ts +10 -0
  105. package/dist/schemas/resume.js +7 -0
  106. package/dist/schemas/sdcpp-config.d.ts +327 -0
  107. package/dist/schemas/sdcpp-config.js +102 -0
  108. package/dist/schemas/sdk-config.d.ts +1225 -235
  109. package/dist/schemas/sdk-config.js +4 -0
  110. package/dist/schemas/sdk-errors-server.d.ts +2 -0
  111. package/dist/schemas/sdk-errors-server.js +12 -0
  112. package/dist/schemas/suspend.d.ts +10 -0
  113. package/dist/schemas/suspend.js +7 -0
  114. package/dist/schemas/text-to-speech.d.ts +187 -10
  115. package/dist/schemas/text-to-speech.js +12 -4
  116. package/dist/schemas/transcription-config.d.ts +16 -56
  117. package/dist/schemas/transcription-config.js +0 -2
  118. package/dist/schemas/transcription.d.ts +66 -6
  119. package/dist/schemas/transcription.js +29 -7
  120. package/dist/schemas/translate.d.ts +14 -4
  121. package/dist/schemas/translate.js +10 -2
  122. package/dist/schemas/translation-config.d.ts +30 -10
  123. package/dist/server/bare/delegate-rpc-client.js +3 -3
  124. package/dist/server/bare/hyperswarm.js +15 -3
  125. package/dist/server/bare/ops/embed.d.ts +8 -4
  126. package/dist/server/bare/ops/embed.js +15 -4
  127. package/dist/server/bare/ops/transcribe.d.ts +6 -2
  128. package/dist/server/bare/ops/transcribe.js +53 -1
  129. package/dist/server/bare/ops/translate.d.ts +4 -1
  130. package/dist/server/bare/ops/translate.js +28 -65
  131. package/dist/server/bare/ops/unload-model.js +2 -0
  132. package/dist/server/bare/plugins/index.d.ts +1 -0
  133. package/dist/server/bare/plugins/index.js +1 -0
  134. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.d.ts +3 -1
  135. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +45 -9
  136. package/dist/server/bare/plugins/llamacpp-completion/ops/finetune.d.ts +11 -0
  137. package/dist/server/bare/plugins/llamacpp-completion/ops/finetune.js +112 -0
  138. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +175 -5
  139. package/dist/server/bare/plugins/llamacpp-completion/plugin.js +45 -35
  140. package/dist/server/bare/plugins/llamacpp-embedding/plugin.d.ts +11 -1
  141. package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +9 -4
  142. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +17 -2
  143. package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +16 -15
  144. package/dist/server/bare/plugins/onnx-ocr/ops/ocr-stream.d.ts +5 -7
  145. package/dist/server/bare/plugins/onnx-ocr/ops/ocr-stream.js +11 -3
  146. package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +2 -0
  147. package/dist/server/bare/plugins/onnx-ocr/plugin.js +24 -19
  148. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech.d.ts +7 -2
  149. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech.js +22 -97
  150. package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +98 -9
  151. package/dist/server/bare/plugins/onnx-tts/plugin.js +85 -46
  152. package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +30 -60
  153. package/dist/server/bare/plugins/parakeet-transcription/plugin.js +49 -37
  154. package/dist/server/bare/plugins/sdcpp-generation/ops/diffusion.d.ts +3 -0
  155. package/dist/server/bare/plugins/sdcpp-generation/ops/diffusion.js +51 -0
  156. package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +278 -0
  157. package/dist/server/bare/plugins/sdcpp-generation/plugin.js +70 -0
  158. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +38 -2
  159. package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +43 -22
  160. package/dist/server/bare/rag-hyperdb/handlers/ingest.js +2 -1
  161. package/dist/server/bare/rag-hyperdb/handlers/search.js +2 -1
  162. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +7 -0
  163. package/dist/server/bare/registry/model-config-utils.js +3 -0
  164. package/dist/server/bare/registry/model-registry.d.ts +2 -2
  165. package/dist/server/bare/registry/model-registry.js +1 -1
  166. package/dist/server/bare/registry/registry-client.js +21 -0
  167. package/dist/server/bare/runtime-lifecycle.d.ts +28 -0
  168. package/dist/server/bare/runtime-lifecycle.js +132 -0
  169. package/dist/server/bare/types/addon-responses.d.ts +62 -0
  170. package/dist/server/bare/types/addon-responses.js +1 -0
  171. package/dist/server/env.js +3 -1
  172. package/dist/server/rpc/delegate-transport.js +1 -1
  173. package/dist/server/rpc/handle-request.js +50 -4
  174. package/dist/server/rpc/handler-registry.js +20 -1
  175. package/dist/server/rpc/handler-utils.d.ts +5 -3
  176. package/dist/server/rpc/handler-utils.js +52 -50
  177. package/dist/server/rpc/handlers/delete-cache.js +3 -0
  178. package/dist/server/rpc/handlers/diffusion-stream.d.ts +3 -0
  179. package/dist/server/rpc/handlers/diffusion-stream.js +4 -0
  180. package/dist/server/rpc/handlers/finetune.d.ts +3 -0
  181. package/dist/server/rpc/handlers/finetune.js +16 -0
  182. package/dist/server/rpc/handlers/index.d.ts +10 -0
  183. package/dist/server/rpc/handlers/index.js +10 -0
  184. package/dist/server/rpc/handlers/load-model/hyperdrive.js +24 -9
  185. package/dist/server/rpc/handlers/load-model/registry.d.ts +11 -0
  186. package/dist/server/rpc/handlers/load-model/registry.js +31 -4
  187. package/dist/server/rpc/handlers/plugin-dispatch.d.ts +1 -13
  188. package/dist/server/rpc/handlers/plugin-dispatch.js +21 -21
  189. package/dist/server/rpc/handlers/resume.d.ts +3 -0
  190. package/dist/server/rpc/handlers/resume.js +11 -0
  191. package/dist/server/rpc/handlers/suspend.d.ts +3 -0
  192. package/dist/server/rpc/handlers/suspend.js +11 -0
  193. package/dist/server/rpc/handlers/transcribe-stream.d.ts +1 -1
  194. package/dist/server/rpc/handlers/transcribe-stream.js +2 -2
  195. package/dist/server/rpc/handlers/transcribe.d.ts +3 -0
  196. package/dist/server/rpc/handlers/transcribe.js +4 -0
  197. package/dist/server/rpc/profiling/operation-metrics.js +107 -16
  198. package/dist/server/rpc/profiling/operation-wrappers.d.ts +1 -1
  199. package/dist/server/rpc/profiling/operation-wrappers.js +51 -19
  200. package/dist/server/rpc/progress-throttle.d.ts +8 -0
  201. package/dist/server/rpc/progress-throttle.js +47 -0
  202. package/dist/server/rpc/rpc-utils.d.ts +5 -0
  203. package/dist/server/rpc/rpc-utils.js +11 -0
  204. package/dist/server/utils/path-security.js +1 -1
  205. package/dist/server/utils/tool-integration.js +10 -0
  206. package/dist/server/utils/tool-parser.js +9 -5
  207. package/dist/server/worker-core.d.ts +2 -0
  208. package/dist/server/worker-core.js +26 -23
  209. package/dist/server/worker.js +2 -1
  210. package/dist/utils/encoding.d.ts +9 -0
  211. package/dist/utils/encoding.js +14 -0
  212. package/dist/utils/errors-server.d.ts +6 -0
  213. package/dist/utils/errors-server.js +11 -0
  214. package/package.json +36 -25
  215. package/dist/server/rpc/delegate-utils.d.ts +0 -2
  216. package/dist/server/rpc/delegate-utils.js +0 -5
@@ -0,0 +1,46 @@
1
+ import { loadModel, unloadModel, diffusion, FLUX_2_KLEIN_4B_Q4_0, FLUX_2_KLEIN_4B_VAE, QWEN3_4B_Q4_K_M } from "@qvac/sdk";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ // FLUX.2 [klein] uses a split-layout: separate diffusion model + LLM text encoder + VAE
5
+ const diffusionModelSrc = process.argv[2] || FLUX_2_KLEIN_4B_Q4_0;
6
+ const llmModelSrc = process.argv[3] || QWEN3_4B_Q4_K_M;
7
+ const vaeModelSrc = process.argv[4] || FLUX_2_KLEIN_4B_VAE;
8
+ const prompt = process.argv[5] || "a futuristic city at sunset, photorealistic";
9
+ const outputDir = process.argv[6] || ".";
10
+ console.log("Loading FLUX.2 [klein] split-layout model...");
11
+ const modelId = await loadModel({
12
+ modelSrc: diffusionModelSrc,
13
+ modelType: "diffusion",
14
+ modelConfig: {
15
+ device: "gpu",
16
+ threads: 4,
17
+ llmModelSrc,
18
+ vaeModelSrc,
19
+ },
20
+ onProgress: (p) => console.log(`Loading: ${p.percentage.toFixed(1)}%`),
21
+ });
22
+ console.log(`Model loaded: ${modelId}`);
23
+ console.log(`\nGenerating: "${prompt}"`);
24
+ const { progressStream, outputs, stats } = diffusion({
25
+ modelId,
26
+ prompt,
27
+ width: 512,
28
+ height: 512,
29
+ steps: 20,
30
+ guidance: 3.5,
31
+ seed: -1,
32
+ });
33
+ for await (const { step, totalSteps } of progressStream) {
34
+ process.stdout.write(`\rStep ${step}/${totalSteps}`);
35
+ }
36
+ console.log();
37
+ const buffers = await outputs;
38
+ for (let i = 0; i < buffers.length; i++) {
39
+ const outputPath = path.join(outputDir, `flux2_${i}.png`);
40
+ fs.writeFileSync(outputPath, buffers[i]);
41
+ console.log(`Saved: ${outputPath}`);
42
+ }
43
+ console.log("\nStats:", await stats);
44
+ await unloadModel({ modelId, clearStorage: false });
45
+ console.log("Done.");
46
+ process.exit(0);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=diffusion-simple.d.ts.map
@@ -0,0 +1,17 @@
1
+ import { loadModel, unloadModel, diffusion, SD_V2_1_1B_Q8_0 } from "@qvac/sdk";
2
+ import fs from "fs";
3
+ // Minimal diffusion example — single GGUF model, no companion files needed.
4
+ // Works with SD 1.x / 2.x all-in-one models.
5
+ const modelSrc = process.argv[2] || SD_V2_1_1B_Q8_0;
6
+ const prompt = process.argv[3] || "a photo of a cat sitting on a windowsill";
7
+ const modelId = await loadModel({
8
+ modelSrc,
9
+ modelType: "diffusion",
10
+ modelConfig: { prediction: "v" },
11
+ });
12
+ const { outputs } = diffusion({ modelId, prompt });
13
+ const buffers = await outputs;
14
+ fs.writeFileSync("output.png", buffers[0]);
15
+ console.log("Saved: output.png");
16
+ await unloadModel({ modelId, clearStorage: false });
17
+ process.exit(0);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=diffusion-txt2img.d.ts.map
@@ -0,0 +1,40 @@
1
+ import { loadModel, unloadModel, diffusion, FLUX_2_KLEIN_4B_Q4_0, FLUX_2_KLEIN_4B_VAE, QWEN3_4B_Q4_K_M } from "@qvac/sdk";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ const modelSrc = process.argv[2] || FLUX_2_KLEIN_4B_Q4_0;
5
+ const prompt = process.argv[3] ||
6
+ "a photo of a cat sitting on a windowsill, golden hour lighting";
7
+ const outputDir = process.argv[4] || ".";
8
+ console.log(`Loading diffusion model...`);
9
+ // FLUX.2 models require companion LLM + VAE models
10
+ const modelId = await loadModel({
11
+ modelSrc,
12
+ modelType: "diffusion",
13
+ modelConfig: { device: "gpu", threads: 4, llmModelSrc: QWEN3_4B_Q4_K_M, vaeModelSrc: FLUX_2_KLEIN_4B_VAE },
14
+ onProgress: (p) => console.log(`Loading: ${p.percentage.toFixed(1)}%`),
15
+ });
16
+ console.log(`Model loaded: ${modelId}`);
17
+ console.log(`\nGenerating: "${prompt}"`);
18
+ const { progressStream, outputs, stats } = diffusion({
19
+ modelId,
20
+ prompt,
21
+ width: 512,
22
+ height: 512,
23
+ steps: 20,
24
+ cfg_scale: 7.0,
25
+ seed: -1,
26
+ });
27
+ for await (const { step, totalSteps } of progressStream) {
28
+ process.stdout.write(`\rStep ${step}/${totalSteps}`);
29
+ }
30
+ console.log();
31
+ const buffers = await outputs;
32
+ for (let i = 0; i < buffers.length; i++) {
33
+ const outputPath = path.join(outputDir, `output_${i}.png`);
34
+ fs.writeFileSync(outputPath, buffers[i]);
35
+ console.log(`Saved: ${outputPath}`);
36
+ }
37
+ console.log("\nStats:", await stats);
38
+ await unloadModel({ modelId, clearStorage: false });
39
+ console.log("Done.");
40
+ process.exit(0);
@@ -20,7 +20,7 @@ try {
20
20
  });
21
21
  console.log("\n📝 Example 1: Single Text Embedding");
22
22
  console.log("=".repeat(50));
23
- const singleEmbedding = await embed({ modelId, text: "Hello, world!" });
23
+ const { embedding: singleEmbedding } = await embed({ modelId, text: "Hello, world!" });
24
24
  console.log("Input: 'Hello, world!'");
25
25
  console.log("Embedding dimensions:", singleEmbedding.length);
26
26
  console.log("First 10 values:", singleEmbedding.slice(0, 10));
@@ -31,7 +31,7 @@ try {
31
31
  "A fast auburn fox leaps over a sleepy canine",
32
32
  "Python is a programming language",
33
33
  ];
34
- const batchEmbeddings = await embed({ modelId, text: texts });
34
+ const { embedding: batchEmbeddings } = await embed({ modelId, text: texts });
35
35
  console.log("Input: Array of", texts.length, "texts");
36
36
  console.log("Output: Array of", batchEmbeddings.length, "embeddings");
37
37
  const [emb1, emb2, emb3] = batchEmbeddings;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=llamacpp-finetune.d.ts.map
@@ -0,0 +1,78 @@
1
+ import { finetune, loadModel, QWEN3_600M_INST_Q4, unloadModel, } from "@qvac/sdk";
2
+ const pauseResumeEnabled = process.argv.includes("--pause-resume");
3
+ let modelId;
4
+ let exitCode = 0;
5
+ async function readProgress(handle, onTick) {
6
+ for await (const tick of handle.progressStream) {
7
+ const phase = tick.is_train ? "train" : "val";
8
+ console.log(`epoch=${tick.current_epoch + 1} step=${tick.global_steps} batch=${tick.current_batch}/${tick.total_batches} ${phase} loss=${tick.loss?.toFixed(4)} acc=${tick.accuracy?.toFixed(4)} eta=${Math.round(tick.eta_ms / 1000)}s`);
9
+ onTick(tick.global_steps);
10
+ }
11
+ }
12
+ try {
13
+ modelId = await loadModel({
14
+ modelSrc: QWEN3_600M_INST_Q4,
15
+ modelType: "llm",
16
+ modelConfig: {
17
+ device: "gpu",
18
+ ctx_size: 512,
19
+ },
20
+ });
21
+ console.log(`✅ Model loaded with ID: ${modelId}`);
22
+ const loadedModelId = modelId;
23
+ const finetuneParams = {
24
+ modelId: loadedModelId,
25
+ options: {
26
+ trainDatasetDir: "./examples/finetune/input/small_train_HF.jsonl",
27
+ validation: {
28
+ type: "dataset",
29
+ path: "./examples/finetune/input/small_eval_HF.jsonl",
30
+ },
31
+ numberOfEpochs: 2,
32
+ learningRate: 1e-4,
33
+ lrMin: 1e-8,
34
+ loraModules: 'attn_q,attn_k,attn_v,attn_o,ffn_gate,ffn_up,ffn_down',
35
+ assistantLossOnly: true,
36
+ checkpointSaveSteps: 2,
37
+ checkpointSaveDir: "./examples/finetune/results/checkpoints",
38
+ outputParametersDir: "./examples/finetune/results",
39
+ },
40
+ };
41
+ const handle = finetune(finetuneParams);
42
+ let pauseRequested = false;
43
+ let pauseResultPromise;
44
+ const progressTask = readProgress(handle, (globalSteps) => {
45
+ if (pauseResumeEnabled && !pauseRequested && globalSteps >= 10) {
46
+ pauseRequested = true;
47
+ console.log("⏸️ Requesting a pause so the run can be resumed...");
48
+ pauseResultPromise = finetune({ modelId: loadedModelId, operation: "pause" });
49
+ }
50
+ });
51
+ const initialResult = await handle.result;
52
+ await progressTask;
53
+ if (pauseResultPromise) {
54
+ await pauseResultPromise;
55
+ }
56
+ console.log("📦 Initial finetune result:", initialResult);
57
+ if (pauseResumeEnabled && initialResult.status === "PAUSED") {
58
+ console.log("▶️ Resuming from the saved checkpoint...");
59
+ const resumedHandle = finetune({
60
+ ...finetuneParams,
61
+ operation: "resume",
62
+ });
63
+ const resumedProgressTask = readProgress(resumedHandle, function () { });
64
+ const resumedResult = await resumedHandle.result;
65
+ await resumedProgressTask;
66
+ console.log("✅ Resumed finetune result:", resumedResult);
67
+ }
68
+ }
69
+ catch (error) {
70
+ console.error("❌ Error:", error);
71
+ exitCode = 1;
72
+ }
73
+ finally {
74
+ if (modelId) {
75
+ await unloadModel({ modelId, clearStorage: false });
76
+ }
77
+ }
78
+ process.exit(exitCode);
@@ -52,7 +52,7 @@ try {
52
52
  history: messages,
53
53
  stream: true,
54
54
  });
55
- const embedding = await embed({
55
+ const { embedding } = await embed({
56
56
  modelId: embedModelId,
57
57
  text: messages[0]?.content ?? "Hello, world!",
58
58
  });
@@ -12,7 +12,9 @@
12
12
  import { completion, loadModel, unloadModel, QWEN3_1_7B_INST_Q4, } from "../index.js";
13
13
  // MCP SDK is a user-installed optional dependency
14
14
  // Install with: bun add @modelcontextprotocol/sdk
15
+ // eslint-disable-next-line import/no-unresolved
15
16
  import { Client } from "@modelcontextprotocol/sdk/client/index.js";
17
+ // eslint-disable-next-line import/no-unresolved
16
18
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
17
19
  function parseSearchResults(mcpResult) {
18
20
  try {
@@ -1,3 +1,14 @@
1
+ /**
2
+ * OCR example using the QVAC SDK.
3
+ *
4
+ * Usage:
5
+ * bun examples/ocr-fasttext.ts [path-to-image]
6
+ *
7
+ * This example requires a test image (default: examples/image/basic_test.bmp).
8
+ * Sample images are available in the QVAC source repository, but not included in the published npm package.
9
+ * Pass a custom image path, or download the default image into examples/image/:
10
+ * https://github.com/tetherto/qvac/blob/main/packages/sdk/examples/image/basic_test.bmp
11
+ */
1
12
  import { close, loadModel, ocr, OCR_LATIN_RECOGNIZER_1, unloadModel, } from "@qvac/sdk";
2
13
  import path from "path";
3
14
  import { fileURLToPath } from "url";
@@ -9,16 +9,16 @@ try {
9
9
  });
10
10
  console.log("Model loaded:", modelId);
11
11
  console.log("\n=== Embed with per-call profiling ===");
12
- const embedding1 = await embed({ modelId, text: "Profile this specific call" }, { profiling: { enabled: true, includeServerBreakdown: true } });
12
+ const { embedding: embedding1 } = await embed({ modelId, text: "Profile this specific call" }, { profiling: { enabled: true, includeServerBreakdown: true } });
13
13
  console.log("Embedding dimensions:", embedding1.length);
14
14
  console.log("\n=== Embed without profiling ===");
15
- const embedding2 = await embed({
15
+ const { embedding: embedding2 } = await embed({
16
16
  modelId,
17
17
  text: "This call is not profiled",
18
18
  });
19
19
  console.log("Embedding dimensions:", embedding2.length);
20
20
  console.log("\n=== Embed with profiling explicitly disabled ===");
21
- const embedding3 = await embed({ modelId, text: "Profiling explicitly disabled for this call" }, { profiling: { enabled: false } });
21
+ const { embedding: embedding3 } = await embed({ modelId, text: "Profiling explicitly disabled for this call" }, { profiling: { enabled: false } });
22
22
  console.log("Embedding dimensions:", embedding3.length);
23
23
  await unloadModel({ modelId });
24
24
  console.log("\n=== Profiler Summary (per-call data only) ===");
@@ -96,7 +96,7 @@ try {
96
96
  for (const s of samples) {
97
97
  ids.push(String(s.id));
98
98
  documents.push(s.text);
99
- embeddings.push(await embed({ modelId, text: s.text }));
99
+ embeddings.push((await embed({ modelId, text: s.text })).embedding);
100
100
  }
101
101
  await collection.add({
102
102
  ids,
@@ -104,7 +104,7 @@ try {
104
104
  embeddings,
105
105
  });
106
106
  console.log("🔎 Searching for similar documents...");
107
- const queryEmbedding = await embed({ modelId, text: query });
107
+ const { embedding: queryEmbedding } = await embed({ modelId, text: query });
108
108
  // Query top 3 by vector similarity and include distances
109
109
  const res = await collection.query({
110
110
  queryEmbeddings: [queryEmbedding],
@@ -33,7 +33,7 @@ try {
33
33
  console.log(` Created ${chunks.length} chunks`);
34
34
  console.log("\n🧠 Step 2: Generating embeddings (batch)...");
35
35
  const texts = chunks.map((chunk) => chunk.content);
36
- const embeddings = await embed({ modelId, text: texts });
36
+ const { embedding: embeddings } = await embed({ modelId, text: texts });
37
37
  const embeddedDocs = chunks.map((chunk, i) => ({
38
38
  id: chunk.id,
39
39
  content: chunk.content,
@@ -63,7 +63,7 @@ try {
63
63
  console.log("📚 Embedding documents...");
64
64
  const documents = [];
65
65
  for (const sample of samples) {
66
- const embedding = await embed({ modelId, text: sample.text });
66
+ const { embedding } = await embed({ modelId, text: sample.text });
67
67
  const record = {
68
68
  id: sample.id,
69
69
  text: sample.text,
@@ -73,7 +73,7 @@ try {
73
73
  }
74
74
  await documentsTable.add(documents);
75
75
  console.log("🔎 Searching for similar documents...");
76
- const queryEmbedding = await embed({ modelId, text: query });
76
+ const { embedding: queryEmbedding } = await embed({ modelId, text: query });
77
77
  const results = (await documentsTable
78
78
  .vectorSearch(queryEmbedding)
79
79
  .limit(1)
@@ -58,7 +58,7 @@ try {
58
58
  `);
59
59
  console.log("📚 Embedding documents...");
60
60
  for (const sample of samples) {
61
- const embedding = await embed({ modelId, text: sample.text });
61
+ const { embedding } = await embed({ modelId, text: sample.text });
62
62
  db.exec({
63
63
  sql: "INSERT INTO documents VALUES (?, ?, vector_as_f32(?))",
64
64
  bind: [sample.id, sample.text, JSON.stringify(embedding)],
@@ -72,7 +72,7 @@ try {
72
72
  db.exec(`SELECT vector_quantize_preload('documents', 'embedding')`);
73
73
  // Search for similar documents
74
74
  console.log("🔎 Searching for similar documents...");
75
- const queryEmbedding = await embed({ modelId, text: query });
75
+ const { embedding: queryEmbedding } = await embed({ modelId, text: query });
76
76
  const results = [];
77
77
  // Perform vector search
78
78
  db.exec({
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=suspend-resume.d.ts.map
@@ -0,0 +1,52 @@
1
+ import { loadModel, LLAMA_3_2_1B_INST_Q4_0, completion, unloadModel, suspend, resume, } from "@qvac/sdk";
2
+ try {
3
+ // Load a model
4
+ const modelId = await loadModel({
5
+ modelSrc: LLAMA_3_2_1B_INST_Q4_0,
6
+ modelType: "llm",
7
+ onProgress: (progress) => {
8
+ console.log(progress);
9
+ },
10
+ });
11
+ console.log("✅ Model loaded\n");
12
+ // Run a completion before suspending
13
+ console.log("--- Completion before suspend ---");
14
+ const result1 = completion({
15
+ modelId,
16
+ history: [{ role: "user", content: "Say hello in one word" }],
17
+ stream: true,
18
+ });
19
+ for await (const token of result1.tokenStream) {
20
+ process.stdout.write(token);
21
+ }
22
+ console.log("\n");
23
+ // Suspend all networking and storage (e.g. app going to background)
24
+ console.log("⏸️ Suspending...");
25
+ await suspend();
26
+ console.log("✅ Suspended — Hyperswarm and Corestore resources are paused\n");
27
+ // Simulate time in background
28
+ console.log("💤 Simulating 3 seconds in background...");
29
+ await new Promise((resolve) => setTimeout(resolve, 3000));
30
+ // Resume when returning to foreground
31
+ console.log("▶️ Resuming...");
32
+ await resume();
33
+ console.log("✅ Resumed — networking and storage restored\n");
34
+ // Run another completion after resuming
35
+ console.log("--- Completion after resume ---");
36
+ const result2 = completion({
37
+ modelId,
38
+ history: [{ role: "user", content: "Say goodbye in one word" }],
39
+ stream: true,
40
+ });
41
+ for await (const token of result2.tokenStream) {
42
+ process.stdout.write(token);
43
+ }
44
+ console.log("\n");
45
+ await unloadModel({ modelId });
46
+ console.log("✅ Model unloaded");
47
+ process.exit(0);
48
+ }
49
+ catch (error) {
50
+ console.error("❌ Error:", error);
51
+ process.exit(1);
52
+ }
@@ -1,15 +1,14 @@
1
- import { loadModel, unloadModel, transcribe, PARAKEET_CTC_FP32, PARAKEET_CTC_DATA_FP32, PARAKEET_CTC_TOKENIZER, } from "@qvac/sdk";
1
+ import { loadModel, unloadModel, transcribe, PARAKEET_CTC_FP32, PARAKEET_CTC_TOKENIZER, } from "@qvac/sdk";
2
2
  const args = process.argv.slice(2);
3
3
  if (!args[0]) {
4
4
  console.error("Usage: bun run examples/transcription/parakeet-ctc-filesystem.ts <wav-file> " +
5
- "[model.onnx] [model.onnx_data] [tokenizer.json]");
5
+ "[model.onnx] [tokenizer.json]");
6
6
  console.error("\nIf model paths are omitted, defaults to registry models.");
7
7
  process.exit(1);
8
8
  }
9
9
  const audioFilePath = args[0];
10
10
  const parakeetCtcModelSrc = args[1] ?? PARAKEET_CTC_FP32;
11
- const parakeetCtcModelDataSrc = args[2] ?? PARAKEET_CTC_DATA_FP32;
12
- const parakeetTokenizerSrc = args[3] ?? PARAKEET_CTC_TOKENIZER;
11
+ const parakeetTokenizerSrc = args[2] ?? PARAKEET_CTC_TOKENIZER;
13
12
  try {
14
13
  console.log("Loading Parakeet CTC model...");
15
14
  const modelId = await loadModel({
@@ -18,7 +17,6 @@ try {
18
17
  modelConfig: {
19
18
  modelType: "ctc",
20
19
  parakeetCtcModelSrc,
21
- parakeetCtcModelDataSrc,
22
20
  parakeetTokenizerSrc,
23
21
  },
24
22
  onProgress: (progress) => {
@@ -1,56 +1,64 @@
1
- import { loadModel, unloadModel, transcribeStream, PARAKEET_TDT_ENCODER_FP32, PARAKEET_TDT_ENCODER_DATA_FP32, PARAKEET_TDT_DECODER_FP32, PARAKEET_TDT_VOCAB, PARAKEET_TDT_PREPROCESSOR_FP32, } from "@qvac/sdk";
1
+ /**
2
+ * Microphone → Parakeet transcription using chunked `transcribe` calls.
3
+ *
4
+ * Usage: bun run examples/transcription/parakeet-microphone-record.ts
5
+ *
6
+ * Captures 3-second audio chunks from the microphone and sends each to the
7
+ * batch `transcribe` API. Press Ctrl+C to quit.
8
+ *
9
+ * Requirements: FFmpeg installed, microphone access.
10
+ */
11
+ import { loadModel, unloadModel, transcribe, PARAKEET_TDT_ENCODER_FP32, PARAKEET_TDT_DECODER_FP32, PARAKEET_TDT_VOCAB, PARAKEET_TDT_PREPROCESSOR_FP32, } from "@qvac/sdk";
2
12
  import { spawn, spawnSync } from "child_process";
3
13
  import { platform } from "os";
4
- function checkFFmpeg() {
5
- const result = spawnSync("ffmpeg", ["-version"], { stdio: "ignore" });
6
- if (result.error || result.status !== 0) {
7
- throw new Error("FFmpeg is required but not found in PATH.");
8
- }
9
- }
10
- function getAudioDevice() {
11
- switch (platform()) {
12
- case "darwin":
13
- return ":0";
14
- case "linux":
15
- return "default";
16
- case "win32":
17
- // Change as per your system
18
- return "audio=@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\\wave_{58C07110-A4FD-4FF8-BA10-5A3C14389F71}";
19
- default:
20
- throw new Error(`Unsupported platform: ${platform()}`);
21
- }
22
- }
14
+ const SAMPLE_RATE = 16000;
15
+ const BYTES_PER_SAMPLE = 2; // s16le
16
+ const CHUNK_DURATION_S = 3;
17
+ const CHUNK_SIZE = SAMPLE_RATE * BYTES_PER_SAMPLE * CHUNK_DURATION_S;
23
18
  function getAudioInputArgs() {
24
19
  switch (platform()) {
25
20
  case "darwin":
26
- return ["-f", "avfoundation", "-i", getAudioDevice()];
27
- case "linux":
28
- return ["-f", "pulse", "-i", getAudioDevice()];
21
+ return ["-f", "avfoundation", "-i", ":0"];
29
22
  case "win32":
30
- return ["-f", "dshow", "-i", getAudioDevice()];
23
+ return [
24
+ "-f",
25
+ "dshow",
26
+ "-i",
27
+ "audio=@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\\wave_{58C07110-A4FD-4FF8-BA10-5A3C14389F71}",
28
+ ];
29
+ case "linux":
30
+ return ["-f", "pulse", "-i", "default"];
31
31
  default:
32
32
  throw new Error(`Unsupported platform: ${platform()}`);
33
33
  }
34
34
  }
35
- checkFFmpeg();
35
+ // ── Main ──
36
+ try {
37
+ const r = spawnSync("ffmpeg", ["-version"], { stdio: "ignore" });
38
+ if (r.error || r.status !== 0)
39
+ throw new Error("FFmpeg not found");
40
+ }
41
+ catch {
42
+ console.error("FFmpeg is required. Install it and try again.");
43
+ process.exit(1);
44
+ }
36
45
  console.log("Loading Parakeet model...");
37
46
  const modelId = await loadModel({
38
47
  modelSrc: PARAKEET_TDT_ENCODER_FP32,
39
48
  modelType: "parakeet",
40
49
  modelConfig: {
41
50
  parakeetEncoderSrc: PARAKEET_TDT_ENCODER_FP32,
42
- parakeetEncoderDataSrc: PARAKEET_TDT_ENCODER_DATA_FP32,
43
51
  parakeetDecoderSrc: PARAKEET_TDT_DECODER_FP32,
44
52
  parakeetVocabSrc: PARAKEET_TDT_VOCAB,
45
53
  parakeetPreprocessorSrc: PARAKEET_TDT_PREPROCESSOR_FP32,
46
54
  },
47
55
  onProgress: (p) => console.log(`Download: ${p.percentage.toFixed(1)}%`),
48
56
  });
49
- console.log("Model loaded. Speak into your microphone (Ctrl+C to stop):\n");
57
+ console.log("Model loaded.\n");
50
58
  const ffmpeg = spawn("ffmpeg", [
51
59
  ...getAudioInputArgs(),
52
60
  "-ar",
53
- "16000",
61
+ String(SAMPLE_RATE),
54
62
  "-ac",
55
63
  "1",
56
64
  "-sample_fmt",
@@ -59,9 +67,11 @@ const ffmpeg = spawn("ffmpeg", [
59
67
  "s16le",
60
68
  "pipe:1",
61
69
  ], { stdio: ["ignore", "pipe", "ignore"] });
62
- const CHUNK_SIZE = 96000; // ~3s of 16kHz 16-bit mono
70
+ if (!ffmpeg.stdout)
71
+ throw new Error("Failed to open microphone");
63
72
  let buffer = Buffer.alloc(0);
64
73
  let processing = false;
74
+ console.log("Listening... speak and pause to see transcriptions.\n");
65
75
  ffmpeg.stdout.on("data", (chunk) => {
66
76
  buffer = Buffer.concat([buffer, chunk]);
67
77
  if (buffer.length >= CHUNK_SIZE && !processing) {
@@ -70,10 +80,9 @@ ffmpeg.stdout.on("data", (chunk) => {
70
80
  processing = true;
71
81
  void (async () => {
72
82
  try {
73
- for await (const text of transcribeStream({ modelId, audioChunk })) {
74
- if (text.trim() && !text.includes("[No speech detected]")) {
75
- process.stdout.write(text);
76
- }
83
+ const text = await transcribe({ modelId, audioChunk });
84
+ if (text.trim() && !text.includes("[No speech detected]")) {
85
+ console.log(`> ${text.trim()}`);
77
86
  }
78
87
  }
79
88
  catch (err) {
@@ -1,4 +1,15 @@
1
- import { loadModel, unloadModel, transcribe, PARAKEET_TDT_ENCODER_FP32, PARAKEET_TDT_ENCODER_DATA_FP32, PARAKEET_TDT_DECODER_FP32, PARAKEET_TDT_VOCAB, PARAKEET_TDT_PREPROCESSOR_FP32, PARAKEET_SORTFORMER_FP32, } from "@qvac/sdk";
1
+ /**
2
+ * Parakeet Sortformer diarization + TDT transcription example.
3
+ *
4
+ * Usage:
5
+ * bun examples/transcription/parakeet-sortformer.ts [sortformer-src] [path-to-audio]
6
+ *
7
+ * This example requires a test audio file (default: examples/audio/diarization-sample-16k.wav).
8
+ * Sample audio files are available in the QVAC source repository, but not included in the published npm package.
9
+ * Pass a custom audio path as the second argument, or download the default audio into examples/audio/:
10
+ * https://github.com/tetherto/qvac/blob/main/packages/sdk/examples/audio/diarization-sample-16k.wav
11
+ */
12
+ import { loadModel, unloadModel, transcribe, PARAKEET_TDT_ENCODER_FP32, PARAKEET_TDT_DECODER_FP32, PARAKEET_TDT_VOCAB, PARAKEET_TDT_PREPROCESSOR_FP32, PARAKEET_SORTFORMER_FP32, } from "@qvac/sdk";
2
13
  import { dirname, join } from "path";
3
14
  import { fileURLToPath } from "url";
4
15
  import { readFileSync, writeFileSync, mkdirSync } from "fs";
@@ -6,7 +17,7 @@ import { tmpdir } from "os";
6
17
  const __dirname = dirname(fileURLToPath(import.meta.url));
7
18
  const args = process.argv.slice(2);
8
19
  const sortformerSrc = args[0] ?? PARAKEET_SORTFORMER_FP32;
9
- const defaultAudioPath = join(__dirname, "..", "..", "..", "examples", "transcription", "audio", "diarization-sample-16k.wav");
20
+ const defaultAudioPath = join(__dirname, "..", "audio", "diarization-sample-16k.wav");
10
21
  const audioFilePath = args[1] ?? defaultAudioPath;
11
22
  // ── Step 1: Diarize with Sortformer ──
12
23
  const sfModelId = await loadModel({
@@ -29,7 +40,6 @@ const tdtModelId = await loadModel({
29
40
  modelType: "parakeet",
30
41
  modelConfig: {
31
42
  parakeetEncoderSrc: PARAKEET_TDT_ENCODER_FP32,
32
- parakeetEncoderDataSrc: PARAKEET_TDT_ENCODER_DATA_FP32,
33
43
  parakeetDecoderSrc: PARAKEET_TDT_DECODER_FP32,
34
44
  parakeetVocabSrc: PARAKEET_TDT_VOCAB,
35
45
  parakeetPreprocessorSrc: PARAKEET_TDT_PREPROCESSOR_FP32,
@@ -1,17 +1,16 @@
1
- import { loadModel, unloadModel, transcribe, PARAKEET_TDT_ENCODER_FP32, PARAKEET_TDT_ENCODER_DATA_FP32, PARAKEET_TDT_DECODER_FP32, PARAKEET_TDT_VOCAB, PARAKEET_TDT_PREPROCESSOR_FP32, } from "@qvac/sdk";
1
+ import { loadModel, unloadModel, transcribe, PARAKEET_TDT_ENCODER_FP32, PARAKEET_TDT_DECODER_FP32, PARAKEET_TDT_VOCAB, PARAKEET_TDT_PREPROCESSOR_FP32, } from "@qvac/sdk";
2
2
  const args = process.argv.slice(2);
3
3
  if (!args[0]) {
4
4
  console.error("Usage: bun run examples/transcription/parakeet-tdt-filesystem.ts <wav-file-path> " +
5
- "[encoder-onnx] [encoder-data] [decoder-onnx] [vocab-txt] [preprocessor-onnx]");
5
+ "[encoder-onnx] [decoder-onnx] [vocab-txt] [preprocessor-onnx]");
6
6
  console.error("\nIf model paths are omitted, defaults to registry models.");
7
7
  process.exit(1);
8
8
  }
9
9
  const audioFilePath = args[0];
10
10
  const parakeetEncoderSrc = args[1] ?? PARAKEET_TDT_ENCODER_FP32;
11
- const parakeetEncoderDataSrc = args[2] ?? PARAKEET_TDT_ENCODER_DATA_FP32;
12
- const parakeetDecoderSrc = args[3] ?? PARAKEET_TDT_DECODER_FP32;
13
- const parakeetVocabSrc = args[4] ?? PARAKEET_TDT_VOCAB;
14
- const parakeetPreprocessorSrc = args[5] ?? PARAKEET_TDT_PREPROCESSOR_FP32;
11
+ const parakeetDecoderSrc = args[2] ?? PARAKEET_TDT_DECODER_FP32;
12
+ const parakeetVocabSrc = args[3] ?? PARAKEET_TDT_VOCAB;
13
+ const parakeetPreprocessorSrc = args[4] ?? PARAKEET_TDT_PREPROCESSOR_FP32;
15
14
  try {
16
15
  console.log("Starting Parakeet transcription example...");
17
16
  console.log("Loading Parakeet model...");
@@ -20,7 +19,6 @@ try {
20
19
  modelType: "parakeet",
21
20
  modelConfig: {
22
21
  parakeetEncoderSrc,
23
- parakeetEncoderDataSrc,
24
22
  parakeetDecoderSrc,
25
23
  parakeetVocabSrc,
26
24
  parakeetPreprocessorSrc,
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=whispercpp-filesystem-streaming.d.ts.map