@qvac/sdk 0.13.5 → 0.14.1
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/expo-rpc-client.js +2 -11
- 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/commands/bundle/entry-gen.d.ts +1 -1
- package/dist/commands/bundle/entry-gen.js +6 -6
- package/dist/commands/bundle/index.js +3 -1
- package/dist/commands/bundle/resolve-sdk-import.d.ts +6 -0
- package/dist/commands/bundle/resolve-sdk-import.js +60 -0
- 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
|
@@ -25,7 +25,7 @@ function terminateProvider(provider) {
|
|
|
25
25
|
// The provider's Hyperswarm identity (and therefore its public key) is
|
|
26
26
|
// generated at startup — it can't be known ahead of time. We parse it from
|
|
27
27
|
// the provider's stdout where it prints:
|
|
28
|
-
// "
|
|
28
|
+
// "▸ Provider Public Key: <hex>"
|
|
29
29
|
function waitForProviderPublicKey(provider) {
|
|
30
30
|
return new Promise((resolve, reject) => {
|
|
31
31
|
let output = "";
|
|
@@ -53,36 +53,40 @@ function waitForProviderPublicKey(provider) {
|
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
async function runDelegatedCompletion(providerPublicKey) {
|
|
56
|
-
console.log("
|
|
56
|
+
console.log("▸ Loading model via delegation...");
|
|
57
57
|
const modelId = await loadModel({
|
|
58
58
|
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
59
59
|
delegate: {
|
|
60
60
|
providerPublicKey,
|
|
61
61
|
timeout: 30_000,
|
|
62
62
|
},
|
|
63
|
-
onProgress: (
|
|
64
|
-
|
|
63
|
+
onProgress: (p) => {
|
|
64
|
+
const mb = (n) => (n / 1e6).toFixed(1);
|
|
65
|
+
const line = `▸ Downloading ${p.percentage.toFixed(0)}% (${mb(p.downloaded)}/${mb(p.total)} MB)`;
|
|
66
|
+
process.stderr.write(process.stderr.isTTY ? `\r${line}` : `${line}\n`);
|
|
67
|
+
if (p.percentage >= 100)
|
|
68
|
+
process.stderr.write("\n");
|
|
65
69
|
},
|
|
66
70
|
});
|
|
67
|
-
console.log(
|
|
68
|
-
console.log("
|
|
71
|
+
console.log(`▸ Model loaded: ${modelId}`);
|
|
72
|
+
console.log("▸ Running delegated completion (streamed)...");
|
|
69
73
|
const response = completion({
|
|
70
74
|
modelId,
|
|
71
75
|
history: [{ role: "user", content: "Say hello in exactly 5 words." }],
|
|
72
76
|
stream: true,
|
|
73
77
|
});
|
|
74
|
-
|
|
78
|
+
console.log("▸ Response:");
|
|
75
79
|
for await (const token of response.tokenStream) {
|
|
76
80
|
process.stdout.write(token);
|
|
77
81
|
}
|
|
78
82
|
const stats = await response.stats;
|
|
79
|
-
console.log(`\n
|
|
83
|
+
console.log(`\n▸ Stats: ${JSON.stringify(stats)}`);
|
|
80
84
|
}
|
|
81
85
|
const provider = spawnProviderProcess();
|
|
82
86
|
try {
|
|
83
|
-
console.log("
|
|
87
|
+
console.log("▸ Waiting for provider to start and announce its key...");
|
|
84
88
|
const publicKey = await waitForProviderPublicKey(provider);
|
|
85
|
-
console.log(`\n
|
|
89
|
+
console.log(`\n▸ Provider ready — key: ${publicKey}\n`);
|
|
86
90
|
await runDelegatedCompletion(publicKey);
|
|
87
91
|
void close();
|
|
88
92
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { close, completion, LLAMA_3_2_1B_INST_Q4_0, loadModel, profiler, } from "@qvac/sdk";
|
|
2
2
|
const providerPublicKey = process.argv[2];
|
|
3
3
|
if (!providerPublicKey) {
|
|
4
|
-
console.error("
|
|
4
|
+
console.error("✖ Usage: bun run consumer-profiled.ts <providerPublicKey>");
|
|
5
5
|
process.exit(1);
|
|
6
6
|
}
|
|
7
7
|
try {
|
|
8
8
|
profiler.enable({ mode: "verbose", includeServerBreakdown: true });
|
|
9
|
-
console.log("
|
|
10
|
-
console.log(`\n
|
|
11
|
-
console.log("
|
|
9
|
+
console.log("▸ Profiler enabled");
|
|
10
|
+
console.log(`\n▸ Provider: ${providerPublicKey}\n`);
|
|
11
|
+
console.log("▸ Loading model (delegated, unary)...");
|
|
12
12
|
const modelId = await loadModel({
|
|
13
13
|
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
14
14
|
delegate: {
|
|
@@ -16,28 +16,28 @@ try {
|
|
|
16
16
|
timeout: 60_000,
|
|
17
17
|
},
|
|
18
18
|
});
|
|
19
|
-
console.log(
|
|
20
|
-
console.log("
|
|
19
|
+
console.log(`▸ Model loaded: ${modelId}`);
|
|
20
|
+
console.log("▸ Running completion (delegated, streamed)...");
|
|
21
21
|
const response = completion({
|
|
22
22
|
modelId,
|
|
23
23
|
history: [{ role: "user", content: "Say hello in exactly 5 words." }],
|
|
24
24
|
stream: true,
|
|
25
25
|
});
|
|
26
|
-
|
|
26
|
+
console.log("▸ Response:");
|
|
27
27
|
for await (const token of response.tokenStream) {
|
|
28
28
|
process.stdout.write(token);
|
|
29
29
|
}
|
|
30
30
|
await response.stats;
|
|
31
|
-
console.log("\n
|
|
32
|
-
console.log("
|
|
31
|
+
console.log("\n▸ Completion done\n");
|
|
32
|
+
console.log("▸ Profiler Summary");
|
|
33
33
|
console.log(profiler.exportSummary());
|
|
34
|
-
console.log("
|
|
34
|
+
console.log("▸ Profiler Table");
|
|
35
35
|
console.log(profiler.exportTable());
|
|
36
36
|
// Look for delegation-specific metrics
|
|
37
37
|
const json = profiler.exportJSON();
|
|
38
38
|
const delegationMetrics = Object.keys(json.aggregates).filter((k) => k.includes("delegation") || k.includes("delegated"));
|
|
39
39
|
if (delegationMetrics.length > 0) {
|
|
40
|
-
console.log("
|
|
40
|
+
console.log("▸ Delegation Metrics");
|
|
41
41
|
for (const key of delegationMetrics) {
|
|
42
42
|
const agg = json.aggregates[key];
|
|
43
43
|
if (agg) {
|
|
@@ -46,14 +46,14 @@ try {
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
else {
|
|
49
|
-
console.log("
|
|
49
|
+
console.log("▸ No delegation-specific metrics found");
|
|
50
50
|
console.log(" (delegation profiling may need to be triggered)");
|
|
51
51
|
}
|
|
52
52
|
profiler.disable();
|
|
53
53
|
void close();
|
|
54
54
|
}
|
|
55
55
|
catch (error) {
|
|
56
|
-
console.error("
|
|
56
|
+
console.error("✖", error);
|
|
57
57
|
profiler.disable();
|
|
58
58
|
process.exit(1);
|
|
59
59
|
}
|
|
@@ -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);
|