@qvac/sdk 0.5.0 → 0.6.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 (259) hide show
  1. package/README.md +48 -11
  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/get-model-info.d.ts +2 -2
  6. package/dist/client/api/get-model-info.js +2 -2
  7. package/dist/client/api/index.d.ts +2 -1
  8. package/dist/client/api/index.js +2 -1
  9. package/dist/client/api/load-model.js +6 -1
  10. package/dist/client/api/ocr.d.ts +31 -0
  11. package/dist/client/api/ocr.js +88 -0
  12. package/dist/client/api/rag.d.ts +215 -20
  13. package/dist/client/api/rag.js +382 -23
  14. package/dist/client/api/translate.js +10 -11
  15. package/dist/client/api/unload-model.js +1 -1
  16. package/dist/client/init-hooks.d.ts +4 -3
  17. package/dist/client/init-hooks.js +40 -31
  18. package/dist/client/rpc/bare-client.d.ts +1 -178
  19. package/dist/client/rpc/bare-client.js +42 -9
  20. package/dist/client/rpc/expo-rpc-client.js +57 -2
  21. package/dist/client/rpc/node-rpc-client.js +5 -1
  22. package/dist/client/rpc/rpc-client.d.ts +1 -1
  23. package/dist/client/rpc/rpc-client.js +11 -57
  24. package/dist/examples/config/blind-relay/blind-relay.config.d.ts +5 -0
  25. package/dist/examples/config/blind-relay/blind-relay.config.js +7 -0
  26. package/dist/examples/config/default/default.config.d.ts +8 -0
  27. package/dist/examples/config/default/default.config.js +6 -0
  28. package/dist/examples/default-config-usage.d.ts +17 -0
  29. package/dist/examples/default-config-usage.js +47 -0
  30. package/dist/examples/delegated-inference/consumer.js +1 -0
  31. package/dist/examples/download-with-blind-relays.js +4 -3
  32. package/dist/examples/embed-hyperdrive.js +4 -0
  33. package/dist/examples/kv-cache-custom-key.js +16 -1
  34. package/dist/examples/llamacpp-sharded.js +12 -3
  35. package/dist/examples/ocr-fasttext.d.ts +2 -0
  36. package/dist/examples/ocr-fasttext.js +52 -0
  37. package/dist/examples/quickstart.d.ts +2 -0
  38. package/dist/examples/quickstart.js +28 -0
  39. package/dist/examples/rag/rag-hyperdb/cancellation.d.ts +2 -0
  40. package/dist/examples/rag/rag-hyperdb/cancellation.js +75 -0
  41. package/dist/examples/rag/rag-hyperdb/ingest.d.ts +2 -0
  42. package/dist/examples/rag/{rag-hyperdb.js → rag-hyperdb/ingest.js} +10 -4
  43. package/dist/examples/rag/rag-hyperdb/pipeline.d.ts +2 -0
  44. package/dist/examples/rag/rag-hyperdb/pipeline.js +74 -0
  45. package/dist/examples/rag/rag-hyperdb/workspaces.d.ts +2 -0
  46. package/dist/examples/rag/rag-hyperdb/workspaces.js +178 -0
  47. package/dist/examples/translation/translation-bergamot-batch.d.ts +2 -0
  48. package/dist/examples/translation/translation-bergamot-batch.js +49 -0
  49. package/dist/examples/translation/translation-bergamot.d.ts +2 -0
  50. package/dist/examples/translation/translation-bergamot.js +39 -0
  51. package/dist/examples/translation/translation-indic.js +1 -0
  52. package/dist/examples/translation/translation-opus.js +1 -0
  53. package/dist/examples/translation/translation-stream.js +1 -0
  54. package/dist/expo/plugins/withMobileBundle.js +29 -10
  55. package/dist/index.d.ts +3 -2
  56. package/dist/index.js +3 -1
  57. package/dist/logging/addon.js +23 -7
  58. package/dist/logging/base-logger.js +2 -2
  59. package/dist/logging/client-logger.js +15 -4
  60. package/dist/logging/index.d.ts +1 -0
  61. package/dist/logging/index.js +1 -0
  62. package/dist/logging/logger.js +11 -3
  63. package/dist/logging/namespaces.d.ts +1 -0
  64. package/dist/logging/namespaces.js +1 -0
  65. package/dist/logging/registry.d.ts +5 -0
  66. package/dist/logging/registry.js +17 -5
  67. package/dist/logging/transport.js +2 -2
  68. package/dist/logging/utils.d.ts +2 -0
  69. package/dist/logging/utils.js +62 -0
  70. package/dist/models/hyperdrive/models.d.ts +1096 -178
  71. package/dist/models/hyperdrive/models.js +1476 -507
  72. package/dist/schemas/archive.d.ts +9 -0
  73. package/dist/schemas/archive.js +17 -0
  74. package/dist/schemas/cancel.d.ts +6 -0
  75. package/dist/schemas/cancel.js +5 -0
  76. package/dist/schemas/common.d.ts +582 -77
  77. package/dist/schemas/common.js +6 -1
  78. package/dist/schemas/delegate.d.ts +1 -0
  79. package/dist/schemas/delegate.js +1 -0
  80. package/dist/schemas/download-asset.d.ts +21 -9
  81. package/dist/schemas/get-model-info.d.ts +12 -10
  82. package/dist/schemas/get-model-info.js +9 -1
  83. package/dist/schemas/index.d.ts +6 -2
  84. package/dist/schemas/index.js +9 -2
  85. package/dist/schemas/llamacpp-config.d.ts +112 -8
  86. package/dist/schemas/llamacpp-config.js +40 -8
  87. package/dist/schemas/load-model.d.ts +2993 -525
  88. package/dist/schemas/load-model.js +88 -33
  89. package/dist/schemas/logging-stream.d.ts +2 -2
  90. package/dist/schemas/model-src-utils.d.ts +38 -16
  91. package/dist/schemas/model-src-utils.js +4 -8
  92. package/dist/schemas/model-types.d.ts +154 -0
  93. package/dist/schemas/model-types.js +140 -0
  94. package/dist/schemas/ocr.d.ts +88 -0
  95. package/dist/schemas/ocr.js +52 -0
  96. package/dist/schemas/rag.d.ts +183 -52
  97. package/dist/schemas/rag.js +148 -23
  98. package/dist/schemas/reload-config.d.ts +20 -8
  99. package/dist/schemas/reload-config.js +7 -5
  100. package/dist/schemas/runtime-context.d.ts +19 -0
  101. package/dist/schemas/runtime-context.js +7 -0
  102. package/dist/schemas/sdk-config.d.ts +697 -2
  103. package/dist/schemas/sdk-config.js +99 -1
  104. package/dist/schemas/sdk-errors-client.d.ts +1 -0
  105. package/dist/schemas/sdk-errors-client.js +5 -0
  106. package/dist/schemas/sdk-errors-server.d.ts +14 -0
  107. package/dist/schemas/sdk-errors-server.js +70 -0
  108. package/dist/schemas/shard.d.ts +21 -0
  109. package/dist/schemas/shard.js +17 -0
  110. package/dist/schemas/translate.d.ts +68 -23
  111. package/dist/schemas/translate.js +37 -11
  112. package/dist/schemas/translation-config.d.ts +272 -29
  113. package/dist/schemas/translation-config.js +63 -6
  114. package/dist/scripts/run-unit-tests.d.ts +2 -0
  115. package/dist/scripts/run-unit-tests.js +17 -0
  116. package/dist/server/bare/addons/llamacpp-completion/cache-logger.d.ts +6 -0
  117. package/dist/server/bare/addons/llamacpp-completion/cache-logger.js +34 -0
  118. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/create-model.d.ts +1 -5
  119. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/create-model.js +3 -26
  120. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/handlers/completion-stream.js +26 -7
  121. package/dist/server/bare/addons/llamacpp-completion/index.d.ts +4 -0
  122. package/dist/server/bare/addons/llamacpp-completion/index.js +3 -0
  123. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/kv-cache-utils.d.ts +4 -1
  124. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/kv-cache-utils.js +43 -10
  125. package/dist/server/bare/addons/llamacpp-embedding/create-model.d.ts +8 -0
  126. package/dist/server/bare/addons/llamacpp-embedding/create-model.js +38 -0
  127. package/dist/server/bare/addons/llamacpp-embedding/index.d.ts +3 -0
  128. package/dist/server/bare/addons/llamacpp-embedding/index.js +2 -0
  129. package/dist/server/bare/addons/load-model.js +28 -24
  130. package/dist/server/bare/addons/{translation → nmtcpp-translation}/create-model.js +23 -8
  131. package/dist/server/bare/addons/{translation → nmtcpp-translation}/handlers/translate.js +35 -11
  132. package/dist/server/bare/addons/onnx-ocr/create-model.d.ts +10 -0
  133. package/dist/server/bare/addons/onnx-ocr/create-model.js +39 -0
  134. package/dist/server/bare/addons/onnx-ocr/handlers/ocr-stream.d.ts +10 -0
  135. package/dist/server/bare/addons/onnx-ocr/handlers/ocr-stream.js +109 -0
  136. package/dist/server/bare/addons/onnx-ocr/index.d.ts +3 -0
  137. package/dist/server/bare/addons/onnx-ocr/index.js +2 -0
  138. package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/create-model.js +2 -1
  139. package/dist/server/bare/delegate-rpc-client.js +19 -1
  140. package/dist/server/bare/rag-hyperdb/handlers/chunk.d.ts +3 -0
  141. package/dist/server/bare/rag-hyperdb/handlers/chunk.js +7 -0
  142. package/dist/server/bare/rag-hyperdb/handlers/close-workspace.d.ts +3 -0
  143. package/dist/server/bare/rag-hyperdb/handlers/close-workspace.js +9 -0
  144. package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.d.ts +1 -1
  145. package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.js +9 -10
  146. package/dist/server/bare/rag-hyperdb/handlers/delete-workspace.d.ts +3 -0
  147. package/dist/server/bare/rag-hyperdb/handlers/delete-workspace.js +14 -0
  148. package/dist/server/bare/rag-hyperdb/handlers/ingest.d.ts +9 -0
  149. package/dist/server/bare/rag-hyperdb/handlers/ingest.js +18 -0
  150. package/dist/server/bare/rag-hyperdb/handlers/list-workspaces.d.ts +3 -0
  151. package/dist/server/bare/rag-hyperdb/handlers/list-workspaces.js +4 -0
  152. package/dist/server/bare/rag-hyperdb/handlers/reindex.d.ts +9 -0
  153. package/dist/server/bare/rag-hyperdb/handlers/reindex.js +16 -0
  154. package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.d.ts +7 -4
  155. package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.js +13 -14
  156. package/dist/server/bare/rag-hyperdb/handlers/search.js +10 -10
  157. package/dist/server/bare/rag-hyperdb/index.d.ts +8 -1
  158. package/dist/server/bare/rag-hyperdb/index.js +8 -1
  159. package/dist/server/bare/rag-hyperdb/rag-operation-manager.d.ts +7 -0
  160. package/dist/server/bare/rag-hyperdb/rag-operation-manager.js +39 -0
  161. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.d.ts +15 -0
  162. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +135 -0
  163. package/dist/server/bare/registry/config-registry.js +11 -0
  164. package/dist/server/bare/registry/logging-stream-registry.js +3 -3
  165. package/dist/server/bare/registry/model-config-registry.d.ts +4 -0
  166. package/dist/server/bare/registry/model-config-registry.js +15 -0
  167. package/dist/server/bare/registry/model-config-utils.d.ts +15 -0
  168. package/dist/server/bare/registry/model-config-utils.js +110 -0
  169. package/dist/server/bare/registry/model-registry.d.ts +6 -29
  170. package/dist/server/bare/registry/runtime-context-registry.d.ts +7 -0
  171. package/dist/server/bare/registry/runtime-context-registry.js +26 -0
  172. package/dist/server/bare/utils/loader-adapter.d.ts +7 -0
  173. package/dist/server/bare/utils/loader-adapter.js +9 -0
  174. package/dist/server/error-handlers.js +4 -2
  175. package/dist/server/rpc/handle-request.js +91 -9
  176. package/dist/server/rpc/handlers/cancelHandler.js +10 -1
  177. package/dist/server/rpc/handlers/completion-stream.js +1 -1
  178. package/dist/server/rpc/handlers/delete-cache.js +1 -1
  179. package/dist/server/rpc/handlers/embed.js +1 -1
  180. package/dist/server/rpc/handlers/get-model-info.d.ts +1 -1
  181. package/dist/server/rpc/handlers/get-model-info.js +22 -10
  182. package/dist/server/rpc/handlers/index.d.ts +4 -1
  183. package/dist/server/rpc/handlers/index.js +2 -0
  184. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +11 -11
  185. package/dist/server/rpc/handlers/load-model/download-manager.js +36 -26
  186. package/dist/server/rpc/handlers/{load-model.d.ts → load-model/handler.d.ts} +2 -2
  187. package/dist/server/rpc/handlers/load-model/handler.js +179 -0
  188. package/dist/server/rpc/handlers/load-model/http.js +342 -33
  189. package/dist/server/rpc/handlers/load-model/hyperdrive.js +5 -3
  190. package/dist/server/rpc/handlers/load-model/index.d.ts +2 -2
  191. package/dist/server/rpc/handlers/load-model/index.js +2 -2
  192. package/dist/server/rpc/handlers/load-model/resolve.js +32 -3
  193. package/dist/server/rpc/handlers/load-model-delegated.js +6 -3
  194. package/dist/server/rpc/handlers/ocr-stream.d.ts +3 -0
  195. package/dist/server/rpc/handlers/ocr-stream.js +39 -0
  196. package/dist/server/rpc/handlers/rag.d.ts +2 -2
  197. package/dist/server/rpc/handlers/rag.js +107 -43
  198. package/dist/server/rpc/handlers/text-to-speech.js +1 -1
  199. package/dist/server/rpc/handlers/transcribe-stream.js +1 -1
  200. package/dist/server/rpc/handlers/translate.js +6 -15
  201. package/dist/server/utils/archive.d.ts +3 -0
  202. package/dist/server/utils/archive.js +171 -0
  203. package/dist/server/utils/audio/decoder.js +2 -2
  204. package/dist/server/utils/cache.d.ts +5 -5
  205. package/dist/server/utils/cache.js +6 -6
  206. package/dist/server/utils/config-transform.d.ts +2 -2
  207. package/dist/server/utils/config-transform.js +8 -6
  208. package/dist/server/utils/formatting.d.ts +13 -0
  209. package/dist/server/utils/formatting.js +26 -0
  210. package/dist/server/utils/gguf-tensor-extractor.d.ts +15 -0
  211. package/dist/server/utils/gguf-tensor-extractor.js +314 -0
  212. package/dist/server/utils/index.d.ts +3 -1
  213. package/dist/server/utils/index.js +3 -1
  214. package/dist/server/utils/shard-utils.d.ts +42 -16
  215. package/dist/server/utils/shard-utils.js +95 -7
  216. package/dist/server/worker.js +8 -3
  217. package/dist/utils/errors-base.d.ts +1 -1
  218. package/dist/utils/errors-base.js +2 -2
  219. package/dist/utils/errors-client.d.ts +12 -0
  220. package/dist/utils/errors-client.js +20 -0
  221. package/dist/utils/errors-server.d.ts +33 -0
  222. package/dist/utils/errors-server.js +55 -0
  223. package/package.json +42 -17
  224. package/dist/client/rpc/bare-rpc-client.d.ts +0 -4
  225. package/dist/client/rpc/bare-rpc-client.js +0 -94
  226. package/dist/examples/config/config-path.d.ts +0 -8
  227. package/dist/examples/config/config-path.js +0 -13
  228. package/dist/examples/rag/rag-hyperdb-workspaces.d.ts +0 -2
  229. package/dist/examples/rag/rag-hyperdb-workspaces.js +0 -106
  230. package/dist/examples/rag/rag-hyperdb.d.ts +0 -2
  231. package/dist/server/bare/addons/llamacpp/index.d.ts +0 -4
  232. package/dist/server/bare/addons/llamacpp/index.js +0 -3
  233. package/dist/server/bare/rag-hyperdb/rag-manager.d.ts +0 -5
  234. package/dist/server/bare/rag-hyperdb/rag-manager.js +0 -66
  235. package/dist/server/rpc/handlers/load-model.js +0 -111
  236. package/dist/server/utils/hash.d.ts +0 -5
  237. package/dist/server/utils/hash.js +0 -11
  238. package/dist/utils/getProcessSafe.d.ts +0 -7
  239. package/dist/utils/getProcessSafe.js +0 -17
  240. package/dist/utils/runtime.d.ts +0 -30
  241. package/dist/utils/runtime.js +0 -48
  242. /package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/handlers/completion-stream.d.ts +0 -0
  243. /package/dist/server/bare/addons/{llamacpp → llamacpp-embedding}/handlers/embed.d.ts +0 -0
  244. /package/dist/server/bare/addons/{llamacpp → llamacpp-embedding}/handlers/embed.js +0 -0
  245. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/create-model.d.ts +0 -0
  246. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/handlers/translate.d.ts +0 -0
  247. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/index.d.ts +0 -0
  248. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/index.js +0 -0
  249. /package/dist/server/bare/addons/{tts → onnx-tts}/create-model.d.ts +0 -0
  250. /package/dist/server/bare/addons/{tts → onnx-tts}/create-model.js +0 -0
  251. /package/dist/server/bare/addons/{tts → onnx-tts}/handlers/text-to-speech.d.ts +0 -0
  252. /package/dist/server/bare/addons/{tts → onnx-tts}/handlers/text-to-speech.js +0 -0
  253. /package/dist/server/bare/addons/{tts → onnx-tts}/index.d.ts +0 -0
  254. /package/dist/server/bare/addons/{tts → onnx-tts}/index.js +0 -0
  255. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/create-model.d.ts +0 -0
  256. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/handlers/transcribe-stream.d.ts +0 -0
  257. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/handlers/transcribe-stream.js +0 -0
  258. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/index.d.ts +0 -0
  259. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/index.js +0 -0
@@ -3,43 +3,53 @@ import { getServerLogger } from "../../../../logging/index.js";
3
3
  const logger = getServerLogger();
4
4
  const activeDownloads = new Map();
5
5
  const clearCacheFlags = new Map();
6
- export const getActiveDownload = (key) => activeDownloads.get(key);
7
- export const registerDownload = (key, entry) => {
6
+ export function getActiveDownload(key) {
7
+ return activeDownloads.get(key);
8
+ }
9
+ export function registerDownload(key, entry) {
8
10
  activeDownloads.set(key, entry);
9
- };
10
- export const unregisterDownload = (key) => {
11
+ }
12
+ export function unregisterDownload(key) {
11
13
  activeDownloads.delete(key);
12
- };
13
- export const createHyperdriveDownloadKey = (hyperdriveKey, modelFileName) => `${hyperdriveKey}:${modelFileName}`;
14
- export const createHttpDownloadKey = (url) => `http:${url}`;
15
- export const setClearCacheFlag = (downloadKey, clearCache) => {
14
+ }
15
+ export function createHyperdriveDownloadKey(hyperdriveKey, modelFileName) {
16
+ return `${hyperdriveKey}:${modelFileName}`;
17
+ }
18
+ export function createHttpDownloadKey(url) {
19
+ return `http:${url}`;
20
+ }
21
+ export function setClearCacheFlag(downloadKey, clearCache) {
16
22
  if (clearCache) {
17
23
  clearCacheFlags.set(downloadKey, true);
18
24
  }
19
25
  else {
20
26
  clearCacheFlags.delete(downloadKey);
21
27
  }
22
- };
23
- export const shouldClearCache = (downloadKey) => clearCacheFlags.get(downloadKey) ?? false;
24
- export const clearClearCacheFlag = (downloadKey) => {
28
+ }
29
+ export function shouldClearCache(downloadKey) {
30
+ return clearCacheFlags.get(downloadKey) ?? false;
31
+ }
32
+ export function clearClearCacheFlag(downloadKey) {
25
33
  clearCacheFlags.delete(downloadKey);
26
- };
27
- export const createCancelFunction = (downloadKey, clearCache = false) => () => {
28
- const entry = getActiveDownload(downloadKey);
29
- if (!entry) {
30
- return;
31
- }
32
- // Set flag for the download handlers to check
33
- setClearCacheFlag(downloadKey, clearCache);
34
- entry.abortController.abort();
35
- unregisterDownload(downloadKey);
36
- };
37
- export const cancelAllDownloads = () => {
34
+ }
35
+ export function createCancelFunction(downloadKey, clearCache = false) {
36
+ return () => {
37
+ const entry = getActiveDownload(downloadKey);
38
+ if (!entry) {
39
+ return;
40
+ }
41
+ // Set flag for the download handlers to check
42
+ setClearCacheFlag(downloadKey, clearCache);
43
+ entry.abortController.abort();
44
+ unregisterDownload(downloadKey);
45
+ };
46
+ }
47
+ export function cancelAllDownloads() {
38
48
  logger.info(`🧹 Cancelling ${activeDownloads.size} active downloads`);
39
49
  Array.from(activeDownloads.keys()).forEach((key) => createCancelFunction(key)());
40
- };
50
+ }
41
51
  let isCleaningUp = false;
42
- export const cleanupDownloads = async () => {
52
+ export async function cleanupDownloads() {
43
53
  if (isCleaningUp)
44
54
  return;
45
55
  isCleaningUp = true;
@@ -53,4 +63,4 @@ export const cleanupDownloads = async () => {
53
63
  catch (error) {
54
64
  logger.error("❌ Error during download cleanup:", error);
55
65
  }
56
- };
66
+ }
@@ -1,3 +1,3 @@
1
- import type { LoadModelRequest, LoadModelResponse, ModelProgressUpdate } from "../../../schemas/index";
1
+ import type { LoadModelRequest, LoadModelResponse, ModelProgressUpdate } from "../../../../schemas/index";
2
2
  export declare function handleLoadModel(request: LoadModelRequest, progressCallback?: (update: ModelProgressUpdate) => void): Promise<LoadModelResponse>;
3
- //# sourceMappingURL=load-model.d.ts.map
3
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1,179 @@
1
+ import { normalizeModelType, ModelType } from "../../../../schemas/index.js";
2
+ import { hyperdriveUrlSchema } from "../../../../schemas/load-model.js";
3
+ import { loadModel } from "../../../bare/addons/index.js";
4
+ import { resolveModelPath } from "./resolve.js";
5
+ import { getModelEntry, updateModelConfig, } from "../../../bare/registry/model-registry.js";
6
+ import { generateShortHash, transformConfigForReload } from "../../../utils/index.js";
7
+ import { TTSConfigModelRequiredError, ESpeakDataPathRequiredError, ConfigReloadNotSupportedError, ModelTypeMismatchError, ModelIsDelegatedError, ModelNotFoundError, } from "../../../../utils/errors-server.js";
8
+ import { getServerLogger } from "../../../../logging/index.js";
9
+ const logger = getServerLogger();
10
+ const OCR_DETECTOR_FILENAME = "detector_craft.onnx";
11
+ export async function handleLoadModel(request, progressCallback) {
12
+ // Handle reload config
13
+ if (isReloadConfigRequest(request)) {
14
+ return handleConfigReload(request);
15
+ }
16
+ // Handle load new model from source
17
+ const { modelSrc, modelName, seed, projectionModelSrc, vadModelSrc, configSrc, } = request;
18
+ const canonicalModelType = normalizeModelType(request.modelType);
19
+ const srcVocabSrc = canonicalModelType === ModelType.nmtcppTranslation
20
+ ? request.srcVocabSrc
21
+ : undefined;
22
+ const dstVocabSrc = canonicalModelType === ModelType.nmtcppTranslation
23
+ ? request.dstVocabSrc
24
+ : undefined;
25
+ const eSpeakDataPath = canonicalModelType === ModelType.onnxTts
26
+ ? request.eSpeakDataPath
27
+ : undefined;
28
+ const detectorModelSrc = canonicalModelType === ModelType.onnxOcr
29
+ ? request.detectorModelSrc
30
+ : undefined;
31
+ try {
32
+ const modelPath = await resolveModelPath(modelSrc, progressCallback, seed);
33
+ let projectionModelPath;
34
+ if (projectionModelSrc) {
35
+ projectionModelPath = await resolveModelPath(projectionModelSrc, progressCallback, seed);
36
+ }
37
+ let vadModelPath;
38
+ if (vadModelSrc) {
39
+ vadModelPath = await resolveModelPath(vadModelSrc, progressCallback, seed);
40
+ }
41
+ let ttsConfigModelPath;
42
+ if (configSrc) {
43
+ ttsConfigModelPath = await resolveModelPath(configSrc, progressCallback, seed);
44
+ }
45
+ // For OCR models: use provided detectorModelSrc or auto-derive from same hyperdrive key
46
+ let detectorModelPath;
47
+ if (canonicalModelType === ModelType.onnxOcr) {
48
+ if (detectorModelSrc) {
49
+ detectorModelPath = await resolveModelPath(detectorModelSrc, progressCallback, seed);
50
+ }
51
+ else if (modelSrc.startsWith("pear://")) {
52
+ const { key } = hyperdriveUrlSchema.parse(modelSrc);
53
+ const derivedDetectorSrc = `pear://${key}/${OCR_DETECTOR_FILENAME}`;
54
+ detectorModelPath = await resolveModelPath(derivedDetectorSrc, progressCallback, seed);
55
+ }
56
+ }
57
+ // For TTS models, ttsConfigModelPath and eSpeakDataPath are required
58
+ if (canonicalModelType === ModelType.onnxTts && !ttsConfigModelPath) {
59
+ throw new TTSConfigModelRequiredError();
60
+ }
61
+ if (canonicalModelType === ModelType.onnxTts && !eSpeakDataPath) {
62
+ throw new ESpeakDataPathRequiredError();
63
+ }
64
+ // For Bergamot models, resolve vocabulary sources to local paths
65
+ if (canonicalModelType === ModelType.nmtcppTranslation &&
66
+ request.modelConfig) {
67
+ const nmtConfig = request.modelConfig;
68
+ if (nmtConfig.engine === "Bergamot") {
69
+ let resolvedSrcVocabSrc = srcVocabSrc;
70
+ let resolvedDstVocabSrc = dstVocabSrc;
71
+ if ((!srcVocabSrc || !dstVocabSrc) && modelSrc.startsWith("pear://")) {
72
+ const derivedVocabSrcs = deriveBergamotVocabSources(modelSrc);
73
+ if (derivedVocabSrcs) {
74
+ resolvedSrcVocabSrc = srcVocabSrc ?? derivedVocabSrcs.srcVocabSrc;
75
+ resolvedDstVocabSrc = dstVocabSrc ?? derivedVocabSrcs.dstVocabSrc;
76
+ }
77
+ }
78
+ if (resolvedSrcVocabSrc) {
79
+ nmtConfig.srcVocabPath = await resolveModelPath(resolvedSrcVocabSrc, progressCallback, seed);
80
+ }
81
+ if (resolvedDstVocabSrc) {
82
+ nmtConfig.dstVocabPath = await resolveModelPath(resolvedDstVocabSrc, progressCallback, seed);
83
+ }
84
+ }
85
+ }
86
+ // Generate hash-based modelId
87
+ const configStr = JSON.stringify(request.modelConfig, Object.keys(request.modelConfig).sort());
88
+ const modelHashInput = `${request.modelType}:${modelSrc}:${configStr}`;
89
+ const modelId = generateShortHash(modelHashInput);
90
+ await loadModel({
91
+ modelId,
92
+ modelPath,
93
+ options: request,
94
+ projectionModelPath,
95
+ vadModelPath,
96
+ ttsConfigModelPath,
97
+ eSpeakDataPath,
98
+ detectorModelPath,
99
+ modelName,
100
+ });
101
+ return {
102
+ type: "loadModel",
103
+ success: true,
104
+ modelId,
105
+ };
106
+ }
107
+ catch (error) {
108
+ logger.error("Error loading model:", error);
109
+ return {
110
+ type: "loadModel",
111
+ success: false,
112
+ error: error instanceof Error ? error.message : "Unknown error",
113
+ };
114
+ }
115
+ }
116
+ async function handleConfigReload(request) {
117
+ const { modelId, modelType, modelConfig } = request;
118
+ try {
119
+ const entry = getModelEntry(modelId);
120
+ if (!entry) {
121
+ throw new ModelNotFoundError(modelId);
122
+ }
123
+ if (entry.isDelegated) {
124
+ throw new ModelIsDelegatedError(modelId);
125
+ }
126
+ const storedModelType = entry.local.modelType;
127
+ const normalizedRequestType = normalizeModelType(modelType);
128
+ if (storedModelType !== normalizedRequestType) {
129
+ throw new ModelTypeMismatchError(storedModelType, normalizedRequestType);
130
+ }
131
+ const model = entry.local.model;
132
+ const currentConfig = entry.local.config;
133
+ if (typeof model.reload !== "function") {
134
+ throw new ConfigReloadNotSupportedError(modelId);
135
+ }
136
+ const mergedConfig = {
137
+ ...currentConfig,
138
+ ...modelConfig,
139
+ };
140
+ const reloadConfig = transformConfigForReload(storedModelType, mergedConfig);
141
+ await model.reload(reloadConfig);
142
+ updateModelConfig(modelId, mergedConfig);
143
+ return {
144
+ type: "loadModel",
145
+ success: true,
146
+ modelId,
147
+ };
148
+ }
149
+ catch (error) {
150
+ logger.error("Error reloading config:", error);
151
+ return {
152
+ type: "loadModel",
153
+ success: false,
154
+ error: error instanceof Error ? error.message : "Unknown error",
155
+ };
156
+ }
157
+ }
158
+ function isReloadConfigRequest(request) {
159
+ return "modelId" in request && !("modelSrc" in request);
160
+ }
161
+ const BERGAMOT_CJK_LANG_PAIRS = ["enja", "enko", "enzh"];
162
+ function deriveBergamotVocabSources(modelSrc) {
163
+ const match = modelSrc.match(/^pear:\/\/([a-f0-9]+)\/model\.([a-z]+)\.intgemm\.alphas\.bin$/);
164
+ if (!match || !match[1] || !match[2])
165
+ return null;
166
+ const key = match[1];
167
+ const langPair = match[2];
168
+ if (BERGAMOT_CJK_LANG_PAIRS.includes(langPair)) {
169
+ return {
170
+ srcVocabSrc: `pear://${key}/srcvocab.${langPair}.spm`,
171
+ dstVocabSrc: `pear://${key}/trgvocab.${langPair}.spm`,
172
+ };
173
+ }
174
+ const sharedVocab = `pear://${key}/vocab.${langPair}.spm`;
175
+ return {
176
+ srcVocabSrc: sharedVocab,
177
+ dstVocabSrc: sharedVocab,
178
+ };
179
+ }