Skip to content

fix(telegram): keep heartbeat + interim commentary on; edit heartbeat in place#33187

Merged
teknium1 merged 1 commit into
mainfrom
hermes/hermes-be5653aa
May 27, 2026
Merged

fix(telegram): keep heartbeat + interim commentary on; edit heartbeat in place#33187
teknium1 merged 1 commit into
mainfrom
hermes/hermes-be5653aa

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Keep Telegram users feeling like the agent is alive. PR #33151 flipped four Telegram display defaults to false; two of those were wrong and this fixes them.

Root cause

interim_assistant_messages and long_running_notifications were lumped in with tool_progress and busy_ack_detail under "mobile-friendly final-answer-first defaults." They aren't the same thing.

  • interim_assistant_messages = the model's REAL words mid-turn ("I'll inspect the repo first.", "Found the issue — applying fix now"). That's signal, not chatter.
  • long_running_notifications = the periodic heartbeat. The old text was chatty ("⏳ Still working... (12 min elapsed — iteration 21/60, running: terminal)"), but the answer is to make it terse and edit-in-place, not to delete it. Silent agent for 30 minutes is worse than one bubble updating every 3 minutes.

Changes

Default #33151 This PR Reason
tool_progress off off (kept) Per-tool stream is too chatty on mobile
interim_assistant_messages False True (reverted) Real model voice = signal
long_running_notifications False True (reverted) Heartbeat > silence
busy_ack_detail False False (kept) Verbose iteration counter is debug detail

Plus a heartbeat redesign:

  • Edit-in-place. One bubble updates every interval instead of N bubbles accumulating. Uses adapter.edit_message() where supported (Telegram, Discord, Slack, Matrix), falls back to send-new when the adapter doesn't support edits or the edit fails.
  • Tighter text. "⏳ Still working... (12 min elapsed — iteration 21/60, running: terminal)""⏳ Working — 12 min, terminal". The verbose form is now gated on busy_ack_detail, so a single config key controls verbosity for BOTH busy acks AND heartbeats (one knob, two surfaces).

Files

  • gateway/display_config.py — two defaults reverted
  • gateway/run.py_notify_long_running() edit-in-place + tighter text + busy_ack_detail gate
  • tests/gateway/test_display_config.py — assertions updated
  • tests/gateway/test_run_progress_topics.pytest_run_agent_surfaces_interim_commentary_by_default reverted to test the implicit default again
  • tests/gateway/test_run_cleanup_progress.py — docstring updated
  • cli-config.yaml.example — comments rewritten
  • website/docs/user-guide/messaging/index.md — "Mobile-friendly progress defaults" section rewritten to reflect the corrected story

Validation

tests/gateway/test_display_config.py            ✓
tests/gateway/test_busy_session_ack.py          ✓
tests/gateway/test_run_progress_topics.py       ✓
tests/gateway/test_run_cleanup_progress.py      ✓
tests/gateway/test_telegram_noise_filter.py     ✓
tests/gateway/test_verbose_command.py           ✓
tests/gateway/test_gateway_command_help.py      ✓
tests/gateway/test_session_race_guard.py        ✓
                                              121/121 passing

Infographic

telegram-heartbeat-revision

…eartbeat in place

#33151 flipped THREE Telegram display defaults to false:
  - tool_progress: new -> off            (kept: per-tool stream is too chatty)
  - interim_assistant_messages: T -> F   (REVERTED here)
  - long_running_notifications: T -> F   (REVERTED here)
  - busy_ack_detail: T -> F              (kept: verbose iteration counter)

The two reverts were wrong. interim_assistant_messages = the model's REAL
words mid-turn ("I'll inspect the repo first.", "Let me check both files
in parallel"). That is signal, not noise. Suppressing it left Telegram
users staring at "typing..." for the entire turn duration with no
feedback. long_running_notifications = the periodic heartbeat. Silent
agent for 30 minutes is worse than one bubble updating every 3 minutes.

Changes:
  - gateway/display_config.py: Telegram tier-1 inbox keeps both defaults
    on (only tool_progress and busy_ack_detail stay off).
  - gateway/run.py _notify_long_running(): edit a single heartbeat
    message in place (where the adapter supports it) instead of posting
    a new "Still working..." bubble each interval. Telegram, Discord,
    Slack, Matrix all qualify. Falls back to send-new when edit fails.
  - gateway/run.py: tighten heartbeat text. "⏳ Still working... (12 min
    elapsed — iteration 21/60, running: terminal)" -> "⏳ Working — 12
    min, terminal". Verbose iteration detail moves behind busy_ack_detail
    (one knob now controls both busy acks AND heartbeat verbosity).
  - tests/, cli-config.yaml.example, website/docs/user-guide/messaging:
    updated to reflect the corrected story.
@github-actions

Copy link
Copy Markdown
Contributor

🔎 Lint report: hermes/hermes-be5653aa vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 9493 on HEAD, 9493 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 5013 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.

@alt-glitch alt-glitch added type/bug Something isn't working comp/gateway Gateway runner, session dispatch, delivery platform/telegram Telegram bot adapter P2 Medium — degraded but workaround exists labels May 27, 2026
@teknium1 teknium1 merged commit 0325e18 into main May 27, 2026
27 checks passed
@teknium1 teknium1 deleted the hermes/hermes-be5653aa branch May 27, 2026 12:21
mathias3 pushed a commit to mathias3/hermes-agent that referenced this pull request May 28, 2026
…eartbeat in place (NousResearch#33187)

NousResearch#33151 flipped THREE Telegram display defaults to false:
  - tool_progress: new -> off            (kept: per-tool stream is too chatty)
  - interim_assistant_messages: T -> F   (REVERTED here)
  - long_running_notifications: T -> F   (REVERTED here)
  - busy_ack_detail: T -> F              (kept: verbose iteration counter)

The two reverts were wrong. interim_assistant_messages = the model's REAL
words mid-turn ("I'll inspect the repo first.", "Let me check both files
in parallel"). That is signal, not noise. Suppressing it left Telegram
users staring at "typing..." for the entire turn duration with no
feedback. long_running_notifications = the periodic heartbeat. Silent
agent for 30 minutes is worse than one bubble updating every 3 minutes.

Changes:
  - gateway/display_config.py: Telegram tier-1 inbox keeps both defaults
    on (only tool_progress and busy_ack_detail stay off).
  - gateway/run.py _notify_long_running(): edit a single heartbeat
    message in place (where the adapter supports it) instead of posting
    a new "Still working..." bubble each interval. Telegram, Discord,
    Slack, Matrix all qualify. Falls back to send-new when edit fails.
  - gateway/run.py: tighten heartbeat text. "⏳ Still working... (12 min
    elapsed — iteration 21/60, running: terminal)" -> "⏳ Working — 12
    min, terminal". Verbose iteration detail moves behind busy_ack_detail
    (one knob now controls both busy acks AND heartbeat verbosity).
  - tests/, cli-config.yaml.example, website/docs/user-guide/messaging:
    updated to reflect the corrected story.
Bryce-huang pushed a commit to wbkunlun/hermes-agent that referenced this pull request May 29, 2026
…eartbeat in place (NousResearch#33187)

NousResearch#33151 flipped THREE Telegram display defaults to false:
  - tool_progress: new -> off            (kept: per-tool stream is too chatty)
  - interim_assistant_messages: T -> F   (REVERTED here)
  - long_running_notifications: T -> F   (REVERTED here)
  - busy_ack_detail: T -> F              (kept: verbose iteration counter)

The two reverts were wrong. interim_assistant_messages = the model's REAL
words mid-turn ("I'll inspect the repo first.", "Let me check both files
in parallel"). That is signal, not noise. Suppressing it left Telegram
users staring at "typing..." for the entire turn duration with no
feedback. long_running_notifications = the periodic heartbeat. Silent
agent for 30 minutes is worse than one bubble updating every 3 minutes.

Changes:
  - gateway/display_config.py: Telegram tier-1 inbox keeps both defaults
    on (only tool_progress and busy_ack_detail stay off).
  - gateway/run.py _notify_long_running(): edit a single heartbeat
    message in place (where the adapter supports it) instead of posting
    a new "Still working..." bubble each interval. Telegram, Discord,
    Slack, Matrix all qualify. Falls back to send-new when edit fails.
  - gateway/run.py: tighten heartbeat text. "⏳ Still working... (12 min
    elapsed — iteration 21/60, running: terminal)" -> "⏳ Working — 12
    min, terminal". Verbose iteration detail moves behind busy_ack_detail
    (one knob now controls both busy acks AND heartbeat verbosity).
  - tests/, cli-config.yaml.example, website/docs/user-guide/messaging:
    updated to reflect the corrected story.
#AI commit#
mosaiq-systems pushed a commit to mosaiq-systems/hermes-agent that referenced this pull request May 29, 2026
…eartbeat in place (NousResearch#33187)

NousResearch#33151 flipped THREE Telegram display defaults to false:
  - tool_progress: new -> off            (kept: per-tool stream is too chatty)
  - interim_assistant_messages: T -> F   (REVERTED here)
  - long_running_notifications: T -> F   (REVERTED here)
  - busy_ack_detail: T -> F              (kept: verbose iteration counter)

The two reverts were wrong. interim_assistant_messages = the model's REAL
words mid-turn ("I'll inspect the repo first.", "Let me check both files
in parallel"). That is signal, not noise. Suppressing it left Telegram
users staring at "typing..." for the entire turn duration with no
feedback. long_running_notifications = the periodic heartbeat. Silent
agent for 30 minutes is worse than one bubble updating every 3 minutes.

Changes:
  - gateway/display_config.py: Telegram tier-1 inbox keeps both defaults
    on (only tool_progress and busy_ack_detail stay off).
  - gateway/run.py _notify_long_running(): edit a single heartbeat
    message in place (where the adapter supports it) instead of posting
    a new "Still working..." bubble each interval. Telegram, Discord,
    Slack, Matrix all qualify. Falls back to send-new when edit fails.
  - gateway/run.py: tighten heartbeat text. "⏳ Still working... (12 min
    elapsed — iteration 21/60, running: terminal)" -> "⏳ Working — 12
    min, terminal". Verbose iteration detail moves behind busy_ack_detail
    (one knob now controls both busy acks AND heartbeat verbosity).
  - tests/, cli-config.yaml.example, website/docs/user-guide/messaging:
    updated to reflect the corrected story.
gweeteve pushed a commit to gweeteve/hermes-agent that referenced this pull request Jun 2, 2026
…eartbeat in place (NousResearch#33187)

NousResearch#33151 flipped THREE Telegram display defaults to false:
  - tool_progress: new -> off            (kept: per-tool stream is too chatty)
  - interim_assistant_messages: T -> F   (REVERTED here)
  - long_running_notifications: T -> F   (REVERTED here)
  - busy_ack_detail: T -> F              (kept: verbose iteration counter)

The two reverts were wrong. interim_assistant_messages = the model's REAL
words mid-turn ("I'll inspect the repo first.", "Let me check both files
in parallel"). That is signal, not noise. Suppressing it left Telegram
users staring at "typing..." for the entire turn duration with no
feedback. long_running_notifications = the periodic heartbeat. Silent
agent for 30 minutes is worse than one bubble updating every 3 minutes.

Changes:
  - gateway/display_config.py: Telegram tier-1 inbox keeps both defaults
    on (only tool_progress and busy_ack_detail stay off).
  - gateway/run.py _notify_long_running(): edit a single heartbeat
    message in place (where the adapter supports it) instead of posting
    a new "Still working..." bubble each interval. Telegram, Discord,
    Slack, Matrix all qualify. Falls back to send-new when edit fails.
  - gateway/run.py: tighten heartbeat text. "⏳ Still working... (12 min
    elapsed — iteration 21/60, running: terminal)" -> "⏳ Working — 12
    min, terminal". Verbose iteration detail moves behind busy_ack_detail
    (one knob now controls both busy acks AND heartbeat verbosity).
  - tests/, cli-config.yaml.example, website/docs/user-guide/messaging:
    updated to reflect the corrected story.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/gateway Gateway runner, session dispatch, delivery P2 Medium — degraded but workaround exists platform/telegram Telegram bot adapter type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants