Repository navigation
v0.6.5
context-guru v0.6.5
The dashboard now prices cache reads correctly: Opus 5.5 and Sonnet 5.5 reads cost 0.05× the input price, and Fable 5.1 and Mythos 5.1 reads cost 0.025×. Before, every model used 0.1×, so the dashboard showed read costs 2 to 4 times too high. Display-only skills no longer take space in the model's skills list. A subagent that has given its final answer gets no more keep-alive pings.
Items marked [Notice] change something you will see, or need an action from you.
What we measured
The keep-alive fixes from v0.6.4 hold on real traffic (#778). One laptop, 1.5 days, about 4,000 requests:
- Ping 2 wrote the conversation again 0 times in 197. Before v0.6.4 it was 26% (80 of 308, $97.97 in 3.9 days).
- A user who came back inside the cache plan read the cache 140 times in 140, also after a sweep question.
- Keep-alive cost $26.22 and saved $120.70 in this period.
- The ping limit stays at 2.
New and changed
- [Notice] Cache reads have the provider's price for each model (#855, #849, #860).
- When the price table gives no
cache_read: Opus 5.5 and Sonnet 5.5 use 0.05× the input price, and Fable 5.1 and Mythos 5.1 use 0.025×. Every other model stays at 0.1×. The source is Anthropic's pricing page. - Read cost,
cost_usd, the savings figures and the keep-alive calculator's ping cost go down for these 4 models. The break-even point moves for them too. - A price table that gives no cache-write rate for GPT before 5.6, Gemini or an unknown model now uses 1.0×, not 1.25×. These families charge no extra for a cache write.
- A price file with a negative cache multiple now fails to load.
- To keep the old 0.1×, set
cache_readon the model's entry, orcache_read_frac: 0.1in the price file.
- When the price table gives no
- [Notice] Display-only skills are out of the model's skills list (#850). Claude Code plugin 0.6.5, Codex plugin 0.2.9.
- 12 Claude Code skills (status, dashboard, chart, fill, heatmap, timeline, session, watch, doctor, statusline, uninstall and update) and 9 Codex skills are now for the user only. The model does not start them by itself.
- You start them with
/context-guru:<name>, or$namein Codex. - This saved about 0.96% of spend on a hosted deployment.
- [Notice] A subagent that has given its final answer gets no keep-alive pings (#859).
- When a subagent ends with a
StructuredOutputcall, its thread is marked finished. Before, it got up to 2 pings that nothing could use. - The band and
cg.pyshow "finished" for that agent. - To turn it off:
cache.keepalive_terminal_tools: []in the host config.
- When a subagent ends with a
- [Notice] A beep when Claude finishes or needs you (#738). Claude Code plugin 0.6.5.
- It is on by default. It plays only on your machine, and nothing goes to the proxy.
- To turn it off: set the plugin's
beepoption tooff, or setCONTEXT_GURU_BEEP=off.
- [Notice] A cache breakpoint at the end of a long tail (#796, #801).
- When the client's last cache mark is far from the end of the request, the proxy adds one mark at the end. The text after the client's mark is then cached, not billed as plain input again.
- Today this happens with Claude Code when
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1is set. It saves about 16% per run on a short task. With default Claude Code settings, nothing changes. - It is on in every preset except
off. To turn it off:cache: { tail_breakpoint: false }.
- The prefix split uses the provider's minimum cache size for each model (#848).
- The proxy splits the system prompt only when its stable part is large enough for the provider to cache it. The minimum is 4,096 tokens on Haiku-class and unnamed models, and 1,024 on others.
- The dashboard's split saving now uses a real token count, so its figure moves.
- New config key:
head_ttl_min_bytes(default 200,000). The oldhead_ttl_min_tokensstill works.
- Session recorder for internal deployments (#649). It is only in a build made with
-tags cg_record(make build-record). The release binary does not have it. In hosted mode, each account turns recording on for itself in Settings. - The dashboard shows OpenAI and Responses tools correctly (#819, #822, #815).
- Responses tools show their real names. Function calls count as used tools. OpenAI function tools show as
toolormcp_tool, notserver_tool. - The skills listing, deferred tools and system prompt of a Responses request are read.
- GPT-5.6 and later threads show a 30-minute cache lifetime, as the keep-alive already uses.
- Responses tools show their real names. Function calls count as used tools. OpenAI function tools show as
Fixed
- A settings save deleted 7 cache tuning keys (#848). The settings page does not send them, so a save removed them. Now a save leaves them alone. A new
cache_resetlist sets named keys back to their defaults. - The bifrost adapter split one conversation into two sessions when the agent compacted (#805). It now uses the session id that the agent sends, with the same rule as the proxy. Session ids from the bifrost adapter change once, at the upgrade.
- Expand missed tool results whose content is a list of blocks (#803). It now reads them as text. The repair writes a short pointer, not a second copy of the removed output.
- The same message in two forms read as two different messages (#787). A message sent once as a plain string and once as one text block now matches. This helps expand restores, summary checkpoints and held sweep answers. Stored values still match.
- The Codex
sessionskill did not load (#852). Its header was not valid YAML. - Smaller fixes:
- Bedrock
cachePointmarks now count as cache marks (#813). cacheinjectplaces breakpoints on Bedrock Mantle, as on Bedrock (#811).- A model id with
fableand noclaudein it, sent through a relay that is not Anthropic's, now gets keep-alive pings (#807). - Cheap-model calls record their 1-hour cache writes in
/stats(#818).
- Bedrock
How to upgrade
- Update the proxy:
/context-guru:update. - Update the plugins from the marketplace: Claude Code plugin 0.6.5, Codex plugin 0.2.9.
- If you started a display-only skill by asking Claude, type
/context-guru:<name>instead. - If you do not want the beep, set the plugin's
beepoption tooff. - For code that imports the library:
reformat.LookbackBlocksmoved toschema.LookbackBlocks. The old name stays as an alias.keepalive.Policy.HeadTTLMinTokensis deprecated: useHeadTTLMinBytes.
Known limits
- The 1-hour cache tier, and a user who comes back 9 to 13 minutes after a text turn, were not tested on real traffic (#778). The data had too few such cases.
- The dashboard's savings after a restart can read too high (#766 part 2). It waits for the counterfactual library (#592).
--dashboard-content-capcannot raise the 4,000-byte limit on stored change text (#765).- Small clean-ups after the history import removal are open (#762).
- After the sweep removes outputs on a cold request, the next turns can write the conversation to the cache again (#729).
- Two threads with identical requests can still send identical pings (#718).
- On a shared proxy with many users, 320 MB may not hold every large thread (#704).
Changelog
- 4d54018: Feat: Add an optional beep when Claude finishes or needs input (#738) (@boazdavid)
- c66c392: chore(plugin): bump the plugins for v0.6.5 (Claude Code 0.6.5, Codex 0.2.9) (#863) (@amiddavid)
- f66d6c1: docs(reformat,offload): say why digests and msgPrint skip the canonical form (#800) (@amiddavid)
- 23c6743: docs(skills): add the refactor-scan skill for duplicate-logic runs (#824) (@amiddavid)
- 1b94641: feat(plugin): keep display-only skills out of the model's skills list (#823) (#850) (@amiddavid)
- 157470d: feat(record): record replayable session traces, opt-in per account (#649) (@michaljacovi)
- 73cb5e4: fix(apply): add a cache breakpoint at the end when the client's last one is far from it (#795) (#796) (@amiddavid)
- 0396dd7: fix(apply): skip an empty text block for every breakpoint step, split not_needed (#801) (@amiddavid)
- 667a00d: fix(codex-plugin): make every skill's front matter valid YAML (#851) (#852) (@amiddavid)
- c2a06dd: fix(modelinfo): per-model cache-read tiers for Opus 5.5, Sonnet 5.5, Fable 5.1, Mythos 5.1 (#855) (@amiddavid)
- 30ee4d1: fix(session): one rule for the explicit session id (#804) (#805) (@amiddavid)
- 4283755: fix(waitcause): a terminal tool call ends the thread, so the keep-alive sends no pings (#859) (@amiddavid)
- fc52617: refactor(apply): one cache-breakpoint placer for in-band follow-ups (#784) (#786) (@amiddavid)
- 86e906f: refactor(apply): size gates say bytes; the split floor counts real tokens (#798) (#848) (@amiddavid)
- 591de14: refactor(keepalive): name the ping-time literals (#810) (@amiddavid)
- 7a64d3e: refactor(modelinfo): one Family() for the Claude tier of a model id (#807) (@amiddavid)
- b4dfbfe: refactor(modelinfo): one function decides a cache price for a model (#860) (@amiddavid)
- e3a5c0d: refactor(modelinfo): one list of providers that accept cache_control (#811) (@amiddavid)
- 28f1d46: refactor(modelinfo): one rule for the provider cache lifetime (#815) (@amiddavid)
- 7cf058a: refactor(modelinfo): one source for the cache price multiples (#849) (@amiddavid)
- f09abdf: refactor(schema): one breakpoint cap and one breakpoint count (#813) (@amiddavid)
- 55b9f86: refactor(schema): one canonical form of a message for cross-request comparison (#783) (#787) (@amiddavid)
- 7b682ae: refactor(schema): one function decides the wire dialect (#817) (#819) (@amiddavid)
- b3014bc: refactor(schema): one raw-JSON text reader for content and tool_result (#803) (@amiddavid)
- 9b8af8f: refactor(skills): one finder for the skills listing, one home for the deferred-tools format (#822) (@amiddavid)
- 9e4da6c: refactor(usage): one parser for the provider usage block (#818) (@amiddavid)
Install
No Go toolchain and no C compiler are needed — the binary is statically linked.
Download the tarball for your platform, untar it, and put context-guru-proxy on your
PATH. The archive unpacks into its own directory, so this is safe to run anywhere:
tar xzf context-guru_*_darwin_arm64.tar.gz
install -m 755 context-guru_*/context-guru-proxy ~/.local/bin/
Then see docs/get-started/quickstart-proxy.md.