Files
2026-07-13 13:39:12 +08:00

79 lines
3.2 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import {
normalizeOpenAICompatibleFinishReason,
normalizeOpenAICompatibleFinishReasonString,
} from "../../open-sse/utils/finishReason.ts";
// ── normalizeOpenAICompatibleFinishReason ──────────────────────────────────
test("standard OpenAI finish reasons pass through unchanged", () => {
assert.equal(normalizeOpenAICompatibleFinishReason("stop"), "stop");
assert.equal(normalizeOpenAICompatibleFinishReason("length"), "length");
assert.equal(normalizeOpenAICompatibleFinishReason("tool_calls"), "tool_calls");
assert.equal(normalizeOpenAICompatibleFinishReason("content_filter"), "content_filter");
assert.equal(normalizeOpenAICompatibleFinishReason("function_call"), "function_call");
});
test("max_tokens normalizes to length", () => {
assert.equal(normalizeOpenAICompatibleFinishReason("max_tokens"), "length");
assert.equal(normalizeOpenAICompatibleFinishReason("MAX_TOKENS"), "length");
});
test("Gemini MALFORMED_RESPONSE maps to content_filter", () => {
assert.equal(normalizeOpenAICompatibleFinishReason("MALFORMED_RESPONSE"), "content_filter");
assert.equal(normalizeOpenAICompatibleFinishReason("malformed_response"), "content_filter");
});
test("all safety finish reasons map to content_filter", () => {
const reasons = [
"safety",
"recitation",
"blocklist",
"prohibited_content",
"content_filtered",
"policy_violation",
"malformed_response",
];
for (const reason of reasons) {
assert.equal(
normalizeOpenAICompatibleFinishReason(reason),
"content_filter",
`${reason} should map to content_filter`
);
}
});
test("case-insensitive matching", () => {
assert.equal(normalizeOpenAICompatibleFinishReason("STOP"), "stop");
assert.equal(normalizeOpenAICompatibleFinishReason("Safety"), "content_filter");
assert.equal(normalizeOpenAICompatibleFinishReason("MALFORMED_RESPONSE"), "content_filter");
});
test("unknown reason passes through as-is", () => {
assert.equal(normalizeOpenAICompatibleFinishReason("some_new_reason"), "some_new_reason");
});
test("non-string input returns as-is", () => {
assert.equal(normalizeOpenAICompatibleFinishReason(null), null);
assert.equal(normalizeOpenAICompatibleFinishReason(undefined), undefined);
assert.equal(normalizeOpenAICompatibleFinishReason(42), 42);
});
// ── normalizeOpenAICompatibleFinishReasonString ────────────────────────────
test("string variant returns normalized string", () => {
assert.equal(normalizeOpenAICompatibleFinishReasonString("stop"), "stop");
assert.equal(normalizeOpenAICompatibleFinishReasonString("malformed_response"), "content_filter");
});
test("non-string input returns fallback (default stop)", () => {
assert.equal(normalizeOpenAICompatibleFinishReasonString(null), "stop");
assert.equal(normalizeOpenAICompatibleFinishReasonString(undefined), "stop");
assert.equal(normalizeOpenAICompatibleFinishReasonString(""), "stop");
});
test("custom fallback", () => {
assert.equal(normalizeOpenAICompatibleFinishReasonString(null, "length"), "length");
});