Skip to content

Releases: tetherto/qvac

QVAC OpenCode Plugin v0.1.0

19 Jun 10:40
df5c326

Choose a tag to compare

Release Date: 2026-06-16

📦 NPM: https://www.npmjs.com/package/@qvac/opencode-plugin/v/0.1.0

The first public release of @qvac/opencode-plugin — a turnkey OpenCode plugin that runs a local, fully managed QVAC serve so opencode works against on-device models with no second terminal and no manual server.

Added

  • Zero-config local OpenCode. Adding @qvac/opencode-plugin to a project's opencode.json plugin array is enough: on startup the plugin brings up a managed qvac serve, injects an OpenAI-compatible qvac provider pointed at it, sets it as the project default model, and tears the serve down on exit. No provider block, no second terminal, no QVAC_MODEL= prefix.
  • Managed serve host process. The plugin spawns a host child process in a real Node/Bun runtime (OpenCode runs plugins inside its own compiled binary, which cannot spawn the detached managed-mode supervisor). The host runs createQvac({ mode: 'managed' }) from @qvac/ai-sdk-provider, which brings up a shared, idle-reaped serve on an auto-allocated port, and ensures the serve is reaped even if OpenCode is killed hard.
  • Non-blocking startup. The host starts a small local proxy and reports it is listening before the model finishes downloading, so opencode run never trips OpenCode's startup timeout; the model loads in the background and the first turn waits on it.
  • Shared serve across windows. Multiple OpenCode windows share one serve (the provider's reuse default); the detached runner owns the loaded model and reaps it a few minutes after the last session leaves, so a second window doesn't reload the model.
  • Friendly model ids. A models.dev-style id (e.g. qwen3.5-9b) flows through OpenCode's model picker and the request model field, with the friendly-id → QVAC constant mapping resolved via @qvac/ai-sdk-provider's catalog. Defaults to qwen3.5-9b.
  • Layered configuration. Options resolve from built-in defaults, a project qvac.json, the opencode.json plugin-tuple options, and QVAC_* environment variables (in increasing precedence): model, ctxSize, reasoningBudget, tools, shim, runtime, readyTimeoutMs, setDefaultModel, and debug.
  • OpenAI-compatibility shim. An in-process proxy bridges @ai-sdk/openai-compatible and QVAC serve: it flattens array content to the string form serve currently accepts, and re-routes inline <think>…</think> reasoning to reasoning_content so OpenCode renders a collapsed "Thought" block. Disable with shim: false / QVAC_SHIM=0 once serve closes those gaps; the proxy itself remains (it is what lets startup return before the model loads).
  • Examples. Minimal and fully-annotated opencode.json examples for adding the plugin with and without options.
  • Explicit static tools mode. The managed serve config pins toolsMode: "static" so the OpenAI-compatible client surface is unambiguous across CLI versions (the invalid "auto" value leaves the serve with no loaded model).

Requirements

QVAC SDK v0.13.5

18 Jun 13:56
4d9cb2f

Choose a tag to compare

📦 NPM: 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.

QVAC SDK v0.13.4

18 Jun 13:14
4d9cb2f

Choose a tag to compare

📦 NPM: 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.

QVAC AI SDK Provider v0.2.2

17 Jun 09:23
8c6c91e

Choose a tag to compare

Release Date: 2026-06-16

📦 NPM: https://www.npmjs.com/package/@qvac/ai-sdk-provider/v/0.2.2

Fixed

  • Allow managed-mode installs with either the @qvac/cli 0.6.x or 0.7.x line as the optional CLI peer, so strict package managers can resolve the provider while CLI 0.7 brings in the newer SDK runtime.

QVAC SDK v0.13.3

16 Jun 11:40
9a46100

Choose a tag to compare

📦 NPM: 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.

QVAC OCR Addon (GGML) v0.2.2

16 Jun 12:44
b9b8500

Choose a tag to compare

Changed

  • CRAFT detector adds its convolution bias by implicit broadcast instead of
    first materializing a full-size bias tensor with ggml_repeat. The bias is
    reshaped to [1, 1, out_channels, 1] and added directly via ggml_add,
    which broadcasts on every backend (CPU, Vulkan, Metal). This removes a
    per-conv allocation and copy from the detection graph — the dominant phase of
    the EasyOCR pipeline — for a measured detection-time improvement (~6% on x86
    CPU and a larger win on NVIDIA Vulkan GPU) with byte-for-byte identical
    output across all backends. The previous ggml_repeat path remains available
    as an escape hatch by setting OCR_GGML_CRAFT_BIAS_REPEAT=1.

QVAC logging Lib v0.1.1

16 Jun 15:06
aacf2b4

Choose a tag to compare

Release Date: 2026-06-16

📦 NPM: https://www.npmjs.com/package/@qvac/logging/v/0.1.1

This release simplifies how @qvac/logging reads environment variables across Node.js and Bare runtimes. Log level detection from QVAC_LOG_LEVEL (and the Expo-prefixed variant) now routes through a dedicated ./env module resolved via package import maps instead of inline runtime branching.

Bare Runtime Compatibility

Environment access is delegated to bare-env on Bare via the package "imports" map, while Node.js continues to use a small env.js shim over process.env. This removes the previous try/catch chain over process, bare-process, and empty fallbacks from the main logger implementation.

// packages/logging/package.json (excerpt)
"imports": {
  "./env": {
    "bare": "bare-env",
    "default": "./env.js"
  }
}

The public QvacLogger API is unchanged — wrap any logger, set levels on the wrapper, and read QVAC_LOG_LEVEL from the environment as before. Consumers do not need to change how they construct or pass loggers into the SDK.

QVAC TTS GGML Addon v0.2.3

15 Jun 18:34
a5b0325

Choose a tag to compare

Added

  • Supertonic GPU support (QVAC-20754). Patch re-land of the Supertonic GPU
    enablement (originally #2473, validated and merged to main as #2506) onto
    the 0.2.2 release line. Caller GPU intent (useGPU / nGpuLayers) is
    honored again for the Supertonic engine on GPU-capable hosts (Metal on Apple,
    Vulkan/CUDA on desktop), matching Chatterbox. The
    SupertonicModel::validateConfig / index.js "CPU only today" rejection is
    removed; the cross-field conflict check (useGPU=true + nGpuLayers=0, or
    vice versa) is preserved.

Changed

  • Consume tts-cpp 2026-06-05 via a package-local overlay port pinned at
    qvac-ext-lib-whisper.cpp@f7d4d6c (the QVAC-19254 sched + cpu_backend
    follow-up). f7d4d6c reroutes the direct ggml_backend_is_cpu /
    ggml_get_type_traits_cpu calls that made 2026-06-05 fail to dlopen on
    Android (the 0.2.1 bootstrap crash), so the addon loads cleanly while still
    shipping the Supertonic GPU optimisations.

Notes

  • Android stays CPU-only for Supertonic. The #ifdef __ANDROID__
    force-off in SupertonicModel::loadLocked is kept, so useGPU=true on
    Android transparently falls back to CPU: Adreno Vulkan/OpenCL ggml graph
    compute still aborts (same family as the parakeet Adreno crash). The GPU
    smoke test skips Supertonic on Android accordingly.
  • The ports/tts-cpp overlay and the overlay-ports entry in
    vcpkg-configuration.json are interim: drop them and bump
    vcpkg.json's tts-cpp pin once f7d4d6c (or a successor) is published to
    qvac-registry-vcpkg.

QVAC SDK v0.13.2

15 Jun 16:59
2377b7c

Choose a tag to compare

📦 NPM: 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.

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.

QVAC SDK v0.13.1

15 Jun 10:37
3002eea

Choose a tag to compare

📦 NPM: https://www.npmjs.com/package/@qvac/sdk/v/0.13.1

Dependency-maintenance patch. @qvac/sdk and @qvac/bare-sdk adopt bare-fetch 3.x and @qvac/decoder-audio 0.4.x, and move dev-only bare-subprocess to 6.x. This removes the deprecated @qvac/response and its exact bare-events 2.4.2 pin from the dependency tree.

Maintenance

Bump bare-fetch to ^3.0.1 (public fetch API unchanged) and dev bare-subprocess to ^6.1.0. Bump @qvac/decoder-audio to ^0.4.0 (drops deprecated @qvac/response); decoder-audio@0.4.0 returns its QvacResponse synchronously, so server/utils/audio/decoder.ts no longer awaits decoder.run(). @qvac/sdk/@qvac/bare-sdk bumped in lockstep.