"""代理层错误类型(§5.3 错误码映射)。""" from __future__ import annotations class ProxyError(Exception): """代理层错误基类(HTTP 语义由子类表达)。""" status_code = 500 code = "proxy_error" class ProxyAuthError(ProxyError): """无效/注销 key。""" status_code = 401 code = "invalid_key" class BalanceError(ProxyError): """余额或日上限不足(预扣失败)。""" status_code = 402 code = "insufficient_balance" class SuspendedError(ProxyError): """学生账户被停用。""" status_code = 403 code = "student_suspended" class QuotaError(ProxyError): """限流(rpm / 日请求上限 / 并发上限)。""" status_code = 429 code = "rate_limited" class BodyTooLargeError(ProxyError): """请求体超过 max_body_chars。""" status_code = 413 code = "body_too_large" class UpstreamError(ProxyError): """上游失败(首 token 前 failover 均失败)。""" status_code = 502 code = "upstream_failed" class AdminAuthError(ProxyError): """管理面鉴权失败。""" status_code = 401 code = "admin_unauthorized"