Files
yawiii-ComfyUI-Prompt-Assis…/services/error_util.py
T

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})"