{"record":{"id":"b4436f4cccc56c61","repo":"infiniflow/ragflow","slug":"whatsapp-events-websocket-error-ws-exception","errorCode":null,"errorMessage":"whatsapp events websocket error: {ws.exception()}","messagePattern":"whatsapp events websocket error: (.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"api/channels/whatsapp/channel.py","lineNumber":288,"sourceCode":"        self._status = str(snapshot.get(\"status\") or \"connecting\")\n        self._last_error = str(snapshot.get(\"last_error\") or \"\")\n        self._qr_data_url = str(snapshot.get(\"qr_data_url\") or \"\")\n        self._qr_updated_at = float(snapshot.get(\"qr_updated_at\") or 0.0)\n        self._connected_at = float(snapshot.get(\"connected_at\") or 0.0)\n        self._session_id = str(snapshot.get(\"session_id\") or self._session_id or \"\")\n        self._event_cursor = max(self._event_cursor, int(snapshot.get(\"event_cursor\") or 0))\n        if self._status == \"connected\":\n            self._last_error = \"\"\n\n    async def _run_events_ws(self) -> None:\n        session = await self._ensure_http_session()\n        url = self._events_ws_url()\n        async with session.ws_connect(url, headers=self._gateway_headers(), heartbeat=None) as ws:\n            async for msg in ws:\n                if msg.type == aiohttp.WSMsgType.TEXT:\n                    await self._handle_ws_payload(msg.data)\n                elif msg.type == aiohttp.WSMsgType.ERROR:\n                    raise RuntimeError(f\"whatsapp events websocket error: {ws.exception()}\")\n            LOGGER.warning(\"[whatsapp:%s] events websocket closed\", self.account_id)\n\n    async def _handle_ws_payload(self, payload: str) -> None:\n        try:\n            obj = json.loads(payload)\n        except json.JSONDecodeError:\n            LOGGER.warning(\n                \"[whatsapp:%s] ignored invalid websocket payload: %r\",\n                self.account_id,\n                payload[:200],\n            )\n            return\n\n        kind = str(obj.get(\"type\") or \"\").strip()\n        data = obj.get(\"data\")\n        if kind == \"snapshot\" and isinstance(data, dict):\n            self._apply_snapshot(data)\n            return","sourceCodeStart":270,"sourceCodeEnd":306,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/api/channels/whatsapp/channel.py#L270-L306","documentation":"Error \"whatsapp events websocket error: {ws.exception()}\" thrown in infiniflow/ragflow.","triggerScenarios":"Thrown at api/channels/whatsapp/channel.py:288 when the library encounters an invalid state.","commonSituations":"The websocket connection to the WhatsApp gateway drops or fails, commonly from a gateway restart or network issue; reconnecting with backoff prevents this error.","solutions":["Check the gateway websocket endpoint and network connectivity.","Restart the WhatsApp gateway and reconnect."],"exampleFix":"# reconnect with backoff on websocket error\ntry:\n    async with session.ws_connect(url) as ws:\n        ...\nexcept Exception as e:\n    logger.error('whatsapp events websocket error: %s', e)","handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}