@qvac/sdk 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/README.md +365 -200
  2. package/bare-imports.json +35 -0
  3. package/dist/client/api/cancel.d.ts +12 -3
  4. package/dist/client/api/cancel.js +12 -3
  5. package/dist/client/api/completion-stream.d.ts +15 -5
  6. package/dist/client/api/completion-stream.js +50 -14
  7. package/dist/client/api/embed.d.ts +17 -3
  8. package/dist/client/api/embed.js +0 -8
  9. package/dist/client/api/get-model-info.d.ts +2 -2
  10. package/dist/client/api/get-model-info.js +2 -2
  11. package/dist/client/api/index.d.ts +2 -2
  12. package/dist/client/api/index.js +2 -2
  13. package/dist/client/api/load-model.d.ts +37 -11
  14. package/dist/client/api/load-model.js +34 -117
  15. package/dist/client/api/logging-stream.d.ts +6 -3
  16. package/dist/client/api/logging-stream.js +6 -3
  17. package/dist/client/api/ocr.d.ts +31 -0
  18. package/dist/client/api/ocr.js +88 -0
  19. package/dist/client/api/rag.d.ts +215 -20
  20. package/dist/client/api/rag.js +382 -23
  21. package/dist/client/api/translate.js +10 -11
  22. package/dist/client/api/unload-model.js +6 -3
  23. package/dist/client/config-loader/config-utils.d.ts +5 -0
  24. package/dist/client/config-loader/config-utils.js +20 -0
  25. package/dist/client/config-loader/resolve-config.bare.d.ts +9 -0
  26. package/dist/client/config-loader/resolve-config.bare.js +87 -0
  27. package/dist/client/config-loader/resolve-config.expo.d.ts +11 -0
  28. package/dist/client/config-loader/resolve-config.expo.js +62 -0
  29. package/dist/client/config-loader/resolve-config.node.d.ts +9 -0
  30. package/dist/client/config-loader/resolve-config.node.js +118 -0
  31. package/dist/client/init-hooks.d.ts +18 -3
  32. package/dist/client/init-hooks.js +57 -29
  33. package/dist/client/logging-stream-registry.d.ts +1 -1
  34. package/dist/client/logging-stream-registry.js +14 -13
  35. package/dist/client/rpc/bare-client.d.ts +3 -184
  36. package/dist/client/rpc/bare-client.js +67 -8
  37. package/dist/client/rpc/expo-rpc-client.d.ts +2 -2
  38. package/dist/client/rpc/expo-rpc-client.js +70 -12
  39. package/dist/client/rpc/node-rpc-client.d.ts +1 -1
  40. package/dist/client/rpc/node-rpc-client.js +14 -7
  41. package/dist/client/rpc/rpc-client.d.ts +1 -1
  42. package/dist/client/rpc/rpc-client.js +13 -58
  43. package/dist/examples/config/blind-relay/blind-relay.config.d.ts +5 -0
  44. package/dist/examples/config/blind-relay/blind-relay.config.js +7 -0
  45. package/dist/examples/config/default/default.config.d.ts +8 -0
  46. package/dist/examples/config/default/default.config.js +6 -0
  47. package/dist/examples/config-reload.d.ts +2 -0
  48. package/dist/examples/config-reload.js +49 -0
  49. package/dist/examples/default-config-usage.d.ts +17 -0
  50. package/dist/examples/default-config-usage.js +47 -0
  51. package/dist/examples/delegated-inference/consumer.js +1 -0
  52. package/dist/examples/download-with-blind-relays.js +22 -21
  53. package/dist/examples/embed-hyperdrive.js +39 -3
  54. package/dist/examples/kv-cache-cleanup.js +1 -1
  55. package/dist/examples/kv-cache-custom-key.js +16 -1
  56. package/dist/examples/kv-cache-example.js +1 -1
  57. package/dist/examples/llamacpp-hyperdrive.js +1 -1
  58. package/dist/examples/llamacpp-sharded.js +13 -4
  59. package/dist/examples/logging-file-transport.d.ts +2 -0
  60. package/dist/examples/{llamacpp-file-logging.js → logging-file-transport.js} +3 -7
  61. package/dist/examples/logging-streaming.d.ts +2 -0
  62. package/dist/examples/logging-streaming.js +75 -0
  63. package/dist/examples/mcp-websearch.d.ts +13 -0
  64. package/dist/examples/mcp-websearch.js +176 -0
  65. package/dist/examples/ocr-fasttext.d.ts +2 -0
  66. package/dist/examples/ocr-fasttext.js +52 -0
  67. package/dist/examples/quickstart.d.ts +2 -0
  68. package/dist/examples/quickstart.js +28 -0
  69. package/dist/examples/rag/rag-hyperdb/cancellation.d.ts +2 -0
  70. package/dist/examples/rag/rag-hyperdb/cancellation.js +75 -0
  71. package/dist/examples/rag/rag-hyperdb/ingest.d.ts +2 -0
  72. package/dist/examples/rag/{rag-hyperdb.js → rag-hyperdb/ingest.js} +10 -4
  73. package/dist/examples/rag/rag-hyperdb/pipeline.d.ts +2 -0
  74. package/dist/examples/rag/rag-hyperdb/pipeline.js +74 -0
  75. package/dist/examples/rag/rag-hyperdb/workspaces.d.ts +2 -0
  76. package/dist/examples/rag/rag-hyperdb/workspaces.js +178 -0
  77. package/dist/examples/translation/translation-bergamot-batch.d.ts +2 -0
  78. package/dist/examples/translation/translation-bergamot-batch.js +49 -0
  79. package/dist/examples/translation/translation-bergamot.d.ts +2 -0
  80. package/dist/examples/translation/translation-bergamot.js +39 -0
  81. package/dist/examples/translation/translation-indic.js +1 -0
  82. package/dist/examples/translation/translation-opus.js +1 -0
  83. package/dist/examples/translation/translation-stream.js +1 -0
  84. package/dist/expo/plugins/withMobileBundle.js +29 -10
  85. package/dist/index.d.ts +5 -4
  86. package/dist/index.js +4 -2
  87. package/dist/logging/addon.d.ts +6 -0
  88. package/dist/logging/addon.js +75 -0
  89. package/dist/logging/base-logger.js +26 -16
  90. package/dist/logging/client-logger.d.ts +3 -0
  91. package/dist/logging/client-logger.js +24 -0
  92. package/dist/logging/index.d.ts +7 -1
  93. package/dist/logging/index.js +7 -1
  94. package/dist/logging/logger.d.ts +0 -2
  95. package/dist/logging/logger.js +11 -6
  96. package/dist/logging/namespaces.d.ts +12 -0
  97. package/dist/logging/namespaces.js +12 -0
  98. package/dist/logging/registry.d.ts +31 -0
  99. package/dist/logging/registry.js +48 -0
  100. package/dist/logging/server-logger.d.ts +3 -0
  101. package/dist/logging/server-logger.js +16 -0
  102. package/dist/logging/stream-logger.d.ts +1 -1
  103. package/dist/logging/stream-logger.js +6 -3
  104. package/dist/logging/transport.js +2 -2
  105. package/dist/logging/types.d.ts +2 -0
  106. package/dist/logging/utils.d.ts +2 -0
  107. package/dist/logging/utils.js +62 -0
  108. package/dist/models/hyperdrive/models.d.ts +1886 -230
  109. package/dist/models/hyperdrive/models.js +2191 -443
  110. package/dist/schemas/archive.d.ts +9 -0
  111. package/dist/schemas/archive.js +17 -0
  112. package/dist/schemas/cancel.d.ts +6 -0
  113. package/dist/schemas/cancel.js +5 -0
  114. package/dist/schemas/common.d.ts +660 -92
  115. package/dist/schemas/common.js +6 -4
  116. package/dist/schemas/delegate.d.ts +1 -0
  117. package/dist/schemas/delegate.js +1 -0
  118. package/dist/schemas/download-asset.d.ts +21 -9
  119. package/dist/schemas/embed.d.ts +3 -3
  120. package/dist/schemas/embed.js +9 -2
  121. package/dist/schemas/get-model-info.d.ts +12 -10
  122. package/dist/schemas/get-model-info.js +9 -1
  123. package/dist/schemas/index.d.ts +9 -1
  124. package/dist/schemas/index.js +12 -1
  125. package/dist/schemas/json-schema.d.ts +16 -0
  126. package/dist/schemas/json-schema.js +2 -0
  127. package/dist/schemas/llamacpp-config.d.ts +117 -12
  128. package/dist/schemas/llamacpp-config.js +46 -12
  129. package/dist/schemas/load-model.d.ts +3669 -481
  130. package/dist/schemas/load-model.js +95 -34
  131. package/dist/schemas/logging-stream.d.ts +11 -4
  132. package/dist/schemas/logging-stream.js +4 -3
  133. package/dist/schemas/mcp-adapter.d.ts +47 -0
  134. package/dist/schemas/mcp-adapter.js +1 -0
  135. package/dist/schemas/model-src-utils.d.ts +38 -14
  136. package/dist/schemas/model-src-utils.js +4 -3
  137. package/dist/schemas/model-types.d.ts +154 -0
  138. package/dist/schemas/model-types.js +140 -0
  139. package/dist/schemas/ocr.d.ts +88 -0
  140. package/dist/schemas/ocr.js +52 -0
  141. package/dist/schemas/rag.d.ts +183 -52
  142. package/dist/schemas/rag.js +148 -23
  143. package/dist/schemas/reload-config.d.ts +356 -0
  144. package/dist/schemas/reload-config.js +44 -0
  145. package/dist/schemas/runtime-context.d.ts +19 -0
  146. package/dist/schemas/runtime-context.js +7 -0
  147. package/dist/schemas/sdk-config.d.ts +717 -0
  148. package/dist/schemas/sdk-config.js +131 -0
  149. package/dist/schemas/sdk-errors-client.d.ts +5 -0
  150. package/dist/schemas/sdk-errors-client.js +25 -0
  151. package/dist/schemas/sdk-errors-server.d.ts +17 -0
  152. package/dist/schemas/sdk-errors-server.js +85 -0
  153. package/dist/schemas/shard.d.ts +21 -0
  154. package/dist/schemas/shard.js +17 -0
  155. package/dist/schemas/tools.d.ts +3 -0
  156. package/dist/schemas/translate.d.ts +68 -23
  157. package/dist/schemas/translate.js +37 -11
  158. package/dist/schemas/translation-config.d.ts +337 -13
  159. package/dist/schemas/translation-config.js +65 -9
  160. package/dist/schemas/whispercpp-config.d.ts +9 -1
  161. package/dist/schemas/whispercpp-config.js +2 -1
  162. package/dist/scripts/run-unit-tests.d.ts +2 -0
  163. package/dist/scripts/run-unit-tests.js +17 -0
  164. package/dist/server/bare/addons/llamacpp-completion/cache-logger.d.ts +6 -0
  165. package/dist/server/bare/addons/llamacpp-completion/cache-logger.js +34 -0
  166. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/create-model.d.ts +1 -5
  167. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/create-model.js +6 -20
  168. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/handlers/completion-stream.js +26 -7
  169. package/dist/server/bare/addons/llamacpp-completion/index.d.ts +4 -0
  170. package/dist/server/bare/addons/llamacpp-completion/index.js +3 -0
  171. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/kv-cache-utils.d.ts +4 -1
  172. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/kv-cache-utils.js +49 -14
  173. package/dist/server/bare/addons/llamacpp-embedding/create-model.d.ts +8 -0
  174. package/dist/server/bare/addons/llamacpp-embedding/create-model.js +38 -0
  175. package/dist/server/bare/addons/llamacpp-embedding/handlers/embed.d.ts +12 -0
  176. package/dist/server/bare/addons/{llamacpp → llamacpp-embedding}/handlers/embed.js +18 -4
  177. package/dist/server/bare/addons/llamacpp-embedding/index.d.ts +3 -0
  178. package/dist/server/bare/addons/llamacpp-embedding/index.js +2 -0
  179. package/dist/server/bare/addons/load-model.js +38 -28
  180. package/dist/server/bare/addons/{translation → nmtcpp-translation}/create-model.js +23 -8
  181. package/dist/server/bare/addons/{translation → nmtcpp-translation}/handlers/translate.js +35 -11
  182. package/dist/server/bare/addons/onnx-ocr/create-model.d.ts +10 -0
  183. package/dist/server/bare/addons/onnx-ocr/create-model.js +39 -0
  184. package/dist/server/bare/addons/onnx-ocr/handlers/ocr-stream.d.ts +10 -0
  185. package/dist/server/bare/addons/onnx-ocr/handlers/ocr-stream.js +109 -0
  186. package/dist/server/bare/addons/onnx-ocr/index.d.ts +3 -0
  187. package/dist/server/bare/addons/onnx-ocr/index.js +2 -0
  188. package/dist/server/bare/addons/unload-model.js +6 -3
  189. package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/create-model.js +2 -1
  190. package/dist/server/bare/addons/whispercpp-transcription/handlers/transcribe-stream.js +82 -0
  191. package/dist/server/bare/delegate-rpc-client.js +31 -11
  192. package/dist/server/bare/hyperswarm.js +7 -5
  193. package/dist/server/bare/rag-hyperdb/handlers/chunk.d.ts +3 -0
  194. package/dist/server/bare/rag-hyperdb/handlers/chunk.js +7 -0
  195. package/dist/server/bare/rag-hyperdb/handlers/close-workspace.d.ts +3 -0
  196. package/dist/server/bare/rag-hyperdb/handlers/close-workspace.js +9 -0
  197. package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.d.ts +1 -1
  198. package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.js +9 -10
  199. package/dist/server/bare/rag-hyperdb/handlers/delete-workspace.d.ts +3 -0
  200. package/dist/server/bare/rag-hyperdb/handlers/delete-workspace.js +14 -0
  201. package/dist/server/bare/rag-hyperdb/handlers/ingest.d.ts +9 -0
  202. package/dist/server/bare/rag-hyperdb/handlers/ingest.js +18 -0
  203. package/dist/server/bare/rag-hyperdb/handlers/list-workspaces.d.ts +3 -0
  204. package/dist/server/bare/rag-hyperdb/handlers/list-workspaces.js +4 -0
  205. package/dist/server/bare/rag-hyperdb/handlers/reindex.d.ts +9 -0
  206. package/dist/server/bare/rag-hyperdb/handlers/reindex.js +16 -0
  207. package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.d.ts +7 -4
  208. package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.js +13 -14
  209. package/dist/server/bare/rag-hyperdb/handlers/search.js +10 -10
  210. package/dist/server/bare/rag-hyperdb/index.d.ts +8 -1
  211. package/dist/server/bare/rag-hyperdb/index.js +8 -1
  212. package/dist/server/bare/rag-hyperdb/rag-operation-manager.d.ts +7 -0
  213. package/dist/server/bare/rag-hyperdb/rag-operation-manager.js +39 -0
  214. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.d.ts +15 -0
  215. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +135 -0
  216. package/dist/server/bare/registry/config-registry.d.ts +13 -4
  217. package/dist/server/bare/registry/config-registry.js +53 -10
  218. package/dist/server/bare/registry/logging-stream-registry.d.ts +24 -7
  219. package/dist/server/bare/registry/logging-stream-registry.js +99 -20
  220. package/dist/server/bare/registry/model-config-registry.d.ts +4 -0
  221. package/dist/server/bare/registry/model-config-registry.js +15 -0
  222. package/dist/server/bare/registry/model-config-utils.d.ts +15 -0
  223. package/dist/server/bare/registry/model-config-utils.js +121 -0
  224. package/dist/server/bare/registry/model-registry.d.ts +6 -26
  225. package/dist/server/bare/registry/model-registry.js +9 -6
  226. package/dist/server/bare/registry/runtime-context-registry.d.ts +7 -0
  227. package/dist/server/bare/registry/runtime-context-registry.js +26 -0
  228. package/dist/server/bare/utils/loader-adapter.d.ts +7 -0
  229. package/dist/server/bare/utils/loader-adapter.js +9 -0
  230. package/dist/server/error-handlers.js +4 -2
  231. package/dist/server/rpc/create-server.js +5 -3
  232. package/dist/server/rpc/handle-request.js +115 -19
  233. package/dist/server/rpc/handlers/cancelHandler.js +13 -2
  234. package/dist/server/rpc/handlers/completion-stream-delegated.js +4 -2
  235. package/dist/server/rpc/handlers/completion-stream.js +1 -1
  236. package/dist/server/rpc/handlers/delete-cache.js +4 -2
  237. package/dist/server/rpc/handlers/download-asset.js +3 -1
  238. package/dist/server/rpc/handlers/embed.js +4 -2
  239. package/dist/server/rpc/handlers/get-model-info.d.ts +1 -1
  240. package/dist/server/rpc/handlers/get-model-info.js +22 -10
  241. package/dist/server/rpc/handlers/index.d.ts +4 -2
  242. package/dist/server/rpc/handlers/index.js +2 -2
  243. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +11 -11
  244. package/dist/server/rpc/handlers/load-model/download-manager.js +40 -28
  245. package/dist/server/rpc/handlers/{load-model.d.ts → load-model/handler.d.ts} +2 -2
  246. package/dist/server/rpc/handlers/load-model/handler.js +179 -0
  247. package/dist/server/rpc/handlers/load-model/http.js +361 -50
  248. package/dist/server/rpc/handlers/load-model/hyperdrive.js +26 -22
  249. package/dist/server/rpc/handlers/load-model/index.d.ts +2 -2
  250. package/dist/server/rpc/handlers/load-model/index.js +2 -2
  251. package/dist/server/rpc/handlers/load-model/resolve.js +39 -8
  252. package/dist/server/rpc/handlers/load-model-delegated.d.ts +2 -2
  253. package/dist/server/rpc/handlers/load-model-delegated.js +15 -10
  254. package/dist/server/rpc/handlers/logging-stream.js +4 -4
  255. package/dist/server/rpc/handlers/ocr-stream.d.ts +3 -0
  256. package/dist/server/rpc/handlers/ocr-stream.js +39 -0
  257. package/dist/server/rpc/handlers/provideHandler/connection.js +12 -10
  258. package/dist/server/rpc/handlers/provideHandler/handler.js +18 -16
  259. package/dist/server/rpc/handlers/provideHandler/proxy.js +8 -6
  260. package/dist/server/rpc/handlers/rag.d.ts +2 -2
  261. package/dist/server/rpc/handlers/rag.js +107 -41
  262. package/dist/server/rpc/handlers/stopProvideHandler.js +3 -1
  263. package/dist/server/rpc/handlers/text-to-speech.js +1 -1
  264. package/dist/server/rpc/handlers/transcribe-stream.js +4 -2
  265. package/dist/server/rpc/handlers/translate.js +9 -16
  266. package/dist/server/rpc/handlers/unload-model.js +4 -2
  267. package/dist/server/utils/archive.d.ts +3 -0
  268. package/dist/server/utils/archive.js +171 -0
  269. package/dist/server/utils/audio/decoder.d.ts +2 -1
  270. package/dist/server/utils/audio/decoder.js +48 -11
  271. package/dist/server/utils/cache.d.ts +5 -5
  272. package/dist/server/utils/cache.js +13 -11
  273. package/dist/server/utils/config-transform.d.ts +3 -0
  274. package/dist/server/utils/config-transform.js +23 -0
  275. package/dist/server/utils/formatting.d.ts +13 -0
  276. package/dist/server/utils/formatting.js +26 -0
  277. package/dist/server/utils/gguf-tensor-extractor.d.ts +15 -0
  278. package/dist/server/utils/gguf-tensor-extractor.js +314 -0
  279. package/dist/server/utils/index.d.ts +4 -1
  280. package/dist/server/utils/index.js +4 -1
  281. package/dist/server/utils/shard-utils.d.ts +42 -16
  282. package/dist/server/utils/shard-utils.js +95 -7
  283. package/dist/server/worker.js +49 -19
  284. package/dist/utils/errors-base.d.ts +1 -1
  285. package/dist/utils/errors-base.js +2 -2
  286. package/dist/utils/errors-client.d.ts +24 -0
  287. package/dist/utils/errors-client.js +40 -0
  288. package/dist/utils/errors-server.d.ts +42 -0
  289. package/dist/utils/errors-server.js +71 -0
  290. package/dist/utils/mcp-adapter.d.ts +12 -0
  291. package/dist/utils/mcp-adapter.js +103 -0
  292. package/dist/utils/object.d.ts +2 -0
  293. package/dist/utils/object.js +3 -0
  294. package/dist/utils/tool-helpers.d.ts +10 -2
  295. package/dist/utils/tool-helpers.js +24 -11
  296. package/package.json +74 -36
  297. package/dist/client/api/set-config.d.ts +0 -7
  298. package/dist/client/api/set-config.js +0 -20
  299. package/dist/client/config-manager.d.ts +0 -4
  300. package/dist/client/config-manager.js +0 -8
  301. package/dist/client/rpc/bare-rpc-client.d.ts +0 -4
  302. package/dist/client/rpc/bare-rpc-client.js +0 -91
  303. package/dist/examples/llamacpp-file-logging.d.ts +0 -2
  304. package/dist/examples/rag/rag-hyperdb-workspaces.d.ts +0 -2
  305. package/dist/examples/rag/rag-hyperdb-workspaces.js +0 -106
  306. package/dist/examples/rag/rag-hyperdb.d.ts +0 -2
  307. package/dist/schemas/set-config.d.ts +0 -21
  308. package/dist/schemas/set-config.js +0 -14
  309. package/dist/server/bare/addons/llamacpp/handlers/embed.d.ts +0 -4
  310. package/dist/server/bare/addons/llamacpp/index.d.ts +0 -4
  311. package/dist/server/bare/addons/llamacpp/index.js +0 -3
  312. package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.js +0 -63
  313. package/dist/server/bare/rag-hyperdb/rag-manager.d.ts +0 -5
  314. package/dist/server/bare/rag-hyperdb/rag-manager.js +0 -64
  315. package/dist/server/rpc/handlers/load-model.js +0 -59
  316. package/dist/server/rpc/handlers/set-config.d.ts +0 -3
  317. package/dist/server/rpc/handlers/set-config.js +0 -18
  318. package/dist/server/utils/hash.d.ts +0 -5
  319. package/dist/server/utils/hash.js +0 -11
  320. /package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/handlers/completion-stream.d.ts +0 -0
  321. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/create-model.d.ts +0 -0
  322. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/handlers/translate.d.ts +0 -0
  323. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/index.d.ts +0 -0
  324. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/index.js +0 -0
  325. /package/dist/server/bare/addons/{tts → onnx-tts}/create-model.d.ts +0 -0
  326. /package/dist/server/bare/addons/{tts → onnx-tts}/create-model.js +0 -0
  327. /package/dist/server/bare/addons/{tts → onnx-tts}/handlers/text-to-speech.d.ts +0 -0
  328. /package/dist/server/bare/addons/{tts → onnx-tts}/handlers/text-to-speech.js +0 -0
  329. /package/dist/server/bare/addons/{tts → onnx-tts}/index.d.ts +0 -0
  330. /package/dist/server/bare/addons/{tts → onnx-tts}/index.js +0 -0
  331. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/create-model.d.ts +0 -0
  332. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/handlers/transcribe-stream.d.ts +0 -0
  333. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/index.d.ts +0 -0
  334. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/index.js +0 -0
@@ -0,0 +1,23 @@
1
+ import { normalizeModelType, ModelType, } from "../../schemas/index.js";
2
+ export function transformConfigForReload(modelType, config) {
3
+ const canonicalType = normalizeModelType(modelType);
4
+ switch (canonicalType) {
5
+ case ModelType.whispercppTranscription: {
6
+ const whisperConfig = config;
7
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
8
+ const { contextParams, miscConfig, ...whisperParams } = whisperConfig;
9
+ return {
10
+ whisperConfig: whisperParams,
11
+ ...(miscConfig && { miscConfig }),
12
+ };
13
+ }
14
+ case ModelType.llamacppCompletion:
15
+ case ModelType.llamacppEmbedding:
16
+ case ModelType.nmtcppTranslation:
17
+ case ModelType.onnxTts:
18
+ // Return as-is for now
19
+ return config;
20
+ default:
21
+ return config;
22
+ }
23
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Generate a short hash (16 characters) from any input string
3
+ */
4
+ export declare function generateShortHash(input: string): string;
5
+ /**
6
+ * Calculate progress percentage with bounds checking and consistent formatting
7
+ * @param current - Current progress value
8
+ * @param total - Total value
9
+ * @param decimals - Number of decimal places (default: 2)
10
+ * @returns Percentage clamped between 0-100 with fixed decimal places
11
+ */
12
+ export declare function calculatePercentage(current: number, total: number, decimals?: number): number;
13
+ //# sourceMappingURL=formatting.d.ts.map
@@ -0,0 +1,26 @@
1
+ import crypto from "bare-crypto";
2
+ /**
3
+ * Generate a short hash (16 characters) from any input string
4
+ */
5
+ export function generateShortHash(input) {
6
+ const hash = crypto
7
+ .createHash("sha256")
8
+ .update(Buffer.from(input, "utf8"))
9
+ .digest("hex");
10
+ return hash.substring(0, 16);
11
+ }
12
+ /**
13
+ * Calculate progress percentage with bounds checking and consistent formatting
14
+ * @param current - Current progress value
15
+ * @param total - Total value
16
+ * @param decimals - Number of decimal places (default: 2)
17
+ * @returns Percentage clamped between 0-100 with fixed decimal places
18
+ */
19
+ export function calculatePercentage(current, total, decimals = 2) {
20
+ if (total <= 0 || current < 0) {
21
+ return 0;
22
+ }
23
+ const rawPercentage = (current / total) * 100;
24
+ const clampedPercentage = Math.min(Math.max(rawPercentage, 0), 100);
25
+ return Number(clampedPercentage.toFixed(decimals));
26
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Extract tensor names from all GGUF shards and write to {baseFilename}.tensors.txt
3
+ * Required for sharded models to enable incremental/async loading
4
+ * @throws ModelLoadFailedError if any shard fails extraction
5
+ */
6
+ export declare function extractAndWriteTensorsFile(shardDir: string, shardFilenames: string[], baseFilename: string): Promise<string>;
7
+ /**
8
+ * Check if a file has a valid GGUF header structure.
9
+ * Returns true if the header parses successfully and contains tensor metadata.
10
+ *
11
+ * NOTE: This only validates the header structure, NOT that tensor data exists.
12
+ * A file can have a valid header but be incomplete.
13
+ */
14
+ export declare function hasValidGGUFHeader(filePath: string): Promise<boolean>;
15
+ //# sourceMappingURL=gguf-tensor-extractor.d.ts.map
@@ -0,0 +1,314 @@
1
+ import { promises as fsPromises, createReadStream } from "bare-fs";
2
+ import path from "bare-path";
3
+ import { getServerLogger } from "../../logging/index.js";
4
+ import { ModelLoadFailedError } from "../../utils/errors-server.js";
5
+ const logger = getServerLogger();
6
+ // GGUF value types
7
+ const GGUF_TYPE = {
8
+ UINT8: 0,
9
+ INT8: 1,
10
+ UINT16: 2,
11
+ INT16: 3,
12
+ UINT32: 4,
13
+ INT32: 5,
14
+ FLOAT32: 6,
15
+ BOOL: 7,
16
+ STRING: 8,
17
+ ARRAY: 9,
18
+ UINT64: 10,
19
+ INT64: 11,
20
+ FLOAT64: 12,
21
+ };
22
+ // Type sizes in bytes
23
+ const TYPE_SIZE = {
24
+ [GGUF_TYPE.UINT8]: 1,
25
+ [GGUF_TYPE.INT8]: 1,
26
+ [GGUF_TYPE.UINT16]: 2,
27
+ [GGUF_TYPE.INT16]: 2,
28
+ [GGUF_TYPE.UINT32]: 4,
29
+ [GGUF_TYPE.INT32]: 4,
30
+ [GGUF_TYPE.FLOAT32]: 4,
31
+ [GGUF_TYPE.BOOL]: 1,
32
+ [GGUF_TYPE.UINT64]: 8,
33
+ [GGUF_TYPE.INT64]: 8,
34
+ [GGUF_TYPE.FLOAT64]: 8,
35
+ };
36
+ // Limits to prevent DoS/corruption issues
37
+ const LIMITS = {
38
+ MAX_KV_COUNT: 100_000,
39
+ MAX_TENSOR_COUNT: 1_000_000,
40
+ MAX_STRING_LEN: 100 * 1024 * 1024, // 100MB for tokenizer vocab
41
+ MAX_TENSOR_NAME_LEN: 64 * 1024, // 64KB for tensor names
42
+ MAX_ARRAY_LEN: 1_000_000_000, // 1B elements
43
+ MAX_DIMS: 32,
44
+ MAX_HEADER_SIZE: 4 * 1024 * 1024 * 1024, // 4GB max header
45
+ };
46
+ // Magic bytes for endianness detection
47
+ const GGUF_MAGIC_LE = 0x46554747; // "GGUF" little-endian
48
+ const GGUF_MAGIC_BE = 0x47475546; // "FUGG" big-endian
49
+ // File-local error for streaming parser control flow
50
+ // Used to signal "keep reading chunks" rather than an actual failure
51
+ class NeedMoreDataError extends Error {
52
+ currentOffset;
53
+ bytesNeeded;
54
+ constructor(currentOffset, bytesNeeded) {
55
+ super(`Need more data: offset ${currentOffset} requires ${bytesNeeded} more bytes`);
56
+ this.currentOffset = currentOffset;
57
+ this.bytesNeeded = bytesNeeded;
58
+ this.name = "NeedMoreDataError";
59
+ }
60
+ }
61
+ function parseGGUFHeader(buffer) {
62
+ const bufferLength = buffer.length;
63
+ let offset = 0;
64
+ let isBigEndian = false;
65
+ function ensureBytes(needed) {
66
+ if (offset + needed > bufferLength) {
67
+ throw new NeedMoreDataError(offset, needed);
68
+ }
69
+ }
70
+ function readU32() {
71
+ ensureBytes(4);
72
+ const val = isBigEndian
73
+ ? buffer.readUInt32BE(offset)
74
+ : buffer.readUInt32LE(offset);
75
+ offset += 4;
76
+ return val;
77
+ }
78
+ function readU64() {
79
+ ensureBytes(8);
80
+ const val = isBigEndian
81
+ ? buffer.readBigUInt64BE(offset)
82
+ : buffer.readBigUInt64LE(offset);
83
+ offset += 8;
84
+ return val;
85
+ }
86
+ function readU64AsNumber() {
87
+ const val = readU64();
88
+ if (val > BigInt(Number.MAX_SAFE_INTEGER)) {
89
+ throw new ModelLoadFailedError(`Value ${val} exceeds safe integer range`);
90
+ }
91
+ return Number(val);
92
+ }
93
+ function skipBytes(n) {
94
+ ensureBytes(n);
95
+ offset += n;
96
+ }
97
+ function skipString() {
98
+ const len = readU64AsNumber();
99
+ if (len > LIMITS.MAX_STRING_LEN) {
100
+ throw new ModelLoadFailedError(`String length ${len} exceeds limit ${LIMITS.MAX_STRING_LEN}`);
101
+ }
102
+ skipBytes(len);
103
+ }
104
+ function readTensorName() {
105
+ const len = readU64AsNumber();
106
+ if (len > LIMITS.MAX_TENSOR_NAME_LEN) {
107
+ logger.warn(`Tensor name length ${len} exceeds limit, truncating`);
108
+ skipBytes(len);
109
+ return "";
110
+ }
111
+ ensureBytes(len);
112
+ const name = buffer.toString("utf8", offset, offset + len);
113
+ offset += len;
114
+ return name;
115
+ }
116
+ function skipValue(valueType) {
117
+ const size = TYPE_SIZE[valueType];
118
+ if (size !== undefined) {
119
+ skipBytes(size);
120
+ return;
121
+ }
122
+ if (valueType === GGUF_TYPE.STRING) {
123
+ skipString();
124
+ return;
125
+ }
126
+ if (valueType === GGUF_TYPE.ARRAY) {
127
+ const arrayType = readU32();
128
+ const arrayLen = readU64AsNumber();
129
+ if (arrayLen > LIMITS.MAX_ARRAY_LEN) {
130
+ throw new ModelLoadFailedError(`Array length ${arrayLen} exceeds limit ${LIMITS.MAX_ARRAY_LEN}`);
131
+ }
132
+ const elementSize = TYPE_SIZE[arrayType];
133
+ if (elementSize !== undefined) {
134
+ // Fixed-size elements
135
+ skipBytes(arrayLen * elementSize);
136
+ }
137
+ else if (arrayType === GGUF_TYPE.STRING) {
138
+ // Array of strings
139
+ for (let i = 0; i < arrayLen; i++) {
140
+ skipString();
141
+ }
142
+ }
143
+ else if (arrayType === GGUF_TYPE.ARRAY) {
144
+ throw new ModelLoadFailedError("Nested arrays not supported");
145
+ }
146
+ else {
147
+ throw new ModelLoadFailedError(`Unknown array element type: ${arrayType}`);
148
+ }
149
+ return;
150
+ }
151
+ throw new ModelLoadFailedError(`Unknown value type: ${valueType}`);
152
+ }
153
+ // Parse header
154
+ ensureBytes(4);
155
+ const magicLE = buffer.readUInt32LE(offset);
156
+ if (magicLE === GGUF_MAGIC_LE) {
157
+ isBigEndian = false;
158
+ }
159
+ else if (magicLE === GGUF_MAGIC_BE) {
160
+ isBigEndian = true;
161
+ logger.debug("Detected big-endian GGUF file");
162
+ }
163
+ else {
164
+ throw new ModelLoadFailedError(`Invalid GGUF file - magic number mismatch (got 0x${magicLE.toString(16)})`);
165
+ }
166
+ offset += 4;
167
+ // Version
168
+ const version = readU32();
169
+ if (version !== 2 && version !== 3) {
170
+ throw new ModelLoadFailedError(`Unsupported GGUF version: ${version}`);
171
+ }
172
+ // Tensor count and KV count
173
+ const tensorCount = readU64AsNumber();
174
+ const kvCount = readU64AsNumber();
175
+ if (tensorCount > LIMITS.MAX_TENSOR_COUNT) {
176
+ throw new ModelLoadFailedError(`Tensor count ${tensorCount} exceeds limit ${LIMITS.MAX_TENSOR_COUNT}`);
177
+ }
178
+ if (kvCount > LIMITS.MAX_KV_COUNT) {
179
+ throw new ModelLoadFailedError(`KV count ${kvCount} exceeds limit ${LIMITS.MAX_KV_COUNT}`);
180
+ }
181
+ // Skip all KV pairs
182
+ for (let i = 0; i < kvCount; i++) {
183
+ skipString();
184
+ const valueType = readU32();
185
+ skipValue(valueType);
186
+ }
187
+ logger.debug(`KV section complete at offset ${offset}, reading tensor names...`);
188
+ const tensorNames = [];
189
+ for (let i = 0; i < tensorCount; i++) {
190
+ const name = readTensorName();
191
+ if (name) {
192
+ tensorNames.push(name);
193
+ }
194
+ // n_dims (u32)
195
+ const nDims = readU32();
196
+ if (nDims > LIMITS.MAX_DIMS) {
197
+ throw new ModelLoadFailedError(`Tensor dimensions ${nDims} exceeds limit ${LIMITS.MAX_DIMS}`);
198
+ }
199
+ // shape: nDims * u64
200
+ skipBytes(nDims * 8);
201
+ // dtype (u32)
202
+ skipBytes(4);
203
+ // offset (u64)
204
+ skipBytes(8);
205
+ }
206
+ logger.debug(`Parsed ${tensorNames.length} tensor names successfully`);
207
+ return tensorNames;
208
+ }
209
+ async function extractTensorNamesFromHeader(filePath) {
210
+ const stream = createReadStream(filePath);
211
+ const chunks = [];
212
+ let totalRead = 0;
213
+ let streamDestroyed = false;
214
+ function destroyStream() {
215
+ if (!streamDestroyed) {
216
+ streamDestroyed = true;
217
+ stream.destroy();
218
+ }
219
+ }
220
+ try {
221
+ for await (const chunk of stream) {
222
+ chunks.push(chunk);
223
+ totalRead += chunk.length;
224
+ // Only attempt parsing once we have enough data for the basic header
225
+ if (totalRead >= 24) {
226
+ try {
227
+ const buffer = Buffer.concat(chunks);
228
+ const result = parseGGUFHeader(buffer);
229
+ destroyStream();
230
+ return result;
231
+ }
232
+ catch (error) {
233
+ if (error instanceof NeedMoreDataError) {
234
+ // Keep reading
235
+ if (totalRead >= LIMITS.MAX_HEADER_SIZE) {
236
+ throw new ModelLoadFailedError(`GGUF header exceeds ${LIMITS.MAX_HEADER_SIZE / (1024 * 1024 * 1024)}GB limit`);
237
+ }
238
+ continue;
239
+ }
240
+ throw error;
241
+ }
242
+ }
243
+ }
244
+ throw new ModelLoadFailedError("File ended before GGUF header could be parsed");
245
+ }
246
+ finally {
247
+ destroyStream();
248
+ }
249
+ }
250
+ /**
251
+ * Extract tensor names from all GGUF shards and write to {baseFilename}.tensors.txt
252
+ * Required for sharded models to enable incremental/async loading
253
+ * @throws ModelLoadFailedError if any shard fails extraction
254
+ */
255
+ export async function extractAndWriteTensorsFile(shardDir, shardFilenames, baseFilename) {
256
+ const tensorsFilePath = path.join(shardDir, `${baseFilename}.tensors.txt`);
257
+ try {
258
+ await fsPromises.access(tensorsFilePath);
259
+ logger.info(`Tensors file already exists: ${tensorsFilePath}`);
260
+ return tensorsFilePath;
261
+ }
262
+ catch {
263
+ // Continue with extraction
264
+ }
265
+ logger.info(`Extracting tensors from ${shardFilenames.length} shards...`);
266
+ const allTensorNames = new Set();
267
+ const failedShards = [];
268
+ for (const filename of shardFilenames) {
269
+ const shardPath = path.join(shardDir, filename);
270
+ try {
271
+ logger.debug(`Extracting tensors from ${filename}...`);
272
+ const tensorNames = await extractTensorNamesFromHeader(shardPath);
273
+ if (tensorNames.length > 0) {
274
+ tensorNames.forEach((name) => allTensorNames.add(name));
275
+ logger.info(`Extracted ${tensorNames.length} tensors from ${filename}`);
276
+ }
277
+ else {
278
+ failedShards.push(filename);
279
+ logger.error(`No tensors found in ${filename}`);
280
+ }
281
+ }
282
+ catch (error) {
283
+ failedShards.push(filename);
284
+ logger.error(`Failed to extract tensors from ${filename}:`, error);
285
+ }
286
+ }
287
+ if (failedShards.length > 0) {
288
+ throw new ModelLoadFailedError(`Failed to extract tensors from ${failedShards.length}/${shardFilenames.length} shards: ${failedShards.join(", ")}`);
289
+ }
290
+ if (allTensorNames.size === 0) {
291
+ throw new ModelLoadFailedError(`Could not extract any tensors from shards.`);
292
+ }
293
+ const tensorNames = Array.from(allTensorNames).sort();
294
+ await fsPromises.writeFile(tensorsFilePath, tensorNames.join("\n") + "\n", "utf8");
295
+ logger.info(`Tensors file created: ${tensorsFilePath} (${tensorNames.length} tensors from ${shardFilenames.length} shards)`);
296
+ return tensorsFilePath;
297
+ }
298
+ /**
299
+ * Check if a file has a valid GGUF header structure.
300
+ * Returns true if the header parses successfully and contains tensor metadata.
301
+ *
302
+ * NOTE: This only validates the header structure, NOT that tensor data exists.
303
+ * A file can have a valid header but be incomplete.
304
+ */
305
+ export async function hasValidGGUFHeader(filePath) {
306
+ try {
307
+ const tensorNames = await extractTensorNamesFromHeader(filePath);
308
+ return tensorNames.length > 0;
309
+ }
310
+ catch (error) {
311
+ logger.warn(`⚠️ GGUF header validation failed: ${error instanceof Error ? error.message : String(error)}`);
312
+ return false;
313
+ }
314
+ }
@@ -1,7 +1,10 @@
1
+ export * from "./archive";
1
2
  export * from "./audio/decoder";
2
3
  export * from "./cache";
3
4
  export * from "./checksum";
4
- export * from "./hash";
5
+ export * from "./config-transform";
6
+ export * from "./formatting";
7
+ export * from "./gguf-tensor-extractor";
5
8
  export * from "./model-path";
6
9
  export * from "./shard-utils";
7
10
  //# sourceMappingURL=index.d.ts.map
@@ -1,6 +1,9 @@
1
+ export * from "./archive.js";
1
2
  export * from "./audio/decoder.js";
2
3
  export * from "./cache.js";
3
4
  export * from "./checksum.js";
4
- export * from "./hash.js";
5
+ export * from "./config-transform.js";
6
+ export * from "./formatting.js";
7
+ export * from "./gguf-tensor-extractor.js";
5
8
  export * from "./model-path.js";
6
9
  export * from "./shard-utils.js";
@@ -1,22 +1,48 @@
1
- export interface ShardInfo {
2
- isSharded: boolean;
3
- currentShard?: number;
4
- totalShards?: number;
5
- baseFilename?: string;
6
- extension?: string;
7
- }
8
- export interface ShardMetadata {
9
- filename: string;
10
- expectedSize: number;
11
- sha256Checksum: string;
12
- }
1
+ import type { ShardPatternInfo, ShardUrl } from "../../schemas/index";
13
2
  /**
14
3
  * Detect if model filename follows shard pattern (00001-of-0000x)
15
4
  */
16
- export declare function detectShardedModel(filename: string): ShardInfo;
5
+ export declare function detectShardedModel(filename: string): ShardPatternInfo;
17
6
  /**
18
- * Generate list of all required files for a sharded model
19
- * Includes numbered shards AND the .tensors.txt companion file
7
+ * Generate list of shard filenames for a sharded model
8
+ * Accepts any shard in the group
9
+ *
10
+ * @param shardName - Any shard filename in the group (e.g., "model-00002-of-00005.gguf")
11
+ * @returns Array of all numbered shard filenames
20
12
  */
21
- export declare function generateShardFilenames(firstShardName: string): string[];
13
+ export declare function generateShardFilenames(shardName: string): string[];
14
+ /**
15
+ * Parse pattern-based shard URL and generate all shard URLs with cache key
16
+ * Works with patterns like: https://example.com/path/model-00002-of-00005.gguf
17
+ *
18
+ * @param shardUrl - Any shard URL in the group
19
+ * @returns Object with shard URLs array and cache key
20
+ */
21
+ export declare function parsePatternBasedShardUrl(shardUrl: string): {
22
+ shardUrls: ShardUrl[];
23
+ cacheKey: string;
24
+ };
25
+ /**
26
+ * Extract tensor information from all shards and write to baseFilename.tensors.txt
27
+ * Required for sharded models to enable incremental/async loading
28
+ * @param shardDir - Directory containing the shard files
29
+ * @param shardFilename - Filename of any shard (e.g., "model-00001-of-00002.gguf")
30
+ * @returns Path to the created tensors.txt file
31
+ * @throws If not a sharded model or extraction fails
32
+ */
33
+ export declare function extractTensorsFromShards(shardDir: string, shardFilename: string): Promise<string>;
34
+ /**
35
+ * Check if all numbered shard files exist
36
+ * @param shardDir - Directory containing the shard files
37
+ * @param shardFilename - Filename of any shard (e.g., "model-00001-of-00002.gguf")
38
+ * @returns true if all numbered shards exist, false otherwise
39
+ */
40
+ export declare function checkAllShardsExist(shardDir: string, shardFilename: string): Promise<boolean>;
41
+ /**
42
+ * Validate that all shards and tensors.txt exist for a sharded model
43
+ * @param shardDir - Directory containing the shard files
44
+ * @param shardFilename - Filename of any shard (e.g., "model-00001-of-00002.gguf")
45
+ * @returns true if all shards and tensors.txt exist, false otherwise
46
+ */
47
+ export declare function validateShardedModelCache(shardDir: string, shardFilename: string): Promise<boolean>;
22
48
  //# sourceMappingURL=shard-utils.d.ts.map
@@ -1,4 +1,8 @@
1
- import { ModelLoadFailedError } from "../../utils/errors-server.js";
1
+ import { ModelLoadFailedError, InvalidShardUrlPatternError, } from "../../utils/errors-server.js";
2
+ import { generateShortHash } from "./formatting.js";
3
+ import { extractAndWriteTensorsFile } from "./gguf-tensor-extractor.js";
4
+ import { promises as fsPromises } from "bare-fs";
5
+ import path from "bare-path";
2
6
  /**
3
7
  * Detect if model filename follows shard pattern (00001-of-0000x)
4
8
  */
@@ -17,13 +21,16 @@ export function detectShardedModel(filename) {
17
21
  return { isSharded: false };
18
22
  }
19
23
  /**
20
- * Generate list of all required files for a sharded model
21
- * Includes numbered shards AND the .tensors.txt companion file
24
+ * Generate list of shard filenames for a sharded model
25
+ * Accepts any shard in the group
26
+ *
27
+ * @param shardName - Any shard filename in the group (e.g., "model-00002-of-00005.gguf")
28
+ * @returns Array of all numbered shard filenames
22
29
  */
23
- export function generateShardFilenames(firstShardName) {
24
- const shardInfo = detectShardedModel(firstShardName);
30
+ export function generateShardFilenames(shardName) {
31
+ const shardInfo = detectShardedModel(shardName);
25
32
  if (!shardInfo.isSharded || !shardInfo.totalShards) {
26
- throw new ModelLoadFailedError(`Not a sharded model filename: ${firstShardName}`);
33
+ throw new ModelLoadFailedError(`Not a sharded model filename: ${shardName}`);
27
34
  }
28
35
  const filenames = [];
29
36
  const { baseFilename, totalShards, extension } = shardInfo;
@@ -32,6 +39,87 @@ export function generateShardFilenames(firstShardName) {
32
39
  const totalShardsStr = totalShards.toString().padStart(5, "0");
33
40
  filenames.push(`${baseFilename}-${shardNumber}-of-${totalShardsStr}${extension}`);
34
41
  }
35
- filenames.push(`${baseFilename}.tensors.txt`);
36
42
  return filenames;
37
43
  }
44
+ /**
45
+ * Parse pattern-based shard URL and generate all shard URLs with cache key
46
+ * Works with patterns like: https://example.com/path/model-00002-of-00005.gguf
47
+ *
48
+ * @param shardUrl - Any shard URL in the group
49
+ * @returns Object with shard URLs array and cache key
50
+ */
51
+ export function parsePatternBasedShardUrl(shardUrl) {
52
+ const urlParts = shardUrl.split("/");
53
+ const filename = urlParts[urlParts.length - 1]?.split("?")[0] || "";
54
+ const shardInfo = detectShardedModel(filename);
55
+ if (!shardInfo.isSharded || !shardInfo.baseFilename) {
56
+ throw new InvalidShardUrlPatternError(shardUrl);
57
+ }
58
+ const shardFilenames = generateShardFilenames(filename);
59
+ const baseUrl = urlParts.slice(0, -1).join("/");
60
+ return {
61
+ shardUrls: shardFilenames.map((shardFilename) => ({
62
+ url: `${baseUrl}/${shardFilename}`,
63
+ filename: shardFilename,
64
+ })),
65
+ cacheKey: generateShortHash(`${baseUrl}/${shardInfo.baseFilename}`),
66
+ };
67
+ }
68
+ /**
69
+ * Extract tensor information from all shards and write to baseFilename.tensors.txt
70
+ * Required for sharded models to enable incremental/async loading
71
+ * @param shardDir - Directory containing the shard files
72
+ * @param shardFilename - Filename of any shard (e.g., "model-00001-of-00002.gguf")
73
+ * @returns Path to the created tensors.txt file
74
+ * @throws If not a sharded model or extraction fails
75
+ */
76
+ export async function extractTensorsFromShards(shardDir, shardFilename) {
77
+ const shardInfo = detectShardedModel(shardFilename);
78
+ if (!shardInfo.isSharded ||
79
+ !shardInfo.baseFilename ||
80
+ !shardInfo.totalShards) {
81
+ throw new ModelLoadFailedError(`Not a sharded model filename: ${shardFilename}`);
82
+ }
83
+ const allShardFilenames = generateShardFilenames(shardFilename);
84
+ return extractAndWriteTensorsFile(shardDir, allShardFilenames, shardInfo.baseFilename);
85
+ }
86
+ /**
87
+ * Check if all numbered shard files exist
88
+ * @param shardDir - Directory containing the shard files
89
+ * @param shardFilename - Filename of any shard (e.g., "model-00001-of-00002.gguf")
90
+ * @returns true if all numbered shards exist, false otherwise
91
+ */
92
+ export async function checkAllShardsExist(shardDir, shardFilename) {
93
+ const shardInfo = detectShardedModel(shardFilename);
94
+ if (!shardInfo.isSharded) {
95
+ return false;
96
+ }
97
+ const shardFilenames = generateShardFilenames(shardFilename);
98
+ const allShardsExist = await Promise.all(shardFilenames.map((f) => fsPromises
99
+ .access(path.join(shardDir, f))
100
+ .then(() => true)
101
+ .catch(() => false))).then((results) => results.every((exists) => exists));
102
+ return allShardsExist;
103
+ }
104
+ /**
105
+ * Validate that all shards and tensors.txt exist for a sharded model
106
+ * @param shardDir - Directory containing the shard files
107
+ * @param shardFilename - Filename of any shard (e.g., "model-00001-of-00002.gguf")
108
+ * @returns true if all shards and tensors.txt exist, false otherwise
109
+ */
110
+ export async function validateShardedModelCache(shardDir, shardFilename) {
111
+ const shardInfo = detectShardedModel(shardFilename);
112
+ if (!shardInfo.isSharded || !shardInfo.baseFilename) {
113
+ return false;
114
+ }
115
+ const allShardsExist = await checkAllShardsExist(shardDir, shardFilename);
116
+ if (!allShardsExist) {
117
+ return false;
118
+ }
119
+ const tensorsFile = `${shardInfo.baseFilename}.tensors.txt`;
120
+ const tensorsExist = await fsPromises
121
+ .access(path.join(shardDir, tensorsFile))
122
+ .then(() => true)
123
+ .catch(() => false);
124
+ return tensorsExist;
125
+ }