fix(gateway): retry Weixin prepare failures without token

This commit is contained in:
KoNit-K
2026-09-16 16:01:36 +08:00
committed by Teknium
parent e166791f9f
commit 46ab37ce35
2 changed files with 20 additions and 3 deletions

View File

@@ -66,8 +66,11 @@ _FENCE_RE = re.compile(r"^```([^\n`]*)\s*$")
def _is_stale_session_ret(ret: "Optional[int]", errcode: "Optional[int]", errmsg: "Optional[str]") -> bool:
"""ret/errcode=-2 with 'unknown error' is a stale-session signal (like -14), not a real rate limit."""
return (ret == RATE_LIMIT_ERRCODE or errcode == RATE_LIMIT_ERRCODE) and (errmsg or "").lower() == "unknown error"
"""Recognize stale-session variants of iLink's ``-2`` response, not real rate limits."""
return (ret == RATE_LIMIT_ERRCODE or errcode == RATE_LIMIT_ERRCODE) and (errmsg or "").lower() in {
"unknown error",
"prepare failed",
}
def _is_session_expired(resp: Dict[str, Any], ret: Any, errcode: Any) -> bool:

View File

@@ -322,6 +322,21 @@ class TestWeixinChunkDelivery:
assert send_message_mock.await_count == 2
assert sleep_mock.await_count == 1
@pytest.mark.parametrize("error_field", ["ret", "errcode"])
@patch("gateway.platforms.weixin._send_message", new_callable=AsyncMock)
def test_prepare_failed_retries_without_context_token(self, send_message_mock, error_field):
adapter = self._connected_adapter()
adapter._rate_limit_circuit_threshold = 1
adapter._token_store._cache[adapter._token_store._key(adapter._account_id, "wxid_test123")] = "ctx-token"
prepare_failed = {error_field: weixin.RATE_LIMIT_ERRCODE, "errmsg": "prepare failed"}
send_message_mock.side_effect = [prepare_failed, {"ret": 0}]
result = asyncio.run(adapter.send("wxid_test123", "hello"))
assert result.success is True
assert [call.kwargs["context_token"] for call in send_message_mock.await_args_list] == ["ctx-token", None]
assert adapter._rate_limit_circuit_until == 0.0
class TestWeixinOutboundMedia:
@@ -879,4 +894,3 @@ class TestWeixinVoiceGatewayHandoff:
"VOICE event body leaked Tencent's STT text — runner would trust "
"the wrong transcript instead of re-transcribing (#27300)."
)