@qvac/sdk 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -24
- package/NOTICE +632 -0
- package/README.md +2 -1
- package/dist/client/api/embed.js +1 -4
- package/dist/client/api/get-model-info.d.ts +10 -3
- package/dist/client/api/index.d.ts +2 -0
- package/dist/client/api/index.js +2 -0
- package/dist/client/api/invoke-plugin.d.ts +14 -0
- package/dist/client/api/invoke-plugin.js +38 -0
- package/dist/client/api/registry.d.ts +14 -0
- package/dist/client/api/registry.js +37 -0
- package/dist/client/api/transcribe.js +0 -4
- package/dist/client/api/unload-model.js +1 -1
- package/dist/client/config-loader/resolve-config.node.d.ts +3 -2
- package/dist/client/config-loader/resolve-config.node.js +31 -4
- package/dist/client/init-hooks.js +2 -1
- package/dist/client/rpc/bare-client.d.ts +2 -0
- package/dist/client/rpc/bare-client.js +48 -7
- package/dist/client/rpc/expo-device-info.d.ts +6 -0
- package/dist/client/rpc/expo-device-info.js +32 -0
- package/dist/client/rpc/expo-rpc-client.js +9 -32
- package/dist/client/rpc/node-rpc-client.d.ts +1 -1
- package/dist/client/rpc/node-rpc-client.js +201 -28
- package/dist/client/rpc/rpc-client.d.ts +1 -1
- package/dist/client/rpc/rpc-client.js +2 -2
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.js +1 -0
- package/dist/constants/registry.d.ts +2 -0
- package/dist/constants/registry.js +1 -0
- package/dist/examples/cache-management.js +2 -2
- package/dist/examples/config/plugins/plugins.config.d.ts +5 -0
- package/dist/examples/config/plugins/plugins.config.js +4 -0
- package/dist/examples/download-with-blind-relays.js +1 -1
- package/dist/examples/llamacpp-multimodal.js +3 -3
- package/dist/examples/llamacpp-native-tools.js +2 -2
- package/dist/examples/mcp-websearch.js +2 -2
- package/dist/examples/multi-model-demo.js +2 -2
- package/dist/examples/ocr-fasttext.js +4 -4
- package/dist/examples/parallel-download.js +2 -2
- package/dist/examples/plugins.d.ts +14 -0
- package/dist/examples/plugins.js +129 -0
- package/dist/examples/registry-query.d.ts +2 -0
- package/dist/examples/registry-query.js +87 -0
- package/dist/examples/translation/translation-bergamot-batch.js +2 -2
- package/dist/examples/translation/translation-bergamot.js +4 -4
- package/dist/examples/translation/translation-opus.js +2 -2
- package/dist/examples/translation/translation-stream.js +2 -2
- package/dist/examples/tts/chatterbox.d.ts +2 -0
- package/dist/examples/tts/chatterbox.js +59 -0
- package/dist/examples/tts/supertonic.d.ts +2 -0
- package/dist/examples/tts/supertonic.js +51 -0
- package/dist/examples/tts/utils.d.ts +17 -0
- package/dist/examples/tts/utils.js +93 -0
- package/dist/examples/whispercpp-filesystem.js +2 -3
- package/dist/examples/whispercpp-microphone-record.js +1 -2
- package/dist/examples/whispercpp-prompt.js +2 -3
- package/dist/expo/plugins/index.d.ts +3 -0
- package/dist/expo/plugins/index.js +3 -0
- package/dist/expo/plugins/resolve-sdk-package-dir.d.ts +15 -0
- package/dist/expo/plugins/resolve-sdk-package-dir.js +31 -0
- package/dist/expo/plugins/withAndroidArchitecture.d.ts +8 -0
- package/dist/expo/plugins/withAndroidArchitecture.js +52 -0
- package/dist/expo/plugins/withAndroidNdkVersion.d.ts +8 -0
- package/dist/expo/plugins/withAndroidNdkVersion.js +31 -0
- package/dist/expo/plugins/withDeviceInfo.d.ts +10 -0
- package/dist/expo/plugins/withDeviceInfo.js +48 -0
- package/dist/expo/plugins/withMobileBundle.d.ts +5 -2
- package/dist/expo/plugins/withMobileBundle.js +121 -65
- package/dist/expo/plugins/withQvacSDK.d.ts +4 -0
- package/dist/expo/plugins/withQvacSDK.js +26 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +5 -5
- package/dist/models/{hyperdrive → registry}/index.js +1 -1
- package/dist/models/registry/models.d.ts +9056 -0
- package/dist/models/registry/models.js +9351 -0
- package/dist/models/update-models/codegen.d.ts +3 -0
- package/dist/models/update-models/codegen.js +135 -0
- package/dist/models/update-models/history.d.ts +13 -0
- package/dist/models/update-models/history.js +88 -0
- package/dist/models/update-models/index.d.ts +2 -0
- package/dist/models/update-models/index.js +124 -0
- package/dist/models/update-models/naming.d.ts +4 -0
- package/dist/models/update-models/naming.js +314 -0
- package/dist/models/update-models/processing.d.ts +8 -0
- package/dist/models/update-models/processing.js +67 -0
- package/dist/models/update-models/registry.d.ts +4 -0
- package/dist/models/update-models/registry.js +67 -0
- package/dist/models/update-models/shards.d.ts +4 -0
- package/dist/models/update-models/shards.js +57 -0
- package/dist/models/update-models/types.d.ts +60 -0
- package/dist/models/update-models/types.js +1 -0
- package/dist/models/update-models/utils.d.ts +3 -0
- package/dist/models/update-models/utils.js +21 -0
- package/dist/pear/pre.d.ts +18 -0
- package/dist/pear/pre.js +433 -0
- package/dist/schemas/common.d.ts +286 -32
- package/dist/schemas/common.js +12 -0
- package/dist/schemas/download-asset.d.ts +35 -11
- package/dist/schemas/download-asset.js +5 -1
- package/dist/schemas/engine-addon-map.d.ts +5 -0
- package/dist/schemas/engine-addon-map.js +49 -0
- package/dist/schemas/get-model-info.d.ts +32 -16
- package/dist/schemas/get-model-info.js +17 -8
- package/dist/schemas/index.d.ts +4 -1
- package/dist/schemas/index.js +4 -4
- package/dist/schemas/load-model.d.ts +2224 -900
- package/dist/schemas/load-model.js +130 -25
- package/dist/schemas/model-src-utils.d.ts +30 -12
- package/dist/schemas/model-src-utils.js +5 -2
- package/dist/schemas/model-types.d.ts +15 -4
- package/dist/schemas/model-types.js +21 -4
- package/dist/schemas/path-validation.d.ts +10 -0
- package/dist/schemas/path-validation.js +22 -0
- package/dist/schemas/plugin.d.ts +180 -0
- package/dist/schemas/plugin.js +132 -0
- package/dist/schemas/rag.d.ts +2 -2
- package/dist/schemas/rag.js +7 -3
- package/dist/schemas/registry.d.ts +338 -0
- package/dist/schemas/registry.js +91 -0
- package/dist/schemas/sdk-errors-client.d.ts +6 -6
- package/dist/schemas/sdk-errors-client.js +15 -15
- package/dist/schemas/sdk-errors-registry.d.ts +6 -0
- package/dist/schemas/sdk-errors-registry.js +8 -0
- package/dist/schemas/sdk-errors-server.d.ts +16 -2
- package/dist/schemas/sdk-errors-server.js +90 -10
- package/dist/schemas/text-to-speech.d.ts +670 -1
- package/dist/schemas/text-to-speech.js +51 -2
- package/dist/schemas/translate.d.ts +2 -2
- package/dist/scripts/run-security-tests-bare.d.ts +2 -0
- package/dist/scripts/run-security-tests-bare.js +78 -0
- package/dist/scripts/run-security-tests.d.ts +2 -0
- package/dist/scripts/run-security-tests.js +22 -0
- package/dist/server/bare/delegate-rpc-client.d.ts +6 -0
- package/dist/server/bare/delegate-rpc-client.js +136 -56
- package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.d.ts +1 -1
- package/dist/server/bare/{addons/llamacpp-embedding/handlers → ops}/embed.js +3 -3
- package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.js +6 -6
- package/dist/server/bare/{addons → ops}/load-model.js +32 -42
- package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.d.ts +1 -1
- package/dist/server/bare/{addons/nmtcpp-translation/handlers → ops}/translate.js +5 -4
- package/dist/server/bare/plugins/index.d.ts +7 -0
- package/dist/server/bare/plugins/index.js +6 -0
- package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.js +1 -1
- package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.d.ts +1 -1
- package/dist/server/bare/{addons/llamacpp-completion/handlers → plugins/llamacpp-completion/ops}/completion-stream.js +2 -3
- package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +115 -0
- package/dist/server/bare/plugins/llamacpp-completion/plugin.js +142 -0
- package/dist/server/bare/plugins/llamacpp-embedding/plugin.d.ts +24 -0
- package/dist/server/bare/plugins/llamacpp-embedding/plugin.js +73 -0
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +45 -0
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.js +97 -0
- package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.js +2 -1
- package/dist/server/bare/plugins/onnx-ocr/plugin.d.ts +38 -0
- package/dist/server/bare/{addons/onnx-ocr/create-model.js → plugins/onnx-ocr/plugin.js} +39 -2
- package/dist/server/bare/{addons/onnx-tts/handlers → plugins/onnx-tts/ops}/text-to-speech.js +23 -1
- package/dist/server/bare/plugins/onnx-tts/plugin.d.ts +26 -0
- package/dist/server/bare/plugins/onnx-tts/plugin.js +162 -0
- package/dist/server/bare/plugins/onnx-tts/wav-helper.d.ts +14 -0
- package/dist/server/bare/plugins/onnx-tts/wav-helper.js +107 -0
- package/dist/server/bare/plugins/whispercpp-transcription/ops/transcribe-stream.d.ts +3 -0
- package/dist/server/bare/{addons/whispercpp-transcription/handlers → plugins/whispercpp-transcription/ops}/transcribe-stream.js +1 -2
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +31 -0
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.js +74 -0
- package/dist/server/bare/rag-hyperdb/handlers/ingest.js +1 -1
- package/dist/server/bare/rag-hyperdb/handlers/search.js +1 -1
- package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +2 -1
- package/dist/server/bare/registry/config-registry.js +1 -1
- package/dist/server/bare/registry/registry-client.d.ts +5 -0
- package/dist/server/bare/registry/registry-client.js +37 -0
- package/dist/server/env.d.ts +22 -0
- package/dist/server/env.js +57 -0
- package/dist/server/plugins/index.d.ts +2 -0
- package/dist/server/plugins/index.js +1 -0
- package/dist/server/plugins/registry.d.ts +9 -0
- package/dist/server/plugins/registry.js +75 -0
- package/dist/server/rpc/delegate-transport.d.ts +11 -0
- package/dist/server/rpc/delegate-transport.js +60 -0
- package/dist/server/rpc/handle-request.d.ts +0 -9
- package/dist/server/rpc/handle-request.js +13 -321
- package/dist/server/rpc/handler-registry.d.ts +3 -0
- package/dist/server/rpc/handler-registry.js +84 -0
- package/dist/server/rpc/handler-utils.d.ts +22 -0
- package/dist/server/rpc/handler-utils.js +87 -0
- package/dist/server/rpc/handlers/cancelHandler.js +1 -1
- package/dist/server/rpc/handlers/completion-stream-delegated.js +1 -1
- package/dist/server/rpc/handlers/completion-stream.js +2 -43
- package/dist/server/rpc/handlers/delete-cache.js +1 -1
- package/dist/server/rpc/handlers/embed.js +2 -21
- package/dist/server/rpc/handlers/get-model-info.js +19 -15
- package/dist/server/rpc/handlers/index.d.ts +9 -0
- package/dist/server/rpc/handlers/index.js +9 -0
- package/dist/server/rpc/handlers/load-model/download-manager.d.ts +1 -0
- package/dist/server/rpc/handlers/load-model/download-manager.js +3 -0
- package/dist/server/rpc/handlers/load-model/handler.js +47 -24
- package/dist/server/rpc/handlers/load-model/http.js +3 -2
- package/dist/server/rpc/handlers/load-model/hyperdrive.js +14 -10
- package/dist/server/rpc/handlers/load-model/registry.d.ts +10 -0
- package/dist/server/rpc/handlers/load-model/registry.js +571 -0
- package/dist/server/rpc/handlers/load-model/resolve.js +18 -5
- package/dist/server/rpc/handlers/load-model-delegated.js +4 -2
- package/dist/server/rpc/handlers/ocr-stream.js +2 -37
- package/dist/server/rpc/handlers/ping.d.ts +3 -0
- package/dist/server/rpc/handlers/ping.js +3 -0
- package/dist/server/rpc/handlers/plugin-dispatch.d.ts +15 -0
- package/dist/server/rpc/handlers/plugin-dispatch.js +54 -0
- package/dist/server/rpc/handlers/plugin-invoke.d.ts +4 -0
- package/dist/server/rpc/handlers/plugin-invoke.js +87 -0
- package/dist/server/rpc/handlers/registry.d.ts +5 -0
- package/dist/server/rpc/handlers/registry.js +157 -0
- package/dist/server/rpc/handlers/text-to-speech.js +2 -5
- package/dist/server/rpc/handlers/transcribe-stream.js +2 -30
- package/dist/server/rpc/handlers/translate.js +2 -42
- package/dist/server/rpc/handlers/unload-model.js +1 -1
- package/dist/server/rpc/index.d.ts +1 -1
- package/dist/server/utils/archive.d.ts +1 -0
- package/dist/server/utils/archive.js +10 -2
- package/dist/server/utils/cache.d.ts +5 -0
- package/dist/server/utils/cache.js +26 -2
- package/dist/server/utils/gguf-tensor-extractor.js +3 -3
- package/dist/server/utils/index.d.ts +1 -1
- package/dist/server/utils/index.js +1 -1
- package/dist/server/utils/path-security.d.ts +12 -0
- package/dist/server/utils/path-security.js +25 -0
- package/dist/server/utils/shard-utils.js +3 -3
- package/dist/server/worker-core.d.ts +6 -0
- package/dist/server/worker-core.js +88 -0
- package/dist/server/worker.d.ts +4 -5
- package/dist/server/worker.js +18 -116
- package/dist/utils/errors-client.d.ts +9 -6
- package/dist/utils/errors-client.js +19 -11
- package/dist/utils/errors-server.d.ts +44 -5
- package/dist/utils/errors-server.js +82 -9
- package/dist/utils/path-sanitize.d.ts +17 -0
- package/dist/utils/path-sanitize.js +54 -0
- package/expo/plugins/patches/android-link.mjs +63 -0
- package/expo/plugins/patches/ios-link.mjs +63 -0
- package/package.json +72 -10
- package/dist/examples/text-to-speech.d.ts +0 -3
- package/dist/examples/text-to-speech.js +0 -137
- package/dist/models/hyperdrive/models.d.ts +0 -4003
- package/dist/models/hyperdrive/models.js +0 -4282
- package/dist/server/bare/addons/index.d.ts +0 -4
- package/dist/server/bare/addons/index.js +0 -3
- package/dist/server/bare/addons/llamacpp-completion/create-model.d.ts +0 -8
- package/dist/server/bare/addons/llamacpp-completion/create-model.js +0 -43
- package/dist/server/bare/addons/llamacpp-completion/index.d.ts +0 -4
- package/dist/server/bare/addons/llamacpp-completion/index.js +0 -3
- package/dist/server/bare/addons/llamacpp-embedding/create-model.d.ts +0 -8
- package/dist/server/bare/addons/llamacpp-embedding/create-model.js +0 -38
- package/dist/server/bare/addons/llamacpp-embedding/index.d.ts +0 -3
- package/dist/server/bare/addons/llamacpp-embedding/index.js +0 -2
- package/dist/server/bare/addons/nmtcpp-translation/create-model.d.ts +0 -8
- package/dist/server/bare/addons/nmtcpp-translation/create-model.js +0 -52
- package/dist/server/bare/addons/nmtcpp-translation/index.d.ts +0 -3
- package/dist/server/bare/addons/nmtcpp-translation/index.js +0 -2
- package/dist/server/bare/addons/onnx-ocr/create-model.d.ts +0 -10
- package/dist/server/bare/addons/onnx-ocr/index.d.ts +0 -3
- package/dist/server/bare/addons/onnx-ocr/index.js +0 -2
- package/dist/server/bare/addons/onnx-tts/create-model.d.ts +0 -10
- package/dist/server/bare/addons/onnx-tts/create-model.js +0 -25
- package/dist/server/bare/addons/onnx-tts/index.d.ts +0 -3
- package/dist/server/bare/addons/onnx-tts/index.js +0 -2
- package/dist/server/bare/addons/whispercpp-transcription/create-model.d.ts +0 -10
- package/dist/server/bare/addons/whispercpp-transcription/create-model.js +0 -37
- package/dist/server/bare/addons/whispercpp-transcription/handlers/transcribe-stream.d.ts +0 -3
- package/dist/server/bare/addons/whispercpp-transcription/index.d.ts +0 -3
- package/dist/server/bare/addons/whispercpp-transcription/index.js +0 -2
- /package/dist/models/{hyperdrive → registry}/index.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/cancel.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/cancel.js +0 -0
- /package/dist/server/bare/{addons/llamacpp-completion → ops}/kv-cache-utils.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/load-model.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/unload-model.d.ts +0 -0
- /package/dist/server/bare/{addons → ops}/unload-model.js +0 -0
- /package/dist/server/bare/{addons/llamacpp-completion → plugins/llamacpp-completion/ops}/cache-logger.d.ts +0 -0
- /package/dist/server/bare/{addons/onnx-ocr/handlers → plugins/onnx-ocr/ops}/ocr-stream.d.ts +0 -0
- /package/dist/server/bare/{addons/onnx-tts/handlers → plugins/onnx-tts/ops}/text-to-speech.d.ts +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { QVACModelEntry } from "@qvac/registry-client";
|
|
2
|
+
import type { ProcessedModel } from "./types";
|
|
3
|
+
export declare function toHexString(value: Buffer | string | {
|
|
4
|
+
data: number[];
|
|
5
|
+
} | undefined): string;
|
|
6
|
+
export declare function extractModelName(registryPath: string): string;
|
|
7
|
+
export declare function processRegistryModel(model: QVACModelEntry): ProcessedModel | null;
|
|
8
|
+
//# sourceMappingURL=processing.d.ts.map
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { getAddonFromEngine, resolveCanonicalEngine, } from "../../schemas/engine-addon-map";
|
|
2
|
+
import { detectShardedModel } from "./shards.js";
|
|
3
|
+
export function toHexString(value) {
|
|
4
|
+
if (!value)
|
|
5
|
+
return "";
|
|
6
|
+
if (Buffer.isBuffer(value))
|
|
7
|
+
return value.toString("hex");
|
|
8
|
+
if (typeof value === "string")
|
|
9
|
+
return value;
|
|
10
|
+
if (typeof value === "object" && "data" in value) {
|
|
11
|
+
return Buffer.from(value.data).toString("hex");
|
|
12
|
+
}
|
|
13
|
+
return "";
|
|
14
|
+
}
|
|
15
|
+
export function extractModelName(registryPath) {
|
|
16
|
+
const parts = registryPath.split("/");
|
|
17
|
+
if (parts.length >= 2) {
|
|
18
|
+
return parts[1] || parts[0] || "";
|
|
19
|
+
}
|
|
20
|
+
return (registryPath
|
|
21
|
+
.split("/")
|
|
22
|
+
.pop()
|
|
23
|
+
?.replace(/\.\w+$/, "") || "");
|
|
24
|
+
}
|
|
25
|
+
export function processRegistryModel(model) {
|
|
26
|
+
const engine = resolveCanonicalEngine(model.engine);
|
|
27
|
+
if (!engine) {
|
|
28
|
+
console.warn(`⚠️ Skipping model with unknown engine "${model.engine}": ${model.path}`);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const filename = model.path.split("/").pop() || model.path;
|
|
32
|
+
const blobBinding = model.blobBinding;
|
|
33
|
+
const blobCoreKey = toHexString(blobBinding?.coreKey);
|
|
34
|
+
const blobBlockOffset = blobBinding?.blockOffset ?? 0;
|
|
35
|
+
const blobBlockLength = blobBinding?.blockLength ?? 0;
|
|
36
|
+
const blobByteOffset = blobBinding?.byteOffset ?? 0;
|
|
37
|
+
const expectedSize = blobBinding?.byteLength ?? 0;
|
|
38
|
+
// The sha256 lives on blobBinding at runtime (per the hyperschema),
|
|
39
|
+
// even though the TS types define it on QVACModelEntry. Try blobBinding first.
|
|
40
|
+
const sha256Checksum = blobBinding?.["sha256"] ||
|
|
41
|
+
model.sha256 ||
|
|
42
|
+
"";
|
|
43
|
+
const addon = getAddonFromEngine(engine);
|
|
44
|
+
const result = {
|
|
45
|
+
registryPath: model.path,
|
|
46
|
+
registrySource: model.source,
|
|
47
|
+
blobCoreKey,
|
|
48
|
+
blobBlockOffset,
|
|
49
|
+
blobBlockLength,
|
|
50
|
+
blobByteOffset,
|
|
51
|
+
modelId: filename,
|
|
52
|
+
addon,
|
|
53
|
+
expectedSize,
|
|
54
|
+
sha256Checksum,
|
|
55
|
+
engine,
|
|
56
|
+
modelName: extractModelName(model.path),
|
|
57
|
+
quantization: model.quantization || "",
|
|
58
|
+
params: model.params || "",
|
|
59
|
+
tags: model.tags || [],
|
|
60
|
+
};
|
|
61
|
+
const shardDetection = detectShardedModel(filename);
|
|
62
|
+
if (shardDetection.isSharded) {
|
|
63
|
+
result.isShardPart = true;
|
|
64
|
+
result.shardInfo = shardDetection;
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CollectOptions, ProcessedModel } from "./types";
|
|
2
|
+
export { processRegistryModel, extractModelName, toHexString, } from "./processing";
|
|
3
|
+
export declare function collectModels(options?: CollectOptions): Promise<ProcessedModel[]>;
|
|
4
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { QVACRegistryClient } from "@qvac/registry-client";
|
|
2
|
+
import { groupShardedModels } from "./shards.js";
|
|
3
|
+
import { processRegistryModel } from "./processing.js";
|
|
4
|
+
import { DEFAULT_REGISTRY_CORE_KEY } from "../../constants/index.js";
|
|
5
|
+
// Re-export for backward compat
|
|
6
|
+
export { processRegistryModel, extractModelName, toHexString, } from "./processing.js";
|
|
7
|
+
export async function collectModels(options = {}) {
|
|
8
|
+
const { showDuplicates = false, noDedup = false } = options;
|
|
9
|
+
const models = [];
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
11
|
+
const registryCoreKey = process.env["QVAC_REGISTRY_CORE_KEY"] ?? DEFAULT_REGISTRY_CORE_KEY;
|
|
12
|
+
const client = new QVACRegistryClient({ registryCoreKey });
|
|
13
|
+
try {
|
|
14
|
+
await client.ready();
|
|
15
|
+
const registryModels = await client.findModels({});
|
|
16
|
+
console.log(`📦 Found ${registryModels.length} entries in registry`);
|
|
17
|
+
for (const registryModel of registryModels) {
|
|
18
|
+
const processed = processRegistryModel(registryModel);
|
|
19
|
+
if (processed)
|
|
20
|
+
models.push(processed);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
await client.close();
|
|
25
|
+
}
|
|
26
|
+
const groupedModels = groupShardedModels(models);
|
|
27
|
+
if (noDedup) {
|
|
28
|
+
console.log(`\n⏭️ Skipping deduplication (--no-dedup flag set)`);
|
|
29
|
+
return groupedModels;
|
|
30
|
+
}
|
|
31
|
+
return deduplicateModels(groupedModels, showDuplicates);
|
|
32
|
+
}
|
|
33
|
+
function deduplicateModels(models, showDuplicates) {
|
|
34
|
+
const seenChecksums = new Map();
|
|
35
|
+
const dedupedModels = [];
|
|
36
|
+
const skipped = [];
|
|
37
|
+
for (const model of models) {
|
|
38
|
+
if (!model.sha256Checksum || model.sha256Checksum === "") {
|
|
39
|
+
dedupedModels.push(model);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (seenChecksums.has(model.sha256Checksum)) {
|
|
43
|
+
skipped.push({
|
|
44
|
+
name: model.registryPath,
|
|
45
|
+
checksum: model.sha256Checksum,
|
|
46
|
+
reason: `Duplicate of ${seenChecksums.get(model.sha256Checksum)}`,
|
|
47
|
+
});
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
seenChecksums.set(model.sha256Checksum, model.registryPath);
|
|
51
|
+
dedupedModels.push(model);
|
|
52
|
+
}
|
|
53
|
+
if (skipped.length > 0) {
|
|
54
|
+
console.log(`\n🧹 Removed ${skipped.length} duplicate model(s)`);
|
|
55
|
+
if (showDuplicates) {
|
|
56
|
+
skipped.forEach(({ name, checksum, reason }) => {
|
|
57
|
+
console.log(` - ${name}`);
|
|
58
|
+
console.log(` Checksum: ${checksum}`);
|
|
59
|
+
console.log(` ${reason}`);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log(` Use --show-duplicates to see details`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return dedupedModels;
|
|
67
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export function detectShardedModel(filename) {
|
|
2
|
+
const shardPattern = /^(.+)-(\d{5})-of-(\d{5})(\.\w+)$/;
|
|
3
|
+
const match = filename.match(shardPattern);
|
|
4
|
+
if (match) {
|
|
5
|
+
return {
|
|
6
|
+
isSharded: true,
|
|
7
|
+
baseFilename: match[1],
|
|
8
|
+
currentShard: parseInt(match[2], 10),
|
|
9
|
+
totalShards: parseInt(match[3], 10),
|
|
10
|
+
extension: match[4],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
return { isSharded: false };
|
|
14
|
+
}
|
|
15
|
+
export function groupShardedModels(models) {
|
|
16
|
+
const shardGroups = new Map();
|
|
17
|
+
const nonShardedModels = [];
|
|
18
|
+
for (const model of models) {
|
|
19
|
+
if (model.isShardPart && model.shardInfo) {
|
|
20
|
+
const baseKey = `${model.registrySource}:${model.shardInfo.baseFilename}`;
|
|
21
|
+
if (!shardGroups.has(baseKey)) {
|
|
22
|
+
shardGroups.set(baseKey, []);
|
|
23
|
+
}
|
|
24
|
+
shardGroups.get(baseKey).push(model);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
nonShardedModels.push(model);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const processedShards = [];
|
|
31
|
+
for (const [baseKey, shards] of shardGroups) {
|
|
32
|
+
shards.sort((a, b) => (a.shardInfo?.currentShard ?? 0) - (b.shardInfo?.currentShard ?? 0));
|
|
33
|
+
const firstShard = shards[0];
|
|
34
|
+
const totalExpectedShards = firstShard.shardInfo?.totalShards ?? 0;
|
|
35
|
+
if (shards.length !== totalExpectedShards) {
|
|
36
|
+
console.warn(`⚠️ Expected ${totalExpectedShards} shards but found ${shards.length} for ${baseKey}`);
|
|
37
|
+
}
|
|
38
|
+
const totalSize = shards.reduce((sum, s) => sum + s.expectedSize, 0);
|
|
39
|
+
const shardMetadata = shards.map((s) => ({
|
|
40
|
+
filename: s.modelId,
|
|
41
|
+
expectedSize: s.expectedSize,
|
|
42
|
+
sha256Checksum: s.sha256Checksum,
|
|
43
|
+
blobCoreKey: s.blobCoreKey,
|
|
44
|
+
blobBlockOffset: s.blobBlockOffset,
|
|
45
|
+
blobBlockLength: s.blobBlockLength,
|
|
46
|
+
blobByteOffset: s.blobByteOffset,
|
|
47
|
+
}));
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
49
|
+
const { isShardPart: _shard, shardInfo: _info, ...rest } = firstShard;
|
|
50
|
+
processedShards.push({
|
|
51
|
+
...rest,
|
|
52
|
+
expectedSize: totalSize,
|
|
53
|
+
shardMetadata,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return [...nonShardedModels, ...processedShards];
|
|
57
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ModelRegistryEntryAddon, ModelRegistryEngine } from "../../schemas/registry";
|
|
2
|
+
export interface ShardInfo {
|
|
3
|
+
isSharded: true;
|
|
4
|
+
baseFilename: string;
|
|
5
|
+
currentShard: number;
|
|
6
|
+
totalShards: number;
|
|
7
|
+
extension: string;
|
|
8
|
+
}
|
|
9
|
+
export interface NotSharded {
|
|
10
|
+
isSharded: false;
|
|
11
|
+
}
|
|
12
|
+
export type ShardDetection = ShardInfo | NotSharded;
|
|
13
|
+
export interface ShardMetadataEntry {
|
|
14
|
+
filename: string;
|
|
15
|
+
expectedSize: number;
|
|
16
|
+
sha256Checksum: string;
|
|
17
|
+
blobCoreKey: string;
|
|
18
|
+
blobBlockOffset: number;
|
|
19
|
+
blobBlockLength: number;
|
|
20
|
+
blobByteOffset: number;
|
|
21
|
+
}
|
|
22
|
+
export interface ProcessedModel {
|
|
23
|
+
registryPath: string;
|
|
24
|
+
registrySource: string;
|
|
25
|
+
blobCoreKey: string;
|
|
26
|
+
blobBlockOffset: number;
|
|
27
|
+
blobBlockLength: number;
|
|
28
|
+
blobByteOffset: number;
|
|
29
|
+
modelId: string;
|
|
30
|
+
addon: ModelRegistryEntryAddon;
|
|
31
|
+
expectedSize: number;
|
|
32
|
+
sha256Checksum: string;
|
|
33
|
+
engine: ModelRegistryEngine;
|
|
34
|
+
modelName: string;
|
|
35
|
+
quantization: string;
|
|
36
|
+
params: string;
|
|
37
|
+
tags: string[];
|
|
38
|
+
isShardPart?: boolean;
|
|
39
|
+
shardInfo?: ShardInfo;
|
|
40
|
+
shardMetadata?: ShardMetadataEntry[];
|
|
41
|
+
name?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface CurrentModel {
|
|
44
|
+
name: string;
|
|
45
|
+
registryPath: string;
|
|
46
|
+
}
|
|
47
|
+
export interface CollectOptions {
|
|
48
|
+
showDuplicates?: boolean;
|
|
49
|
+
noDedup?: boolean;
|
|
50
|
+
}
|
|
51
|
+
export interface ExportNameInput {
|
|
52
|
+
path: string;
|
|
53
|
+
engine: ModelRegistryEngine;
|
|
54
|
+
name: string;
|
|
55
|
+
quantization: string;
|
|
56
|
+
params: string;
|
|
57
|
+
tags: string[];
|
|
58
|
+
usedNames: Set<string>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
export function formatSize(bytes) {
|
|
3
|
+
if (bytes < 1024)
|
|
4
|
+
return `${bytes}B`;
|
|
5
|
+
if (bytes < 1024 * 1024)
|
|
6
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
7
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
8
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
9
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;
|
|
10
|
+
}
|
|
11
|
+
export function getCommitHash(short = false) {
|
|
12
|
+
try {
|
|
13
|
+
const cmd = short ? "git rev-parse --short HEAD" : "git rev-parse HEAD";
|
|
14
|
+
return execSync(cmd, { encoding: "utf-8" }).trim();
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
throw new Error("Git is required to generate history file", {
|
|
18
|
+
cause: error,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QVAC Pear Pre-Hook
|
|
3
|
+
*
|
|
4
|
+
* Invoked by Pear before `pear run` or `pear stage` to:
|
|
5
|
+
* 1. Generate `qvac/worker.pear.entry.mjs` with selected plugins
|
|
6
|
+
* 2. Persist `pear.stage.entrypoints` to package.json for routing
|
|
7
|
+
*
|
|
8
|
+
* @example package.json configuration
|
|
9
|
+
* ```json
|
|
10
|
+
* {
|
|
11
|
+
* "pear": {
|
|
12
|
+
* "pre": ["@qvac/sdk/pear-pre"]
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=pre.d.ts.map
|