From 817ef94742d568794d36cbf03f3db7087bd989e7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 16 Aug 2025 16:30:18 +0000 Subject: [PATCH] Implement Telegram topic isolation feature - share conversations across topics Co-authored-by: Soulter <37870767+Soulter@users.noreply.github.com> --- astrbot/core/platform/sources/telegram/tg_adapter.py | 12 ++++++++++-- astrbot/core/platform/sources/telegram/tg_event.py | 6 ++++-- packages/astrbot/main.py | 10 ++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/astrbot/core/platform/sources/telegram/tg_adapter.py b/astrbot/core/platform/sources/telegram/tg_adapter.py index c6fc56b9..18b58a74 100644 --- a/astrbot/core/platform/sources/telegram/tg_adapter.py +++ b/astrbot/core/platform/sources/telegram/tg_adapter.py @@ -223,9 +223,10 @@ class TelegramPlatformAdapter(Platform): message.type = MessageType.GROUP_MESSAGE message.group_id = str(update.message.chat.id) if update.message.message_thread_id: - # Topic Group + # Topic Group - keep topic info in group_id for message routing, + # but use base group_id for session_id to share conversations message.group_id += "#" + str(update.message.message_thread_id) - message.session_id = message.group_id + # session_id remains the base group_id for shared conversation message.message_id = str(update.message.message_id) message.sender = MessageMember( @@ -349,6 +350,13 @@ class TelegramPlatformAdapter(Platform): session_id=message.session_id, client=self.client, ) + + # Store topic information for shared conversations + if message.type == MessageType.GROUP_MESSAGE and "#" in message.group_id: + group_id, topic_id = message.group_id.split("#") + message_event.set_extra("telegram_topic_id", topic_id) + message_event.set_extra("telegram_base_group_id", group_id) + self.commit_event(message_event) def get_client(self) -> ExtBot: diff --git a/astrbot/core/platform/sources/telegram/tg_event.py b/astrbot/core/platform/sources/telegram/tg_event.py index 5b3a1d91..991b7bf2 100644 --- a/astrbot/core/platform/sources/telegram/tg_event.py +++ b/astrbot/core/platform/sources/telegram/tg_event.py @@ -66,7 +66,9 @@ class TelegramPlatformEvent(AstrMessageEvent): return chunks @classmethod - async def send_with_client(cls, client: ExtBot, message: MessageChain, user_name: str): + async def send_with_client( + cls, client: ExtBot, message: MessageChain, user_name: str + ): image_path = None has_reply = False @@ -148,7 +150,7 @@ class TelegramPlatformEvent(AstrMessageEvent): "chat_id": user_name, } if message_thread_id: - payload["reply_to_message_id"] = message_thread_id + payload["message_thread_id"] = message_thread_id delta = "" current_content = "" diff --git a/packages/astrbot/main.py b/packages/astrbot/main.py index 1dd2cbe2..68b7859c 100644 --- a/packages/astrbot/main.py +++ b/packages/astrbot/main.py @@ -1316,6 +1316,16 @@ UID: {user_id} 此 ID 可用于设置管理员。 except BaseException as e: logger.error(f"处理引用图片失败: {e}") + # Add Telegram topic context for shared conversations + if event.get_platform_name() == "telegram": + topic_id = event.get_extra("telegram_topic_id") + base_group_id = event.get_extra("telegram_base_group_id") + if topic_id and base_group_id: + req.system_prompt += ( + f"\n[Context: This message is from Telegram topic " + f"#{topic_id} in group {base_group_id}]\n" + ) + if self.ltm: try: await self.ltm.on_req_llm(event, req)