github headroomlabs-ai/headroom v0.43.0
Release v0.43.0

latest release: v0.43.1
3 hours ago

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.

Don't miss a new headroom release

NewReleases is sending notifications on new releases.