79 lines
3.2 KiB
TypeScript
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");
|
|
});
|