@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,4 +1,11 @@
|
|
|
1
1
|
import { embed, GTE_LARGE_FP16, loadModel, unloadModel } from "@qvac/sdk";
|
|
2
|
+
function cosineSimilarity(vecA, vecB) {
|
|
3
|
+
let dotProduct = 0;
|
|
4
|
+
for (let i = 0; i < vecA.length; i++) {
|
|
5
|
+
dotProduct += vecA[i] * vecB[i];
|
|
6
|
+
}
|
|
7
|
+
return dotProduct;
|
|
8
|
+
}
|
|
2
9
|
try {
|
|
3
10
|
const modelId = await loadModel({
|
|
4
11
|
modelSrc: GTE_LARGE_FP16,
|
|
@@ -6,10 +13,39 @@ try {
|
|
|
6
13
|
onProgress: (progress) => {
|
|
7
14
|
console.log(progress);
|
|
8
15
|
},
|
|
16
|
+
modelConfig: {
|
|
17
|
+
gpuLayers: 99,
|
|
18
|
+
device: "gpu",
|
|
19
|
+
},
|
|
9
20
|
});
|
|
10
|
-
|
|
11
|
-
console.log("
|
|
12
|
-
|
|
21
|
+
console.log("\n📝 Example 1: Single Text Embedding");
|
|
22
|
+
console.log("=".repeat(50));
|
|
23
|
+
const singleEmbedding = await embed({ modelId, text: "Hello, world!" });
|
|
24
|
+
console.log("Input: 'Hello, world!'");
|
|
25
|
+
console.log("Embedding dimensions:", singleEmbedding.length);
|
|
26
|
+
console.log("First 10 values:", singleEmbedding.slice(0, 10));
|
|
27
|
+
console.log("\n📝 Example 2: Batch Text Embeddings");
|
|
28
|
+
console.log("=".repeat(50));
|
|
29
|
+
const texts = [
|
|
30
|
+
"The quick brown fox jumps over the lazy dog",
|
|
31
|
+
"A fast auburn fox leaps over a sleepy canine",
|
|
32
|
+
"Python is a programming language",
|
|
33
|
+
];
|
|
34
|
+
const batchEmbeddings = await embed({ modelId, text: texts });
|
|
35
|
+
console.log("Input: Array of", texts.length, "texts");
|
|
36
|
+
console.log("Output: Array of", batchEmbeddings.length, "embeddings");
|
|
37
|
+
const [emb1, emb2, emb3] = batchEmbeddings;
|
|
38
|
+
if (!emb1 || !emb2 || !emb3) {
|
|
39
|
+
throw new Error("Expected 3 embeddings");
|
|
40
|
+
}
|
|
41
|
+
console.log("Each embedding dimensions:", emb1.length);
|
|
42
|
+
console.log("\n🔍 Similarity Analysis");
|
|
43
|
+
console.log("=".repeat(50));
|
|
44
|
+
const similarity1 = cosineSimilarity(emb1, emb2);
|
|
45
|
+
const similarity2 = cosineSimilarity(emb1, emb3);
|
|
46
|
+
console.log("Similarity between texts 1 and 2 (similar meaning):", similarity1.toFixed(4));
|
|
47
|
+
console.log("Similarity between texts 1 and 3 (different topics):", similarity2.toFixed(4));
|
|
48
|
+
console.log("\n💡 Higher values indicate more similar meanings");
|
|
13
49
|
await unloadModel({ modelId, clearStorage: false });
|
|
14
50
|
}
|
|
15
51
|
catch (error) {
|
|
@@ -14,7 +14,7 @@ try {
|
|
|
14
14
|
modelConfig: {
|
|
15
15
|
device: "gpu",
|
|
16
16
|
ctx_size: 2048,
|
|
17
|
-
verbosity: VERBOSITY.
|
|
17
|
+
verbosity: VERBOSITY.DEBUG,
|
|
18
18
|
},
|
|
19
19
|
});
|
|
20
20
|
// Prompt 1 with cache key "session-a" (first time - no cache exists)
|
|
@@ -70,6 +70,21 @@ try {
|
|
|
70
70
|
}
|
|
71
71
|
const stats3 = await result3.stats;
|
|
72
72
|
console.log(`\n Stats: TTFT=${stats3?.timeToFirstToken}ms, CacheTokens=${stats3?.cacheTokens}\n`);
|
|
73
|
+
// Prompt 4: Go back to session-a to trigger flush of session-b
|
|
74
|
+
console.log('\n📝 Prompt 4: "What is 5+5?" with cache key "session-a" (BACK TO FIRST)');
|
|
75
|
+
console.log(" Status: This should trigger session-b to be flushed to disk\n");
|
|
76
|
+
const result4 = completion({
|
|
77
|
+
modelId,
|
|
78
|
+
history: [systemPromptMessage, { role: "user", content: "What is 5+5?" }],
|
|
79
|
+
stream: true,
|
|
80
|
+
kvCache: "session-a", // Back to session-a!
|
|
81
|
+
});
|
|
82
|
+
console.log(" Response: ");
|
|
83
|
+
for await (const token of result4.tokenStream) {
|
|
84
|
+
process.stdout.write(token);
|
|
85
|
+
}
|
|
86
|
+
const stats4 = await result4.stats;
|
|
87
|
+
console.log(`\n Stats: TTFT=${stats4?.timeToFirstToken}ms, CacheTokens=${stats4?.cacheTokens}\n`);
|
|
73
88
|
// Summary
|
|
74
89
|
console.log("\n✅ Summary:");
|
|
75
90
|
console.log(' - Prompts 1 & 2 share cache key "session-a" → same cache file');
|
|
@@ -1,22 +1,31 @@
|
|
|
1
|
-
import { completion, loadModel, unloadModel, VERBOSITY
|
|
1
|
+
import { completion, loadModel, unloadModel, VERBOSITY } from "@qvac/sdk";
|
|
2
|
+
// Sharded models can be loaded from:
|
|
3
|
+
// 1. HTTP archives: "https://example.com/model.tar.gz"
|
|
4
|
+
// 2. HTTP pattern: "https://example.com/model-00001-of-00005.gguf"
|
|
5
|
+
// 3. Hyperdrive: use any sharded model source/constant, eg: LLAMA_3_2_1B_INST_Q4_0_SHARD
|
|
6
|
+
// 4. Local filesystem: pass the path to the first shard file (Note: All shards must be in the same directory)
|
|
7
|
+
// 5. Local archive: pass the path to the archive file (.tar, .tar.gz, .tgz)
|
|
2
8
|
try {
|
|
3
9
|
const modelId = await loadModel({
|
|
4
|
-
modelSrc:
|
|
10
|
+
modelSrc: "https://huggingface.co/Qwen/Qwen2.5-Coder-7B-Instruct-GGUF/resolve/main/qwen2.5-coder-7b-instruct-q4_0-00001-of-00002.gguf",
|
|
5
11
|
modelType: "llm",
|
|
6
12
|
modelConfig: {
|
|
7
13
|
device: "gpu",
|
|
8
14
|
ctx_size: 2048,
|
|
9
|
-
verbosity: VERBOSITY.
|
|
15
|
+
verbosity: VERBOSITY.ERROR,
|
|
10
16
|
},
|
|
11
17
|
onProgress: (progress) => {
|
|
18
|
+
// For sharded models, progress.shardInfo contains detailed progress for both
|
|
19
|
+
// individual shards AND overall download progress across all shards
|
|
12
20
|
if (progress.shardInfo) {
|
|
21
|
+
// For pattern-based or Hyperdrive shards
|
|
13
22
|
const { shardInfo } = progress;
|
|
14
23
|
console.log(`📥 Downloading ${shardInfo.shardName} (${shardInfo.currentShard}/${shardInfo.totalShards})\n` +
|
|
15
24
|
` File: ${progress.percentage.toFixed(1)}% (${(progress.downloaded / 1024 / 1024).toFixed(2)}MB / ${(progress.total / 1024 / 1024).toFixed(2)}MB)\n` +
|
|
16
25
|
` Overall: ${shardInfo.overallPercentage.toFixed(1)}% (${(shardInfo.overallDownloaded / 1024 / 1024).toFixed(2)}MB / ${(shardInfo.overallTotal / 1024 / 1024).toFixed(2)}MB)`);
|
|
17
26
|
}
|
|
18
27
|
else {
|
|
19
|
-
//
|
|
28
|
+
// For archive-based shards
|
|
20
29
|
console.log(`📥 Progress: ${progress.percentage.toFixed(1)}% ` +
|
|
21
30
|
`(${(progress.downloaded / 1024 / 1024).toFixed(2)}MB / ${(progress.total / 1024 / 1024).toFixed(2)}MB)`);
|
|
22
31
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { getLogger } from "
|
|
2
|
-
import { loadModel, completion, unloadModel } from "../client/api/index.js";
|
|
1
|
+
import { getLogger, loadModel, completion, unloadModel, LLAMA_3_2_1B_INST_Q4_0, VERBOSITY, } from "@qvac/sdk";
|
|
3
2
|
import { writeFileSync, appendFileSync } from "fs";
|
|
4
3
|
import { join } from "path";
|
|
5
|
-
import { LLAMA_3_2_1B_INST_Q4_0 } from "../models/hyperdrive/index.js";
|
|
6
4
|
try {
|
|
7
5
|
const logFile = join(process.cwd(), "model-logs.txt");
|
|
8
6
|
// Clear previous logs
|
|
@@ -10,6 +8,7 @@ try {
|
|
|
10
8
|
// Create logger with file transport
|
|
11
9
|
const logger = getLogger("llm-file-demo", {
|
|
12
10
|
level: "debug",
|
|
11
|
+
enableConsole: false, // Disable console output (logs go to file only). Set to true for both console + file
|
|
13
12
|
transports: [
|
|
14
13
|
// File transport - append logs to file
|
|
15
14
|
(level, namespace, message) => {
|
|
@@ -17,10 +16,6 @@ try {
|
|
|
17
16
|
const logLine = `[${timestamp}] ${level.toUpperCase()} ${namespace}: ${message}\n`;
|
|
18
17
|
appendFileSync(logFile, logLine);
|
|
19
18
|
},
|
|
20
|
-
// Console transport for immediate feedback
|
|
21
|
-
(level, namespace, message) => {
|
|
22
|
-
console.log(`🔍 [${level.toUpperCase()}] ${namespace}: ${message}`);
|
|
23
|
-
},
|
|
24
19
|
],
|
|
25
20
|
});
|
|
26
21
|
logger.info("Starting model demo with file logging");
|
|
@@ -31,6 +26,7 @@ try {
|
|
|
31
26
|
modelConfig: {
|
|
32
27
|
ctx_size: 2048,
|
|
33
28
|
temp: 0.7,
|
|
29
|
+
verbosity: VERBOSITY.DEBUG,
|
|
34
30
|
},
|
|
35
31
|
logger, // All model logs will be captured
|
|
36
32
|
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { loadModel, completion, unloadModel, loggingStream, SDK_LOG_ID, LLAMA_3_2_1B_INST_Q4_0, GTE_LARGE_FP16, VERBOSITY, embed, } from "@qvac/sdk";
|
|
2
|
+
try {
|
|
3
|
+
console.log("🚀 Starting log streaming demo...\n");
|
|
4
|
+
// Note: To configure logging (level and console output), use config file:
|
|
5
|
+
// { "loggerLevel": "debug", "loggerConsoleOutput": false } in qvac.config.json/js/ts
|
|
6
|
+
// Subscribe to SDK server logs in background
|
|
7
|
+
console.log("📡 Starting SDK server log stream...\n");
|
|
8
|
+
(async () => {
|
|
9
|
+
for await (const log of loggingStream({ id: SDK_LOG_ID })) {
|
|
10
|
+
console.log(`[SDK] [${log.level.toUpperCase()}] [${log.namespace}] ${log.message}`);
|
|
11
|
+
}
|
|
12
|
+
})().catch(() => {
|
|
13
|
+
// Stream terminated - normal on shutdown
|
|
14
|
+
});
|
|
15
|
+
// Load models
|
|
16
|
+
console.log("📥 Loading models (watch SDK logs above)...\n");
|
|
17
|
+
const llmModelId = await loadModel({
|
|
18
|
+
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
19
|
+
modelType: "llm",
|
|
20
|
+
modelConfig: {
|
|
21
|
+
ctx_size: 2048,
|
|
22
|
+
temp: 0.7,
|
|
23
|
+
verbosity: VERBOSITY.ERROR, // Only log errors, remaining logs are captured by loggingStream
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
const embedModelId = await loadModel({
|
|
27
|
+
modelSrc: GTE_LARGE_FP16,
|
|
28
|
+
modelType: "embeddings",
|
|
29
|
+
});
|
|
30
|
+
console.log("📡 Starting model-specific log streams...\n");
|
|
31
|
+
(async () => {
|
|
32
|
+
for await (const log of loggingStream({ id: llmModelId })) {
|
|
33
|
+
const timestamp = new Date(log.timestamp).toISOString();
|
|
34
|
+
console.log(`[LLM] [${timestamp}] [${log.level.toUpperCase()}] ${log.namespace}: ${log.message}`);
|
|
35
|
+
}
|
|
36
|
+
})().catch(() => {
|
|
37
|
+
// Stream terminated - this is normal when model unloads
|
|
38
|
+
});
|
|
39
|
+
(async () => {
|
|
40
|
+
for await (const log of loggingStream({ id: embedModelId })) {
|
|
41
|
+
const timestamp = new Date(log.timestamp).toISOString();
|
|
42
|
+
console.log(`[EMBED] [${timestamp}] [${log.level.toUpperCase()}] ${log.namespace}: ${log.message}`);
|
|
43
|
+
}
|
|
44
|
+
})().catch(() => {
|
|
45
|
+
// Stream terminated - this is normal when model unloads
|
|
46
|
+
});
|
|
47
|
+
const messages = [
|
|
48
|
+
{ role: "user", content: "Count from 1 to 5 and explain each number." },
|
|
49
|
+
];
|
|
50
|
+
const result = completion({
|
|
51
|
+
modelId: llmModelId,
|
|
52
|
+
history: messages,
|
|
53
|
+
stream: true,
|
|
54
|
+
});
|
|
55
|
+
const embedding = await embed({
|
|
56
|
+
modelId: embedModelId,
|
|
57
|
+
text: messages[0]?.content ?? "Hello, world!",
|
|
58
|
+
});
|
|
59
|
+
console.log("📝 Response:\n");
|
|
60
|
+
for await (const token of result.tokenStream) {
|
|
61
|
+
process.stdout.write(token);
|
|
62
|
+
}
|
|
63
|
+
console.log("Embedding (first 20 elements)", embedding.slice(0, 20));
|
|
64
|
+
console.log("Embeddings length", embedding.length);
|
|
65
|
+
console.log("\n💡 Notice three log streams running:\n" +
|
|
66
|
+
" - [SDK] = SDK server operations\n" +
|
|
67
|
+
" - [LLM] = LLM model inference logs\n" +
|
|
68
|
+
" - [EMBED] = Embedding model logs\n");
|
|
69
|
+
await unloadModel({ modelId: llmModelId, clearStorage: false });
|
|
70
|
+
await unloadModel({ modelId: embedModelId, clearStorage: false });
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error("❌ Error:", error);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP DuckDuckGo Search Example
|
|
3
|
+
*
|
|
4
|
+
* A web search example using DuckDuckGo - no API key required!
|
|
5
|
+
* The server provides tools to search the web and get answers.
|
|
6
|
+
*
|
|
7
|
+
* Prerequisites:
|
|
8
|
+
* - Install MCP SDK: bun add @modelcontextprotocol/sdk
|
|
9
|
+
*
|
|
10
|
+
* Run with: bun run examples/mcp-websearch.ts
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=mcp-websearch.d.ts.map
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP DuckDuckGo Search Example
|
|
3
|
+
*
|
|
4
|
+
* A web search example using DuckDuckGo - no API key required!
|
|
5
|
+
* The server provides tools to search the web and get answers.
|
|
6
|
+
*
|
|
7
|
+
* Prerequisites:
|
|
8
|
+
* - Install MCP SDK: bun add @modelcontextprotocol/sdk
|
|
9
|
+
*
|
|
10
|
+
* Run with: bun run examples/mcp-websearch.ts
|
|
11
|
+
*/
|
|
12
|
+
import { completion, loadModel, unloadModel, QWEN_3_1_7B_INST_Q4, } from "../index.js";
|
|
13
|
+
// MCP SDK is a user-installed optional dependency
|
|
14
|
+
// Install with: bun add @modelcontextprotocol/sdk
|
|
15
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
16
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
17
|
+
function parseSearchResults(mcpResult) {
|
|
18
|
+
try {
|
|
19
|
+
const result = mcpResult;
|
|
20
|
+
// Extract text content from MCP response
|
|
21
|
+
const textContent = result.content?.find((c) => c.type === "text");
|
|
22
|
+
if (!textContent?.text) {
|
|
23
|
+
return JSON.stringify(mcpResult);
|
|
24
|
+
}
|
|
25
|
+
// Parse the JSON array of search results
|
|
26
|
+
const rawResults = JSON.parse(textContent.text);
|
|
27
|
+
// Extract just the useful fields (title, url, snippet)
|
|
28
|
+
const cleanResults = rawResults.slice(0, 5).map((r) => ({
|
|
29
|
+
title: r.title ?? "Unknown",
|
|
30
|
+
url: r.url ?? "",
|
|
31
|
+
snippet: r.snippet ?? "",
|
|
32
|
+
}));
|
|
33
|
+
// Format as concise text for LLM
|
|
34
|
+
return cleanResults
|
|
35
|
+
.map((r, i) => `[${i + 1}] ${r.title}\n URL: ${r.url}\n ${r.snippet}`)
|
|
36
|
+
.join("\n\n");
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// If parsing fails, return a truncated version
|
|
40
|
+
const str = typeof mcpResult === "string" ? mcpResult : JSON.stringify(mcpResult);
|
|
41
|
+
return str.slice(0, 2000);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let mcpClient = null;
|
|
45
|
+
try {
|
|
46
|
+
console.log("🦆 MCP DuckDuckGo Search Example\n");
|
|
47
|
+
// ============================================================
|
|
48
|
+
// STEP 1: Connect to DuckDuckGo MCP server
|
|
49
|
+
// ============================================================
|
|
50
|
+
console.log("1️⃣ Starting DuckDuckGo MCP server...");
|
|
51
|
+
mcpClient = new Client({
|
|
52
|
+
name: "qvac-ddg-example",
|
|
53
|
+
version: "1.0.0",
|
|
54
|
+
});
|
|
55
|
+
const transport = new StdioClientTransport({
|
|
56
|
+
command: "npx",
|
|
57
|
+
args: ["-y", "@oevortex/ddg_search"],
|
|
58
|
+
});
|
|
59
|
+
await mcpClient.connect(transport);
|
|
60
|
+
console.log(" ✓ MCP server connected\n");
|
|
61
|
+
// ============================================================
|
|
62
|
+
// STEP 2: Load model
|
|
63
|
+
// ============================================================
|
|
64
|
+
console.log("2️⃣ Loading model...");
|
|
65
|
+
const modelId = await loadModel({
|
|
66
|
+
modelSrc: QWEN_3_1_7B_INST_Q4,
|
|
67
|
+
modelType: "llm",
|
|
68
|
+
modelConfig: {
|
|
69
|
+
ctx_size: 4096,
|
|
70
|
+
tools: true,
|
|
71
|
+
},
|
|
72
|
+
onProgress: (progress) => process.stdout.write(`\r Loading: ${progress.percentage.toFixed(1)}%`),
|
|
73
|
+
});
|
|
74
|
+
console.log(`\n ✓ Model loaded\n`);
|
|
75
|
+
// ============================================================
|
|
76
|
+
// STEP 3: Ask AI to search the web (with MCP client)
|
|
77
|
+
// ============================================================
|
|
78
|
+
const history = [
|
|
79
|
+
{
|
|
80
|
+
role: "system",
|
|
81
|
+
content: `You are a helpful assistant with access to web search.
|
|
82
|
+
Use the search tool when you need current information.
|
|
83
|
+
Always cite your sources with the URL.`,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
role: "user",
|
|
87
|
+
content: "What is the current weather in New York City?",
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
console.log("3️⃣ Asking AI to search the web...\n");
|
|
91
|
+
console.log("🤖 AI Response:");
|
|
92
|
+
// Pass MCP client directly to completion - tools are adapted internally!
|
|
93
|
+
const result = completion({
|
|
94
|
+
modelId,
|
|
95
|
+
history,
|
|
96
|
+
stream: true,
|
|
97
|
+
mcp: [{ client: mcpClient, includeResources: false }],
|
|
98
|
+
});
|
|
99
|
+
for await (const token of result.tokenStream) {
|
|
100
|
+
process.stdout.write(token);
|
|
101
|
+
}
|
|
102
|
+
const toolCalls = await result.toolCalls;
|
|
103
|
+
console.log("\n");
|
|
104
|
+
// ============================================================
|
|
105
|
+
// STEP 4: Execute tool calls using call() - automatic MCP routing!
|
|
106
|
+
// ============================================================
|
|
107
|
+
if (toolCalls.length > 0) {
|
|
108
|
+
console.log("4️⃣ Executing search...\n");
|
|
109
|
+
const toolResults = [];
|
|
110
|
+
for (const toolCall of toolCalls) {
|
|
111
|
+
console.log(`🔍 ${toolCall.name}(${JSON.stringify(toolCall.arguments)})`);
|
|
112
|
+
if (!toolCall.invoke) {
|
|
113
|
+
console.log(` ⚠️ No handler found for tool "${toolCall.name}"`);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
// Use invoke() - automatically routes to the correct MCP client!
|
|
117
|
+
const mcpResult = await toolCall.invoke();
|
|
118
|
+
// Parse and clean up the search results
|
|
119
|
+
const cleanResult = parseSearchResults(mcpResult);
|
|
120
|
+
console.log(` ✓ Got search results:`);
|
|
121
|
+
console.log(cleanResult
|
|
122
|
+
.split("\n")
|
|
123
|
+
.map((l) => ` ${l}`)
|
|
124
|
+
.join("\n"));
|
|
125
|
+
console.log();
|
|
126
|
+
toolResults.push({ id: toolCall.id, result: cleanResult });
|
|
127
|
+
}
|
|
128
|
+
// ============================================================
|
|
129
|
+
// STEP 5: Continue with search results
|
|
130
|
+
// ============================================================
|
|
131
|
+
console.log("5️⃣ Getting AI response with search results...\n");
|
|
132
|
+
history.push({
|
|
133
|
+
role: "assistant",
|
|
134
|
+
content: await result.text,
|
|
135
|
+
});
|
|
136
|
+
for (const tr of toolResults) {
|
|
137
|
+
history.push({
|
|
138
|
+
role: "tool",
|
|
139
|
+
content: tr.result,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
console.log("🤖 Final Response:");
|
|
143
|
+
const finalResult = completion({
|
|
144
|
+
modelId,
|
|
145
|
+
history,
|
|
146
|
+
stream: true,
|
|
147
|
+
mcp: [{ client: mcpClient, includeResources: false }],
|
|
148
|
+
});
|
|
149
|
+
for await (const token of finalResult.tokenStream) {
|
|
150
|
+
process.stdout.write(token);
|
|
151
|
+
}
|
|
152
|
+
console.log("\n");
|
|
153
|
+
}
|
|
154
|
+
// ============================================================
|
|
155
|
+
// Cleanup
|
|
156
|
+
// ============================================================
|
|
157
|
+
console.log("6️⃣ Cleaning up...");
|
|
158
|
+
await unloadModel({ modelId, clearStorage: false });
|
|
159
|
+
console.log(" ✓ Done\n");
|
|
160
|
+
console.log("🎉 Example completed!");
|
|
161
|
+
process.exit(0);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
console.error("❌ Error:", error);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
if (mcpClient) {
|
|
169
|
+
try {
|
|
170
|
+
await mcpClient.close();
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Ignore close errors
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { close, loadModel, ocr, OCR_CRAFT_LATIN_RECOGNIZER_1, unloadModel, } from "@qvac/sdk";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const imagePath = process.argv[2] || path.join(__dirname, "image/basic_test.bmp");
|
|
6
|
+
try {
|
|
7
|
+
console.log("🚀 Loading OCR model...");
|
|
8
|
+
// Only need to pass the recognizer - detector is auto-derived from same hyperdrive key
|
|
9
|
+
const modelId = await loadModel({
|
|
10
|
+
modelSrc: OCR_CRAFT_LATIN_RECOGNIZER_1,
|
|
11
|
+
modelType: "ocr",
|
|
12
|
+
modelConfig: {
|
|
13
|
+
langList: ["en"],
|
|
14
|
+
useGPU: true,
|
|
15
|
+
timeout: 30000,
|
|
16
|
+
magRatio: 1.5,
|
|
17
|
+
defaultRotationAngles: [90, 180, 270],
|
|
18
|
+
contrastRetry: false,
|
|
19
|
+
lowConfidenceThreshold: 0.5,
|
|
20
|
+
recognizerBatchSize: 1,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
console.log(`✅ Model loaded successfully! Model ID: ${modelId}`);
|
|
24
|
+
console.log(`\n🔍 Running OCR on: ${imagePath}`);
|
|
25
|
+
const { blocks } = ocr({
|
|
26
|
+
modelId,
|
|
27
|
+
image: imagePath,
|
|
28
|
+
options: {
|
|
29
|
+
paragraph: false,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
const result = await blocks;
|
|
33
|
+
console.log("\n📝 OCR Results:");
|
|
34
|
+
console.log("================================");
|
|
35
|
+
for (const block of result) {
|
|
36
|
+
console.log(`\n📄 Text: ${block.text}`);
|
|
37
|
+
if (block.bbox) {
|
|
38
|
+
console.log(` 📍 BBox: [${block.bbox.join(", ")}]`);
|
|
39
|
+
}
|
|
40
|
+
if (block.confidence !== undefined) {
|
|
41
|
+
console.log(` ✓ Confidence: ${block.confidence}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
console.log("\n================================");
|
|
45
|
+
console.log("\n🔄 Unloading model...");
|
|
46
|
+
await unloadModel({ modelId, clearStorage: false });
|
|
47
|
+
console.log("✅ Model unloaded successfully.");
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error("❌ Error during OCR processing:", error);
|
|
51
|
+
close();
|
|
52
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { loadModel, LLAMA_3_2_1B_INST_Q4_0, completion, unloadModel, } from "@qvac/sdk";
|
|
2
|
+
try {
|
|
3
|
+
// Load a model into memory
|
|
4
|
+
const modelId = await loadModel({
|
|
5
|
+
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
6
|
+
modelType: "llm",
|
|
7
|
+
onProgress: (progress) => {
|
|
8
|
+
console.log(progress);
|
|
9
|
+
},
|
|
10
|
+
});
|
|
11
|
+
// You can use the loaded model multiple times
|
|
12
|
+
const history = [
|
|
13
|
+
{
|
|
14
|
+
role: "user",
|
|
15
|
+
content: "Explain quantum computing in one sentence",
|
|
16
|
+
},
|
|
17
|
+
];
|
|
18
|
+
const result = completion({ modelId, history, stream: true });
|
|
19
|
+
for await (const token of result.tokenStream) {
|
|
20
|
+
process.stdout.write(token);
|
|
21
|
+
}
|
|
22
|
+
// Unload model to free up system resources
|
|
23
|
+
await unloadModel({ modelId });
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error("❌ Error:", error);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { loadModel, unloadModel, GTE_LARGE_FP16, ragIngest, ragCloseWorkspace, cancel, } from "@qvac/sdk";
|
|
2
|
+
const WORKSPACE = "cancellation-demo";
|
|
3
|
+
// Generate sample documents
|
|
4
|
+
function generateDocuments(count) {
|
|
5
|
+
const topics = [
|
|
6
|
+
"Machine learning algorithms process data to identify patterns and make decisions.",
|
|
7
|
+
"Deep neural networks consist of multiple layers that extract higher-level features.",
|
|
8
|
+
"Natural language processing enables computers to understand human language.",
|
|
9
|
+
"Computer vision systems analyze visual information from images and videos.",
|
|
10
|
+
"Reinforcement learning trains agents through trial and error using rewards.",
|
|
11
|
+
];
|
|
12
|
+
return Array.from({ length: count }, (_, i) => {
|
|
13
|
+
const topic = topics[i % topics.length];
|
|
14
|
+
return `Document ${i + 1}: ${topic} Extended content for document ${i + 1}.`;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
console.log("RAG Cancellation Example\n");
|
|
19
|
+
// Load embedding model
|
|
20
|
+
console.log("Loading embedding model...");
|
|
21
|
+
const modelId = await loadModel({
|
|
22
|
+
modelSrc: GTE_LARGE_FP16,
|
|
23
|
+
modelType: "embeddings",
|
|
24
|
+
onProgress: (progress) => {
|
|
25
|
+
process.stdout.write(`\r ${progress.percentage.toFixed(1)}%`);
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
console.log("\n✅ Model loaded\n");
|
|
29
|
+
// Generate documents
|
|
30
|
+
const documents = generateDocuments(200);
|
|
31
|
+
console.log(`📄 Processing ${documents.length} documents...\n`);
|
|
32
|
+
let progressCount = 0;
|
|
33
|
+
let cancelled = false;
|
|
34
|
+
try {
|
|
35
|
+
await ragIngest({
|
|
36
|
+
modelId,
|
|
37
|
+
workspace: WORKSPACE,
|
|
38
|
+
documents,
|
|
39
|
+
progressInterval: 50,
|
|
40
|
+
onProgress: (stage, current, total) => {
|
|
41
|
+
progressCount++;
|
|
42
|
+
const pct = total > 0 ? Math.round((current / total) * 100) : 0;
|
|
43
|
+
console.log(` [${stage}] ${current}/${total} (${pct}%)`);
|
|
44
|
+
// Cancel during embedding stage after a few updates
|
|
45
|
+
if (!cancelled && stage === "embedding" && current > 10) {
|
|
46
|
+
console.log("\n🛑 Triggering cancellation...\n");
|
|
47
|
+
cancelled = true;
|
|
48
|
+
void cancel({ operation: "rag", workspace: WORKSPACE });
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
console.log("\n⚠️ Ingest completed (cancellation didn't interrupt in time)");
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
56
|
+
const wasCancelled = msg.toLowerCase().includes("cancel") ||
|
|
57
|
+
msg.toLowerCase().includes("abort");
|
|
58
|
+
if (wasCancelled) {
|
|
59
|
+
console.log("✅ Operation cancelled successfully!");
|
|
60
|
+
console.log(` Progress updates received: ${progressCount}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Cleanup (workspace may not exist if cancelled early)
|
|
67
|
+
await ragCloseWorkspace({ workspace: WORKSPACE, deleteOnClose: true }).catch(() => { });
|
|
68
|
+
await unloadModel({ modelId });
|
|
69
|
+
console.log("✅ Done");
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error("❌ Error:", error);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|