This release adds 1 notable feature for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+5 more
Affected surfaces
Summary
AI summaryMalformed tool‑call 500 errors no longer leak JSON; rescued calls are executed cleanly.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Low |
Adds tool-call rescue from malformed-500 bodies, parsing Qwen-coder XML blocks into real ToolCall objects. Adds tool-call rescue from malformed-500 bodies, parsing Qwen-coder XML blocks into real ToolCall objects. Source: llm_adapter@2026-07-16 Confidence: high |
— |
| Bugfix | Medium |
Malformed tool-call 500s no longer leak error JSON into the conversation. Malformed tool-call 500s no longer leak error JSON into the conversation. Source: llm_adapter@2026-07-16 Confidence: high |
— |
| Bugfix | Medium |
Arbitrary llamafile 500s now raise BackendError instead of returning error body as text. Arbitrary llamafile 500s now raise BackendError instead of returning error body as text. Source: llm_adapter@2026-07-16 Confidence: high |
— |
Full changelog
A bug-fix release for the llamafile backend. When llama.cpp's tool-call parser rejects malformed model output with a 500, the raw error JSON no longer leaks into the conversation as assistant text — complete tool calls are rescued out of the error body and executed, and unrecoverable ones trigger a clean re-sample nudge.
Added
- Tool-call rescue from malformed-500 bodies. llama.cpp's
Failed to parse inputmessage embeds the rejected generation; forge now leniently re-parses<tool_call>blocks out of it (Qwen-coder XML format) and returns each block that names a tool from the request'stoolsarray as a realToolCall— deduped, with parameters coerced to their declared schema types. Skeleton/preview blocks are passed through too: dispatch rejects them with a[ToolError]on the tool channel, the canonical corrective signal, while complete calls simply execute. Unknown tool names are never fabricated. Rescues are counted onLlamafileClient.rescued_tool_callsand logged, so rescued runs stay auditable.
Fixed
- Malformed tool-call 500s no longer leak error JSON into the conversation. When llama.cpp rejects a malformed or incomplete tool call and nothing can be rescued from the body, forge returns a targeted retry nudge (naming the stutter pattern when a
<tool_call>block was visible, generic otherwise) so the retry loop re-samples a clean call. Previously the raw 500 body was echoed back as if the model had said it.
Changed
- Arbitrary llamafile 500s now fail loud. A 500 that is not a tool-call parse rejection raises
BackendErrorinstead of being returned as aTextResponsecarrying the error body — genuine backend failures now cascade, matching the other clients, rather than entering the conversation as model text.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Forge
All releases →Related context
Related tools
Earlier breaking changes
- v0.7.5 Changes default behavior to replay no reasoning blocks.
- v0.7.4 Deprecates pydantic `.model_*` API on `ToolCall` and `TextResponse` dataclasses; construction no longer validates argument shape.
- v0.7.3 Renames `--mode {native,prompt}` to `--backend-capability {native,prompt}`; no deprecation alias.
- v0.7.0 Unknown‑tool handling now replies with [UnknownToolError] on the tool channel instead of user nudges.
- v0.7.0 Changes error reporting: step enforcement and prerequisite violations now emit tool‑channel messages with [StepEnforcementError] / [PrereqError].
Beta — feedback welcome: [email protected]