mirror of
https://github.com/foxhui/WebAI2API.git
synced 2026-06-16 21:03:59 +08:00
feat: 错误处理增强
- normalizeHttpError 从响应体提取具体错误信息 - 支持 JSON 格式错误解析 - 新增 isRetryableError 判断错误是否可重试 - 新增 normalizeError 通用错误归一化
This commit is contained in:
@@ -96,6 +96,36 @@ export function normalizePageError(err, meta = {}) {
|
|||||||
export function normalizeHttpError(response, content = null) {
|
export function normalizeHttpError(response, content = null) {
|
||||||
const status = response.status();
|
const status = response.status();
|
||||||
|
|
||||||
|
// 尝试从响应体中提取具体错误信息
|
||||||
|
let detailError = null;
|
||||||
|
if (content) {
|
||||||
|
try {
|
||||||
|
const json = JSON.parse(content);
|
||||||
|
// 格式: {"error": "Request rejected: ..."}
|
||||||
|
if (json.error && typeof json.error === 'string') {
|
||||||
|
detailError = json.error;
|
||||||
|
}
|
||||||
|
// 格式: {"error": {"message": "..."}}
|
||||||
|
else if (json.error?.message) {
|
||||||
|
detailError = json.error.message;
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
// 非 JSON 格式,尝试直接使用内容
|
||||||
|
if (content.length < 200) {
|
||||||
|
detailError = content;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查是否是内容审核拒绝 (通常返回 422 或 429 但含有拒绝信息)
|
||||||
|
const isContentRejection = detailError && (
|
||||||
|
/reject|violat|terms|blocked|forbidden|unsafe|moderat/i.test(detailError) ||
|
||||||
|
detailError === 'prompt failed'
|
||||||
|
);
|
||||||
|
if (isContentRejection) {
|
||||||
|
return { error: `内容被拒绝: ${detailError}`, code: ADAPTER_ERRORS.CONTENT_BLOCKED, retryable: false };
|
||||||
|
}
|
||||||
|
|
||||||
// 429 限流检查
|
// 429 限流检查
|
||||||
if (status === 429 || content?.includes('Too Many Requests')) {
|
if (status === 429 || content?.includes('Too Many Requests')) {
|
||||||
return { error: '触发限流/上游繁忙', code: ADAPTER_ERRORS.RATE_LIMITED, retryable: true };
|
return { error: '触发限流/上游繁忙', code: ADAPTER_ERRORS.RATE_LIMITED, retryable: true };
|
||||||
@@ -108,12 +138,18 @@ export function normalizeHttpError(response, content = null) {
|
|||||||
|
|
||||||
// 5xx 服务端错误(可重试)
|
// 5xx 服务端错误(可重试)
|
||||||
if (status >= 500) {
|
if (status >= 500) {
|
||||||
return { error: `上游服务器错误,HTTP错误码: ${status}`, code: ADAPTER_ERRORS.HTTP_ERROR, retryable: true };
|
const msg = detailError
|
||||||
|
? `上游服务器错误 (${status}): ${detailError}`
|
||||||
|
: `上游服务器错误,HTTP错误码: ${status}`;
|
||||||
|
return { error: msg, code: ADAPTER_ERRORS.HTTP_ERROR, retryable: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4xx 客户端错误(不可重试)
|
// 4xx 客户端错误(不可重试)
|
||||||
if (status >= 400) {
|
if (status >= 400) {
|
||||||
return { error: `请求错误,HTTP错误码: ${status}`, code: ADAPTER_ERRORS.HTTP_ERROR, retryable: false };
|
const msg = detailError
|
||||||
|
? `请求被拒绝 (${status}): ${detailError}`
|
||||||
|
: `请求错误,HTTP错误码: ${status}`;
|
||||||
|
return { error: msg, code: ADAPTER_ERRORS.HTTP_ERROR, retryable: false };
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
Reference in New Issue
Block a user