Skip to content

Commit 64cde24

Browse files
QVAC-19908 chore: release sdk + bare-sdk 0.13.4
Bumps @qvac/sdk and @qvac/bare-sdk to 0.13.4 and adds the 0.13.4 changelog. Release contents (merged to main since 0.13.3): recover malformed Qwen hybrid tool-call frames (#2677), add subscribeServerLogs (#2558), field-level input validation errors (#2618), and GPU-enabled TTS sdk tests (#2624). (cherry picked from commit 533352d)
1 parent 4b3ac99 commit 64cde24

6 files changed

Lines changed: 188 additions & 9 deletions

File tree

packages/bare-sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@qvac/bare-sdk",
3-
"version": "0.13.3",
3+
"version": "0.13.4",
44
"license": "Apache-2.0",
55
"description": "Bare-targeted slim assembly of the QVAC SDK. Consumers install only the addon packages they need and register plugins explicitly. No addon dependencies pulled in by default.",
66
"repository": {

packages/sdk/CHANGELOG.md

Lines changed: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,66 @@
11
# Changelog
22

3+
## [0.13.4]
4+
5+
📦 **NPM:** https://www.npmjs.com/package/@qvac/sdk/v/0.13.4
6+
7+
A patch release that adds two developer-experience APIs — a single subscription
8+
for all server logs and friendlier input-validation errors — and hardens
9+
tool-call parsing for Qwen models used in agentic workflows.
10+
11+
## New APIs
12+
13+
### Subscribe to all server logs at once
14+
15+
You can now capture every server-side log through one subscription instead of
16+
wiring up a `loggingStream()` per model or request. `subscribeServerLogs`
17+
delivers each log entry (level, namespace, message) to a single handler and
18+
returns an unsubscribe function.
19+
20+
```typescript
21+
import { subscribeServerLogs } from "@qvac/sdk";
22+
23+
const unsubscribe = subscribeServerLogs((log) => {
24+
console.log(`[${log.level}] [${log.namespace}] ${log.message}`);
25+
});
26+
27+
// later
28+
unsubscribe();
29+
```
30+
31+
### Field-level validation errors for user input
32+
33+
Invalid request input now surfaces as a `RequestValidationFailedError` with a
34+
clear, field-level message pointing at the exact key and location that failed,
35+
instead of an opaque rejection. This makes it much faster to spot typos and
36+
unsupported options in calls like `loadModel`.
37+
38+
```typescript
39+
import { loadModel, RequestValidationFailedError, LLAMA_3_2_1B_INST_Q4_0 } from "@qvac/sdk";
40+
41+
try {
42+
await loadModel({ modelSrc: LLAMA_3_2_1B_INST_Q4_0, modelConfig: { dtx_size: 4096 } });
43+
} catch (err) {
44+
if (err instanceof RequestValidationFailedError) {
45+
console.error(err.message);
46+
// Invalid request:
47+
// ✖ Unrecognized key: "dtx_size"
48+
// → at modelConfig
49+
}
50+
}
51+
```
52+
53+
## Bug Fixes
54+
55+
### Recover malformed Qwen tool-call frames
56+
57+
Qwen3.5/3.6 can intermittently emit a malformed tool-call frame that fuses its
58+
XML and JSON tool templates, embedding the `function=<name>` token as a bare
59+
string key inside an otherwise JSON object. Previously the parser rejected that
60+
frame as invalid JSON, so no structured tool call was produced and callers saw
61+
the raw markup as assistant text. The parser now recognizes and repairs this
62+
specific shape, so the tool call is recovered and dispatched correctly.
63+
364
## [0.13.3]
465

566
📦 **NPM:** https://www.npmjs.com/package/@qvac/sdk/v/0.13.3
@@ -58,15 +119,15 @@ per-platform prebuilds at install time. Both packages remain available in
58119

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

61-
## [0.13.1]
62-
63-
📦 **NPM:** https://www.npmjs.com/package/@qvac/sdk/v/0.13.1
64-
65-
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.
122+
## [0.13.1] (LLM)
66123

67-
## Maintenance
124+
Dependency-maintenance patch. No public API changes.
68125

69-
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 `await`s `decoder.run()`. `@qvac/sdk`/`@qvac/bare-sdk` bumped in lockstep.
126+
- `bare-fetch``^3.0.1` (transitive-only major; fetch API unchanged; only 3.0.1 header validation, all SDK headers are RFC-valid).
127+
- dev `bare-subprocess``^6.1.0` (not shipped to consumers).
128+
- `@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.
129+
- `@qvac/sdk` + `@qvac/bare-sdk` bumped in lockstep.
130+
- 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.
70131

71132
## [0.13.0]
72133

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Changelog v0.13.4
2+
3+
Release Date: 2026-06-18
4+
5+
## 🔌 API
6+
7+
- Add `subscribeServerLogs` to capture all server logs. (see PR [#2558](https://github.com/tetherto/qvac/pull/2558)) - See [API changes](./api.md)
8+
- Friendly, field-level validation errors for user input. (see PR [#2618](https://github.com/tetherto/qvac/pull/2618)) - See [API changes](./api.md)
9+
10+
## 🐞 Fixes
11+
12+
- Recover Qwen hybrid tool-call frames. (see PR [#2677](https://github.com/tetherto/qvac/pull/2677))
13+
14+
## 🧪 Tests
15+
16+
- Enable GPU on TTS sdk tests. (see PR [#2624](https://github.com/tetherto/qvac/pull/2624))
17+
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# QVAC SDK v0.13.4 Release Notes
2+
3+
📦 **NPM:** https://www.npmjs.com/package/@qvac/sdk/v/0.13.4
4+
5+
A patch release that adds two developer-experience APIs — a single subscription
6+
for all server logs and friendlier input-validation errors — and hardens
7+
tool-call parsing for Qwen models used in agentic workflows.
8+
9+
## New APIs
10+
11+
### Subscribe to all server logs at once
12+
13+
You can now capture every server-side log through one subscription instead of
14+
wiring up a `loggingStream()` per model or request. `subscribeServerLogs`
15+
delivers each log entry (level, namespace, message) to a single handler and
16+
returns an unsubscribe function.
17+
18+
```typescript
19+
import { subscribeServerLogs } from "@qvac/sdk";
20+
21+
const unsubscribe = subscribeServerLogs((log) => {
22+
console.log(`[${log.level}] [${log.namespace}] ${log.message}`);
23+
});
24+
25+
// later
26+
unsubscribe();
27+
```
28+
29+
### Field-level validation errors for user input
30+
31+
Invalid request input now surfaces as a `RequestValidationFailedError` with a
32+
clear, field-level message pointing at the exact key and location that failed,
33+
instead of an opaque rejection. This makes it much faster to spot typos and
34+
unsupported options in calls like `loadModel`.
35+
36+
```typescript
37+
import { loadModel, RequestValidationFailedError, LLAMA_3_2_1B_INST_Q4_0 } from "@qvac/sdk";
38+
39+
try {
40+
await loadModel({ modelSrc: LLAMA_3_2_1B_INST_Q4_0, modelConfig: { dtx_size: 4096 } });
41+
} catch (err) {
42+
if (err instanceof RequestValidationFailedError) {
43+
console.error(err.message);
44+
// Invalid request:
45+
// ✖ Unrecognized key: "dtx_size"
46+
// → at modelConfig
47+
}
48+
}
49+
```
50+
51+
## Bug Fixes
52+
53+
### Recover malformed Qwen tool-call frames
54+
55+
Qwen3.5/3.6 can intermittently emit a malformed tool-call frame that fuses its
56+
XML and JSON tool templates, embedding the `function=<name>` token as a bare
57+
string key inside an otherwise JSON object. Previously the parser rejected that
58+
frame as invalid JSON, so no structured tool call was produced and callers saw
59+
the raw markup as assistant text. The parser now recognizes and repairs this
60+
specific shape, so the tool call is recovered and dispatched correctly.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# 🔌 API Changes v0.13.4
2+
3+
## Add `subscribeServerLogs` to capture all server logs
4+
5+
PR: [#2558](https://github.com/tetherto/qvac/pull/2558)
6+
7+
```typescript
8+
import { subscribeServerLogs } from "@qvac/sdk";
9+
10+
// One handler for every server-side log — no per-ID loggingStream() calls.
11+
const unsubscribe = subscribeServerLogs((log) => {
12+
console.log(`[${log.level}] [${log.namespace}] ${log.message}`);
13+
});
14+
15+
// later
16+
unsubscribe();
17+
```
18+
19+
---
20+
21+
## Friendly, field-level validation errors for user input
22+
23+
PR: [#2618](https://github.com/tetherto/qvac/pull/2618)
24+
25+
```typescript
26+
import { loadModel, RequestValidationFailedError, LLAMA_3_2_1B_INST_Q4_0 } from "@qvac/sdk";
27+
28+
try {
29+
await loadModel({ modelSrc: LLAMA_3_2_1B_INST_Q4_0, modelConfig: { dtx_size: 4096 } });
30+
} catch (err) {
31+
if (err instanceof RequestValidationFailedError) {
32+
console.error(err.message);
33+
// Invalid request:
34+
// ✖ Unrecognized key: "dtx_size"
35+
// → at modelConfig
36+
}
37+
}
38+
```
39+
40+
---
41+

packages/sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@qvac/sdk",
3-
"version": "0.13.3",
3+
"version": "0.13.4",
44
"license": "Apache-2.0",
55
"repository": {
66
"type": "git",

0 commit comments

Comments
 (0)