83 lines
3.9 KiB
Python
83 lines
3.9 KiB
Python
import json
|
|
from openai import APIStatusError
|
|
|
|
# 定义HTTP状态码到中文错误信息的映射
|
|
HTTP_STATUS_CODE_MESSAGES = {
|
|
400: "请求无效",
|
|
401: "身份验证失败-请检查您的API Key是否正确。",
|
|
403: "无权限访问-您没有权限访问此资源。",
|
|
404: "请求的资源不存",
|
|
429: "请求频率过高-您已超出速率限制,请稍后再试。",
|
|
500: "服务器内部错误- 服务提供商端发生未知问题。",
|
|
502: "网关错误",
|
|
503: "服务不可用- 服务器当前无法处理请求,请稍后重试。",
|
|
504: "网关超时",
|
|
}
|
|
|
|
# 定义百度翻译API的错误码映射
|
|
BAIDU_ERROR_CODE_MESSAGES = {
|
|
'52001': '请求超时,请重试',
|
|
'52002': '系统错误,请重试',
|
|
'52003': '未授权用户,请检查appid是否正确或服务是否开通',
|
|
'54000': '必填参数为空,请检查是否少传参数',
|
|
'54001': '签名错误,请检查appid和secret_key是否正确',
|
|
'54003': '访问频率受限,请降低您的调用频率,或进行身份认证后切换为高级版/尊享版',
|
|
'54004': '账户余额不足,请前往管理控制台充值',
|
|
'54005': '长query请求频繁,请降低长query的发送频率,3s后再试',
|
|
'58000': '客户端IP非法,检查个人资料里填写的IP地址是否正确,可前往开发者信息-基本信息修改',
|
|
'58001': '译文语言方向不支持,检查译文语言是否在语言列表里',
|
|
'58002': '服务当前已关闭,请前往百度管理控制台开启服务',
|
|
'58003': '此IP已被封禁',
|
|
'90107': '认证未通过或未生效,请前往我的认证查看认证进度',
|
|
'20003': '请求内容存在安全风险',
|
|
}
|
|
|
|
|
|
def format_api_error(e: Exception, provider_display_name: str) -> str:
|
|
"""
|
|
格式化来自API的错误信息,提供更详细的上下文。
|
|
"""
|
|
# 优先处理openai的API状态错误
|
|
if isinstance(e, APIStatusError):
|
|
status_code = e.status_code
|
|
message = HTTP_STATUS_CODE_MESSAGES.get(status_code, f"未知HTTP错误")
|
|
|
|
error_details_str = ""
|
|
try:
|
|
# 尝试解析响应体中的详细错误信息
|
|
error_details = e.response.json()
|
|
# 提取关键信息,兼容不同服务商的格式
|
|
# 常见格式: {"error": {"message": "...", "type": "...", "code": "..."}}
|
|
# 或: {"message": "..."}
|
|
detail_msg = error_details.get("message", "")
|
|
if isinstance(error_details.get("error"), dict):
|
|
detail_msg = error_details["error"].get("message", detail_msg)
|
|
|
|
if detail_msg:
|
|
error_details_str = f" | 详情: {detail_msg}"
|
|
except (json.JSONDecodeError, AttributeError):
|
|
# 如果解析失败或没有响应体,使用原始响应文本
|
|
try:
|
|
if e.response and hasattr(e.response, 'text') and e.response.text:
|
|
error_details_str = f" | 原始响应: {e.response.text}"
|
|
except Exception:
|
|
pass # 忽略获取原始响应的错误
|
|
|
|
return f"{provider_display_name} API错误: {message} (状态码: {status_code}){error_details_str}"
|
|
|
|
# 对于其他类型的异常,例如网络连接错误,返回其类型和基本信息
|
|
return f"{provider_display_name} 服务请求异常: ({type(e).__name__}) {str(e)}"
|
|
|
|
def format_baidu_translate_error(error_data: dict) -> str:
|
|
"""
|
|
格式化百度翻译API的错误信息。
|
|
"""
|
|
if not isinstance(error_data, dict):
|
|
return "未知的百度翻译错误格式"
|
|
|
|
error_code = str(error_data.get('error_code'))
|
|
if error_code in BAIDU_ERROR_CODE_MESSAGES:
|
|
return f"百度翻译错误: {BAIDU_ERROR_CODE_MESSAGES[error_code]} (代码: {error_code})"
|
|
|
|
error_msg = error_data.get('error_msg', '未知错误')
|
|
return f"百度翻译错误: {error_msg} (代码: {error_code})" |