Files
Peter Steinberger 12165769c7 refactor(agents): move OpenRouter failover ownership to its plugin and derive reason schemas from one tuple (#121898)
* refactor(agents): centralize failover ownership and reasons

* test(agents): move OpenRouter failover cases to plugin owner

* fix(agents): preserve prepared provider failover ownership

* test(agents): avoid failover mock shadowing

* fix(agents): preserve provider owner in error copy

* fix(agents): complete provider owner propagation

* chore(plugins): refresh failover type closure hashes
2026-08-11 04:30:18 -07:00

40 lines
1.5 KiB
TypeScript

// OpenRouter failover tests keep vendor error policy at its owning plugin boundary.
import { registerSingleProviderPlugin } from "openclaw/plugin-sdk/plugin-test-runtime";
import { beforeAll, describe, expect, it } from "vitest";
import openrouterPlugin from "./index.js";
let provider: Awaited<ReturnType<typeof registerSingleProviderPlugin>>;
beforeAll(async () => {
provider = await registerSingleProviderPlugin(openrouterPlugin);
});
function classifyOpenRouterFailure(errorMessage: string, providerId?: string) {
return provider.classifyFailoverReason?.({ provider: providerId, errorMessage });
}
describe("OpenRouter failover classification", () => {
it.each([
["Key limit exceeded", "billing"],
["HTTP 401: 401 Key limit reached (monthly limit)", "billing"],
["Key limit hit", "billing"],
[
"HTTP 403: 403 API key budget limit exceeded (monthly limit). Contact your org admin.",
"billing",
],
["API key budget limit reached", "billing"],
["API key budget limit hit", "billing"],
["Provider returned error", "timeout"],
] as const)("maps %s to %s", (errorMessage, expected) => {
expect(classifyOpenRouterFailure(errorMessage, "openrouter")).toBe(expected);
});
it.each([undefined, "anthropic", "custom-openrouter"])(
"does not apply OpenRouter policy to provider %s",
(providerId) => {
expect(classifyOpenRouterFailure("Key limit exceeded", providerId)).toBeUndefined();
expect(classifyOpenRouterFailure("Provider returned error", providerId)).toBeUndefined();
},
);
});