@qvac/sdk 0.6.1 → 0.7.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 (277) hide show
  1. package/LICENSE +1 -24
  2. package/NOTICE +632 -0
  3. package/README.md +2 -1
  4. package/dist/client/api/embed.js +1 -4
  5. package/dist/client/api/get-model-info.d.ts +10 -3
  6. package/dist/client/api/index.d.ts +2 -0
  7. package/dist/client/api/index.js +2 -0
  8. package/dist/client/api/invoke-plugin.d.ts +14 -0
  9. package/dist/client/api/invoke-plugin.js +38 -0
  10. package/dist/client/api/registry.d.ts +14 -0
  11. package/dist/client/api/registry.js +37 -0
  12. package/dist/client/api/transcribe.js +0 -4
  13. package/dist/client/api/unload-model.js +1 -1
  14. package/dist/client/config-loader/resolve-config.node.d.ts +3 -2
  15. package/dist/client/config-loader/resolve-config.node.js +31 -4
  16. package/dist/client/init-hooks.js +2 -1
  17. package/dist/client/rpc/bare-client.d.ts +2 -0
  18. package/dist/client/rpc/bare-client.js +48 -7
  19. package/dist/client/rpc/expo-device-info.d.ts +6 -0
  20. package/dist/client/rpc/expo-device-info.js +32 -0
  21. package/dist/client/rpc/expo-rpc-client.js +9 -32
  22. package/dist/client/rpc/node-rpc-client.d.ts +1 -1
  23. package/dist/client/rpc/node-rpc-client.js +201 -28
  24. package/dist/client/rpc/rpc-client.d.ts +1 -1
  25. package/dist/client/rpc/rpc-client.js +2 -2
  26. package/dist/constants/index.d.ts +1 -0
  27. package/dist/constants/index.js +1 -0
  28. package/dist/constants/registry.d.ts +2 -0
  29. package/dist/constants/registry.js +1 -0
  30. package/dist/examples/cache-management.js +2 -2
  31. package/dist/examples/config/plugins/plugins.config.d.ts +5 -0
  32. package/dist/examples/config/plugins/plugins.config.js +4 -0
  33. package/dist/examples/download-with-blind-relays.js +1 -1
  34. package/dist/examples/llamacpp-multimodal.js +3 -3
  35. package/dist/examples/llamacpp-native-tools.js +2 -2
  36. package/dist/examples/mcp-websearch.js +2 -2
  37. package/dist/examples/multi-model-demo.js +2 -2
  38. package/dist/examples/ocr-fasttext.js +4 -4
  39. package/dist/examples/parallel-download.js +2 -2
  40. package/dist/examples/plugins.d.ts +14 -0
  41. package/dist/examples/plugins.js +129 -0
  42. package/dist/examples/registry-query.d.ts +2 -0
  43. package/dist/examples/registry-query.js +87 -0
  44. package/dist/examples/translation/translation-bergamot-batch.js +2 -2
  45. package/dist/examples/translation/translation-bergamot.js +4 -4
  46. package/dist/examples/translation/translation-opus.js +2 -2
  47. package/dist/examples/translation/translation-stream.js +2 -2
  48. package/dist/examples/tts/chatterbox.d.ts +2 -0
  49. package/dist/examples/tts/chatterbox.js +59 -0
  50. package/dist/examples/tts/supertonic.d.ts +2 -0
  51. package/dist/examples/tts/supertonic.js +51 -0
  52. package/dist/examples/tts/utils.d.ts +17 -0
  53. package/dist/examples/tts/utils.js +93 -0
  54. package/dist/examples/whispercpp-filesystem.js +2 -3
  55. package/dist/examples/whispercpp-microphone-record.js +1 -2
  56. package/dist/examples/whispercpp-prompt.js +2 -3
  57. package/dist/expo/plugins/index.d.ts +3 -0
  58. package/dist/expo/plugins/index.js +3 -0
  59. package/dist/expo/plugins/resolve-sdk-package-dir.d.ts +15 -0
  60. package/dist/expo/plugins/resolve-sdk-package-dir.js +31 -0
  61. package/dist/expo/plugins/withAndroidArchitecture.d.ts +8 -0
  62. package/dist/expo/plugins/withAndroidArchitecture.js +52 -0
  63. package/dist/expo/plugins/withAndroidNdkVersion.d.ts +8 -0
  64. package/dist/expo/plugins/withAndroidNdkVersion.js +31 -0
  65. package/dist/expo/plugins/withDeviceInfo.d.ts +10 -0
  66. package/dist/expo/plugins/withDeviceInfo.js +48 -0
  67. package/dist/expo/plugins/withMobileBundle.d.ts +5 -2
  68. package/dist/expo/plugins/withMobileBundle.js +121 -65
  69. package/dist/expo/plugins/withQvacSDK.d.ts +4 -0
  70. package/dist/expo/plugins/withQvacSDK.js +26 -1
  71. package/dist/index.d.ts +4 -4
  72. package/dist/index.js +5 -5
  73. package/dist/models/{hyperdrive → registry}/index.js +1 -1
  74. package/dist/models/registry/models.d.ts +9056 -0
  75. package/dist/models/registry/models.js +9351 -0
  76. package/dist/models/update-models/codegen.d.ts +3 -0
  77. package/dist/models/update-models/codegen.js +135 -0
  78. package/dist/models/update-models/history.d.ts +13 -0
  79. package/dist/models/update-models/history.js +88 -0
  80. package/dist/models/update-models/index.d.ts +2 -0
  81. package/dist/models/update-models/index.js +124 -0
  82. package/dist/models/update-models/naming.d.ts +4 -0
  83. package/dist/models/update-models/naming.js +314 -0
  84. package/dist/models/update-models/processing.d.ts +8 -0
  85. package/dist/models/update-models/processing.js +67 -0
  86. package/dist/models/update-models/registry.d.ts +4 -0
  87. package/dist/models/update-models/registry.js +67 -0
  88. package/dist/models/update-models/shards.d.ts +4 -0
  89. package/dist/models/update-models/shards.js +57 -0
  90. package/dist/models/update-models/types.d.ts +60 -0
  91. package/dist/models/update-models/types.js +1 -0
  92. package/dist/models/update-models/utils.d.ts +3 -0
  93. package/dist/models/update-models/utils.js +21 -0
  94. package/dist/pear/pre.d.ts +18 -0
  95. package/dist/pear/pre.js +433 -0
  96. package/dist/schemas/common.d.ts +286 -32
  97. package/dist/schemas/common.js +12 -0
  98. package/dist/schemas/download-asset.d.ts +35 -11
  99. package/dist/schemas/download-asset.js +5 -1
  100. package/dist/schemas/engine-addon-map.d.ts +5 -0
  101. package/dist/schemas/engine-addon-map.js +49 -0
  102. package/dist/schemas/get-model-info.d.ts +32 -16
  103. package/dist/schemas/get-model-info.js +17 -8
  104. package/dist/schemas/index.d.ts +4 -1
  105. package/dist/schemas/index.js +4 -4
  106. package/dist/schemas/load-model.d.ts +2224 -900
  107. package/dist/schemas/load-model.js +130 -25
  108. package/dist/schemas/model-src-utils.d.ts +30 -12
  109. package/dist/schemas/model-src-utils.js +5 -2
  110. package/dist/schemas/model-types.d.ts +15 -4
  111. package/dist/schemas/model-types.js +21 -4
  112. package/dist/schemas/path-validation.d.ts +10 -0
  113. package/dist/schemas/path-validation.js +22 -0
  114. package/dist/schemas/plugin.d.ts +180 -0
  115. package/dist/schemas/plugin.js +132 -0
  116. package/dist/schemas/rag.d.ts +2 -2
  117. package/dist/schemas/rag.js +7 -3
  118. package/dist/schemas/registry.d.ts +338 -0
  119. package/dist/schemas/registry.js +91 -0
  120. package/dist/schemas/sdk-errors-client.d.ts +6 -6
  121. package/dist/schemas/sdk-errors-client.js +15 -15
  122. package/dist/schemas/sdk-errors-registry.d.ts +6 -0
  123. package/dist/schemas/sdk-errors-registry.js +8 -0
  124. package/dist/schemas/sdk-errors-server.d.ts +16 -2
  125. package/dist/schemas/sdk-errors-server.js +90 -10
  126. package/dist/schemas/text-to-speech.d.ts +670 -1
  127. package/dist/schemas/text-to-speech.js +51 -2
  128. package/dist/schemas/translate.d.ts +2 -2
  129. package/dist/scripts/run-security-tests-bare.d.ts +2 -0
  130. package/dist/scripts/run-security-tests-bare.js +78 -0
  131. package/dist/scripts/run-security-tests.d.ts +2 -0
  132. package/dist/scripts/run-security-tests.js +22 -0
  133. package/dist/server/bare/delegate-rpc-client.d.ts +6 -0
  134. package/dist/server/bare/delegate-rpc-client.js +136 -56
  135. package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.d.ts +1 -1
  136. package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.js +3 -3
  137. package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.js +6 -6
  138. package/dist/server/bare/{addons → ops}/load-model.js +32 -42
  139. package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.d.ts +1 -1
  140. package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.js +5 -4
  141. package/dist/server/bare/plugins/index.d.ts +7 -0
  142. package/dist/server/bare/plugins/index.js +6 -0
  143. package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.js +1 -1
  144. package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.d.ts +1 -1
  145. package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.js +2 -3
  146. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +115 -0
  147. package/dist/server/bare/plugins/llamacpp-completion/plugin.js +142 -0
  148. package/dist/server/bare/plugins/llamacpp-embedding/plugin.d.ts +24 -0
  149. package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +73 -0
  150. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +45 -0
  151. package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +97 -0
  152. package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.js +2 -1
  153. package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +38 -0
  154. package/dist/server/bare/{addons/onnx-ocr/create-model.js → plugins/onnx-ocr/plugin.js} +39 -2
  155. package/dist/server/bare/{addons/onnx-tts/handlers → plugins/onnx-tts/ops}/text-to-speech.js +23 -1
  156. package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +26 -0
  157. package/dist/server/bare/plugins/onnx-tts/plugin.js +162 -0
  158. package/dist/server/bare/plugins/onnx-tts/wav-helper.d.ts +14 -0
  159. package/dist/server/bare/plugins/onnx-tts/wav-helper.js +107 -0
  160. package/dist/server/bare/plugins/whispercpp-transcription/ops/transcribe-stream.d.ts +3 -0
  161. package/dist/server/bare/{addons/whispercpp-transcription/handlers → plugins/whispercpp-transcription/ops}/transcribe-stream.js +1 -2
  162. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +31 -0
  163. package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +74 -0
  164. package/dist/server/bare/rag-hyperdb/handlers/ingest.js +1 -1
  165. package/dist/server/bare/rag-hyperdb/handlers/search.js +1 -1
  166. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +2 -1
  167. package/dist/server/bare/registry/config-registry.js +1 -1
  168. package/dist/server/bare/registry/registry-client.d.ts +5 -0
  169. package/dist/server/bare/registry/registry-client.js +37 -0
  170. package/dist/server/env.d.ts +22 -0
  171. package/dist/server/env.js +57 -0
  172. package/dist/server/plugins/index.d.ts +2 -0
  173. package/dist/server/plugins/index.js +1 -0
  174. package/dist/server/plugins/registry.d.ts +9 -0
  175. package/dist/server/plugins/registry.js +75 -0
  176. package/dist/server/rpc/delegate-transport.d.ts +11 -0
  177. package/dist/server/rpc/delegate-transport.js +60 -0
  178. package/dist/server/rpc/handle-request.d.ts +0 -9
  179. package/dist/server/rpc/handle-request.js +13 -321
  180. package/dist/server/rpc/handler-registry.d.ts +3 -0
  181. package/dist/server/rpc/handler-registry.js +84 -0
  182. package/dist/server/rpc/handler-utils.d.ts +22 -0
  183. package/dist/server/rpc/handler-utils.js +87 -0
  184. package/dist/server/rpc/handlers/cancelHandler.js +1 -1
  185. package/dist/server/rpc/handlers/completion-stream-delegated.js +1 -1
  186. package/dist/server/rpc/handlers/completion-stream.js +2 -43
  187. package/dist/server/rpc/handlers/delete-cache.js +1 -1
  188. package/dist/server/rpc/handlers/embed.js +2 -21
  189. package/dist/server/rpc/handlers/get-model-info.js +19 -15
  190. package/dist/server/rpc/handlers/index.d.ts +9 -0
  191. package/dist/server/rpc/handlers/index.js +9 -0
  192. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +1 -0
  193. package/dist/server/rpc/handlers/load-model/download-manager.js +3 -0
  194. package/dist/server/rpc/handlers/load-model/handler.js +47 -24
  195. package/dist/server/rpc/handlers/load-model/http.js +3 -2
  196. package/dist/server/rpc/handlers/load-model/hyperdrive.js +14 -10
  197. package/dist/server/rpc/handlers/load-model/registry.d.ts +10 -0
  198. package/dist/server/rpc/handlers/load-model/registry.js +571 -0
  199. package/dist/server/rpc/handlers/load-model/resolve.js +18 -5
  200. package/dist/server/rpc/handlers/load-model-delegated.js +4 -2
  201. package/dist/server/rpc/handlers/ocr-stream.js +2 -37
  202. package/dist/server/rpc/handlers/ping.d.ts +3 -0
  203. package/dist/server/rpc/handlers/ping.js +3 -0
  204. package/dist/server/rpc/handlers/plugin-dispatch.d.ts +15 -0
  205. package/dist/server/rpc/handlers/plugin-dispatch.js +54 -0
  206. package/dist/server/rpc/handlers/plugin-invoke.d.ts +4 -0
  207. package/dist/server/rpc/handlers/plugin-invoke.js +87 -0
  208. package/dist/server/rpc/handlers/registry.d.ts +5 -0
  209. package/dist/server/rpc/handlers/registry.js +157 -0
  210. package/dist/server/rpc/handlers/text-to-speech.js +2 -5
  211. package/dist/server/rpc/handlers/transcribe-stream.js +2 -30
  212. package/dist/server/rpc/handlers/translate.js +2 -42
  213. package/dist/server/rpc/handlers/unload-model.js +1 -1
  214. package/dist/server/rpc/index.d.ts +1 -1
  215. package/dist/server/utils/archive.d.ts +1 -0
  216. package/dist/server/utils/archive.js +10 -2
  217. package/dist/server/utils/cache.d.ts +5 -0
  218. package/dist/server/utils/cache.js +26 -2
  219. package/dist/server/utils/gguf-tensor-extractor.js +3 -3
  220. package/dist/server/utils/index.d.ts +1 -1
  221. package/dist/server/utils/index.js +1 -1
  222. package/dist/server/utils/path-security.d.ts +12 -0
  223. package/dist/server/utils/path-security.js +25 -0
  224. package/dist/server/utils/shard-utils.js +3 -3
  225. package/dist/server/worker-core.d.ts +6 -0
  226. package/dist/server/worker-core.js +88 -0
  227. package/dist/server/worker.d.ts +4 -5
  228. package/dist/server/worker.js +18 -116
  229. package/dist/utils/errors-client.d.ts +9 -6
  230. package/dist/utils/errors-client.js +19 -11
  231. package/dist/utils/errors-server.d.ts +44 -5
  232. package/dist/utils/errors-server.js +82 -9
  233. package/dist/utils/path-sanitize.d.ts +17 -0
  234. package/dist/utils/path-sanitize.js +54 -0
  235. package/expo/plugins/patches/android-link.mjs +63 -0
  236. package/expo/plugins/patches/ios-link.mjs +63 -0
  237. package/package.json +72 -10
  238. package/dist/examples/text-to-speech.d.ts +0 -3
  239. package/dist/examples/text-to-speech.js +0 -137
  240. package/dist/models/hyperdrive/models.d.ts +0 -4003
  241. package/dist/models/hyperdrive/models.js +0 -4282
  242. package/dist/server/bare/addons/index.d.ts +0 -4
  243. package/dist/server/bare/addons/index.js +0 -3
  244. package/dist/server/bare/addons/llamacpp-completion/create-model.d.ts +0 -8
  245. package/dist/server/bare/addons/llamacpp-completion/create-model.js +0 -43
  246. package/dist/server/bare/addons/llamacpp-completion/index.d.ts +0 -4
  247. package/dist/server/bare/addons/llamacpp-completion/index.js +0 -3
  248. package/dist/server/bare/addons/llamacpp-embedding/create-model.d.ts +0 -8
  249. package/dist/server/bare/addons/llamacpp-embedding/create-model.js +0 -38
  250. package/dist/server/bare/addons/llamacpp-embedding/index.d.ts +0 -3
  251. package/dist/server/bare/addons/llamacpp-embedding/index.js +0 -2
  252. package/dist/server/bare/addons/nmtcpp-translation/create-model.d.ts +0 -8
  253. package/dist/server/bare/addons/nmtcpp-translation/create-model.js +0 -52
  254. package/dist/server/bare/addons/nmtcpp-translation/index.d.ts +0 -3
  255. package/dist/server/bare/addons/nmtcpp-translation/index.js +0 -2
  256. package/dist/server/bare/addons/onnx-ocr/create-model.d.ts +0 -10
  257. package/dist/server/bare/addons/onnx-ocr/index.d.ts +0 -3
  258. package/dist/server/bare/addons/onnx-ocr/index.js +0 -2
  259. package/dist/server/bare/addons/onnx-tts/create-model.d.ts +0 -10
  260. package/dist/server/bare/addons/onnx-tts/create-model.js +0 -25
  261. package/dist/server/bare/addons/onnx-tts/index.d.ts +0 -3
  262. package/dist/server/bare/addons/onnx-tts/index.js +0 -2
  263. package/dist/server/bare/addons/whispercpp-transcription/create-model.d.ts +0 -10
  264. package/dist/server/bare/addons/whispercpp-transcription/create-model.js +0 -37
  265. package/dist/server/bare/addons/whispercpp-transcription/handlers/transcribe-stream.d.ts +0 -3
  266. package/dist/server/bare/addons/whispercpp-transcription/index.d.ts +0 -3
  267. package/dist/server/bare/addons/whispercpp-transcription/index.js +0 -2
  268. /package/dist/models/{hyperdrive → registry}/index.d.ts +0 -0
  269. /package/dist/server/bare/{addons → ops}/cancel.d.ts +0 -0
  270. /package/dist/server/bare/{addons → ops}/cancel.js +0 -0
  271. /package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.d.ts +0 -0
  272. /package/dist/server/bare/{addons → ops}/load-model.d.ts +0 -0
  273. /package/dist/server/bare/{addons → ops}/unload-model.d.ts +0 -0
  274. /package/dist/server/bare/{addons → ops}/unload-model.js +0 -0
  275. /package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.d.ts +0 -0
  276. /package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.d.ts +0 -0
  277. /package/dist/server/bare/{addons/onnx-tts/handlers → plugins/onnx-tts/ops}/text-to-speech.d.ts +0 -0
@@ -0,0 +1,115 @@
1
+ import { type CreateModelParams, type PluginModelResult } from "../../../../schemas/index";
2
+ export declare const llmPlugin: {
3
+ modelType: "llamacpp-completion";
4
+ displayName: string;
5
+ addonPackage: string;
6
+ createModel(params: CreateModelParams): PluginModelResult;
7
+ handlers: {
8
+ completionStream: import("../../../../schemas/index").PluginHandlerDefinition<import("zod").ZodObject<{
9
+ history: import("zod").ZodArray<import("zod").ZodObject<{
10
+ role: import("zod").ZodString;
11
+ content: import("zod").ZodString;
12
+ attachments: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
13
+ path: import("zod").ZodString;
14
+ }, import("zod/v4/core").$strip>>>;
15
+ }, import("zod/v4/core").$strip>>;
16
+ modelId: import("zod").ZodString;
17
+ tools: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
18
+ type: import("zod").ZodLiteral<"function">;
19
+ name: import("zod").ZodString;
20
+ description: import("zod").ZodString;
21
+ parameters: import("zod").ZodObject<{
22
+ type: import("zod").ZodLiteral<"object">;
23
+ properties: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodObject<{
24
+ type: import("zod").ZodEnum<{
25
+ string: "string";
26
+ number: "number";
27
+ boolean: "boolean";
28
+ object: "object";
29
+ array: "array";
30
+ integer: "integer";
31
+ }>;
32
+ description: import("zod").ZodOptional<import("zod").ZodString>;
33
+ enum: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
34
+ }, import("zod/v4/core").$strip>>;
35
+ required: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
36
+ }, import("zod/v4/core").$strip>;
37
+ }, import("zod/v4/core").$strip>>>;
38
+ stream: import("zod").ZodBoolean;
39
+ kvCache: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodBoolean, import("zod").ZodString]>>;
40
+ type: import("zod").ZodLiteral<"completionStream">;
41
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
42
+ type: import("zod").ZodLiteral<"completionStream">;
43
+ token: import("zod").ZodString;
44
+ done: import("zod").ZodOptional<import("zod").ZodBoolean>;
45
+ stats: import("zod").ZodOptional<import("zod").ZodObject<{
46
+ timeToFirstToken: import("zod").ZodNumber;
47
+ tokensPerSecond: import("zod").ZodNumber;
48
+ cacheTokens: import("zod").ZodNumber;
49
+ }, import("zod/v4/core").$strip>>;
50
+ toolCallEvent: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodObject<{
51
+ type: import("zod").ZodLiteral<"toolCall">;
52
+ call: import("zod").ZodObject<{
53
+ id: import("zod").ZodString;
54
+ name: import("zod").ZodString;
55
+ arguments: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
56
+ raw: import("zod").ZodOptional<import("zod").ZodString>;
57
+ }, import("zod/v4/core").$strip>;
58
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
59
+ type: import("zod").ZodLiteral<"toolCallError">;
60
+ error: import("zod").ZodObject<{
61
+ code: import("zod").ZodEnum<{
62
+ PARSE_ERROR: "PARSE_ERROR";
63
+ VALIDATION_ERROR: "VALIDATION_ERROR";
64
+ UNKNOWN_TOOL: "UNKNOWN_TOOL";
65
+ }>;
66
+ message: import("zod").ZodString;
67
+ raw: import("zod").ZodOptional<import("zod").ZodString>;
68
+ }, import("zod/v4/core").$strip>;
69
+ }, import("zod/v4/core").$strip>]>>;
70
+ toolCalls: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
71
+ id: import("zod").ZodString;
72
+ name: import("zod").ZodString;
73
+ arguments: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
74
+ raw: import("zod").ZodOptional<import("zod").ZodString>;
75
+ }, import("zod/v4/core").$strip>>>;
76
+ error: import("zod").ZodOptional<import("zod").ZodString>;
77
+ }, import("zod/v4/core").$strip>>;
78
+ translate: import("../../../../schemas/index").PluginHandlerDefinition<import("zod").ZodUnion<readonly [import("zod").ZodObject<{
79
+ modelId: import("zod").ZodString;
80
+ text: import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodArray<import("zod").ZodString>]>;
81
+ stream: import("zod").ZodBoolean;
82
+ modelType: import("zod").ZodEnum<{
83
+ "nmtcpp-translation": "nmtcpp-translation";
84
+ nmt: "nmt";
85
+ }>;
86
+ type: import("zod").ZodLiteral<"translate">;
87
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
88
+ modelId: import("zod").ZodString;
89
+ text: import("zod").ZodString;
90
+ stream: import("zod").ZodBoolean;
91
+ modelType: import("zod").ZodEnum<{
92
+ "llamacpp-completion": "llamacpp-completion";
93
+ llm: "llm";
94
+ }>;
95
+ from: import("zod").ZodOptional<import("zod").ZodString>;
96
+ to: import("zod").ZodString;
97
+ context: import("zod").ZodOptional<import("zod").ZodString>;
98
+ type: import("zod").ZodLiteral<"translate">;
99
+ }, import("zod/v4/core").$strip>]>, import("zod").ZodObject<{
100
+ type: import("zod").ZodLiteral<"translate">;
101
+ token: import("zod").ZodString;
102
+ done: import("zod").ZodOptional<import("zod").ZodBoolean>;
103
+ stats: import("zod").ZodOptional<import("zod").ZodObject<{
104
+ processedTokens: import("zod").ZodNumber;
105
+ processingTime: import("zod").ZodNumber;
106
+ }, import("zod/v4/core").$strip>>;
107
+ error: import("zod").ZodOptional<import("zod").ZodString>;
108
+ }, import("zod/v4/core").$strip>>;
109
+ };
110
+ logging: {
111
+ module: import("@qvac/llm-llamacpp/addonLogging").AddonLogging;
112
+ namespace: "llamacpp:llm";
113
+ };
114
+ };
115
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1,142 @@
1
+ import LlmLlamacpp, {} from "@qvac/llm-llamacpp";
2
+ import llmAddonLogging from "@qvac/llm-llamacpp/addonLogging.js";
3
+ import { definePlugin, defineHandler, completionStreamRequestSchema, completionStreamResponseSchema, translateRequestSchema, translateResponseSchema, ModelType, } from "../../../../schemas/index.js";
4
+ import { ADDON_NAMESPACES, createStreamLogger, registerAddonLogger, } from "../../../../logging/index.js";
5
+ import { parseModelPath } from "../../../utils/index.js";
6
+ import FilesystemDL from "@qvac/dl-filesystem";
7
+ import { asLoader } from "../../utils/loader-adapter.js";
8
+ import { completion } from "./ops/completion-stream.js";
9
+ import { translate } from "../../ops/translate.js";
10
+ function transformLlmConfig(llmConfig) {
11
+ const transformed = JSON.parse(JSON.stringify(llmConfig, (key, v) => key === "modelType"
12
+ ? undefined
13
+ : key === "stop_sequences"
14
+ ? Array.isArray(v)
15
+ ? v.join(", ")
16
+ : v
17
+ : typeof v === "number" || typeof v === "boolean"
18
+ ? String(v)
19
+ : v).replace(/"([a-z][A-Za-z]*)":/g, (_, key) => `"${key.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`)}":`));
20
+ if ("stop_sequences" in transformed) {
21
+ transformed["reverse_prompt"] = transformed["stop_sequences"];
22
+ delete transformed["stop_sequences"];
23
+ }
24
+ return transformed;
25
+ }
26
+ function createLlmModel(modelId, modelPath, llmConfig, projectionModelPath) {
27
+ const { dirPath, basePath } = parseModelPath(modelPath);
28
+ const loader = new FilesystemDL({ dirPath });
29
+ const logger = createStreamLogger(modelId, ADDON_NAMESPACES.LLAMACPP_LLM);
30
+ registerAddonLogger(modelId, ADDON_NAMESPACES.LLAMACPP_LLM, logger);
31
+ const llmConfigStrings = transformLlmConfig(llmConfig);
32
+ const args = {
33
+ loader: asLoader(loader),
34
+ opts: { stats: true },
35
+ logger,
36
+ diskPath: dirPath,
37
+ modelName: basePath,
38
+ projectionModel: projectionModelPath
39
+ ? parseModelPath(projectionModelPath).basePath
40
+ : "",
41
+ modelPath,
42
+ modelConfig: llmConfigStrings,
43
+ };
44
+ const model = new LlmLlamacpp(args, llmConfigStrings);
45
+ return { model, loader };
46
+ }
47
+ export const llmPlugin = definePlugin({
48
+ modelType: ModelType.llamacppCompletion,
49
+ displayName: "LLM (llama.cpp)",
50
+ addonPackage: "@qvac/llm-llamacpp",
51
+ createModel(params) {
52
+ const llmConfig = (params.modelConfig ?? {});
53
+ const { model, loader } = createLlmModel(params.modelId, params.modelPath, llmConfig, params.artifacts?.["projectionModelPath"]);
54
+ return { model, loader };
55
+ },
56
+ handlers: {
57
+ completionStream: defineHandler({
58
+ requestSchema: completionStreamRequestSchema,
59
+ responseSchema: completionStreamResponseSchema,
60
+ streaming: true,
61
+ handler: async function* (request) {
62
+ const filteredHistory = request.history.map(({ role, content, attachments }) => ({
63
+ role,
64
+ content,
65
+ attachments: attachments ?? [],
66
+ }));
67
+ const stream = completion({
68
+ history: filteredHistory,
69
+ modelId: request.modelId,
70
+ kvCache: request.kvCache,
71
+ ...(request.tools && { tools: request.tools }),
72
+ });
73
+ let stats;
74
+ let toolCalls = [];
75
+ let done = false;
76
+ let buffer = "";
77
+ while (!done) {
78
+ const result = await stream.next();
79
+ if (result.done) {
80
+ stats = result.value.stats;
81
+ toolCalls = result.value.toolCalls;
82
+ done = true;
83
+ }
84
+ else {
85
+ if (request.stream) {
86
+ yield {
87
+ type: "completionStream",
88
+ token: result.value.token,
89
+ ...(result.value.toolCallEvent && {
90
+ toolCallEvent: result.value.toolCallEvent,
91
+ }),
92
+ };
93
+ }
94
+ else {
95
+ buffer += result.value.token;
96
+ }
97
+ }
98
+ }
99
+ yield {
100
+ type: "completionStream",
101
+ token: request.stream ? "" : buffer,
102
+ done: true,
103
+ ...(stats && { stats }),
104
+ ...(toolCalls.length > 0 && { toolCalls }),
105
+ };
106
+ },
107
+ }),
108
+ translate: defineHandler({
109
+ requestSchema: translateRequestSchema,
110
+ responseSchema: translateResponseSchema,
111
+ streaming: true,
112
+ handler: async function* (request) {
113
+ const stream = translate(request);
114
+ let done = false;
115
+ let stats;
116
+ while (!done) {
117
+ const result = await stream.next();
118
+ if (result.done) {
119
+ stats = result.value;
120
+ done = true;
121
+ }
122
+ else {
123
+ yield {
124
+ type: "translate",
125
+ token: result.value,
126
+ };
127
+ }
128
+ }
129
+ yield {
130
+ type: "translate",
131
+ token: "",
132
+ done: true,
133
+ ...(stats && { stats }),
134
+ };
135
+ },
136
+ }),
137
+ },
138
+ logging: {
139
+ module: llmAddonLogging,
140
+ namespace: ADDON_NAMESPACES.LLAMACPP_LLM,
141
+ },
142
+ });
@@ -0,0 +1,24 @@
1
+ import { type CreateModelParams, type PluginModelResult } from "../../../../schemas/index";
2
+ export declare const embeddingsPlugin: {
3
+ modelType: "llamacpp-embedding";
4
+ displayName: string;
5
+ addonPackage: string;
6
+ createModel(params: CreateModelParams): PluginModelResult;
7
+ handlers: {
8
+ embed: import("../../../../schemas/index").PluginHandlerDefinition<import("zod").ZodObject<{
9
+ modelId: import("zod").ZodString;
10
+ text: import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodArray<import("zod").ZodString>]>;
11
+ type: import("zod").ZodLiteral<"embed">;
12
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
13
+ type: import("zod").ZodLiteral<"embed">;
14
+ success: import("zod").ZodBoolean;
15
+ embedding: import("zod").ZodDefault<import("zod").ZodUnion<readonly [import("zod").ZodArray<import("zod").ZodNumber>, import("zod").ZodArray<import("zod").ZodArray<import("zod").ZodNumber>>]>>;
16
+ error: import("zod").ZodOptional<import("zod").ZodString>;
17
+ }, import("zod/v4/core").$strip>>;
18
+ };
19
+ logging: {
20
+ module: import("@qvac/embed-llamacpp/addonLogging").AddonLogging;
21
+ namespace: "llamacpp:embed";
22
+ };
23
+ };
24
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1,73 @@
1
+ import EmbedLlamacpp, {} from "@qvac/embed-llamacpp";
2
+ import embedAddonLogging from "@qvac/embed-llamacpp/addonLogging.js";
3
+ import { definePlugin, defineHandler, embedRequestSchema, embedResponseSchema, ModelType, } from "../../../../schemas/index.js";
4
+ import { ADDON_NAMESPACES, createStreamLogger, registerAddonLogger, } from "../../../../logging/index.js";
5
+ import { parseModelPath } from "../../../utils/index.js";
6
+ import FilesystemDL from "@qvac/dl-filesystem";
7
+ import { asLoader } from "../../utils/loader-adapter.js";
8
+ import { embed } from "../../ops/embed.js";
9
+ function transformEmbedConfig(embedConfig) {
10
+ if (embedConfig.rawConfig) {
11
+ return embedConfig.rawConfig;
12
+ }
13
+ const lines = [];
14
+ lines.push(`-ngl\t${embedConfig.gpuLayers}`);
15
+ lines.push(`-dev\t${embedConfig.device}`);
16
+ lines.push(`--batch_size\t${embedConfig.batchSize}`);
17
+ if (embedConfig.ctxSize) {
18
+ lines.push(`-c\t${embedConfig.ctxSize}`);
19
+ }
20
+ if (embedConfig.flashAttention) {
21
+ lines.push(`-fa\t${embedConfig.flashAttention}`);
22
+ }
23
+ return lines.join("\n");
24
+ }
25
+ function createEmbeddingsModel(modelId, modelPath, embedConfig) {
26
+ const { dirPath, basePath } = parseModelPath(modelPath);
27
+ const loader = new FilesystemDL({ dirPath });
28
+ const logger = createStreamLogger(modelId, ADDON_NAMESPACES.LLAMACPP_EMBED);
29
+ registerAddonLogger(modelId, ADDON_NAMESPACES.LLAMACPP_EMBED, logger);
30
+ const config = transformEmbedConfig(embedConfig);
31
+ const args = {
32
+ loader: asLoader(loader),
33
+ opts: { stats: true },
34
+ logger,
35
+ diskPath: dirPath,
36
+ modelName: basePath,
37
+ modelPath,
38
+ };
39
+ const model = new EmbedLlamacpp(args, config);
40
+ return { model, loader };
41
+ }
42
+ export const embeddingsPlugin = definePlugin({
43
+ modelType: ModelType.llamacppEmbedding,
44
+ displayName: "Embeddings (llama.cpp)",
45
+ addonPackage: "@qvac/embed-llamacpp",
46
+ createModel(params) {
47
+ const embedConfig = (params.modelConfig ?? {});
48
+ const { model, loader } = createEmbeddingsModel(params.modelId, params.modelPath, embedConfig);
49
+ return { model, loader };
50
+ },
51
+ handlers: {
52
+ embed: defineHandler({
53
+ requestSchema: embedRequestSchema,
54
+ responseSchema: embedResponseSchema,
55
+ streaming: false,
56
+ handler: async function (request) {
57
+ const embedding = await embed({
58
+ modelId: request.modelId,
59
+ text: request.text,
60
+ });
61
+ return {
62
+ type: "embed",
63
+ success: true,
64
+ embedding,
65
+ };
66
+ },
67
+ }),
68
+ },
69
+ logging: {
70
+ module: embedAddonLogging,
71
+ namespace: ADDON_NAMESPACES.LLAMACPP_EMBED,
72
+ },
73
+ });
@@ -0,0 +1,45 @@
1
+ import { type CreateModelParams, type PluginModelResult } from "../../../../schemas/index";
2
+ export declare const nmtPlugin: {
3
+ modelType: "nmtcpp-translation";
4
+ displayName: string;
5
+ addonPackage: string;
6
+ createModel(params: CreateModelParams): PluginModelResult;
7
+ handlers: {
8
+ translate: import("../../../../schemas/index").PluginHandlerDefinition<import("zod").ZodUnion<readonly [import("zod").ZodObject<{
9
+ modelId: import("zod").ZodString;
10
+ text: import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodArray<import("zod").ZodString>]>;
11
+ stream: import("zod").ZodBoolean;
12
+ modelType: import("zod").ZodEnum<{
13
+ "nmtcpp-translation": "nmtcpp-translation";
14
+ nmt: "nmt";
15
+ }>;
16
+ type: import("zod").ZodLiteral<"translate">;
17
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
18
+ modelId: import("zod").ZodString;
19
+ text: import("zod").ZodString;
20
+ stream: import("zod").ZodBoolean;
21
+ modelType: import("zod").ZodEnum<{
22
+ "llamacpp-completion": "llamacpp-completion";
23
+ llm: "llm";
24
+ }>;
25
+ from: import("zod").ZodOptional<import("zod").ZodString>;
26
+ to: import("zod").ZodString;
27
+ context: import("zod").ZodOptional<import("zod").ZodString>;
28
+ type: import("zod").ZodLiteral<"translate">;
29
+ }, import("zod/v4/core").$strip>]>, import("zod").ZodObject<{
30
+ type: import("zod").ZodLiteral<"translate">;
31
+ token: import("zod").ZodString;
32
+ done: import("zod").ZodOptional<import("zod").ZodBoolean>;
33
+ stats: import("zod").ZodOptional<import("zod").ZodObject<{
34
+ processedTokens: import("zod").ZodNumber;
35
+ processingTime: import("zod").ZodNumber;
36
+ }, import("zod/v4/core").$strip>>;
37
+ error: import("zod").ZodOptional<import("zod").ZodString>;
38
+ }, import("zod/v4/core").$strip>>;
39
+ };
40
+ logging: {
41
+ module: import("@qvac/translation-nmtcpp/addonLogging").AddonLogging;
42
+ namespace: "nmtcpp";
43
+ };
44
+ };
45
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1,97 @@
1
+ import nmtAddonLogging from "@qvac/translation-nmtcpp/addonLogging.js";
2
+ import TranslationNmtcpp, {} from "@qvac/translation-nmtcpp";
3
+ import { definePlugin, defineHandler, translateRequestSchema, translateResponseSchema, ModelType, } from "../../../../schemas/index.js";
4
+ import { ADDON_NAMESPACES, createStreamLogger } from "../../../../logging/index.js";
5
+ import { parseModelPath } from "../../../utils/index.js";
6
+ import FilesystemDL from "@qvac/dl-filesystem";
7
+ import { TranslationFailedError } from "../../../../utils/errors-server.js";
8
+ import { asLoader } from "../../utils/loader-adapter.js";
9
+ import { translate } from "../../ops/translate.js";
10
+ function createNmtModel(modelId, modelPath, nmtConfig) {
11
+ const { dirPath, basePath } = parseModelPath(modelPath);
12
+ const loader = new FilesystemDL({ dirPath });
13
+ const logger = createStreamLogger(modelId, "nmtcpp");
14
+ const { mode, from, to, engine, beamsize, lengthpenalty, maxlength, repetitionpenalty, norepeatngramsize, temperature, topk, topp, } = nmtConfig;
15
+ const args = {
16
+ loader: asLoader(loader),
17
+ logger,
18
+ modelName: basePath,
19
+ diskPath: dirPath,
20
+ params: {
21
+ mode,
22
+ srcLang: from,
23
+ dstLang: to,
24
+ },
25
+ };
26
+ const generationParams = {
27
+ beamsize,
28
+ lengthpenalty,
29
+ maxlength,
30
+ repetitionpenalty,
31
+ norepeatngramsize,
32
+ temperature,
33
+ topk,
34
+ topp,
35
+ };
36
+ const config = {
37
+ modelType: TranslationNmtcpp.ModelTypes[engine],
38
+ ...generationParams,
39
+ ...(nmtConfig.engine === "Bergamot" && {
40
+ ...(nmtConfig.srcVocabPath && { srcVocabPath: nmtConfig.srcVocabPath }),
41
+ ...(nmtConfig.dstVocabPath && { dstVocabPath: nmtConfig.dstVocabPath }),
42
+ ...(nmtConfig.normalize !== undefined && {
43
+ normalize: nmtConfig.normalize,
44
+ }),
45
+ }),
46
+ };
47
+ if (config.modelType === TranslationNmtcpp.ModelTypes.IndicTrans) {
48
+ throw new TranslationFailedError("IndicTrans models are not supported with current NMT addon version.");
49
+ }
50
+ const model = new TranslationNmtcpp(args, config);
51
+ return { model, loader };
52
+ }
53
+ export const nmtPlugin = definePlugin({
54
+ modelType: ModelType.nmtcppTranslation,
55
+ displayName: "NMT (nmtcpp)",
56
+ addonPackage: "@qvac/translation-nmtcpp",
57
+ createModel(params) {
58
+ const nmtConfig = (params.modelConfig ?? {});
59
+ const { model, loader } = createNmtModel(params.modelId, params.modelPath, nmtConfig);
60
+ return { model, loader };
61
+ },
62
+ handlers: {
63
+ translate: defineHandler({
64
+ requestSchema: translateRequestSchema,
65
+ responseSchema: translateResponseSchema,
66
+ streaming: true,
67
+ handler: async function* (request) {
68
+ const stream = translate(request);
69
+ let done = false;
70
+ let stats;
71
+ while (!done) {
72
+ const result = await stream.next();
73
+ if (result.done) {
74
+ stats = result.value;
75
+ done = true;
76
+ }
77
+ else {
78
+ yield {
79
+ type: "translate",
80
+ token: result.value,
81
+ };
82
+ }
83
+ }
84
+ yield {
85
+ type: "translate",
86
+ token: "",
87
+ done: true,
88
+ ...(stats && { stats }),
89
+ };
90
+ },
91
+ }),
92
+ },
93
+ logging: {
94
+ module: nmtAddonLogging,
95
+ namespace: ADDON_NAMESPACES.NMTCPP,
96
+ },
97
+ });
@@ -54,7 +54,8 @@ export async function* ocr(params) {
54
54
  switch (params.image.type) {
55
55
  case "base64": {
56
56
  const tempDir = getCacheDir("tmp");
57
- const tempPath = path.join(tempDir, `ocr-${Date.now()}.png`);
57
+ const suffix = `${Date.now()}-${Math.random().toString(16).slice(2)}`;
58
+ const tempPath = path.join(tempDir, `ocr-${suffix}.png`);
58
59
  fs.writeFileSync(tempPath, Buffer.from(params.image.value, "base64"));
59
60
  imagePath = tempPath;
60
61
  cleanupPath = tempPath;
@@ -0,0 +1,38 @@
1
+ import { type CreateModelParams, type PluginModelResult } from "../../../../schemas/index";
2
+ export declare const ocrPlugin: {
3
+ modelType: "onnx-ocr";
4
+ displayName: string;
5
+ addonPackage: string;
6
+ createModel(params: CreateModelParams): PluginModelResult;
7
+ handlers: {
8
+ ocrStream: import("../../../../schemas/index").PluginHandlerDefinition<import("zod").ZodObject<{
9
+ modelId: import("zod").ZodString;
10
+ image: import("zod").ZodDiscriminatedUnion<[import("zod").ZodObject<{
11
+ type: import("zod").ZodLiteral<"base64">;
12
+ value: import("zod").ZodString;
13
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
14
+ type: import("zod").ZodLiteral<"filePath">;
15
+ value: import("zod").ZodString;
16
+ }, import("zod/v4/core").$strip>], "type">;
17
+ options: import("zod").ZodOptional<import("zod").ZodObject<{
18
+ paragraph: import("zod").ZodOptional<import("zod").ZodBoolean>;
19
+ }, import("zod/v4/core").$strip>>;
20
+ type: import("zod").ZodLiteral<"ocrStream">;
21
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
22
+ type: import("zod").ZodLiteral<"ocrStream">;
23
+ blocks: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
24
+ text: import("zod").ZodString;
25
+ bbox: import("zod").ZodOptional<import("zod").ZodTuple<[import("zod").ZodNumber, import("zod").ZodNumber, import("zod").ZodNumber, import("zod").ZodNumber], null>>;
26
+ confidence: import("zod").ZodOptional<import("zod").ZodNumber>;
27
+ }, import("zod/v4/core").$strip>>>;
28
+ done: import("zod").ZodOptional<import("zod").ZodBoolean>;
29
+ error: import("zod").ZodOptional<import("zod").ZodString>;
30
+ stats: import("zod").ZodOptional<import("zod").ZodObject<{
31
+ detectionTime: import("zod").ZodOptional<import("zod").ZodNumber>;
32
+ recognitionTime: import("zod").ZodOptional<import("zod").ZodNumber>;
33
+ totalTime: import("zod").ZodOptional<import("zod").ZodNumber>;
34
+ }, import("zod/v4/core").$strip>>;
35
+ }, import("zod/v4/core").$strip>>;
36
+ };
37
+ };
38
+ //# sourceMappingURL=plugin.d.ts.map
@@ -1,9 +1,10 @@
1
- import {} from "../../registry/model-registry.js";
1
+ import { definePlugin, defineHandler, ocrStreamRequestSchema, ocrStreamResponseSchema, ModelType, } from "../../../../schemas/index.js";
2
2
  import { createStreamLogger } from "../../../../logging/index.js";
3
3
  import { parseModelPath } from "../../../utils/index.js";
4
4
  import FilesystemDL from "@qvac/dl-filesystem";
5
5
  import { ONNXOcr } from "@qvac/ocr-onnx";
6
- export function createOCRModel(modelId, detectorPath, recognizerPath, ocrConfig) {
6
+ import { ocr } from "./ops/ocr-stream.js";
7
+ function createOCRModel(modelId, detectorPath, recognizerPath, ocrConfig) {
7
8
  const { dirPath } = parseModelPath(detectorPath);
8
9
  const loader = new FilesystemDL({ dirPath });
9
10
  const logger = createStreamLogger(modelId, "ocr");
@@ -37,3 +38,39 @@ export function createOCRModel(modelId, detectorPath, recognizerPath, ocrConfig)
37
38
  const model = new ONNXOcr(args);
38
39
  return { model, loader };
39
40
  }
41
+ export const ocrPlugin = definePlugin({
42
+ modelType: ModelType.onnxOcr,
43
+ displayName: "OCR (ONNX)",
44
+ addonPackage: "@qvac/ocr-onnx",
45
+ createModel(params) {
46
+ const ocrConfig = (params.modelConfig ?? {});
47
+ const { model, loader } = createOCRModel(params.modelId, params.artifacts?.["detectorModelPath"] ?? "", params.modelPath, // recognizerPath
48
+ ocrConfig);
49
+ return { model, loader };
50
+ },
51
+ handlers: {
52
+ ocrStream: defineHandler({
53
+ requestSchema: ocrStreamRequestSchema,
54
+ responseSchema: ocrStreamResponseSchema,
55
+ streaming: true,
56
+ handler: async function* (request) {
57
+ for await (const result of ocr({
58
+ modelId: request.modelId,
59
+ image: request.image,
60
+ options: request.options,
61
+ })) {
62
+ yield {
63
+ type: "ocrStream",
64
+ blocks: result.blocks,
65
+ ...(result.stats && { stats: result.stats }),
66
+ };
67
+ }
68
+ yield {
69
+ type: "ocrStream",
70
+ blocks: [],
71
+ done: true,
72
+ };
73
+ },
74
+ }),
75
+ },
76
+ });
@@ -22,7 +22,9 @@ export async function* textToSpeech(params) {
22
22
  // Streaming mode: use async iterator pattern
23
23
  const outputQueue = [];
24
24
  let isComplete = false;
25
+ let streamError = null;
25
26
  let resolveNext = null;
27
+ let rejectNext = null;
26
28
  // Start the response processing
27
29
  const responsePromise = response
28
30
  .onUpdate((data) => {
@@ -37,6 +39,7 @@ export async function* textToSpeech(params) {
37
39
  done: false,
38
40
  });
39
41
  resolveNext = null;
42
+ rejectNext = null;
40
43
  }
41
44
  else {
42
45
  // Otherwise, queue the output
@@ -49,11 +52,29 @@ export async function* textToSpeech(params) {
49
52
  if (resolveNext) {
50
53
  resolveNext({ value: undefined, done: true });
51
54
  resolveNext = null;
55
+ rejectNext = null;
56
+ }
57
+ })
58
+ .catch((err) => {
59
+ streamError = err;
60
+ isComplete = true;
61
+ if (rejectNext) {
62
+ rejectNext(err);
63
+ resolveNext = null;
64
+ rejectNext = null;
52
65
  }
53
66
  });
54
67
  // Create an async iterator
55
68
  const asyncIterator = {
56
69
  async next() {
70
+ if (streamError) {
71
+ if (streamError instanceof Error)
72
+ throw streamError;
73
+ const message = typeof streamError === "string"
74
+ ? streamError
75
+ : JSON.stringify(streamError);
76
+ throw new Error(message);
77
+ }
57
78
  if (outputQueue.length > 0) {
58
79
  const data = outputQueue.shift();
59
80
  return {
@@ -69,8 +90,9 @@ export async function* textToSpeech(params) {
69
90
  return { value: undefined, done: true };
70
91
  }
71
92
  // Wait for the next output
72
- return new Promise((resolve) => {
93
+ return new Promise((resolve, reject) => {
73
94
  resolveNext = resolve;
95
+ rejectNext = reject;
74
96
  });
75
97
  },
76
98
  [Symbol.asyncIterator]() {