diff --git a/tests/tools/test_send_message_tool.py b/tests/tools/test_send_message_tool.py index 28f918ea90a..3146dce917a 100644 --- a/tests/tools/test_send_message_tool.py +++ b/tests/tools/test_send_message_tool.py @@ -1900,6 +1900,7 @@ class TestSendMessageCurrentSessionTarget: ) assert result["success"] is True + # thread_id must be None (stripped), not "1" send_mock.assert_awaited_once_with( Platform.TELEGRAM, telegram_cfg, @@ -1970,6 +1971,7 @@ class TestSendSlackThreadId: ) assert result["success"] is True + # Verify thread_ts was in the JSON payload call_kwargs = mock_session.post.call_args payload = call_kwargs.kwargs.get("json") or call_kwargs[1].get("json") assert payload["thread_ts"] == "1712345678.1234" diff --git a/tools/send_message_tool.py b/tools/send_message_tool.py index 348d880c44b..f58242553ea 100644 --- a/tools/send_message_tool.py +++ b/tools/send_message_tool.py @@ -355,6 +355,13 @@ def _resolve_current_session_target(platform_name: str): None, ) + # Telegram forum chats synthesize thread_id="1" for the General topic, + # but the Bot API rejects message_thread_id=1. The gateway adapter + # normalizes this away (TelegramAdapter._message_thread_id_for_send); + # mirror that here so telegram:current doesn't break in General. + if platform_name == "telegram" and session_thread_id == "1": + session_thread_id = None + return None, session_chat_id, session_thread_id @@ -577,7 +584,7 @@ async def _send_to_platform(platform, pconfig, chat_id, message, thread_id=None, last_result = None for chunk in chunks: if platform == Platform.SLACK: - result = await _send_slack(pconfig.token, chat_id, chunk) + result = await _send_slack(pconfig.token, chat_id, chunk, thread_id=thread_id) elif platform == Platform.WHATSAPP: result = await _send_whatsapp(pconfig.extra, chat_id, chunk) elif platform == Platform.SIGNAL: @@ -966,7 +973,7 @@ async def _send_discord(token, chat_id, message, thread_id=None, media_files=Non return _error(f"Discord send failed: {e}") -async def _send_slack(token, chat_id, message): +async def _send_slack(token, chat_id, message, thread_id=None): """Send via Slack Web API.""" try: import aiohttp @@ -980,6 +987,8 @@ async def _send_slack(token, chat_id, message): headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"} async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=30), **_sess_kw) as session: payload = {"channel": chat_id, "text": message, "mrkdwn": True} + if thread_id: + payload["thread_ts"] = thread_id async with session.post(url, headers=headers, json=payload, **_req_kw) as resp: data = await resp.json() if data.get("ok"):