@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
@@ -1,16 +1,124 @@
1
- import {} from "../../../../schemas/index.js";
1
+ import { AbortController } from "bare-abort-controller";
2
+ import { DownloadCancelledError } from "../../../../utils/errors-server.js";
2
3
  import { getServerLogger } from "../../../../logging/index.js";
3
4
  const logger = getServerLogger();
4
- const activeDownloads = new Map();
5
- const clearCacheFlags = new Map();
6
- export function getActiveDownload(key) {
7
- return activeDownloads.get(key);
5
+ const activeTransfers = new Map();
6
+ let nextSubscriberId = 0;
7
+ function createSubscriber(onProgress) {
8
+ let resolve;
9
+ let reject;
10
+ const promise = new Promise((res, rej) => {
11
+ resolve = res;
12
+ reject = rej;
13
+ });
14
+ return {
15
+ id: String(nextSubscriberId++),
16
+ onProgress,
17
+ settled: false,
18
+ resolve,
19
+ reject,
20
+ promise,
21
+ };
22
+ }
23
+ function settleSubscriber(subscriber, result) {
24
+ if (subscriber.settled)
25
+ return;
26
+ subscriber.settled = true;
27
+ if (result instanceof Error) {
28
+ subscriber.reject(result);
29
+ }
30
+ else {
31
+ subscriber.resolve(result);
32
+ }
33
+ }
34
+ function deliverProgress(transfer, subscriber, progress) {
35
+ if (subscriber.settled || !subscriber.onProgress)
36
+ return;
37
+ try {
38
+ subscriber.onProgress(progress);
39
+ }
40
+ catch (err) {
41
+ const error = err instanceof Error ? err : new Error(String(err));
42
+ logger.warn("Progress callback threw; detaching subscriber", {
43
+ downloadKey: transfer.downloadKey,
44
+ subscriberId: subscriber.id,
45
+ error,
46
+ });
47
+ settleSubscriber(subscriber, error);
48
+ transfer.subscribers.delete(subscriber.id);
49
+ }
50
+ }
51
+ function broadcastTransferProgress(transfer, progress) {
52
+ transfer.lastProgress = progress;
53
+ for (const sub of Array.from(transfer.subscribers.values())) {
54
+ deliverProgress(transfer, sub, progress);
55
+ }
8
56
  }
9
- export function registerDownload(key, entry) {
10
- activeDownloads.set(key, entry);
57
+ export function startOrJoinDownload(downloadKey, startDownload, onProgress) {
58
+ const existing = activeTransfers.get(downloadKey);
59
+ if (existing && !existing.abortController.signal.aborted) {
60
+ logger.info(`📥 Reusing existing download for: ${downloadKey}`);
61
+ const subscriber = createSubscriber(onProgress);
62
+ existing.subscribers.set(subscriber.id, subscriber);
63
+ if (existing.lastProgress) {
64
+ deliverProgress(existing, subscriber, existing.lastProgress);
65
+ }
66
+ return {
67
+ promise: subscriber.promise,
68
+ joined: true,
69
+ getCacheHit: () => existing.cacheHit,
70
+ };
71
+ }
72
+ const abortController = new AbortController();
73
+ const transfer = {
74
+ downloadKey,
75
+ abortController,
76
+ subscribers: new Map(),
77
+ clearCache: false,
78
+ };
79
+ const initialSubscriber = createSubscriber(onProgress);
80
+ transfer.subscribers.set(initialSubscriber.id, initialSubscriber);
81
+ activeTransfers.set(downloadKey, transfer);
82
+ const downloadPromise = startDownload({
83
+ broadcastProgress: (progress) => {
84
+ broadcastTransferProgress(transfer, progress);
85
+ },
86
+ signal: abortController.signal,
87
+ shouldClearCache: () => transfer.clearCache,
88
+ setCacheHit: (cacheHit) => {
89
+ transfer.cacheHit = cacheHit;
90
+ },
91
+ });
92
+ transfer.downloadPromise = downloadPromise;
93
+ downloadPromise.then((path) => {
94
+ for (const sub of transfer.subscribers.values()) {
95
+ settleSubscriber(sub, path);
96
+ }
97
+ }, (error) => {
98
+ const rejection = error instanceof Error ? error : new Error(String(error));
99
+ for (const sub of transfer.subscribers.values()) {
100
+ settleSubscriber(sub, rejection);
101
+ }
102
+ }).finally(() => {
103
+ if (activeTransfers.get(downloadKey) === transfer) {
104
+ activeTransfers.delete(downloadKey);
105
+ }
106
+ });
107
+ return {
108
+ promise: initialSubscriber.promise,
109
+ joined: false,
110
+ getCacheHit: () => transfer.cacheHit,
111
+ };
11
112
  }
12
- export function unregisterDownload(key) {
13
- activeDownloads.delete(key);
113
+ export function cancelTransfer(downloadKey, clearCache = false) {
114
+ const transfer = activeTransfers.get(downloadKey);
115
+ if (!transfer)
116
+ return;
117
+ transfer.clearCache = clearCache;
118
+ transfer.abortController.abort();
119
+ for (const sub of transfer.subscribers.values()) {
120
+ settleSubscriber(sub, new DownloadCancelledError());
121
+ }
14
122
  }
15
123
  export function createHyperdriveDownloadKey(hyperdriveKey, modelFileName) {
16
124
  return `${hyperdriveKey}:${modelFileName}`;
@@ -18,38 +126,32 @@ export function createHyperdriveDownloadKey(hyperdriveKey, modelFileName) {
18
126
  export function createHttpDownloadKey(url) {
19
127
  return `http:${url}`;
20
128
  }
21
- export function createRegistryDownloadKey(registryPath) {
22
- return `registry:${registryPath}`;
23
- }
24
- export function setClearCacheFlag(downloadKey, clearCache) {
25
- if (clearCache) {
26
- clearCacheFlags.set(downloadKey, true);
27
- }
28
- else {
29
- clearCacheFlags.delete(downloadKey);
30
- }
31
- }
32
- export function shouldClearCache(downloadKey) {
33
- return clearCacheFlags.get(downloadKey) ?? false;
34
- }
35
- export function clearClearCacheFlag(downloadKey) {
36
- clearCacheFlags.delete(downloadKey);
129
+ export function createRegistryDownloadKey(registrySource, registryPath) {
130
+ return `registry:${registrySource}:${registryPath}`;
37
131
  }
38
- export function createCancelFunction(downloadKey, clearCache = false) {
39
- return () => {
40
- const entry = getActiveDownload(downloadKey);
41
- if (!entry) {
42
- return;
132
+ export function applyJoinedDownloadStats(result, hooks) {
133
+ if (!result.joined)
134
+ return result.promise;
135
+ return result.promise.then((path) => {
136
+ const cacheHit = result.getCacheHit();
137
+ if (cacheHit === true) {
138
+ hooks?.markCacheHit?.();
43
139
  }
44
- // Set flag for the download handlers to check
45
- setClearCacheFlag(downloadKey, clearCache);
46
- entry.abortController.abort();
47
- unregisterDownload(downloadKey);
48
- };
140
+ else if (cacheHit === false) {
141
+ hooks?.markCacheMiss?.();
142
+ hooks?.markSharedTransfer?.();
143
+ }
144
+ else {
145
+ hooks?.markSharedTransfer?.();
146
+ }
147
+ return path;
148
+ });
49
149
  }
50
150
  export function cancelAllDownloads() {
51
- logger.info(`🧹 Cancelling ${activeDownloads.size} active downloads`);
52
- Array.from(activeDownloads.keys()).forEach((key) => createCancelFunction(key)());
151
+ logger.info(`🧹 Cancelling ${activeTransfers.size} active downloads`);
152
+ for (const key of Array.from(activeTransfers.keys())) {
153
+ cancelTransfer(key);
154
+ }
53
155
  }
54
156
  let isCleaningUp = false;
55
157
  export async function cleanupDownloads() {
@@ -57,7 +159,9 @@ export async function cleanupDownloads() {
57
159
  return;
58
160
  isCleaningUp = true;
59
161
  try {
60
- const downloadPromises = Array.from(activeDownloads.values()).map((entry) => entry.promise.catch(() => { }));
162
+ const downloadPromises = Array.from(activeTransfers.values())
163
+ .filter((t) => t.downloadPromise !== undefined)
164
+ .map((t) => t.downloadPromise.catch(() => { }));
61
165
  cancelAllDownloads();
62
166
  if (downloadPromises.length > 0) {
63
167
  await Promise.allSettled(downloadPromises);
@@ -1,6 +1,7 @@
1
1
  import type { ModelProgressUpdate } from "../../../../schemas/index";
2
- import type { DownloadResult } from "./types";
3
- export declare function downloadModelFromHttpWithStats(url: string, progressCallback?: (progress: ModelProgressUpdate) => void): Promise<DownloadResult>;
4
- export declare function downloadModelFromRegistryWithStats(registryPath: string, registrySource: string, progressCallback?: (progress: ModelProgressUpdate) => void, expectedChecksum?: string): Promise<DownloadResult>;
5
- export declare function downloadModelFromHyperdriveWithStats(hyperdriveKey: string, modelFileName: string, seed?: boolean, progressCallback?: (progress: ModelProgressUpdate) => void): Promise<DownloadResult>;
2
+ import type { DownloadStats, DownloadResult, DownloadHooks, ResolveResult } from "./types";
3
+ export declare function downloadModelFromHttpWithStats(url: string, progressCallback?: (progress: ModelProgressUpdate) => void, downloadHooks?: DownloadHooks): Promise<DownloadResult>;
4
+ export declare function downloadModelFromRegistryWithStats(registryPath: string, registrySource: string, progressCallback?: (progress: ModelProgressUpdate) => void, expectedChecksum?: string, downloadHooks?: DownloadHooks): Promise<DownloadResult>;
5
+ export declare function downloadModelFromHyperdriveWithStats(hyperdriveKey: string, modelFileName: string, seed?: boolean, progressCallback?: (progress: ModelProgressUpdate) => void, downloadHooks?: DownloadHooks): Promise<DownloadResult>;
6
+ export declare function mergeDownloadStats(results: ResolveResult[]): DownloadStats | undefined;
6
7
  //# sourceMappingURL=download-stats.d.ts.map
@@ -7,10 +7,11 @@ function createStatsCollector() {
7
7
  maxBytesDownloaded: 0,
8
8
  startTimeMs: nowMs(),
9
9
  cacheHit: undefined,
10
+ sharedTransfer: false,
10
11
  checksumValidationTimeMsTotal: 0,
11
12
  };
12
13
  }
13
- function createHooks(collector) {
14
+ function createStatsHooks(collector) {
14
15
  return {
15
16
  markCacheHit: () => {
16
17
  if (collector.cacheHit === undefined) {
@@ -21,6 +22,9 @@ function createHooks(collector) {
21
22
  markCacheMiss: () => {
22
23
  collector.cacheHit = false;
23
24
  },
25
+ markSharedTransfer: () => {
26
+ collector.sharedTransfer = true;
27
+ },
24
28
  addChecksumValidationTimeMs: (durationMs) => {
25
29
  collector.checksumValidationTimeMsTotal += durationMs;
26
30
  },
@@ -30,7 +34,7 @@ function wrapProgressCallback(collector, originalCallback) {
30
34
  return (progress) => {
31
35
  // Don't track bytes for cache hits (they're not real network transfer)
32
36
  if (collector.cacheHit !== true) {
33
- const downloaded = progress.onnxInfo?.overallDownloaded ??
37
+ const downloaded = progress.fileSetInfo?.overallDownloaded ??
34
38
  progress.shardInfo?.overallDownloaded ??
35
39
  progress.downloaded ??
36
40
  0;
@@ -43,6 +47,9 @@ function computeStats(collector) {
43
47
  const downloadTimeMs = nowMs() - collector.startTimeMs;
44
48
  const totalBytesDownloaded = collector.maxBytesDownloaded;
45
49
  const stats = {};
50
+ if (collector.sharedTransfer) {
51
+ stats.sharedTransfer = true;
52
+ }
46
53
  if (collector.cacheHit !== undefined) {
47
54
  stats.cacheHit = collector.cacheHit;
48
55
  }
@@ -52,6 +59,12 @@ function computeStats(collector) {
52
59
  if (collector.cacheHit === true) {
53
60
  return Object.keys(stats).length > 0 ? stats : undefined;
54
61
  }
62
+ if (collector.sharedTransfer) {
63
+ if (downloadTimeMs > 0) {
64
+ stats.downloadTimeMs = downloadTimeMs;
65
+ }
66
+ return Object.keys(stats).length > 0 ? stats : undefined;
67
+ }
55
68
  if (totalBytesDownloaded > 0) {
56
69
  stats.downloadTimeMs = downloadTimeMs;
57
70
  stats.totalBytesDownloaded = totalBytesDownloaded;
@@ -61,27 +74,55 @@ function computeStats(collector) {
61
74
  }
62
75
  return Object.keys(stats).length > 0 ? stats : undefined;
63
76
  }
64
- export async function downloadModelFromHttpWithStats(url, progressCallback) {
77
+ export async function downloadModelFromHttpWithStats(url, progressCallback, downloadHooks) {
65
78
  const collector = createStatsCollector();
66
- const hooks = createHooks(collector);
79
+ const hooks = { ...downloadHooks, ...createStatsHooks(collector) };
67
80
  const wrappedCallback = wrapProgressCallback(collector, progressCallback);
68
81
  const path = await downloadModelFromHttp(url, wrappedCallback, hooks);
69
82
  const stats = computeStats(collector);
70
83
  return stats ? { path, stats } : { path };
71
84
  }
72
- export async function downloadModelFromRegistryWithStats(registryPath, registrySource, progressCallback, expectedChecksum) {
85
+ export async function downloadModelFromRegistryWithStats(registryPath, registrySource, progressCallback, expectedChecksum, downloadHooks) {
73
86
  const collector = createStatsCollector();
74
- const hooks = createHooks(collector);
87
+ const hooks = { ...downloadHooks, ...createStatsHooks(collector) };
75
88
  const wrappedCallback = wrapProgressCallback(collector, progressCallback);
76
89
  const path = await downloadModelFromRegistry(registryPath, registrySource, wrappedCallback, expectedChecksum, hooks);
77
90
  const stats = computeStats(collector);
78
91
  return stats ? { path, stats } : { path };
79
92
  }
80
- export async function downloadModelFromHyperdriveWithStats(hyperdriveKey, modelFileName, seed, progressCallback) {
93
+ export async function downloadModelFromHyperdriveWithStats(hyperdriveKey, modelFileName, seed, progressCallback, downloadHooks) {
81
94
  const collector = createStatsCollector();
82
- const hooks = createHooks(collector);
95
+ const hooks = { ...downloadHooks, ...createStatsHooks(collector) };
83
96
  const wrappedCallback = wrapProgressCallback(collector, progressCallback);
84
97
  const path = await downloadModelFromHyperdrive(hyperdriveKey, modelFileName, seed, wrappedCallback, hooks);
85
98
  const stats = computeStats(collector);
86
99
  return stats ? { path, stats } : { path };
87
100
  }
101
+ export function mergeDownloadStats(results) {
102
+ const stats = results
103
+ .map((r) => r.downloadStats)
104
+ .filter((s) => s !== undefined);
105
+ if (stats.length === 0)
106
+ return undefined;
107
+ const downloadTimeMs = Math.max(...stats.map((s) => s.downloadTimeMs ?? 0));
108
+ const totalBytesDownloaded = stats.reduce((sum, s) => sum + (s.totalBytesDownloaded ?? 0), 0);
109
+ const checksumValidationTimeMs = stats.reduce((sum, s) => sum + (s.checksumValidationTimeMs ?? 0), 0);
110
+ const cacheHitValues = stats
111
+ .map((s) => s.cacheHit)
112
+ .filter((v) => v !== undefined);
113
+ const merged = {};
114
+ if (downloadTimeMs > 0)
115
+ merged.downloadTimeMs = downloadTimeMs;
116
+ if (totalBytesDownloaded > 0)
117
+ merged.totalBytesDownloaded = totalBytesDownloaded;
118
+ if (downloadTimeMs > 0 && totalBytesDownloaded > 0) {
119
+ merged.downloadSpeedBps = (totalBytesDownloaded * 1000) / downloadTimeMs;
120
+ }
121
+ if (checksumValidationTimeMs > 0)
122
+ merged.checksumValidationTimeMs = checksumValidationTimeMs;
123
+ if (cacheHitValues.length > 0)
124
+ merged.cacheHit = cacheHitValues.every(Boolean);
125
+ if (stats.some((s) => s.sharedTransfer))
126
+ merged.sharedTransfer = true;
127
+ return Object.keys(merged).length > 0 ? merged : undefined;
128
+ }
@@ -1,9 +1,10 @@
1
1
  import { normalizeModelType, PROFILING_KEY, OPERATION_EVENT_KEY, } from "../../../../schemas/index.js";
2
2
  import { loadModel } from "../../../bare/ops/load-model.js";
3
- import { resolveModelPath, resolveModelPathWithStats, } from "./resolve.js";
3
+ import { createResolveSession } from "./resolve-session.js";
4
4
  import { nowMs, generateProfileId } from "../../../../profiling/clock.js";
5
5
  import { getModelEntry, updateModelConfig, } from "../../../bare/registry/model-registry.js";
6
6
  import { generateShortHash, canonicalConfigString, transformConfigForReload, } from "../../../utils/index.js";
7
+ import { buildDownloadProfilingFields } from "./types.js";
7
8
  import { ConfigReloadNotSupportedError, ModelTypeMismatchError, ModelIsDelegatedError, ModelNotFoundError, ModelLoadFailedError, PluginLoadConfigValidationFailedError, PluginNotFoundError, } from "../../../../utils/errors-server.js";
8
9
  import { getServerLogger } from "../../../../logging/index.js";
9
10
  import { getPlugin } from "../../../plugins/index.js";
@@ -34,37 +35,39 @@ export async function handleLoadModel(request, progressCallback) {
34
35
  }
35
36
  resolvedModelConfig = parseResult.data;
36
37
  const totalLoadStart = profilingEnabled ? nowMs() : 0;
37
- let resolveResult;
38
+ const session = createResolveSession({
39
+ progressCallback,
40
+ seed,
41
+ profilingEnabled,
42
+ });
43
+ const primaryResolve = session.resolvePrimaryModelPath(modelSrc);
38
44
  let resolvedModelPath;
39
- if (profilingEnabled) {
40
- resolveResult = await resolveModelPathWithStats(modelSrc, progressCallback, seed);
41
- resolvedModelPath = resolveResult.path;
45
+ let pluginResolveResult;
46
+ try {
47
+ const pluginResolve = plugin.resolveConfig
48
+ ? Promise.resolve().then(() => plugin.resolveConfig(resolvedModelConfig, session.createResolveContext(modelSrc, canonicalModelType, modelName)))
49
+ : undefined;
50
+ [resolvedModelPath, pluginResolveResult] = pluginResolve
51
+ ? await Promise.all([primaryResolve, pluginResolve])
52
+ : [await primaryResolve, undefined];
42
53
  }
43
- else {
44
- resolvedModelPath = await resolveModelPath(modelSrc, progressCallback, seed);
45
- }
46
- let pluginArtifacts = {};
47
- if (plugin.resolveConfig) {
48
- const ctx = {
49
- resolveModelPath: (src) => resolveModelPath(src, progressCallback, seed),
50
- modelSrc,
51
- modelType: canonicalModelType,
52
- ...(modelName !== undefined && { modelName }),
53
- };
54
- const result = await plugin.resolveConfig(resolvedModelConfig, ctx);
55
- resolvedModelConfig = result.config;
56
- if (result.artifacts) {
57
- pluginArtifacts = result.artifacts;
58
- }
54
+ catch (error) {
55
+ session.cancelAll();
56
+ throw error;
59
57
  }
60
58
  const configStr = canonicalConfigString(request.modelConfig);
61
59
  const modelHashInput = `${request.modelType}:${modelSrc}:${configStr}`;
62
60
  const modelId = generateShortHash(modelHashInput);
61
+ let pluginArtifacts = {};
62
+ if (pluginResolveResult) {
63
+ resolvedModelConfig = pluginResolveResult.config;
64
+ if (pluginResolveResult.artifacts) {
65
+ pluginArtifacts = pluginResolveResult.artifacts;
66
+ }
67
+ }
63
68
  if ("modelPath" in pluginArtifacts) {
64
- logger.warn("Plugin returned 'modelPath' artifact which was overridden by core");
69
+ throw new ModelLoadFailedError("Plugin returned reserved key \"modelPath\" in artifacts; primary model resolution is core-owned");
65
70
  }
66
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
67
- const { modelPath: _, ...artifacts } = pluginArtifacts;
68
71
  if (!resolvedModelPath) {
69
72
  throw new ModelLoadFailedError("modelPath resolution failed");
70
73
  }
@@ -76,7 +79,7 @@ export async function handleLoadModel(request, progressCallback) {
76
79
  modelType: canonicalModelType,
77
80
  modelConfig: resolvedModelConfig,
78
81
  },
79
- artifacts: Object.keys(artifacts).length > 0 ? artifacts : undefined,
82
+ artifacts: Object.keys(pluginArtifacts).length > 0 ? pluginArtifacts : undefined,
80
83
  modelName,
81
84
  }, profilingEnabled ? { collectTiming: true } : undefined);
82
85
  const response = {
@@ -87,38 +90,16 @@ export async function handleLoadModel(request, progressCallback) {
87
90
  if (profilingEnabled) {
88
91
  const totalLoadTimeMs = nowMs() - totalLoadStart;
89
92
  const profileId = profilingMeta?.id ?? generateProfileId();
90
- const gauges = {
91
- totalLoadTime: totalLoadTimeMs,
92
- };
93
+ const resolveResult = session.getAggregateResult();
94
+ const { gauges, tags } = buildDownloadProfilingFields(resolveResult?.downloadStats, resolveResult?.sourceType);
95
+ gauges["totalLoadTime"] = totalLoadTimeMs;
93
96
  if (loadResult.timing?.modelInitializationTimeMs !== undefined) {
94
97
  gauges["modelInitializationTime"] =
95
98
  loadResult.timing.modelInitializationTimeMs;
96
99
  }
97
- if (resolveResult?.downloadStats) {
98
- const ds = resolveResult.downloadStats;
99
- if (ds.downloadTimeMs !== undefined) {
100
- gauges["downloadTime"] = ds.downloadTimeMs;
101
- }
102
- if (ds.totalBytesDownloaded !== undefined) {
103
- gauges["totalBytesDownloaded"] = ds.totalBytesDownloaded;
104
- }
105
- if (ds.downloadSpeedBps !== undefined) {
106
- gauges["downloadSpeedBps"] = ds.downloadSpeedBps;
107
- }
108
- if (ds.checksumValidationTimeMs !== undefined) {
109
- gauges["checksumValidationTime"] = ds.checksumValidationTimeMs;
110
- }
111
- }
112
- const tags = {};
113
100
  if (canonicalModelType) {
114
101
  tags["modelType"] = canonicalModelType;
115
102
  }
116
- if (resolveResult?.sourceType) {
117
- tags["sourceType"] = resolveResult.sourceType;
118
- }
119
- if (resolveResult?.downloadStats?.cacheHit !== undefined) {
120
- tags["cacheHit"] = resolveResult.downloadStats.cacheHit ? "true" : "false";
121
- }
122
103
  const operationEvent = {
123
104
  op: "loadModel",
124
105
  kind: "handler",
@@ -1,4 +1,4 @@
1
1
  import type { ModelProgressUpdate } from "../../../../schemas/index";
2
- import type { DownloadMetricsHooks } from "./types";
3
- export declare function downloadModelFromHttp(url: string, progressCallback?: (progress: ModelProgressUpdate) => void, hooks?: DownloadMetricsHooks): Promise<string>;
2
+ import type { DownloadHooks } from "./types";
3
+ export declare function downloadModelFromHttp(url: string, progressCallback?: (progress: ModelProgressUpdate) => void, hooks?: DownloadHooks): Promise<string>;
4
4
  //# sourceMappingURL=http.d.ts.map