fix(agents): classify unknown-no-details Responses failures as unknown for failover (#65254)

Merged via squash.

Prepared head SHA: 92ed4381b6
Co-authored-by: OpenCodeEngineer <261470075+OpenCodeEngineer@users.noreply.github.com>
Co-authored-by: altaywtf <9790196+altaywtf@users.noreply.github.com>
Reviewed-by: @altaywtf
This commit is contained in:
OpenCodeEngineer
2026-04-14 10:13:55 -07:00
committed by GitHub
parent 1898b2093f
commit 17c4f62312
3 changed files with 14 additions and 0 deletions

View File

@@ -19,6 +19,7 @@ Docs: https://docs.openclaw.ai
- Telegram/documents: drop leaked binary caption bytes from inbound Telegram text handling so document uploads like `.mobi` or `.epub` no longer explode prompt token counts. (#66663) Thanks @joelnishanth.
- Gateway/auth: resolve the active gateway bearer per-request on the HTTP server and the HTTP upgrade handler via `getResolvedAuth()`, mirroring the WebSocket path, so a secret rotated through `secrets.reload` or config hot-reload stops authenticating on `/v1/*`, `/tools/invoke`, plugin HTTP routes, and the canvas upgrade path immediately instead of remaining valid on HTTP until gateway restart. (#66651) Thanks @mmaps.
- Agents/compaction: cap the compaction reserve-token floor to the model context window so small-context local models (e.g. Ollama with 16K tokens) no longer trigger context-overflow errors or infinite compaction loops on every prompt. (#65671) Thanks @openperf.
- Agents/OpenAI Responses: classify the exact `Unknown error (no error details in response)` transport failure as failover reason `unknown` so assistant/model fallback still runs for that no-details failure path. (#65254) Thanks @OpenCodeEngineer.
## 2026.4.14

View File

@@ -684,6 +684,12 @@ describe("classifyFailoverReason", () => {
).toBeNull();
});
it("classifies OpenAI Responses unknown-no-details message as unknown", () => {
const message = "Unknown error (no error details in response)";
expect(classifyFailoverReason(message)).toBe("unknown");
expect(isFailoverErrorMessage(message)).toBe(true);
});
it("classifies provider-scoped generic upstream messages", () => {
expect(classifyFailoverReason("An unknown error occurred", { provider: "anthropic" })).toBe(
"timeout",

View File

@@ -668,6 +668,10 @@ function isOpenRouterKeyLimitExceededError(raw: string, provider?: string): bool
);
}
function isExactUnknownNoDetailsError(raw: string): boolean {
return normalizeOptionalLowercaseString(raw)?.trim() === "unknown error (no error details in response)";
}
function classifyFailoverClassificationFromMessage(
raw: string,
provider?: string,
@@ -737,6 +741,9 @@ function classifyFailoverClassificationFromMessage(
if (isCloudCodeAssistFormatError(raw)) {
return toReasonClassification("format");
}
if (isExactUnknownNoDetailsError(raw)) {
return toReasonClassification("unknown");
}
if (isTimeoutErrorMessage(raw)) {
return toReasonClassification("timeout");
}