@qvac/sdk 0.13.4 → 0.14.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/NOTICE +95 -1151
- package/README.md +1 -2
- package/bare-imports.json +0 -5
- package/dist/client/api/bci-transcribe.js +2 -1
- package/dist/client/api/download-asset.js +2 -1
- package/dist/client/api/finetune.js +6 -5
- package/dist/client/api/index.d.ts +1 -0
- package/dist/client/api/index.js +1 -0
- package/dist/client/api/load-model.d.ts +11 -8
- package/dist/client/api/load-model.js +6 -6
- package/dist/client/api/subscribe-logs.d.ts +28 -0
- package/dist/client/api/subscribe-logs.js +43 -0
- package/dist/client/api/text-to-speech.js +2 -1
- package/dist/client/config-loader/config-utils.js +2 -4
- package/dist/client/config-loader/resolve-config.bare.js +4 -3
- package/dist/client/parse-input.d.ts +3 -0
- package/dist/client/parse-input.js +14 -0
- package/dist/client/rpc/node-rpc-client.js +8 -2
- package/dist/client/rpc/rpc-client.js +39 -7
- package/dist/commands/bundle/constants.js +2 -1
- package/dist/examples/bci/bci-filesystem-streaming.js +14 -14
- package/dist/examples/bci/bci-filesystem.js +17 -13
- package/dist/examples/cache-management.js +38 -38
- package/dist/examples/cancel-by-request-id.js +9 -9
- package/dist/examples/completion-events.js +20 -14
- package/dist/examples/completion-stop-reason.js +13 -7
- package/dist/examples/concurrent-completion-collision.js +7 -7
- package/dist/examples/config-reload.js +7 -8
- package/dist/examples/default-config-usage.js +4 -4
- package/dist/examples/delegated-inference/composite.js +14 -10
- package/dist/examples/delegated-inference/consumer-profiled.js +13 -13
- package/dist/examples/delegated-inference/consumer.js +16 -12
- package/dist/examples/delegated-inference/provider.js +12 -12
- package/dist/examples/diffusion-esrgan-upscale.js +19 -15
- package/dist/examples/diffusion-flux2-klein-img2img.js +16 -11
- package/dist/examples/diffusion-flux2-klein.js +14 -9
- package/dist/examples/diffusion-img2img.js +9 -10
- package/dist/examples/diffusion-img2vid.js +17 -12
- package/dist/examples/diffusion-simple.js +1 -1
- package/dist/examples/diffusion-txt2img.js +14 -9
- package/dist/examples/diffusion-txt2vid.js +15 -10
- package/dist/examples/download-with-blind-relays.js +16 -21
- package/dist/examples/download-with-cancel.js +15 -16
- package/dist/examples/embed-multi-gpu.js +3 -4
- package/dist/examples/embed-p2p.js +11 -7
- package/dist/examples/finetune/llamacpp-finetune.js +7 -7
- package/dist/examples/kv-cache-cleanup.js +35 -35
- package/dist/examples/kv-cache-custom-key.js +24 -24
- package/dist/examples/kv-cache-example.js +9 -9
- package/dist/examples/llamacpp-cache.js +18 -14
- package/dist/examples/llamacpp-dynamic-tools.js +15 -9
- package/dist/examples/llamacpp-filesystem.js +15 -9
- package/dist/examples/llamacpp-http.js +12 -10
- package/dist/examples/llamacpp-multi-gpu.js +4 -4
- package/dist/examples/llamacpp-multimodal.js +13 -9
- package/dist/examples/llamacpp-p2p.js +8 -4
- package/dist/examples/llamacpp-sharded.js +5 -5
- package/dist/examples/llamacpp-structured-output.js +15 -9
- package/dist/examples/logging-file-transport.js +3 -3
- package/dist/examples/logging-global.d.ts +2 -0
- package/dist/examples/logging-global.js +34 -0
- package/dist/examples/logging-streaming.js +7 -10
- package/dist/examples/mcp-websearch.js +24 -18
- package/dist/examples/multi-model-demo.js +17 -11
- package/dist/examples/ocr-fasttext.js +14 -16
- package/dist/examples/parallel-download.js +7 -7
- package/dist/examples/plugins.js +40 -28
- package/dist/examples/profiling/basic.js +16 -10
- package/dist/examples/profiling/per-call.js +17 -11
- package/dist/examples/quickstart.bare.d.ts +2 -0
- package/dist/examples/quickstart.bare.js +18 -0
- package/dist/examples/quickstart.js +10 -3
- package/dist/examples/rag/rag-chromadb.js +18 -14
- package/dist/examples/rag/rag-hyperdb/cancellation.js +17 -14
- package/dist/examples/rag/rag-hyperdb/ingest.js +14 -12
- package/dist/examples/rag/rag-hyperdb/pipeline.js +19 -17
- package/dist/examples/rag/rag-hyperdb/workspaces.js +31 -27
- package/dist/examples/rag/rag-lancedb.js +12 -8
- package/dist/examples/rag/rag-sqlite.js +11 -7
- package/dist/examples/registry-query.js +17 -17
- package/dist/examples/seed-p2p.js +10 -6
- package/dist/examples/suspend-resume.js +20 -16
- package/dist/examples/tools/llamacpp-native-tools.js +24 -18
- package/dist/examples/tools/llamacpp-tools-gemma4.js +14 -8
- package/dist/examples/tools/llamacpp-tools-harmony-multiturn.js +20 -14
- package/dist/examples/tools/llamacpp-tools-pythonic.js +14 -8
- package/dist/examples/tools/llamacpp-tools-qwen35.js +14 -8
- package/dist/examples/transcription/parakeet-ctc-filesystem.js +12 -9
- package/dist/examples/transcription/parakeet-microphone-record.js +15 -9
- package/dist/examples/transcription/parakeet-microphone-stream.js +15 -9
- package/dist/examples/transcription/parakeet-sortformer-streaming.js +12 -6
- package/dist/examples/transcription/parakeet-sortformer.js +3 -5
- package/dist/examples/transcription/parakeet-tdt-filesystem.js +13 -10
- package/dist/examples/transcription/whispercpp-filesystem-streaming.js +16 -17
- package/dist/examples/transcription/whispercpp-filesystem.js +14 -10
- package/dist/examples/transcription/whispercpp-microphone-conversation.js +10 -10
- package/dist/examples/transcription/whispercpp-microphone-record.js +6 -6
- package/dist/examples/transcription/whispercpp-prompt.js +14 -10
- package/dist/examples/translation/translation-bergamot-batch.js +11 -7
- package/dist/examples/translation/translation-bergamot-pivot.js +13 -9
- package/dist/examples/translation/translation-bergamot.js +8 -4
- package/dist/examples/translation/translation-indic.js +8 -4
- package/dist/examples/translation/translation-llm-afriquegemma.js +7 -3
- package/dist/examples/translation/translation-llm-context.js +8 -4
- package/dist/examples/translation/translation-llm.js +7 -3
- package/dist/examples/translation/translation-stream.js +4 -4
- package/dist/examples/tts/chatterbox.js +19 -11
- package/dist/examples/tts/llm-to-tts-streaming.js +27 -14
- package/dist/examples/tts/supertonic-multilingual.js +18 -14
- package/dist/examples/tts/supertonic.js +19 -15
- package/dist/examples/tts/utils.js +1 -1
- package/dist/examples/vla-pi05.js +18 -14
- package/dist/examples/vla-smolvla.js +18 -14
- package/dist/examples/voice-assistant/voice-assistant.js +12 -12
- package/dist/index.d.ts +3 -4
- package/dist/index.js +3 -4
- package/dist/logging/client-logger.js +2 -1
- package/dist/logging/index.d.ts +1 -1
- package/dist/logging/index.js +1 -1
- package/dist/logging/namespaces.d.ts +1 -0
- package/dist/logging/namespaces.js +2 -0
- package/dist/logging/server-logger.js +1 -4
- package/dist/logging/utils.js +6 -1
- package/dist/models/registry/index.d.ts +17 -0
- package/dist/models/registry/index.js +20 -1
- package/dist/models/registry/models.d.ts +1062 -38
- package/dist/models/registry/models.js +3546 -2490
- package/dist/pear/pre.js +2 -2
- package/dist/schemas/bci-config.d.ts +37 -0
- package/dist/schemas/bci-config.js +2 -0
- package/dist/schemas/bci.d.ts +2 -0
- package/dist/schemas/common.d.ts +171 -94
- package/dist/schemas/completion-stream.d.ts +6 -3
- package/dist/schemas/completion-stream.js +10 -2
- package/dist/schemas/download-asset.d.ts +5 -5
- package/dist/schemas/engine-addon-map.d.ts +1 -1
- package/dist/schemas/engine-addon-map.js +6 -3
- package/dist/schemas/error.js +6 -1
- package/dist/schemas/llamacpp-config.d.ts +27 -8
- package/dist/schemas/llamacpp-config.js +19 -2
- package/dist/schemas/load-model.d.ts +4170 -570
- package/dist/schemas/load-model.js +85 -26
- package/dist/schemas/logging-stream.js +7 -1
- package/dist/schemas/model-src-utils.d.ts +6 -6
- package/dist/schemas/model-types.d.ts +14 -15
- package/dist/schemas/model-types.js +10 -11
- package/dist/schemas/ocr.d.ts +10 -8
- package/dist/schemas/ocr.js +8 -6
- package/dist/schemas/plugin.d.ts +6 -5
- package/dist/schemas/plugin.js +4 -4
- package/dist/schemas/rag.d.ts +4 -4
- package/dist/schemas/registry.d.ts +8 -8
- package/dist/schemas/registry.js +1 -1
- package/dist/schemas/reload-config.d.ts +6 -6
- package/dist/schemas/sdcpp-config.d.ts +12 -12
- package/dist/schemas/sdk-config.d.ts +171 -117
- package/dist/schemas/sdk-config.js +5 -5
- package/dist/schemas/sdk-errors-client.d.ts +1 -0
- package/dist/schemas/sdk-errors-client.js +7 -2
- package/dist/schemas/text-to-speech.d.ts +157 -13
- package/dist/schemas/text-to-speech.js +70 -7
- package/dist/schemas/transcription-config.d.ts +5 -1
- package/dist/schemas/transcription-config.js +2 -0
- package/dist/schemas/transcription.d.ts +3 -0
- package/dist/schemas/transcription.js +2 -1
- package/dist/schemas/translate.d.ts +6 -6
- package/dist/schemas/translate.js +2 -3
- package/dist/schemas/translation-config.d.ts +20 -20
- package/dist/server/bare/hyperswarm.js +3 -3
- package/dist/server/bare/ops/transcribe.js +46 -15
- package/dist/server/bare/plugins/bci-whispercpp-transcription/args.d.ts +3 -0
- package/dist/server/bare/plugins/bci-whispercpp-transcription/args.js +13 -0
- package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.d.ts +41 -0
- package/dist/server/bare/plugins/bci-whispercpp-transcription/plugin.js +6 -11
- package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.d.ts +75 -0
- package/dist/server/bare/plugins/bci-whispercpp-transcription/resolve-config.js +11 -0
- package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.d.ts +16 -10
- package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/plugin.js +25 -18
- package/dist/server/bare/plugins/index.d.ts +1 -1
- package/dist/server/bare/plugins/index.js +1 -1
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.d.ts +10 -0
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stats.js +29 -0
- package/dist/server/bare/plugins/llamacpp-completion/ops/completion-stream.js +4 -22
- package/dist/server/bare/plugins/llamacpp-completion/plugin.d.ts +15 -7
- package/dist/server/bare/plugins/nmtcpp-translation/plugin.d.ts +7 -7
- package/dist/server/bare/plugins/parakeet-transcription/plugin.d.ts +2 -0
- package/dist/server/bare/plugins/sdcpp-generation/plugin.d.ts +10 -10
- package/dist/server/bare/plugins/tts-ggml/plugin.d.ts +14 -8
- package/dist/server/bare/plugins/tts-ggml/plugin.js +12 -0
- package/dist/server/bare/plugins/whispercpp-transcription/plugin.d.ts +3 -1
- package/dist/server/bare/registry/logging-stream-registry.d.ts +4 -2
- package/dist/server/bare/registry/logging-stream-registry.js +12 -7
- package/dist/server/bare/registry/model-config-utils.js +2 -2
- package/dist/server/bare/registry/registry-client.js +1 -1
- package/dist/server/bare/runtime-lifecycle.d.ts +9 -0
- package/dist/server/bare/runtime-lifecycle.js +24 -0
- package/dist/server/bare/types/addon-responses.d.ts +1 -0
- package/dist/server/env.js +7 -10
- package/dist/server/plugins/registry.js +2 -4
- package/dist/server/rpc/handlers/load-model/handler.js +2 -4
- package/dist/server/rpc/handlers/load-model/http.js +253 -51
- package/dist/server/rpc/handlers/logging-stream.js +4 -2
- package/dist/server/rpc/handlers/plugin-invoke.js +5 -16
- package/dist/server/utils/completion-normalizer.js +13 -4
- package/dist/server/utils/worker-lock.js +5 -5
- package/dist/server/worker-core.d.ts +1 -1
- package/dist/server/worker-core.js +28 -18
- package/dist/utils/errors-client.d.ts +3 -0
- package/dist/utils/errors-client.js +5 -0
- package/dist/utils/errors-server.d.ts +2 -0
- package/dist/utils/errors-server.js +3 -0
- package/dist/utils/zod-error.d.ts +3 -0
- package/dist/utils/zod-error.js +4 -0
- package/package.json +21 -24
- package/dist/polyfills/bare-globals.d.ts +0 -2
- package/dist/polyfills/bare-globals.js +0 -4
- package/dist/polyfills/bare-globals.noop.d.ts +0 -2
- package/dist/polyfills/bare-globals.noop.js +0 -1
- /package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/ops/ocr-stream.d.ts +0 -0
- /package/dist/server/bare/plugins/{onnx-ocr → ggml-ocr}/ops/ocr-stream.js +0 -0
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { completion, LLAMA_3_2_1B_INST_Q4_0, loadModel, close, } from "@qvac/sdk";
|
|
2
2
|
const providerPublicKey = process.argv[2];
|
|
3
3
|
if (!providerPublicKey) {
|
|
4
|
-
console.error("
|
|
4
|
+
console.error("✖ Provider public key is required. Usage: node consumer.ts <provider-public-key> [consumer-seed]");
|
|
5
5
|
process.exit(1);
|
|
6
6
|
}
|
|
7
7
|
try {
|
|
8
8
|
// Optional: Consumer seed for deterministic consumer identity (for firewall testing)
|
|
9
9
|
const consumerSeed = process.argv[3];
|
|
10
10
|
process.env["QVAC_HYPERSWARM_SEED"] = consumerSeed;
|
|
11
|
-
console.log(
|
|
12
|
-
console.log(
|
|
11
|
+
console.log(`▸ Testing delegated inference`);
|
|
12
|
+
console.log(`▸ Provider: ${providerPublicKey}`);
|
|
13
13
|
if (consumerSeed) {
|
|
14
|
-
console.log(
|
|
14
|
+
console.log(`▸ Consumer seed: ${consumerSeed.substring(0, 16)}... (deterministic identity)`);
|
|
15
15
|
}
|
|
16
16
|
else {
|
|
17
|
-
console.log(
|
|
17
|
+
console.log(`▸ No consumer seed provided (random identity)`);
|
|
18
18
|
}
|
|
19
19
|
const modelId = await loadModel({
|
|
20
20
|
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
@@ -28,24 +28,28 @@ try {
|
|
|
28
28
|
fallbackToLocal: true, // Optional: Fall back to local inference if delegation fails
|
|
29
29
|
// forceNewConnection: true, // Optional: Force a new connection instead of reusing cached one
|
|
30
30
|
},
|
|
31
|
-
onProgress: (
|
|
32
|
-
|
|
31
|
+
onProgress: (p) => {
|
|
32
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
33
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
34
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
35
|
+
if (p.percentage >= 100)
|
|
36
|
+
process.stderr.write("\n");
|
|
33
37
|
},
|
|
34
38
|
});
|
|
35
|
-
console.log(
|
|
39
|
+
console.log(`▸ Delegated model registered: ${modelId}`);
|
|
36
40
|
const response = completion({
|
|
37
41
|
modelId,
|
|
38
42
|
history: [{ role: "user", content: "Hello!" }],
|
|
39
43
|
stream: true,
|
|
40
44
|
});
|
|
41
45
|
for await (const token of response.tokenStream) {
|
|
42
|
-
|
|
46
|
+
process.stdout.write(token);
|
|
43
47
|
}
|
|
44
|
-
console.log("
|
|
45
|
-
console.log("
|
|
48
|
+
console.log("\n▸ Stats:", await response.stats);
|
|
49
|
+
console.log("▸ Delegation infrastructure working! Server correctly detected and routed the delegated request.");
|
|
46
50
|
void close();
|
|
47
51
|
}
|
|
48
52
|
catch (error) {
|
|
49
|
-
console.error("
|
|
53
|
+
console.error("✖", error);
|
|
50
54
|
process.exit(1);
|
|
51
55
|
}
|
|
@@ -6,10 +6,10 @@ if (seed) {
|
|
|
6
6
|
}
|
|
7
7
|
// Optional: Consumer public key for firewall (allow only this consumer)
|
|
8
8
|
const allowedConsumerPublicKey = process.argv[3];
|
|
9
|
-
console.log(
|
|
9
|
+
console.log(`▸ Starting provider service...`);
|
|
10
10
|
try {
|
|
11
11
|
if (allowedConsumerPublicKey) {
|
|
12
|
-
console.log(
|
|
12
|
+
console.log(`▸ Firewall enabled: only allowing consumer ${allowedConsumerPublicKey}`);
|
|
13
13
|
}
|
|
14
14
|
const response = await startQVACProvider({
|
|
15
15
|
firewall: allowedConsumerPublicKey
|
|
@@ -19,34 +19,34 @@ try {
|
|
|
19
19
|
}
|
|
20
20
|
: undefined,
|
|
21
21
|
});
|
|
22
|
-
console.log("
|
|
23
|
-
console.log("
|
|
22
|
+
console.log("▸ Provider service started successfully!");
|
|
23
|
+
console.log("▸ Provider is now available for delegated inference requests");
|
|
24
24
|
console.log("");
|
|
25
|
-
console.log("
|
|
26
|
-
console.log(
|
|
25
|
+
console.log("▸ Connection Details:");
|
|
26
|
+
console.log(`▸ Provider Public Key: ${response.publicKey}`);
|
|
27
27
|
console.log("");
|
|
28
|
-
console.log("
|
|
28
|
+
console.log("▸ Consumer command:");
|
|
29
29
|
console.log(` node consumer.ts ${response.publicKey}`);
|
|
30
30
|
console.log("");
|
|
31
|
-
console.log("
|
|
31
|
+
console.log("▸ To reproduce this provider identity:");
|
|
32
32
|
console.log(` node provider.ts ${seed || "<random-seed>"}`);
|
|
33
33
|
if (!seed) {
|
|
34
34
|
console.log(" (Note: seed was random this time, set one for reproducible identity)");
|
|
35
35
|
}
|
|
36
36
|
console.log("");
|
|
37
|
-
console.log("
|
|
37
|
+
console.log("▸ For firewall testing:");
|
|
38
38
|
console.log(" 1. Generate a consumer seed (64-char hex)");
|
|
39
39
|
console.log(" 2. Get consumer public key: getConsumerPublicKey(consumerSeed)");
|
|
40
40
|
console.log(" 3. Restart provider with consumer public key as 2nd argument");
|
|
41
41
|
console.log(` 4. Run consumer with: node consumer.ts ${response.publicKey} <consumer-seed>`);
|
|
42
|
-
console.log("
|
|
42
|
+
console.log("▸ Provider is running... Press Ctrl+C to stop");
|
|
43
43
|
process.on("SIGINT", () => {
|
|
44
|
-
console.log("\n
|
|
44
|
+
console.log("\n▸ Provider service stopped");
|
|
45
45
|
process.exit(0);
|
|
46
46
|
});
|
|
47
47
|
process.stdin.resume();
|
|
48
48
|
}
|
|
49
49
|
catch (error) {
|
|
50
|
-
console.error("
|
|
50
|
+
console.error("✖", error);
|
|
51
51
|
process.exit(1);
|
|
52
52
|
}
|
|
@@ -15,7 +15,7 @@ const negative_prompt = "blurry, low quality, watermark, text";
|
|
|
15
15
|
const outputDir = outputDirArg ?? ".";
|
|
16
16
|
const seed = 42;
|
|
17
17
|
try {
|
|
18
|
-
console.log("Loading SD 2.1 + ESRGAN upscaler...");
|
|
18
|
+
console.log("▸ Loading SD 2.1 + ESRGAN upscaler...");
|
|
19
19
|
const modelId = await loadModel({
|
|
20
20
|
modelSrc: SD_V2_1_1B_Q8_0,
|
|
21
21
|
modelConfig: {
|
|
@@ -26,9 +26,15 @@ try {
|
|
|
26
26
|
tile_size: 128,
|
|
27
27
|
},
|
|
28
28
|
},
|
|
29
|
-
onProgress: (p) =>
|
|
29
|
+
onProgress: (p) => {
|
|
30
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
31
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
32
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
33
|
+
if (p.percentage >= 100)
|
|
34
|
+
process.stderr.write("\n");
|
|
35
|
+
},
|
|
30
36
|
});
|
|
31
|
-
console.log(
|
|
37
|
+
console.log(`▸ Model loaded: ${modelId}`);
|
|
32
38
|
// Source size is intentionally small — each ESRGAN repeat multiplies dimensions.
|
|
33
39
|
const baseParams = {
|
|
34
40
|
modelId,
|
|
@@ -40,37 +46,35 @@ try {
|
|
|
40
46
|
cfg_scale: 7.5,
|
|
41
47
|
seed,
|
|
42
48
|
};
|
|
43
|
-
console.log(
|
|
49
|
+
console.log(`▸ Generating ESRGAN x4 upscale: "${prompt}"`);
|
|
44
50
|
const single = diffusion({ ...baseParams, upscale: true });
|
|
45
51
|
for await (const { step, totalSteps } of single.progressStream) {
|
|
46
|
-
|
|
52
|
+
console.log(`▸ step ${step}/${totalSteps}`);
|
|
47
53
|
}
|
|
48
|
-
console.log();
|
|
49
54
|
const singleBuffers = await single.outputs;
|
|
50
55
|
for (let i = 0; i < singleBuffers.length; i++) {
|
|
51
56
|
const out = path.join(outputDir, `sd2_esrgan_x4_seed${seed}_${i}.png`);
|
|
52
57
|
fs.writeFileSync(out, singleBuffers[i]);
|
|
53
|
-
console.log(
|
|
58
|
+
console.log(`▸ Saved ${out}`);
|
|
54
59
|
}
|
|
55
|
-
console.log("Stats:", await single.stats);
|
|
56
|
-
console.log("
|
|
60
|
+
console.log("▸ Stats:", await single.stats);
|
|
61
|
+
console.log("▸ Generating ESRGAN two-pass x16 upscale...");
|
|
57
62
|
const twoPass = diffusion({ ...baseParams, upscale: { repeats: 2 } });
|
|
58
63
|
for await (const { step, totalSteps } of twoPass.progressStream) {
|
|
59
|
-
|
|
64
|
+
console.log(`▸ step ${step}/${totalSteps}`);
|
|
60
65
|
}
|
|
61
|
-
console.log();
|
|
62
66
|
const twoPassBuffers = await twoPass.outputs;
|
|
63
67
|
for (let i = 0; i < twoPassBuffers.length; i++) {
|
|
64
68
|
const out = path.join(outputDir, `sd2_esrgan_x16_seed${seed}_${i}.png`);
|
|
65
69
|
fs.writeFileSync(out, twoPassBuffers[i]);
|
|
66
|
-
console.log(
|
|
70
|
+
console.log(`▸ Saved ${out}`);
|
|
67
71
|
}
|
|
68
|
-
console.log("Stats:", await twoPass.stats);
|
|
72
|
+
console.log("▸ Stats:", await twoPass.stats);
|
|
69
73
|
await unloadModel({ modelId, clearStorage: false });
|
|
70
|
-
console.log("Done
|
|
74
|
+
console.log("▸ Done");
|
|
71
75
|
process.exit(0);
|
|
72
76
|
}
|
|
73
77
|
catch (error) {
|
|
74
|
-
console.error("
|
|
78
|
+
console.error("✖", error);
|
|
75
79
|
process.exit(1);
|
|
76
80
|
}
|
|
@@ -9,12 +9,12 @@ const diffusionModelSrc = process.argv[5] || FLUX_2_KLEIN_4B_Q4_0;
|
|
|
9
9
|
const llmModelSrc = process.argv[6] || QWEN3_4B_Q4_K_M;
|
|
10
10
|
const vaeModelSrc = process.argv[7] || FLUX_2_KLEIN_4B_VAE;
|
|
11
11
|
if (!inputPath) {
|
|
12
|
-
console.error("
|
|
12
|
+
console.error("✖ input image path is required");
|
|
13
13
|
console.error("Usage: bun run bare:example dist/examples/diffusion-flux2-klein-img2img.js <inputImage> [prompt] [outputDir] [diffusionModelSrc] [llmModelSrc] [vaeModelSrc]");
|
|
14
14
|
process.exit(1);
|
|
15
15
|
}
|
|
16
16
|
try {
|
|
17
|
-
console.log("Loading FLUX.2 [klein] split-layout model...");
|
|
17
|
+
console.log("▸ Loading FLUX.2 [klein] split-layout model...");
|
|
18
18
|
const modelId = await loadModel({
|
|
19
19
|
modelSrc: diffusionModelSrc,
|
|
20
20
|
modelType: "sdcpp-generation",
|
|
@@ -25,11 +25,17 @@ try {
|
|
|
25
25
|
vaeModelSrc,
|
|
26
26
|
prediction: "flux2_flow",
|
|
27
27
|
},
|
|
28
|
-
onProgress: (p) =>
|
|
28
|
+
onProgress: (p) => {
|
|
29
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
30
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
31
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
32
|
+
if (p.percentage >= 100)
|
|
33
|
+
process.stderr.write("\n");
|
|
34
|
+
},
|
|
29
35
|
});
|
|
30
|
-
console.log(
|
|
36
|
+
console.log(`▸ Model loaded: ${modelId}`);
|
|
31
37
|
const init_image = new Uint8Array(fs.readFileSync(inputPath));
|
|
32
|
-
console.log(
|
|
38
|
+
console.log(`▸ Transforming "${inputPath}" with prompt: "${prompt}"`);
|
|
33
39
|
const { progressStream, outputs, stats } = diffusion({
|
|
34
40
|
modelId,
|
|
35
41
|
prompt,
|
|
@@ -40,21 +46,20 @@ try {
|
|
|
40
46
|
seed: -1,
|
|
41
47
|
});
|
|
42
48
|
for await (const { step, totalSteps } of progressStream) {
|
|
43
|
-
|
|
49
|
+
console.log(`▸ step ${step}/${totalSteps}`);
|
|
44
50
|
}
|
|
45
|
-
console.log();
|
|
46
51
|
const buffers = await outputs;
|
|
47
52
|
for (let i = 0; i < buffers.length; i++) {
|
|
48
53
|
const outputPath = path.join(outputDir, `flux2_img2img_${i}.png`);
|
|
49
54
|
fs.writeFileSync(outputPath, buffers[i]);
|
|
50
|
-
console.log(
|
|
55
|
+
console.log(`▸ Saved ${outputPath}`);
|
|
51
56
|
}
|
|
52
|
-
console.log("
|
|
57
|
+
console.log("▸ Stats:", await stats);
|
|
53
58
|
await unloadModel({ modelId, clearStorage: false });
|
|
54
|
-
console.log("Done
|
|
59
|
+
console.log("▸ Done");
|
|
55
60
|
process.exit(0);
|
|
56
61
|
}
|
|
57
62
|
catch (error) {
|
|
58
|
-
console.error("
|
|
63
|
+
console.error("✖", error);
|
|
59
64
|
process.exit(1);
|
|
60
65
|
}
|
|
@@ -7,7 +7,7 @@ const llmModelSrc = process.argv[3] || QWEN3_4B_Q4_K_M;
|
|
|
7
7
|
const vaeModelSrc = process.argv[4] || FLUX_2_KLEIN_4B_VAE;
|
|
8
8
|
const prompt = process.argv[5] || "a futuristic city at sunset, photorealistic";
|
|
9
9
|
const outputDir = process.argv[6] || ".";
|
|
10
|
-
console.log("Loading FLUX.2 [klein] split-layout model...");
|
|
10
|
+
console.log("▸ Loading FLUX.2 [klein] split-layout model...");
|
|
11
11
|
const modelId = await loadModel({
|
|
12
12
|
modelSrc: diffusionModelSrc,
|
|
13
13
|
modelType: "sdcpp-generation",
|
|
@@ -17,10 +17,16 @@ const modelId = await loadModel({
|
|
|
17
17
|
llmModelSrc,
|
|
18
18
|
vaeModelSrc,
|
|
19
19
|
},
|
|
20
|
-
onProgress: (p) =>
|
|
20
|
+
onProgress: (p) => {
|
|
21
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
22
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
23
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
24
|
+
if (p.percentage >= 100)
|
|
25
|
+
process.stderr.write("\n");
|
|
26
|
+
},
|
|
21
27
|
});
|
|
22
|
-
console.log(
|
|
23
|
-
console.log(
|
|
28
|
+
console.log(`▸ Model loaded: ${modelId}`);
|
|
29
|
+
console.log(`▸ Generating: "${prompt}"`);
|
|
24
30
|
const { progressStream, outputs, stats } = diffusion({
|
|
25
31
|
modelId,
|
|
26
32
|
prompt,
|
|
@@ -32,16 +38,15 @@ const { progressStream, outputs, stats } = diffusion({
|
|
|
32
38
|
seed: -1,
|
|
33
39
|
});
|
|
34
40
|
for await (const { step, totalSteps } of progressStream) {
|
|
35
|
-
|
|
41
|
+
console.log(`▸ step ${step}/${totalSteps}`);
|
|
36
42
|
}
|
|
37
|
-
console.log();
|
|
38
43
|
const buffers = await outputs;
|
|
39
44
|
for (let i = 0; i < buffers.length; i++) {
|
|
40
45
|
const outputPath = path.join(outputDir, `flux2_${i}.png`);
|
|
41
46
|
fs.writeFileSync(outputPath, buffers[i]);
|
|
42
|
-
console.log(
|
|
47
|
+
console.log(`▸ Saved ${outputPath}`);
|
|
43
48
|
}
|
|
44
|
-
console.log("
|
|
49
|
+
console.log("▸ Stats:", await stats);
|
|
45
50
|
await unloadModel({ modelId, clearStorage: false });
|
|
46
|
-
console.log("Done
|
|
51
|
+
console.log("▸ Done");
|
|
47
52
|
process.exit(0);
|
|
@@ -7,19 +7,19 @@ const prompt = process.argv[3] || "oil painting style, vibrant colors";
|
|
|
7
7
|
const outputDir = process.argv[4] || ".";
|
|
8
8
|
const modelSrc = process.argv[5] || SD_V2_1_1B_Q8_0;
|
|
9
9
|
if (!inputPath) {
|
|
10
|
-
console.error("
|
|
10
|
+
console.error("✖ input image path is required");
|
|
11
11
|
console.error("Usage: bun run bare:example dist/examples/diffusion-img2img.js <inputImage> [prompt] [outputDir] [modelSrc]");
|
|
12
12
|
process.exit(1);
|
|
13
13
|
}
|
|
14
14
|
try {
|
|
15
|
-
console.log("Loading diffusion model...");
|
|
15
|
+
console.log("▸ Loading diffusion model...");
|
|
16
16
|
const modelId = await loadModel({
|
|
17
17
|
modelSrc,
|
|
18
18
|
modelType: "sdcpp-generation",
|
|
19
19
|
});
|
|
20
|
-
console.log(
|
|
20
|
+
console.log(`▸ Model loaded: ${modelId}`);
|
|
21
21
|
const init_image = new Uint8Array(fs.readFileSync(inputPath));
|
|
22
|
-
console.log(
|
|
22
|
+
console.log(`▸ Transforming "${inputPath}" with prompt: "${prompt}"`);
|
|
23
23
|
const { progressStream, outputs, stats } = diffusion({
|
|
24
24
|
modelId,
|
|
25
25
|
prompt,
|
|
@@ -29,21 +29,20 @@ try {
|
|
|
29
29
|
seed: -1,
|
|
30
30
|
});
|
|
31
31
|
for await (const { step, totalSteps } of progressStream) {
|
|
32
|
-
|
|
32
|
+
console.log(`▸ step ${step}/${totalSteps}`);
|
|
33
33
|
}
|
|
34
|
-
console.log();
|
|
35
34
|
const buffers = await outputs;
|
|
36
35
|
for (let i = 0; i < buffers.length; i++) {
|
|
37
36
|
const outputPath = path.join(outputDir, `img2img_${i}.png`);
|
|
38
37
|
fs.writeFileSync(outputPath, buffers[i]);
|
|
39
|
-
console.log(
|
|
38
|
+
console.log(`▸ Saved ${outputPath}`);
|
|
40
39
|
}
|
|
41
|
-
console.log("
|
|
40
|
+
console.log("▸ Stats:", await stats);
|
|
42
41
|
await unloadModel({ modelId, clearStorage: false });
|
|
43
|
-
console.log("Done
|
|
42
|
+
console.log("▸ Done");
|
|
44
43
|
process.exit(0);
|
|
45
44
|
}
|
|
46
45
|
catch (error) {
|
|
47
|
-
console.error("
|
|
46
|
+
console.error("✖", error);
|
|
48
47
|
process.exit(1);
|
|
49
48
|
}
|
|
@@ -14,17 +14,17 @@ const t5XxlModelSrc = process.argv[6] || UMT5_XXL_FP16;
|
|
|
14
14
|
const vaeModelSrc = process.argv[7] || WAN_2_1_COMFYUI_REPACKAGED_VAE;
|
|
15
15
|
const clipVisionModelSrc = process.argv[8] || CLIP_VISION_H;
|
|
16
16
|
if (!initImagePath) {
|
|
17
|
-
console.error("
|
|
17
|
+
console.error("✖ init image path is required");
|
|
18
18
|
console.error("Usage: bun run bare:example dist/examples/diffusion-img2vid.js " +
|
|
19
19
|
"<initImagePath> [prompt] [outputDir] " +
|
|
20
20
|
"[i2vModelSrc] [t5XxlModelSrc] [vaeModelSrc] [clipVisionModelSrc]");
|
|
21
21
|
process.exit(1);
|
|
22
22
|
}
|
|
23
23
|
try {
|
|
24
|
-
console.log("Loading Wan 2.1 I2V model (diffusion + UMT5-XXL + VAE + CLIP vision)...");
|
|
24
|
+
console.log("▸ Loading Wan 2.1 I2V model (diffusion + UMT5-XXL + VAE + CLIP vision)...");
|
|
25
25
|
const modelId = await loadModel({
|
|
26
26
|
modelSrc: diffusionModelSrc,
|
|
27
|
-
modelType: "
|
|
27
|
+
modelType: "sdcpp-generation",
|
|
28
28
|
modelConfig: {
|
|
29
29
|
mode: "video",
|
|
30
30
|
device: "gpu",
|
|
@@ -37,11 +37,17 @@ try {
|
|
|
37
37
|
vae_on_cpu: true,
|
|
38
38
|
vae_tiling: true,
|
|
39
39
|
},
|
|
40
|
-
onProgress: (p) =>
|
|
40
|
+
onProgress: (p) => {
|
|
41
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
42
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
43
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
44
|
+
if (p.percentage >= 100)
|
|
45
|
+
process.stderr.write("\n");
|
|
46
|
+
},
|
|
41
47
|
});
|
|
42
|
-
console.log(
|
|
48
|
+
console.log(`▸ Model loaded: ${modelId}`);
|
|
43
49
|
const init_image = new Uint8Array(fs.readFileSync(initImagePath));
|
|
44
|
-
console.log(
|
|
50
|
+
console.log(`▸ Generating video for: "${prompt}"`);
|
|
45
51
|
const { progressStream, outputs, stats } = video({
|
|
46
52
|
modelId,
|
|
47
53
|
mode: "img2vid",
|
|
@@ -58,21 +64,20 @@ try {
|
|
|
58
64
|
vae_tiling: true,
|
|
59
65
|
});
|
|
60
66
|
for await (const { step, totalSteps } of progressStream) {
|
|
61
|
-
|
|
67
|
+
console.log(`▸ step ${step}/${totalSteps}`);
|
|
62
68
|
}
|
|
63
|
-
console.log();
|
|
64
69
|
const buffers = await outputs;
|
|
65
70
|
for (let i = 0; i < buffers.length; i++) {
|
|
66
71
|
const outputPath = path.join(outputDir, `wan_i2v_${i}.avi`);
|
|
67
72
|
fs.writeFileSync(outputPath, buffers[i]);
|
|
68
|
-
console.log(
|
|
73
|
+
console.log(`▸ Saved ${outputPath}`);
|
|
69
74
|
}
|
|
70
|
-
console.log("
|
|
75
|
+
console.log("▸ Stats:", await stats);
|
|
71
76
|
await unloadModel({ modelId, clearStorage: false });
|
|
72
|
-
console.log("Done
|
|
77
|
+
console.log("▸ Done");
|
|
73
78
|
process.exit(0);
|
|
74
79
|
}
|
|
75
80
|
catch (error) {
|
|
76
|
-
console.error("
|
|
81
|
+
console.error("✖", error);
|
|
77
82
|
process.exit(1);
|
|
78
83
|
}
|
|
@@ -12,6 +12,6 @@ const modelId = await loadModel({
|
|
|
12
12
|
const { outputs } = diffusion({ modelId, prompt });
|
|
13
13
|
const buffers = await outputs;
|
|
14
14
|
fs.writeFileSync("output.png", buffers[0]);
|
|
15
|
-
console.log("Saved
|
|
15
|
+
console.log("▸ Saved output.png");
|
|
16
16
|
await unloadModel({ modelId, clearStorage: false });
|
|
17
17
|
process.exit(0);
|
|
@@ -5,7 +5,7 @@ const modelSrc = process.argv[2] || FLUX_2_KLEIN_4B_Q4_0;
|
|
|
5
5
|
const prompt = process.argv[3] ||
|
|
6
6
|
"a photo of a cat sitting on a windowsill, golden hour lighting";
|
|
7
7
|
const outputDir = process.argv[4] || ".";
|
|
8
|
-
console.log(
|
|
8
|
+
console.log(`▸ Loading diffusion model...`);
|
|
9
9
|
// FLUX.2 models require companion LLM + VAE models
|
|
10
10
|
const modelId = await loadModel({
|
|
11
11
|
modelSrc,
|
|
@@ -16,10 +16,16 @@ const modelId = await loadModel({
|
|
|
16
16
|
llmModelSrc: QWEN3_4B_Q4_K_M,
|
|
17
17
|
vaeModelSrc: FLUX_2_KLEIN_4B_VAE,
|
|
18
18
|
},
|
|
19
|
-
onProgress: (p) =>
|
|
19
|
+
onProgress: (p) => {
|
|
20
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
21
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
22
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
23
|
+
if (p.percentage >= 100)
|
|
24
|
+
process.stderr.write("\n");
|
|
25
|
+
},
|
|
20
26
|
});
|
|
21
|
-
console.log(
|
|
22
|
-
console.log(
|
|
27
|
+
console.log(`▸ Model loaded: ${modelId}`);
|
|
28
|
+
console.log(`▸ Generating: "${prompt}"`);
|
|
23
29
|
const { progressStream, outputs, stats } = diffusion({
|
|
24
30
|
modelId,
|
|
25
31
|
prompt,
|
|
@@ -31,16 +37,15 @@ const { progressStream, outputs, stats } = diffusion({
|
|
|
31
37
|
seed: -1,
|
|
32
38
|
});
|
|
33
39
|
for await (const { step, totalSteps } of progressStream) {
|
|
34
|
-
|
|
40
|
+
console.log(`▸ step ${step}/${totalSteps}`);
|
|
35
41
|
}
|
|
36
|
-
console.log();
|
|
37
42
|
const buffers = await outputs;
|
|
38
43
|
for (let i = 0; i < buffers.length; i++) {
|
|
39
44
|
const outputPath = path.join(outputDir, `output_${i}.png`);
|
|
40
45
|
fs.writeFileSync(outputPath, buffers[i]);
|
|
41
|
-
console.log(
|
|
46
|
+
console.log(`▸ Saved ${outputPath}`);
|
|
42
47
|
}
|
|
43
|
-
console.log("
|
|
48
|
+
console.log("▸ Stats:", await stats);
|
|
44
49
|
await unloadModel({ modelId, clearStorage: false });
|
|
45
|
-
console.log("Done
|
|
50
|
+
console.log("▸ Done");
|
|
46
51
|
process.exit(0);
|
|
@@ -14,7 +14,7 @@ const vaeModelSrc = process.argv[4] || WAN_2_1_COMFYUI_REPACKAGED_VAE;
|
|
|
14
14
|
const prompt = process.argv[5] || "a colorful bird flapping its wings";
|
|
15
15
|
const outputDir = process.argv[6] || ".";
|
|
16
16
|
try {
|
|
17
|
-
console.log("Loading Wan 2.1 T2V model (diffusion + UMT5-XXL + VAE)...");
|
|
17
|
+
console.log("▸ Loading Wan 2.1 T2V model (diffusion + UMT5-XXL + VAE)...");
|
|
18
18
|
const modelId = await loadModel({
|
|
19
19
|
modelSrc: diffusionModelSrc,
|
|
20
20
|
modelType: "sdcpp-generation",
|
|
@@ -29,10 +29,16 @@ try {
|
|
|
29
29
|
vae_on_cpu: true,
|
|
30
30
|
vae_tiling: true,
|
|
31
31
|
},
|
|
32
|
-
onProgress: (p) =>
|
|
32
|
+
onProgress: (p) => {
|
|
33
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
34
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
35
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
36
|
+
if (p.percentage >= 100)
|
|
37
|
+
process.stderr.write("\n");
|
|
38
|
+
},
|
|
33
39
|
});
|
|
34
|
-
console.log(
|
|
35
|
-
console.log(`\
|
|
40
|
+
console.log(`▸ Model loaded: ${modelId}`);
|
|
41
|
+
console.log(`\n▸ Generating video for: "${prompt}"`);
|
|
36
42
|
const { progressStream, outputs, stats } = video({
|
|
37
43
|
modelId,
|
|
38
44
|
mode: "txt2vid",
|
|
@@ -60,21 +66,20 @@ try {
|
|
|
60
66
|
vae_tiling: true,
|
|
61
67
|
});
|
|
62
68
|
for await (const { step, totalSteps } of progressStream) {
|
|
63
|
-
|
|
69
|
+
console.log(`▸ step ${step}/${totalSteps}`);
|
|
64
70
|
}
|
|
65
|
-
console.log();
|
|
66
71
|
const buffers = await outputs;
|
|
67
72
|
for (let i = 0; i < buffers.length; i++) {
|
|
68
73
|
const outputPath = path.join(outputDir, `wan_t2v_${i}.avi`);
|
|
69
74
|
fs.writeFileSync(outputPath, buffers[i]);
|
|
70
|
-
console.log(
|
|
75
|
+
console.log(`▸ Saved ${outputPath}`);
|
|
71
76
|
}
|
|
72
|
-
console.log("\
|
|
77
|
+
console.log("\n▸ Stats:", await stats);
|
|
73
78
|
await unloadModel({ modelId, clearStorage: false });
|
|
74
|
-
console.log("Done.");
|
|
79
|
+
console.log("▸ Done.");
|
|
75
80
|
process.exit(0);
|
|
76
81
|
}
|
|
77
82
|
catch (error) {
|
|
78
|
-
console.error("
|
|
83
|
+
console.error("✖", error);
|
|
79
84
|
process.exit(1);
|
|
80
85
|
}
|
|
@@ -5,44 +5,39 @@ const configDir = import.meta.dirname ?? process.cwd();
|
|
|
5
5
|
process.env["QVAC_CONFIG_PATH"] =
|
|
6
6
|
`${configDir}/config/blind-relay/blind-relay.config.js`;
|
|
7
7
|
import { downloadAsset, close, LLAMA_3_2_1B_INST_Q4_0, loadModel, getModelInfo, unloadModel, } from "@qvac/sdk";
|
|
8
|
-
console.log(
|
|
8
|
+
console.log(`▸ Download with Blind Relays Example`);
|
|
9
9
|
console.log(`${"=".repeat(60)}\n`);
|
|
10
10
|
try {
|
|
11
11
|
// Config is loaded from examples/config/qvac.config.json (set via QVAC_CONFIG_PATH above)
|
|
12
12
|
// The config contains swarmRelays - an array of Hyperswarm relay public keys
|
|
13
13
|
// These relays help with NAT traversal and firewall bypassing for P2P downloads
|
|
14
|
-
console.log(
|
|
15
|
-
const startTime = Date.now();
|
|
14
|
+
console.log(`▸ Starting model download from Hyperdrive...\n`);
|
|
16
15
|
const modelId = await loadModel({
|
|
17
16
|
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
18
17
|
});
|
|
19
|
-
console.log(
|
|
18
|
+
console.log(`▸ Model loaded with ID: ${modelId}`);
|
|
20
19
|
const firstStatus = await getModelInfo(LLAMA_3_2_1B_INST_Q4_0);
|
|
21
|
-
console.log(
|
|
20
|
+
console.log(`▸ First status: ${JSON.stringify(firstStatus)}`);
|
|
22
21
|
await unloadModel({ modelId });
|
|
23
22
|
// Download model with progress tracking
|
|
24
23
|
await downloadAsset({
|
|
25
24
|
assetSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
26
|
-
onProgress: (
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
1024 /
|
|
33
|
-
1024 /
|
|
34
|
-
elapsedSeconds).toFixed(2);
|
|
35
|
-
console.log(`📊 ${percentage}% - ${downloadedMB}MB / ${totalMB}MB (${speedMBps} MB/s)`);
|
|
25
|
+
onProgress: (p) => {
|
|
26
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
27
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
28
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
29
|
+
if (p.percentage >= 100)
|
|
30
|
+
process.stderr.write("\n");
|
|
36
31
|
},
|
|
37
32
|
});
|
|
38
|
-
console.log(`\n
|
|
39
|
-
console.log(
|
|
33
|
+
console.log(`\n▸ Model downloaded successfully using blind relays!`);
|
|
34
|
+
console.log(`▸ Blind relays helped establish peer connections through NAT/firewalls\n`);
|
|
40
35
|
await close();
|
|
41
36
|
}
|
|
42
37
|
catch (error) {
|
|
43
|
-
console.error("
|
|
44
|
-
console.log(`\
|
|
45
|
-
console.log(
|
|
46
|
-
console.log(
|
|
38
|
+
console.error("✖", error);
|
|
39
|
+
console.log(`\n▸ If download failed, check the relay public keys in:`);
|
|
40
|
+
console.log(`▸ examples/config/qvac.config.json`);
|
|
41
|
+
console.log(`▸ (Mock keys in this example won't work in practice!)`);
|
|
47
42
|
process.exit(1);
|
|
48
43
|
}
|