@qvac/sdk 0.4.1 → 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 +365 -200
- 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/completion-stream.d.ts +15 -5
- package/dist/client/api/completion-stream.js +50 -14
- package/dist/client/api/embed.d.ts +17 -3
- package/dist/client/api/embed.js +0 -8
- 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 -2
- package/dist/client/api/index.js +2 -2
- package/dist/client/api/load-model.d.ts +37 -11
- package/dist/client/api/load-model.js +34 -117
- package/dist/client/api/logging-stream.d.ts +6 -3
- package/dist/client/api/logging-stream.js +6 -3
- 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 +6 -3
- package/dist/client/config-loader/config-utils.d.ts +5 -0
- package/dist/client/config-loader/config-utils.js +20 -0
- package/dist/client/config-loader/resolve-config.bare.d.ts +9 -0
- package/dist/client/config-loader/resolve-config.bare.js +87 -0
- package/dist/client/config-loader/resolve-config.expo.d.ts +11 -0
- package/dist/client/config-loader/resolve-config.expo.js +62 -0
- package/dist/client/config-loader/resolve-config.node.d.ts +9 -0
- package/dist/client/config-loader/resolve-config.node.js +118 -0
- package/dist/client/init-hooks.d.ts +18 -3
- package/dist/client/init-hooks.js +57 -29
- package/dist/client/logging-stream-registry.d.ts +1 -1
- package/dist/client/logging-stream-registry.js +14 -13
- package/dist/client/rpc/bare-client.d.ts +3 -184
- package/dist/client/rpc/bare-client.js +67 -8
- package/dist/client/rpc/expo-rpc-client.d.ts +2 -2
- package/dist/client/rpc/expo-rpc-client.js +70 -12
- package/dist/client/rpc/node-rpc-client.d.ts +1 -1
- package/dist/client/rpc/node-rpc-client.js +14 -7
- package/dist/client/rpc/rpc-client.d.ts +1 -1
- package/dist/client/rpc/rpc-client.js +13 -58
- 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/config-reload.d.ts +2 -0
- package/dist/examples/config-reload.js +49 -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 +22 -21
- package/dist/examples/embed-hyperdrive.js +39 -3
- package/dist/examples/kv-cache-cleanup.js +1 -1
- package/dist/examples/kv-cache-custom-key.js +16 -1
- package/dist/examples/kv-cache-example.js +1 -1
- package/dist/examples/llamacpp-hyperdrive.js +1 -1
- package/dist/examples/llamacpp-sharded.js +13 -4
- package/dist/examples/logging-file-transport.d.ts +2 -0
- package/dist/examples/{llamacpp-file-logging.js → logging-file-transport.js} +3 -7
- package/dist/examples/logging-streaming.d.ts +2 -0
- package/dist/examples/logging-streaming.js +75 -0
- package/dist/examples/mcp-websearch.d.ts +13 -0
- package/dist/examples/mcp-websearch.js +176 -0
- 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 +5 -4
- package/dist/index.js +4 -2
- package/dist/logging/addon.d.ts +6 -0
- package/dist/logging/addon.js +75 -0
- package/dist/logging/base-logger.js +26 -16
- package/dist/logging/client-logger.d.ts +3 -0
- package/dist/logging/client-logger.js +24 -0
- package/dist/logging/index.d.ts +7 -1
- package/dist/logging/index.js +7 -1
- package/dist/logging/logger.d.ts +0 -2
- package/dist/logging/logger.js +11 -6
- package/dist/logging/namespaces.d.ts +12 -0
- package/dist/logging/namespaces.js +12 -0
- package/dist/logging/registry.d.ts +31 -0
- package/dist/logging/registry.js +48 -0
- package/dist/logging/server-logger.d.ts +3 -0
- package/dist/logging/server-logger.js +16 -0
- package/dist/logging/stream-logger.d.ts +1 -1
- package/dist/logging/stream-logger.js +6 -3
- package/dist/logging/transport.js +2 -2
- package/dist/logging/types.d.ts +2 -0
- package/dist/logging/utils.d.ts +2 -0
- package/dist/logging/utils.js +62 -0
- package/dist/models/hyperdrive/models.d.ts +1886 -230
- package/dist/models/hyperdrive/models.js +2191 -443
- 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 +660 -92
- package/dist/schemas/common.js +6 -4
- 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/embed.d.ts +3 -3
- package/dist/schemas/embed.js +9 -2
- 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 +9 -1
- package/dist/schemas/index.js +12 -1
- package/dist/schemas/json-schema.d.ts +16 -0
- package/dist/schemas/json-schema.js +2 -0
- package/dist/schemas/llamacpp-config.d.ts +117 -12
- package/dist/schemas/llamacpp-config.js +46 -12
- package/dist/schemas/load-model.d.ts +3669 -481
- package/dist/schemas/load-model.js +95 -34
- package/dist/schemas/logging-stream.d.ts +11 -4
- package/dist/schemas/logging-stream.js +4 -3
- package/dist/schemas/mcp-adapter.d.ts +47 -0
- package/dist/schemas/mcp-adapter.js +1 -0
- package/dist/schemas/model-src-utils.d.ts +38 -14
- package/dist/schemas/model-src-utils.js +4 -3
- 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 +356 -0
- package/dist/schemas/reload-config.js +44 -0
- package/dist/schemas/runtime-context.d.ts +19 -0
- package/dist/schemas/runtime-context.js +7 -0
- package/dist/schemas/sdk-config.d.ts +717 -0
- package/dist/schemas/sdk-config.js +131 -0
- package/dist/schemas/sdk-errors-client.d.ts +5 -0
- package/dist/schemas/sdk-errors-client.js +25 -0
- package/dist/schemas/sdk-errors-server.d.ts +17 -0
- package/dist/schemas/sdk-errors-server.js +85 -0
- package/dist/schemas/shard.d.ts +21 -0
- package/dist/schemas/shard.js +17 -0
- package/dist/schemas/tools.d.ts +3 -0
- package/dist/schemas/translate.d.ts +68 -23
- package/dist/schemas/translate.js +37 -11
- package/dist/schemas/translation-config.d.ts +337 -13
- package/dist/schemas/translation-config.js +65 -9
- package/dist/schemas/whispercpp-config.d.ts +9 -1
- package/dist/schemas/whispercpp-config.js +2 -1
- 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 +6 -20
- 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 +49 -14
- 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/handlers/embed.d.ts +12 -0
- package/dist/server/bare/addons/{llamacpp → llamacpp-embedding}/handlers/embed.js +18 -4
- 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 +38 -28
- 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/unload-model.js +6 -3
- package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/create-model.js +2 -1
- package/dist/server/bare/addons/whispercpp-transcription/handlers/transcribe-stream.js +82 -0
- package/dist/server/bare/delegate-rpc-client.js +31 -11
- package/dist/server/bare/hyperswarm.js +7 -5
- 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.d.ts +13 -4
- package/dist/server/bare/registry/config-registry.js +53 -10
- package/dist/server/bare/registry/logging-stream-registry.d.ts +24 -7
- package/dist/server/bare/registry/logging-stream-registry.js +99 -20
- 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 -26
- package/dist/server/bare/registry/model-registry.js +9 -6
- 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/create-server.js +5 -3
- package/dist/server/rpc/handle-request.js +115 -19
- package/dist/server/rpc/handlers/cancelHandler.js +13 -2
- package/dist/server/rpc/handlers/completion-stream-delegated.js +4 -2
- package/dist/server/rpc/handlers/completion-stream.js +1 -1
- package/dist/server/rpc/handlers/delete-cache.js +4 -2
- package/dist/server/rpc/handlers/download-asset.js +3 -1
- package/dist/server/rpc/handlers/embed.js +4 -2
- 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 -2
- package/dist/server/rpc/handlers/index.js +2 -2
- package/dist/server/rpc/handlers/load-model/download-manager.d.ts +11 -11
- package/dist/server/rpc/handlers/load-model/download-manager.js +40 -28
- 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 +361 -50
- package/dist/server/rpc/handlers/load-model/hyperdrive.js +26 -22
- 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 +39 -8
- package/dist/server/rpc/handlers/load-model-delegated.d.ts +2 -2
- package/dist/server/rpc/handlers/load-model-delegated.js +15 -10
- package/dist/server/rpc/handlers/logging-stream.js +4 -4
- 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/provideHandler/connection.js +12 -10
- package/dist/server/rpc/handlers/provideHandler/handler.js +18 -16
- package/dist/server/rpc/handlers/provideHandler/proxy.js +8 -6
- package/dist/server/rpc/handlers/rag.d.ts +2 -2
- package/dist/server/rpc/handlers/rag.js +107 -41
- package/dist/server/rpc/handlers/stopProvideHandler.js +3 -1
- package/dist/server/rpc/handlers/text-to-speech.js +1 -1
- package/dist/server/rpc/handlers/transcribe-stream.js +4 -2
- package/dist/server/rpc/handlers/translate.js +9 -16
- package/dist/server/rpc/handlers/unload-model.js +4 -2
- package/dist/server/utils/archive.d.ts +3 -0
- package/dist/server/utils/archive.js +171 -0
- package/dist/server/utils/audio/decoder.d.ts +2 -1
- package/dist/server/utils/audio/decoder.js +48 -11
- package/dist/server/utils/cache.d.ts +5 -5
- package/dist/server/utils/cache.js +13 -11
- package/dist/server/utils/config-transform.d.ts +3 -0
- package/dist/server/utils/config-transform.js +23 -0
- 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 +4 -1
- package/dist/server/utils/index.js +4 -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 +49 -19
- package/dist/utils/errors-base.d.ts +1 -1
- package/dist/utils/errors-base.js +2 -2
- package/dist/utils/errors-client.d.ts +24 -0
- package/dist/utils/errors-client.js +40 -0
- package/dist/utils/errors-server.d.ts +42 -0
- package/dist/utils/errors-server.js +71 -0
- package/dist/utils/mcp-adapter.d.ts +12 -0
- package/dist/utils/mcp-adapter.js +103 -0
- package/dist/utils/object.d.ts +2 -0
- package/dist/utils/object.js +3 -0
- package/dist/utils/tool-helpers.d.ts +10 -2
- package/dist/utils/tool-helpers.js +24 -11
- package/package.json +74 -36
- package/dist/client/api/set-config.d.ts +0 -7
- package/dist/client/api/set-config.js +0 -20
- package/dist/client/config-manager.d.ts +0 -4
- package/dist/client/config-manager.js +0 -8
- package/dist/client/rpc/bare-rpc-client.d.ts +0 -4
- package/dist/client/rpc/bare-rpc-client.js +0 -91
- package/dist/examples/llamacpp-file-logging.d.ts +0 -2
- 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/schemas/set-config.d.ts +0 -21
- package/dist/schemas/set-config.js +0 -14
- package/dist/server/bare/addons/llamacpp/handlers/embed.d.ts +0 -4
- 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/addons/whispercpp/handlers/transcribe-stream.js +0 -63
- package/dist/server/bare/rag-hyperdb/rag-manager.d.ts +0 -5
- package/dist/server/bare/rag-hyperdb/rag-manager.js +0 -64
- package/dist/server/rpc/handlers/load-model.js +0 -59
- package/dist/server/rpc/handlers/set-config.d.ts +0 -3
- package/dist/server/rpc/handlers/set-config.js +0 -18
- package/dist/server/utils/hash.d.ts +0 -5
- package/dist/server/utils/hash.js +0 -11
- /package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/handlers/completion-stream.d.ts +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}/index.d.ts +0 -0
- /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/index.js +0 -0
|
@@ -1,9 +1,43 @@
|
|
|
1
|
-
import { saveEmbeddings, search, deleteEmbeddings, } from "../../bare/rag-hyperdb/index.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { chunk, ingest, reindex, saveEmbeddings, search, deleteEmbeddings, listWorkspaces, closeWorkspace, deleteWorkspace, DEFAULT_WORKSPACE, registerRagOperation, unregisterRagOperation, } from "../../bare/rag-hyperdb/index.js";
|
|
2
|
+
function createHandlerOptions(operation, workspace, onProgress) {
|
|
3
|
+
const signal = registerRagOperation(workspace, operation);
|
|
4
|
+
const options = { signal };
|
|
5
|
+
if (onProgress) {
|
|
6
|
+
options.onProgress = (stage, current, total) => onProgress({
|
|
7
|
+
type: "rag:progress",
|
|
8
|
+
operation,
|
|
9
|
+
workspace,
|
|
10
|
+
stage,
|
|
11
|
+
current,
|
|
12
|
+
total,
|
|
13
|
+
timestamp: Date.now(),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return options;
|
|
17
|
+
}
|
|
18
|
+
function omitOnProgress(obj) {
|
|
19
|
+
const { onProgress, withProgress, ...rest } = obj;
|
|
20
|
+
void onProgress;
|
|
21
|
+
void withProgress;
|
|
22
|
+
return rest;
|
|
23
|
+
}
|
|
24
|
+
export async function handleRag(request, onProgress) {
|
|
25
|
+
switch (request.operation) {
|
|
26
|
+
case "chunk": {
|
|
27
|
+
const chunks = await chunk(request);
|
|
28
|
+
return {
|
|
29
|
+
type: "rag",
|
|
30
|
+
operation: request.operation,
|
|
31
|
+
success: true,
|
|
32
|
+
chunks,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
case "ingest": {
|
|
36
|
+
const workspace = request.workspace ?? DEFAULT_WORKSPACE;
|
|
37
|
+
const handlerOptions = createHandlerOptions("ingest", workspace, onProgress);
|
|
38
|
+
const params = omitOnProgress(request);
|
|
39
|
+
try {
|
|
40
|
+
const result = await ingest(params, handlerOptions);
|
|
7
41
|
return {
|
|
8
42
|
type: "rag",
|
|
9
43
|
operation: request.operation,
|
|
@@ -12,53 +46,85 @@ export async function handleRag(request) {
|
|
|
12
46
|
droppedIndices: result.droppedIndices,
|
|
13
47
|
};
|
|
14
48
|
}
|
|
15
|
-
|
|
16
|
-
|
|
49
|
+
finally {
|
|
50
|
+
unregisterRagOperation(workspace);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
case "saveEmbeddings": {
|
|
54
|
+
const workspace = request.workspace ?? DEFAULT_WORKSPACE;
|
|
55
|
+
const handlerOptions = createHandlerOptions("saveEmbeddings", workspace, onProgress);
|
|
56
|
+
const params = omitOnProgress(request);
|
|
57
|
+
try {
|
|
58
|
+
const processed = await saveEmbeddings(params, handlerOptions);
|
|
17
59
|
return {
|
|
18
60
|
type: "rag",
|
|
19
61
|
operation: request.operation,
|
|
20
62
|
success: true,
|
|
21
|
-
|
|
63
|
+
processed,
|
|
22
64
|
};
|
|
23
65
|
}
|
|
24
|
-
|
|
25
|
-
|
|
66
|
+
finally {
|
|
67
|
+
unregisterRagOperation(workspace);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
case "search": {
|
|
71
|
+
const results = await search(request);
|
|
72
|
+
return {
|
|
73
|
+
type: "rag",
|
|
74
|
+
operation: request.operation,
|
|
75
|
+
success: true,
|
|
76
|
+
results,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
case "deleteEmbeddings": {
|
|
80
|
+
await deleteEmbeddings(request);
|
|
81
|
+
return {
|
|
82
|
+
type: "rag",
|
|
83
|
+
operation: request.operation,
|
|
84
|
+
success: true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
case "reindex": {
|
|
88
|
+
const workspace = request.workspace ?? DEFAULT_WORKSPACE;
|
|
89
|
+
const handlerOptions = createHandlerOptions("reindex", workspace, onProgress);
|
|
90
|
+
const params = omitOnProgress(request);
|
|
91
|
+
try {
|
|
92
|
+
const result = await reindex(params, handlerOptions);
|
|
26
93
|
return {
|
|
27
94
|
type: "rag",
|
|
28
95
|
operation: request.operation,
|
|
29
|
-
success,
|
|
96
|
+
success: true,
|
|
97
|
+
result,
|
|
30
98
|
};
|
|
31
99
|
}
|
|
100
|
+
finally {
|
|
101
|
+
unregisterRagOperation(workspace);
|
|
102
|
+
}
|
|
32
103
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
...baseError,
|
|
58
|
-
operation: request.operation,
|
|
59
|
-
};
|
|
60
|
-
default:
|
|
61
|
-
throw error;
|
|
104
|
+
case "listWorkspaces": {
|
|
105
|
+
const workspaces = listWorkspaces();
|
|
106
|
+
return {
|
|
107
|
+
type: "rag",
|
|
108
|
+
operation: request.operation,
|
|
109
|
+
success: true,
|
|
110
|
+
workspaces,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
case "closeWorkspace": {
|
|
114
|
+
await closeWorkspace(request);
|
|
115
|
+
return {
|
|
116
|
+
type: "rag",
|
|
117
|
+
operation: request.operation,
|
|
118
|
+
success: true,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
case "deleteWorkspace": {
|
|
122
|
+
await deleteWorkspace(request);
|
|
123
|
+
return {
|
|
124
|
+
type: "rag",
|
|
125
|
+
operation: request.operation,
|
|
126
|
+
success: true,
|
|
127
|
+
};
|
|
62
128
|
}
|
|
63
129
|
}
|
|
64
130
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { getSwarm, unregisterProviderTopic } from "../../bare/hyperswarm.js";
|
|
2
|
+
import { getServerLogger } from "../../../logging/index.js";
|
|
3
|
+
const logger = getServerLogger();
|
|
2
4
|
export function stopProvideHandler(request) {
|
|
3
5
|
const swarm = getSwarm();
|
|
4
6
|
try {
|
|
@@ -12,7 +14,7 @@ export function stopProvideHandler(request) {
|
|
|
12
14
|
};
|
|
13
15
|
}
|
|
14
16
|
catch (error) {
|
|
15
|
-
|
|
17
|
+
logger.error("❌ Error in stop provide handler:", error);
|
|
16
18
|
return {
|
|
17
19
|
type: "stopProvide",
|
|
18
20
|
success: false,
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { transcribeStream } from "../../bare/addons/whispercpp/index.js";
|
|
1
|
+
import { transcribeStream } from "../../bare/addons/whispercpp-transcription/index.js";
|
|
2
|
+
import { getServerLogger } from "../../../logging/index.js";
|
|
3
|
+
const logger = getServerLogger();
|
|
2
4
|
export async function* handleTranscribeStream(request) {
|
|
3
5
|
const { modelId, audioChunk, prompt } = request;
|
|
4
6
|
try {
|
|
@@ -20,7 +22,7 @@ export async function* handleTranscribeStream(request) {
|
|
|
20
22
|
};
|
|
21
23
|
}
|
|
22
24
|
catch (error) {
|
|
23
|
-
|
|
25
|
+
logger.error("Error during transcription:", error);
|
|
24
26
|
yield {
|
|
25
27
|
type: "transcribeStream",
|
|
26
28
|
text: "",
|
|
@@ -1,19 +1,12 @@
|
|
|
1
|
-
import { translate } from "../../bare/addons/translation/index.js";
|
|
1
|
+
import { translate } from "../../bare/addons/nmtcpp-translation/index.js";
|
|
2
|
+
import { getServerLogger } from "../../../logging/index.js";
|
|
3
|
+
const logger = getServerLogger();
|
|
2
4
|
export async function* handleTranslate(request) {
|
|
3
|
-
const { modelId, text, stream, modelType } = request;
|
|
4
|
-
const from = request.modelType === "llm" ? request.from : undefined;
|
|
5
|
-
const to = request.modelType === "llm" ? request.to : undefined;
|
|
6
|
-
const context = request.modelType === "llm" ? request.context : undefined;
|
|
7
5
|
try {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
to: to,
|
|
13
|
-
stream,
|
|
14
|
-
modelType,
|
|
15
|
-
context,
|
|
16
|
-
});
|
|
6
|
+
// Remove the 'type' field from request and pass the rest to translate
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8
|
+
const { type, ...translateParams } = request;
|
|
9
|
+
const generator = translate(translateParams);
|
|
17
10
|
let stats;
|
|
18
11
|
let done = false;
|
|
19
12
|
let buffer = "";
|
|
@@ -25,7 +18,7 @@ export async function* handleTranslate(request) {
|
|
|
25
18
|
}
|
|
26
19
|
else {
|
|
27
20
|
buffer += result.value;
|
|
28
|
-
if (stream) {
|
|
21
|
+
if (translateParams.stream) {
|
|
29
22
|
yield {
|
|
30
23
|
type: "translate",
|
|
31
24
|
token: result.value,
|
|
@@ -41,7 +34,7 @@ export async function* handleTranslate(request) {
|
|
|
41
34
|
};
|
|
42
35
|
}
|
|
43
36
|
catch (error) {
|
|
44
|
-
|
|
37
|
+
logger.error("Error during translation:", error);
|
|
45
38
|
yield {
|
|
46
39
|
type: "translate",
|
|
47
40
|
token: "",
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { unloadModel } from "../../bare/addons/index.js";
|
|
2
2
|
import { getRegistryStats } from "../../bare/registry/model-registry.js";
|
|
3
3
|
import { hasActiveProviders } from "../../bare/hyperswarm.js";
|
|
4
|
+
import { getServerLogger } from "../../../logging/index.js";
|
|
5
|
+
const logger = getServerLogger();
|
|
4
6
|
export async function handleUnloadModel(request) {
|
|
5
7
|
const { modelId, clearStorage } = request;
|
|
6
8
|
try {
|
|
7
|
-
|
|
9
|
+
logger.debug("Unloading model", modelId);
|
|
8
10
|
await unloadModel({ modelId, clearStorage });
|
|
9
11
|
const stats = getRegistryStats();
|
|
10
12
|
const modelsActive = stats.totalModels > 0;
|
|
@@ -17,7 +19,7 @@ export async function handleUnloadModel(request) {
|
|
|
17
19
|
};
|
|
18
20
|
}
|
|
19
21
|
catch (error) {
|
|
20
|
-
|
|
22
|
+
logger.error("Error during model unload:", error);
|
|
21
23
|
return {
|
|
22
24
|
type: "unloadModel",
|
|
23
25
|
success: false,
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { promises as fsPromises } from "bare-fs";
|
|
2
|
+
import path from "bare-path";
|
|
3
|
+
import fs from "bare-fs";
|
|
4
|
+
import { createGunzip } from "bare-zlib";
|
|
5
|
+
import tarStream from "tar-stream";
|
|
6
|
+
import { detectShardedModel, generateShardFilenames, extractTensorsFromShards, validateShardedModelCache, } from "./shard-utils.js";
|
|
7
|
+
import { ModelLoadFailedError, ArchiveExtractionFailedError, ArchiveUnsupportedTypeError, ArchiveMissingShardsError, DownloadCancelledError, } from "../../utils/errors-server.js";
|
|
8
|
+
import { getServerLogger } from "../../logging/index.js";
|
|
9
|
+
import { SUPPORTED_ARCHIVE_EXTENSIONS, filenameToArchiveTypeSchema, } from "../../schemas/archive.js";
|
|
10
|
+
const logger = getServerLogger();
|
|
11
|
+
// Gzip magic bytes: 1f 8b 08
|
|
12
|
+
const GZIP_MAGIC_0 = 0x1f;
|
|
13
|
+
const GZIP_MAGIC_1 = 0x8b;
|
|
14
|
+
const GZIP_MAGIC_2 = 0x08;
|
|
15
|
+
export function isArchiveUrl(url) {
|
|
16
|
+
const filename = url.split("/").pop()?.split("?")[0]?.toLowerCase() || "";
|
|
17
|
+
return SUPPORTED_ARCHIVE_EXTENSIONS.some((ext) => filename.endsWith(ext));
|
|
18
|
+
}
|
|
19
|
+
// Whitelist of model file extensions to extract from archives
|
|
20
|
+
const ALLOWED_MODEL_EXTENSIONS = [".gguf", ".tensors.txt"];
|
|
21
|
+
function isModelFile(entryName) {
|
|
22
|
+
const basename = path.basename(entryName);
|
|
23
|
+
// Skip resource forks (._filename)
|
|
24
|
+
if (basename.startsWith("._")) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return ALLOWED_MODEL_EXTENSIONS.some((ext) => basename.toLowerCase().endsWith(ext));
|
|
28
|
+
}
|
|
29
|
+
async function isGzip(archivePath) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const stream = fs.createReadStream(archivePath, { start: 0, end: 2 });
|
|
32
|
+
const chunks = [];
|
|
33
|
+
stream.on("data", (chunk) => {
|
|
34
|
+
chunks.push(chunk);
|
|
35
|
+
});
|
|
36
|
+
stream.on("end", () => {
|
|
37
|
+
stream.destroy();
|
|
38
|
+
const buffer = Buffer.concat(chunks);
|
|
39
|
+
// Check for gzip magic bytes
|
|
40
|
+
const isGzipped = buffer[0] === GZIP_MAGIC_0 &&
|
|
41
|
+
buffer[1] === GZIP_MAGIC_1 &&
|
|
42
|
+
buffer[2] === GZIP_MAGIC_2;
|
|
43
|
+
resolve(isGzipped);
|
|
44
|
+
});
|
|
45
|
+
stream.on("error", reject);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async function extractArchive(archivePath, extractDir, signal) {
|
|
49
|
+
const parseResult = filenameToArchiveTypeSchema.safeParse(archivePath);
|
|
50
|
+
const extensionType = parseResult.success ? parseResult.data : null;
|
|
51
|
+
if (!extensionType) {
|
|
52
|
+
throw new ArchiveUnsupportedTypeError(archivePath);
|
|
53
|
+
}
|
|
54
|
+
if (signal?.aborted) {
|
|
55
|
+
throw new DownloadCancelledError();
|
|
56
|
+
}
|
|
57
|
+
// Detect actual format from magic bytes (extension might be wrong)
|
|
58
|
+
const isGzipped = await isGzip(archivePath);
|
|
59
|
+
const actualType = isGzipped ? "tar.gz" : "tar";
|
|
60
|
+
if (actualType !== extensionType) {
|
|
61
|
+
logger.warn(`⚠️ Archive extension suggests ${extensionType} but content is ${actualType}`);
|
|
62
|
+
}
|
|
63
|
+
await fsPromises.mkdir(extractDir, { recursive: true });
|
|
64
|
+
await extractTarStream(archivePath, extractDir, isGzipped, signal);
|
|
65
|
+
}
|
|
66
|
+
async function extractTarStream(archivePath, extractDir, useGunzip, signal) {
|
|
67
|
+
const extract = tarStream.extract();
|
|
68
|
+
const gunzip = useGunzip ? createGunzip() : null;
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
let aborted = false;
|
|
71
|
+
let readStream = null;
|
|
72
|
+
const cleanup = () => {
|
|
73
|
+
aborted = true;
|
|
74
|
+
readStream?.destroy();
|
|
75
|
+
gunzip?.destroy();
|
|
76
|
+
extract.destroy();
|
|
77
|
+
};
|
|
78
|
+
if (signal) {
|
|
79
|
+
signal.addEventListener("abort", () => {
|
|
80
|
+
cleanup();
|
|
81
|
+
reject(new DownloadCancelledError());
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
extract.on("entry", (header, stream, next) => {
|
|
85
|
+
if (aborted) {
|
|
86
|
+
stream.resume();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (!isModelFile(header.name)) {
|
|
90
|
+
stream.resume();
|
|
91
|
+
next();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const filePath = path.join(extractDir, header.name);
|
|
95
|
+
if (header.type === "file") {
|
|
96
|
+
const dir = path.dirname(filePath);
|
|
97
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
98
|
+
const writeStream = fs.createWriteStream(filePath);
|
|
99
|
+
stream.pipe(writeStream);
|
|
100
|
+
writeStream.on("finish", next);
|
|
101
|
+
writeStream.on("error", reject);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
stream.on("end", next);
|
|
105
|
+
stream.resume();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
extract.on("finish", resolve);
|
|
109
|
+
extract.on("error", reject);
|
|
110
|
+
if (gunzip) {
|
|
111
|
+
gunzip.on("error", reject);
|
|
112
|
+
}
|
|
113
|
+
readStream = fs.createReadStream(archivePath);
|
|
114
|
+
if (gunzip) {
|
|
115
|
+
readStream.pipe(gunzip).pipe(extract);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
readStream.pipe(extract);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
export async function extractAndValidateShardedArchive(archivePath, extractDir, signal) {
|
|
123
|
+
// Check if shards already extracted
|
|
124
|
+
try {
|
|
125
|
+
const existingFiles = await fsPromises.readdir(extractDir);
|
|
126
|
+
const existingShard = existingFiles.find((f) => detectShardedModel(String(f)).isSharded);
|
|
127
|
+
if (existingShard) {
|
|
128
|
+
const isComplete = await validateShardedModelCache(extractDir, String(existingShard));
|
|
129
|
+
if (isComplete) {
|
|
130
|
+
logger.info(`✅ Archive already extracted: ${extractDir}`);
|
|
131
|
+
const shardFilenames = generateShardFilenames(String(existingShard));
|
|
132
|
+
return path.join(extractDir, shardFilenames[0]);
|
|
133
|
+
}
|
|
134
|
+
logger.warn(`⚠️ Incomplete extraction found, re-extracting archive`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Directory doesn't exist, proceed with extraction
|
|
139
|
+
}
|
|
140
|
+
logger.info(`Extracting archive: ${path.basename(archivePath)}`);
|
|
141
|
+
try {
|
|
142
|
+
await extractArchive(archivePath, extractDir, signal);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw new ArchiveExtractionFailedError(archivePath, error);
|
|
146
|
+
}
|
|
147
|
+
const files = await fsPromises.readdir(extractDir);
|
|
148
|
+
const shardedFile = files.find((f) => detectShardedModel(String(f)).isSharded);
|
|
149
|
+
if (!shardedFile) {
|
|
150
|
+
throw new ModelLoadFailedError(`No sharded model files found in archive. Expected pattern: *-00001-of-0000X.*`);
|
|
151
|
+
}
|
|
152
|
+
const shardedFileName = String(shardedFile);
|
|
153
|
+
const shardInfo = detectShardedModel(shardedFileName);
|
|
154
|
+
if (!shardInfo.baseFilename) {
|
|
155
|
+
throw new ModelLoadFailedError(`Could not extract base filename from sharded model: ${shardedFileName}`);
|
|
156
|
+
}
|
|
157
|
+
const shardFilenames = generateShardFilenames(shardedFileName);
|
|
158
|
+
for (const shardFilename of shardFilenames) {
|
|
159
|
+
const filePath = path.join(extractDir, shardFilename);
|
|
160
|
+
try {
|
|
161
|
+
await fsPromises.access(filePath);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
throw new ArchiveMissingShardsError(shardFilename);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Generate tensors.txt if it doesn't exist
|
|
168
|
+
await extractTensorsFromShards(extractDir, shardedFileName);
|
|
169
|
+
logger.info(`Archive extracted to ${extractDir} successfully: ${files.length} files`);
|
|
170
|
+
return path.join(extractDir, shardFilenames[0]);
|
|
171
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Readable } from "bare-stream";
|
|
2
|
+
import { type AudioFormat } from "../../../schemas/index";
|
|
2
3
|
export declare function needsDecoding(filePath: string): boolean;
|
|
3
|
-
export declare function decodeAudioToStream(inputPath: string): Promise<Readable>;
|
|
4
|
+
export declare function decodeAudioToStream(inputPath: string, audioFormat?: AudioFormat): Promise<Readable>;
|
|
4
5
|
//# sourceMappingURL=decoder.d.ts.map
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import fs from "bare-fs";
|
|
2
2
|
import path from "bare-path";
|
|
3
|
-
import
|
|
3
|
+
import { FFmpegDecoder } from "@qvac/decoder-audio";
|
|
4
4
|
import { FORMATS_NEEDING_DECODE } from "@qvac/decoder-audio/constants.js";
|
|
5
5
|
import { Readable } from "bare-stream";
|
|
6
|
+
import { getServerLogger } from "../../../logging/index.js";
|
|
7
|
+
import {} from "../../../schemas/index.js";
|
|
8
|
+
const logger = getServerLogger();
|
|
6
9
|
export function needsDecoding(filePath) {
|
|
7
10
|
const ext = path.extname(filePath).toLowerCase();
|
|
8
11
|
return FORMATS_NEEDING_DECODE.includes(ext);
|
|
9
12
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
const DECODER_TIMEOUT_MS = 10000;
|
|
14
|
+
export async function decodeAudioToStream(inputPath, audioFormat = "s16le") {
|
|
15
|
+
const decoder = new FFmpegDecoder({
|
|
16
|
+
config: { audioFormat },
|
|
17
|
+
logger,
|
|
15
18
|
});
|
|
16
19
|
try {
|
|
17
20
|
await decoder.load();
|
|
@@ -20,22 +23,56 @@ export async function decodeAudioToStream(inputPath) {
|
|
|
20
23
|
const outputStream = new Readable({
|
|
21
24
|
read() { },
|
|
22
25
|
});
|
|
26
|
+
let hasReceivedData = false;
|
|
27
|
+
let hasEnded = false;
|
|
28
|
+
// Fallback timeout in case the decoder hangs without emitting any events
|
|
29
|
+
const timeoutId = setTimeout(() => {
|
|
30
|
+
if (!hasEnded) {
|
|
31
|
+
hasEnded = true;
|
|
32
|
+
const timeoutError = new Error(`Audio decoding timed out after ${DECODER_TIMEOUT_MS}ms for file: ${inputPath}`);
|
|
33
|
+
outputStream.destroy(timeoutError);
|
|
34
|
+
}
|
|
35
|
+
}, DECODER_TIMEOUT_MS);
|
|
23
36
|
response
|
|
24
37
|
.onUpdate((output) => {
|
|
38
|
+
hasReceivedData = true;
|
|
25
39
|
const bytes = new Uint8Array(output.outputArray);
|
|
26
40
|
outputStream.push(Buffer.from(bytes));
|
|
27
41
|
})
|
|
28
42
|
.onFinish(() => {
|
|
29
|
-
|
|
43
|
+
if (!hasEnded) {
|
|
44
|
+
hasEnded = true;
|
|
45
|
+
clearTimeout(timeoutId);
|
|
46
|
+
setImmediate(() => void decoder.unload());
|
|
47
|
+
if (!hasReceivedData) {
|
|
48
|
+
outputStream.destroy(new Error(`No audio data decoded from file: ${inputPath}`));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
outputStream.push(null);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
30
54
|
})
|
|
31
|
-
.
|
|
32
|
-
|
|
33
|
-
|
|
55
|
+
.onError((error) => {
|
|
56
|
+
if (!hasEnded) {
|
|
57
|
+
hasEnded = true;
|
|
58
|
+
clearTimeout(timeoutId);
|
|
59
|
+
setImmediate(() => void decoder.unload());
|
|
60
|
+
outputStream.destroy(error);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
response.await().catch((error) => {
|
|
64
|
+
if (!hasEnded) {
|
|
65
|
+
hasEnded = true;
|
|
66
|
+
clearTimeout(timeoutId);
|
|
67
|
+
setImmediate(() => void decoder.unload());
|
|
68
|
+
outputStream.destroy(error instanceof Error ? error : new Error(String(error)));
|
|
69
|
+
}
|
|
34
70
|
});
|
|
35
71
|
return outputStream;
|
|
36
72
|
}
|
|
37
73
|
catch (error) {
|
|
38
|
-
|
|
74
|
+
await decoder.unload();
|
|
75
|
+
logger.error("Decoding failed:", error instanceof Error ? error.message : String(error));
|
|
39
76
|
throw error;
|
|
40
77
|
}
|
|
41
78
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare
|
|
3
|
-
export declare
|
|
4
|
-
export declare
|
|
1
|
+
import type { ShardFileMetadata } from "../../schemas/index";
|
|
2
|
+
export declare function getCacheDir(subDir: string): string;
|
|
3
|
+
export declare function getModelsCacheDir(): string;
|
|
4
|
+
export declare function getKVCacheDir(): string;
|
|
5
5
|
/**
|
|
6
6
|
* Get cache directory for sharded model
|
|
7
7
|
* Returns: cache/sharded/<hyperdriveKey>/
|
|
@@ -16,5 +16,5 @@ export declare function getShardPath(hyperdriveKey: string, shardFilename: strin
|
|
|
16
16
|
* Check if all shards exist and are valid (size + checksum check)
|
|
17
17
|
* Returns array of missing/invalid shard indices (0-based)
|
|
18
18
|
*/
|
|
19
|
-
export declare function checkShardCompleteness(hyperdriveKey: string, shardFilenames: readonly string[], shardMetadata: readonly
|
|
19
|
+
export declare function checkShardCompleteness(hyperdriveKey: string, shardFilenames: readonly string[], shardMetadata: readonly ShardFileMetadata[]): Promise<number[]>;
|
|
20
20
|
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -3,30 +3,32 @@ import path from "bare-path";
|
|
|
3
3
|
import { getEnv } from "../worker.js";
|
|
4
4
|
import { getConfiguredCacheDir } from "../bare/registry/config-registry.js";
|
|
5
5
|
import { calculateFileChecksum } from "./checksum.js";
|
|
6
|
-
|
|
6
|
+
import { getServerLogger } from "../../logging/index.js";
|
|
7
|
+
const logger = getServerLogger();
|
|
8
|
+
export function getCacheDir(subDir) {
|
|
7
9
|
const homeDir = getEnv().HOME_DIR;
|
|
8
10
|
const cacheDir = path.join(homeDir, ".qvac", subDir);
|
|
9
11
|
try {
|
|
10
12
|
fs.mkdirSync(cacheDir, { recursive: true });
|
|
11
13
|
}
|
|
12
14
|
catch (error) {
|
|
13
|
-
|
|
15
|
+
logger.error(`Error creating cache directory (${subDir}):`, error instanceof Error ? error.message : String(error));
|
|
14
16
|
}
|
|
15
17
|
return cacheDir;
|
|
16
|
-
}
|
|
17
|
-
export
|
|
18
|
+
}
|
|
19
|
+
export function getModelsCacheDir() {
|
|
18
20
|
const configuredDir = getConfiguredCacheDir();
|
|
19
21
|
try {
|
|
20
22
|
fs.mkdirSync(configuredDir, { recursive: true });
|
|
21
23
|
}
|
|
22
24
|
catch (error) {
|
|
23
|
-
|
|
25
|
+
logger.error(`Error creating models cache directory:`, error instanceof Error ? error.message : String(error));
|
|
24
26
|
}
|
|
25
27
|
return configuredDir;
|
|
26
|
-
}
|
|
27
|
-
export
|
|
28
|
+
}
|
|
29
|
+
export function getKVCacheDir() {
|
|
28
30
|
return getCacheDir("kv-cache");
|
|
29
|
-
}
|
|
31
|
+
}
|
|
30
32
|
/**
|
|
31
33
|
* Get cache directory for sharded model
|
|
32
34
|
* Returns: cache/sharded/<hyperdriveKey>/
|
|
@@ -38,7 +40,7 @@ export function getShardedModelCacheDir(hyperdriveKey) {
|
|
|
38
40
|
fs.mkdirSync(shardDir, { recursive: true });
|
|
39
41
|
}
|
|
40
42
|
catch (error) {
|
|
41
|
-
|
|
43
|
+
logger.error(`Error creating sharded model cache directory:`, error instanceof Error ? error.message : String(error));
|
|
42
44
|
}
|
|
43
45
|
return shardDir;
|
|
44
46
|
}
|
|
@@ -66,14 +68,14 @@ export async function checkShardCompleteness(hyperdriveKey, shardFilenames, shar
|
|
|
66
68
|
try {
|
|
67
69
|
const stats = await fsPromises.stat(shardPath);
|
|
68
70
|
if (stats.size !== fileMeta.expectedSize) {
|
|
69
|
-
|
|
71
|
+
logger.warn(`File ${i + 1} size mismatch: expected ${fileMeta.expectedSize}, got ${stats.size}`);
|
|
70
72
|
invalidIndices.push(i);
|
|
71
73
|
continue;
|
|
72
74
|
}
|
|
73
75
|
if (fileMeta.sha256Checksum) {
|
|
74
76
|
const actualChecksum = await calculateFileChecksum(shardPath);
|
|
75
77
|
if (actualChecksum !== fileMeta.sha256Checksum) {
|
|
76
|
-
|
|
78
|
+
logger.warn(`File ${i + 1} checksum mismatch for ${fileMeta.filename}. Expected: ${fileMeta.sha256Checksum}. Actual: ${actualChecksum}. Will re-download.`);
|
|
77
79
|
invalidIndices.push(i);
|
|
78
80
|
}
|
|
79
81
|
}
|