0.43.0 (2026-11-05)
⚠ BREAKING CHANGES
- mcp: port MCP servers to SDK 2.x (#4603)
Features
- ccr: answer headroom_retrieve on streaming chat completions (#4631) (31dcaf4)
- mcp: port MCP servers to SDK 2.x (#4603) (ee2252a)
- plugins: headroom skill for Claude Code, Codex, Copilot and skills.sh (#4533) (66e1467)
- savings: show the proxy's model-routing savings in headroom savings (#4304) (aaab338)
Bug Fixes
- [BUG] A timeout in one image compression call resets the shared worker pool and affects concurrent requests (#4528) (e9bcfe7)
- [BUG] DirectMem0Adapter.search_memories calls removed mem0 search API (#4518) (d9cee45)
- [BUG] Saved request metrics lose their cache optimization fields (#4584) (b4c9bdf)
- [BUG] Volatile SQLite metrics stores lose their schema before the first save (#4633) (d8ff0fe)
- Add info about apply to README.md (#1592) (4d34680)
- backends/litellm: keep cache_control on text blocks for Bedrock prompt caching (#4565) (23a5bb1)
- backends: forward the standard service_tier param (litellm + anyllm) (#2468) (62cc38a)
- cache: build semantic entry before evicting so a failed embedding keeps live entries (#4581) (0d4c450)
- cache: count a tool_result with no text as replayable in the frozen prefix (#4523) (fba09f6)
- cache: fail closed on SQLite corruption instead of deleting the store online (#4361) (9801833)
- cache: invalidate configured registry instances on replacement (#4363) (1bcdca2)
- cache: namespace SemanticCacheLayer by provider, model and metadata (#4473) (99cdaaf)
- cache: preserve OpenAI tool block metadata on cached replay (#4334) (f1035ac)
- cache: scope router results to request compression policy (#4590) (5d40fe7)
- ccr: buffer a stream only for a marker new this turn (#4607) (946a70c)
- ccr: keep proactive expansion out of the cached prefix (#4300) (b1f340e)
- cli: document that code-aware compression is enabled by default (#4616) (affd17c)
- client: close upstream responses when wrapped streams are closed (#4482) (3d8dcf4)
- client: honor configured cache optimizer enablement (#4501) (d4c0810)
- client: preserve Anthropic create stream flags (#4500) (3910caa)
- codex: accept multi-line inline tables in Codex config.toml (#4436) (4a851ed)
- compaction: reject negative dictionary indices and non-array legends in expand_compacted (#4470) (3c1fcbd)
- core: case-insensitive Bearer scheme, clamp SQLite CCR TTLs, redact the Redis URL in logs (#4561) (9e8cc64)
- dedup: bound line-number digit run and never fold into a longer pointer (#4488) (21e8867)
- deps: clear the glob and minimatch npm audit findings (#4599) (2e49e53)
- diff: keep combined-diff changes made against a later parent (#4318) (4b788fd)
- docker: install the redis extra in every image (#4514) (8d5dde7)
- docker: pass RUNTIME_HOME=/root for root bake targets (#4445) (670767e)
- doctor: detect root openai_base_url Codex routing and agent-configured proxy ports (#4490) (222f2d1)
- evals: reject changed numeric probe values (#4502) (1fe8549)
- install: stabilize Windows task lifecycle and eliminate console window popup (#4627) (6b903cb)
- install: tolerate absent Windows tasks in stop_supervisor (#4465) (#4468) (50af2ff)
- kompress: keep words past the tokenizer's truncation point (#4328) (bb13384)
- kompress: read the pinned snapshot from Python's one HF cache in the native proxy (#4438) (eef44f6)
- langgraph: replace the compressed ToolMessage in graph state (#4620) (70a8f09)
- mcp: confine headroom_read to the workspace (GHSA-8g49-pg6g-xgrf) (#4525) (8ab2e91)
- memory: bound verb-pattern word runs to stop quadratic backtracking in bridge import (#4370) (#4376) (d232d09)
- memory: fail close unresolved project operations (#2637) (957ab18)
- memory: keep learned evidence until persistence succeeds (#4229) (662a7f6)
- memory: preserve parent scopes when clearing memories (#4305) (a8375a1)
- mixed-content: do not carve ISO-timestamped log rows as search results (#4463) (abbade9)
- offline: guard the learn and memory-eval LLM calls under HEADROOM_OFFLINE (#4344) (dd361bb)
- openclaw/release: ship responsive npm integrations (#1458) (33f2044)
- openclaw: record turn advancements as one marker file per key (#4212) (24acbe8)
- opencode: only route POST requests to LLM endpoint paths (#4464) (336d462)
- opencode: route Copilot Claude models through the proxy (#4594) (3d9a6f2)
- output-savings: rewrite a pre-rule ledger once instead of warning on every /stats poll (#4196) (96e81ac)
- packaging: rename the sandbox extra to lean and correct SECURITY.md claims (#3727) (09b7e8c)
- packaging: use direct CLI module entry point (#2665) (2892214)
- pipeline: store the pipeline input in CCR behind offload markers (#4576) (4d7765c)
- pricing: add Claude Haiku 5.5 rates, 1M context and its 100K long-prompt card (#4037) (703755e)
- privacy: turn off Mem0's PostHog telemetry by default (#4619) (fe69f38)
- providers: isolate resolved Anthropic context limits (#4593) (51258ef)
- proxy/memory: harden _extract_tool_calls against malformed choices and blocks (#2483) (effa5a5)
- proxy: allow loopback-published container hosts to access /debug/memory (#4259) (e546e71)
- proxy: answer /api/hello probes behind the token gate, log rejection context (#4150) (673831a)
- proxy: cap cache_control breakpoints on OpenAI chat path (#4471) (#4491) (55602fc)
- proxy: do not book Gemini countTokens as a request outcome (#4412) (4d2dd62)
- proxy: don't fail startup when libc_ver() can't read the interpreter (#4519) (28172a9)
- proxy: forward Copilot accounting headers on streaming path (#4431) (66023a0)
- proxy: handle ClientDisconnect in anthropic_messages (#3532) (251d149)
- proxy: honor x-headroom-base-url on provider passthrough routes (#4596) (5c8772b)
- proxy: install SOCKS support for websocket proxies (#3357) (79181ca)
- proxy: keep Gemini memory context on entries with non-text parts (#4506) (35a2b76)
- proxy: keep health probes and the Codex attestation out of the proxy log (#4611) (78736a1)
- proxy: keep read maturation out of the provider-confirmed prefix (#4522) (526e06b)
- proxy: keep tool deferral on Copilot Business/Enterprise/Individual hosts (#4608) (be456d4)
- proxy: log unknown model ids as one bounded token; skip unparseable PERF lines (#4374) (c014bd6)
- proxy: preserve response cache keys across in-place hooks (#4457) (03590cd)
- proxy: recognise every local spelling of the proxy in the cc-switch loop guard (#4405) (d9958bf)
- proxy: reconcile Chat content-block cache markers after prefix replay (#4333) (35ca9b8)
- proxy: route /v1/models to the x-headroom-base-url upstream (#4308) (6ef52c2)
- proxy: skip memory-context search in cache mode on OpenAI routes (#4632) (365f6fe)
- proxy: skip memory-context search on OpenAI paths in cache mode (#4634) (3654037)
- proxy: skip the memory-context search in cache mode (#4606) (053925b)
- proxy: strip only one leading space from SSE field values (#4306) (9226eaf)
- proxy: strip upstream transport framing headers from Gemini response replays (#4605) (dfcac78)
- read-lifecycle: keep Reads fresh after a failed Edit or Write (#4461) (4c3799f)
- relevance: cap embedding batch size so ORT's arena stays small (#4507) (a2d4fe7)
- relevance: hand the embedding arena back after each run on macOS (#4567) (2363f83)
- relevance: load the Rust default embedder from Python's pinned snapshot (#4190) (9bb4b13)
- router: keep small shell results verbatim (#3590) (#4426) (4ee6164)
- router: preserve read protection for quiet sed options (#4521) (312ffec)
- router: validate lossless provider output on the excluded-tool path (#4486) (9f068a6)
- scripts: resolve hooks dir via git so install-git-hooks works in linked worktrees (#4176) (0f4275f)
- sdk: carry Vercel AI SDK reasoning parts and provider options through compression (#4564) (a26faae)
- sdk: send Anthropic messages to /v1/compress natively so thinking blocks survive (#4489) (cd5e2b9)
- security: lstat before narrowing sqlite files (#4527) (2cf64ef)
- smart-crusher: preserve unchanged JSON bytes (#4044) (93279f3)
- tabular: keep empty records and separator-like Markdown body rows (#4582) (5cebb90)
- tabular: keep interior blank CSV rows instead of dropping them (#4563) (8c360ca)
- thinking: isolate compaction memo by compressor instance (#4569) (5dcb1e4)
- thinking: leave a thinking block with a null or non-string value unchanged (#4562) (cc1eb54)
- toin: preserve stores that exceed the byte limit (#4589) (f9cae66)
- toin: retain pending changes after filesystem save failures (#4568) (8b15a15)
- toin: skip a malformed pattern instead of aborting the store load (#4484) (8b628d9)
- tokenizers: coerce structured text values in message token counters (#4472) (6cc27a4)
- tokenizers: don't cache token-count inputs larger than max_chars (#4469) (aebb729)
- tokenizers: price Anthropic document blocks by page count, not as (fc1ba89)
- tokenizers: price Anthropic document blocks by page count, not as base64 text (#4441) (fc1ba89)
- tokenizers: resolve tiktoken encoding for gateway-prefixed model ids (#4637) (e9331b6)
- transforms: enforce role, mutable, and cache zone guards in batch compression (#4480) (#4494) (40cd7e7)
- transforms: honour Subscription toin_read_only when the router calls SmartCrusher (#4493) (7c11d46)
- transforms: preserve YAML block scalar data during comment elision (#4498) (534cec0)
- transforms: recognise code fences whose info string is not a bare word (#4291) (a8df6f9)
- transforms: stop an embedded markdown table from dropping the rest of a tool result (#4216) (b66c9c7)
- transforms: tolerate malformed assistant tool calls in ContentRouter.apply (#4459) (cddd2fd)
- update-check: skip releases with no files and do not fall back to an uninstallable version (#4560) (c1dae5a)
- use all user text blocks for relevance scoring (#4628) (12dca26)
- wrap: overwrite drifted selfheal hook command instead of skipping it (#2723) (2643f34)
- wrap: route OMP OpenAI providers through Headroom (#2755) (fae1e84)
Dependencies
- Bump @anthropic-ai/sdk from 0.133.0 to 1.3.0 in /sdk/typescript (#4554) (74277d4)
- Bump lru from 0.18.5 to 0.19.0 (#4382) (038af59)
- bump ruff from 0.17.0 to 0.17.2 in the pip-minor-patch group across 1 directory (#4380) (64f43bd)
- bump ruff from 0.17.2 to 0.17.3 in the pip-minor-patch group (#4652) (cb9602a)
- Bump the cargo-minor-patch group across 1 directory with 12 updates (#4553) (b9049d7)
- Bump the npm-minor-patch group across 1 directory with 6 updates (#4621) (5e4827d)
- Bump the npm-minor-patch group across 2 directories with 14 updates (#4455) (f10725e)
- Bump the npm-minor-patch group across 3 directories with 9 updates (#4495) (f367728)
- Bump tsup from 8.5.1 to 9.0.0 in /plugins/openclaw (#4384) (9d87151)
- Bump tsup from 8.5.1 to 9.0.0 in /plugins/opencode (#4385) (99e223c)
- Bump tsup from 8.5.1 to 9.0.0 in /sdk/typescript (#4386) (e666fd8)
- qualify latest Anthropic SDK 1.4.0 in docs (#4556) (65bcc4c)
- qualify latest compatible docs and E2E tools (#4580) (e42f74e)
- require Python 3.11; clear Dependabot alerts in the 3.10 lock fork (#4517) (3c6f82b)
- update tomlkit requirement from <1.0,>=0.15.0 to >=0.15.2,<1.0 (#4653) (00d5a5c)
Want more savings? Headroom Enterprise saves more for teams and enterprises. Talk to us at hello@headroomlabs.ai or headroomlabs.ai.