mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-08 03:01:47 +00:00
fix(telegram): preserve thread_id=1 for forum General typing indicator (#21390)
The May 5 refactor ind5357f816made _message_thread_id_for_typing() symmetric with _message_thread_id_for_send() by mapping the General topic (thread id "1") to None upfront for both. That's correct for sendMessage — Telegram rejects message_thread_id=1 on sends and the topic must be omitted — but it's wrong for sendChatAction. Observed behavior (confirmed via before/after Telegram wire traces): Befored5357f816: thread_id=1 → message_thread_id=1 → bubble visible in General Afterd5357f816: thread_id=1 → message_thread_id=None → no visible typing Omitting message_thread_id on sendChatAction does NOT fall back to the General topic's view in a forum-enabled supergroup; the bubble ends up hidden from the client's General-topic pane entirely. For any user on a forum-group, the typing indicator stopped appearing. Fix: drop the symmetric "1 → None" mapping from the typing resolver. sendMessage still maps 1 → None via _message_thread_id_for_send (that side was never broken). The asymmetry is real and required by Telegram's API — document it in the resolver docstring. Partial revert ofd5357f816; restores the behavior from0cf7d570e("fix(telegram): restore typing indicator and thread routing for forum General topic"). Does not re-introduce the retry-without-thread fallback that41545f7ecscoped down for DM topics — with the resolver fixed, the first call already hits the right wire shape. Test updated from test_send_typing_general_topic_uses_none_thread_id (which encoded the broken contract) to test_send_typing_preserves_general_topic_thread_id, asserting the single correct call with message_thread_id=1. 10 other tests in the file untouched and passing.
This commit is contained in:
parent
812ce0b987
commit
2564132a1f
2 changed files with 19 additions and 10 deletions
|
|
@ -369,10 +369,14 @@ class TelegramAdapter(BasePlatformAdapter):
|
|||
|
||||
@classmethod
|
||||
def _message_thread_id_for_typing(cls, thread_id: Optional[str]) -> Optional[int]:
|
||||
# Mirrors _message_thread_id_for_send: the General forum topic (thread id
|
||||
# "1") is represented as "no thread id" on the wire. User-created topics
|
||||
# keep their real id so typing stays scoped to that topic.
|
||||
if not thread_id or str(thread_id) == cls._GENERAL_TOPIC_THREAD_ID:
|
||||
# Asymmetric with _message_thread_id_for_send on purpose. Telegram's
|
||||
# sendMessage and sendChatAction treat thread id "1" (the forum General
|
||||
# topic) differently: sends reject message_thread_id=1 and must omit it,
|
||||
# but sendChatAction needs message_thread_id=1 to place the typing
|
||||
# bubble in the General topic (omitting it hides the bubble entirely
|
||||
# from the client's view of that topic). Preserve the real id here —
|
||||
# sends still map "1" → None via _message_thread_id_for_send.
|
||||
if not thread_id:
|
||||
return None
|
||||
return int(thread_id)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue