新增 Matrix 渠道扩展,支持在 Yuxi 平台中集成 Matrix 去中心化通讯协议。 包含以下功能模块: - config: 渠道配置管理 - gateway: SSE/WebSocket 网关接入 - outbound: 外发消息管理 - streaming: 流式消息处理 - pairing: 用户配对与绑定 - security: 安全校验 - crypto: 端到端加密 - dedupe: 消息去重 - monitor: 渠道状态监控 - status: 会话状态管理 - session: 会话管理 - room_resolver: 房间解析 - dm_tracker: 私聊追踪 - rate_limiter: 速率限制 - actions: 动作处理 - constants: 常量定义 - utils: 工具函数 - types: 类型定义
65 lines
1.7 KiB
Python
65 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from yuxi.channel.protocols import ClassifiedError, ErrorSeverity
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def classify_error(error: BaseException) -> ClassifiedError:
|
|
msg = str(error).upper()
|
|
|
|
if "M_LIMIT_EXCEEDED" in msg or "429" in str(error):
|
|
return ClassifiedError(
|
|
severity=ErrorSeverity.RATE_LIMITED,
|
|
retry_after_ms=_extract_retry_after(error),
|
|
original_error=error,
|
|
error_message=str(error),
|
|
)
|
|
|
|
if any(kw in msg for kw in ("M_UNKNOWN_TOKEN", "M_MISSING_TOKEN", "M_NOT_JSON")):
|
|
return ClassifiedError(
|
|
severity=ErrorSeverity.FORBIDDEN,
|
|
original_error=error,
|
|
error_message=str(error),
|
|
)
|
|
|
|
if "M_FORBIDDEN" in msg:
|
|
return ClassifiedError(
|
|
severity=ErrorSeverity.FORBIDDEN,
|
|
original_error=error,
|
|
error_message=str(error),
|
|
)
|
|
|
|
if "M_NOT_FOUND" in msg:
|
|
return ClassifiedError(
|
|
severity=ErrorSeverity.FATAL,
|
|
original_error=error,
|
|
error_message=str(error),
|
|
)
|
|
|
|
if isinstance(error, (ConnectionError, TimeoutError, OSError)):
|
|
return ClassifiedError(
|
|
severity=ErrorSeverity.NETWORK,
|
|
original_error=error,
|
|
error_message=str(error),
|
|
)
|
|
|
|
return ClassifiedError(
|
|
severity=ErrorSeverity.FATAL,
|
|
original_error=error,
|
|
error_message=str(error),
|
|
)
|
|
|
|
|
|
def _extract_retry_after(error) -> int:
|
|
try:
|
|
import re
|
|
|
|
m = re.search(r"retry_after_ms[:\s]+(\d+)", str(error), re.IGNORECASE)
|
|
if m:
|
|
return int(m.group(1))
|
|
except (ValueError, TypeError):
|
|
pass
|
|
return 5000 |