# LocalAI v4.3.0 — Release & Upgrade Intelligence
- **Product:** LocalAI (https://localai.io)
- **Version:** v4.3.0
- **Released:** May 24, 2026
- **Impact Score:** 5/10
- **Breaking Changes:** Not verified
- **Canonical Analysis:** https://changelogs.us/localai/updates/v4.3.0/

## Executive Summary (TL;DR)
LocalAI v4.3.0. Source highlight: 🎉 LocalAI 4.3.0 Release! 🚀

## New Features
- `usage_records` gained `Source` (`apikey` / `web` / `legacy`), `APIKeyID`, `APIKeyName`, plus an idempotent backfill of pre-feature rows on `InitDB`.
- **`refactor(agents): bump skillserver, drop redundant Name` (#9916).** `list_skills` and `search_skills` now return the same shape (only `id`, no duplicated `name`). Adds a Ginkgo regression that drives the LocalAI `FilesystemManager` through an in-process MCP session.
- **Swagger refreshes (#9872, #9962)** keep the OpenAPI surface in sync with the routes added this cycle.
- Plus inline docs updates folded into the feature PRs above (prompt-cache explainer, authentication / usage tracking section, backend signing guide).

## Bug Fixes
- **API-side (#9946)**: `LOCALAI_TRACING_MAX_BODY_BYTES` (default 64 KiB) caps each captured request/response body in the trace middleware. The full payload still flows to the real client; only the trace copy is bounded. `body_truncated` + original `body_bytes` are recorded so the dashboard can surface that truncation happened. Observed before the fix on a live deployment: `/api/traces` returned **44.6 MB** (466 traces, 447 `/embeddings`, top body 1.38 MB). The Traces UI Clear button is also kept 
- **Text-file attachments actually reach the model (regression from react-ui port) (#9896).** `.txt`, `.md`, `.csv`, `.json` content was silently dropped in `useChat.js` (only image_url and audio_url branches added content; the `else` branch only pushed metadata). `Home.jsx` also never called `file.text()` for files attached from the home screen. Both fixed. PDF files still need a parser (PDF.js or server-side extraction) and are flagged as a known limitation.
- **Stream `include_usage` returns non-zero with tools (#9941).** Fixes #9927. `processTools` discarded the cumulative `TokenUsage` from `ComputeChoices`, so the streaming trailer reported `{0, 0, 0}` whenever a `tools` array was present. The fix forwards the authoritative final usage via a sentinel chunk before `close(responses)`, with the outer loop updated to capture before the empty-Choices skip. The OpenAI streaming spec contract is preserved (intermediate chunks still carry no `usage`).
- 🔁 `fix(distributed): route per request across loaded replicas + cache probeHealth` - #9968
- 🧰 `fix(distributed): make admin backend installs resilient and observable` - #9958
- ⏳ `fix(nodes): make per-node backend install async via gallery job queue` - #9928
