fix(agent): recognize image provider HTTP and quota failures
This commit is contained in:
parent
d4a6b54078
commit
2a2a32c3bd
@ -7,10 +7,13 @@ export function agentImageFailurePolicy(error: unknown): { retry: boolean; pause
|
|||||||
// never submit another paid job just because a poll/connection timed out.
|
// never submit another paid job just because a poll/connection timed out.
|
||||||
const unknown = value?.providerOutcomeUnknown || /request_outcome_unknown|may still be running|outcome.unknown|timed out|timeout|超时|fetch failed|econnreset|socket hang up/.test(message);
|
const unknown = value?.providerOutcomeUnknown || /request_outcome_unknown|may still be running|outcome.unknown|timed out|timeout|超时|fetch failed|econnreset|socket hang up/.test(message);
|
||||||
if (unknown && !/task failed|task.*(?:failed|cancelled|canceled)|任务.*(?:失败|取消)/.test(message)) return { retry: false, pause: null };
|
if (unknown && !/task failed|task.*(?:failed|cancelled|canceled)|任务.*(?:失败|取消)/.test(message)) return { retry: false, pause: null };
|
||||||
if (/content.?policy|moderation|safety|违规|敏感|积分不足|配额不足|user cancel|user abort/.test(message)) return { retry: false, pause: null };
|
if (/content.?policy|moderation|safety|违规|敏感|积分不足|本月.*配额|user cancel|user abort/.test(message)) return { retry: false, pause: null };
|
||||||
const fault = agentModelFault(error);
|
const status = Number(value?.statusCode || value?.status) || Number(message.match(/(?:http[\s::]*|status(?:code)?[\s:=]*)([45]\d{2})/i)?.[1]) || null;
|
||||||
|
if (/quota|insufficient.*(?:balance|credit)|credits? insufficient|余额|额度|配额|rate.?limit|too many requests/.test(message))
|
||||||
|
return { retry: true, pause: { reason: "rate_or_quota", status } };
|
||||||
|
const fault = agentModelFault(status ? { message, status } : error);
|
||||||
if (fault) return { retry: true, pause: fault };
|
if (fault) return { retry: true, pause: fault };
|
||||||
if (/task failed|image generation failed|图片生成失败|未返回.*图片|empty.result|empty.response|provider.error|上游.*错误|模型.*维护/.test(message))
|
if (/task failed|image generation failed|生成失败|任务.*失败|未返回.*图片|no images? (?:in|url)|no valid data|response body is null|empty.result|empty.response|provider.error|上游.*错误|模型.*维护/.test(message))
|
||||||
return { retry: true, pause: { reason: "image_generation_failed", status: Number(value?.statusCode || value?.status) || null } };
|
return { retry: true, pause: { reason: "image_generation_failed", status: Number(value?.statusCode || value?.status) || null } };
|
||||||
return { retry: false, pause: null };
|
return { retry: false, pause: null };
|
||||||
}
|
}
|
||||||
|
|||||||
@ -68,3 +68,11 @@ test("the existing non-Agent auto alias continues to select its configured defau
|
|||||||
const result = await h.generate({ ...h.request, model: "auto", agentImageMode: undefined, allowFailover: false });
|
const result = await h.generate({ ...h.request, model: "auto", agentImageMode: undefined, allowFailover: false });
|
||||||
expect(result.modelRef).toBe("primary"); expect(h.calls).toHaveLength(1);
|
expect(result.modelRef).toBe("primary"); expect(h.calls).toHaveLength(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test("provider adapters that include HTTP status or quota only in their message still recover", () => {
|
||||||
|
for (const message of ["API request failed: HTTP 503", "server busy(HTTP 429)", "insufficient balance", "模型配额不足", "No images in response", "BananaImage 生成失败"]) {
|
||||||
|
expect(agentImageFailurePolicy(new Error(message)).retry).toBe(true);
|
||||||
|
}
|
||||||
|
expect(agentImageFailurePolicy(new Error("invalid input (HTTP 400)")).retry).toBe(false);
|
||||||
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user