# SDK Release Notes — v0.13.x (/reference/release-notes/v0.13.x)



## v0.13.0

### @qvac/sdk

📦 **NPM:** [https://www.npmjs.com/package/@qvac/sdk/v/0.13.0](https://www.npmjs.com/package/@qvac/sdk/v/0.13.0)

QVAC SDK 0.13.0 broadens the SDK across video, neural-signal transcription, robot-action models, and desktop packaging while tightening runtime behavior for local-first applications. This release also improves error reporting, completion metadata, transcription backend stats, mobile compatibility, and dependency shape for consumers that install only the integrations they need.

#### Video Generation Adds Image-to-Video

The video API now supports image-to-video generation for Wan image-to-video pipelines. Consumers can provide an initial frame through `init_image` and control denoising with `strength`, making it possible to animate a source image instead of generating entirely from text.

```typescript
import fs from "node:fs";
import { video } from "@qvac/sdk";

const firstFrame = fs.readFileSync("portrait.png");
const { outputs } = video({
  modelId,
  mode: "img2vid",
  prompt: "the subject slowly turns and smiles, cinematic lighting",
  init_image: firstFrame,
  strength: 0.85,
});

const buffers = await outputs;
fs.writeFileSync("output.avi", buffers[0]);
```

This change also moves video dimension validation to the SDK schema boundary. Width and height now need to be multiples of 16, so invalid dimensions fail before they reach the native addon.

**Before:**

```typescript
video({ modelId, mode: "txt2vid", prompt: "...", width: 520, height: 264 });
```

**After:**

```typescript
video({ modelId, mode: "txt2vid", prompt: "...", width: 528, height: 272 });
```

#### Worker Failures Are Now Typed SDK Errors

Bare worker crashes and SDK shutdown now surface as structured RPC errors instead of ambiguous failures. Applications can distinguish an unexpected worker death from an in-flight request that was cancelled because the SDK is closing.

```typescript
import { WorkerCrashedError, WorkerShutdownError } from "@qvac/sdk";

try {
  await sdk.embed({ modelId, text: "hi" });
} catch (err) {
  if (err instanceof WorkerCrashedError) {
    console.error(err.exitCode, err.exitSignal);
  } else if (err instanceof WorkerShutdownError) {
    console.error("The SDK closed while this request was in flight.");
  }
}
```

#### Electron Apps Can Tree-Shake Native Addons

The new Electron Forge plugin helps packaged desktop apps include only the native addon trees needed by their QVAC configuration. This reduces accidental bundling of unused prebuilds and keeps app packages closer to the target platform set.

```typescript
const QvacForgePlugin = require("@qvac/sdk/electron-forge");

module.exports = {
  packagerConfig: { name: "MyApp" },
  plugins: [
    new QvacForgePlugin({
      configPath: "./qvac.config.json",
      hosts: ["darwin-arm64", "darwin-x64"],
      logLevel: "info",
    }),
  ],
};
```

#### Completion and Transcription Metadata Are More Precise

Completion final results now report `stopReason: "length"` when generation stops because the token budget was exhausted, and `stopReason: "cancelled"` when a request is cancelled. Natural end-of-sequence completions remain backwards-compatible by leaving `stopReason` unset.

Whisper transcription metadata now exposes backend and GPU stats in the final stats frame. Applications that surface performance diagnostics can show whether work ran on CPU or GPU and, where supported, report GPU memory information.

```typescript
for await (const ev of sdk.transcribe({ modelId, audioChunk, metadata: true })) {
  if (ev.done && ev.stats) {
    console.log(ev.stats.backendDevice);
    console.log(ev.stats.backendId);
    console.log(ev.stats.gpuMemTotalMb);
    console.log(ev.stats.gpuMemFreeMb);
  }
}
```

#### Neural-Signal Transcription API Is Available

The SDK now includes BCI transcription backed by whisper.cpp. It supports both batch transcription from a `.bin` path or `Uint8Array`, and streaming duplex sessions over neural-signal chunks.

```typescript
import { loadModel, bciTranscribe, bciTranscribeStream, BCI_WINDOWED } from "@qvac/sdk";

const modelId = await loadModel({ modelSrc: BCI_WINDOWED });
const text = await bciTranscribe({ modelId, neuralData: "./signal.bin" });

const session = await bciTranscribeStream({ modelId, emit: "delta" });
session.write(chunk);
session.end();

for await (const token of session) {
  process.stdout.write(token);
}
```

#### Robot-Action (VLA) API Is Available

This release integrates the pi05 VLA model path for robot-action inference. The VLA API can inspect model hparams, preprocess camera frames, and run action generation with the required image, token, mask, and noise inputs.

```typescript
import { loadModel, vla, vlaHparams, vlaPreprocessImage, PI05_BASE_Q_AGGRESSIVE } from "@qvac/sdk";

const modelId = await loadModel({ modelSrc: PI05_BASE_Q_AGGRESSIVE, modelType: "ggml-vla" });
const { hparams } = await vlaHparams({ modelId });
const size = hparams.visionImageSize;
const images = [cam0, cam1, cam2].map((px) => vlaPreprocessImage(px, w, h, { size }));

const { actions } = await vla({
  modelId,
  images,
  imgWidth: size,
  imgHeight: size,
  state: new Float32Array(0),
  tokens,
  mask,
  noise,
});
```

#### Runtime Fixes and Dependency Cleanup

Same-model requests are now serialized through a per-model FIFO queue, which prevents concurrent requests for the same model kind and ID from stepping on each other. Delegated inference also waits for a cold DHT before connecting and categorizes connect failures more clearly, making peer connection failures easier to diagnose.

Several compatibility fixes landed across mobile and bundler environments. The SDK strips multi-GPU config on mobile, avoids exiting in-process Bare hosts when closing the bare client, prevents Android Parakeet GPU backend discovery, fixes Bare config loading through `require()`, and keeps the models subpath compatible with Metro. Dependency metadata was also cleaned up so optional integrations are modeled as optional peer dependencies rather than always-installed optional dependencies.

#### Model Registry Updates

This release adds new first-class constants for BCI, image-to-video, multimodal LLMs, Parakeet, Chatterbox TTS, and pi05 VLA usage. The full list is included below so consumers can update imports directly.

##### Added Models

```text
BCI_EMBEDDER
BCI_WINDOWED
CLIP_VISION_H
MMPROJ_GEMMA4_2B_MULTIMODAL_Q8_0
MMPROJ_QWEN3_5_0_8B_MULTIMODAL_Q8_0
PARAKEET_EOU_120M_V1_Q4_0
PARAKEET_SORTFORMER_4SPK_V1_Q4_0
PARAKEET_TDT_0_6B_V3_Q4_0
PI05_BASE_Q_AGGRESSIVE
QWEN3_5_0_8B_MULTIMODAL_Q6_K
SMOLLM2_360M_INST_Q8
TTS_S3GEN_EN_CHATTERBOX_Q4_0
TTS_S3GEN_EN_CHATTERBOX_Q5_0
TTS_S3GEN_EN_CHATTERBOX_Q8_0
TTS_S3GEN_MULTILINGUAL_CHATTERBOX_Q4_0
TTS_S3GEN_MULTILINGUAL_CHATTERBOX_Q5_0
TTS_S3GEN_MULTILINGUAL_CHATTERBOX_Q8_0
TTS_T3_MULTILINGUAL_CHATTERBOX_Q5_0
TTS_T3_TURBO_EN_CHATTERBOX_Q5_0
WAN2_1_I2V_14B_Q4_K_M
WAN2_1_I2V_14B_Q4_K_M_1
```

## v0.13.1

### @qvac/sdk

### Changelog v0.13.1 (LLM)

Dependency-maintenance patch. No public API changes.

* `bare-fetch` → `^3.0.1` (transitive-only major; fetch API unchanged; only 3.0.1 header validation, all SDK headers are RFC-valid).
* dev `bare-subprocess` → `^6.1.0` (not shipped to consumers).
* `@qvac/decoder-audio` → `^0.4.0`: removes the deprecated `@qvac/response` package (folded into `@qvac/infer-base`) from the dependency tree, eliminating its exact `bare-events 2.4.2` pin. `decoder-audio@0.4.0`'s `run()` returns `QvacResponse` synchronously; `server/utils/audio/decoder.ts` updated to not `await` it.
* `@qvac/sdk` + `@qvac/bare-sdk` bumped in lockstep.
* Validated by a clean install: no `@qvac/response`, no `bare-events@2.4.2`, no `bare-fetch@2.x`, no `decoder-audio@0.3.x` resolve in the tree.

## v0.13.2

### @qvac/sdk

📦 **NPM:** [https://www.npmjs.com/package/@qvac/sdk/v/0.13.2](https://www.npmjs.com/package/@qvac/sdk/v/0.13.2)

A small patch release: TTS language validation is now engine-aware, the Bare
build of the SDK drops two Node-only install dependencies, and the bundled
`@qvac/rag` is updated.

#### New APIs

TTS language validation is now specific to each engine instead of sharing a
single four-language list. Chatterbox accepts all 18 of its multilingual
languages, and Supertonic is restricted to the five it actually supports at
runtime (`en`, `es`, `fr`, `pt`, `ko`). Two new constants and their types are
exported so you can reference each engine's language set directly.

```typescript
import {
  TTS_CHATTERBOX_LANGUAGES, // en, es, fr, de, it, pt, nl, pl, tr, sv, da, fi, no, el, ms, sw, ar, ko
  TTS_SUPERTONIC_LANGUAGES, // en, es, fr, pt, ko
  type TtsChatterboxLanguage,
  type TtsSupertonicLanguage,
} from "@qvac/sdk";

// Chatterbox now accepts all 18 multilingual languages
await loadModel({
  modelSrc: ...,
  modelConfig: { ttsEngine: "chatterbox", language: "tr" },
});
```

Supertonic configs no longer accept `de` or `it`. The native engine never
produced valid audio for those languages, so this tightens validation to match
real runtime support rather than removing a working capability.

#### Dependency and Packaging Changes

The Bare build (`@qvac/bare-sdk`) no longer declares `bare-runtime` and
`bare-pack` as dependencies. Neither is reachable on Bare — Bare apps already
ship the runtime — and dropping `bare-runtime` avoids pulling roughly 80MB of
per-platform prebuilds at install time. Both packages remain available in
`@qvac/sdk` for the Node host path.

The bundled `@qvac/rag` dependency is updated to `^0.6.4`.

## v0.13.3

### @qvac/sdk

📦 **NPM:** [https://www.npmjs.com/package/@qvac/sdk/v/0.13.3](https://www.npmjs.com/package/@qvac/sdk/v/0.13.3)

A maintenance patch release that updates the bundled `@qvac/decoder-audio`
dependency to `^0.5.0`.

#### Dependency Changes

The bundled `@qvac/decoder-audio` audio decoder is updated to `^0.5.0`. The same
update is mirrored into the Bare build (`@qvac/bare-sdk`), which ships in lockstep
with `@qvac/sdk`.

## v0.13.4

### @qvac/sdk

📦 **NPM:** [https://www.npmjs.com/package/@qvac/sdk/v/0.13.4](https://www.npmjs.com/package/@qvac/sdk/v/0.13.4)

A patch release that hardens tool-call parsing for Qwen models used in agentic
workflows.

#### Bug Fixes

##### Recover malformed Qwen tool-call frames

Qwen3.5/3.6 can intermittently emit a malformed tool-call frame that fuses its
XML and JSON tool templates, embedding the `function=<name>` token as a bare
string key inside an otherwise JSON object. Previously the parser rejected that
frame as invalid JSON, so no structured tool call was produced and callers saw
the raw markup as assistant text. The parser now recognizes and repairs this
specific shape, so the tool call is recovered and dispatched correctly.

## v0.13.5

### @qvac/sdk

📦 **NPM:** [https://www.npmjs.com/package/@qvac/sdk/v/0.13.5](https://www.npmjs.com/package/@qvac/sdk/v/0.13.5)

A patch release that fixes Expo RPC worker cleanup on Android and other
non-iOS platforms when the SDK closes its RPC connection.

#### Bug Fixes

##### Clean up the Expo RPC worker on non-iOS close

On Expo, closing the SDK RPC connection now sends the worker a shutdown
roundtrip before dropping client-side references. On iOS the worklet can still
be terminated safely; on Android and other non-iOS platforms the worklet cannot
be terminated without risking a native crash, so the SDK releases addon logger
handles and clears worklet state instead.

After shutdown, the SDK also resets its worklet reference so the next RPC
session starts with a fresh worker and a fully populated plugin registry. This
prevents follow-up model loads from failing with "Plugin not found" when tests
or app flows unload the last model and auto-close the RPC client between runs.

The same update is mirrored into the Bare build (`@qvac/bare-sdk`), which ships
in lockstep with `@qvac/sdk`.
