@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,20 +1,43 @@
|
|
|
1
|
+
import { normalizeModelType } from "../../schemas/index.js";
|
|
2
|
+
import os from "bare-os";
|
|
1
3
|
import { handlers } from "../../server/rpc/handlers/index.js";
|
|
2
4
|
import { RPCNoHandlerError, RPCRequestNotSentError, } from "../../utils/errors-client.js";
|
|
5
|
+
import { initializeConfig } from "../init-hooks.js";
|
|
6
|
+
import { setSDKConfig } from "../../server/bare/registry/config-registry.js";
|
|
7
|
+
import { setRuntimeContext } from "../../server/bare/registry/runtime-context-registry.js";
|
|
8
|
+
import { resolveModelConfig } from "../../server/bare/registry/model-config-registry.js";
|
|
9
|
+
import { resolveConfig } from "../config-loader/resolve-config.bare.js";
|
|
3
10
|
// Get the handler for a request type
|
|
4
|
-
|
|
11
|
+
function getHandler(type) {
|
|
5
12
|
const handler = handlers[type];
|
|
6
13
|
return typeof handler === "function" ? handler : undefined;
|
|
7
|
-
}
|
|
8
|
-
|
|
14
|
+
}
|
|
15
|
+
function applyDeviceDefaultsToLoadModel(request) {
|
|
16
|
+
if (request.type !== "loadModel" || !("modelSrc" in request)) {
|
|
17
|
+
return request;
|
|
18
|
+
}
|
|
19
|
+
let canonicalType;
|
|
20
|
+
try {
|
|
21
|
+
canonicalType = normalizeModelType(request.modelType);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return request;
|
|
25
|
+
}
|
|
26
|
+
const rawConfig = request.modelConfig ?? {};
|
|
27
|
+
const configWithDefaults = resolveModelConfig(canonicalType, rawConfig);
|
|
28
|
+
return { ...request, modelConfig: configWithDefaults };
|
|
29
|
+
}
|
|
30
|
+
async function send(request) {
|
|
9
31
|
if (request.type === "ping") {
|
|
10
32
|
return { type: "pong", number: Math.random() * 100 };
|
|
11
33
|
}
|
|
12
34
|
const handler = getHandler(request.type);
|
|
13
35
|
if (!handler)
|
|
14
36
|
throw new RPCNoHandlerError(request.type);
|
|
15
|
-
|
|
37
|
+
const processedRequest = applyDeviceDefaultsToLoadModel(request);
|
|
38
|
+
return (await handler(processedRequest));
|
|
16
39
|
}
|
|
17
|
-
|
|
40
|
+
async function* stream(request) {
|
|
18
41
|
const handler = getHandler(request.type);
|
|
19
42
|
if (!handler)
|
|
20
43
|
throw new RPCNoHandlerError(request.type);
|
|
@@ -22,11 +45,12 @@ export async function* stream(request) {
|
|
|
22
45
|
if (request.type === "loadModel" &&
|
|
23
46
|
"withProgress" in request &&
|
|
24
47
|
request.withProgress) {
|
|
48
|
+
const processedRequest = applyDeviceDefaultsToLoadModel(request);
|
|
25
49
|
async function* streamWithProgress() {
|
|
26
50
|
const queue = [];
|
|
27
51
|
let done = false;
|
|
28
52
|
const loadModelHandler = handler;
|
|
29
|
-
loadModelHandler(
|
|
53
|
+
loadModelHandler(processedRequest, (update) => queue.push(update))
|
|
30
54
|
.then((final) => {
|
|
31
55
|
queue.push(final);
|
|
32
56
|
done = true;
|
|
@@ -97,6 +121,27 @@ const createMockRPCRequest = () => {
|
|
|
97
121
|
if (!requestData) {
|
|
98
122
|
throw new RPCRequestNotSentError();
|
|
99
123
|
}
|
|
124
|
+
// Handle special internal config initialization message
|
|
125
|
+
if (typeof requestData === "object" &&
|
|
126
|
+
"type" in requestData &&
|
|
127
|
+
requestData.type === "__init_config") {
|
|
128
|
+
try {
|
|
129
|
+
const initData = requestData;
|
|
130
|
+
if (initData.config) {
|
|
131
|
+
setSDKConfig(initData.config);
|
|
132
|
+
}
|
|
133
|
+
if (initData.runtimeContext) {
|
|
134
|
+
setRuntimeContext(initData.runtimeContext);
|
|
135
|
+
}
|
|
136
|
+
return Buffer.from(JSON.stringify({ success: true }));
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
return Buffer.from(JSON.stringify({
|
|
140
|
+
success: false,
|
|
141
|
+
error: error instanceof Error ? error.message : String(error),
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
100
145
|
const response = await send(requestData);
|
|
101
146
|
return Buffer.from(JSON.stringify(response));
|
|
102
147
|
},
|
|
@@ -110,10 +155,24 @@ const createMockRPCRequest = () => {
|
|
|
110
155
|
},
|
|
111
156
|
};
|
|
112
157
|
};
|
|
113
|
-
|
|
114
|
-
|
|
158
|
+
let configInitialized = false;
|
|
159
|
+
export async function getRPC() {
|
|
160
|
+
const mockRPC = {
|
|
115
161
|
request() {
|
|
116
162
|
return createMockRPCRequest();
|
|
117
163
|
},
|
|
118
164
|
};
|
|
165
|
+
// Initialize config once on first call
|
|
166
|
+
if (!configInitialized) {
|
|
167
|
+
const runtimeContext = {
|
|
168
|
+
runtime: "bare",
|
|
169
|
+
platform: os.platform(),
|
|
170
|
+
};
|
|
171
|
+
await initializeConfig(mockRPC, resolveConfig, runtimeContext);
|
|
172
|
+
configInitialized = true;
|
|
173
|
+
}
|
|
174
|
+
return mockRPC;
|
|
175
|
+
}
|
|
176
|
+
export function close() {
|
|
177
|
+
// noop
|
|
119
178
|
}
|
|
@@ -1,9 +1,54 @@
|
|
|
1
1
|
import RPC from "bare-rpc";
|
|
2
2
|
import { RPCConnectionFailedError } from "../../utils/errors-client.js";
|
|
3
|
+
import { initializeConfig } from "../init-hooks.js";
|
|
4
|
+
import { resolveConfig } from "../config-loader/resolve-config.expo.js";
|
|
5
|
+
import { getClientLogger } from "../../logging/index.js";
|
|
6
|
+
const logger = getClientLogger();
|
|
3
7
|
let rpcInstance = null;
|
|
4
8
|
let rpcPromise = null;
|
|
5
|
-
|
|
6
|
-
|
|
9
|
+
let workletInstance = null;
|
|
10
|
+
let workletInitialized = false;
|
|
11
|
+
let cachedRuntimeContext;
|
|
12
|
+
logger.debug("EXPO RPC Client bundle");
|
|
13
|
+
async function getRuntimeContext() {
|
|
14
|
+
if (cachedRuntimeContext) {
|
|
15
|
+
return cachedRuntimeContext;
|
|
16
|
+
}
|
|
17
|
+
// expo-device is optional - gracefully handle if not installed
|
|
18
|
+
let deviceModel;
|
|
19
|
+
let deviceBrand;
|
|
20
|
+
let platform;
|
|
21
|
+
try {
|
|
22
|
+
const expoModulesCore = await import("expo-modules-core");
|
|
23
|
+
// this looks odd, but is necessary to ensure that import can be used safely.
|
|
24
|
+
// It will crash the app if the module is not installed, but the node dependency is present.
|
|
25
|
+
const nativeDeviceModule = expoModulesCore.requireOptionalNativeModule("ExpoDevice");
|
|
26
|
+
if (nativeDeviceModule) {
|
|
27
|
+
const Device = await import("expo-device");
|
|
28
|
+
logger.info(`Device: ${Device.modelName} ${Device.brand} ${Device.osName}`);
|
|
29
|
+
const osName = Device?.osName?.toLowerCase();
|
|
30
|
+
if (osName?.includes("ios")) {
|
|
31
|
+
platform = "ios";
|
|
32
|
+
}
|
|
33
|
+
else if (osName?.includes("android")) {
|
|
34
|
+
platform = "android";
|
|
35
|
+
}
|
|
36
|
+
deviceModel = Device.modelName ?? undefined;
|
|
37
|
+
deviceBrand = Device.brand ?? undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
logger.debug("expo-device not available, device info will be omitted");
|
|
42
|
+
}
|
|
43
|
+
cachedRuntimeContext = {
|
|
44
|
+
runtime: "react-native",
|
|
45
|
+
platform,
|
|
46
|
+
deviceModel,
|
|
47
|
+
deviceBrand,
|
|
48
|
+
};
|
|
49
|
+
return cachedRuntimeContext;
|
|
50
|
+
}
|
|
51
|
+
export async function getRPC() {
|
|
7
52
|
if (rpcInstance) {
|
|
8
53
|
return rpcInstance;
|
|
9
54
|
}
|
|
@@ -11,10 +56,22 @@ export const getRPC = async () => {
|
|
|
11
56
|
return rpcPromise;
|
|
12
57
|
}
|
|
13
58
|
rpcPromise = (async () => {
|
|
59
|
+
if (workletInstance) {
|
|
60
|
+
logger.debug("🔄 Reusing existing worklet");
|
|
61
|
+
rpcInstance = new RPC(workletInstance.IPC, () => { });
|
|
62
|
+
// Only initialize once per worklet - server state persists
|
|
63
|
+
if (!workletInitialized) {
|
|
64
|
+
const runtimeContext = await getRuntimeContext();
|
|
65
|
+
await initializeConfig(rpcInstance, resolveConfig, runtimeContext);
|
|
66
|
+
workletInitialized = true;
|
|
67
|
+
}
|
|
68
|
+
return rpcInstance;
|
|
69
|
+
}
|
|
14
70
|
const { Paths } = await import("expo-file-system");
|
|
15
71
|
const bareKitModule = await import("react-native-bare-kit");
|
|
16
72
|
const worklet = new bareKitModule.Worklet();
|
|
17
|
-
|
|
73
|
+
workletInstance = worklet;
|
|
74
|
+
logger.debug("Starting new worklet");
|
|
18
75
|
// Load the mobile bundle - this will be generated by the Expo plugin
|
|
19
76
|
// using the user's installed bare library versions
|
|
20
77
|
let mobileBundle;
|
|
@@ -28,7 +85,7 @@ export const getRPC = async () => {
|
|
|
28
85
|
const message = "Failed to load mobile worker bundle. Make sure the QVAC Expo plugin is configured. " +
|
|
29
86
|
`Add '@qvac/sdk/expo-plugin' to your app.json plugins array. ` +
|
|
30
87
|
`Error: ${String(error)}`;
|
|
31
|
-
|
|
88
|
+
logger.error(message);
|
|
32
89
|
throw new RPCConnectionFailedError(message, error instanceof Error ? error : undefined);
|
|
33
90
|
}
|
|
34
91
|
worklet.start("worker.bundle", mobileBundle, [
|
|
@@ -39,27 +96,28 @@ export const getRPC = async () => {
|
|
|
39
96
|
HOME_DIR: Paths.document.uri.replace("file://", ""),
|
|
40
97
|
}),
|
|
41
98
|
]);
|
|
42
|
-
|
|
99
|
+
logger.info("Worklet started");
|
|
43
100
|
rpcInstance = new RPC(worklet.IPC, () => {
|
|
44
101
|
// Use this for async callbacks
|
|
45
102
|
});
|
|
46
|
-
const
|
|
47
|
-
await
|
|
103
|
+
const runtimeContext = await getRuntimeContext();
|
|
104
|
+
await initializeConfig(rpcInstance, resolveConfig, runtimeContext);
|
|
105
|
+
workletInitialized = true;
|
|
48
106
|
return rpcInstance;
|
|
49
107
|
})();
|
|
50
108
|
try {
|
|
51
109
|
return await rpcPromise;
|
|
52
110
|
}
|
|
53
111
|
catch (error) {
|
|
54
|
-
|
|
112
|
+
logger.error(`Failed to initialize RPC: ${String(error)}`);
|
|
55
113
|
throw error;
|
|
56
114
|
}
|
|
57
115
|
finally {
|
|
58
116
|
rpcPromise = null;
|
|
59
117
|
}
|
|
60
|
-
}
|
|
61
|
-
export
|
|
62
|
-
|
|
118
|
+
}
|
|
119
|
+
export function close() {
|
|
120
|
+
logger.info("🧹 Closing RPC client (Expo)");
|
|
63
121
|
rpcInstance = null;
|
|
64
122
|
rpcPromise = null;
|
|
65
|
-
}
|
|
123
|
+
}
|
|
@@ -5,6 +5,10 @@ import os from "node:os";
|
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { RPCRequestNotSentError } from "../../utils/errors-client.js";
|
|
8
|
+
import { initializeConfig } from "../init-hooks.js";
|
|
9
|
+
import { resolveConfig } from "../config-loader/resolve-config.node.js";
|
|
10
|
+
import { getClientLogger } from "../../logging/index.js";
|
|
11
|
+
const logger = getClientLogger();
|
|
8
12
|
const __filename = fileURLToPath(import.meta.url);
|
|
9
13
|
const __dirname = path.dirname(__filename);
|
|
10
14
|
let rpcInstance = null;
|
|
@@ -50,8 +54,11 @@ async function ensureRPC() {
|
|
|
50
54
|
});
|
|
51
55
|
});
|
|
52
56
|
const rpc = await rpcPromise;
|
|
53
|
-
const
|
|
54
|
-
|
|
57
|
+
const runtimeContext = {
|
|
58
|
+
runtime: "node",
|
|
59
|
+
platform: process.platform,
|
|
60
|
+
};
|
|
61
|
+
await initializeConfig(rpc, resolveConfig, runtimeContext);
|
|
55
62
|
return rpc;
|
|
56
63
|
}
|
|
57
64
|
const mockRPC = {
|
|
@@ -93,20 +100,20 @@ const mockRPC = {
|
|
|
93
100
|
export function getRPC() {
|
|
94
101
|
return mockRPC;
|
|
95
102
|
}
|
|
96
|
-
export
|
|
97
|
-
|
|
103
|
+
export function close() {
|
|
104
|
+
logger.info("🧹 Closing RPC client");
|
|
98
105
|
if (bareWorkerProc) {
|
|
99
|
-
|
|
106
|
+
logger.info("🐻🔫 Killing bare worker process");
|
|
100
107
|
bareWorkerProc.kill("SIGTERM");
|
|
101
108
|
bareWorkerProc = null;
|
|
102
109
|
}
|
|
103
110
|
if (ipcServer) {
|
|
104
|
-
|
|
111
|
+
logger.info("🔌 Closing IPC server");
|
|
105
112
|
ipcServer.close();
|
|
106
113
|
ipcServer = null;
|
|
107
114
|
}
|
|
108
115
|
rpcInstance = null;
|
|
109
116
|
rpcPromise = null;
|
|
110
|
-
}
|
|
117
|
+
}
|
|
111
118
|
// Register cleanup handlers for the parent process
|
|
112
119
|
process.once("exit", close);
|
|
@@ -2,5 +2,5 @@ import type RPC from "bare-rpc";
|
|
|
2
2
|
import { type Request, type Response, type RPCOptions } from "../../schemas/index";
|
|
3
3
|
export declare function send<T extends Request>(request: T, rpc?: RPC, options?: RPCOptions): Promise<Response>;
|
|
4
4
|
export declare function stream<T extends Request>(request: T, rpc?: RPC, options?: RPCOptions): AsyncGenerator<Response>;
|
|
5
|
-
export declare function close():
|
|
5
|
+
export declare function close(): void;
|
|
6
6
|
//# sourceMappingURL=rpc-client.d.ts.map
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { requestSchema, responseSchema, } from "../../schemas/index.js";
|
|
2
2
|
import { RPCError } from "./rpc-error.js";
|
|
3
3
|
import { withTimeout, withTimeoutStream } from "../../utils/withTimeout.js";
|
|
4
|
+
import { getClientLogger, summarizeRequest } from "../../logging/index.js";
|
|
5
|
+
import { getRPC, close as closeRPC } from "#rpc";
|
|
6
|
+
const logger = getClientLogger();
|
|
4
7
|
let rpcInstance = null;
|
|
5
8
|
let commandCounter = 0;
|
|
6
9
|
function getNextCommandId() {
|
|
@@ -12,66 +15,30 @@ function checkAndThrowError(response) {
|
|
|
12
15
|
throw new RPCError(response);
|
|
13
16
|
}
|
|
14
17
|
}
|
|
15
|
-
async function
|
|
18
|
+
async function getRPCInstance() {
|
|
16
19
|
if (rpcInstance)
|
|
17
20
|
return rpcInstance;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
// TODO we can use something like https://www.npmjs.com/package/which-runtime at some point
|
|
21
|
-
const isBare = typeof globalThis !== "undefined" && "Bare" in globalThis;
|
|
22
|
-
// TODO Lots of type unsafe hacks to make this work cross platform
|
|
23
|
-
if (isRN) {
|
|
24
|
-
console.log("React Native runtime detected");
|
|
25
|
-
// Only import expo client for React Native - Metro won't bundle the Node client
|
|
26
|
-
const expoRPCClientPath = "./expo-rpc-client";
|
|
27
|
-
const mod = (await import(expoRPCClientPath));
|
|
28
|
-
rpcInstance = await (typeof mod === "function" ? mod() : mod.getRPC());
|
|
29
|
-
return rpcInstance;
|
|
30
|
-
}
|
|
31
|
-
else if (isBare) {
|
|
32
|
-
console.log("Bare runtime detected");
|
|
33
|
-
// Use dynamic import for Bare client
|
|
34
|
-
const mod = await import("./bare-client.js");
|
|
35
|
-
rpcInstance = mod.getRPC();
|
|
36
|
-
return rpcInstance;
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
console.log("Node runtime detected");
|
|
40
|
-
// Use dynamic import for Node client to prevent Metro from bundling it
|
|
41
|
-
const mod = await import("./node-rpc-client.js");
|
|
42
|
-
rpcInstance = mod.getRPC();
|
|
43
|
-
return rpcInstance;
|
|
44
|
-
}
|
|
21
|
+
rpcInstance = await getRPC();
|
|
22
|
+
return rpcInstance;
|
|
45
23
|
}
|
|
46
24
|
export async function send(request, rpc, options) {
|
|
47
25
|
const parsedRequest = requestSchema.parse(request);
|
|
48
|
-
const rpcInstance = rpc || (await
|
|
26
|
+
const rpcInstance = rpc || (await getRPCInstance());
|
|
49
27
|
const req = rpcInstance.request(getNextCommandId());
|
|
50
|
-
|
|
51
|
-
// Log request type and basic info, avoid logging large payloads
|
|
52
|
-
if (request.type === "transcribeStream") {
|
|
53
|
-
console.log("RPC Client sending:", {
|
|
54
|
-
type: request.type,
|
|
55
|
-
modelId: request.modelId,
|
|
56
|
-
audioChunkType: request.audioChunk.type,
|
|
57
|
-
audioChunkSize: request.audioChunk.value.length,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
console.log("RPC Client sending:", request);
|
|
62
|
-
}
|
|
28
|
+
logger.debug("RPC Client sending:", summarizeRequest(request));
|
|
63
29
|
const payload = JSON.stringify(parsedRequest);
|
|
64
30
|
req.send(payload, "utf-8");
|
|
65
31
|
const response = await withTimeout(req.reply("utf-8"), options?.timeout);
|
|
66
32
|
const resPayload = responseSchema.parse(JSON.parse(response?.toString() || "{}"));
|
|
67
|
-
|
|
33
|
+
logger.debug("ResPayload", { type: resPayload.type });
|
|
68
34
|
checkAndThrowError(resPayload);
|
|
69
35
|
return resPayload;
|
|
70
36
|
}
|
|
71
37
|
export async function* stream(request, rpc, options = {}) {
|
|
72
38
|
const parsedRequest = requestSchema.parse(request);
|
|
73
|
-
const rpcInstance = rpc || (await
|
|
39
|
+
const rpcInstance = rpc || (await getRPCInstance());
|
|
74
40
|
const req = rpcInstance.request(getNextCommandId());
|
|
41
|
+
logger.debug("RPC Client streaming:", summarizeRequest(request));
|
|
75
42
|
req.send(JSON.stringify(parsedRequest), "utf-8");
|
|
76
43
|
const responseStream = req.createResponseStream({ encoding: "utf-8" });
|
|
77
44
|
let buffer = "";
|
|
@@ -95,21 +62,9 @@ export async function* stream(request, rpc, options = {}) {
|
|
|
95
62
|
}
|
|
96
63
|
}
|
|
97
64
|
}
|
|
98
|
-
export
|
|
65
|
+
export function close() {
|
|
99
66
|
if (!rpcInstance)
|
|
100
67
|
return;
|
|
101
|
-
|
|
102
|
-
const isBare = typeof globalThis !== "undefined" && "Bare" in globalThis;
|
|
103
|
-
if (isRN) {
|
|
104
|
-
const mod = (await import("./expo-rpc-client.js"));
|
|
105
|
-
mod.close();
|
|
106
|
-
}
|
|
107
|
-
else if (isBare) {
|
|
108
|
-
// Bare runs in-process (no separate worker), so no cleanup needed
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
const mod = (await import("./node-rpc-client.js"));
|
|
112
|
-
mod.close();
|
|
113
|
-
}
|
|
68
|
+
closeRPC();
|
|
114
69
|
rpcInstance = null;
|
|
115
70
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { WHISPER_TINY, loadModel, transcribe, unloadModel } from "../index";
|
|
2
|
+
// Parse command line arguments
|
|
3
|
+
const args = process.argv.slice(2);
|
|
4
|
+
if (!args[0]) {
|
|
5
|
+
console.error("Usage: bun run examples/config-reload.ts <audio-file-path>");
|
|
6
|
+
process.exit(1);
|
|
7
|
+
}
|
|
8
|
+
const audioFilePath = args[0];
|
|
9
|
+
try {
|
|
10
|
+
// Initial load with English language
|
|
11
|
+
console.log("Loading Whisper model with English config...");
|
|
12
|
+
const modelId = await loadModel({
|
|
13
|
+
modelSrc: WHISPER_TINY,
|
|
14
|
+
modelType: "whisper",
|
|
15
|
+
modelConfig: {
|
|
16
|
+
language: "en",
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
// Transcribe with English config
|
|
20
|
+
console.log("Transcribing audio with English config...");
|
|
21
|
+
const englishText = await transcribe({
|
|
22
|
+
modelId,
|
|
23
|
+
audioChunk: audioFilePath,
|
|
24
|
+
});
|
|
25
|
+
console.log(`Transcription (EN): ${englishText}`);
|
|
26
|
+
console.log();
|
|
27
|
+
// Hot reload config - change language and temperature
|
|
28
|
+
console.log("Hot reloading config (changing language and temperature)...");
|
|
29
|
+
const reloadedId = await loadModel({
|
|
30
|
+
modelId,
|
|
31
|
+
modelType: "whisper",
|
|
32
|
+
modelConfig: {
|
|
33
|
+
language: "es", // Change to Spanish
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
console.log(`Config reloaded, same model ID: ${reloadedId === modelId}`);
|
|
37
|
+
// Transcribe again with updated config
|
|
38
|
+
console.log("Transcribing with updated config...");
|
|
39
|
+
const spanishText = await transcribe({
|
|
40
|
+
modelId,
|
|
41
|
+
audioChunk: audioFilePath,
|
|
42
|
+
});
|
|
43
|
+
console.log(`Transcription (ES): ${spanishText}`);
|
|
44
|
+
await unloadModel({ modelId });
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error("❌ Error:", error);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Config Example
|
|
3
|
+
*
|
|
4
|
+
* This example demonstrates how to use a config file with the SDK.
|
|
5
|
+
*
|
|
6
|
+
* Supported config formats:
|
|
7
|
+
* - qvac.config.json (JSON)
|
|
8
|
+
* - qvac.config.js (JavaScript with default export)
|
|
9
|
+
* - qvac.config.ts (TypeScript with default export)
|
|
10
|
+
*
|
|
11
|
+
* Config resolution order:
|
|
12
|
+
* 1. QVAC_CONFIG_PATH environment variable (used here for demo purposes)
|
|
13
|
+
* 2. Config file in project root - auto-discovered, no env var needed
|
|
14
|
+
* 3. SDK defaults
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=default-config-usage.d.ts.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Config Example
|
|
3
|
+
*
|
|
4
|
+
* This example demonstrates how to use a config file with the SDK.
|
|
5
|
+
*
|
|
6
|
+
* Supported config formats:
|
|
7
|
+
* - qvac.config.json (JSON)
|
|
8
|
+
* - qvac.config.js (JavaScript with default export)
|
|
9
|
+
* - qvac.config.ts (TypeScript with default export)
|
|
10
|
+
*
|
|
11
|
+
* Config resolution order:
|
|
12
|
+
* 1. QVAC_CONFIG_PATH environment variable (used here for demo purposes)
|
|
13
|
+
* 2. Config file in project root - auto-discovered, no env var needed
|
|
14
|
+
* 3. SDK defaults
|
|
15
|
+
*/
|
|
16
|
+
// Note: This example uses .js file for the config
|
|
17
|
+
// However it could be .json or .ts as well, depending on your needs.
|
|
18
|
+
const configDir = import.meta.dirname ?? process.cwd();
|
|
19
|
+
process.env["QVAC_CONFIG_PATH"] =
|
|
20
|
+
`${configDir}/config/default/default.config.js`;
|
|
21
|
+
console.log(`🔍 Using config from: ${process.env["QVAC_CONFIG_PATH"]}`);
|
|
22
|
+
const { loadModel, unloadModel, completion, LLAMA_3_2_1B_INST_Q4_0 } = await import("@qvac/sdk");
|
|
23
|
+
try {
|
|
24
|
+
console.log("🚀 Loading model with configured settings...\n");
|
|
25
|
+
const modelId = await loadModel({
|
|
26
|
+
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
27
|
+
modelType: "llm",
|
|
28
|
+
});
|
|
29
|
+
console.log("\n💬 Running completion...\n");
|
|
30
|
+
const result = completion({
|
|
31
|
+
modelId,
|
|
32
|
+
history: [
|
|
33
|
+
{ role: "user", content: "Say 'Config works!' in exactly 3 words." },
|
|
34
|
+
],
|
|
35
|
+
stream: true,
|
|
36
|
+
});
|
|
37
|
+
for await (const token of result.tokenStream) {
|
|
38
|
+
process.stdout.write(token);
|
|
39
|
+
}
|
|
40
|
+
console.log("\n");
|
|
41
|
+
await unloadModel({ modelId });
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error("❌ Error:", error);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
@@ -32,6 +32,7 @@ try {
|
|
|
32
32
|
providerPublicKey,
|
|
33
33
|
timeout: 5_000, // Optional: 5 second timeout for delegated requests
|
|
34
34
|
fallbackToLocal: true, // Optional: Fall back to local inference if delegation fails
|
|
35
|
+
// forceNewConnection: true, // Optional: Force a new connection instead of reusing cached one
|
|
35
36
|
},
|
|
36
37
|
onProgress: (progress) => {
|
|
37
38
|
console.log(`📊 Download progress: ${progress.percentage.toFixed(1)}% (${progress.downloaded}/${progress.total} bytes)`);
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"0000000000000000000000000000000000000000000000000000000000000001",
|
|
9
|
-
"0000000000000000000000000000000000000000000000000000000000000002",
|
|
10
|
-
"0000000000000000000000000000000000000000000000000000000000000003",
|
|
11
|
-
];
|
|
1
|
+
// Set config path before importing SDK - the SDK loads config during initialization
|
|
2
|
+
// This example uses a config file that defines blind relay public keys for improved P2P connectivity
|
|
3
|
+
// Blind relays help establish connections through NAT/firewalls by acting as intermediaries
|
|
4
|
+
const configDir = import.meta.dirname ?? process.cwd();
|
|
5
|
+
process.env["QVAC_CONFIG_PATH"] =
|
|
6
|
+
`${configDir}/config/blind-relay/blind-relay.config.js`;
|
|
7
|
+
import { downloadAsset, close, LLAMA_3_2_1B_INST_Q4_0, loadModel, getModelInfo, unloadModel, } from "@qvac/sdk";
|
|
12
8
|
console.log(`🚀 Download with Blind Relays Example`);
|
|
13
9
|
console.log(`${"=".repeat(60)}\n`);
|
|
14
|
-
console.log(`⚠️ Using MOCK relay keys - replace with real relays!\n`);
|
|
15
10
|
try {
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
swarmRelays: MOCK_RELAY_PUBLIC_KEYS,
|
|
20
|
-
});
|
|
21
|
-
console.log(`✅ Configured ${MOCK_RELAY_PUBLIC_KEYS.length} blind relays`);
|
|
11
|
+
// Config is loaded from examples/config/qvac.config.json (set via QVAC_CONFIG_PATH above)
|
|
12
|
+
// The config contains swarmRelays - an array of Hyperswarm relay public keys
|
|
13
|
+
// These relays help with NAT traversal and firewall bypassing for P2P downloads
|
|
22
14
|
console.log(`📥 Starting model download from Hyperdrive...\n`);
|
|
23
15
|
const startTime = Date.now();
|
|
16
|
+
const modelId = await loadModel({
|
|
17
|
+
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
18
|
+
modelType: "llm",
|
|
19
|
+
});
|
|
20
|
+
console.log(`Model loaded with ID: ${modelId}`);
|
|
21
|
+
const firstStatus = await getModelInfo(LLAMA_3_2_1B_INST_Q4_0);
|
|
22
|
+
console.log(`First status: ${JSON.stringify(firstStatus)}`);
|
|
23
|
+
await unloadModel({ modelId });
|
|
24
24
|
// Download model with progress tracking
|
|
25
25
|
await downloadAsset({
|
|
26
26
|
assetSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
@@ -38,11 +38,12 @@ try {
|
|
|
38
38
|
});
|
|
39
39
|
console.log(`\n✅ Model downloaded successfully using blind relays!`);
|
|
40
40
|
console.log(`Blind relays helped establish peer connections through NAT/firewalls\n`);
|
|
41
|
-
|
|
41
|
+
close();
|
|
42
42
|
}
|
|
43
43
|
catch (error) {
|
|
44
44
|
console.error("❌ Error:", error);
|
|
45
|
-
console.log(`\nIf download failed,
|
|
46
|
-
console.log(`
|
|
45
|
+
console.log(`\nIf download failed, check the relay public keys in:`);
|
|
46
|
+
console.log(` examples/config/qvac.config.json`);
|
|
47
|
+
console.log(` (Mock keys in this example won't work in practice!)`);
|
|
47
48
|
process.exit(1);
|
|
48
49
|
}
|