@qvac/sdk 0.11.0 → 0.12.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 (211) hide show
  1. package/NOTICE +1423 -43
  2. package/README.md +2 -0
  3. package/dist/client/api/classify.d.ts +23 -0
  4. package/dist/client/api/classify.js +43 -0
  5. package/dist/client/api/get-model-info.d.ts +1 -1
  6. package/dist/client/api/index.d.ts +4 -0
  7. package/dist/client/api/index.js +4 -0
  8. package/dist/client/api/load-model.js +24 -1
  9. package/dist/client/api/transcribe.d.ts +3 -0
  10. package/dist/client/api/transcribe.js +13 -2
  11. package/dist/client/api/video.d.ts +64 -0
  12. package/dist/client/api/video.js +147 -0
  13. package/dist/client/api/vla-helpers.d.ts +45 -0
  14. package/dist/client/api/vla-helpers.js +130 -0
  15. package/dist/client/api/vla.d.ts +65 -0
  16. package/dist/client/api/vla.js +109 -0
  17. package/dist/client/config-loader/resolve-config.node.d.ts +16 -0
  18. package/dist/client/config-loader/resolve-config.node.js +77 -23
  19. package/dist/client/plugins-factory.d.ts +8 -0
  20. package/dist/client/plugins-factory.js +10 -0
  21. package/dist/client/rpc/bare-client.d.ts +1 -0
  22. package/dist/client/rpc/bare-client.js +66 -66
  23. package/dist/client/rpc/ensure-worker-ready.d.ts +9 -0
  24. package/dist/client/rpc/ensure-worker-ready.js +17 -0
  25. package/dist/client/rpc/expo-rpc-client.d.ts +1 -0
  26. package/dist/client/rpc/expo-rpc-client.js +4 -0
  27. package/dist/client/rpc/node-rpc-client.d.ts +1 -0
  28. package/dist/client/rpc/node-rpc-client.js +97 -5
  29. package/dist/client/rpc/rpc-client.js +115 -8
  30. package/dist/client/rpc/rpc-error.js +14 -1
  31. package/dist/commands/bundle/bare-pack.d.ts +13 -0
  32. package/dist/commands/bundle/bare-pack.js +54 -0
  33. package/dist/commands/bundle/constants.d.ts +7 -0
  34. package/dist/commands/bundle/constants.js +23 -0
  35. package/dist/commands/bundle/entry-gen.d.ts +2 -0
  36. package/dist/commands/bundle/entry-gen.js +48 -0
  37. package/dist/commands/bundle/index.d.ts +20 -0
  38. package/dist/commands/bundle/index.js +141 -0
  39. package/dist/commands/bundle/manifest.d.ts +21 -0
  40. package/dist/commands/bundle/manifest.js +193 -0
  41. package/dist/commands/bundle/plugins.d.ts +9 -0
  42. package/dist/commands/bundle/plugins.js +51 -0
  43. package/dist/commands/index.d.ts +5 -0
  44. package/dist/commands/index.js +2 -0
  45. package/dist/commands/verify/abi.d.ts +52 -0
  46. package/dist/commands/verify/abi.js +125 -0
  47. package/dist/commands/verify/addon-source.d.ts +43 -0
  48. package/dist/commands/verify/addon-source.js +75 -0
  49. package/dist/commands/verify/bundle-source.d.ts +12 -0
  50. package/dist/commands/verify/bundle-source.js +53 -0
  51. package/dist/commands/verify/index.d.ts +59 -0
  52. package/dist/commands/verify/index.js +371 -0
  53. package/dist/commands/verify/node-modules-source.d.ts +11 -0
  54. package/dist/commands/verify/node-modules-source.js +76 -0
  55. package/dist/commands/verify/prebuilds.d.ts +15 -0
  56. package/dist/commands/verify/prebuilds.js +39 -0
  57. package/dist/examples/classification/classify-image.d.ts +2 -0
  58. package/dist/examples/classification/classify-image.js +23 -0
  59. package/dist/examples/diffusion-txt2vid.d.ts +2 -0
  60. package/dist/examples/diffusion-txt2vid.js +81 -0
  61. package/dist/examples/plugins.js +3 -7
  62. package/dist/examples/tools/llamacpp-tools-gemma4.js +2 -5
  63. package/dist/examples/tools/llamacpp-tools-qwen35.js +2 -3
  64. package/dist/examples/transcription/parakeet-ctc-filesystem.js +18 -12
  65. package/dist/examples/transcription/parakeet-microphone-record.js +7 -12
  66. package/dist/examples/transcription/parakeet-microphone-stream.d.ts +2 -0
  67. package/dist/examples/transcription/parakeet-microphone-stream.js +79 -0
  68. package/dist/examples/transcription/parakeet-sortformer-streaming.d.ts +2 -0
  69. package/dist/examples/transcription/parakeet-sortformer-streaming.js +121 -0
  70. package/dist/examples/transcription/parakeet-sortformer.js +58 -55
  71. package/dist/examples/transcription/parakeet-tdt-filesystem.js +18 -15
  72. package/dist/examples/transcription/whispercpp-microphone-conversation.js +6 -1
  73. package/dist/examples/tts/chatterbox.js +7 -16
  74. package/dist/examples/tts/llm-to-tts-streaming.js +3 -10
  75. package/dist/examples/tts/supertonic-multilingual.js +4 -12
  76. package/dist/examples/tts/supertonic.js +5 -12
  77. package/dist/examples/vla-smolvla.d.ts +2 -0
  78. package/dist/examples/vla-smolvla.js +75 -0
  79. package/dist/examples/voice-assistant/voice-assistant.js +3 -10
  80. package/dist/expo/plugins/find-in-ancestor-node-modules.d.ts +14 -0
  81. package/dist/expo/plugins/find-in-ancestor-node-modules.js +24 -0
  82. package/dist/expo/plugins/get-project-root.d.ts +22 -0
  83. package/dist/expo/plugins/get-project-root.js +23 -0
  84. package/dist/expo/plugins/index.d.ts +4 -0
  85. package/dist/expo/plugins/index.js +4 -0
  86. package/dist/expo/plugins/resolve-sdk-package-dir.d.ts +9 -2
  87. package/dist/expo/plugins/resolve-sdk-package-dir.js +38 -11
  88. package/dist/expo/plugins/withDeviceInfo.js +2 -1
  89. package/dist/expo/plugins/withMobileBundle.d.ts +2 -17
  90. package/dist/expo/plugins/withMobileBundle.js +31 -85
  91. package/dist/index.d.ts +5 -3
  92. package/dist/index.js +9 -3
  93. package/dist/models/registry/models.d.ts +3711 -368
  94. package/dist/models/registry/models.js +7066 -3562
  95. package/dist/models/update-models/naming.js +22 -8
  96. package/dist/pear/pre.js +6 -2
  97. package/dist/schemas/cancel.d.ts +5 -0
  98. package/dist/schemas/cancel.js +1 -0
  99. package/dist/schemas/classification.d.ts +53 -0
  100. package/dist/schemas/classification.js +33 -0
  101. package/dist/schemas/common.d.ts +1001 -1739
  102. package/dist/schemas/common.js +6 -1
  103. package/dist/schemas/completion-event.d.ts +3 -0
  104. package/dist/schemas/completion-event.js +1 -0
  105. package/dist/schemas/completion-stream.d.ts +1 -0
  106. package/dist/schemas/download-asset.d.ts +13 -3
  107. package/dist/schemas/engine-addon-map.d.ts +3 -0
  108. package/dist/schemas/engine-addon-map.js +18 -5
  109. package/dist/schemas/get-model-info.d.ts +4 -0
  110. package/dist/schemas/get-model-info.js +2 -0
  111. package/dist/schemas/index.d.ts +3 -0
  112. package/dist/schemas/index.js +3 -0
  113. package/dist/schemas/llamacpp-config.d.ts +12 -2
  114. package/dist/schemas/load-model.d.ts +6152 -10764
  115. package/dist/schemas/load-model.js +75 -7
  116. package/dist/schemas/model-src-utils.d.ts +22 -2
  117. package/dist/schemas/model-types.d.ts +46 -6
  118. package/dist/schemas/model-types.js +28 -5
  119. package/dist/schemas/ocr.d.ts +5 -0
  120. package/dist/schemas/plugin.d.ts +20 -5
  121. package/dist/schemas/plugin.js +21 -4
  122. package/dist/schemas/registry.d.ts +44 -0
  123. package/dist/schemas/registry.js +5 -0
  124. package/dist/schemas/reload-config.d.ts +22 -2
  125. package/dist/schemas/sdcpp-config.d.ts +316 -1
  126. package/dist/schemas/sdcpp-config.js +232 -33
  127. package/dist/schemas/sdk-config.d.ts +654 -1324
  128. package/dist/schemas/sdk-config.js +16 -1
  129. package/dist/schemas/sdk-errors-client.d.ts +7 -0
  130. package/dist/schemas/sdk-errors-client.js +36 -1
  131. package/dist/schemas/sdk-errors-server.d.ts +3 -1
  132. package/dist/schemas/sdk-errors-server.js +20 -5
  133. package/dist/schemas/text-to-speech.d.ts +79 -696
  134. package/dist/schemas/text-to-speech.js +46 -19
  135. package/dist/schemas/transcription-config.d.ts +37 -226
  136. package/dist/schemas/transcription-config.js +76 -15
  137. package/dist/schemas/transcription.d.ts +63 -11
  138. package/dist/schemas/transcription.js +56 -2
  139. package/dist/schemas/translation-config.d.ts +60 -10
  140. package/dist/schemas/vla.d.ts +87 -0
  141. package/dist/schemas/vla.js +108 -0
  142. package/dist/scripts/run-unit-tests.js +8 -2
  143. package/dist/server/bare/ops/transcribe.d.ts +2 -1
  144. package/dist/server/bare/ops/transcribe.js +59 -34
  145. package/dist/server/bare/plugins/ggml-classification/ops/classify.d.ts +6 -0
  146. package/dist/server/bare/plugins/ggml-classification/ops/classify.js +30 -0
  147. package/dist/server/bare/plugins/ggml-classification/plugin.d.ts +32 -0
  148. package/dist/server/bare/plugins/ggml-classification/plugin.js +55 -0
  149. package/dist/server/bare/plugins/ggml-vla/ops/vla-hparams.d.ts +3 -0
  150. package/dist/server/bare/plugins/ggml-vla/ops/vla-hparams.js +12 -0
  151. package/dist/server/bare/plugins/ggml-vla/ops/vla-run.d.ts +3 -0
  152. package/dist/server/bare/plugins/ggml-vla/ops/vla-run.js +75 -0
  153. package/dist/server/bare/plugins/ggml-vla/plugin.d.ts +54 -0
  154. package/dist/server/bare/plugins/ggml-vla/plugin.js +57 -0
  155. package/dist/server/bare/plugins/index.d.ts +3 -1
  156. package/dist/server/bare/plugins/index.js +3 -1
  157. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +3 -0
  158. package/dist/server/bare/plugins/llamacpp-completion/ops/context-overflow.d.ts +29 -0
  159. package/dist/server/bare/plugins/llamacpp-completion/ops/context-overflow.js +65 -0
  160. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +6 -0
  161. package/dist/server/bare/plugins/llamacpp-completion/plugin.js +26 -0
  162. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +25 -0
  163. package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +5 -0
  164. package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +67 -246
  165. package/dist/server/bare/plugins/parakeet-transcription/plugin.js +66 -97
  166. package/dist/server/bare/plugins/sdcpp-generation/ops/video.d.ts +3 -0
  167. package/dist/server/bare/plugins/sdcpp-generation/ops/video.js +199 -0
  168. package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +200 -2
  169. package/dist/server/bare/plugins/sdcpp-generation/plugin.js +61 -8
  170. package/dist/server/bare/plugins/{onnx-tts → tts-ggml}/ops/text-to-speech-stream.js +2 -15
  171. package/dist/server/bare/plugins/{onnx-tts → tts-ggml}/ops/text-to-speech.js +2 -1
  172. package/dist/server/bare/plugins/tts-ggml/plugin.d.ts +75 -0
  173. package/dist/server/bare/plugins/tts-ggml/plugin.js +189 -0
  174. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +29 -4
  175. package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +12 -1
  176. package/dist/server/bare/registry/model-config-utils.js +7 -0
  177. package/dist/server/bare/runtime/request-context.d.ts +1 -1
  178. package/dist/server/bare/runtime-lifecycle.js +9 -9
  179. package/dist/server/bare/types/addon-responses.d.ts +1 -0
  180. package/dist/server/env.js +4 -1
  181. package/dist/server/plugins/index.d.ts +1 -1
  182. package/dist/server/plugins/index.js +1 -1
  183. package/dist/server/plugins/registry.d.ts +1 -0
  184. package/dist/server/plugins/registry.js +5 -0
  185. package/dist/server/rpc/handler-registry.js +4 -0
  186. package/dist/server/rpc/handler-selection.d.ts +9 -0
  187. package/dist/server/rpc/handler-selection.js +14 -0
  188. package/dist/server/rpc/handler-utils.js +5 -13
  189. package/dist/server/rpc/handlers/classify.d.ts +3 -0
  190. package/dist/server/rpc/handlers/classify.js +4 -0
  191. package/dist/server/rpc/handlers/index.d.ts +2 -0
  192. package/dist/server/rpc/handlers/index.js +2 -0
  193. package/dist/server/rpc/handlers/load-model/handler.js +4 -1
  194. package/dist/server/rpc/handlers/load-model/resolve.js +9 -0
  195. package/dist/server/rpc/handlers/video-stream.d.ts +3 -0
  196. package/dist/server/rpc/handlers/video-stream.js +4 -0
  197. package/dist/server/rpc/profiling/operation-metrics.js +23 -0
  198. package/dist/server/utils/config-transform.js +1 -1
  199. package/dist/server/utils/tools/parsers/qwen35.js +7 -3
  200. package/dist/server/worker.js +14 -11
  201. package/dist/utils/errors-client.d.ts +23 -0
  202. package/dist/utils/errors-client.js +40 -0
  203. package/dist/utils/errors-server.d.ts +30 -2
  204. package/dist/utils/errors-server.js +51 -3
  205. package/package.json +66 -80
  206. package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +0 -490
  207. package/dist/server/bare/plugins/onnx-tts/plugin.js +0 -272
  208. package/dist/server/bare/plugins/onnx-tts/wav-helper.d.ts +0 -14
  209. package/dist/server/bare/plugins/onnx-tts/wav-helper.js +0 -107
  210. /package/dist/server/bare/plugins/{onnx-tts → tts-ggml}/ops/text-to-speech-stream.d.ts +0 -0
  211. /package/dist/server/bare/plugins/{onnx-tts → tts-ggml}/ops/text-to-speech.d.ts +0 -0
@@ -1,96 +1,33 @@
1
1
  import parakeetAddonLogging from "@qvac/transcription-parakeet/addonLogging.js";
2
2
  import TranscriptionParakeet, {} from "@qvac/transcription-parakeet";
3
- import { definePlugin, defineHandler, transcribeRequestSchema, transcribeResponseSchema, ModelType, parakeetConfigSchema, ADDON_PARAKEET, } from "../../../../schemas/index.js";
3
+ import { definePlugin, defineHandler, defineDuplexHandler, transcribeRequestSchema, transcribeResponseSchema, transcribeStreamRequestSchema, transcribeStreamResponseSchema, ModelType, parakeetLoadConfigSchema, LEGACY_PARAKEET_ONNX_MODEL_CONFIG_FIELDS, ADDON_PARAKEET, } from "../../../../schemas/index.js";
4
4
  import { createStreamLogger, registerAddonLogger } from "../../../../logging/index.js";
5
- import { ModelLoadFailedError, ParakeetArtifactsRequiredError, TranscriptionFailedError, } from "../../../../utils/errors-server.js";
6
- import { transcribe } from "../../ops/transcribe.js";
5
+ import { ModelLoadFailedError, TranscriptionFailedError, LegacyParakeetModelDeprecatedError, } from "../../../../utils/errors-server.js";
6
+ import { transcribe, transcribeStream } from "../../ops/transcribe.js";
7
7
  import { attachModelExecutionMs } from "../../../../profiling/model-execution.js";
8
- async function resolveTdtConfig(cfg, ctx) {
9
- const { parakeetEncoderSrc, parakeetEncoderDataSrc, parakeetDecoderSrc, parakeetVocabSrc, parakeetPreprocessorSrc, } = cfg;
10
- if (!parakeetEncoderSrc ||
11
- !parakeetDecoderSrc ||
12
- !parakeetVocabSrc ||
13
- !parakeetPreprocessorSrc) {
14
- throw new ParakeetArtifactsRequiredError("TDT requires: parakeetEncoderSrc, parakeetDecoderSrc, parakeetVocabSrc, parakeetPreprocessorSrc");
8
+ function resolveParakeetConfig(cfg) {
9
+ const cfgRecord = cfg;
10
+ const legacyFields = LEGACY_PARAKEET_ONNX_MODEL_CONFIG_FIELDS.filter((name) => cfgRecord[name] !== undefined);
11
+ if (legacyFields.length > 0) {
12
+ throw new LegacyParakeetModelDeprecatedError(legacyFields);
15
13
  }
16
- const resolve = ctx.resolveModelPath;
17
- const [encoderPath, encoderDataPath, decoderPath, vocabPath, preprocessorPath,] = await Promise.all([
18
- resolve(parakeetEncoderSrc),
19
- parakeetEncoderDataSrc ? resolve(parakeetEncoderDataSrc) : undefined,
20
- resolve(parakeetDecoderSrc),
21
- resolve(parakeetVocabSrc),
22
- resolve(parakeetPreprocessorSrc),
23
- ]);
24
- return {
25
- config: cfg,
26
- artifacts: {
27
- encoder: encoderPath,
28
- ...(encoderDataPath !== undefined && { encoderData: encoderDataPath }),
29
- ...(decoderPath !== undefined && { decoder: decoderPath }),
30
- ...(vocabPath !== undefined && { vocab: vocabPath }),
31
- ...(preprocessorPath !== undefined && { preprocessor: preprocessorPath }),
32
- },
33
- };
34
- }
35
- async function resolveCtcConfig(cfg, ctx) {
36
- const { parakeetCtcModelSrc, parakeetCtcModelDataSrc, parakeetTokenizerSrc } = cfg;
37
- if (!parakeetCtcModelSrc || !parakeetTokenizerSrc) {
38
- throw new ParakeetArtifactsRequiredError("CTC requires: parakeetCtcModelSrc, parakeetTokenizerSrc");
39
- }
40
- const resolve = ctx.resolveModelPath;
41
- const [ctcModelPath, ctcModelDataPath, tokenizerPath] = await Promise.all([
42
- resolve(parakeetCtcModelSrc),
43
- parakeetCtcModelDataSrc ? resolve(parakeetCtcModelDataSrc) : undefined,
44
- resolve(parakeetTokenizerSrc),
45
- ]);
46
- return {
47
- config: cfg,
48
- artifacts: {
49
- model: ctcModelPath,
50
- ...(ctcModelDataPath !== undefined && { modelData: ctcModelDataPath }),
51
- ...(tokenizerPath !== undefined && { tokenizer: tokenizerPath }),
52
- },
53
- };
14
+ return Promise.resolve({ config: cfg });
54
15
  }
55
- async function resolveSortformerConfig(cfg, ctx) {
56
- const { parakeetSortformerSrc } = cfg;
57
- if (!parakeetSortformerSrc) {
58
- throw new ParakeetArtifactsRequiredError("Sortformer requires: parakeetSortformerSrc");
59
- }
60
- const resolve = ctx.resolveModelPath;
61
- const sortformerPath = await resolve(parakeetSortformerSrc);
62
- return {
63
- config: cfg,
64
- artifacts: {
65
- ...(sortformerPath !== undefined && { sortformer: sortformerPath }),
66
- },
67
- };
68
- }
69
- function createParakeetModel(params, primaryFileKey) {
16
+ function createParakeetModel(params) {
70
17
  const config = (params.modelConfig ?? {});
71
- const artifacts = { ...(params.artifacts ?? {}) };
72
- const modelType = config.modelType ?? "tdt";
73
- const primaryPath = artifacts[primaryFileKey] ?? params.modelPath;
74
- if (!primaryPath) {
75
- throw new ModelLoadFailedError(`Parakeet ${modelType} requires a model source`);
18
+ const modelPath = params.modelPath;
19
+ if (!modelPath) {
20
+ throw new ModelLoadFailedError("Parakeet requires a GGUF model source");
76
21
  }
77
22
  const logger = createStreamLogger(params.modelId, ModelType.parakeetTranscription);
78
23
  registerAddonLogger(params.modelId, ModelType.parakeetTranscription, logger);
79
24
  const files = {
80
- [primaryFileKey]: primaryPath,
81
- ...artifacts,
25
+ model: modelPath,
82
26
  };
27
+ const parakeetConfig = Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined));
83
28
  const addonConfig = {
84
29
  enableStats: true,
85
- parakeetConfig: {
86
- modelType,
87
- maxThreads: config.maxThreads,
88
- useGPU: config.useGPU,
89
- sampleRate: config.sampleRate,
90
- channels: config.channels,
91
- captionEnabled: config.captionEnabled,
92
- timestampsEnabled: config.timestampsEnabled,
93
- },
30
+ parakeetConfig,
94
31
  };
95
32
  const model = new TranscriptionParakeet({
96
33
  files,
@@ -101,33 +38,20 @@ function createParakeetModel(params, primaryFileKey) {
101
38
  }
102
39
  export const parakeetPlugin = definePlugin({
103
40
  modelType: ModelType.parakeetTranscription,
104
- displayName: "Parakeet (NVIDIA NeMo ONNX)",
41
+ displayName: "Parakeet (NVIDIA NeMo GGML)",
105
42
  addonPackage: ADDON_PARAKEET,
106
- loadConfigSchema: parakeetConfigSchema,
107
- skipPrimaryModelPathValidation: true,
108
- async resolveConfig(cfg, ctx) {
109
- const modelType = cfg.modelType ?? "tdt";
110
- if (modelType === "ctc")
111
- return resolveCtcConfig(cfg, ctx);
112
- if (modelType === "sortformer")
113
- return resolveSortformerConfig(cfg, ctx);
114
- return resolveTdtConfig(cfg, ctx);
43
+ loadConfigSchema: parakeetLoadConfigSchema,
44
+ resolveConfig(cfg) {
45
+ return resolveParakeetConfig(cfg);
115
46
  },
116
47
  createModel(params) {
117
- const modelType = (params.modelConfig ?? {}).modelType ?? "tdt";
118
- if (modelType === "ctc")
119
- return createParakeetModel(params, "model");
120
- if (modelType === "sortformer")
121
- return createParakeetModel(params, "sortformer");
122
- return createParakeetModel(params, "encoder");
48
+ return createParakeetModel(params);
123
49
  },
124
50
  handlers: {
125
51
  transcribe: defineHandler({
126
52
  requestSchema: transcribeRequestSchema,
127
53
  responseSchema: transcribeResponseSchema,
128
54
  streaming: true,
129
- // Parakeet addon exposes a model-wide hard cancel — compute is
130
- // interrupted on the currently-running transcription.
131
55
  cancel: { scope: "model", hard: true },
132
56
  handler: async function* (request) {
133
57
  if (request.metadata === true) {
@@ -160,6 +84,51 @@ export const parakeetPlugin = definePlugin({
160
84
  }
161
85
  },
162
86
  }),
87
+ transcribeStream: defineDuplexHandler({
88
+ requestSchema: transcribeStreamRequestSchema,
89
+ responseSchema: transcribeStreamResponseSchema,
90
+ streaming: true,
91
+ duplex: true,
92
+ cancel: { scope: "model", hard: true },
93
+ // TODO(QVAC-17869-followup): wire `AbortSignal` through the duplex
94
+ // handler signature so the worker learns about consumer disconnects
95
+ // without depending on `inputStream.end()` (which does not fire if the
96
+ // client drops packets while TCP stays alive). Under sustained slow
97
+ // consumers, `runStreaming` may buffer between the server generator and
98
+ // the duplex RPC writer — backpressure is not yet characterised. Pair
99
+ // the fix with request-lifecycle `cancel({ requestId })` routing.
100
+ handler: async function* (request, inputStream) {
101
+ if (request.metadata === true) {
102
+ throw new TranscriptionFailedError(`Parakeet transcribeStream does not support metadata: true; only the whisper engine emits per-segment metadata.`);
103
+ }
104
+ const streamOpts = {
105
+ ...(request.parakeetStreamingConfig && {
106
+ parakeetStreamingConfig: request.parakeetStreamingConfig,
107
+ }),
108
+ };
109
+ const iterator = transcribeStream(request.modelId, inputStream, undefined, false, streamOpts, request.requestId);
110
+ for await (const value of iterator) {
111
+ if (typeof value === "object" && value !== null && "type" in value) {
112
+ if (value.type === "endOfTurn") {
113
+ yield {
114
+ type: "transcribeStream",
115
+ endOfTurn: { source: "parakeet" },
116
+ };
117
+ }
118
+ continue;
119
+ }
120
+ yield {
121
+ type: "transcribeStream",
122
+ text: value,
123
+ };
124
+ }
125
+ yield {
126
+ type: "transcribeStream",
127
+ text: "",
128
+ done: true,
129
+ };
130
+ },
131
+ }),
163
132
  },
164
133
  logging: {
165
134
  module: parakeetAddonLogging,
@@ -0,0 +1,3 @@
1
+ import type { VideoRequest, VideoStreamResponse } from "../../../../../schemas/sdcpp-config";
2
+ export declare function video(request: VideoRequest): AsyncGenerator<VideoStreamResponse>;
3
+ //# sourceMappingURL=video.d.ts.map
@@ -0,0 +1,199 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { VideoStableDiffusion } from "@qvac/diffusion-cpp";
54
+ import { getServerLogger } from "../../../../../logging/index.js";
55
+ import { getModel, getModelEntry, } from "../../../registry/model-registry.js";
56
+ import { getRequestRegistry, withRequestContext } from "../../../runtime/index.js";
57
+ import { generateServerRequestId } from "../../../runtime/request-id.js";
58
+ import { ModelOperationNotSupportedError } from "../../../../../utils/errors-server.js";
59
+ import { ModelType } from "../../../../../schemas/index.js";
60
+ // The diffusion plugin instantiates `VideoStableDiffusion` when the model is
61
+ // loaded with `modelConfig.mode === "video"` and `ImgStableDiffusion` (or
62
+ // `EsrganUpscaler`) otherwise. Those have no video `run()` shape, so we refuse
63
+ // the call upfront with a structured error rather than letting a native-addon
64
+ // error propagate.
65
+ function asVideoModel(model, modelId) {
66
+ if (model instanceof VideoStableDiffusion) {
67
+ return model;
68
+ }
69
+ const entry = getModelEntry(modelId);
70
+ const modelType = entry && !entry.isDelegated
71
+ ? entry.local.modelType
72
+ : ModelType.sdcppGeneration;
73
+ throw new ModelOperationNotSupportedError(modelId, modelType, "video", ["diffusion"], []);
74
+ }
75
+ export async function* video(request) {
76
+ const env_1 = { stack: [], error: void 0, hasError: false };
77
+ try {
78
+ const ctx = __addDisposableResource(env_1, getRequestRegistry().begin({
79
+ requestId: request.requestId ?? generateServerRequestId(),
80
+ kind: "diffusion",
81
+ modelId: request.modelId,
82
+ }), true);
83
+ const requestLogger = withRequestContext(getServerLogger(), ctx);
84
+ const model = asVideoModel(getModel(request.modelId), request.modelId);
85
+ const onAbort = () => {
86
+ model.cancel().catch((err) => {
87
+ requestLogger.warn(`[cancel] model.cancel() rejected during abort for modelId=${request.modelId}: ${err instanceof Error ? err.message : String(err)}`);
88
+ });
89
+ };
90
+ ctx.signal.addEventListener("abort", onAbort, { once: true });
91
+ if (ctx.signal.aborted)
92
+ onAbort();
93
+ ctx.scope.defer(() => {
94
+ ctx.signal.removeEventListener("abort", onAbort);
95
+ });
96
+ const response = await model.run({
97
+ mode: request.mode,
98
+ prompt: request.prompt,
99
+ ...(request.negative_prompt !== undefined && {
100
+ negative_prompt: request.negative_prompt,
101
+ }),
102
+ ...(request.width !== undefined && { width: request.width }),
103
+ ...(request.height !== undefined && { height: request.height }),
104
+ ...(request.video_frames !== undefined && {
105
+ video_frames: request.video_frames,
106
+ }),
107
+ ...(request.fps !== undefined && { fps: request.fps }),
108
+ ...(request.seed !== undefined && { seed: request.seed }),
109
+ ...(request.steps !== undefined && { steps: request.steps }),
110
+ ...(request.sampling_method !== undefined && {
111
+ sampling_method: request.sampling_method,
112
+ }),
113
+ ...(request.scheduler !== undefined && { scheduler: request.scheduler }),
114
+ ...(request.cfg_scale !== undefined && { cfg_scale: request.cfg_scale }),
115
+ ...(request.flow_shift !== undefined && { flow_shift: request.flow_shift }),
116
+ ...(request.high_noise_steps !== undefined && {
117
+ high_noise_steps: request.high_noise_steps,
118
+ }),
119
+ ...(request.high_noise_sampler !== undefined && {
120
+ high_noise_sampler: request.high_noise_sampler,
121
+ }),
122
+ ...(request.high_noise_scheduler !== undefined && {
123
+ high_noise_scheduler: request.high_noise_scheduler,
124
+ }),
125
+ ...(request.high_noise_cfg_scale !== undefined && {
126
+ high_noise_cfg_scale: request.high_noise_cfg_scale,
127
+ }),
128
+ ...(request.high_noise_flow_shift !== undefined && {
129
+ high_noise_flow_shift: request.high_noise_flow_shift,
130
+ }),
131
+ ...(request.moe_boundary !== undefined && {
132
+ moe_boundary: request.moe_boundary,
133
+ }),
134
+ ...(request.vace_strength !== undefined && {
135
+ vace_strength: request.vace_strength,
136
+ }),
137
+ ...(request.control_frames !== undefined && {
138
+ control_frames: request.control_frames.map((b64) => Buffer.from(b64, "base64")),
139
+ }),
140
+ ...(request.vae_tiling !== undefined && { vae_tiling: request.vae_tiling }),
141
+ ...(request.vae_tile_size !== undefined && {
142
+ vae_tile_size: request.vae_tile_size,
143
+ }),
144
+ ...(request.vae_tile_overlap !== undefined && {
145
+ vae_tile_overlap: request.vae_tile_overlap,
146
+ }),
147
+ ...(request.cache_mode !== undefined && { cache_mode: request.cache_mode }),
148
+ ...(request.cache_preset !== undefined && {
149
+ cache_preset: request.cache_preset,
150
+ }),
151
+ ...(request.cache_threshold !== undefined && {
152
+ cache_threshold: request.cache_threshold,
153
+ }),
154
+ });
155
+ let outputIndex = 0;
156
+ for await (const chunk of response.iterate()) {
157
+ if (ctx.signal.aborted)
158
+ break;
159
+ if (chunk instanceof Uint8Array) {
160
+ yield {
161
+ type: "videoStream",
162
+ data: Buffer.from(chunk).toString("base64"),
163
+ outputIndex: outputIndex++,
164
+ };
165
+ }
166
+ else if (typeof chunk === "string") {
167
+ try {
168
+ const tick = JSON.parse(chunk);
169
+ if ("step" in tick) {
170
+ yield {
171
+ type: "videoStream",
172
+ step: tick["step"],
173
+ totalSteps: tick["total"],
174
+ elapsedMs: tick["elapsed_ms"],
175
+ };
176
+ }
177
+ }
178
+ catch {
179
+ // Non-JSON string output — skip
180
+ }
181
+ }
182
+ }
183
+ const responseWithStats = response;
184
+ yield {
185
+ type: "videoStream",
186
+ done: true,
187
+ stats: responseWithStats.stats ?? undefined,
188
+ };
189
+ }
190
+ catch (e_1) {
191
+ env_1.error = e_1;
192
+ env_1.hasError = true;
193
+ }
194
+ finally {
195
+ const result_1 = __disposeResources(env_1);
196
+ if (result_1)
197
+ await result_1;
198
+ }
199
+ }