Skip to content

Commit de129a6

Browse files
committed
fix: restrict HTML timeout short-circuit to transient statuses
1 parent 3525273 commit de129a6

3 files changed

Lines changed: 20 additions & 2 deletions

File tree

src/agents/pi-embedded-helpers.formatassistanterrortext.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ describe("formatAssistantErrorText", () => {
176176
);
177177
});
178178

179-
it("returns upstream HTML copy for prefixed HTML rate-limit pages", () => {
179+
it("returns upstream HTML copy for prefixed 521 HTML rate-limit pages", () => {
180180
const msg = makeAssistantError(
181181
"Error: 521 <!DOCTYPE html><html><body>rate limit</body></html>",
182182
);

src/agents/pi-embedded-helpers/errors.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,11 @@ function isHtmlErrorResponse(raw: string, status?: number): boolean {
354354
}
355355

356356
function isTransportHtmlErrorStatus(status: number | undefined): boolean {
357-
return status !== 401 && status !== 403 && status !== 407;
357+
return (
358+
status === 408 ||
359+
status === 499 ||
360+
(typeof status === "number" && status >= 500 && status < 600)
361+
);
358362
}
359363

360364
function isOpenAICodexScopeContext(raw: string, provider?: string): boolean {

src/agents/pi-embedded-helpers/provider-error-patterns.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@ describe("Cloudflare / CDN HTML error page classification (#67517)", () => {
167167
const html407 =
168168
"<!doctype html><html><head><title>407 Proxy Authentication Required</title></head>" +
169169
"<body><h1>Proxy Authentication Required</h1></body></html>";
170+
const html402 =
171+
"<!doctype html><html><head><title>402 Payment Required</title></head>" +
172+
"<body><h1>Payment Required</h1><p>Your quota is exhausted.</p></body></html>";
173+
const html429 =
174+
"<!doctype html><html><head><title>429 Too Many Requests</title></head>" +
175+
"<body><h1>Too Many Requests</h1><p>Rate limit exceeded.</p></body></html>";
170176
const prefixedHtml401 = `Error: 401 ${html401}`;
171177
const prefixedHtml407 = `Error: 407 ${html407}`;
172178

@@ -190,6 +196,14 @@ describe("Cloudflare / CDN HTML error page classification (#67517)", () => {
190196
expect(classifyFailoverReason(prefixedHtml401)).toBe("auth");
191197
});
192198

199+
it("preserves billing classification for 402 HTML", () => {
200+
expect(classifyFailoverReason(`402 ${html402}`)).toBe("billing");
201+
});
202+
203+
it("preserves rate-limit classification for 429 HTML", () => {
204+
expect(classifyFailoverReason(`429 ${html429}`)).toBe("rate_limit");
205+
});
206+
193207
it("classifies runtime failure kind as upstream_html for non-auth HTML", () => {
194208
expect(classifyProviderRuntimeFailureKind({ status: 502, message: cloudflareHtml502 })).toBe(
195209
"upstream_html",

0 commit comments

Comments
 (0)