@qvac/sdk 0.7.1 → 0.8.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 (257) hide show
  1. package/NOTICE +73 -10
  2. package/README.md +4 -4
  3. package/bare-imports.json +9 -0
  4. package/dist/client/api/cancel.d.ts +9 -0
  5. package/dist/client/api/cancel.js +9 -0
  6. package/dist/client/api/completion-stream.d.ts +2 -1
  7. package/dist/client/api/completion-stream.js +2 -1
  8. package/dist/client/api/download-asset.d.ts +3 -2
  9. package/dist/client/api/download-asset.js +4 -3
  10. package/dist/client/api/embed.d.ts +5 -2
  11. package/dist/client/api/embed.js +2 -2
  12. package/dist/client/api/get-model-info.d.ts +1 -1
  13. package/dist/client/api/heartbeat.d.ts +30 -0
  14. package/dist/client/api/heartbeat.js +38 -0
  15. package/dist/client/api/index.d.ts +1 -1
  16. package/dist/client/api/index.js +1 -1
  17. package/dist/client/api/invoke-plugin.d.ts +3 -2
  18. package/dist/client/api/invoke-plugin.js +4 -4
  19. package/dist/client/api/load-model.d.ts +12 -10
  20. package/dist/client/api/load-model.js +3 -3
  21. package/dist/client/api/rag.d.ts +10 -10
  22. package/dist/client/api/rag.js +21 -21
  23. package/dist/client/api/text-to-speech.d.ts +2 -2
  24. package/dist/client/api/text-to-speech.js +3 -3
  25. package/dist/client/api/transcribe.d.ts +5 -3
  26. package/dist/client/api/transcribe.js +6 -4
  27. package/dist/client/api/translate.d.ts +2 -2
  28. package/dist/client/api/translate.js +3 -3
  29. package/dist/client/rpc/node-rpc-client.d.ts +2 -7
  30. package/dist/client/rpc/node-rpc-client.js +2 -39
  31. package/dist/client/rpc/profiling/index.d.ts +2 -0
  32. package/dist/client/rpc/profiling/index.js +1 -0
  33. package/dist/client/rpc/profiling/profiler.d.ts +27 -0
  34. package/dist/client/rpc/profiling/profiler.js +139 -0
  35. package/dist/client/rpc/rpc-client.d.ts +2 -2
  36. package/dist/client/rpc/rpc-client.js +174 -12
  37. package/dist/examples/delegated-inference/consumer-profiled.d.ts +2 -0
  38. package/dist/examples/delegated-inference/consumer-profiled.js +67 -0
  39. package/dist/examples/embed-p2p.d.ts +2 -0
  40. package/dist/examples/llamacpp-multimodal.js +1 -1
  41. package/dist/examples/llamacpp-p2p.d.ts +2 -0
  42. package/dist/examples/parallel-download.js +45 -13
  43. package/dist/examples/profiling/basic.d.ts +2 -0
  44. package/dist/examples/profiling/basic.js +71 -0
  45. package/dist/examples/profiling/per-call.d.ts +2 -0
  46. package/dist/examples/profiling/per-call.js +30 -0
  47. package/dist/examples/seed-p2p.d.ts +2 -0
  48. package/dist/examples/transcription/parakeet-ctc-filesystem.d.ts +2 -0
  49. package/dist/examples/transcription/parakeet-ctc-filesystem.js +40 -0
  50. package/dist/examples/transcription/parakeet-microphone-record.d.ts +2 -0
  51. package/dist/examples/transcription/parakeet-microphone-record.js +95 -0
  52. package/dist/examples/transcription/parakeet-sortformer.d.ts +2 -0
  53. package/dist/examples/transcription/parakeet-sortformer.js +115 -0
  54. package/dist/examples/transcription/parakeet-tdt-filesystem.d.ts +2 -0
  55. package/dist/examples/transcription/parakeet-tdt-filesystem.js +44 -0
  56. package/dist/examples/translation/translation-bergamot-pivot.d.ts +2 -0
  57. package/dist/examples/translation/translation-bergamot-pivot.js +73 -0
  58. package/dist/examples/translation/translation-llm-afriquegemma.d.ts +2 -0
  59. package/dist/examples/translation/translation-llm-afriquegemma.js +39 -0
  60. package/dist/index.d.ts +4 -2
  61. package/dist/index.js +3 -1
  62. package/dist/logging/index.d.ts +1 -1
  63. package/dist/logging/index.js +1 -1
  64. package/dist/logging/namespaces.d.ts +3 -9
  65. package/dist/logging/namespaces.js +2 -8
  66. package/dist/logging/registry.js +15 -1
  67. package/dist/models/registry/models.d.ts +1671 -310
  68. package/dist/models/registry/models.js +2116 -710
  69. package/dist/models/update-models/codegen.js +2 -2
  70. package/dist/models/update-models/history.d.ts +11 -0
  71. package/dist/models/update-models/history.js +24 -5
  72. package/dist/models/update-models/index.js +17 -16
  73. package/dist/models/update-models/naming.js +56 -0
  74. package/dist/profiling/aggregator.d.ts +15 -0
  75. package/dist/profiling/aggregator.js +100 -0
  76. package/dist/profiling/clock.d.ts +12 -0
  77. package/dist/profiling/clock.js +51 -0
  78. package/dist/profiling/controller.d.ts +33 -0
  79. package/dist/profiling/controller.js +123 -0
  80. package/dist/profiling/envelope.d.ts +10 -0
  81. package/dist/profiling/envelope.js +36 -0
  82. package/dist/profiling/events.d.ts +20 -0
  83. package/dist/profiling/events.js +37 -0
  84. package/dist/profiling/exporters.d.ts +10 -0
  85. package/dist/profiling/exporters.js +236 -0
  86. package/dist/profiling/index.d.ts +36 -0
  87. package/dist/profiling/index.js +31 -0
  88. package/dist/profiling/ring-buffer.d.ts +19 -0
  89. package/dist/profiling/ring-buffer.js +83 -0
  90. package/dist/profiling/types.d.ts +47 -0
  91. package/dist/profiling/types.js +1 -0
  92. package/dist/schemas/cancel.d.ts +12 -0
  93. package/dist/schemas/cancel.js +2 -0
  94. package/dist/schemas/common.d.ts +1927 -135
  95. package/dist/schemas/common.js +6 -3
  96. package/dist/schemas/completion-stream.d.ts +31 -0
  97. package/dist/schemas/completion-stream.js +13 -0
  98. package/dist/schemas/delegate.d.ts +8 -0
  99. package/dist/schemas/delegate.js +5 -2
  100. package/dist/schemas/download-asset.d.ts +14 -3
  101. package/dist/schemas/download-asset.js +3 -1
  102. package/dist/schemas/engine-addon-map.js +9 -6
  103. package/dist/schemas/get-model-info.d.ts +2 -0
  104. package/dist/schemas/get-model-info.js +1 -0
  105. package/dist/schemas/heartbeat.d.ts +17 -0
  106. package/dist/schemas/heartbeat.js +10 -0
  107. package/dist/schemas/index.d.ts +3 -2
  108. package/dist/schemas/index.js +3 -2
  109. package/dist/schemas/llamacpp-config.d.ts +140 -14
  110. package/dist/schemas/llamacpp-config.js +11 -7
  111. package/dist/schemas/load-model.d.ts +9762 -2515
  112. package/dist/schemas/load-model.js +142 -182
  113. package/dist/schemas/model-src-utils.d.ts +10 -2
  114. package/dist/schemas/model-types.d.ts +19 -1
  115. package/dist/schemas/model-types.js +11 -0
  116. package/dist/schemas/ocr.d.ts +37 -0
  117. package/dist/schemas/ocr.js +5 -0
  118. package/dist/schemas/plugin.d.ts +51 -5
  119. package/dist/schemas/plugin.js +26 -0
  120. package/dist/schemas/profiling.d.ts +105 -0
  121. package/dist/schemas/profiling.js +66 -0
  122. package/dist/schemas/registry.d.ts +18 -0
  123. package/dist/schemas/registry.js +2 -0
  124. package/dist/schemas/reload-config.d.ts +126 -6
  125. package/dist/schemas/reload-config.js +1 -1
  126. package/dist/schemas/sdk-config.d.ts +2280 -24
  127. package/dist/schemas/sdk-config.js +6 -1
  128. package/dist/schemas/sdk-errors-client.d.ts +1 -0
  129. package/dist/schemas/sdk-errors-client.js +7 -0
  130. package/dist/schemas/sdk-errors-server.d.ts +3 -0
  131. package/dist/schemas/sdk-errors-server.js +15 -0
  132. package/dist/schemas/text-to-speech.d.ts +90 -68
  133. package/dist/schemas/text-to-speech.js +16 -33
  134. package/dist/schemas/transcription-config.d.ts +383 -0
  135. package/dist/schemas/{whispercpp-config.js → transcription-config.js} +29 -1
  136. package/dist/schemas/translation-config.d.ts +463 -8
  137. package/dist/schemas/translation-config.js +35 -2
  138. package/dist/server/bare/delegate-rpc-client.js +52 -11
  139. package/dist/server/bare/ops/load-model.d.ts +7 -1
  140. package/dist/server/bare/ops/load-model.js +41 -42
  141. package/dist/server/bare/ops/transcribe.d.ts +3 -0
  142. package/dist/server/bare/ops/transcribe.js +75 -0
  143. package/dist/server/bare/ops/translate.d.ts +2 -0
  144. package/dist/server/bare/ops/translate.js +12 -4
  145. package/dist/server/bare/plugins/index.d.ts +1 -0
  146. package/dist/server/bare/plugins/index.js +1 -0
  147. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.d.ts +2 -1
  148. package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +8 -6
  149. package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +108 -3
  150. package/dist/server/bare/plugins/llamacpp-completion/plugin.js +19 -6
  151. package/dist/server/bare/plugins/llamacpp-embedding/plugin.d.ts +32 -2
  152. package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +31 -17
  153. package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +325 -3
  154. package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +117 -13
  155. package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +50 -2
  156. package/dist/server/bare/plugins/onnx-ocr/plugin.js +46 -5
  157. package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +351 -4
  158. package/dist/server/bare/plugins/onnx-tts/plugin.js +81 -61
  159. package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +317 -0
  160. package/dist/server/bare/plugins/parakeet-transcription/plugin.js +154 -0
  161. package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +209 -3
  162. package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +21 -9
  163. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +2 -2
  164. package/dist/server/bare/registry/model-config-utils.js +3 -1
  165. package/dist/server/bare/registry/model-registry.d.ts +2 -0
  166. package/dist/server/bare/registry/model-registry.js +2 -1
  167. package/dist/server/bare/utils/audio-input.d.ts +10 -0
  168. package/dist/server/bare/utils/audio-input.js +33 -0
  169. package/dist/server/error-handlers.d.ts +3 -2
  170. package/dist/server/error-handlers.js +11 -8
  171. package/dist/server/plugins/registry.js +5 -1
  172. package/dist/server/rpc/delegate-transport.d.ts +11 -3
  173. package/dist/server/rpc/delegate-transport.js +214 -38
  174. package/dist/server/rpc/delegate-utils.d.ts +2 -0
  175. package/dist/server/rpc/delegate-utils.js +5 -0
  176. package/dist/server/rpc/handle-request.js +43 -4
  177. package/dist/server/rpc/handler-registry.js +33 -4
  178. package/dist/server/rpc/handler-utils.d.ts +5 -4
  179. package/dist/server/rpc/handler-utils.js +114 -31
  180. package/dist/server/rpc/handlers/cancel-delegated.d.ts +4 -0
  181. package/dist/server/rpc/handlers/cancel-delegated.js +71 -0
  182. package/dist/server/rpc/handlers/completion-stream-delegated.d.ts +3 -1
  183. package/dist/server/rpc/handlers/completion-stream-delegated.js +13 -4
  184. package/dist/server/rpc/handlers/download-asset.js +55 -3
  185. package/dist/server/rpc/handlers/heartbeat-delegated.d.ts +4 -0
  186. package/dist/server/rpc/handlers/heartbeat-delegated.js +32 -0
  187. package/dist/server/rpc/handlers/heartbeat.d.ts +3 -0
  188. package/dist/server/rpc/handlers/heartbeat.js +3 -0
  189. package/dist/server/rpc/handlers/index.d.ts +2 -2
  190. package/dist/server/rpc/handlers/index.js +2 -2
  191. package/dist/server/rpc/handlers/load-model/download-stats.d.ts +6 -0
  192. package/dist/server/rpc/handlers/load-model/download-stats.js +87 -0
  193. package/dist/server/rpc/handlers/load-model/handler.js +108 -123
  194. package/dist/server/rpc/handlers/load-model/http.d.ts +2 -1
  195. package/dist/server/rpc/handlers/load-model/http.js +21 -5
  196. package/dist/server/rpc/handlers/load-model/hyperdrive.d.ts +2 -1
  197. package/dist/server/rpc/handlers/load-model/hyperdrive.js +19 -14
  198. package/dist/server/rpc/handlers/load-model/registry.d.ts +2 -1
  199. package/dist/server/rpc/handlers/load-model/registry.js +113 -136
  200. package/dist/server/rpc/handlers/load-model/resolve.d.ts +2 -0
  201. package/dist/server/rpc/handlers/load-model/resolve.js +55 -22
  202. package/dist/server/rpc/handlers/load-model/types.d.ts +29 -0
  203. package/dist/server/rpc/handlers/load-model/types.js +1 -0
  204. package/dist/server/rpc/handlers/load-model-delegated.d.ts +5 -1
  205. package/dist/server/rpc/handlers/load-model-delegated.js +41 -11
  206. package/dist/server/rpc/handlers/plugin-dispatch.js +15 -10
  207. package/dist/server/rpc/handlers/plugin-invoke.js +56 -51
  208. package/dist/server/rpc/handlers/rag.js +24 -0
  209. package/dist/server/rpc/handlers/unload-model-delegated.d.ts +3 -0
  210. package/dist/server/rpc/handlers/unload-model-delegated.js +32 -0
  211. package/dist/server/rpc/profiling/context.d.ts +18 -0
  212. package/dist/server/rpc/profiling/context.js +38 -0
  213. package/dist/server/rpc/profiling/delegation-profiler.d.ts +32 -0
  214. package/dist/server/rpc/profiling/delegation-profiler.js +154 -0
  215. package/dist/server/rpc/profiling/index.d.ts +5 -0
  216. package/dist/server/rpc/profiling/index.js +4 -0
  217. package/dist/server/rpc/profiling/operation-metrics.d.ts +25 -0
  218. package/dist/server/rpc/profiling/operation-metrics.js +199 -0
  219. package/dist/server/rpc/profiling/operation-wrappers.d.ts +18 -0
  220. package/dist/server/rpc/profiling/operation-wrappers.js +124 -0
  221. package/dist/server/rpc/profiling/profiler.d.ts +13 -0
  222. package/dist/server/rpc/profiling/profiler.js +97 -0
  223. package/dist/server/utils/cache.d.ts +2 -1
  224. package/dist/server/utils/cache.js +5 -1
  225. package/dist/server/utils/checksum.d.ts +2 -0
  226. package/dist/server/utils/checksum.js +7 -0
  227. package/dist/server/utils/formatting.d.ts +6 -0
  228. package/dist/server/utils/formatting.js +35 -0
  229. package/dist/server/worker.js +2 -1
  230. package/dist/utils/errors-client.d.ts +3 -0
  231. package/dist/utils/errors-client.js +6 -0
  232. package/dist/utils/errors-server.d.ts +9 -0
  233. package/dist/utils/errors-server.js +15 -0
  234. package/dist/utils/global-singleton.d.ts +2 -0
  235. package/dist/utils/global-singleton.js +10 -0
  236. package/package.json +22 -18
  237. package/dist/client/api/ping.d.ts +0 -11
  238. package/dist/client/api/ping.js +0 -19
  239. package/dist/examples/embed-hyperdrive.d.ts +0 -2
  240. package/dist/examples/llamacpp-hyperdrive.d.ts +0 -2
  241. package/dist/examples/seed-hyperdrive.d.ts +0 -2
  242. package/dist/schemas/ping.d.ts +0 -11
  243. package/dist/schemas/ping.js +0 -8
  244. package/dist/schemas/whispercpp-config.d.ts +0 -70
  245. package/dist/server/bare/plugins/whispercpp-transcription/ops/transcribe-stream.d.ts +0 -3
  246. package/dist/server/bare/plugins/whispercpp-transcription/ops/transcribe-stream.js +0 -81
  247. package/dist/server/rpc/handlers/ping.d.ts +0 -3
  248. package/dist/server/rpc/handlers/ping.js +0 -3
  249. /package/dist/examples/{embed-hyperdrive.js → embed-p2p.js} +0 -0
  250. /package/dist/examples/{llamacpp-hyperdrive.js → llamacpp-p2p.js} +0 -0
  251. /package/dist/examples/{seed-hyperdrive.js → seed-p2p.js} +0 -0
  252. /package/dist/examples/{whispercpp-filesystem.d.ts → transcription/whispercpp-filesystem.d.ts} +0 -0
  253. /package/dist/examples/{whispercpp-filesystem.js → transcription/whispercpp-filesystem.js} +0 -0
  254. /package/dist/examples/{whispercpp-microphone-record.d.ts → transcription/whispercpp-microphone-record.d.ts} +0 -0
  255. /package/dist/examples/{whispercpp-microphone-record.js → transcription/whispercpp-microphone-record.js} +0 -0
  256. /package/dist/examples/{whispercpp-prompt.d.ts → transcription/whispercpp-prompt.d.ts} +0 -0
  257. /package/dist/examples/{whispercpp-prompt.js → transcription/whispercpp-prompt.js} +0 -0
@@ -0,0 +1,71 @@
1
+ import { getServerLogger } from "../../../logging/index.js";
2
+ import { getModelEntry } from "../../bare/registry/model-registry.js";
3
+ import { getRPC } from "../../bare/delegate-rpc-client.js";
4
+ import { send } from "../delegate-transport.js";
5
+ const logger = getServerLogger();
6
+ function resolveDelegationTarget(request) {
7
+ if (request.operation === "inference") {
8
+ const entry = getModelEntry(request.modelId);
9
+ if (!entry?.isDelegated || !entry.delegated) {
10
+ return null;
11
+ }
12
+ const target = {
13
+ topic: entry.delegated.topic,
14
+ providerPublicKey: entry.delegated.providerPublicKey,
15
+ };
16
+ if (entry.delegated.timeout !== undefined) {
17
+ target.timeout = entry.delegated.timeout;
18
+ }
19
+ return target;
20
+ }
21
+ if (request.operation === "downloadAsset" && request.delegate) {
22
+ const target = {
23
+ topic: request.delegate.topic,
24
+ providerPublicKey: request.delegate.providerPublicKey,
25
+ };
26
+ if (request.delegate.timeout !== undefined) {
27
+ target.timeout = request.delegate.timeout;
28
+ }
29
+ return target;
30
+ }
31
+ return null;
32
+ }
33
+ function toProviderCancelRequest(request) {
34
+ if (request.operation !== "downloadAsset") {
35
+ return request;
36
+ }
37
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
38
+ const { delegate: _delegate, ...providerRequest } = request;
39
+ return providerRequest;
40
+ }
41
+ export async function handleCancelDelegated(request, options) {
42
+ const target = resolveDelegationTarget(request);
43
+ if (!target) {
44
+ logger.warn(`Delegated cancel skipped (no delegation target): operation=${request.operation}`);
45
+ return { type: "cancel", success: true };
46
+ }
47
+ try {
48
+ const rpc = await getRPC(target.topic, target.providerPublicKey, {
49
+ timeout: target.timeout,
50
+ });
51
+ const delegateOpts = {
52
+ peerKey: target.providerPublicKey,
53
+ };
54
+ if (target.timeout !== undefined) {
55
+ delegateOpts.timeout = target.timeout;
56
+ }
57
+ if (options?.profilingMeta) {
58
+ delegateOpts.profilingMeta = options.profilingMeta;
59
+ }
60
+ await send(toProviderCancelRequest(request), rpc, delegateOpts);
61
+ return { type: "cancel", success: true };
62
+ }
63
+ catch (error) {
64
+ logger.error("Error during delegated cancellation:", error);
65
+ return {
66
+ type: "cancel",
67
+ success: false,
68
+ error: error instanceof Error ? error.message : "Unknown error",
69
+ };
70
+ }
71
+ }
@@ -1,3 +1,5 @@
1
1
  import type { CompletionStreamRequest, CompletionStreamResponse } from "../../../schemas/index";
2
- export declare function handleCompletionStreamDelegated(request: CompletionStreamRequest): AsyncGenerator<CompletionStreamResponse>;
2
+ import type { DelegatedHandlerOptions } from "../profiling/index";
3
+ export type HandleCompletionStreamDelegatedOptions = DelegatedHandlerOptions;
4
+ export declare function handleCompletionStreamDelegated(request: CompletionStreamRequest, options?: HandleCompletionStreamDelegatedOptions): AsyncGenerator<CompletionStreamResponse>;
3
5
  //# sourceMappingURL=completion-stream-delegated.d.ts.map
@@ -4,19 +4,28 @@ import { stream } from "../delegate-transport.js";
4
4
  import { ModelIsDelegatedError } from "../../../utils/errors-server.js";
5
5
  import { getServerLogger } from "../../../logging/index.js";
6
6
  const logger = getServerLogger();
7
- export async function* handleCompletionStreamDelegated(request) {
7
+ export async function* handleCompletionStreamDelegated(request, options) {
8
+ const { profilingMeta } = options ?? {};
8
9
  // Get delegation info from model registry
9
10
  const entry = getModelEntry(request.modelId);
10
11
  if (!entry?.isDelegated || !entry.delegated) {
11
12
  throw new ModelIsDelegatedError(request.modelId);
12
13
  }
13
- const { topic, providerPublicKey, timeout } = entry.delegated;
14
+ const { topic, providerPublicKey, timeout, healthCheckTimeout } = entry.delegated;
14
15
  try {
15
16
  logger.debug(`📤 Sending delegated completionStream request to provider: ${providerPublicKey}${timeout ? `, timeout: ${timeout}ms` : ""}`);
16
17
  // Create RPC instance for this HyperSwarm peer
17
- const rpc = await getRPC(topic, providerPublicKey, { timeout });
18
+ const rpc = await getRPC(topic, providerPublicKey, { timeout, healthCheckTimeout });
19
+ // Build delegate options with profiling metadata
20
+ const delegateOpts = { peerKey: providerPublicKey };
21
+ if (profilingMeta) {
22
+ delegateOpts.profilingMeta = profilingMeta;
23
+ }
24
+ if (timeout) {
25
+ delegateOpts.timeout = timeout;
26
+ }
18
27
  // Use the regular stream function with the HyperSwarm RPC instance
19
- const responseStream = stream(request, rpc, { timeout });
28
+ const responseStream = stream(request, rpc, delegateOpts);
20
29
  // Yield each response from the stream
21
30
  for await (const response of responseStream) {
22
31
  yield response;
@@ -1,15 +1,67 @@
1
- import { resolveModelPath } from "./load-model/resolve.js";
1
+ import { PROFILING_KEY, OPERATION_EVENT_KEY, } from "../../../schemas/index.js";
2
+ import { resolveModelPath, resolveModelPathWithStats, } from "./load-model/resolve.js";
3
+ import { nowMs, generateProfileId } from "../../../profiling/clock.js";
2
4
  import { getServerLogger } from "../../../logging/index.js";
3
5
  const logger = getServerLogger();
4
6
  export async function handleDownloadAsset(request, progressCallback) {
5
7
  const { assetSrc, seed } = request;
8
+ const profilingMeta = request[PROFILING_KEY];
9
+ const profilingEnabled = profilingMeta?.enabled !== false && !!profilingMeta;
6
10
  try {
7
- await resolveModelPath(assetSrc, progressCallback, seed);
8
- return {
11
+ const totalDownloadStart = profilingEnabled ? nowMs() : 0;
12
+ let sourceType;
13
+ let downloadStats;
14
+ if (profilingEnabled) {
15
+ const result = await resolveModelPathWithStats(assetSrc, progressCallback, seed);
16
+ sourceType = result.sourceType;
17
+ downloadStats = result.downloadStats;
18
+ }
19
+ else {
20
+ await resolveModelPath(assetSrc, progressCallback, seed);
21
+ }
22
+ const response = {
9
23
  type: "downloadAsset",
10
24
  success: true,
11
25
  assetId: assetSrc,
12
26
  };
27
+ if (profilingEnabled) {
28
+ const totalDownloadTimeMs = nowMs() - totalDownloadStart;
29
+ const profileId = profilingMeta?.id ?? generateProfileId();
30
+ const gauges = {
31
+ totalDownloadTime: totalDownloadTimeMs,
32
+ };
33
+ if (downloadStats) {
34
+ if (downloadStats.downloadTimeMs !== undefined) {
35
+ gauges["downloadTime"] = downloadStats.downloadTimeMs;
36
+ }
37
+ if (downloadStats.totalBytesDownloaded !== undefined) {
38
+ gauges["totalBytesDownloaded"] = downloadStats.totalBytesDownloaded;
39
+ }
40
+ if (downloadStats.downloadSpeedBps !== undefined) {
41
+ gauges["downloadSpeedBps"] = downloadStats.downloadSpeedBps;
42
+ }
43
+ if (downloadStats.checksumValidationTimeMs !== undefined) {
44
+ gauges["checksumValidationTime"] = downloadStats.checksumValidationTimeMs;
45
+ }
46
+ }
47
+ const tags = {};
48
+ if (sourceType) {
49
+ tags["sourceType"] = sourceType;
50
+ }
51
+ if (downloadStats?.cacheHit !== undefined) {
52
+ tags["cacheHit"] = downloadStats.cacheHit ? "true" : "false";
53
+ }
54
+ const operationEvent = {
55
+ op: "downloadAsset",
56
+ kind: "handler",
57
+ ms: totalDownloadTimeMs,
58
+ profileId,
59
+ gauges: Object.keys(gauges).length > 0 ? gauges : undefined,
60
+ tags: Object.keys(tags).length > 0 ? tags : undefined,
61
+ };
62
+ response[OPERATION_EVENT_KEY] = operationEvent;
63
+ }
64
+ return response;
13
65
  }
14
66
  catch (error) {
15
67
  logger.error("Error downloading asset:", error);
@@ -0,0 +1,4 @@
1
+ import type { HeartbeatRequest, HeartbeatResponse } from "../../../schemas/index";
2
+ import type { DelegatedHandlerOptions } from "../profiling/index";
3
+ export declare function handleHeartbeatDelegated(request: HeartbeatRequest, options?: DelegatedHandlerOptions): Promise<HeartbeatResponse>;
4
+ //# sourceMappingURL=heartbeat-delegated.d.ts.map
@@ -0,0 +1,32 @@
1
+ import { getServerLogger } from "../../../logging/index.js";
2
+ import { getRPC } from "../../bare/delegate-rpc-client.js";
3
+ import { send } from "../delegate-transport.js";
4
+ import { DelegateConnectionFailedError } from "../../../utils/errors-server.js";
5
+ const logger = getServerLogger();
6
+ export async function handleHeartbeatDelegated(request, options) {
7
+ const { delegate } = request;
8
+ if (!delegate) {
9
+ throw new DelegateConnectionFailedError("Delegated heartbeat handler called without delegate info");
10
+ }
11
+ const { topic, providerPublicKey, timeout } = delegate;
12
+ try {
13
+ const rpc = await getRPC(topic, providerPublicKey, { timeout });
14
+ const delegateOpts = {
15
+ peerKey: providerPublicKey,
16
+ };
17
+ if (timeout !== undefined) {
18
+ delegateOpts.timeout = timeout;
19
+ }
20
+ if (options?.profilingMeta) {
21
+ delegateOpts.profilingMeta = options.profilingMeta;
22
+ }
23
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
+ const { delegate: _delegate, ...providerRequest } = request;
25
+ const response = await send(providerRequest, rpc, delegateOpts);
26
+ return response;
27
+ }
28
+ catch (error) {
29
+ logger.error("Error during delegated heartbeat:", error);
30
+ throw error;
31
+ }
32
+ }
@@ -0,0 +1,3 @@
1
+ import type { HeartbeatResponse } from "../../../schemas/index";
2
+ export declare function handleHeartbeat(): HeartbeatResponse;
3
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1,3 @@
1
+ export function handleHeartbeat() {
2
+ return { type: "heartbeat", number: Math.random() * 100 };
3
+ }
@@ -14,11 +14,11 @@ import { handleDeleteCache } from "./delete-cache";
14
14
  import { handleTextToSpeech } from "./text-to-speech";
15
15
  import { handleGetModelInfo } from "./get-model-info";
16
16
  import { handleOCRStream } from "./ocr-stream";
17
- import { handlePing } from "./ping";
17
+ import { handleHeartbeat } from "./heartbeat";
18
18
  import { handlePluginInvoke, handlePluginInvokeStream } from "./plugin-invoke";
19
19
  import { handleModelRegistryList, handleModelRegistrySearch, handleModelRegistryGetModel } from "./registry";
20
20
  export declare const handlers: {
21
- ping: typeof handlePing;
21
+ heartbeat: typeof handleHeartbeat;
22
22
  completionStream: typeof handleCompletionStream;
23
23
  downloadAsset: typeof handleDownloadAsset;
24
24
  deleteCache: typeof handleDeleteCache;
@@ -14,11 +14,11 @@ import { handleDeleteCache } from "./delete-cache.js";
14
14
  import { handleTextToSpeech } from "./text-to-speech.js";
15
15
  import { handleGetModelInfo } from "./get-model-info.js";
16
16
  import { handleOCRStream } from "./ocr-stream.js";
17
- import { handlePing } from "./ping.js";
17
+ import { handleHeartbeat } from "./heartbeat.js";
18
18
  import { handlePluginInvoke, handlePluginInvokeStream } from "./plugin-invoke.js";
19
19
  import { handleModelRegistryList, handleModelRegistrySearch, handleModelRegistryGetModel, } from "./registry.js";
20
20
  export const handlers = {
21
- ping: handlePing,
21
+ heartbeat: handleHeartbeat,
22
22
  completionStream: handleCompletionStream,
23
23
  downloadAsset: handleDownloadAsset,
24
24
  deleteCache: handleDeleteCache,
@@ -0,0 +1,6 @@
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>;
6
+ //# sourceMappingURL=download-stats.d.ts.map
@@ -0,0 +1,87 @@
1
+ import { downloadModelFromHttp } from "./http.js";
2
+ import { downloadModelFromRegistry } from "./registry.js";
3
+ import { downloadModelFromHyperdrive } from "./hyperdrive.js";
4
+ import { nowMs } from "../../../../profiling/index.js";
5
+ function createStatsCollector() {
6
+ return {
7
+ maxBytesDownloaded: 0,
8
+ startTimeMs: nowMs(),
9
+ cacheHit: undefined,
10
+ checksumValidationTimeMsTotal: 0,
11
+ };
12
+ }
13
+ function createHooks(collector) {
14
+ return {
15
+ markCacheHit: () => {
16
+ if (collector.cacheHit === undefined) {
17
+ collector.cacheHit = true;
18
+ collector.maxBytesDownloaded = 0;
19
+ }
20
+ },
21
+ markCacheMiss: () => {
22
+ collector.cacheHit = false;
23
+ },
24
+ addChecksumValidationTimeMs: (durationMs) => {
25
+ collector.checksumValidationTimeMsTotal += durationMs;
26
+ },
27
+ };
28
+ }
29
+ function wrapProgressCallback(collector, originalCallback) {
30
+ return (progress) => {
31
+ // Don't track bytes for cache hits (they're not real network transfer)
32
+ if (collector.cacheHit !== true) {
33
+ const downloaded = progress.onnxInfo?.overallDownloaded ??
34
+ progress.shardInfo?.overallDownloaded ??
35
+ progress.downloaded ??
36
+ 0;
37
+ collector.maxBytesDownloaded = Math.max(collector.maxBytesDownloaded, downloaded);
38
+ }
39
+ originalCallback?.(progress);
40
+ };
41
+ }
42
+ function computeStats(collector) {
43
+ const downloadTimeMs = nowMs() - collector.startTimeMs;
44
+ const totalBytesDownloaded = collector.maxBytesDownloaded;
45
+ const stats = {};
46
+ if (collector.cacheHit !== undefined) {
47
+ stats.cacheHit = collector.cacheHit;
48
+ }
49
+ if (collector.checksumValidationTimeMsTotal > 0) {
50
+ stats.checksumValidationTimeMs = collector.checksumValidationTimeMsTotal;
51
+ }
52
+ if (collector.cacheHit === true) {
53
+ return Object.keys(stats).length > 0 ? stats : undefined;
54
+ }
55
+ if (totalBytesDownloaded > 0) {
56
+ stats.downloadTimeMs = downloadTimeMs;
57
+ stats.totalBytesDownloaded = totalBytesDownloaded;
58
+ if (downloadTimeMs > 0) {
59
+ stats.downloadSpeedBps = (totalBytesDownloaded * 1000) / downloadTimeMs;
60
+ }
61
+ }
62
+ return Object.keys(stats).length > 0 ? stats : undefined;
63
+ }
64
+ export async function downloadModelFromHttpWithStats(url, progressCallback) {
65
+ const collector = createStatsCollector();
66
+ const hooks = createHooks(collector);
67
+ const wrappedCallback = wrapProgressCallback(collector, progressCallback);
68
+ const path = await downloadModelFromHttp(url, wrappedCallback, hooks);
69
+ const stats = computeStats(collector);
70
+ return stats ? { path, stats } : { path };
71
+ }
72
+ export async function downloadModelFromRegistryWithStats(registryPath, registrySource, progressCallback, expectedChecksum) {
73
+ const collector = createStatsCollector();
74
+ const hooks = createHooks(collector);
75
+ const wrappedCallback = wrapProgressCallback(collector, progressCallback);
76
+ const path = await downloadModelFromRegistry(registryPath, registrySource, wrappedCallback, expectedChecksum, hooks);
77
+ const stats = computeStats(collector);
78
+ return stats ? { path, stats } : { path };
79
+ }
80
+ export async function downloadModelFromHyperdriveWithStats(hyperdriveKey, modelFileName, seed, progressCallback) {
81
+ const collector = createStatsCollector();
82
+ const hooks = createHooks(collector);
83
+ const wrappedCallback = wrapProgressCallback(collector, progressCallback);
84
+ const path = await downloadModelFromHyperdrive(hyperdriveKey, modelFileName, seed, wrappedCallback, hooks);
85
+ const stats = computeStats(collector);
86
+ return stats ? { path, stats } : { path };
87
+ }
@@ -1,112 +1,135 @@
1
- import { normalizeModelType, ModelType } from "../../../../schemas/index.js";
2
- import { hyperdriveUrlSchema } from "../../../../schemas/load-model.js";
1
+ import { normalizeModelType, PROFILING_KEY, OPERATION_EVENT_KEY, } from "../../../../schemas/index.js";
3
2
  import { loadModel } from "../../../bare/ops/load-model.js";
4
- import { resolveModelPath } from "./resolve.js";
3
+ import { resolveModelPath, resolveModelPathWithStats, } from "./resolve.js";
4
+ import { nowMs, generateProfileId } from "../../../../profiling/clock.js";
5
5
  import { getModelEntry, updateModelConfig, } from "../../../bare/registry/model-registry.js";
6
- import { generateShortHash, transformConfigForReload } from "../../../utils/index.js";
7
- import { ConfigReloadNotSupportedError, ModelTypeMismatchError, ModelIsDelegatedError, ModelNotFoundError, } from "../../../../utils/errors-server.js";
6
+ import { generateShortHash, canonicalConfigString, transformConfigForReload, } from "../../../utils/index.js";
7
+ import { ConfigReloadNotSupportedError, ModelTypeMismatchError, ModelIsDelegatedError, ModelNotFoundError, ModelLoadFailedError, PluginLoadConfigValidationFailedError, PluginNotFoundError, } from "../../../../utils/errors-server.js";
8
8
  import { getServerLogger } from "../../../../logging/index.js";
9
- import { OCR_CRAFT_DETECTOR } from "../../../../models/registry/index.js";
10
9
  import { getPlugin } from "../../../plugins/index.js";
11
10
  const logger = getServerLogger();
12
- const OCR_DETECTOR_FILENAME = "detector_craft.onnx";
11
+ // ---------------------------------------------------------------------------
12
+ // Handler
13
+ // ---------------------------------------------------------------------------
13
14
  export async function handleLoadModel(request, progressCallback) {
14
- // Handle reload config
15
15
  if (isReloadConfigRequest(request)) {
16
16
  return handleConfigReload(request);
17
17
  }
18
- // Handle load new model from source
19
- const { modelSrc, modelName, seed, projectionModelSrc, vadModelSrc } = request;
18
+ const { modelSrc, modelName, seed } = request;
20
19
  const canonicalModelType = normalizeModelType(request.modelType);
21
- const srcVocabSrc = canonicalModelType === ModelType.nmtcppTranslation
22
- ? request.srcVocabSrc
23
- : undefined;
24
- const dstVocabSrc = canonicalModelType === ModelType.nmtcppTranslation
25
- ? request.dstVocabSrc
26
- : undefined;
27
- const detectorModelSrc = canonicalModelType === ModelType.onnxOcr
28
- ? request.detectorModelSrc
29
- : undefined;
20
+ const profilingMeta = request[PROFILING_KEY];
21
+ const profilingEnabled = profilingMeta?.enabled !== false && !!profilingMeta;
30
22
  try {
31
- const modelPath = await resolveModelPath(modelSrc, progressCallback, seed);
32
- let projectionModelPath;
33
- if (projectionModelSrc) {
34
- projectionModelPath = await resolveModelPath(projectionModelSrc, progressCallback, seed);
23
+ const plugin = getPlugin(canonicalModelType);
24
+ if (!plugin) {
25
+ throw new PluginNotFoundError(canonicalModelType);
35
26
  }
36
- let vadModelPath;
37
- if (vadModelSrc) {
38
- vadModelPath = await resolveModelPath(vadModelSrc, progressCallback, seed);
27
+ let resolvedModelConfig = (request.modelConfig ?? {});
28
+ const parseResult = plugin.loadConfigSchema.safeParse(resolvedModelConfig);
29
+ if (!parseResult.success) {
30
+ const details = parseResult.error.issues
31
+ .map((i) => `${String(i.path.join("."))}: ${i.message}`)
32
+ .join(", ");
33
+ throw new PluginLoadConfigValidationFailedError(canonicalModelType, details);
39
34
  }
40
- // For OCR models: use provided detectorModelSrc or auto-derive
41
- let detectorModelPath;
42
- if (canonicalModelType === ModelType.onnxOcr) {
43
- if (detectorModelSrc) {
44
- detectorModelPath = await resolveModelPath(detectorModelSrc, progressCallback, seed);
45
- }
46
- else if (modelSrc.startsWith("pear://")) {
47
- const { key } = hyperdriveUrlSchema.parse(modelSrc);
48
- const derivedDetectorSrc = `pear://${key}/${OCR_DETECTOR_FILENAME}`;
49
- detectorModelPath = await resolveModelPath(derivedDetectorSrc, progressCallback, seed);
50
- }
51
- else if (modelSrc.startsWith("registry://")) {
52
- detectorModelPath = await resolveModelPath(OCR_CRAFT_DETECTOR, progressCallback, seed);
53
- }
35
+ resolvedModelConfig = parseResult.data;
36
+ const totalLoadStart = profilingEnabled ? nowMs() : 0;
37
+ let resolveResult;
38
+ let resolvedModelPath;
39
+ if (profilingEnabled) {
40
+ resolveResult = await resolveModelPathWithStats(modelSrc, progressCallback, seed);
41
+ resolvedModelPath = resolveResult.path;
54
42
  }
55
- // For Bergamot models, resolve vocabulary sources to local paths
56
- if (canonicalModelType === ModelType.nmtcppTranslation &&
57
- request.modelConfig) {
58
- const nmtConfig = request.modelConfig;
59
- if (nmtConfig.engine === "Bergamot") {
60
- let resolvedSrcVocabSrc = srcVocabSrc;
61
- let resolvedDstVocabSrc = dstVocabSrc;
62
- if (!srcVocabSrc || !dstVocabSrc) {
63
- const derivedVocabSrcs = modelSrc.startsWith("pear://")
64
- ? deriveBergamotVocabSources(modelSrc)
65
- : modelSrc.startsWith("registry://")
66
- ? deriveBergamotRegistryVocabSources(modelSrc)
67
- : null;
68
- if (derivedVocabSrcs) {
69
- resolvedSrcVocabSrc = srcVocabSrc ?? derivedVocabSrcs.srcVocabSrc;
70
- resolvedDstVocabSrc = dstVocabSrc ?? derivedVocabSrcs.dstVocabSrc;
71
- }
72
- }
73
- if (resolvedSrcVocabSrc) {
74
- nmtConfig.srcVocabPath = await resolveModelPath(resolvedSrcVocabSrc, progressCallback, seed);
75
- }
76
- if (resolvedDstVocabSrc) {
77
- nmtConfig.dstVocabPath = await resolveModelPath(resolvedDstVocabSrc, progressCallback, seed);
78
- }
79
- }
43
+ else {
44
+ resolvedModelPath = await resolveModelPath(modelSrc, progressCallback, seed);
80
45
  }
81
- // Use plugin's resolveConfig hook if available to resolve model sources
82
- let resolvedModelConfig = request.modelConfig;
83
- const plugin = getPlugin(canonicalModelType);
84
- if (plugin?.resolveConfig && resolvedModelConfig) {
85
- const resolve = (src) => resolveModelPath(src, progressCallback, seed);
86
- resolvedModelConfig = await plugin.resolveConfig(resolvedModelConfig, resolve);
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
+ }
87
59
  }
88
- // Generate hash-based modelId from modelConfig (includes all sources for TTS)
89
- const configStr = JSON.stringify(request.modelConfig, Object.keys(request.modelConfig).sort());
60
+ const configStr = canonicalConfigString(request.modelConfig);
90
61
  const modelHashInput = `${request.modelType}:${modelSrc}:${configStr}`;
91
62
  const modelId = generateShortHash(modelHashInput);
92
- const loadModelOptions = {
93
- ...request,
94
- modelConfig: resolvedModelConfig,
95
- };
96
- await loadModel({
63
+ if ("modelPath" in pluginArtifacts) {
64
+ logger.warn("Plugin returned 'modelPath' artifact which was overridden by core");
65
+ }
66
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
67
+ const { modelPath: _, ...artifacts } = pluginArtifacts;
68
+ if (!resolvedModelPath) {
69
+ throw new ModelLoadFailedError("modelPath resolution failed");
70
+ }
71
+ const loadResult = await loadModel({
97
72
  modelId,
98
- modelPath,
99
- options: loadModelOptions,
100
- projectionModelPath,
101
- vadModelPath,
102
- detectorModelPath,
73
+ modelPath: resolvedModelPath,
74
+ options: {
75
+ ...request,
76
+ modelType: canonicalModelType,
77
+ modelConfig: resolvedModelConfig,
78
+ },
79
+ artifacts: Object.keys(artifacts).length > 0 ? artifacts : undefined,
103
80
  modelName,
104
- });
105
- return {
81
+ }, profilingEnabled ? { collectTiming: true } : undefined);
82
+ const response = {
106
83
  type: "loadModel",
107
84
  success: true,
108
85
  modelId,
109
86
  };
87
+ if (profilingEnabled) {
88
+ const totalLoadTimeMs = nowMs() - totalLoadStart;
89
+ const profileId = profilingMeta?.id ?? generateProfileId();
90
+ const gauges = {
91
+ totalLoadTime: totalLoadTimeMs,
92
+ };
93
+ if (loadResult.timing?.modelInitializationTimeMs !== undefined) {
94
+ gauges["modelInitializationTime"] =
95
+ loadResult.timing.modelInitializationTimeMs;
96
+ }
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
+ if (canonicalModelType) {
114
+ tags["modelType"] = canonicalModelType;
115
+ }
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
+ const operationEvent = {
123
+ op: "loadModel",
124
+ kind: "handler",
125
+ ms: totalLoadTimeMs,
126
+ profileId,
127
+ gauges: Object.keys(gauges).length > 0 ? gauges : undefined,
128
+ tags: Object.keys(tags).length > 0 ? tags : undefined,
129
+ };
130
+ response[OPERATION_EVENT_KEY] = operationEvent;
131
+ }
132
+ return response;
110
133
  }
111
134
  catch (error) {
112
135
  logger.error("Error loading model:", error);
@@ -162,41 +185,3 @@ async function handleConfigReload(request) {
162
185
  function isReloadConfigRequest(request) {
163
186
  return "modelId" in request && !("modelSrc" in request);
164
187
  }
165
- const BERGAMOT_CJK_LANG_PAIRS = ["enja", "enko", "enzh"];
166
- function deriveBergamotVocabSources(modelSrc) {
167
- const match = modelSrc.match(/^pear:\/\/([a-f0-9]+)\/model\.([a-z]+)\.intgemm\.alphas\.bin$/);
168
- if (!match || !match[1] || !match[2])
169
- return null;
170
- const key = match[1];
171
- const langPair = match[2];
172
- if (BERGAMOT_CJK_LANG_PAIRS.includes(langPair)) {
173
- return {
174
- srcVocabSrc: `pear://${key}/srcvocab.${langPair}.spm`,
175
- dstVocabSrc: `pear://${key}/trgvocab.${langPair}.spm`,
176
- };
177
- }
178
- const sharedVocab = `pear://${key}/vocab.${langPair}.spm`;
179
- return {
180
- srcVocabSrc: sharedVocab,
181
- dstVocabSrc: sharedVocab,
182
- };
183
- }
184
- function deriveBergamotRegistryVocabSources(modelSrc) {
185
- // registry://s3/path/to/model.enfr.intgemm.alphas.bin
186
- const match = modelSrc.match(/^(registry:\/\/.+\/)model\.([a-z]+)\.intgemm\.alphas\.bin$/);
187
- if (!match || !match[1] || !match[2])
188
- return null;
189
- const basePath = match[1];
190
- const langPair = match[2];
191
- if (BERGAMOT_CJK_LANG_PAIRS.includes(langPair)) {
192
- return {
193
- srcVocabSrc: `${basePath}srcvocab.${langPair}.spm`,
194
- dstVocabSrc: `${basePath}trgvocab.${langPair}.spm`,
195
- };
196
- }
197
- const sharedVocab = `${basePath}vocab.${langPair}.spm`;
198
- return {
199
- srcVocabSrc: sharedVocab,
200
- dstVocabSrc: sharedVocab,
201
- };
202
- }
@@ -1,3 +1,4 @@
1
1
  import type { ModelProgressUpdate } from "../../../../schemas/index";
2
- export declare function downloadModelFromHttp(url: string, progressCallback?: (progress: ModelProgressUpdate) => void): Promise<string>;
2
+ import type { DownloadMetricsHooks } from "./types";
3
+ export declare function downloadModelFromHttp(url: string, progressCallback?: (progress: ModelProgressUpdate) => void, hooks?: DownloadMetricsHooks): Promise<string>;
3
4
  //# sourceMappingURL=http.d.ts.map