61 lines
2.7 KiB
TypeScript
61 lines
2.7 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
// #4519 — allow combo fallback on context-overflow / param-validation 400s and
|
|
// preserve upstream error semantics. Three regression guards:
|
|
// 1. accountFallback.checkFallbackError classifies param-validation 400s as
|
|
// fallback-worthy with zero cooldown.
|
|
// 2. combo guard predicates (isContextOverflow400 / isParamValidation400) let
|
|
// those 400s fall through to the next target instead of short-circuiting.
|
|
// 3. openai-responses.normalizeUpstreamFailure keeps context_length_exceeded as
|
|
// 400 and rate-limit as 429 (instead of rewriting everything to 502).
|
|
|
|
const { checkFallbackError } = await import("../../open-sse/services/accountFallback.ts");
|
|
const { isContextOverflow400, isParamValidation400 } = await import(
|
|
"../../open-sse/services/combo.ts"
|
|
);
|
|
const { normalizeUpstreamFailure } = await import(
|
|
"../../open-sse/translator/response/openai-responses.ts"
|
|
);
|
|
|
|
test("#4519 checkFallbackError treats per-model max_tokens 400 as fallback-worthy with zero cooldown", () => {
|
|
const res = checkFallbackError(
|
|
400,
|
|
"The max_tokens parameter is illegal.:限制数值范围[1,131072]"
|
|
);
|
|
assert.equal(res.shouldFallback, true);
|
|
assert.equal(res.cooldownMs, 0);
|
|
});
|
|
|
|
test("#4519 combo guard: context-overflow and param-validation 400 texts are recognized", () => {
|
|
assert.equal(isContextOverflow400("This model's context_length_exceeded for the input"), true);
|
|
assert.equal(isContextOverflow400("your input exceeds the allowed size"), true);
|
|
assert.equal(isParamValidation400("max_tokens must be in range [1,131072]"), true);
|
|
assert.equal(isParamValidation400("The parameter is illegal"), true);
|
|
});
|
|
|
|
test("#4519 combo guard: a genuinely body-specific 400 is NOT classified as overflow/param", () => {
|
|
const malformed = "Invalid JSON: unexpected token at position 12";
|
|
assert.equal(isContextOverflow400(malformed), false);
|
|
assert.equal(isParamValidation400(malformed), false);
|
|
});
|
|
|
|
test("#4519 normalizeUpstreamFailure preserves context_length_exceeded as 400", () => {
|
|
const out = normalizeUpstreamFailure({
|
|
error: { code: "context_length_exceeded", message: "too long" },
|
|
});
|
|
assert.equal(out.status, 400);
|
|
assert.equal(out.type, "invalid_request_error");
|
|
});
|
|
|
|
test("#4519 normalizeUpstreamFailure keeps rate-limit as 429 and unknown as 502", () => {
|
|
const rl = normalizeUpstreamFailure({
|
|
error: { code: "rate_limit_exceeded", message: "slow down" },
|
|
});
|
|
assert.equal(rl.status, 429);
|
|
assert.equal(rl.type, "rate_limit_error");
|
|
|
|
const unknown = normalizeUpstreamFailure({ error: { code: "weird_error", message: "boom" } });
|
|
assert.equal(unknown.status, 502);
|
|
});
|