Changelog
The latest releases across the QVAC stack - the SDK, CLI and inference addons - pulled straight from the open-source repository.
The latest releases across the QVAC stack - the SDK, CLI and inference addons - pulled straight from the open-source repository.
๐ฆ NPM: https://www.npmjs.com/package/@qvac/sdk/v/0.9.0
This release significantly expands the SDK's capabilities with finetuning support, image generation via Stable Diffusion, duplex streaming transcription, and a suspend/resume lifecycle for mobile apps. Delegation gets healthier with heartbeat probes and remote cancellation. Tool-calling completions are now more robust with KV cache fixes, and a new profiler gives deep visibility into operation performance. React Native compatibility improves with Buffer-free diffusion and better progress event handling.
ping() Replaced by heartbeat()The ping() API has been replaced by heartbeat(), which supports both local and delegated (P2P) health checks. This enables proactive provider status monitoring before and during delegated inference.
Before:
import { ping } from "@qvac/sdk";
const pong = await ping();After:
import { heartbeat } from "@qvac/sdk";
// Local heartbeat (replaces ping)
await heartbeat();
// Delegated heartbeat โ check if a remote provider is alive
await heartbeat({
delegate: { topic: "topicHex", providerPublicKey: "peerHex", timeout: 3000 },
});The SDK now supports LoRA finetuning of loaded LLM models. Training runs can be started, paused, resumed, cancelled, and inspected โ all through a single finetune() function. Progress streams provide real-time loss and step metrics.
import { finetune } from "@qvac/sdk";
const handle = finetune({
modelId,
options: {
trainDatasetDir: "./dataset/train",
validation: { type: "dataset", path: "./dataset/eval" },
outputParametersDir: "./artifacts/lora",
numberOfEpochs: 2,
},
});
for await (const progress of handle.progressStream) {
console.log(progress.global_steps, progress.loss);
}
const result = await handle.result;Operations: start, resume, pause, cancel, getState. Omit operation to let the addon auto-detect whether to start fresh or resume.
Stable Diffusion models are now integrated as a first-class SDK capability. Load a diffusion model and generate images with step-by-step progress tracking.
import { loadModel, diffusion, SD_V2_1_1B_Q8_0 } from "@qvac/sdk";
const modelId = await loadModel({
modelSrc: SD_V2_1_1B_Q8_0,
modelType: "diffusion",
modelConfig: { prediction: "v" },
});
const { progressStream, outputs, stats } = diffusion({
modelId,
prompt: "a cat sitting on a windowsill",
width: 512,
height: 512,
steps: 20,
});
for await (const { step, totalSteps } of progressStream) {
console.log(`${step}/${totalSteps}`);
}
const buffers = await outputs;transcribeStream)A new bidirectional streaming API lets you feed audio incrementally and receive transcription segments as speech is detected, enabling real-time voice interfaces.
import { transcribeStream } from "@qvac/sdk";
const session = await transcribeStream({ modelId });
session.write(audioChunk);
session.end();
for await (const text of session) {
console.log(text);
}
session.destroy();The previous single-shot transcribeStream({ modelId, audioChunk }) pattern still works but logs a deprecation warning โ use transcribe() for batch transcription.
Mobile and desktop apps can now cleanly suspend and resume SDK operations when the app enters the background or foreground, preventing resource leaks and stale state.
import { suspend, resume } from "@qvac/sdk";
await suspend(); // app going to background
await resume(); // app returning to foregroundRemote inference and downloads running on a delegation provider can now be cancelled from the consumer side.
import { cancel } from "@qvac/sdk";
await cancel({ operation: "inference", modelId: "delegated-model-id" });
await cancel({
operation: "downloadAsset",
downloadKey: "download-key",
delegate: { topic: "topicHex", providerPublicKey: "peerHex" },
});A new healthCheckTimeout option on the delegate config lets you control how long the RPC health probe waits before marking a cached connection as stale and reconnecting.
await loadModel({
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
modelType: "llm",
delegate: {
topic: topicHex,
providerPublicKey,
timeout: 30_000,
healthCheckTimeout: 2000,
},
});All inference operations now return detailed performance stats from the underlying addons. Completion, transcription, translation, TTS, and embedding responses all include stats like tokensPerSecond, timeToFirstToken, audioDuration, and the new backendDevice field ("cpu" or "gpu").
const { embedding, stats } = await embed({ modelId, text: "hello" });
console.log(stats?.backendDevice); // "cpu" | "gpu"@qvac/[email protected].files-based constructor with absolute paths, replacing the legacy loader pattern.<think> blocks stripped before parsing tool calls โ reasoning traces from models like DeepSeek no longer break tool call extraction.Maximum call stack size exceeded errors during high-frequency updates.closeConnections resolved โ concurrent teardowns no longer deadlock.Buffer replaced with Uint8Array in the diffusion client, fixing React Native builds..onnx.data companion files are now correctly resolved during registry model resolution.Model registry updated: 312 โ 653 (+341). See model changes for the full list.
@qvac/tts-onnx to v0.6.7, @qvac/transcription-whispercpp to latest, Parakeet to v0.2.7, @qvac/diffusion-cpp to ^0.1.3.bare-crypto and @qvac/rag for runtime stability.@tetherto npm references to @qvac namespace across READMEs.Stay updated
New versions, breaking changes and migration notes - straight to your inbox. No spam, unsubscribe anytime.