@qvac/sdk 0.9.2 → 0.10.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 (343) hide show
  1. package/NOTICE +42 -95
  2. package/dist/client/api/cancel.d.ts +1 -1
  3. package/dist/client/api/cancel.js +1 -1
  4. package/dist/client/api/completion-stream.d.ts +51 -12
  5. package/dist/client/api/completion-stream.js +129 -56
  6. package/dist/client/api/delete-cache.d.ts +1 -0
  7. package/dist/client/api/delete-cache.js +1 -0
  8. package/dist/client/api/diffusion.d.ts +17 -2
  9. package/dist/client/api/diffusion.js +21 -4
  10. package/dist/client/api/embed.d.ts +4 -0
  11. package/dist/client/api/finetune.d.ts +21 -0
  12. package/dist/client/api/get-loaded-model-info.d.ts +25 -0
  13. package/dist/client/api/get-loaded-model-info.js +36 -0
  14. package/dist/client/api/get-model-info.d.ts +9 -1
  15. package/dist/client/api/get-model-info.js +8 -0
  16. package/dist/client/api/heartbeat.d.ts +2 -2
  17. package/dist/client/api/heartbeat.js +2 -2
  18. package/dist/client/api/index.d.ts +3 -1
  19. package/dist/client/api/index.js +3 -1
  20. package/dist/client/api/invoke-plugin.d.ts +16 -0
  21. package/dist/client/api/invoke-plugin.js +16 -0
  22. package/dist/client/api/load-model.d.ts +36 -3
  23. package/dist/client/api/load-model.js +31 -10
  24. package/dist/client/api/provide.d.ts +11 -5
  25. package/dist/client/api/provide.js +11 -6
  26. package/dist/client/api/rag.d.ts +9 -0
  27. package/dist/client/api/rag.js +9 -0
  28. package/dist/client/api/registry.d.ts +26 -0
  29. package/dist/client/api/registry.js +26 -0
  30. package/dist/client/api/resume.d.ts +20 -4
  31. package/dist/client/api/resume.js +20 -4
  32. package/dist/client/api/state.d.ts +23 -0
  33. package/dist/client/api/state.js +29 -0
  34. package/dist/client/api/stop-provider.d.ts +11 -5
  35. package/dist/client/api/stop-provider.js +11 -5
  36. package/dist/client/api/suspend.d.ts +21 -3
  37. package/dist/client/api/suspend.js +21 -3
  38. package/dist/client/api/text-to-speech.d.ts +64 -6
  39. package/dist/client/api/text-to-speech.js +423 -47
  40. package/dist/client/api/transcribe.d.ts +29 -4
  41. package/dist/client/api/transcribe.js +86 -28
  42. package/dist/client/api/translate.d.ts +1 -0
  43. package/dist/client/api/translate.js +1 -0
  44. package/dist/client/rpc/bare-client.js +22 -1
  45. package/dist/client/rpc/expo-rpc-client.d.ts +1 -1
  46. package/dist/client/rpc/expo-rpc-client.js +96 -4
  47. package/dist/client/rpc/node-rpc-client.js +36 -0
  48. package/dist/examples/audio/mic-input.d.ts +9 -0
  49. package/dist/examples/audio/mic-input.js +111 -0
  50. package/dist/examples/completion-events.d.ts +18 -0
  51. package/dist/examples/completion-events.js +79 -0
  52. package/dist/examples/delegated-inference/composite.js +12 -18
  53. package/dist/examples/delegated-inference/consumer-profiled.js +4 -11
  54. package/dist/examples/delegated-inference/consumer.js +8 -13
  55. package/dist/examples/delegated-inference/provider.js +11 -16
  56. package/dist/examples/diffusion-flux2-klein-img2img.d.ts +2 -0
  57. package/dist/examples/diffusion-flux2-klein-img2img.js +60 -0
  58. package/dist/examples/diffusion-flux2-klein.js +1 -0
  59. package/dist/examples/diffusion-img2img.d.ts +2 -0
  60. package/dist/examples/diffusion-img2img.js +49 -0
  61. package/dist/examples/diffusion-txt2img.js +2 -1
  62. package/dist/examples/kv-cache-example.js +11 -12
  63. package/dist/examples/llamacpp-cache.d.ts +2 -0
  64. package/dist/examples/llamacpp-cache.js +107 -0
  65. package/dist/examples/llamacpp-dynamic-tools.d.ts +2 -0
  66. package/dist/examples/llamacpp-dynamic-tools.js +144 -0
  67. package/dist/examples/llamacpp-structured-output.d.ts +2 -0
  68. package/dist/examples/llamacpp-structured-output.js +106 -0
  69. package/dist/examples/plugins.js +4 -4
  70. package/dist/examples/suspend-resume.js +21 -4
  71. package/dist/examples/{llamacpp-native-tools.js → tools/llamacpp-native-tools.js} +6 -55
  72. package/dist/examples/tools/llamacpp-tools-harmony-multiturn.d.ts +2 -0
  73. package/dist/examples/tools/llamacpp-tools-harmony-multiturn.js +81 -0
  74. package/dist/examples/tools/llamacpp-tools-pythonic.d.ts +2 -0
  75. package/dist/examples/tools/llamacpp-tools-pythonic.js +50 -0
  76. package/dist/examples/tools/shared.d.ts +21 -0
  77. package/dist/examples/tools/shared.js +42 -0
  78. package/dist/examples/transcription/parakeet-microphone-record.js +6 -33
  79. package/dist/examples/transcription/whispercpp-filesystem-streaming.js +7 -5
  80. package/dist/examples/transcription/whispercpp-filesystem.js +12 -3
  81. package/dist/examples/transcription/whispercpp-microphone-record.js +6 -29
  82. package/dist/examples/translation/translation-stream.js +5 -5
  83. package/dist/examples/tts/llm-to-tts-streaming.d.ts +16 -0
  84. package/dist/examples/tts/llm-to-tts-streaming.js +143 -0
  85. package/dist/examples/tts/supertonic-multilingual.js +3 -3
  86. package/dist/examples/tts/supertonic.js +3 -3
  87. package/dist/examples/tts/utils.d.ts +11 -1
  88. package/dist/examples/tts/utils.js +70 -17
  89. package/dist/examples/voice-assistant/voice-assistant.d.ts +2 -0
  90. package/dist/examples/voice-assistant/voice-assistant.js +207 -0
  91. package/dist/expo/plugins/withMobileBundle.js +1 -1
  92. package/dist/index.d.ts +2 -2
  93. package/dist/index.js +2 -2
  94. package/dist/logging/logger.d.ts +11 -0
  95. package/dist/logging/logger.js +11 -0
  96. package/dist/logging/types.d.ts +18 -0
  97. package/dist/models/registry/models.d.ts +6973 -7457
  98. package/dist/models/registry/models.js +6889 -6855
  99. package/dist/models/update-models/codegen.js +84 -23
  100. package/dist/models/update-models/companions.d.ts +18 -0
  101. package/dist/models/update-models/companions.js +175 -0
  102. package/dist/models/update-models/naming.js +0 -25
  103. package/dist/models/update-models/registry.d.ts +1 -0
  104. package/dist/models/update-models/registry.js +23 -3
  105. package/dist/models/update-models/types.d.ts +37 -9
  106. package/dist/profiling/index.d.ts +49 -0
  107. package/dist/profiling/index.js +49 -0
  108. package/dist/schemas/cancel.d.ts +6 -2
  109. package/dist/schemas/cancel.js +14 -7
  110. package/dist/schemas/common.d.ts +354 -271
  111. package/dist/schemas/common.js +26 -5
  112. package/dist/schemas/completion-event.d.ts +225 -0
  113. package/dist/schemas/completion-event.js +79 -0
  114. package/dist/schemas/completion-stream.d.ts +126 -31
  115. package/dist/schemas/completion-stream.js +138 -36
  116. package/dist/schemas/delegate.d.ts +0 -2
  117. package/dist/schemas/delegate.js +25 -6
  118. package/dist/schemas/download-asset.d.ts +5 -5
  119. package/dist/schemas/embed.js +21 -9
  120. package/dist/schemas/engine-addon-map.d.ts +11 -1
  121. package/dist/schemas/engine-addon-map.js +2 -2
  122. package/dist/schemas/get-loaded-model-info.d.ts +52 -0
  123. package/dist/schemas/get-loaded-model-info.js +44 -0
  124. package/dist/schemas/get-model-info.d.ts +2 -2
  125. package/dist/schemas/get-model-info.js +103 -32
  126. package/dist/schemas/heartbeat.d.ts +0 -1
  127. package/dist/schemas/index.d.ts +4 -1
  128. package/dist/schemas/index.js +4 -1
  129. package/dist/schemas/llamacpp-config.d.ts +14 -4
  130. package/dist/schemas/llamacpp-config.js +5 -0
  131. package/dist/schemas/load-model.d.ts +3233 -1260
  132. package/dist/schemas/load-model.js +23 -16
  133. package/dist/schemas/model-src-utils.d.ts +7 -6
  134. package/dist/schemas/model-src-utils.js +27 -1
  135. package/dist/schemas/model-types.d.ts +4 -4
  136. package/dist/schemas/ocr.d.ts +1 -1
  137. package/dist/schemas/plugin.d.ts +27 -3
  138. package/dist/schemas/plugin.js +27 -2
  139. package/dist/schemas/profiling.js +11 -3
  140. package/dist/schemas/provide.d.ts +1 -3
  141. package/dist/schemas/provide.js +0 -3
  142. package/dist/schemas/rag.d.ts +4 -4
  143. package/dist/schemas/registry.d.ts +10 -10
  144. package/dist/schemas/registry.js +36 -14
  145. package/dist/schemas/reload-config.d.ts +73 -7
  146. package/dist/schemas/sdcpp-config.d.ts +16 -8
  147. package/dist/schemas/sdcpp-config.js +118 -25
  148. package/dist/schemas/sdk-config.d.ts +116 -90
  149. package/dist/schemas/sdk-config.js +16 -0
  150. package/dist/schemas/sdk-errors-client.d.ts +3 -0
  151. package/dist/schemas/sdk-errors-client.js +16 -1
  152. package/dist/schemas/sdk-errors-server.d.ts +3 -0
  153. package/dist/schemas/sdk-errors-server.js +23 -0
  154. package/dist/schemas/state.d.ts +23 -0
  155. package/dist/schemas/state.js +14 -0
  156. package/dist/schemas/stop-provide.d.ts +0 -5
  157. package/dist/schemas/stop-provide.js +2 -6
  158. package/dist/schemas/text-to-speech.d.ts +93 -27
  159. package/dist/schemas/text-to-speech.js +27 -0
  160. package/dist/schemas/tools.d.ts +16 -0
  161. package/dist/schemas/tools.js +15 -0
  162. package/dist/schemas/transcription-config.d.ts +8 -8
  163. package/dist/schemas/transcription.d.ts +33 -0
  164. package/dist/schemas/transcription.js +9 -0
  165. package/dist/schemas/translate.js +59 -19
  166. package/dist/schemas/translation-config.d.ts +157 -133
  167. package/dist/schemas/translation-config.js +34 -11
  168. package/dist/server/bare/delegate-rpc-client.d.ts +1 -1
  169. package/dist/server/bare/delegate-rpc-client.js +131 -122
  170. package/dist/server/bare/hyperswarm.d.ts +2 -2
  171. package/dist/server/bare/hyperswarm.js +12 -7
  172. package/dist/server/bare/ops/cancel.js +7 -0
  173. package/dist/server/bare/ops/kv-cache-utils.d.ts +7 -10
  174. package/dist/server/bare/ops/kv-cache-utils.js +31 -40
  175. package/dist/server/bare/ops/load-model.js +0 -1
  176. package/dist/server/bare/ops/transcribe.d.ts +11 -4
  177. package/dist/server/bare/ops/transcribe.js +25 -4
  178. package/dist/server/bare/ops/translate.js +42 -4
  179. package/dist/server/bare/ops/unload-model.js +21 -19
  180. package/dist/server/bare/plugins/llamacpp-completion/ops/cache-logger.js +1 -2
  181. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.d.ts +13 -8
  182. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +257 -85
  183. package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-state.d.ts +101 -0
  184. package/dist/server/bare/plugins/llamacpp-completion/ops/kv-cache-state.js +135 -0
  185. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +80 -22
  186. package/dist/server/bare/plugins/llamacpp-completion/plugin.js +57 -32
  187. package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +10 -16
  188. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +69 -44
  189. package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +54 -116
  190. package/dist/server/bare/plugins/nmtcpp-translation/resolve-vocab.d.ts +32 -0
  191. package/dist/server/bare/plugins/nmtcpp-translation/resolve-vocab.js +117 -0
  192. package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +1 -1
  193. package/dist/server/bare/plugins/onnx-ocr/plugin.js +1 -2
  194. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech-stream.d.ts +7 -0
  195. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech-stream.js +116 -0
  196. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech.d.ts +2 -3
  197. package/dist/server/bare/plugins/onnx-tts/ops/text-to-speech.js +71 -9
  198. package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +41 -13
  199. package/dist/server/bare/plugins/onnx-tts/plugin.js +48 -3
  200. package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +15 -7
  201. package/dist/server/bare/plugins/parakeet-transcription/plugin.js +5 -6
  202. package/dist/server/bare/plugins/sdcpp-generation/ops/diffusion.js +6 -0
  203. package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +8 -5
  204. package/dist/server/bare/plugins/sdcpp-generation/plugin.js +13 -13
  205. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +17 -1
  206. package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +40 -17
  207. package/dist/server/bare/registry/config-registry.js +14 -3
  208. package/dist/server/bare/registry/model-registry.d.ts +8 -10
  209. package/dist/server/bare/registry/model-registry.js +17 -12
  210. package/dist/server/bare/registry/registry-client.js +79 -19
  211. package/dist/server/bare/runtime-lifecycle.d.ts +2 -1
  212. package/dist/server/bare/runtime-lifecycle.js +13 -2
  213. package/dist/server/bare/types/addon-responses.d.ts +8 -3
  214. package/dist/server/bare/utils/transcribe-metadata.d.ts +21 -0
  215. package/dist/server/bare/utils/transcribe-metadata.js +28 -0
  216. package/dist/server/bare/utils/tts-stats.d.ts +22 -0
  217. package/dist/server/bare/utils/tts-stats.js +10 -0
  218. package/dist/server/rpc/create-server.d.ts +4 -1
  219. package/dist/server/rpc/create-server.js +5 -1
  220. package/dist/server/rpc/delegate-transport.js +36 -29
  221. package/dist/server/rpc/handle-request.js +28 -3
  222. package/dist/server/rpc/handler-registry.js +7 -1
  223. package/dist/server/rpc/handler-utils.d.ts +5 -0
  224. package/dist/server/rpc/handler-utils.js +22 -0
  225. package/dist/server/rpc/handlers/cancel-delegated.js +3 -5
  226. package/dist/server/rpc/handlers/cancelHandler.js +4 -5
  227. package/dist/server/rpc/handlers/completion-stream-delegated.js +14 -5
  228. package/dist/server/rpc/handlers/delete-cache.js +8 -3
  229. package/dist/server/rpc/handlers/download-asset.js +3 -24
  230. package/dist/server/rpc/handlers/get-loaded-model-info.d.ts +3 -0
  231. package/dist/server/rpc/handlers/get-loaded-model-info.js +39 -0
  232. package/dist/server/rpc/handlers/get-model-info.js +93 -84
  233. package/dist/server/rpc/handlers/heartbeat-delegated.js +2 -2
  234. package/dist/server/rpc/handlers/index.d.ts +6 -0
  235. package/dist/server/rpc/handlers/index.js +6 -0
  236. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +35 -9
  237. package/dist/server/rpc/handlers/load-model/download-manager.js +142 -38
  238. package/dist/server/rpc/handlers/load-model/download-stats.d.ts +5 -4
  239. package/dist/server/rpc/handlers/load-model/download-stats.js +49 -8
  240. package/dist/server/rpc/handlers/load-model/handler.js +31 -50
  241. package/dist/server/rpc/handlers/load-model/http.d.ts +2 -2
  242. package/dist/server/rpc/handlers/load-model/http.js +97 -142
  243. package/dist/server/rpc/handlers/load-model/hyperdrive.d.ts +2 -2
  244. package/dist/server/rpc/handlers/load-model/hyperdrive.js +55 -74
  245. package/dist/server/rpc/handlers/load-model/index.d.ts +0 -1
  246. package/dist/server/rpc/handlers/load-model/index.js +0 -1
  247. package/dist/server/rpc/handlers/load-model/registry-client-options.d.ts +27 -0
  248. package/dist/server/rpc/handlers/load-model/registry-client-options.js +19 -0
  249. package/dist/server/rpc/handlers/load-model/registry-companion-set.d.ts +22 -0
  250. package/dist/server/rpc/handlers/load-model/registry-companion-set.js +208 -0
  251. package/dist/server/rpc/handlers/load-model/registry-download-utils.d.ts +24 -0
  252. package/dist/server/rpc/handlers/load-model/registry-download-utils.js +114 -0
  253. package/dist/server/rpc/handlers/load-model/registry.d.ts +2 -20
  254. package/dist/server/rpc/handlers/load-model/registry.js +109 -381
  255. package/dist/server/rpc/handlers/load-model/resolve-session.d.ts +15 -0
  256. package/dist/server/rpc/handlers/load-model/resolve-session.js +61 -0
  257. package/dist/server/rpc/handlers/load-model/resolve.d.ts +3 -3
  258. package/dist/server/rpc/handlers/load-model/resolve.js +14 -23
  259. package/dist/server/rpc/handlers/load-model/types.d.ts +11 -4
  260. package/dist/server/rpc/handlers/load-model/types.js +28 -1
  261. package/dist/server/rpc/handlers/load-model-delegated.js +2 -4
  262. package/dist/server/rpc/handlers/plugin-dispatch.js +9 -5
  263. package/dist/server/rpc/handlers/plugin-invoke.js +1 -1
  264. package/dist/server/rpc/handlers/provideHandler/connection.js +13 -2
  265. package/dist/server/rpc/handlers/provideHandler/handler.js +42 -29
  266. package/dist/server/rpc/handlers/state.d.ts +3 -0
  267. package/dist/server/rpc/handlers/state.js +7 -0
  268. package/dist/server/rpc/handlers/stopProvideHandler.d.ts +2 -2
  269. package/dist/server/rpc/handlers/stopProvideHandler.js +12 -7
  270. package/dist/server/rpc/handlers/text-to-speech-stream.d.ts +3 -0
  271. package/dist/server/rpc/handlers/text-to-speech-stream.js +4 -0
  272. package/dist/server/rpc/handlers/unload-model-delegated.js +3 -3
  273. package/dist/server/rpc/profiling/operation-metrics.js +20 -0
  274. package/dist/server/rpc/rpc-utils.js +1 -1
  275. package/dist/server/rpc/transport-selector.d.ts +3 -0
  276. package/dist/server/rpc/transport-selector.js +18 -0
  277. package/dist/server/utils/cache/auto-history.d.ts +4 -0
  278. package/dist/server/utils/cache/auto-history.js +22 -0
  279. package/dist/server/utils/{cache.d.ts → cache/paths.d.ts} +22 -5
  280. package/dist/server/utils/{cache.js → cache/paths.js} +36 -20
  281. package/dist/server/utils/cache/types.d.ts +8 -0
  282. package/dist/server/utils/cache/types.js +1 -0
  283. package/dist/server/utils/checksum.d.ts +2 -2
  284. package/dist/server/utils/checksum.js +1 -1
  285. package/dist/server/utils/clear-storage.d.ts +5 -0
  286. package/dist/server/utils/clear-storage.js +17 -0
  287. package/dist/server/utils/completion-normalizer.d.ts +17 -0
  288. package/dist/server/utils/completion-normalizer.js +413 -0
  289. package/dist/server/utils/expand-gguf-shards.d.ts +3 -0
  290. package/dist/server/utils/expand-gguf-shards.js +22 -0
  291. package/dist/server/utils/formatting.js +1 -1
  292. package/dist/server/utils/index.d.ts +4 -2
  293. package/dist/server/utils/index.js +4 -2
  294. package/dist/server/utils/qvac-paths.d.ts +2 -0
  295. package/dist/server/utils/qvac-paths.js +5 -0
  296. package/dist/server/utils/response-format.d.ts +3 -0
  297. package/dist/server/utils/response-format.js +20 -0
  298. package/dist/server/utils/tool-integration.d.ts +15 -4
  299. package/dist/server/utils/tool-integration.js +21 -41
  300. package/dist/server/utils/tools/dialect.d.ts +8 -0
  301. package/dist/server/utils/tools/dialect.js +14 -0
  302. package/dist/server/utils/tools/index.d.ts +3 -0
  303. package/dist/server/utils/tools/index.js +2 -0
  304. package/dist/server/utils/tools/parser.d.ts +6 -0
  305. package/dist/server/utils/tools/parser.js +46 -0
  306. package/dist/server/utils/tools/parsers/harmony.d.ts +4 -0
  307. package/dist/server/utils/tools/parsers/harmony.js +59 -0
  308. package/dist/server/utils/tools/parsers/hermes.d.ts +4 -0
  309. package/dist/server/utils/tools/parsers/hermes.js +100 -0
  310. package/dist/server/utils/tools/parsers/json.d.ts +6 -0
  311. package/dist/server/utils/tools/parsers/json.js +115 -0
  312. package/dist/server/utils/tools/parsers/pythonic.d.ts +4 -0
  313. package/dist/server/utils/tools/parsers/pythonic.js +267 -0
  314. package/dist/server/utils/tools/shared.d.ts +18 -0
  315. package/dist/server/utils/tools/shared.js +54 -0
  316. package/dist/server/utils/worker-lock.d.ts +3 -0
  317. package/dist/server/utils/worker-lock.js +67 -0
  318. package/dist/server/worker-core.d.ts +16 -1
  319. package/dist/server/worker-core.js +114 -14
  320. package/dist/utils/aggregate-events.d.ts +16 -0
  321. package/dist/utils/aggregate-events.js +52 -0
  322. package/dist/utils/cache-normalize.d.ts +10 -0
  323. package/dist/utils/cache-normalize.js +23 -0
  324. package/dist/utils/encoding.d.ts +8 -0
  325. package/dist/utils/encoding.js +13 -0
  326. package/dist/utils/errors-client.d.ts +12 -0
  327. package/dist/utils/errors-client.js +20 -0
  328. package/dist/utils/errors-server.d.ts +14 -0
  329. package/dist/utils/errors-server.js +31 -0
  330. package/dist/utils/load-model-validation.d.ts +7 -0
  331. package/dist/utils/load-model-validation.js +18 -0
  332. package/expo/plugins/patches/android-link.mjs +1 -1
  333. package/expo/plugins/patches/ios-link.mjs +1 -1
  334. package/package.json +14 -18
  335. package/dist/examples/translation/translation-opus.d.ts +0 -2
  336. package/dist/examples/translation/translation-opus.js +0 -33
  337. package/dist/server/bare/utils/loader-adapter.d.ts +0 -7
  338. package/dist/server/bare/utils/loader-adapter.js +0 -9
  339. package/dist/server/utils/model-path.d.ts +0 -5
  340. package/dist/server/utils/model-path.js +0 -7
  341. package/dist/server/utils/tool-parser.d.ts +0 -7
  342. package/dist/server/utils/tool-parser.js +0 -248
  343. /package/dist/examples/{llamacpp-native-tools.d.ts → tools/llamacpp-native-tools.d.ts} +0 -0
@@ -0,0 +1,116 @@
1
+ import { getModel } from "../../../registry/model-registry.js";
2
+ import { textToSpeechStreamRequestSchema, } from "../../../../../schemas/index.js";
3
+ import { nowMs } from "../../../../../profiling/index.js";
4
+ import { buildStreamResult, hasDefinedValues } from "../../../../../profiling/model-execution.js";
5
+ import { TextToSpeechStreamFailedError } from "../../../../../utils/errors-server.js";
6
+ import { collectTtsStats, } from "../../../utils/tts-stats.js";
7
+ function hasRunStreaming(model) {
8
+ return (typeof model === "object" &&
9
+ model !== null &&
10
+ "runStreaming" in model &&
11
+ typeof model.runStreaming === "function");
12
+ }
13
+ // Callers (e.g. LLM token deltas) may write raw Buffer chunks whose
14
+ // boundaries split a multi-byte UTF-8 codepoint. A naive `buf.toString("utf8")`
15
+ // per chunk emits U+FFFD at every split point and silently corrupts CJK,
16
+ // emoji, accented scripts, etc. before they reach the tokenizer. Keep a
17
+ // tail-buffer of at most 3 bytes spanning an incomplete trailing codepoint
18
+ // and decode only the complete-codepoint prefix of each combined chunk.
19
+ function findLastCompleteUtf8End(buf) {
20
+ const len = buf.length;
21
+ // A UTF-8 codepoint is at most 4 bytes, so a split can only dangle in
22
+ // the last 3 bytes. Scan backwards to find the most recent leading byte.
23
+ for (let i = len - 1; i >= 0 && i >= len - 3; i--) {
24
+ const b = buf[i];
25
+ if ((b & 0x80) === 0) {
26
+ // ASCII byte: everything up to and including i is complete.
27
+ return i + 1;
28
+ }
29
+ if ((b & 0xc0) === 0xc0) {
30
+ // Leading byte of a multi-byte sequence.
31
+ let expected;
32
+ if ((b & 0xe0) === 0xc0)
33
+ expected = 2;
34
+ else if ((b & 0xf0) === 0xe0)
35
+ expected = 3;
36
+ else if ((b & 0xf8) === 0xf0)
37
+ expected = 4;
38
+ else
39
+ return len; // Invalid leader; let toString emit U+FFFD.
40
+ return i + expected <= len ? len : i;
41
+ }
42
+ }
43
+ return len;
44
+ }
45
+ async function* buffersToUtf8Fragments(inputStream) {
46
+ let pending = Buffer.alloc(0);
47
+ for await (const buf of inputStream) {
48
+ const combined = pending.length === 0 ? buf : Buffer.concat([pending, buf]);
49
+ const completeEnd = findLastCompleteUtf8End(combined);
50
+ if (completeEnd > 0) {
51
+ const s = combined.subarray(0, completeEnd).toString("utf8");
52
+ if (s.length > 0) {
53
+ yield s;
54
+ }
55
+ }
56
+ pending =
57
+ completeEnd < combined.length
58
+ ? Buffer.from(combined.subarray(completeEnd))
59
+ : Buffer.alloc(0);
60
+ }
61
+ if (pending.length > 0) {
62
+ // Stream ended with a dangling partial codepoint — flush as-is so the
63
+ // tokenizer sees the replacement character rather than silently dropping
64
+ // the final byte(s).
65
+ const s = pending.toString("utf8");
66
+ if (s.length > 0) {
67
+ yield s;
68
+ }
69
+ }
70
+ }
71
+ function buildRunStreamingOptions(request) {
72
+ const o = {};
73
+ if (request.accumulateSentences !== undefined) {
74
+ o["accumulateSentences"] = request.accumulateSentences;
75
+ }
76
+ if (request.sentenceDelimiterPreset !== undefined) {
77
+ o["sentenceDelimiterPreset"] = request.sentenceDelimiterPreset;
78
+ }
79
+ if (request.maxBufferScalars !== undefined) {
80
+ o["maxBufferScalars"] = request.maxBufferScalars;
81
+ }
82
+ if (request.flushAfterMs !== undefined) {
83
+ o["flushAfterMs"] = request.flushAfterMs;
84
+ }
85
+ return o;
86
+ }
87
+ export async function* textToSpeechStream(params, inputStream) {
88
+ const request = textToSpeechStreamRequestSchema.parse(params);
89
+ const model = getModel(request.modelId);
90
+ const modelStart = nowMs();
91
+ if (!hasRunStreaming(model)) {
92
+ throw new TextToSpeechStreamFailedError("textToSpeechStream requires an ONNX TTS model with runStreaming");
93
+ }
94
+ const textSource = buffersToUtf8Fragments(inputStream);
95
+ const streamOpts = buildRunStreamingOptions(request);
96
+ const response = await model.runStreaming(textSource, Object.keys(streamOpts).length > 0 ? streamOpts : undefined);
97
+ for await (const data of response.iterate()) {
98
+ if (data.outputArray == null) {
99
+ continue;
100
+ }
101
+ const buf = Array.from(data.outputArray);
102
+ if (buf.length === 0) {
103
+ continue;
104
+ }
105
+ yield {
106
+ buffer: buf,
107
+ ...(data.chunkIndex !== undefined ? { chunkIndex: data.chunkIndex } : {}),
108
+ ...(typeof data.sentenceChunk === "string" && data.sentenceChunk.length > 0
109
+ ? { sentenceChunk: data.sentenceChunk }
110
+ : {}),
111
+ };
112
+ }
113
+ const modelExecutionMs = nowMs() - modelStart;
114
+ const stats = collectTtsStats(response);
115
+ return buildStreamResult(modelExecutionMs, hasDefinedValues(stats) ? stats : undefined);
116
+ }
@@ -1,7 +1,6 @@
1
1
  import { type TtsRequest, type TtsStats } from "../../../../../schemas/index";
2
- export declare function textToSpeech(params: TtsRequest): AsyncGenerator<{
3
- buffer: number[];
4
- }, {
2
+ import { type TtsOpYield } from "../../../utils/tts-stats";
3
+ export declare function textToSpeech(params: TtsRequest): AsyncGenerator<TtsOpYield, {
5
4
  modelExecutionMs: number;
6
5
  stats?: TtsStats;
7
6
  }>;
@@ -1,34 +1,96 @@
1
1
  import { getModel } from "../../../registry/model-registry.js";
2
- import { ttsRequestSchema } from "../../../../../schemas/index.js";
2
+ import { ttsRequestSchema, } from "../../../../../schemas/index.js";
3
3
  import { nowMs } from "../../../../../profiling/index.js";
4
4
  import { buildStreamResult, hasDefinedValues } from "../../../../../profiling/model-execution.js";
5
+ import { TextToSpeechFailedError } from "../../../../../utils/errors-server.js";
6
+ import { collectTtsStats, } from "../../../utils/tts-stats.js";
7
+ function hasRunStream(model) {
8
+ return (typeof model === "object" &&
9
+ model !== null &&
10
+ "runStream" in model &&
11
+ typeof model.runStream === "function");
12
+ }
5
13
  export async function* textToSpeech(params) {
6
- const { modelId, inputType, text, stream } = ttsRequestSchema.parse(params);
14
+ const { modelId, inputType, text, stream, sentenceStream, sentenceStreamLocale, sentenceStreamMaxChunkScalars, } = ttsRequestSchema.parse(params);
7
15
  const model = getModel(modelId);
8
16
  const modelStart = nowMs();
9
- const response = (await model.run({ input: text, inputType }));
17
+ if (sentenceStream) {
18
+ if (!hasRunStream(model)) {
19
+ throw new TextToSpeechFailedError("sentenceStream requires an ONNX TTS model with runStream (Supertonic)");
20
+ }
21
+ const streamOpts = sentenceStreamLocale !== undefined || sentenceStreamMaxChunkScalars !== undefined
22
+ ? {
23
+ ...(sentenceStreamLocale !== undefined
24
+ ? { locale: sentenceStreamLocale }
25
+ : {}),
26
+ ...(sentenceStreamMaxChunkScalars !== undefined
27
+ ? { maxChunkScalars: sentenceStreamMaxChunkScalars }
28
+ : {}),
29
+ }
30
+ : undefined;
31
+ const response = await model.runStream(text, streamOpts);
32
+ if (!stream) {
33
+ let completeBuffer = [];
34
+ for await (const data of response.iterate()) {
35
+ if (data.outputArray != null) {
36
+ completeBuffer = completeBuffer.concat(Array.from(data.outputArray));
37
+ }
38
+ }
39
+ const modelExecutionMs = nowMs() - modelStart;
40
+ const stats = collectTtsStats(response);
41
+ yield { buffer: completeBuffer };
42
+ return buildStreamResult(modelExecutionMs, hasDefinedValues(stats) ? stats : undefined);
43
+ }
44
+ for await (const data of response.iterate()) {
45
+ if (data.outputArray == null)
46
+ continue;
47
+ const buf = Array.from(data.outputArray);
48
+ if (buf.length === 0)
49
+ continue;
50
+ yield {
51
+ buffer: buf,
52
+ ...(data.chunkIndex !== undefined ? { chunkIndex: data.chunkIndex } : {}),
53
+ ...(typeof data.sentenceChunk === "string" && data.sentenceChunk.length > 0
54
+ ? { sentenceChunk: data.sentenceChunk }
55
+ : {}),
56
+ };
57
+ }
58
+ const modelExecutionMs = nowMs() - modelStart;
59
+ const stats = collectTtsStats(response);
60
+ return buildStreamResult(modelExecutionMs, hasDefinedValues(stats) ? stats : undefined);
61
+ }
62
+ const response = (await model.run({
63
+ input: text,
64
+ inputType,
65
+ }));
10
66
  if (!stream) {
11
- // Non-streaming mode: collect all chunks and return once
12
67
  let completeBuffer = [];
13
68
  for await (const data of response.iterate()) {
14
69
  completeBuffer = completeBuffer.concat(Array.from(data.outputArray));
15
70
  }
16
71
  const modelExecutionMs = nowMs() - modelStart;
17
72
  const stats = {
18
- ...(response.stats?.audioDurationMs !== undefined && { audioDuration: response.stats.audioDurationMs }),
19
- ...(response.stats?.totalSamples !== undefined && { totalSamples: response.stats.totalSamples }),
73
+ ...(response.stats?.audioDurationMs !== undefined && {
74
+ audioDuration: response.stats.audioDurationMs,
75
+ }),
76
+ ...(response.stats?.totalSamples !== undefined && {
77
+ totalSamples: response.stats.totalSamples,
78
+ }),
20
79
  };
21
80
  yield { buffer: completeBuffer };
22
81
  return buildStreamResult(modelExecutionMs, hasDefinedValues(stats) ? stats : undefined);
23
82
  }
24
- // Streaming mode: yield chunks as they arrive
25
83
  for await (const data of response.iterate()) {
26
84
  yield { buffer: Array.from(data.outputArray) };
27
85
  }
28
86
  const modelExecutionMs = nowMs() - modelStart;
29
87
  const stats = {
30
- ...(response.stats?.audioDurationMs !== undefined && { audioDuration: response.stats.audioDurationMs }),
31
- ...(response.stats?.totalSamples !== undefined && { totalSamples: response.stats.totalSamples }),
88
+ ...(response.stats?.audioDurationMs !== undefined && {
89
+ audioDuration: response.stats.audioDurationMs,
90
+ }),
91
+ ...(response.stats?.totalSamples !== undefined && {
92
+ totalSamples: response.stats.totalSamples,
93
+ }),
32
94
  };
33
95
  return buildStreamResult(modelExecutionMs, hasDefinedValues(stats) ? stats : undefined);
34
96
  }
@@ -23,6 +23,7 @@ export declare const ttsPlugin: {
23
23
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
24
24
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
25
25
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
26
+ embeddings: "embeddings";
26
27
  "llamacpp-completion": "llamacpp-completion";
27
28
  "whispercpp-transcription": "whispercpp-transcription";
28
29
  "llamacpp-embedding": "llamacpp-embedding";
@@ -33,7 +34,6 @@ export declare const ttsPlugin: {
33
34
  "sdcpp-generation": "sdcpp-generation";
34
35
  llm: "llm";
35
36
  whisper: "whisper";
36
- embeddings: "embeddings";
37
37
  nmt: "nmt";
38
38
  parakeet: "parakeet";
39
39
  tts: "tts";
@@ -53,6 +53,7 @@ export declare const ttsPlugin: {
53
53
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
54
54
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
55
55
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
56
+ embeddings: "embeddings";
56
57
  "llamacpp-completion": "llamacpp-completion";
57
58
  "whispercpp-transcription": "whispercpp-transcription";
58
59
  "llamacpp-embedding": "llamacpp-embedding";
@@ -63,7 +64,6 @@ export declare const ttsPlugin: {
63
64
  "sdcpp-generation": "sdcpp-generation";
64
65
  llm: "llm";
65
66
  whisper: "whisper";
66
- embeddings: "embeddings";
67
67
  nmt: "nmt";
68
68
  parakeet: "parakeet";
69
69
  tts: "tts";
@@ -83,6 +83,7 @@ export declare const ttsPlugin: {
83
83
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
84
84
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
85
85
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
86
+ embeddings: "embeddings";
86
87
  "llamacpp-completion": "llamacpp-completion";
87
88
  "whispercpp-transcription": "whispercpp-transcription";
88
89
  "llamacpp-embedding": "llamacpp-embedding";
@@ -93,7 +94,6 @@ export declare const ttsPlugin: {
93
94
  "sdcpp-generation": "sdcpp-generation";
94
95
  llm: "llm";
95
96
  whisper: "whisper";
96
- embeddings: "embeddings";
97
97
  nmt: "nmt";
98
98
  parakeet: "parakeet";
99
99
  tts: "tts";
@@ -113,6 +113,7 @@ export declare const ttsPlugin: {
113
113
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
114
114
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
115
115
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
116
+ embeddings: "embeddings";
116
117
  "llamacpp-completion": "llamacpp-completion";
117
118
  "whispercpp-transcription": "whispercpp-transcription";
118
119
  "llamacpp-embedding": "llamacpp-embedding";
@@ -123,7 +124,6 @@ export declare const ttsPlugin: {
123
124
  "sdcpp-generation": "sdcpp-generation";
124
125
  llm: "llm";
125
126
  whisper: "whisper";
126
- embeddings: "embeddings";
127
127
  nmt: "nmt";
128
128
  parakeet: "parakeet";
129
129
  tts: "tts";
@@ -143,6 +143,7 @@ export declare const ttsPlugin: {
143
143
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
144
144
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
145
145
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
146
+ embeddings: "embeddings";
146
147
  "llamacpp-completion": "llamacpp-completion";
147
148
  "whispercpp-transcription": "whispercpp-transcription";
148
149
  "llamacpp-embedding": "llamacpp-embedding";
@@ -153,7 +154,6 @@ export declare const ttsPlugin: {
153
154
  "sdcpp-generation": "sdcpp-generation";
154
155
  llm: "llm";
155
156
  whisper: "whisper";
156
- embeddings: "embeddings";
157
157
  nmt: "nmt";
158
158
  parakeet: "parakeet";
159
159
  tts: "tts";
@@ -173,6 +173,7 @@ export declare const ttsPlugin: {
173
173
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
174
174
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
175
175
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
176
+ embeddings: "embeddings";
176
177
  "llamacpp-completion": "llamacpp-completion";
177
178
  "whispercpp-transcription": "whispercpp-transcription";
178
179
  "llamacpp-embedding": "llamacpp-embedding";
@@ -183,7 +184,6 @@ export declare const ttsPlugin: {
183
184
  "sdcpp-generation": "sdcpp-generation";
184
185
  llm: "llm";
185
186
  whisper: "whisper";
186
- embeddings: "embeddings";
187
187
  nmt: "nmt";
188
188
  parakeet: "parakeet";
189
189
  tts: "tts";
@@ -214,6 +214,7 @@ export declare const ttsPlugin: {
214
214
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
215
215
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
216
216
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
217
+ embeddings: "embeddings";
217
218
  "llamacpp-completion": "llamacpp-completion";
218
219
  "whispercpp-transcription": "whispercpp-transcription";
219
220
  "llamacpp-embedding": "llamacpp-embedding";
@@ -224,7 +225,6 @@ export declare const ttsPlugin: {
224
225
  "sdcpp-generation": "sdcpp-generation";
225
226
  llm: "llm";
226
227
  whisper: "whisper";
227
- embeddings: "embeddings";
228
228
  nmt: "nmt";
229
229
  parakeet: "parakeet";
230
230
  tts: "tts";
@@ -244,6 +244,7 @@ export declare const ttsPlugin: {
244
244
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
245
245
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
246
246
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
247
+ embeddings: "embeddings";
247
248
  "llamacpp-completion": "llamacpp-completion";
248
249
  "whispercpp-transcription": "whispercpp-transcription";
249
250
  "llamacpp-embedding": "llamacpp-embedding";
@@ -254,7 +255,6 @@ export declare const ttsPlugin: {
254
255
  "sdcpp-generation": "sdcpp-generation";
255
256
  llm: "llm";
256
257
  whisper: "whisper";
257
- embeddings: "embeddings";
258
258
  nmt: "nmt";
259
259
  parakeet: "parakeet";
260
260
  tts: "tts";
@@ -274,6 +274,7 @@ export declare const ttsPlugin: {
274
274
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
275
275
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
276
276
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
277
+ embeddings: "embeddings";
277
278
  "llamacpp-completion": "llamacpp-completion";
278
279
  "whispercpp-transcription": "whispercpp-transcription";
279
280
  "llamacpp-embedding": "llamacpp-embedding";
@@ -284,7 +285,6 @@ export declare const ttsPlugin: {
284
285
  "sdcpp-generation": "sdcpp-generation";
285
286
  llm: "llm";
286
287
  whisper: "whisper";
287
- embeddings: "embeddings";
288
288
  nmt: "nmt";
289
289
  parakeet: "parakeet";
290
290
  tts: "tts";
@@ -304,6 +304,7 @@ export declare const ttsPlugin: {
304
304
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
305
305
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
306
306
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
307
+ embeddings: "embeddings";
307
308
  "llamacpp-completion": "llamacpp-completion";
308
309
  "whispercpp-transcription": "whispercpp-transcription";
309
310
  "llamacpp-embedding": "llamacpp-embedding";
@@ -314,7 +315,6 @@ export declare const ttsPlugin: {
314
315
  "sdcpp-generation": "sdcpp-generation";
315
316
  llm: "llm";
316
317
  whisper: "whisper";
317
- embeddings: "embeddings";
318
318
  nmt: "nmt";
319
319
  parakeet: "parakeet";
320
320
  tts: "tts";
@@ -334,6 +334,7 @@ export declare const ttsPlugin: {
334
334
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
335
335
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
336
336
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
337
+ embeddings: "embeddings";
337
338
  "llamacpp-completion": "llamacpp-completion";
338
339
  "whispercpp-transcription": "whispercpp-transcription";
339
340
  "llamacpp-embedding": "llamacpp-embedding";
@@ -344,7 +345,6 @@ export declare const ttsPlugin: {
344
345
  "sdcpp-generation": "sdcpp-generation";
345
346
  llm: "llm";
346
347
  whisper: "whisper";
347
- embeddings: "embeddings";
348
348
  nmt: "nmt";
349
349
  parakeet: "parakeet";
350
350
  tts: "tts";
@@ -364,6 +364,7 @@ export declare const ttsPlugin: {
364
364
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
365
365
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
366
366
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
367
+ embeddings: "embeddings";
367
368
  "llamacpp-completion": "llamacpp-completion";
368
369
  "whispercpp-transcription": "whispercpp-transcription";
369
370
  "llamacpp-embedding": "llamacpp-embedding";
@@ -374,7 +375,6 @@ export declare const ttsPlugin: {
374
375
  "sdcpp-generation": "sdcpp-generation";
375
376
  llm: "llm";
376
377
  whisper: "whisper";
377
- embeddings: "embeddings";
378
378
  nmt: "nmt";
379
379
  parakeet: "parakeet";
380
380
  tts: "tts";
@@ -394,6 +394,7 @@ export declare const ttsPlugin: {
394
394
  expectedSize: import("zod").ZodOptional<import("zod").ZodNumber>;
395
395
  sha256Checksum: import("zod").ZodOptional<import("zod").ZodString>;
396
396
  addon: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodEnum<{
397
+ embeddings: "embeddings";
397
398
  "llamacpp-completion": "llamacpp-completion";
398
399
  "whispercpp-transcription": "whispercpp-transcription";
399
400
  "llamacpp-embedding": "llamacpp-embedding";
@@ -404,7 +405,6 @@ export declare const ttsPlugin: {
404
405
  "sdcpp-generation": "sdcpp-generation";
405
406
  llm: "llm";
406
407
  whisper: "whisper";
407
- embeddings: "embeddings";
408
408
  nmt: "nmt";
409
409
  parakeet: "parakeet";
410
410
  tts: "tts";
@@ -443,6 +443,9 @@ export declare const ttsPlugin: {
443
443
  inputType: import("zod").ZodDefault<import("zod").ZodString>;
444
444
  text: import("zod").ZodString;
445
445
  stream: import("zod").ZodDefault<import("zod").ZodBoolean>;
446
+ sentenceStream: import("zod").ZodDefault<import("zod").ZodBoolean>;
447
+ sentenceStreamLocale: import("zod").ZodOptional<import("zod").ZodString>;
448
+ sentenceStreamMaxChunkScalars: import("zod").ZodOptional<import("zod").ZodNumber>;
446
449
  type: import("zod").ZodLiteral<"textToSpeech">;
447
450
  }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
448
451
  type: import("zod").ZodLiteral<"textToSpeech">;
@@ -452,6 +455,31 @@ export declare const ttsPlugin: {
452
455
  audioDuration: import("zod").ZodOptional<import("zod").ZodNumber>;
453
456
  totalSamples: import("zod").ZodOptional<import("zod").ZodNumber>;
454
457
  }, import("zod/v4/core").$strip>>;
458
+ chunkIndex: import("zod").ZodOptional<import("zod").ZodNumber>;
459
+ sentenceChunk: import("zod").ZodOptional<import("zod").ZodString>;
460
+ }, import("zod/v4/core").$strip>>;
461
+ textToSpeechStream: import("../../../../schemas/index").PluginHandlerDefinition<import("zod").ZodObject<{
462
+ modelId: import("zod").ZodString;
463
+ inputType: import("zod").ZodDefault<import("zod").ZodString>;
464
+ accumulateSentences: import("zod").ZodOptional<import("zod").ZodBoolean>;
465
+ sentenceDelimiterPreset: import("zod").ZodOptional<import("zod").ZodEnum<{
466
+ latin: "latin";
467
+ cjk: "cjk";
468
+ multilingual: "multilingual";
469
+ }>>;
470
+ maxBufferScalars: import("zod").ZodOptional<import("zod").ZodNumber>;
471
+ flushAfterMs: import("zod").ZodOptional<import("zod").ZodNumber>;
472
+ type: import("zod").ZodLiteral<"textToSpeechStream">;
473
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
474
+ type: import("zod").ZodLiteral<"textToSpeechStream">;
475
+ buffer: import("zod").ZodArray<import("zod").ZodNumber>;
476
+ done: import("zod").ZodDefault<import("zod").ZodBoolean>;
477
+ stats: import("zod").ZodOptional<import("zod").ZodObject<{
478
+ audioDuration: import("zod").ZodOptional<import("zod").ZodNumber>;
479
+ totalSamples: import("zod").ZodOptional<import("zod").ZodNumber>;
480
+ }, import("zod/v4/core").$strip>>;
481
+ chunkIndex: import("zod").ZodOptional<import("zod").ZodNumber>;
482
+ sentenceChunk: import("zod").ZodOptional<import("zod").ZodString>;
455
483
  }, import("zod/v4/core").$strip>>;
456
484
  };
457
485
  logging: {
@@ -1,10 +1,11 @@
1
1
  import path from "bare-path";
2
2
  import ttsAddonLogging from "@qvac/tts-onnx/addonLogging.js";
3
3
  import ONNXTTS from "@qvac/tts-onnx";
4
- import { definePlugin, defineHandler, ttsRequestSchema, ttsResponseSchema, ModelType, ttsConfigSchema, ADDON_TTS, } from "../../../../schemas/index.js";
4
+ import { definePlugin, defineHandler, defineDuplexHandler, ttsRequestSchema, ttsResponseSchema, textToSpeechStreamRequestSchema, textToSpeechStreamResponseSchema, ModelType, ttsConfigSchema, ADDON_TTS, } from "../../../../schemas/index.js";
5
5
  import { createStreamLogger, registerAddonLogger } from "../../../../logging/index.js";
6
6
  import { TtsArtifactsRequiredError, TtsReferenceAudioRequiredError, } from "../../../../utils/errors-server.js";
7
7
  import { textToSpeech } from "./ops/text-to-speech.js";
8
+ import { textToSpeechStream } from "./ops/text-to-speech-stream.js";
8
9
  import { attachModelExecutionMs } from "../../../../profiling/model-execution.js";
9
10
  import { loadReferenceAudioAt24k } from "./wav-helper.js";
10
11
  async function resolveChatterboxConfig(config, ctx) {
@@ -118,7 +119,7 @@ function createChatterboxModel(modelId, config, artifacts) {
118
119
  opts: { stats: true },
119
120
  exclusiveRun: true,
120
121
  });
121
- return { model, loader: undefined };
122
+ return { model };
122
123
  }
123
124
  function createSupertonicModel(modelId, config, artifacts) {
124
125
  const textEncoderPath = artifacts["textEncoderPath"];
@@ -160,7 +161,7 @@ function createSupertonicModel(modelId, config, artifacts) {
160
161
  opts: { stats: true },
161
162
  exclusiveRun: true,
162
163
  });
163
- return { model, loader: undefined };
164
+ return { model };
164
165
  }
165
166
  export const ttsPlugin = definePlugin({
166
167
  modelType: ModelType.onnxTts,
@@ -197,6 +198,13 @@ export const ttsPlugin = definePlugin({
197
198
  type: "textToSpeech",
198
199
  buffer: result.value.buffer,
199
200
  done: false,
201
+ ...(result.value.chunkIndex !== undefined
202
+ ? { chunkIndex: result.value.chunkIndex }
203
+ : {}),
204
+ ...(typeof result.value.sentenceChunk === "string" &&
205
+ result.value.sentenceChunk.length > 0
206
+ ? { sentenceChunk: result.value.sentenceChunk }
207
+ : {}),
200
208
  };
201
209
  result = await stream.next();
202
210
  }
@@ -213,6 +221,43 @@ export const ttsPlugin = definePlugin({
213
221
  }
214
222
  },
215
223
  }),
224
+ textToSpeechStream: defineDuplexHandler({
225
+ requestSchema: textToSpeechStreamRequestSchema,
226
+ responseSchema: textToSpeechStreamResponseSchema,
227
+ streaming: true,
228
+ duplex: true,
229
+ handler: async function* (request, inputStream) {
230
+ const stream = textToSpeechStream(request, inputStream);
231
+ try {
232
+ let result = await stream.next();
233
+ while (!result.done) {
234
+ yield {
235
+ type: "textToSpeechStream",
236
+ buffer: result.value.buffer,
237
+ done: false,
238
+ ...(result.value.chunkIndex !== undefined
239
+ ? { chunkIndex: result.value.chunkIndex }
240
+ : {}),
241
+ ...(typeof result.value.sentenceChunk === "string" &&
242
+ result.value.sentenceChunk.length > 0
243
+ ? { sentenceChunk: result.value.sentenceChunk }
244
+ : {}),
245
+ };
246
+ result = await stream.next();
247
+ }
248
+ const { modelExecutionMs, stats } = result.value;
249
+ yield attachModelExecutionMs({
250
+ type: "textToSpeechStream",
251
+ buffer: [],
252
+ done: true,
253
+ ...(stats && { stats }),
254
+ }, modelExecutionMs);
255
+ }
256
+ finally {
257
+ await stream.return?.(undefined);
258
+ }
259
+ },
260
+ }),
216
261
  },
217
262
  logging: {
218
263
  module: ttsAddonLogging,