Skip to content

QVAC-24064 chore: release @qvac/cli 0.14.0 - #4545

Draft
opaninakuffo wants to merge 4 commits into
release-cli-0.14.0from
chore/cli-0.14.0-changelog
Draft

opaninakuffo wants to merge 4 commits into
release-cli-0.14.0from
chore/cli-0.14.0-changelog

Conversation

@opaninakuffo

@opaninakuffo opaninakuffo commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

🎯 What problem does this PR solve?

Cuts @qvac/cli 0.14.0 from release-cli-0.14.0 (current main at cut time). Follows @qvac/sdk 0.20.0. Changelog base is the 0.13.1 backmerge 752eddefd.

Metadata plus one late pick: #4524 (tool_choice on the serve OpenAI routes) merged to main after the cut, so it is cherry-picked here. Do not publish until @qvac/sdk@0.20.0 is on npm.

📝 How does it solve it?

  • Version 0.13.10.14.0; @qvac/sdk ^0.19.0^0.20.0
  • Cherry-pick #4524 (52c7c325d) onto this release head
  • Changelog: #4389 diffusion configure flags, #4428 tts-ggml 0.9.x host packages, serve APIs that shipped after the 0.13.1 tag (#4249 KV-cache reclaim, #4351 MiniMax-H3 /v1/videos, #4414 TTS 0.8.x load options), and #4524 tool_choice on /v1/chat/completions and /v1/responses. #4470 is infra and omitted from CHANGELOG_LLM.md
  • README committed SDK range updated to ^0.20.0
  • NOTICE: restamped @qvac/sdk@0.20.0, @qvac/inference@0.20.0, @qvac/rag@0.8.1, @qvac/llm-llamacpp@0.53.0, @qvac/fabric@0.16.0. Full JS regen still needs published @qvac/sdk@0.20.0.

🧪 How was it tested?

  • Changelog generator: --package=cli --base-commit=752eddefd --base-version=0.13.1 --release-type=minor
  • prettier --check on packages/cli/CHANGELOG.md and changelog/0.14.0/**/*.md
  • #4524 already had unit + e2e coverage; cherry-pick applied clean

💥 Breaking Changes

qvac configure no longer offers clip_on_cpu / vae_on_cpu / control_net_cpu. Use params_backend / backend / max_vram / stream_layers.

BEFORE:

{
  "clip_on_cpu": true,
  "vae_on_cpu": true,
  "control_net_cpu": true
}

AFTER:

{
  "params_backend": "te=cpu,vae=cpu",
  "backend": "controlnet=cpu"
}

🔌 API Changes

Copied from changelog/0.14.0/api.md:

  • #4249 DELETE /qvac/v1/kv_cache
  • #4351 POST /v1/videos (MiniMax-H3)
  • #4414 POST /v1/audio/speech TTS 0.8.x load options
  • #4428 tts-ggml 0.9.x host packages
  • #4524 tool_choice on POST /v1/chat/completions and POST /v1/responses

@github-actions

Copy link
Copy Markdown
Contributor

License compliance — clean

No new dependency license findings in this PR.

Warn-only (shadow) mode — this check does not block merges yet.

Updated automatically by the canonical license compliance workflow.

NOTICE presence (advisory)

Missing NOTICE (advisory, does not block):

  • ./docs/website
  • ./packages/fabric/test/integration
  • ./packages/llm-llamacpp/benchmarks/server
  • ./packages/llm-llamacpp/benchmarks/performance
  • ./packages/inference-addon-cpp/mobile
  • ./packages/asr-ggml/benchmarks/server
  • ./packages/embed-llamacpp/benchmarks/server
  • ./packages/embed-llamacpp/benchmarks/performance
  • ./packages/sdk/e2e
  • ./packages/vla-ggml/sim/server
  • ./.github/actions/release-merge-guard

@opaninakuffo opaninakuffo changed the title chore[bc|notask]: release @qvac/cli 0.14.0 QVAC-24064 chore[bc]: release @qvac/cli 0.14.0 Sep 17, 2026
#4249, #4351, and #4414 landed on serve since 0.13.1 and were missing from the
0.14.0 notes. NOTICE pins for sdk/inference/rag/llm-llamacpp/fabric follow the
0.20.0 lockstep; full JS regen still needs published @qvac/sdk@0.20.0.
@opaninakuffo opaninakuffo changed the title QVAC-24064 chore[bc]: release @qvac/cli 0.14.0 QVAC-24064 chore: release @qvac/cli 0.14.0 Sep 18, 2026
simon-iribarren and others added 2 commits September 18, 2026 13:17
…4524)

* QVAC-23460 feat[api]: accept tool_choice on the serve OpenAI routes

The SDK takes generationParams.tool_choice as a bare string, but serve
never read the field, so a client asking for a forced tool silently got
an ordinary sampled turn.

Chat and Responses now map it: the mode strings pass through, and the
object form collapses to the tool name the SDK wants (chat nests it under
`function`, Responses flattens it). A demanding choice with no matching
tool is rejected as 400 invalid_tool_choice rather than reaching
completion() and coming back a 500.

toolError events are drained and logged with their codes. OpenAI has no
response field for a tool call that failed to parse, and without the log
line an empty `stop` response looks like the model just chose not to
call one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* QVAC-23460 test: pin invalid_tool_choice on the wire

The mapper was unit-tested but the 400 itself wasn't, so a route that
stopped translating InvalidToolChoiceError would still have looked green.

Loads the model with tools on, so these can only be the tool_choice check
and never the load-flag gate tools-flag.test.ts covers.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* QVAC-23460 test: cover the tool_choice success path over HTTP

The e2e cases were all rejections, so nothing proved a valid tool_choice
actually reaches the SDK -- only that bad input is turned away.

Adds a completionOverride test seam next to the existing video and cancel
ones, and asserts what serve hands completion(): required as-is, both
object forms flattened to the tool name, absent when unset. Also pins the
documented shape of a run whose only tool call failed to parse.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* QVAC-23460 fix: reject a tool_choice naming a reserved mode, cover streaming

The SDK packs mode and target into one string, so targeting a tool
actually named none collapsed to the none mode: tool calling switched
off, the declared-tools check skipped, and a 200 with no sign anything
was wrong. The object form still distinguishes the two here, so the
collision is rejected at this layer.

Streaming built its own argument object on both routes and nothing
covered it -- dropping generationParams from either spread left the
suite green while tool_choice was dead for the clients that actually
stream. Adds a stream: true case per route.

Also fills out the responses success cases (required mode, function_call
item in the body) and adds one real-model run, which is the only thing
that puts tool_choice through the SDK's strict schema and its tools
refinement rather than a stub.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* QVAC-23460 test: keep the real-model tool_choice case off a stale prefix

Reusing the prompt from the case above hit a kv-cache prefix rendered
with thinking on; flipping reasoning_budget under it corrupted the
continuation, so the run spent its budget on repeated fragments and
finished on length instead of a call. A required tool_choice on a warm
cache is fine on its own -- only the changed reasoning_budget is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* QVAC-23460 test: stop pinning the sampler in the real-model tool_choice case

The case exists to prove tool_choice survives the SDK's strict schema and
its tools refinement, which the 200 shows. Requiring finish_reason
tool_calls made it depend on the shared server's cache state instead: the
kv prefix carries turns rendered with thinking on, this request turns it
off, and against a stale prefix the run finishes on length. It passed
locally and failed in CI on both prompts.

The tool name is still checked when a call comes back. The grammar itself
is covered deterministically by the addon's integration test.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
#4524 landed on main after the 0.14.0 cut. Cherry-picked onto this branch;
the notes need the OpenAI chat/Responses tool_choice surface.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants