Skip to content

Forge

v0.8.1 Feature

This release adds 1 notable feature for engineering teams evaluating rollout.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

agentic-ai agentic-workflow agents function-calling llama-cpp llamafile
+5 more
llm ollama python self-hosted tool-calling

Affected surfaces

auth rce_ssrf

Summary

AI summary

Malformed tool‑call 500 errors no longer leak JSON; rescued calls are executed cleanly.

Changes in this release

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 input message 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's tools array as a real ToolCall — 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 on LlamafileClient.rescued_tool_calls and 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 BackendError instead of being returned as a TextResponse carrying 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

Track Forge

Get notified when new releases ship.

Sign up free

About Forge

All releases →

Related context

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]