Skip to content

feat(compressor): smart collapse, dedup, anti-thrashing, template upgrade, hardening#10088

Merged
teknium1 merged 1 commit into
mainfrom
hermes/hermes-24eb3c49
Apr 15, 2026
Merged

feat(compressor): smart collapse, dedup, anti-thrashing, template upgrade, hardening#10088
teknium1 merged 1 commit into
mainfrom
hermes/hermes-24eb3c49

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Summary

Combined salvage of 5 compression improvement PRs by @kshitijk4poor (from tracking issue #9666):

Follow-up fixes applied during salvage

  • web_extract: reads urls (list) not url (original PR bug)
  • Multimodal list content guards in dedup and prune passes (crash prevention)
  • Kept 'Relevant Files' section in template (original PR removed it)

Skipped

Tests

97/97 compressor tests pass. E2E validated: smart collapse, dedup, arg pruning, anti-thrashing, multimodal safety, note idempotency.

…rade, hardening

Combined salvage of PRs #9661, #9663, #9674, #9677, #9678 by kshitijk4poor.

- Smart tool output collapse: informative 1-line summaries replace generic placeholder
- Dedup identical tool results via MD5 hash, truncate large tool_call arguments
- Anti-thrashing: skip compression after 2 consecutive <10% savings passes
- Structured action-log summary template with numbered actions and Active State
- Hardening: max_tokens 1.3x cap, multimodal safety, note idempotency, adaptive cooldown

Follow-up fixes applied during salvage:
- web_extract: reads 'urls' (list) not 'url' (original PR bug)
- Multimodal list content guards in dedup and prune passes
- Kept 'Relevant Files' section in template (original PR removed it)

Skipped PRs #9665 (user msg preservation — duplication risk) and #9675 (dead code).
@teknium1 teknium1 merged commit 9855190 into main Apr 15, 2026
3 of 5 checks passed
@teknium1 teknium1 deleted the hermes/hermes-24eb3c49 branch April 15, 2026 05:21
Ataraksea pushed a commit to Ataraksea/hermes-agent that referenced this pull request May 6, 2026
ContextEngine.should_compress_preflight() is documented as the per-turn
ingest entry for plugin engines, but run_agent.py never calls it. PR
NousResearch#10088 explicitly noted this as dead code when skipping NousResearch#9675:

> NousResearch#9675 (preflight check) — dead code, run_agent.py never calls
> should_compress_preflight()

This breaks plugin context engines that rely on the hook for per-turn
message ingest. hermes-lcm overrides should_compress_preflight() to
persist messages each turn into its DAG store, but with the hook never
called, the lossless message store stays empty until compress() fires
at the threshold (typically ~96K tokens). Reproducible:

  $ hermes chat -q "test" -Q
  $ sqlite3 ~/.hermes/lcm.db "SELECT COUNT(*) FROM messages;"
  0

(Verified on hermes-agent v0.11.0 with hermes-lcm v0.7.0.)

Add two calls to should_compress_preflight(messages):

1. Top of the main loop, right after api_call_count is incremented —
   per-turn ingest before each API call.
2. End of run_conversation(), before the on_session_end plugin hook —
   final flush so the last assistant message reaches the engine when
   the turn exited via the no-tool-calls branch and skipped the
   per-turn hook above.

The return value is discarded; compression is still decided by the
later should_compress(_real_tokens) call which uses the provider-
reported token count. Both calls are wrapped in try/except so a
misbehaving plugin engine cannot break the conversation loop.

Default ContextEngine.should_compress_preflight() returns False with no
work, so this is zero overhead for the built-in ContextCompressor and
any engine that does not override the hook.

After this fix:
  $ hermes chat -q "test" -Q
  $ sqlite3 ~/.hermes/lcm.db "SELECT COUNT(*) FROM messages;"
  2

Refs:
- NousResearch#9675 (closed: feat(compressor): implement preflight compression check)
- NousResearch#10088 (merged body: skipped NousResearch#9675 as dead code)
- stephenschoettler/hermes-lcm#68 (LCM author flagged host integration
  issue but could not file upstream because GitHub Issues was off on a
  different fork)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants