Skip to content

fix(weixin): keep multi-line messages in single bubble by default - #7903

Merged
teknium1 merged 1 commit into
mainfrom
hermes/hermes-905d6262
Apr 11, 2026
Merged

fix(weixin): keep multi-line messages in single bubble by default#7903
teknium1 merged 1 commit into
mainfrom
hermes/hermes-905d6262

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Summary

The Weixin adapter was splitting responses at every top-level newline, causing notification spam — up to 70 API calls for a single long markdown response. Six independent contributors submitted PRs to fix this. This salvages the best aspects of all six.

What changed

Compact mode (new default):

  • Messages under the 4000-char limit stay as a single bubble even with multiple lines, paragraphs, and code blocks
  • Only oversized messages get split at logical markdown boundaries
  • 0.3s inter-chunk delay between chunks prevents WeChat rate-limit drops

Legacy mode (opt-in):

  • Set split_multiline_messages: true in platforms.weixin.extra config
  • Or set WEIXIN_SPLIT_MULTILINE_MESSAGES=true env var
  • Restores the old per-line splitting behavior

Files changed (4 files, +96/-27)

  • gateway/platforms/weixin.py — split function now supports compact/legacy modes via split_per_line param; _coerce_bool helper; config wiring; inter-chunk delay in send()
  • gateway/config.py — env var override for WEIXIN_SPLIT_MULTILINE_MESSAGES
  • tests/gateway/test_weixin.py — updated assertions for compact default; added legacy mode test; added env var config test
  • website/docs/user-guide/messaging/weixin.md — updated chunking docs, config table, feature description

Salvaged from

PR Author Contribution
#7797 @guantoubaozi Simplest core fix — remove "\\n" not in content guard
#7792 @luoxiao6645 Aggressive cleanup approach, single-message-under-limit
#7838 @qyx596 Config toggle + env var + docs + _coerce_bool
#7825 @weedge Inter-chunk delay (0.3s) for rate-limit protection
#7784 @sherunlock03 Clean minimal fix
#7773 @JnyRoad Short multiline single-bubble fix

Test plan

  • 15/15 weixin tests pass (including new legacy-mode and config tests)
  • 64/64 gateway tests pass (weixin + config + wecom)
  • 9/9 E2E tests pass (compact mode, legacy mode, config wiring, env var, code fences, oversized content)

The Weixin adapter was splitting responses at every top-level newline,
causing notification spam (up to 70 API calls for a single long markdown
response). This salvages the best aspects of six contributor PRs:

Compact mode (new default):
- Messages under the 4000-char limit stay as a single bubble even with
  multiple lines, paragraphs, and code blocks
- Only oversized messages get split at logical markdown boundaries
- Inter-chunk delay (0.3s) between chunks prevents WeChat rate-limit drops

Legacy mode (opt-in):
- Set split_multiline_messages: true in platforms.weixin.extra config
- Or set WEIXIN_SPLIT_MULTILINE_MESSAGES=true env var
- Restores the old per-line splitting behavior

Salvaged from PRs #7797 (guantoubaozi), #7792 (luoxiao6645),
#7838 (qyx596), #7825 (weedge), #7784 (sherunlock03), #7773 (JnyRoad).
Core fix unanimous across all six; config toggle from #7838; inter-chunk
delay from #7825.
@teknium1
teknium1 merged commit da9f96b into main Apr 11, 2026
3 of 5 checks passed
teknium1 pushed a commit that referenced this pull request Apr 11, 2026
When sending multi-chunk responses, individual chunks can fail due to
transient iLink API errors. Previously a single failure would abort the
entire message. Now each chunk is retried with linear backoff before
giving up, and the same client_id is reused across retries for
server-side deduplication.

Configurable via config.yaml (platforms.weixin.extra) or env vars:
- send_chunk_delay_seconds (default 0.35s) — pacing between chunks
- send_chunk_retries (default 2) — max retry attempts per chunk
- send_chunk_retry_delay_seconds (default 1.0s) — base retry delay

Replaces the hardcoded 0.3s inter-chunk delay from #7903.

Salvaged from PR #7899 by @corazzione. Fixes #7836.
teknium1 pushed a commit that referenced this pull request Apr 11, 2026
When sending multi-chunk responses, individual chunks can fail due to
transient iLink API errors. Previously a single failure would abort the
entire message. Now each chunk is retried with linear backoff before
giving up, and the same client_id is reused across retries for
server-side deduplication.

Configurable via config.yaml (platforms.weixin.extra) or env vars:
- send_chunk_delay_seconds (default 0.35s) — pacing between chunks
- send_chunk_retries (default 2) — max retry attempts per chunk
- send_chunk_retry_delay_seconds (default 1.0s) — base retry delay

Replaces the hardcoded 0.3s inter-chunk delay from #7903.

Salvaged from PR #7899 by @corazzione. Fixes #7836.
teknium1 pushed a commit that referenced this pull request Apr 12, 2026
…tructured content together

Add content-aware splitting to compact mode: short chat-like exchanges
(2-6 short lines without headings/lists/quotes) get separate message
bubbles for a natural chat feel, while structured content (tables,
headings with body, numbered lists) stays in a single message.

Cherry-picked from PR #7587 by bravohenry, adapted to the compact/legacy
split_per_line architecture from #7903.
teknium1 pushed a commit that referenced this pull request Apr 12, 2026
…tructured content together

Add content-aware splitting to compact mode: short chat-like exchanges
(2-6 short lines without headings/lists/quotes) get separate message
bubbles for a natural chat feel, while structured content (tables,
headings with body, numbered lists) stays in a single message.

Cherry-picked from PR #7587 by bravohenry, adapted to the compact/legacy
split_per_line architecture from #7903.
Tommyeds pushed a commit to Tommyeds/hermes-agent that referenced this pull request Apr 12, 2026
…usResearch#7903)

The Weixin adapter was splitting responses at every top-level newline,
causing notification spam (up to 70 API calls for a single long markdown
response). This salvages the best aspects of six contributor PRs:

Compact mode (new default):
- Messages under the 4000-char limit stay as a single bubble even with
  multiple lines, paragraphs, and code blocks
- Only oversized messages get split at logical markdown boundaries
- Inter-chunk delay (0.3s) between chunks prevents WeChat rate-limit drops

Legacy mode (opt-in):
- Set split_multiline_messages: true in platforms.weixin.extra config
- Or set WEIXIN_SPLIT_MULTILINE_MESSAGES=true env var
- Restores the old per-line splitting behavior

Salvaged from PRs NousResearch#7797 (guantoubaozi), NousResearch#7792 (luoxiao6645),
NousResearch#7838 (qyx596), NousResearch#7825 (weedge), NousResearch#7784 (sherunlock03), NousResearch#7773 (JnyRoad).
Core fix unanimous across all six; config toggle from NousResearch#7838; inter-chunk
delay from NousResearch#7825.
Tommyeds pushed a commit to Tommyeds/hermes-agent that referenced this pull request Apr 12, 2026
When sending multi-chunk responses, individual chunks can fail due to
transient iLink API errors. Previously a single failure would abort the
entire message. Now each chunk is retried with linear backoff before
giving up, and the same client_id is reused across retries for
server-side deduplication.

Configurable via config.yaml (platforms.weixin.extra) or env vars:
- send_chunk_delay_seconds (default 0.35s) — pacing between chunks
- send_chunk_retries (default 2) — max retry attempts per chunk
- send_chunk_retry_delay_seconds (default 1.0s) — base retry delay

Replaces the hardcoded 0.3s inter-chunk delay from NousResearch#7903.

Salvaged from PR NousResearch#7899 by @corazzione. Fixes NousResearch#7836.
Tommyeds pushed a commit to Tommyeds/hermes-agent that referenced this pull request Apr 12, 2026
…tructured content together

Add content-aware splitting to compact mode: short chat-like exchanges
(2-6 short lines without headings/lists/quotes) get separate message
bubbles for a natural chat feel, while structured content (tables,
headings with body, numbered lists) stays in a single message.

Cherry-picked from PR NousResearch#7587 by bravohenry, adapted to the compact/legacy
split_per_line architecture from NousResearch#7903.
aj-nt pushed a commit to aj-nt/hermes-agent that referenced this pull request May 1, 2026
…usResearch#7903)

The Weixin adapter was splitting responses at every top-level newline,
causing notification spam (up to 70 API calls for a single long markdown
response). This salvages the best aspects of six contributor PRs:

Compact mode (new default):
- Messages under the 4000-char limit stay as a single bubble even with
  multiple lines, paragraphs, and code blocks
- Only oversized messages get split at logical markdown boundaries
- Inter-chunk delay (0.3s) between chunks prevents WeChat rate-limit drops

Legacy mode (opt-in):
- Set split_multiline_messages: true in platforms.weixin.extra config
- Or set WEIXIN_SPLIT_MULTILINE_MESSAGES=true env var
- Restores the old per-line splitting behavior

Salvaged from PRs NousResearch#7797 (guantoubaozi), NousResearch#7792 (luoxiao6645),
NousResearch#7838 (qyx596), NousResearch#7825 (weedge), NousResearch#7784 (sherunlock03), NousResearch#7773 (JnyRoad).
Core fix unanimous across all six; config toggle from NousResearch#7838; inter-chunk
delay from NousResearch#7825.
aj-nt pushed a commit to aj-nt/hermes-agent that referenced this pull request May 1, 2026
When sending multi-chunk responses, individual chunks can fail due to
transient iLink API errors. Previously a single failure would abort the
entire message. Now each chunk is retried with linear backoff before
giving up, and the same client_id is reused across retries for
server-side deduplication.

Configurable via config.yaml (platforms.weixin.extra) or env vars:
- send_chunk_delay_seconds (default 0.35s) — pacing between chunks
- send_chunk_retries (default 2) — max retry attempts per chunk
- send_chunk_retry_delay_seconds (default 1.0s) — base retry delay

Replaces the hardcoded 0.3s inter-chunk delay from NousResearch#7903.

Salvaged from PR NousResearch#7899 by @corazzione. Fixes NousResearch#7836.
aj-nt pushed a commit to aj-nt/hermes-agent that referenced this pull request May 1, 2026
…tructured content together

Add content-aware splitting to compact mode: short chat-like exchanges
(2-6 short lines without headings/lists/quotes) get separate message
bubbles for a natural chat feel, while structured content (tables,
headings with body, numbered lists) stays in a single message.

Cherry-picked from PR NousResearch#7587 by bravohenry, adapted to the compact/legacy
split_per_line architecture from NousResearch#7903.
02356abc pushed a commit to 02356abc/hermes-agent that referenced this pull request May 14, 2026
…usResearch#7903)

The Weixin adapter was splitting responses at every top-level newline,
causing notification spam (up to 70 API calls for a single long markdown
response). This salvages the best aspects of six contributor PRs:

Compact mode (new default):
- Messages under the 4000-char limit stay as a single bubble even with
  multiple lines, paragraphs, and code blocks
- Only oversized messages get split at logical markdown boundaries
- Inter-chunk delay (0.3s) between chunks prevents WeChat rate-limit drops

Legacy mode (opt-in):
- Set split_multiline_messages: true in platforms.weixin.extra config
- Or set WEIXIN_SPLIT_MULTILINE_MESSAGES=true env var
- Restores the old per-line splitting behavior

Salvaged from PRs NousResearch#7797 (guantoubaozi), NousResearch#7792 (luoxiao6645),
NousResearch#7838 (qyx596), NousResearch#7825 (weedge), NousResearch#7784 (sherunlock03), NousResearch#7773 (JnyRoad).
Core fix unanimous across all six; config toggle from NousResearch#7838; inter-chunk
delay from NousResearch#7825.
02356abc pushed a commit to 02356abc/hermes-agent that referenced this pull request May 14, 2026
When sending multi-chunk responses, individual chunks can fail due to
transient iLink API errors. Previously a single failure would abort the
entire message. Now each chunk is retried with linear backoff before
giving up, and the same client_id is reused across retries for
server-side deduplication.

Configurable via config.yaml (platforms.weixin.extra) or env vars:
- send_chunk_delay_seconds (default 0.35s) — pacing between chunks
- send_chunk_retries (default 2) — max retry attempts per chunk
- send_chunk_retry_delay_seconds (default 1.0s) — base retry delay

Replaces the hardcoded 0.3s inter-chunk delay from NousResearch#7903.

Salvaged from PR NousResearch#7899 by @corazzione. Fixes NousResearch#7836.
02356abc pushed a commit to 02356abc/hermes-agent that referenced this pull request May 14, 2026
…tructured content together

Add content-aware splitting to compact mode: short chat-like exchanges
(2-6 short lines without headings/lists/quotes) get separate message
bubbles for a natural chat feel, while structured content (tables,
headings with body, numbered lists) stays in a single message.

Cherry-picked from PR NousResearch#7587 by bravohenry, adapted to the compact/legacy
split_per_line architecture from NousResearch#7903.
gweeteve pushed a commit to gweeteve/hermes-agent that referenced this pull request Jun 2, 2026
…usResearch#7903)

The Weixin adapter was splitting responses at every top-level newline,
causing notification spam (up to 70 API calls for a single long markdown
response). This salvages the best aspects of six contributor PRs:

Compact mode (new default):
- Messages under the 4000-char limit stay as a single bubble even with
  multiple lines, paragraphs, and code blocks
- Only oversized messages get split at logical markdown boundaries
- Inter-chunk delay (0.3s) between chunks prevents WeChat rate-limit drops

Legacy mode (opt-in):
- Set split_multiline_messages: true in platforms.weixin.extra config
- Or set WEIXIN_SPLIT_MULTILINE_MESSAGES=true env var
- Restores the old per-line splitting behavior

Salvaged from PRs NousResearch#7797 (guantoubaozi), NousResearch#7792 (luoxiao6645),
NousResearch#7838 (qyx596), NousResearch#7825 (weedge), NousResearch#7784 (sherunlock03), NousResearch#7773 (JnyRoad).
Core fix unanimous across all six; config toggle from NousResearch#7838; inter-chunk
delay from NousResearch#7825.
gweeteve pushed a commit to gweeteve/hermes-agent that referenced this pull request Jun 2, 2026
When sending multi-chunk responses, individual chunks can fail due to
transient iLink API errors. Previously a single failure would abort the
entire message. Now each chunk is retried with linear backoff before
giving up, and the same client_id is reused across retries for
server-side deduplication.

Configurable via config.yaml (platforms.weixin.extra) or env vars:
- send_chunk_delay_seconds (default 0.35s) — pacing between chunks
- send_chunk_retries (default 2) — max retry attempts per chunk
- send_chunk_retry_delay_seconds (default 1.0s) — base retry delay

Replaces the hardcoded 0.3s inter-chunk delay from NousResearch#7903.

Salvaged from PR NousResearch#7899 by @corazzione. Fixes NousResearch#7836.
waefrebeorn pushed a commit to waefrebeorn/slermes that referenced this pull request Jul 2, 2026
…usResearch#7903)

The Weixin adapter was splitting responses at every top-level newline,
causing notification spam (up to 70 API calls for a single long markdown
response). This salvages the best aspects of six contributor PRs:

Compact mode (new default):
- Messages under the 4000-char limit stay as a single bubble even with
  multiple lines, paragraphs, and code blocks
- Only oversized messages get split at logical markdown boundaries
- Inter-chunk delay (0.3s) between chunks prevents WeChat rate-limit drops

Legacy mode (opt-in):
- Set split_multiline_messages: true in platforms.weixin.extra config
- Or set WEIXIN_SPLIT_MULTILINE_MESSAGES=true env var
- Restores the old per-line splitting behavior

Salvaged from PRs NousResearch#7797 (guantoubaozi), NousResearch#7792 (luoxiao6645),
NousResearch#7838 (qyx596), NousResearch#7825 (weedge), NousResearch#7784 (sherunlock03), NousResearch#7773 (JnyRoad).
Core fix unanimous across all six; config toggle from NousResearch#7838; inter-chunk
delay from NousResearch#7825.
waefrebeorn pushed a commit to waefrebeorn/slermes that referenced this pull request Jul 2, 2026
When sending multi-chunk responses, individual chunks can fail due to
transient iLink API errors. Previously a single failure would abort the
entire message. Now each chunk is retried with linear backoff before
giving up, and the same client_id is reused across retries for
server-side deduplication.

Configurable via config.yaml (platforms.weixin.extra) or env vars:
- send_chunk_delay_seconds (default 0.35s) — pacing between chunks
- send_chunk_retries (default 2) — max retry attempts per chunk
- send_chunk_retry_delay_seconds (default 1.0s) — base retry delay

Replaces the hardcoded 0.3s inter-chunk delay from NousResearch#7903.

Salvaged from PR NousResearch#7899 by @corazzione. Fixes NousResearch#7836.
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.

1 participant