@qvac/sdk 0.1.0-dev.1760648187.328e967
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +301 -0
- package/dist/client/api/cancel.d.ts +25 -0
- package/dist/client/api/cancel.js +37 -0
- package/dist/client/api/completion-stream.d.ts +50 -0
- package/dist/client/api/completion-stream.js +103 -0
- package/dist/client/api/download-asset.d.ts +39 -0
- package/dist/client/api/download-asset.js +72 -0
- package/dist/client/api/embed.d.ts +11 -0
- package/dist/client/api/embed.js +24 -0
- package/dist/client/api/index.d.ts +13 -0
- package/dist/client/api/index.js +12 -0
- package/dist/client/api/load-model.d.ts +98 -0
- package/dist/client/api/load-model.js +154 -0
- package/dist/client/api/logging-stream.d.ts +21 -0
- package/dist/client/api/logging-stream.js +32 -0
- package/dist/client/api/ping.d.ts +11 -0
- package/dist/client/api/ping.js +18 -0
- package/dist/client/api/provide.d.ts +18 -0
- package/dist/client/api/provide.js +27 -0
- package/dist/client/api/rag.d.ts +42 -0
- package/dist/client/api/rag.js +97 -0
- package/dist/client/api/transcribe.d.ts +24 -0
- package/dist/client/api/transcribe.js +52 -0
- package/dist/client/api/translate.d.ts +47 -0
- package/dist/client/api/translate.js +114 -0
- package/dist/client/api/unload-model.d.ts +11 -0
- package/dist/client/api/unload-model.js +26 -0
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.js +1 -0
- package/dist/client/logging-stream-registry.d.ts +5 -0
- package/dist/client/logging-stream-registry.js +60 -0
- package/dist/client/rpc/bare-client.d.ts +112 -0
- package/dist/client/rpc/bare-client.js +82 -0
- package/dist/client/rpc/bare-rpc-client.d.ts +4 -0
- package/dist/client/rpc/bare-rpc-client.js +87 -0
- package/dist/client/rpc/expo-rpc-client.d.ts +3 -0
- package/dist/client/rpc/expo-rpc-client.js +57 -0
- package/dist/client/rpc/node-rpc-client.d.ts +9 -0
- package/dist/client/rpc/node-rpc-client.js +99 -0
- package/dist/client/rpc/rpc-client.d.ts +5 -0
- package/dist/client/rpc/rpc-client.js +91 -0
- package/dist/client/rpc/rpc-error.d.ts +19 -0
- package/dist/client/rpc/rpc-error.js +39 -0
- package/dist/constants/audio.d.ts +3 -0
- package/dist/constants/audio.js +17 -0
- package/dist/constants/index.d.ts +2 -0
- package/dist/constants/index.js +1 -0
- package/dist/examples/delegated-inference/consumer.d.ts +2 -0
- package/dist/examples/delegated-inference/consumer.js +56 -0
- package/dist/examples/delegated-inference/provider.d.ts +2 -0
- package/dist/examples/delegated-inference/provider.js +57 -0
- package/dist/examples/download-with-cancel.d.ts +2 -0
- package/dist/examples/download-with-cancel.js +46 -0
- package/dist/examples/embed-hyperdrive.d.ts +2 -0
- package/dist/examples/embed-hyperdrive.js +19 -0
- package/dist/examples/kv-cache-example.d.ts +2 -0
- package/dist/examples/kv-cache-example.js +74 -0
- package/dist/examples/llamacpp-file-logging.d.ts +2 -0
- package/dist/examples/llamacpp-file-logging.js +62 -0
- package/dist/examples/llamacpp-filesystem.d.ts +2 -0
- package/dist/examples/llamacpp-filesystem.js +40 -0
- package/dist/examples/llamacpp-http.d.ts +2 -0
- package/dist/examples/llamacpp-http.js +41 -0
- package/dist/examples/llamacpp-hyperdrive.d.ts +2 -0
- package/dist/examples/llamacpp-hyperdrive.js +39 -0
- package/dist/examples/llamacpp-multimodal.d.ts +2 -0
- package/dist/examples/llamacpp-multimodal.js +62 -0
- package/dist/examples/llamacpp-native-tools.d.ts +2 -0
- package/dist/examples/llamacpp-native-tools.js +64 -0
- package/dist/examples/llamacpp-tools-routing.d.ts +2 -0
- package/dist/examples/llamacpp-tools-routing.js +364 -0
- package/dist/examples/llamacpp-tools.d.ts +2 -0
- package/dist/examples/llamacpp-tools.js +81 -0
- package/dist/examples/multi-model-demo.d.ts +2 -0
- package/dist/examples/multi-model-demo.js +75 -0
- package/dist/examples/parallel-download.d.ts +2 -0
- package/dist/examples/parallel-download.js +21 -0
- package/dist/examples/rag/rag-chromadb.d.ts +2 -0
- package/dist/examples/rag/rag-chromadb.js +130 -0
- package/dist/examples/rag/rag-hyperdb-workspaces.d.ts +2 -0
- package/dist/examples/rag/rag-hyperdb-workspaces.js +106 -0
- package/dist/examples/rag/rag-hyperdb.d.ts +2 -0
- package/dist/examples/rag/rag-hyperdb.js +50 -0
- package/dist/examples/rag/rag-lancedb.d.ts +2 -0
- package/dist/examples/rag/rag-lancedb.js +95 -0
- package/dist/examples/rag/rag-sqlite.d.ts +2 -0
- package/dist/examples/rag/rag-sqlite.js +107 -0
- package/dist/examples/seed-hyperdrive.d.ts +2 -0
- package/dist/examples/seed-hyperdrive.js +21 -0
- package/dist/examples/translation/translation-indic.d.ts +2 -0
- package/dist/examples/translation/translation-indic.js +30 -0
- package/dist/examples/translation/translation-llm-context.d.ts +2 -0
- package/dist/examples/translation/translation-llm-context.js +30 -0
- package/dist/examples/translation/translation-llm.d.ts +2 -0
- package/dist/examples/translation/translation-llm.js +38 -0
- package/dist/examples/translation/translation-opus.d.ts +2 -0
- package/dist/examples/translation/translation-opus.js +30 -0
- package/dist/examples/translation/translation-stream.d.ts +2 -0
- package/dist/examples/translation/translation-stream.js +35 -0
- package/dist/examples/whispercpp-filesystem.d.ts +2 -0
- package/dist/examples/whispercpp-filesystem.js +43 -0
- package/dist/examples/whispercpp-microphone-record.d.ts +2 -0
- package/dist/examples/whispercpp-microphone-record.js +311 -0
- package/dist/expo/plugins/index.d.ts +5 -0
- package/dist/expo/plugins/index.js +5 -0
- package/dist/expo/plugins/withMobileBundle.d.ts +8 -0
- package/dist/expo/plugins/withMobileBundle.js +60 -0
- package/dist/expo/plugins/withOpenCL.d.ts +9 -0
- package/dist/expo/plugins/withOpenCL.js +118 -0
- package/dist/expo/plugins/withQvacSDK.d.ts +9 -0
- package/dist/expo/plugins/withQvacSDK.js +13 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/logging/base-logger.d.ts +7 -0
- package/dist/logging/base-logger.js +55 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.js +2 -0
- package/dist/logging/logger.d.ts +5 -0
- package/dist/logging/logger.js +28 -0
- package/dist/logging/stream-logger.d.ts +3 -0
- package/dist/logging/stream-logger.js +9 -0
- package/dist/logging/transport.d.ts +3 -0
- package/dist/logging/transport.js +15 -0
- package/dist/logging/types.d.ts +18 -0
- package/dist/logging/types.js +1 -0
- package/dist/logging/utils.d.ts +4 -0
- package/dist/logging/utils.js +47 -0
- package/dist/models/hyperdrive/index.d.ts +2 -0
- package/dist/models/hyperdrive/index.js +2 -0
- package/dist/models/hyperdrive/models.d.ts +475 -0
- package/dist/models/hyperdrive/models.js +534 -0
- package/dist/schemas/cancel.d.ts +33 -0
- package/dist/schemas/cancel.js +25 -0
- package/dist/schemas/common.d.ts +626 -0
- package/dist/schemas/common.js +47 -0
- package/dist/schemas/completion-stream.d.ts +125 -0
- package/dist/schemas/completion-stream.js +53 -0
- package/dist/schemas/delegate.d.ts +9 -0
- package/dist/schemas/delegate.js +9 -0
- package/dist/schemas/download-asset.d.ts +75 -0
- package/dist/schemas/download-asset.js +43 -0
- package/dist/schemas/embed.d.ts +20 -0
- package/dist/schemas/embed.js +14 -0
- package/dist/schemas/error.d.ts +13 -0
- package/dist/schemas/error.js +35 -0
- package/dist/schemas/index.d.ts +19 -0
- package/dist/schemas/index.js +19 -0
- package/dist/schemas/llamacpp-config.d.ts +30 -0
- package/dist/schemas/llamacpp-config.js +39 -0
- package/dist/schemas/load-model.d.ts +1259 -0
- package/dist/schemas/load-model.js +108 -0
- package/dist/schemas/logging-stream.d.ts +27 -0
- package/dist/schemas/logging-stream.js +16 -0
- package/dist/schemas/ping.d.ts +11 -0
- package/dist/schemas/ping.js +8 -0
- package/dist/schemas/provide.d.ts +43 -0
- package/dist/schemas/provide.js +25 -0
- package/dist/schemas/rag.d.ts +159 -0
- package/dist/schemas/rag.js +78 -0
- package/dist/schemas/transcription.d.ts +24 -0
- package/dist/schemas/transcription.js +15 -0
- package/dist/schemas/translate.d.ts +82 -0
- package/dist/schemas/translate.js +42 -0
- package/dist/schemas/translation-config.d.ts +83 -0
- package/dist/schemas/translation-config.js +46 -0
- package/dist/schemas/unload-model.d.ts +19 -0
- package/dist/schemas/unload-model.js +13 -0
- package/dist/schemas/whispercpp-config.d.ts +25 -0
- package/dist/schemas/whispercpp-config.js +18 -0
- package/dist/server/bare/addons/cancel.d.ts +3 -0
- package/dist/server/bare/addons/cancel.js +12 -0
- package/dist/server/bare/addons/index.d.ts +4 -0
- package/dist/server/bare/addons/index.js +3 -0
- package/dist/server/bare/addons/llamacpp/create-model.d.ts +5 -0
- package/dist/server/bare/addons/llamacpp/create-model.js +57 -0
- package/dist/server/bare/addons/llamacpp/handlers/completion-stream.d.ts +3 -0
- package/dist/server/bare/addons/llamacpp/handlers/completion-stream.js +65 -0
- package/dist/server/bare/addons/llamacpp/handlers/embed.d.ts +4 -0
- package/dist/server/bare/addons/llamacpp/handlers/embed.js +40 -0
- package/dist/server/bare/addons/llamacpp/index.d.ts +4 -0
- package/dist/server/bare/addons/llamacpp/index.js +3 -0
- package/dist/server/bare/addons/llamacpp/kv-cache-utils.d.ts +19 -0
- package/dist/server/bare/addons/llamacpp/kv-cache-utils.js +46 -0
- package/dist/server/bare/addons/load-model.d.ts +3 -0
- package/dist/server/bare/addons/load-model.js +55 -0
- package/dist/server/bare/addons/translation/create-model.d.ts +4 -0
- package/dist/server/bare/addons/translation/create-model.js +45 -0
- package/dist/server/bare/addons/translation/handlers/translate.d.ts +3 -0
- package/dist/server/bare/addons/translation/handlers/translate.js +86 -0
- package/dist/server/bare/addons/translation/index.d.ts +3 -0
- package/dist/server/bare/addons/translation/index.js +2 -0
- package/dist/server/bare/addons/unload-model.d.ts +3 -0
- package/dist/server/bare/addons/unload-model.js +20 -0
- package/dist/server/bare/addons/whispercpp/create-model.d.ts +6 -0
- package/dist/server/bare/addons/whispercpp/create-model.js +55 -0
- package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.d.ts +3 -0
- package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.js +42 -0
- package/dist/server/bare/addons/whispercpp/index.d.ts +3 -0
- package/dist/server/bare/addons/whispercpp/index.js +2 -0
- package/dist/server/bare/delegate-rpc-client.d.ts +4 -0
- package/dist/server/bare/delegate-rpc-client.js +70 -0
- package/dist/server/bare/hyperswarm.d.ts +7 -0
- package/dist/server/bare/hyperswarm.js +62 -0
- package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.d.ts +3 -0
- package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.js +12 -0
- package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.d.ts +6 -0
- package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.js +16 -0
- package/dist/server/bare/rag-hyperdb/handlers/search.d.ts +3 -0
- package/dist/server/bare/rag-hyperdb/handlers/search.js +15 -0
- package/dist/server/bare/rag-hyperdb/index.d.ts +5 -0
- package/dist/server/bare/rag-hyperdb/index.js +4 -0
- package/dist/server/bare/rag-hyperdb/rag-manager.d.ts +5 -0
- package/dist/server/bare/rag-hyperdb/rag-manager.js +61 -0
- package/dist/server/bare/registry/logging-stream-registry.d.ts +12 -0
- package/dist/server/bare/registry/logging-stream-registry.js +46 -0
- package/dist/server/bare/registry/model-registry.d.ts +64 -0
- package/dist/server/bare/registry/model-registry.js +95 -0
- package/dist/server/error-handlers.d.ts +4 -0
- package/dist/server/error-handlers.js +27 -0
- package/dist/server/http-server.d.ts +2 -0
- package/dist/server/http-server.js +189 -0
- package/dist/server/rpc/create-server.d.ts +4 -0
- package/dist/server/rpc/create-server.js +19 -0
- package/dist/server/rpc/handle-request.d.ts +12 -0
- package/dist/server/rpc/handle-request.js +220 -0
- package/dist/server/rpc/handlers/cancelHandler.d.ts +3 -0
- package/dist/server/rpc/handlers/cancelHandler.js +27 -0
- package/dist/server/rpc/handlers/completion-stream-delegated.d.ts +3 -0
- package/dist/server/rpc/handlers/completion-stream-delegated.js +30 -0
- package/dist/server/rpc/handlers/completion-stream.d.ts +3 -0
- package/dist/server/rpc/handlers/completion-stream.js +52 -0
- package/dist/server/rpc/handlers/download-asset.d.ts +3 -0
- package/dist/server/rpc/handlers/download-asset.js +21 -0
- package/dist/server/rpc/handlers/embed.d.ts +3 -0
- package/dist/server/rpc/handlers/embed.js +21 -0
- package/dist/server/rpc/handlers/index.d.ts +23 -0
- package/dist/server/rpc/handlers/index.js +22 -0
- package/dist/server/rpc/handlers/load-model/download-manager.d.ts +31 -0
- package/dist/server/rpc/handlers/load-model/download-manager.js +88 -0
- package/dist/server/rpc/handlers/load-model/http.d.ts +3 -0
- package/dist/server/rpc/handlers/load-model/http.js +337 -0
- package/dist/server/rpc/handlers/load-model/hyperdrive.d.ts +4 -0
- package/dist/server/rpc/handlers/load-model/hyperdrive.js +332 -0
- package/dist/server/rpc/handlers/load-model/index.d.ts +4 -0
- package/dist/server/rpc/handlers/load-model/index.js +3 -0
- package/dist/server/rpc/handlers/load-model/resolve.d.ts +3 -0
- package/dist/server/rpc/handlers/load-model/resolve.js +121 -0
- package/dist/server/rpc/handlers/load-model-delegated.d.ts +3 -0
- package/dist/server/rpc/handlers/load-model-delegated.js +93 -0
- package/dist/server/rpc/handlers/load-model.d.ts +3 -0
- package/dist/server/rpc/handlers/load-model.js +41 -0
- package/dist/server/rpc/handlers/logging-stream.d.ts +3 -0
- package/dist/server/rpc/handlers/logging-stream.js +37 -0
- package/dist/server/rpc/handlers/provideHandler/connection.d.ts +3 -0
- package/dist/server/rpc/handlers/provideHandler/connection.js +25 -0
- package/dist/server/rpc/handlers/provideHandler/handler.d.ts +3 -0
- package/dist/server/rpc/handlers/provideHandler/handler.js +50 -0
- package/dist/server/rpc/handlers/provideHandler/proxy.d.ts +3 -0
- package/dist/server/rpc/handlers/provideHandler/proxy.js +22 -0
- package/dist/server/rpc/handlers/provideHandler.d.ts +2 -0
- package/dist/server/rpc/handlers/provideHandler.js +2 -0
- package/dist/server/rpc/handlers/rag.d.ts +3 -0
- package/dist/server/rpc/handlers/rag.js +67 -0
- package/dist/server/rpc/handlers/transcribe-stream.d.ts +3 -0
- package/dist/server/rpc/handlers/transcribe-stream.js +26 -0
- package/dist/server/rpc/handlers/translate.d.ts +3 -0
- package/dist/server/rpc/handlers/translate.js +51 -0
- package/dist/server/rpc/handlers/unload-model.d.ts +3 -0
- package/dist/server/rpc/handlers/unload-model.js +20 -0
- package/dist/server/rpc/index.d.ts +3 -0
- package/dist/server/rpc/index.js +2 -0
- package/dist/server/utils/audio/decoder.d.ts +4 -0
- package/dist/server/utils/audio/decoder.js +41 -0
- package/dist/server/utils/cache.d.ts +15 -0
- package/dist/server/utils/cache.js +32 -0
- package/dist/server/utils/hash.d.ts +5 -0
- package/dist/server/utils/hash.js +11 -0
- package/dist/server/utils/index.d.ts +5 -0
- package/dist/server/utils/index.js +4 -0
- package/dist/server/utils/model-path.d.ts +5 -0
- package/dist/server/utils/model-path.js +7 -0
- package/dist/server/worker.d.ts +6 -0
- package/dist/server/worker.js +77 -0
- package/dist/utils/withTimeout.d.ts +11 -0
- package/dist/utils/withTimeout.js +37 -0
- package/package.json +129 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CompletionStreamRequest, CompletionStreamResponse } from "../../../schemas/index";
|
|
2
|
+
export declare function handleCompletionStreamDelegated(request: CompletionStreamRequest): AsyncGenerator<CompletionStreamResponse>;
|
|
3
|
+
//# sourceMappingURL=completion-stream-delegated.d.ts.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { getModelEntry } from "../../bare/registry/model-registry.js";
|
|
2
|
+
import { getRPC } from "../../bare/delegate-rpc-client.js";
|
|
3
|
+
import { stream } from "../../../client/rpc/rpc-client.js";
|
|
4
|
+
export async function* handleCompletionStreamDelegated(request) {
|
|
5
|
+
// Get delegation info from model registry
|
|
6
|
+
const entry = getModelEntry(request.modelId);
|
|
7
|
+
if (!entry?.isDelegated || !entry.delegated) {
|
|
8
|
+
throw new Error(`Model ${request.modelId} is not a delegated model`);
|
|
9
|
+
}
|
|
10
|
+
const { topic, providerPublicKey, timeout } = entry.delegated;
|
|
11
|
+
try {
|
|
12
|
+
console.log(`📤 Sending delegated completionStream request to provider: ${providerPublicKey}${timeout ? `, timeout: ${timeout}ms` : ""}`);
|
|
13
|
+
// Create RPC instance for this HyperSwarm peer
|
|
14
|
+
const rpc = await getRPC(topic, providerPublicKey, { timeout });
|
|
15
|
+
// Use the regular stream function with the HyperSwarm RPC instance
|
|
16
|
+
const responseStream = stream(request, rpc, { timeout });
|
|
17
|
+
// Yield each response from the stream
|
|
18
|
+
for await (const response of responseStream) {
|
|
19
|
+
yield response;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
console.error("Error in delegated completion stream:", error);
|
|
24
|
+
yield {
|
|
25
|
+
type: "completionStream",
|
|
26
|
+
token: `Error communicating with provider: ${error instanceof Error ? error.message : String(error)}`,
|
|
27
|
+
done: true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { completion } from "../../bare/addons/llamacpp/index.js";
|
|
2
|
+
export async function* handleCompletionStream(request) {
|
|
3
|
+
try {
|
|
4
|
+
// Log tools if provided
|
|
5
|
+
if (request.tools) {
|
|
6
|
+
console.log("Tools passed to completionStream:", request.tools);
|
|
7
|
+
}
|
|
8
|
+
const filteredHistory = request.history.map(({ role, content, attachments }) => ({
|
|
9
|
+
role,
|
|
10
|
+
content,
|
|
11
|
+
attachments: attachments ?? [],
|
|
12
|
+
}));
|
|
13
|
+
const stream = completion({
|
|
14
|
+
history: filteredHistory,
|
|
15
|
+
modelId: request.modelId,
|
|
16
|
+
kvCache: request.kvCache,
|
|
17
|
+
});
|
|
18
|
+
let stats;
|
|
19
|
+
let done = false;
|
|
20
|
+
let buffer = "";
|
|
21
|
+
while (!done) {
|
|
22
|
+
const result = await stream.next();
|
|
23
|
+
if (result.done) {
|
|
24
|
+
stats = result.value;
|
|
25
|
+
done = true;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
buffer += result.value;
|
|
29
|
+
if (request.stream) {
|
|
30
|
+
yield {
|
|
31
|
+
type: "completionStream",
|
|
32
|
+
token: result.value,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
yield {
|
|
38
|
+
type: "completionStream",
|
|
39
|
+
token: buffer,
|
|
40
|
+
done: true,
|
|
41
|
+
stats,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error("Error during completion stream:", error);
|
|
46
|
+
yield {
|
|
47
|
+
type: "completionStream",
|
|
48
|
+
token: "",
|
|
49
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DownloadAssetRequest, DownloadAssetResponse, ModelProgressUpdate } from "../../../schemas/index";
|
|
2
|
+
export declare function handleDownloadAsset(request: DownloadAssetRequest, progressCallback?: (update: ModelProgressUpdate) => void): Promise<DownloadAssetResponse>;
|
|
3
|
+
//# sourceMappingURL=download-asset.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { resolveModelPath } from "./load-model/resolve.js";
|
|
2
|
+
import path from "bare-path";
|
|
3
|
+
export async function handleDownloadAsset(request, progressCallback) {
|
|
4
|
+
const { assetSrc, seed } = request;
|
|
5
|
+
try {
|
|
6
|
+
const assetPath = await resolveModelPath(assetSrc, progressCallback, seed);
|
|
7
|
+
return {
|
|
8
|
+
type: "downloadAsset",
|
|
9
|
+
success: true,
|
|
10
|
+
assetId: path.basename(assetPath),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
console.error("Error downloading asset:", error);
|
|
15
|
+
return {
|
|
16
|
+
type: "downloadAsset",
|
|
17
|
+
success: false,
|
|
18
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { embed } from "../../bare/addons/llamacpp/index.js";
|
|
2
|
+
export async function handleEmbed(request) {
|
|
3
|
+
const { modelId, text } = request;
|
|
4
|
+
try {
|
|
5
|
+
const embedding = await embed({ modelId, text });
|
|
6
|
+
return {
|
|
7
|
+
type: "embed",
|
|
8
|
+
success: true,
|
|
9
|
+
embedding,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
console.error("Error during embedding:", error);
|
|
14
|
+
return {
|
|
15
|
+
type: "embed",
|
|
16
|
+
success: false,
|
|
17
|
+
embedding: [],
|
|
18
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { handleCompletionStream } from "./completion-stream";
|
|
2
|
+
import { handleDownloadAsset } from "./download-asset";
|
|
3
|
+
import { handleLoadModel } from "./load-model/index";
|
|
4
|
+
import { handleUnloadModel } from "./unload-model";
|
|
5
|
+
import { handleEmbed } from "./embed";
|
|
6
|
+
import { handleTranscribeStream } from "./transcribe-stream";
|
|
7
|
+
import { provideHandler } from "./provideHandler";
|
|
8
|
+
import { handleTranslate } from "./translate";
|
|
9
|
+
import { handleLoggingStream } from "./logging-stream";
|
|
10
|
+
import { handleRag } from "./rag";
|
|
11
|
+
export declare const handlers: {
|
|
12
|
+
completionStream: typeof handleCompletionStream;
|
|
13
|
+
downloadAsset: typeof handleDownloadAsset;
|
|
14
|
+
loadModel: typeof handleLoadModel;
|
|
15
|
+
unloadModel: typeof handleUnloadModel;
|
|
16
|
+
embed: typeof handleEmbed;
|
|
17
|
+
transcribeStream: typeof handleTranscribeStream;
|
|
18
|
+
provide: typeof provideHandler;
|
|
19
|
+
translate: typeof handleTranslate;
|
|
20
|
+
loggingStream: typeof handleLoggingStream;
|
|
21
|
+
rag: typeof handleRag;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { handleCompletionStream } from "./completion-stream.js";
|
|
2
|
+
import { handleDownloadAsset } from "./download-asset.js";
|
|
3
|
+
import { handleLoadModel } from "./load-model/index.js";
|
|
4
|
+
import { handleUnloadModel } from "./unload-model.js";
|
|
5
|
+
import { handleEmbed } from "./embed.js";
|
|
6
|
+
import { handleTranscribeStream } from "./transcribe-stream.js";
|
|
7
|
+
import { provideHandler } from "./provideHandler.js";
|
|
8
|
+
import { handleTranslate } from "./translate.js";
|
|
9
|
+
import { handleLoggingStream } from "./logging-stream.js";
|
|
10
|
+
import { handleRag } from "./rag.js";
|
|
11
|
+
export const handlers = {
|
|
12
|
+
completionStream: handleCompletionStream,
|
|
13
|
+
downloadAsset: handleDownloadAsset,
|
|
14
|
+
loadModel: handleLoadModel,
|
|
15
|
+
unloadModel: handleUnloadModel,
|
|
16
|
+
embed: handleEmbed,
|
|
17
|
+
transcribeStream: handleTranscribeStream,
|
|
18
|
+
provide: provideHandler,
|
|
19
|
+
translate: handleTranslate,
|
|
20
|
+
loggingStream: handleLoggingStream,
|
|
21
|
+
rag: handleRag,
|
|
22
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type DownloadEntry } from "../../../../schemas/index";
|
|
2
|
+
export declare const getActiveDownload: (key: string) => DownloadEntry | undefined;
|
|
3
|
+
export declare const registerDownload: (key: string, entry: DownloadEntry) => void;
|
|
4
|
+
export declare const unregisterDownload: (key: string) => void;
|
|
5
|
+
export declare const createHyperdriveDownloadKey: (hyperdriveKey: string, modelFileName: string) => string;
|
|
6
|
+
export declare const createHttpDownloadKey: (url: string) => string;
|
|
7
|
+
export declare const getAllActiveDownloads: () => Map<string, DownloadEntry>;
|
|
8
|
+
export declare const setClearCacheFlag: (downloadKey: string, clearCache: boolean) => void;
|
|
9
|
+
export declare const shouldClearCache: (downloadKey: string) => boolean;
|
|
10
|
+
export declare const clearClearCacheFlag: (downloadKey: string) => void;
|
|
11
|
+
export declare const createCancelFunction: (downloadKey: string, clearCache?: boolean) => () => void;
|
|
12
|
+
export declare const cancelAllDownloads: () => void;
|
|
13
|
+
export declare const getDownloadStats: () => {
|
|
14
|
+
activeCount: number;
|
|
15
|
+
downloads: ({
|
|
16
|
+
hyperdriveKey: string;
|
|
17
|
+
modelFileName: string;
|
|
18
|
+
key: string;
|
|
19
|
+
startTime: number;
|
|
20
|
+
duration: number;
|
|
21
|
+
type: "hyperdrive" | "http";
|
|
22
|
+
} | {
|
|
23
|
+
url: string;
|
|
24
|
+
modelPath: string;
|
|
25
|
+
key: string;
|
|
26
|
+
startTime: number;
|
|
27
|
+
duration: number;
|
|
28
|
+
type: "hyperdrive" | "http";
|
|
29
|
+
})[];
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=download-manager.d.ts.map
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import {} from "../../../../schemas/index.js";
|
|
2
|
+
import process from "bare-process";
|
|
3
|
+
const activeDownloads = new Map();
|
|
4
|
+
const clearCacheFlags = new Map();
|
|
5
|
+
export const getActiveDownload = (key) => activeDownloads.get(key);
|
|
6
|
+
export const registerDownload = (key, entry) => {
|
|
7
|
+
activeDownloads.set(key, entry);
|
|
8
|
+
registerCleanupHandlers();
|
|
9
|
+
};
|
|
10
|
+
export const unregisterDownload = (key) => {
|
|
11
|
+
activeDownloads.delete(key);
|
|
12
|
+
};
|
|
13
|
+
export const createHyperdriveDownloadKey = (hyperdriveKey, modelFileName) => `${hyperdriveKey}:${modelFileName}`;
|
|
14
|
+
export const createHttpDownloadKey = (url) => `http:${url}`;
|
|
15
|
+
export const getAllActiveDownloads = () => new Map(activeDownloads);
|
|
16
|
+
export const setClearCacheFlag = (downloadKey, clearCache) => {
|
|
17
|
+
if (clearCache) {
|
|
18
|
+
clearCacheFlags.set(downloadKey, true);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
clearCacheFlags.delete(downloadKey);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export const shouldClearCache = (downloadKey) => clearCacheFlags.get(downloadKey) ?? false;
|
|
25
|
+
export const clearClearCacheFlag = (downloadKey) => {
|
|
26
|
+
clearCacheFlags.delete(downloadKey);
|
|
27
|
+
};
|
|
28
|
+
export const createCancelFunction = (downloadKey, clearCache = false) => () => {
|
|
29
|
+
const entry = getActiveDownload(downloadKey);
|
|
30
|
+
if (!entry) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Set flag for the download handlers to check
|
|
34
|
+
setClearCacheFlag(downloadKey, clearCache);
|
|
35
|
+
entry.abortController.abort();
|
|
36
|
+
unregisterDownload(downloadKey);
|
|
37
|
+
};
|
|
38
|
+
export const cancelAllDownloads = () => {
|
|
39
|
+
console.log(`🧹 Cancelling ${activeDownloads.size} active downloads`);
|
|
40
|
+
Array.from(activeDownloads.keys()).forEach((key) => createCancelFunction(key)());
|
|
41
|
+
};
|
|
42
|
+
export const getDownloadStats = () => ({
|
|
43
|
+
activeCount: activeDownloads.size,
|
|
44
|
+
downloads: Array.from(activeDownloads.entries()).map(([key, entry]) => ({
|
|
45
|
+
key,
|
|
46
|
+
startTime: entry.startTime,
|
|
47
|
+
duration: Date.now() - entry.startTime,
|
|
48
|
+
type: entry.type,
|
|
49
|
+
...(entry.type === "hyperdrive"
|
|
50
|
+
? {
|
|
51
|
+
hyperdriveKey: entry.hyperdriveKey,
|
|
52
|
+
modelFileName: entry.modelFileName,
|
|
53
|
+
}
|
|
54
|
+
: {
|
|
55
|
+
url: entry.url,
|
|
56
|
+
modelPath: entry.modelPath,
|
|
57
|
+
}),
|
|
58
|
+
})),
|
|
59
|
+
});
|
|
60
|
+
// Register cleanup handlers for graceful shutdown
|
|
61
|
+
let cleanupRegistered = false;
|
|
62
|
+
let isCleaningUp = false;
|
|
63
|
+
const registerCleanupHandlers = () => {
|
|
64
|
+
if (cleanupRegistered)
|
|
65
|
+
return;
|
|
66
|
+
cleanupRegistered = true;
|
|
67
|
+
const cleanup = async () => {
|
|
68
|
+
if (isCleaningUp)
|
|
69
|
+
return;
|
|
70
|
+
isCleaningUp = true;
|
|
71
|
+
try {
|
|
72
|
+
const downloadPromises = Array.from(activeDownloads.values()).map((entry) => entry.promise.catch(() => { }));
|
|
73
|
+
cancelAllDownloads();
|
|
74
|
+
if (downloadPromises.length > 0) {
|
|
75
|
+
await Promise.allSettled(downloadPromises);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
console.error("❌ Error during download cleanup:", error);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
process.on("SIGTERM", () => {
|
|
83
|
+
void cleanup();
|
|
84
|
+
});
|
|
85
|
+
process.on("SIGINT", () => {
|
|
86
|
+
void cleanup();
|
|
87
|
+
});
|
|
88
|
+
};
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
import fs, { promises as fsPromises } from "bare-fs";
|
|
2
|
+
import { Readable } from "bare-stream";
|
|
3
|
+
import fetch from "bare-fetch";
|
|
4
|
+
import { AbortController } from "bare-abort-controller";
|
|
5
|
+
import { getModelsCacheDir, generateShortHash } from "../../../utils/index.js";
|
|
6
|
+
import { getActiveDownload, registerDownload, unregisterDownload, createHttpDownloadKey, shouldClearCache, clearClearCacheFlag, } from "./download-manager.js";
|
|
7
|
+
function extractFilenameFromUrl(url) {
|
|
8
|
+
// Parse URL to get the filename from the path
|
|
9
|
+
const urlParts = url.split("/");
|
|
10
|
+
const filename = urlParts[urlParts.length - 1] || "model.gguf";
|
|
11
|
+
// Remove query parameters if present
|
|
12
|
+
const cleanFilename = filename.split("?")[0] || "model.gguf";
|
|
13
|
+
return cleanFilename;
|
|
14
|
+
}
|
|
15
|
+
async function validateCachedFile(modelPath, url, signal) {
|
|
16
|
+
try {
|
|
17
|
+
await fsPromises.access(modelPath);
|
|
18
|
+
const localStats = await fsPromises.stat(modelPath);
|
|
19
|
+
const localSize = localStats.size;
|
|
20
|
+
// Get expected size from HEAD request
|
|
21
|
+
let expectedSize = 0;
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetch(url, {
|
|
24
|
+
method: "HEAD",
|
|
25
|
+
...(signal && { signal }),
|
|
26
|
+
});
|
|
27
|
+
expectedSize = parseInt(response.headers.get("content-length") || "0");
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.log(`⚠️ Could not get expected file size from HEAD request: ${String(error)}`);
|
|
31
|
+
console.log(`✅ Using cached HTTP model: ${modelPath}`);
|
|
32
|
+
return modelPath;
|
|
33
|
+
}
|
|
34
|
+
if (expectedSize > 0 && localSize !== expectedSize) {
|
|
35
|
+
console.log(`📥 Cached file size mismatch. Expected: ${expectedSize}, Found: ${localSize}. Re-downloading...`);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
console.log(`✅ Using cached HTTP model: ${modelPath}`);
|
|
39
|
+
return modelPath;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// File doesn't exist
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function performHttpDownload(url, modelPath, downloadKey, progressCallback, signal) {
|
|
47
|
+
if (signal?.aborted) {
|
|
48
|
+
throw new Error("Download cancelled");
|
|
49
|
+
}
|
|
50
|
+
console.log(`📥 Downloading model from HTTP: ${url}`);
|
|
51
|
+
// Check if file exists for resuming
|
|
52
|
+
let startOffset = 0;
|
|
53
|
+
let downloadedBytes = 0;
|
|
54
|
+
try {
|
|
55
|
+
const existingStats = await fsPromises.stat(modelPath);
|
|
56
|
+
startOffset = existingStats.size;
|
|
57
|
+
downloadedBytes = startOffset;
|
|
58
|
+
console.log(`📥 Resuming download from byte ${startOffset}`);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
console.log(`📥 Starting fresh download`);
|
|
62
|
+
}
|
|
63
|
+
// Prepare headers for resume if needed
|
|
64
|
+
const headers = {
|
|
65
|
+
"User-Agent": "qvac-sdk",
|
|
66
|
+
};
|
|
67
|
+
if (startOffset > 0) {
|
|
68
|
+
headers["Range"] = `bytes=${startOffset}-`;
|
|
69
|
+
}
|
|
70
|
+
// Make the fetch request
|
|
71
|
+
const response = await fetch(url, {
|
|
72
|
+
method: "GET",
|
|
73
|
+
headers,
|
|
74
|
+
...(signal && { signal }),
|
|
75
|
+
// bare-fetch automatically follows redirects
|
|
76
|
+
});
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
// Check if it's a 416 (Range Not Satisfiable) - file already complete
|
|
79
|
+
if (response.status === 416 && startOffset > 0) {
|
|
80
|
+
console.log(`✅ File already completely downloaded`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Check if server doesn't support range requests
|
|
84
|
+
if (response.status === 200 && startOffset > 0) {
|
|
85
|
+
console.log(`⚠️ Server doesn't support resume, starting fresh download`);
|
|
86
|
+
startOffset = 0;
|
|
87
|
+
downloadedBytes = 0;
|
|
88
|
+
// Retry without Range header
|
|
89
|
+
const freshResponse = await fetch(url, {
|
|
90
|
+
method: "GET",
|
|
91
|
+
headers: {
|
|
92
|
+
"User-Agent": "qvac-sdk/1.0",
|
|
93
|
+
},
|
|
94
|
+
...(signal && { signal }),
|
|
95
|
+
});
|
|
96
|
+
if (!freshResponse.ok) {
|
|
97
|
+
throw new Error(`HTTP error: ${freshResponse.status} ${freshResponse.statusText}`);
|
|
98
|
+
}
|
|
99
|
+
// Use the fresh response
|
|
100
|
+
Object.assign(response, freshResponse);
|
|
101
|
+
}
|
|
102
|
+
else if (response.status !== 206) {
|
|
103
|
+
// 206 is Partial Content (successful resume)
|
|
104
|
+
throw new Error(`HTTP error: ${response.status} ${response.statusText}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Get total size from headers
|
|
108
|
+
let totalBytes = 0;
|
|
109
|
+
const contentLength = response.headers.get("content-length");
|
|
110
|
+
if (response.status === 206) {
|
|
111
|
+
// For resumed downloads, parse Content-Range header
|
|
112
|
+
const contentRange = response.headers.get("content-range");
|
|
113
|
+
if (contentRange) {
|
|
114
|
+
const match = contentRange.match(/bytes \d+-\d+\/(\d+)/);
|
|
115
|
+
if (match && match[1]) {
|
|
116
|
+
totalBytes = parseInt(match[1]);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// For fresh downloads
|
|
122
|
+
totalBytes = contentLength ? parseInt(contentLength) : 0;
|
|
123
|
+
}
|
|
124
|
+
console.log(`📏 Total size: ${totalBytes} bytes (${(totalBytes / 1024 / 1024).toFixed(2)} MB)`);
|
|
125
|
+
// Create write stream (append if resuming)
|
|
126
|
+
const writeStreamOptions = startOffset > 0 && response.status === 206 ? { flags: "a" } : {};
|
|
127
|
+
const writeStream = fs.createWriteStream(modelPath, writeStreamOptions);
|
|
128
|
+
// Get the response body
|
|
129
|
+
const body = response.body;
|
|
130
|
+
if (!body) {
|
|
131
|
+
throw new Error("No response body received");
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
// Check if body has pipe method (it's a Node/Bare stream)
|
|
135
|
+
const isReadable = body instanceof Readable ||
|
|
136
|
+
(typeof body.pipe === "function" &&
|
|
137
|
+
typeof body.on === "function");
|
|
138
|
+
if (isReadable) {
|
|
139
|
+
// Track progress by intercepting data events if possible
|
|
140
|
+
body.on("data", (chunk) => {
|
|
141
|
+
downloadedBytes += chunk.length;
|
|
142
|
+
if (progressCallback) {
|
|
143
|
+
progressCallback({
|
|
144
|
+
type: "modelProgress",
|
|
145
|
+
downloaded: downloadedBytes,
|
|
146
|
+
total: totalBytes,
|
|
147
|
+
percentage: totalBytes > 0 ? (downloadedBytes / totalBytes) * 100 : 0,
|
|
148
|
+
downloadKey,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
// Pipe directly to file
|
|
153
|
+
body.pipe(writeStream);
|
|
154
|
+
// Wait for download to complete
|
|
155
|
+
await new Promise((resolve, reject) => {
|
|
156
|
+
// Handle abort signal
|
|
157
|
+
const abortHandler = () => {
|
|
158
|
+
const error = new Error("Download cancelled");
|
|
159
|
+
body.destroy();
|
|
160
|
+
writeStream.destroy();
|
|
161
|
+
reject(error);
|
|
162
|
+
};
|
|
163
|
+
if (signal) {
|
|
164
|
+
signal.addEventListener("abort", abortHandler);
|
|
165
|
+
}
|
|
166
|
+
writeStream.on("finish", () => {
|
|
167
|
+
console.log(`✅ Model downloaded successfully to ${modelPath}`);
|
|
168
|
+
if (signal) {
|
|
169
|
+
signal.removeEventListener("abort", abortHandler);
|
|
170
|
+
}
|
|
171
|
+
resolve(undefined);
|
|
172
|
+
});
|
|
173
|
+
writeStream.on("error", reject);
|
|
174
|
+
body.on("error", reject);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
else if (body[Symbol.asyncIterator]) {
|
|
178
|
+
// Body is an async iterable (for await...of)
|
|
179
|
+
for await (const chunk of body) {
|
|
180
|
+
// Check if abort signal is triggered
|
|
181
|
+
if (signal && signal.aborted) {
|
|
182
|
+
writeStream.destroy();
|
|
183
|
+
throw new Error("Download cancelled");
|
|
184
|
+
}
|
|
185
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
186
|
+
downloadedBytes += buffer.length;
|
|
187
|
+
if (progressCallback) {
|
|
188
|
+
progressCallback({
|
|
189
|
+
type: "modelProgress",
|
|
190
|
+
downloaded: downloadedBytes,
|
|
191
|
+
total: totalBytes,
|
|
192
|
+
percentage: totalBytes > 0 ? (downloadedBytes / totalBytes) * 100 : 0,
|
|
193
|
+
downloadKey,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
// Write chunk to file
|
|
197
|
+
await new Promise((resolve, reject) => {
|
|
198
|
+
writeStream.write(buffer, (err) => {
|
|
199
|
+
if (err)
|
|
200
|
+
reject(new Error(err instanceof Error ? err.message : String(err)));
|
|
201
|
+
else
|
|
202
|
+
resolve();
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// Close the write stream
|
|
207
|
+
await new Promise((resolve, reject) => {
|
|
208
|
+
writeStream.end(() => {
|
|
209
|
+
console.log(`✅ Model downloaded successfully to ${modelPath}`);
|
|
210
|
+
resolve();
|
|
211
|
+
});
|
|
212
|
+
writeStream.on("error", reject);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
// Fallback: try to use getReader() if it's a ReadableStream
|
|
217
|
+
const readableStreamBody = body;
|
|
218
|
+
const reader = readableStreamBody.getReader
|
|
219
|
+
? readableStreamBody.getReader()
|
|
220
|
+
: null;
|
|
221
|
+
if (reader) {
|
|
222
|
+
try {
|
|
223
|
+
while (true) {
|
|
224
|
+
const { done, value } = await reader.read();
|
|
225
|
+
if (done)
|
|
226
|
+
break;
|
|
227
|
+
const buffer = Buffer.from(value);
|
|
228
|
+
downloadedBytes += buffer.length;
|
|
229
|
+
if (progressCallback) {
|
|
230
|
+
progressCallback({
|
|
231
|
+
type: "modelProgress",
|
|
232
|
+
downloaded: downloadedBytes,
|
|
233
|
+
total: totalBytes,
|
|
234
|
+
percentage: totalBytes > 0 ? (downloadedBytes / totalBytes) * 100 : 0,
|
|
235
|
+
downloadKey,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
// Write chunk to file
|
|
239
|
+
await new Promise((resolve, reject) => {
|
|
240
|
+
writeStream.write(buffer, (err) => {
|
|
241
|
+
if (err)
|
|
242
|
+
reject(new Error(err instanceof Error ? err.message : String(err)));
|
|
243
|
+
else
|
|
244
|
+
resolve();
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
reader.releaseLock();
|
|
251
|
+
}
|
|
252
|
+
// Close the write stream
|
|
253
|
+
await new Promise((resolve, reject) => {
|
|
254
|
+
writeStream.end(() => {
|
|
255
|
+
console.log(`✅ Model downloaded successfully to ${modelPath}`);
|
|
256
|
+
resolve();
|
|
257
|
+
});
|
|
258
|
+
writeStream.on("error", reject);
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
throw new Error("Response body is not readable");
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
writeStream.destroy();
|
|
268
|
+
console.error("Error during download:", error instanceof Error ? error.message : String(error));
|
|
269
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
export async function downloadModelFromHttp(url, progressCallback) {
|
|
273
|
+
const downloadKey = createHttpDownloadKey(url);
|
|
274
|
+
// Check if already downloading
|
|
275
|
+
const existing = getActiveDownload(downloadKey);
|
|
276
|
+
if (existing) {
|
|
277
|
+
console.log(`📥 Reusing existing download for: ${downloadKey}`);
|
|
278
|
+
return existing.promise;
|
|
279
|
+
}
|
|
280
|
+
const cacheDir = getModelsCacheDir();
|
|
281
|
+
const sourceHash = generateShortHash(url);
|
|
282
|
+
const filename = extractFilenameFromUrl(url);
|
|
283
|
+
const modelPath = `${cacheDir}/${sourceHash}_${filename}`;
|
|
284
|
+
// Create managed download with AbortController
|
|
285
|
+
const abortController = new AbortController();
|
|
286
|
+
const downloadPromise = (async () => {
|
|
287
|
+
try {
|
|
288
|
+
// Check if already cached
|
|
289
|
+
const cachedPath = await validateCachedFile(modelPath, url, abortController.signal);
|
|
290
|
+
if (cachedPath) {
|
|
291
|
+
return cachedPath;
|
|
292
|
+
}
|
|
293
|
+
// Download the file
|
|
294
|
+
await performHttpDownload(url, modelPath, downloadKey, progressCallback, abortController.signal);
|
|
295
|
+
return modelPath;
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
console.error("❌ Error downloading model:", error instanceof Error ? error.message : String(error));
|
|
299
|
+
// Check if we should delete the partial file (clearCache was requested)
|
|
300
|
+
if (error instanceof Error && error.message === "Download cancelled") {
|
|
301
|
+
if (shouldClearCache(downloadKey)) {
|
|
302
|
+
console.log("🗑️ Clearing cache - deleting partial file");
|
|
303
|
+
try {
|
|
304
|
+
await fsPromises.unlink(modelPath);
|
|
305
|
+
console.log(`✅ Deleted partial file: ${modelPath}`);
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
// Ignore cleanup errors
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
console.log("📥 Download paused - partial file preserved for resume");
|
|
313
|
+
}
|
|
314
|
+
clearClearCacheFlag(downloadKey);
|
|
315
|
+
}
|
|
316
|
+
const errorToThrow = error instanceof Error ? error : new Error(String(error));
|
|
317
|
+
throw errorToThrow;
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
// Cleanup from download manager
|
|
321
|
+
unregisterDownload(downloadKey);
|
|
322
|
+
}
|
|
323
|
+
})();
|
|
324
|
+
// Register download
|
|
325
|
+
const downloadEntry = {
|
|
326
|
+
key: downloadKey,
|
|
327
|
+
promise: downloadPromise,
|
|
328
|
+
abortController,
|
|
329
|
+
startTime: Date.now(),
|
|
330
|
+
type: "http",
|
|
331
|
+
url,
|
|
332
|
+
modelPath,
|
|
333
|
+
...(progressCallback && { onProgress: progressCallback }),
|
|
334
|
+
};
|
|
335
|
+
registerDownload(downloadKey, downloadEntry);
|
|
336
|
+
return downloadPromise;
|
|
337
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ModelProgressUpdate } from "../../../../schemas/index";
|
|
2
|
+
export declare function deleteCorestoreDirectory(corestoreDir: string): Promise<void>;
|
|
3
|
+
export declare function downloadModelFromHyperdrive(hyperdriveKey: string, modelFileName: string, seed?: boolean, progressCallback?: (progress: ModelProgressUpdate) => void, expectedChecksum?: string): Promise<string>;
|
|
4
|
+
//# sourceMappingURL=hyperdrive.d.ts.map
|