Merged via /review-pr -> /prepare-pr -> /merge-pr. Prepared head SHA: a8347e95c55c6244bbf2e9066c8bf77bf62de6c9 Co-authored-by: rodrigouroz <384037+rodrigouroz@users.noreply.github.com> Co-authored-by: Takhoffman <781889+Takhoffman@users.noreply.github.com> Reviewed-by: @Takhoffman
47 lines
2.0 KiB
TypeScript
47 lines
2.0 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { classifyFailoverReason } from "./pi-embedded-helpers.js";
|
|
import { DEFAULT_AGENTS_FILENAME } from "./workspace.js";
|
|
|
|
const _makeFile = (overrides: Partial<WorkspaceBootstrapFile>): WorkspaceBootstrapFile => ({
|
|
name: DEFAULT_AGENTS_FILENAME,
|
|
path: "/tmp/AGENTS.md",
|
|
content: "",
|
|
missing: false,
|
|
...overrides,
|
|
});
|
|
describe("classifyFailoverReason", () => {
|
|
it("returns a stable reason", () => {
|
|
expect(classifyFailoverReason("invalid api key")).toBe("auth");
|
|
expect(classifyFailoverReason("no credentials found")).toBe("auth");
|
|
expect(classifyFailoverReason("no api key found")).toBe("auth");
|
|
expect(classifyFailoverReason("429 too many requests")).toBe("rate_limit");
|
|
expect(classifyFailoverReason("resource has been exhausted")).toBe("rate_limit");
|
|
expect(
|
|
classifyFailoverReason(
|
|
'{"type":"error","error":{"type":"overloaded_error","message":"Overloaded"}}',
|
|
),
|
|
).toBe("rate_limit");
|
|
expect(classifyFailoverReason("invalid request format")).toBe("format");
|
|
expect(classifyFailoverReason("credit balance too low")).toBe("billing");
|
|
expect(classifyFailoverReason("deadline exceeded")).toBe("timeout");
|
|
expect(
|
|
classifyFailoverReason(
|
|
"521 <!DOCTYPE html><html><head><title>Web server is down</title></head><body>Cloudflare</body></html>",
|
|
),
|
|
).toBe("timeout");
|
|
expect(classifyFailoverReason("string should match pattern")).toBe("format");
|
|
expect(classifyFailoverReason("bad request")).toBeNull();
|
|
expect(
|
|
classifyFailoverReason(
|
|
"messages.84.content.1.image.source.base64.data: At least one of the image dimensions exceed max allowed size for many-image requests: 2000 pixels",
|
|
),
|
|
).toBeNull();
|
|
expect(classifyFailoverReason("image exceeds 5 MB maximum")).toBeNull();
|
|
});
|
|
it("classifies OpenAI usage limit errors as rate_limit", () => {
|
|
expect(classifyFailoverReason("You have hit your ChatGPT usage limit (plus plan)")).toBe(
|
|
"rate_limit",
|
|
);
|
|
});
|
|
});
|