fix: 覆盖 Codex retry 503 分类

This commit is contained in:
Codex
2026-05-29 14:17:12 +08:00
parent 7534b87153
commit 81642fdd54
4 changed files with 50 additions and 6 deletions
+11 -2
View File
@@ -423,7 +423,7 @@ function normalizeCodexNotification(message: JsonRecord): { events: BackendEvent
if (method === "error") {
const error = asRecordAt(params, "error");
const messageText = typeof error.message === "string" ? error.message : "Codex app-server error";
const failureKind = classifyMessageFailureKind(messageText, "backend-failed");
const failureKind = classifyCodexErrorRecord(error, "backend-failed");
const terminal = params.willRetry === true ? undefined : { status: "failed" as const, failureKind, message: redactText(messageText) };
return { events: [{ type: "error", payload: { failureKind, error: redactJson(error), willRetry: params.willRetry === true } }], ...(terminal ? { terminal } : {}) };
}
@@ -435,7 +435,7 @@ function normalizeCodexNotification(message: JsonRecord): { events: BackendEvent
const status = terminalStatusFromValue(turn.status);
const error = asRecordAt(turn, "error");
const messageText = typeof error.message === "string" ? redactText(error.message) : null;
const failureKind = status === "completed" ? null : classifyMessageFailureKind(messageText ?? turn.status, "backend-failed");
const failureKind = status === "completed" ? null : classifyCodexErrorRecord(Object.keys(error).length > 0 ? error : { message: turn.status }, "backend-failed");
const events: BackendEvent[] = [{ type: "backend_status", payload: { phase: method, terminalStatus: status } }];
if (failureKind) events.push({ type: "error", payload: { failureKind, error: redactJson(error), phase: method } });
return { events, terminal: { status, failureKind, message: messageText } };
@@ -569,6 +569,15 @@ function normalizeFailure(error: unknown): CodexStdioFailure {
return new CodexStdioFailure(classifyMessageFailureKind(message, "backend-protocol-error"), message, "codex-stdio");
}
function classifyCodexErrorRecord(error: JsonRecord, fallback: FailureKind): FailureKind {
const parts: string[] = [];
if (typeof error.message === "string") parts.push(error.message);
if (typeof error.additionalDetails === "string") parts.push(error.additionalDetails);
const redactedJson = JSON.stringify(redactJson(error as JsonValue));
if (redactedJson && redactedJson !== "{}") parts.push(redactedJson);
return classifyMessageFailureKind(parts.join("\n"), fallback);
}
function classifyMessageFailureKind(message: string, fallback: FailureKind): FailureKind {
const text = String(message || "").toLowerCase();
if (/rate.?limit|too many requests|\b429\b/u.test(text)) return "provider-rate-limited";