From 1b8efdb4a44803fe0c4fc4eb464400b19e1aa934 Mon Sep 17 00:00:00 2001 From: MrKan Date: Sun, 19 Apr 2026 14:41:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8,=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B3=D0=B4=D0=B0=20=D1=87=D0=B0=D1=82=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BD=D1=8F=D1=82=20=D0=B4=D1=80=D1=83=D0=B3=D0=B8=D0=BC=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lambda_agent_api/agent_api.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/lambda_agent_api/agent_api.py b/lambda_agent_api/agent_api.py index e2e5346..cc25416 100644 --- a/lambda_agent_api/agent_api.py +++ b/lambda_agent_api/agent_api.py @@ -4,6 +4,8 @@ import aiohttp import asyncio from urllib.parse import urljoin +from aiohttp import WSServerHandshakeError + from lambda_agent_api.server import * from lambda_agent_api.client import * @@ -46,7 +48,11 @@ class AgentApi: self._listen_task: asyncio.Task | None = None async def connect(self): - """Явное подключение к агенту.""" + """Явное подключение к агенту. + + :raise AgentBusyException: Чат занят другим клиентом. + :raise AgentException: Непредвиденная ошибка протокола, см. code и details + """ self._session = aiohttp.ClientSession() try: self._ws = await self._session.ws_connect(self.url, heartbeat=30) @@ -88,6 +94,25 @@ class AgentApi: await self._session.close() raise + except WSServerHandshakeError as e: # если при открытии подключения сервер вернул какую-то ошибку + if self._session and not self._session.closed: + await self._session.close() + + # во-первых, aiohttp зачем-то приводит WS коды ошибок к HTTP. + # во-вторых, делает он это некорректно. Любой неизвестный код WS ошибки становится 403 HTTP + # в-третьих, он не передает оригинальное сообщение об ошибке. + # Т. е. какое бы сообщение сервер не отправлял, тут всегда будет "Invalid response status" + # см. site-packages\aiohttp\client.py, line 1104, in _ws_connect + # итого понять реальную причину ошибки почти невозможно. Нужно менять библиотеку + # сейчас сервер специально кидает только ошибку с WS кодом 1008 Policy Violation, когда внутри ловит ChatBusyError + # поэтому скорее всего, если мы получили WSServerHandshakeError с 403, то это внутренний ChatBusyError + if e.status != 403: + # обрабатываем как обычную ошибку WS по примеру except блока ниже + raise AgentException(code="CONNECTION_ERROR", + details=f"Failed to connect agent {self.id}: {e}") from e + + raise AgentBusyException(f"Chat {self.chat_id} is already in use by other client") + except Exception as e: # Обработка всех остальных ошибок (например, aiohttp.ClientConnectionError) if self._ws and not self._ws.closed: