104 lines
4.6 KiB
TypeScript
104 lines
4.6 KiB
TypeScript
/**
|
|
* Tests for detectFormatFromEndpoint — the endpoint-aware format detector that
|
|
* fixes Cursor Responses-API bodies sent to /chat/completions.
|
|
*
|
|
* Cursor sends Responses-API-shaped payloads (with `input`, `reasoning.effort`,
|
|
* `prompt_cache_retention`) to /v1/chat/completions. Without the body-sniff on
|
|
* the chat/completions path the detector returned "openai", the translator built
|
|
* `input` from `messages` (undefined), and the upstream received an empty input.
|
|
*/
|
|
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
const { detectFormatFromEndpoint } = await import("../../open-sse/services/provider.ts");
|
|
|
|
// ── /responses path ──────────────────────────────────────────────────────────
|
|
|
|
test("detectFormatFromEndpoint: /responses path → openai-responses regardless of body", () => {
|
|
assert.equal(detectFormatFromEndpoint({}, "/v1/responses"), "openai-responses");
|
|
assert.equal(detectFormatFromEndpoint({ messages: [] }, "/responses"), "openai-responses");
|
|
});
|
|
|
|
// ── /messages path ────────────────────────────────────────────────────────────
|
|
|
|
test("detectFormatFromEndpoint: /messages path → claude", () => {
|
|
assert.equal(detectFormatFromEndpoint({}, "/v1/messages"), "claude");
|
|
assert.equal(detectFormatFromEndpoint({ messages: [] }, "messages"), "claude");
|
|
});
|
|
|
|
// ── /chat/completions path — standard OpenAI body ────────────────────────────
|
|
|
|
test("detectFormatFromEndpoint: /chat/completions with messages array → openai", () => {
|
|
const body = { model: "gpt-4o", messages: [{ role: "user", content: "hi" }] };
|
|
assert.equal(detectFormatFromEndpoint(body, "/v1/chat/completions"), "openai");
|
|
});
|
|
|
|
test("detectFormatFromEndpoint: /chat/completions with empty messages array → openai", () => {
|
|
assert.equal(detectFormatFromEndpoint({ messages: [] }, "/v1/chat/completions"), "openai");
|
|
});
|
|
|
|
// ── /chat/completions path — Cursor Responses-API body ───────────────────────
|
|
|
|
test("detectFormatFromEndpoint: /chat/completions with input but no messages → openai-responses", () => {
|
|
const cursorBody = {
|
|
model: "gpt-4o",
|
|
input: [{ role: "user", content: "hello" }],
|
|
reasoning: { effort: "high" },
|
|
};
|
|
assert.equal(detectFormatFromEndpoint(cursorBody, "/v1/chat/completions"), "openai-responses");
|
|
});
|
|
|
|
test("detectFormatFromEndpoint: /chat/completions with string input and no messages → openai-responses", () => {
|
|
assert.equal(
|
|
detectFormatFromEndpoint({ input: "hello" }, "/chat/completions"),
|
|
"openai-responses"
|
|
);
|
|
});
|
|
|
|
test("detectFormatFromEndpoint: /chat/completions with input AND messages → openai (messages wins)", () => {
|
|
// When both fields are present the body is ambiguous; treat it as a normal
|
|
// chat-completions request so that the existing messages path is preserved.
|
|
const body = { input: "hi", messages: [{ role: "user", content: "hi" }] };
|
|
assert.equal(detectFormatFromEndpoint(body, "/v1/chat/completions"), "openai");
|
|
});
|
|
|
|
test("detectFormatFromEndpoint: /chat/completions with input: undefined → openai (falsy input ignored)", () => {
|
|
assert.equal(
|
|
detectFormatFromEndpoint({ input: undefined, model: "x" }, "/v1/chat/completions"),
|
|
"openai"
|
|
);
|
|
});
|
|
|
|
// ── /completions (non-chat) path ─────────────────────────────────────────────
|
|
|
|
test("detectFormatFromEndpoint: /completions path with messages → openai", () => {
|
|
assert.equal(
|
|
detectFormatFromEndpoint({ messages: [] }, "/v1/completions"),
|
|
"openai"
|
|
);
|
|
});
|
|
|
|
test("detectFormatFromEndpoint: /completions path with input and no messages → openai-responses", () => {
|
|
assert.equal(
|
|
detectFormatFromEndpoint({ input: "hello" }, "/completions"),
|
|
"openai-responses"
|
|
);
|
|
});
|
|
|
|
// ── No path / unknown path — falls back to body-based detection ───────────────
|
|
|
|
test("detectFormatFromEndpoint: no path falls back to body-based detectFormat", () => {
|
|
// Pure messages body → openai
|
|
assert.equal(
|
|
detectFormatFromEndpoint({ messages: [{ role: "user", content: "hi" }] }),
|
|
"openai"
|
|
);
|
|
});
|
|
|
|
test("detectFormatFromEndpoint: unknown path falls back to body-based detectFormat", () => {
|
|
assert.equal(
|
|
detectFormatFromEndpoint({ messages: [] }, "/v1/custom/endpoint"),
|
|
"openai"
|
|
);
|
|
});
|