@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.
- package/NOTICE +73 -10
- package/README.md +4 -4
- package/bare-imports.json +9 -0
- package/dist/client/api/cancel.d.ts +9 -0
- package/dist/client/api/cancel.js +9 -0
- package/dist/client/api/completion-stream.d.ts +2 -1
- package/dist/client/api/completion-stream.js +2 -1
- package/dist/client/api/download-asset.d.ts +3 -2
- package/dist/client/api/download-asset.js +4 -3
- package/dist/client/api/embed.d.ts +5 -2
- package/dist/client/api/embed.js +2 -2
- package/dist/client/api/get-model-info.d.ts +1 -1
- package/dist/client/api/heartbeat.d.ts +30 -0
- package/dist/client/api/heartbeat.js +38 -0
- package/dist/client/api/index.d.ts +1 -1
- package/dist/client/api/index.js +1 -1
- package/dist/client/api/invoke-plugin.d.ts +3 -2
- package/dist/client/api/invoke-plugin.js +4 -4
- package/dist/client/api/load-model.d.ts +12 -10
- package/dist/client/api/load-model.js +3 -3
- package/dist/client/api/rag.d.ts +10 -10
- package/dist/client/api/rag.js +21 -21
- package/dist/client/api/text-to-speech.d.ts +2 -2
- package/dist/client/api/text-to-speech.js +3 -3
- package/dist/client/api/transcribe.d.ts +5 -3
- package/dist/client/api/transcribe.js +6 -4
- package/dist/client/api/translate.d.ts +2 -2
- package/dist/client/api/translate.js +3 -3
- package/dist/client/rpc/node-rpc-client.d.ts +2 -7
- package/dist/client/rpc/node-rpc-client.js +2 -39
- package/dist/client/rpc/profiling/index.d.ts +2 -0
- package/dist/client/rpc/profiling/index.js +1 -0
- package/dist/client/rpc/profiling/profiler.d.ts +27 -0
- package/dist/client/rpc/profiling/profiler.js +139 -0
- package/dist/client/rpc/rpc-client.d.ts +2 -2
- package/dist/client/rpc/rpc-client.js +174 -12
- package/dist/examples/delegated-inference/consumer-profiled.d.ts +2 -0
- package/dist/examples/delegated-inference/consumer-profiled.js +67 -0
- package/dist/examples/embed-p2p.d.ts +2 -0
- package/dist/examples/llamacpp-multimodal.js +1 -1
- package/dist/examples/llamacpp-p2p.d.ts +2 -0
- package/dist/examples/parallel-download.js +45 -13
- package/dist/examples/profiling/basic.d.ts +2 -0
- package/dist/examples/profiling/basic.js +71 -0
- package/dist/examples/profiling/per-call.d.ts +2 -0
- package/dist/examples/profiling/per-call.js +30 -0
- package/dist/examples/seed-p2p.d.ts +2 -0
- package/dist/examples/transcription/parakeet-ctc-filesystem.d.ts +2 -0
- package/dist/examples/transcription/parakeet-ctc-filesystem.js +40 -0
- package/dist/examples/transcription/parakeet-microphone-record.d.ts +2 -0
- package/dist/examples/transcription/parakeet-microphone-record.js +95 -0
- package/dist/examples/transcription/parakeet-sortformer.d.ts +2 -0
- package/dist/examples/transcription/parakeet-sortformer.js +115 -0
- package/dist/examples/transcription/parakeet-tdt-filesystem.d.ts +2 -0
- package/dist/examples/transcription/parakeet-tdt-filesystem.js +44 -0
- package/dist/examples/translation/translation-bergamot-pivot.d.ts +2 -0
- package/dist/examples/translation/translation-bergamot-pivot.js +73 -0
- package/dist/examples/translation/translation-llm-afriquegemma.d.ts +2 -0
- package/dist/examples/translation/translation-llm-afriquegemma.js +39 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +3 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.js +1 -1
- package/dist/logging/namespaces.d.ts +3 -9
- package/dist/logging/namespaces.js +2 -8
- package/dist/logging/registry.js +15 -1
- package/dist/models/registry/models.d.ts +1671 -310
- package/dist/models/registry/models.js +2116 -710
- package/dist/models/update-models/codegen.js +2 -2
- package/dist/models/update-models/history.d.ts +11 -0
- package/dist/models/update-models/history.js +24 -5
- package/dist/models/update-models/index.js +17 -16
- package/dist/models/update-models/naming.js +56 -0
- package/dist/profiling/aggregator.d.ts +15 -0
- package/dist/profiling/aggregator.js +100 -0
- package/dist/profiling/clock.d.ts +12 -0
- package/dist/profiling/clock.js +51 -0
- package/dist/profiling/controller.d.ts +33 -0
- package/dist/profiling/controller.js +123 -0
- package/dist/profiling/envelope.d.ts +10 -0
- package/dist/profiling/envelope.js +36 -0
- package/dist/profiling/events.d.ts +20 -0
- package/dist/profiling/events.js +37 -0
- package/dist/profiling/exporters.d.ts +10 -0
- package/dist/profiling/exporters.js +236 -0
- package/dist/profiling/index.d.ts +36 -0
- package/dist/profiling/index.js +31 -0
- package/dist/profiling/ring-buffer.d.ts +19 -0
- package/dist/profiling/ring-buffer.js +83 -0
- package/dist/profiling/types.d.ts +47 -0
- package/dist/profiling/types.js +1 -0
- package/dist/schemas/cancel.d.ts +12 -0
- package/dist/schemas/cancel.js +2 -0
- package/dist/schemas/common.d.ts +1927 -135
- package/dist/schemas/common.js +6 -3
- package/dist/schemas/completion-stream.d.ts +31 -0
- package/dist/schemas/completion-stream.js +13 -0
- package/dist/schemas/delegate.d.ts +8 -0
- package/dist/schemas/delegate.js +5 -2
- package/dist/schemas/download-asset.d.ts +14 -3
- package/dist/schemas/download-asset.js +3 -1
- package/dist/schemas/engine-addon-map.js +9 -6
- package/dist/schemas/get-model-info.d.ts +2 -0
- package/dist/schemas/get-model-info.js +1 -0
- package/dist/schemas/heartbeat.d.ts +17 -0
- package/dist/schemas/heartbeat.js +10 -0
- package/dist/schemas/index.d.ts +3 -2
- package/dist/schemas/index.js +3 -2
- package/dist/schemas/llamacpp-config.d.ts +140 -14
- package/dist/schemas/llamacpp-config.js +11 -7
- package/dist/schemas/load-model.d.ts +9762 -2515
- package/dist/schemas/load-model.js +142 -182
- package/dist/schemas/model-src-utils.d.ts +10 -2
- package/dist/schemas/model-types.d.ts +19 -1
- package/dist/schemas/model-types.js +11 -0
- package/dist/schemas/ocr.d.ts +37 -0
- package/dist/schemas/ocr.js +5 -0
- package/dist/schemas/plugin.d.ts +51 -5
- package/dist/schemas/plugin.js +26 -0
- package/dist/schemas/profiling.d.ts +105 -0
- package/dist/schemas/profiling.js +66 -0
- package/dist/schemas/registry.d.ts +18 -0
- package/dist/schemas/registry.js +2 -0
- package/dist/schemas/reload-config.d.ts +126 -6
- package/dist/schemas/reload-config.js +1 -1
- package/dist/schemas/sdk-config.d.ts +2280 -24
- package/dist/schemas/sdk-config.js +6 -1
- package/dist/schemas/sdk-errors-client.d.ts +1 -0
- package/dist/schemas/sdk-errors-client.js +7 -0
- package/dist/schemas/sdk-errors-server.d.ts +3 -0
- package/dist/schemas/sdk-errors-server.js +15 -0
- package/dist/schemas/text-to-speech.d.ts +90 -68
- package/dist/schemas/text-to-speech.js +16 -33
- package/dist/schemas/transcription-config.d.ts +383 -0
- package/dist/schemas/{whispercpp-config.js → transcription-config.js} +29 -1
- package/dist/schemas/translation-config.d.ts +463 -8
- package/dist/schemas/translation-config.js +35 -2
- package/dist/server/bare/delegate-rpc-client.js +52 -11
- package/dist/server/bare/ops/load-model.d.ts +7 -1
- package/dist/server/bare/ops/load-model.js +41 -42
- package/dist/server/bare/ops/transcribe.d.ts +3 -0
- package/dist/server/bare/ops/transcribe.js +75 -0
- package/dist/server/bare/ops/translate.d.ts +2 -0
- package/dist/server/bare/ops/translate.js +12 -4
- package/dist/server/bare/plugins/index.d.ts +1 -0
- package/dist/server/bare/plugins/index.js +1 -0
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.d.ts +2 -1
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +8 -6
- package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +108 -3
- package/dist/server/bare/plugins/llamacpp-completion/plugin.js +19 -6
- package/dist/server/bare/plugins/llamacpp-embedding/plugin.d.ts +32 -2
- package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +31 -17
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +325 -3
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +117 -13
- package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +50 -2
- package/dist/server/bare/plugins/onnx-ocr/plugin.js +46 -5
- package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +351 -4
- package/dist/server/bare/plugins/onnx-tts/plugin.js +81 -61
- package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +317 -0
- package/dist/server/bare/plugins/parakeet-transcription/plugin.js +154 -0
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +209 -3
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +21 -9
- package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +2 -2
- package/dist/server/bare/registry/model-config-utils.js +3 -1
- package/dist/server/bare/registry/model-registry.d.ts +2 -0
- package/dist/server/bare/registry/model-registry.js +2 -1
- package/dist/server/bare/utils/audio-input.d.ts +10 -0
- package/dist/server/bare/utils/audio-input.js +33 -0
- package/dist/server/error-handlers.d.ts +3 -2
- package/dist/server/error-handlers.js +11 -8
- package/dist/server/plugins/registry.js +5 -1
- package/dist/server/rpc/delegate-transport.d.ts +11 -3
- package/dist/server/rpc/delegate-transport.js +214 -38
- package/dist/server/rpc/delegate-utils.d.ts +2 -0
- package/dist/server/rpc/delegate-utils.js +5 -0
- package/dist/server/rpc/handle-request.js +43 -4
- package/dist/server/rpc/handler-registry.js +33 -4
- package/dist/server/rpc/handler-utils.d.ts +5 -4
- package/dist/server/rpc/handler-utils.js +114 -31
- package/dist/server/rpc/handlers/cancel-delegated.d.ts +4 -0
- package/dist/server/rpc/handlers/cancel-delegated.js +71 -0
- package/dist/server/rpc/handlers/completion-stream-delegated.d.ts +3 -1
- package/dist/server/rpc/handlers/completion-stream-delegated.js +13 -4
- package/dist/server/rpc/handlers/download-asset.js +55 -3
- package/dist/server/rpc/handlers/heartbeat-delegated.d.ts +4 -0
- package/dist/server/rpc/handlers/heartbeat-delegated.js +32 -0
- package/dist/server/rpc/handlers/heartbeat.d.ts +3 -0
- package/dist/server/rpc/handlers/heartbeat.js +3 -0
- package/dist/server/rpc/handlers/index.d.ts +2 -2
- package/dist/server/rpc/handlers/index.js +2 -2
- package/dist/server/rpc/handlers/load-model/download-stats.d.ts +6 -0
- package/dist/server/rpc/handlers/load-model/download-stats.js +87 -0
- package/dist/server/rpc/handlers/load-model/handler.js +108 -123
- package/dist/server/rpc/handlers/load-model/http.d.ts +2 -1
- package/dist/server/rpc/handlers/load-model/http.js +21 -5
- package/dist/server/rpc/handlers/load-model/hyperdrive.d.ts +2 -1
- package/dist/server/rpc/handlers/load-model/hyperdrive.js +19 -14
- package/dist/server/rpc/handlers/load-model/registry.d.ts +2 -1
- package/dist/server/rpc/handlers/load-model/registry.js +113 -136
- package/dist/server/rpc/handlers/load-model/resolve.d.ts +2 -0
- package/dist/server/rpc/handlers/load-model/resolve.js +55 -22
- package/dist/server/rpc/handlers/load-model/types.d.ts +29 -0
- package/dist/server/rpc/handlers/load-model/types.js +1 -0
- package/dist/server/rpc/handlers/load-model-delegated.d.ts +5 -1
- package/dist/server/rpc/handlers/load-model-delegated.js +41 -11
- package/dist/server/rpc/handlers/plugin-dispatch.js +15 -10
- package/dist/server/rpc/handlers/plugin-invoke.js +56 -51
- package/dist/server/rpc/handlers/rag.js +24 -0
- package/dist/server/rpc/handlers/unload-model-delegated.d.ts +3 -0
- package/dist/server/rpc/handlers/unload-model-delegated.js +32 -0
- package/dist/server/rpc/profiling/context.d.ts +18 -0
- package/dist/server/rpc/profiling/context.js +38 -0
- package/dist/server/rpc/profiling/delegation-profiler.d.ts +32 -0
- package/dist/server/rpc/profiling/delegation-profiler.js +154 -0
- package/dist/server/rpc/profiling/index.d.ts +5 -0
- package/dist/server/rpc/profiling/index.js +4 -0
- package/dist/server/rpc/profiling/operation-metrics.d.ts +25 -0
- package/dist/server/rpc/profiling/operation-metrics.js +199 -0
- package/dist/server/rpc/profiling/operation-wrappers.d.ts +18 -0
- package/dist/server/rpc/profiling/operation-wrappers.js +124 -0
- package/dist/server/rpc/profiling/profiler.d.ts +13 -0
- package/dist/server/rpc/profiling/profiler.js +97 -0
- package/dist/server/utils/cache.d.ts +2 -1
- package/dist/server/utils/cache.js +5 -1
- package/dist/server/utils/checksum.d.ts +2 -0
- package/dist/server/utils/checksum.js +7 -0
- package/dist/server/utils/formatting.d.ts +6 -0
- package/dist/server/utils/formatting.js +35 -0
- package/dist/server/worker.js +2 -1
- package/dist/utils/errors-client.d.ts +3 -0
- package/dist/utils/errors-client.js +6 -0
- package/dist/utils/errors-server.d.ts +9 -0
- package/dist/utils/errors-server.js +15 -0
- package/dist/utils/global-singleton.d.ts +2 -0
- package/dist/utils/global-singleton.js +10 -0
- package/package.json +22 -18
- package/dist/client/api/ping.d.ts +0 -11
- package/dist/client/api/ping.js +0 -19
- package/dist/examples/embed-hyperdrive.d.ts +0 -2
- package/dist/examples/llamacpp-hyperdrive.d.ts +0 -2
- package/dist/examples/seed-hyperdrive.d.ts +0 -2
- package/dist/schemas/ping.d.ts +0 -11
- package/dist/schemas/ping.js +0 -8
- package/dist/schemas/whispercpp-config.d.ts +0 -70
- package/dist/server/bare/plugins/whispercpp-transcription/ops/transcribe-stream.d.ts +0 -3
- package/dist/server/bare/plugins/whispercpp-transcription/ops/transcribe-stream.js +0 -81
- package/dist/server/rpc/handlers/ping.d.ts +0 -3
- package/dist/server/rpc/handlers/ping.js +0 -3
- /package/dist/examples/{embed-hyperdrive.js → embed-p2p.js} +0 -0
- /package/dist/examples/{llamacpp-hyperdrive.js → llamacpp-p2p.js} +0 -0
- /package/dist/examples/{seed-hyperdrive.js → seed-p2p.js} +0 -0
- /package/dist/examples/{whispercpp-filesystem.d.ts → transcription/whispercpp-filesystem.d.ts} +0 -0
- /package/dist/examples/{whispercpp-filesystem.js → transcription/whispercpp-filesystem.js} +0 -0
- /package/dist/examples/{whispercpp-microphone-record.d.ts → transcription/whispercpp-microphone-record.d.ts} +0 -0
- /package/dist/examples/{whispercpp-microphone-record.js → transcription/whispercpp-microphone-record.js} +0 -0
- /package/dist/examples/{whispercpp-prompt.d.ts → transcription/whispercpp-prompt.d.ts} +0 -0
- /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
|
-
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
8
|
-
|
|
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
|
+
}
|
|
@@ -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 {
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
19
|
-
const { modelSrc, modelName, seed, projectionModelSrc, vadModelSrc } = request;
|
|
18
|
+
const { modelSrc, modelName, seed } = request;
|
|
20
19
|
const canonicalModelType = normalizeModelType(request.modelType);
|
|
21
|
-
const
|
|
22
|
-
|
|
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
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
projectionModelPath = await resolveModelPath(projectionModelSrc, progressCallback, seed);
|
|
23
|
+
const plugin = getPlugin(canonicalModelType);
|
|
24
|
+
if (!plugin) {
|
|
25
|
+
throw new PluginNotFoundError(canonicalModelType);
|
|
35
26
|
}
|
|
36
|
-
let
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
56
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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:
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|