fix(wecom): use reply_stream for progress messages to avoid errcode=40008

The plain reply() uses cmd="reply" which does not support "text" msgtype
and causes WeCom API to return errcode=40008 (invalid message type).
Unify both progress and final text messages to use reply_stream()
(cmd="aibot_respond_msg"), differentiating via finish flag.

Fixes #2999
This commit is contained in:
chengyongru
2026-04-11 21:47:19 +08:00
committed by Xubin Ren
parent 0d03f10fa0
commit 9f433cab01
2 changed files with 21 additions and 22 deletions
+6 -5
View File
@@ -317,20 +317,21 @@ async def test_send_text_with_frame() -> None:
@pytest.mark.asyncio
async def test_send_progress_with_frame() -> None:
"""When metadata has _progress, send uses reply (not reply_stream)."""
"""When metadata has _progress, send uses reply_stream with finish=False."""
channel = WecomChannel(WecomConfig(bot_id="b", secret="s", allow_from=["*"]), MessageBus())
client = _FakeWeComClient()
channel._client = client
channel._generate_req_id = lambda x: f"req_{x}"
channel._chat_frames["chat1"] = _FakeFrame()
await channel.send(
OutboundMessage(channel="wecom", chat_id="chat1", content="thinking...", metadata={"_progress": True})
)
client.reply.assert_called_once()
client.reply_stream.assert_not_called()
call_args = client.reply.call_args
assert call_args[0][1]["text"]["content"] == "thinking..."
client.reply_stream.assert_called_once()
call_args = client.reply_stream.call_args
assert call_args[0][2] == "thinking..." # content arg
assert call_args[1]["finish"] is False
@pytest.mark.asyncio