Skip to content

Release v0.35.0

Latest

Choose a tag to compare

@JerrettDavis JerrettDavis released this 13 Aug 03:47
93f2d7a

What's Changed

  • fix: emit SSE ping before message_start on Bedrock streaming path (issue #902) by @MrAshRhodes in #1080
  • fix(litellm): add async_post_call_success_hook to HeadroomCallback by @khaosdoctor in #1322
  • deps: bump brace-expansion from 5.0.7 to 5.0.9 in /docs by @dependabot[bot] in #2751
  • deps: bump next from 16.2.10 to 16.3.0 in /docs by @dependabot[bot] in #2750
  • deps: bump postcss from 8.5.19 to 8.5.25 in /plugins/openclaw by @dependabot[bot] in #2749
  • deps: bump postcss from 8.5.19 to 8.5.25 in /plugins/opencode by @dependabot[bot] in #2748
  • deps: bump postcss from 8.5.19 to 8.5.25 in /sdk/typescript by @dependabot[bot] in #2747
  • fix(proxy): unwrap Hermes tool_call bridge in tool name map by @pgjh in #2717
  • fix(ccr): preserve exact SQLite TTL boundary by @Agistaris in #2669
  • fix(tokenizer): coerce non-string tool_call fields before counting by @Parideboy in #2801
  • fix(beacon): report all-layers savings, not context-compression only by @chopratejas in #2796
  • test(ccr): cross SQLite max lifetime boundary by @JerrettDavis in #2794
  • fix(deps): enforce audited transitive dependency floors by @JerrettDavis in #2791
  • feat(cli,pricing): add CLI extension seam and prompt-cache TTL pricing by @chopratejas in #2802
  • fix(opencode): don't preload a missing transport shim into child processes by @chopratejas in #2806
  • fix(proxy): enable tool search by default and repair poisoned transcripts by @chopratejas in #2807
  • Per-request backend selection for routing extensions by @chopratejas in #2809
  • fix(beacon): split session failures by status code by @chopratejas in #2815
  • fix(proxy): graceful shutdown and reliable Ctrl+C exit by @neogenix in #621
  • feat(beacon): allowlist the routing summary key by @chopratejas in #2818
  • fix(deps): bump h2 to 4.4.1 for CVE-2026-71554 by @chopratejas in #2839
  • perf: cut hot-path latency 27% (token-count memo, startup preloads, JSON scan memo) by @chopratejas in #2838
  • fix(proxy): stop discarding compressed Codex WS later-frame payloads by @ashishpatel26 in #2823
  • test(openclaw): match inherited PATH shell check by @JerrettDavis in #2821
  • fix(proxy/gemini): keep streaming-parity baseline so eligible_pct can't exceed 100 by @abhay-codes07 in #2824
  • fix(memory): bound the TrafficLearner pending-pattern accumulator (memory leak) by @abhay-codes07 in #2579
  • fix(proxy/anthropic): inject headroom_retrieve whenever a CCR marker is present, not only for new markers by @abhay-codes07 in #2848
  • fix(install): stop baking the host memory DB path into a container deployment by @abhay-codes07 in #2845
  • fix(install): use --userns=keep-id under Podman so bind-mount writes don't fail by @abhay-codes07 in #2846
  • fix(wrap): stop the launch cwd from shadowing the installed package in the proxy subprocess by @abhay-codes07 in #2843
  • fix(openai): skip Responses tool-search deferral for clients that cannot execute it by @rodboev in #2696
  • fix(onnx): stop ONNX thread pools from spinning idle cores (#2495) by @abhay-codes07 in #2540
  • fix(anthropic): strip first-party tool search on custom upstreams by @rodboev in #2539
  • perf(subscription): skip transcripts older than the window in compute_window_tokens by @romulomorgan in #2861
  • fix(proxy/openai): run response hooks on Responses, and bill their re-drives by @chopratejas in #2872
  • Beacon: hourly R2 compaction, per-strategy savings, and a stack that reports by @chopratejas in #2853
  • perf(proxy): bound upstream calls and hot-path costs by @chopratejas in #2852
  • fix(litellm): don't forward a caller key the target cannot accept by @chopratejas in #2883
  • deps: bump postcss from 8.5.19 to 8.5.26 in /docs by @dependabot[bot] in #2881
  • build(deps): bump gitpython from 3.1.50 to 3.1.54 in the uv group across 1 directory by @dependabot[bot] in #2575
  • deps: bump ruff from 0.15.17 to 0.15.22 in the pip-minor-patch group by @dependabot[bot] in #2501
  • deps: bump rusqlite from 0.32.1 to 0.40.1 by @dependabot[bot] in #2287
  • deps: bump bytesize from 1.3.3 to 2.4.2 by @dependabot[bot] in #2286
  • deps: bump hf-hub from 0.4.3 to 0.5.0 by @dependabot[bot] in #2285
  • fix(cache): stabilize Anthropic block-growing lineages by @chopratejas in #2917
  • fix(proxy/anthropic): run tool-search history repair after turn hooks by @gglucass in #2889
  • fix(wrap/serena): install Serena from the serena-agent PyPI wheel, not the git source by @abhay-codes07 in #2877
  • fix(opencode): ship the transport hook-shim so wheel installs route Node child traffic by @abhay-codes07 in #2878
  • fix(opencode): keep Claude models off OpenAI provider by @SulimanAbdulrazzaq in #2913
  • fix(proxy): cancel periodic TOIN task on shutdown by @abhinavkr26104 in #2906
  • fix(cache): bound compression cache bookkeeping by @Robert2547 in #2875
  • fix(proxy): emit request log timestamps in UTC by @SulimanAbdulrazzaq in #2912
  • fix(memory): close MCP backend on shutdown by @abhinavkr26104 in #2905
  • fix(proxy): cache litellm model resolution to stop repeated Provider List spam by @connectsudhindra-gif in #2860
  • fix(litellm): close shared cloud client by @abhinavkr26104 in #2903
  • fix(oauth2): make repository lint checks pass by @abhinavkr26104 in #2902
  • fix(install): trust Docker bridge for dashboard metadata by @SulimanAbdulrazzaq in #2914
  • fix(memory): close DirectMem0 resources by @abhinavkr26104 in #2904
  • fix(memory): sync FTS5 and vector indexes on CLI delete/edit/prune/purge by @gingeekrishna in #2869
  • fix(settings): accept documented HEADROOM_* env names as settings keys by @axelray-dev in #2833
  • fix(cli/update): let install ownership win over bare /.dockerenv so venv installs self-update by @abhay-codes07 in #2830
  • fix(toin): bound private query and pattern retention by @chopratejas in #2929
  • fix(proxy): guard telemetry and TOIN endpoints by @chopratejas in #2930
  • fix(ccr): avoid injecting tool on chat streaming by @chopratejas in #2931
  • fix(wrap/opencode): verify the opencode binary before mutating config by @abhay-codes07 in #2923
  • fix(wrap/claude): keep --1m effective when an explicit --model is passed through by @abhay-codes07 in #2922
  • fix(cache): mirror client cache_control positions instead of single-marker consolidation by @gglucass in #2919
  • fix(backends/anyllm): convert Anthropic tools and tool_choice to OpenAI shape by @abhay-codes07 in #2892
  • fix(backends/anyllm): stream tool_use blocks and map finish_reason on the streaming path by @abhay-codes07 in #2890
  • fix(content-router): protect custom-tag blocks before mixed-content section split by @gglucass in #2887
  • fix(proxy): close the upstream stream when a streaming body is never consumed by @abhay-codes07 in #2882
  • fix(proxy): include tool_search_deferral savings in the savings ledger by @abhay-codes07 in #2880
  • fix: Vertex model pricing shows $0.00 for versioned model names and vertex:anthropic provider by @yossiovadia in #2517
  • fix(proxy): allow settings routes for trusted gateway/dashboard clients by @Parideboy in #2491
  • fix(ccr): report embedded hashes from compress endpoint by @Alexsun1one in #717
  • fix(health): label kompress as degraded/optional when not yet loaded by @gingeekrishna in #2865
  • fix(proxy): gate mid-turn message coalescing to Claude Code clients by @tenderdeve in #1643
  • fix(proxy): give each Codex /v1/responses WS turn a unique request_id by @rodboev in #2164
  • fix(learn/gemini): detect the project path for JSONL sessions by @abhay-codes07 in #2229
  • fix(learn/gemini): stop double-counting session tokens by @abhay-codes07 in #2230
  • fix(memory): make explicit-project and user store keys collision-resistant by @abhay-codes07 in #2231
  • fix(transforms/smart_crusher): don't crash on a tool call with a null function by @abhay-codes07 in #2232
  • fix(ci): publish latest from the root Docker manifest by @rodboev in #2252
  • fix(gemini): resolve native CCR retrieval calls by @rodboev in #2253
  • fix(tokenizer): price CJK in the Rust fixed-ratio estimator (Python parity) by @lifeodyssey in #2260
  • fix(proxy/openai): don't crash the Responses memory tool loops on null arguments by @abhay-codes07 in #2273
  • fix(learn/grok): detect a Windows absolute project path by @abhay-codes07 in #2283
  • fix(learn): stop classifying a successful exit code 0 as an error by @abhay-codes07 in #2289
  • fix(memory): keep vector metadata in sync by @superdiaodiao in #2295
  • fix(proxy/batch): don't crash an OpenAI batch on a valid-JSON non-object line by @abhay-codes07 in #2316
  • fix(proxy/bedrock): report uncached input tokens from backend usage, not the live-zone count by @abhay-codes07 in #2318
  • fix(transforms/adaptive-sizer): honor max_k on small-input fast path by @abhay-codes07 in #2319
  • fix(backends/litellm): None-guard core token counts in OpenAI usage block by @abhay-codes07 in #2324
  • fix(proxy): preserve signed Anthropic thinking blocks on outbound re-serialize by @axelray-dev in #2254
  • fix(proxy): pass through cross-region prefixed Bedrock model IDs directly by @mhaitana in #2330
  • fix(proxy/openai): feed Codex WS traffic into the traffic learner by @abhay-codes07 in #2334
  • fix(proxy): compress cache-mode cold starts and tag prefix-mismatch passthrough by @Parideboy in #2365
  • fix: publish headroom-opencode in release workflow by @rodboev in #2372
  • fix(proxy): port session-sticky beta headers to the Rust proxy by @abcgco in #2381
  • fix(wrap): honor Copilot OAuth wire-api override and model default by @mvanhorn in #2387
  • fix(subscription): dedup transcript usage by message id (#2340 token inflation) by @abhay-codes07 in #2408
  • fix(proxy): time-cap the compression timeout-debt quarantine (#2360) by @abhay-codes07 in #2412
  • fix(proxy/anthropic): None-guard usage token counts on the direct buffered path by @abhay-codes07 in #2434
  • fix(install/windows): register persistent-task from S4U hidden XML (#2453) by @Parideboy in #2459
  • fix(proxy/metrics): escape label values in the Prometheus export by @inix-x in #2463
  • fix(ccr): tolerate null/malformed OpenAI data in response handling by @abhay-codes07 in #2467
  • fix(install): don't crash the PowerShell installer when $PROFILE is unset by @abhay-codes07 in #2469
  • fix(memory): don't crash inline memory extraction on a non-object block by @abhay-codes07 in #2470
  • fix(providers/anthropic): don't crash token estimation on null tool_calls by @abhay-codes07 in #2472
  • fix(claude): stop forcing tool search on Foundry by @rodboev in #2477
  • fix(proxy/metrics): cap client-supplied model label cardinality by @inix-x in #2480
  • docs: add guide for using Headroom with OpenCode + DeepSeek by @suvenkatesh97 in #2497
  • docs(transforms): correct stale unit-result-cache placeholder comments by @gglucass in #2506
  • fix(ccr): resolve <ccr:...> markers inline when no retrieve-tool path exists by @Parideboy in #2512
  • fix(doctor): flag ollama launch claude proxy bypass instead of misdirecting by @tenderdeve in #2566
  • fix(providers/openai): bound tiktoken vocab loads with the guarded loader by @gglucass in #2554
  • fix(memory): skip blocks when building the retrieval query (#2195) by @abhay-codes07 in #2541
  • fix(codex): route alpha search through the Codex backend by @rodboev in #2538
  • fix(image): decouple routing types from trained_router so importing the compressor doesn't import torch (#2513) by @abhay-codes07 in #2537
  • fix(observability): aggregate tool savings in OTEL by @chopratejas in #2936
  • fix(proxy): preserve merged session and quarantine contracts by @JerrettDavis in #2943
  • fix(wrap): serialize shared proxy startup by @chopratejas in #2946
  • fix(cache): enforce Anthropic's 1h-before-5m cache_control ordering before forwarding by @Parideboy in #2941
  • deps: bump the cargo-minor-patch group across 1 directory with 22 updates by @dependabot[bot] in #2916
  • chore: release headroom-ai 0.35.0 by @chopratejas in #2792

New Contributors

Full Changelog: v0.34.0...v0.35.0