138 lines
4.3 KiB
TypeScript
138 lines
4.3 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { extractSystemRoleMessages } from "../../open-sse/handlers/chatCore.ts";
|
|
|
|
test("extractSystemRoleMessages moves role=system to top-level system", () => {
|
|
const payload = {
|
|
messages: [
|
|
{ role: "system", content: "Memory context: foo" },
|
|
{ role: "user", content: "hello" },
|
|
{ role: "assistant", content: "hi" },
|
|
],
|
|
};
|
|
extractSystemRoleMessages(payload);
|
|
assert.equal(payload.messages.length, 2);
|
|
assert.equal(payload.messages[0].role, "user");
|
|
assert.deepEqual(payload.system, [{ type: "text", text: "Memory context: foo" }]);
|
|
});
|
|
|
|
test("extractSystemRoleMessages also lifts role=developer (OpenAI Responses system alias)", () => {
|
|
const payload = {
|
|
messages: [
|
|
{ role: "developer", content: "Dev instructions" },
|
|
{ role: "system", content: "Sys context" },
|
|
{ role: "user", content: "hello" },
|
|
],
|
|
};
|
|
extractSystemRoleMessages(payload);
|
|
// both developer and system are removed from messages and lifted into system
|
|
assert.equal(payload.messages.length, 1);
|
|
assert.equal(payload.messages[0].role, "user");
|
|
assert.deepEqual(payload.system, [
|
|
{ type: "text", text: "Dev instructions" },
|
|
{ type: "text", text: "Sys context" },
|
|
]);
|
|
});
|
|
|
|
test("extractSystemRoleMessages merges with existing top-level system string", () => {
|
|
const payload = {
|
|
system: "You are Claude.",
|
|
messages: [
|
|
{ role: "system", content: "Memory context: bar" },
|
|
{ role: "user", content: "hello" },
|
|
],
|
|
};
|
|
extractSystemRoleMessages(payload);
|
|
assert.equal(payload.messages.length, 1);
|
|
assert.deepEqual(payload.system, [
|
|
{ type: "text", text: "You are Claude." },
|
|
{ type: "text", text: "Memory context: bar" },
|
|
]);
|
|
});
|
|
|
|
test("extractSystemRoleMessages merges with existing top-level system array", () => {
|
|
const payload = {
|
|
system: [{ type: "text", text: "Existing system" }],
|
|
messages: [
|
|
{ role: "system", content: "Memory context: baz" },
|
|
{ role: "user", content: "hello" },
|
|
],
|
|
};
|
|
extractSystemRoleMessages(payload);
|
|
assert.equal(payload.messages.length, 1);
|
|
assert.deepEqual(payload.system, [
|
|
{ type: "text", text: "Existing system" },
|
|
{ type: "text", text: "Memory context: baz" },
|
|
]);
|
|
});
|
|
|
|
test("extractSystemRoleMessages does nothing when no system role messages", () => {
|
|
const payload = {
|
|
messages: [
|
|
{ role: "user", content: "hello" },
|
|
{ role: "assistant", content: "hi" },
|
|
],
|
|
};
|
|
extractSystemRoleMessages(payload);
|
|
assert.equal(payload.messages.length, 2);
|
|
assert.equal(payload.system, undefined);
|
|
});
|
|
|
|
test("extractSystemRoleMessages handles non-array messages gracefully", () => {
|
|
const payload = { messages: "not-an-array" };
|
|
extractSystemRoleMessages(payload);
|
|
assert.equal(payload.messages, "not-an-array");
|
|
});
|
|
|
|
test("extractSystemRoleMessages handles empty messages array", () => {
|
|
const payload = { messages: [] };
|
|
extractSystemRoleMessages(payload);
|
|
assert.equal(payload.messages.length, 0);
|
|
});
|
|
|
|
test("extractSystemRoleMessages handles case-insensitive role System", () => {
|
|
const payload = {
|
|
messages: [
|
|
{ role: "System", content: "Memory context: caps" },
|
|
{ role: "user", content: "hello" },
|
|
],
|
|
};
|
|
extractSystemRoleMessages(payload);
|
|
assert.equal(payload.messages.length, 1);
|
|
assert.deepEqual(payload.system, [{ type: "text", text: "Memory context: caps" }]);
|
|
});
|
|
|
|
test("extractSystemRoleMessages drops empty text content from system messages", () => {
|
|
const payload = {
|
|
messages: [
|
|
{ role: "system", content: "" },
|
|
{ role: "system", content: "valid" },
|
|
{ role: "user", content: "hello" },
|
|
],
|
|
};
|
|
extractSystemRoleMessages(payload);
|
|
assert.equal(payload.messages.length, 1);
|
|
assert.deepEqual(payload.system, [{ type: "text", text: "valid" }]);
|
|
});
|
|
|
|
test("extractSystemRoleMessages handles system messages with array content", () => {
|
|
const payload = {
|
|
messages: [
|
|
{
|
|
role: "system",
|
|
content: [
|
|
{ type: "text", text: "Block 1" },
|
|
{ type: "text", text: "Block 2" },
|
|
],
|
|
},
|
|
{ role: "user", content: "hello" },
|
|
],
|
|
};
|
|
extractSystemRoleMessages(payload);
|
|
assert.equal(payload.messages.length, 1);
|
|
assert.deepEqual(payload.system, [
|
|
{ type: "text", text: "Block 1" },
|
|
{ type: "text", text: "Block 2" },
|
|
]);
|
|
});
|