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