Skip to content

fix(tools): chunk long messages in send_message_tool before dispatch (#1552)#1644

Merged
teknium1 merged 5 commits into
mainfrom
hermes/hermes-6bb9911e
Mar 17, 2026
Merged

fix(tools): chunk long messages in send_message_tool before dispatch (#1552)#1644
teknium1 merged 5 commits into
mainfrom
hermes/hermes-6bb9911e

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Summary

Fixes #1552 — salvaged from PR #1557 by @llbn.

Long messages sent via send_message tool or cron auto-delivery silently failed when exceeding platform limits. The gateway adapters handle this via truncate_message() (smart splitting that preserves code blocks, adds part indicators), but the standalone senders in send_message_tool.py bypassed that entirely.

Changes

  • Apply BasePlatformAdapter.truncate_message() in _send_to_platform() before dispatching to individual senders
  • Use per-platform MAX_MESSAGE_LENGTH constants from adapter classes (no magic numbers)
  • Remove naive message[i:i+2000] character split in _send_discord() — now uses centralized smart splitting
  • Telegram: attach media files to the last chunk only
  • Early-return on error for any chunk that fails

Platform coverage

Platform Limit Before After
Telegram 4,096 No chunking, API rejects Smart chunking, media on last chunk
Discord 2,000 Naive char split (breaks mid-word) Smart chunking
Slack 39,000 No chunking, API rejects Smart chunking
Signal 8,000 No chunking Passed through (no limit in map)

Test plan

  • 2 new regression tests (chunking + media placement)
  • All 65 send_message + platform_base tests pass

teknium1 and others added 5 commits March 17, 2026 01:45
When a gateway session exceeds the model's context window, Anthropic may
return a generic 400 invalid_request_error with just 'Error' as the
message.  This bypassed the phrase-based context-length detection,
causing the agent to treat it as a non-retryable client error.  Worse,
the failed user message was still persisted to the transcript, making
the session even larger on each attempt — creating an infinite loop.

Three-layer fix:

1. run_agent.py — Fallback heuristic: when a 400 error has a very short
   generic message AND the session is large (>40% of context or >80
   messages), treat it as a probable context overflow and trigger
   compression instead of aborting.

2. run_agent.py + gateway/run.py — Don't persist failed messages:
   when the agent returns failed=True before generating any response,
   skip writing the user's message to the transcript/DB. This prevents
   the session from growing on each failure.

3. gateway/run.py — Smarter error messages: detect context-overflow
   failures and suggest /compact or /reset specifically, instead of a
   generic 'try again' that will fail identically.
Adds two security layers to prevent prompt injection via skills hub
cache files (#1558):

1. read_file: blocks direct reads of ~/.hermes/skills/.hub/ directory
   (index-cache, catalog files). The 3.5MB clawhub_catalog_v1.json
   was the original injection vector — untrusted skill descriptions
   in the catalog contained adversarial text that the model executed.

2. skill_view: warns when skills are loaded from outside the trusted
   ~/.hermes/skills/ directory, and detects common injection patterns
   in skill content ("ignore previous instructions", "<system>", etc.).

Cherry-picked from PR #1562 by ygd58.
…1552)

Long messages sent via send_message tool or cron delivery silently
failed when exceeding platform limits. Gateway adapters handle this
via truncate_message(), but the standalone senders in send_message_tool
bypassed that entirely.

- Apply truncate_message() chunking in _send_to_platform() before
  dispatching to individual platform senders
- Remove naive message[i:i+2000] character split in _send_discord()
  in favor of centralized smart splitting
- Attach media files to last chunk only for Telegram
- Add regression tests for chunking and media placement

Cherry-picked from PR #1557 by llbn.
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.

[Bug]: send_message tool and cron delivery skip message chunking, causing delivery failures for long messages

3 participants