Files
OmniRoute/tests/unit/executor-oneminai.test.ts
zero-executioner 8abcd639d1 feat(providers): add 1min.ai provider (#11631)
Merged via /merge-batch (lote 2026-08-26 batch 2, v3.8.51). Boarded no worktree combinado junto com outras ~20 PRs; validação única: typecheck/complexity/cognitive-complexity/changelog-integrity verdes, file-size rebaseado onde necessário (crescimento legítimo), lint com os mesmos 228 achados pré-existentes confirmados via sonda contra o tip puro (não introduzidos por este lote), e 292 testes focados (unit) + 18 (vitest) passando. Obrigado pela contribuição.
2026-08-26 09:21:48 -03:00

177 lines
5.9 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import { getExecutor, hasSpecializedExecutor } from "../../open-sse/executors/index.ts";
import { OneMinAiExecutor, buildPrompt } from "../../open-sse/executors/oneminai.ts";
const encoder = new TextEncoder();
function jsonResponse(body: unknown, status = 200) {
return new Response(JSON.stringify(body), {
status,
headers: { "Content-Type": "application/json" },
});
}
function sseResponse(events: string[]) {
return new Response(
new ReadableStream({
start(controller) {
for (const event of events) controller.enqueue(encoder.encode(event));
controller.close();
},
}),
{ status: 200, headers: { "Content-Type": "text/event-stream" } }
);
}
test("OneMinAiExecutor is registered in the executor index", async () => {
assert.equal(hasSpecializedExecutor("oneminai"), true);
assert.ok((await getExecutor("oneminai")) instanceof OneMinAiExecutor);
assert.equal(hasSpecializedExecutor("1min"), true);
assert.ok((await getExecutor("1min")) instanceof OneMinAiExecutor);
});
test("buildPrompt passes a single user message through unchanged", () => {
assert.equal(buildPrompt([{ role: "user", content: "Hello there" }]), "Hello there");
});
test("buildPrompt flattens multi-turn history into a labeled transcript", () => {
const prompt = buildPrompt([
{ role: "system", content: "You are concise." },
{ role: "user", content: "Hello" },
{ role: "assistant", content: "Hi there!" },
{ role: "user", content: "How are you?" },
]);
assert.equal(
prompt,
"System: You are concise.\n\nUser: Hello\n\nAssistant: Hi there!\n\nUser: How are you?"
);
});
test("OneMinAiExecutor sends UNIFY_CHAT_WITH_AI with a flattened prompt and API-KEY header, and unwraps the JSON response", async () => {
const executor = new OneMinAiExecutor();
const originalFetch = globalThis.fetch;
const calls: Array<{ url: string; body: Record<string, unknown>; headers: Record<string, string> }> =
[];
globalThis.fetch = async (url, init: RequestInit = {}) => {
calls.push({
url: String(url),
body: JSON.parse(String(init.body || "{}")),
headers: init.headers as Record<string, string>,
});
return jsonResponse({
aiRecord: {
model: "gpt-4o-mini",
status: "SUCCESS",
aiRecordDetail: {
promptObject: { prompt: "How are you?" },
resultObject: ["I'm doing well, thanks for asking!"],
},
},
});
};
try {
const result = await executor.execute({
model: "gpt-4o-mini",
body: {
messages: [
{ role: "system", content: "You are concise." },
{ role: "user", content: "Hello" },
{ role: "assistant", content: "Hi there!" },
{ role: "user", content: "How are you?" },
],
},
stream: false,
credentials: { apiKey: "1min-key" },
signal: AbortSignal.timeout(10_000),
log: null,
});
assert.equal(calls.length, 1);
assert.equal(calls[0].url, "https://api.1min.ai/api/chat-with-ai");
assert.equal(calls[0].headers["API-KEY"], "1min-key");
assert.equal(calls[0].body.type, "UNIFY_CHAT_WITH_AI");
assert.equal(calls[0].body.model, "gpt-4o-mini");
assert.equal(
(calls[0].body.promptObject as { prompt: string }).prompt,
"System: You are concise.\n\nUser: Hello\n\nAssistant: Hi there!\n\nUser: How are you?"
);
const body = await result.response.json();
assert.equal(body.object, "chat.completion");
assert.equal(body.choices[0].message.role, "assistant");
assert.equal(body.choices[0].message.content, "I'm doing well, thanks for asking!");
assert.equal(body.model, "gpt-4o-mini");
} finally {
globalThis.fetch = originalFetch;
}
});
test("OneMinAiExecutor requests the isStreaming=true endpoint and translates 1min.ai SSE into OpenAI chunks", async () => {
const executor = new OneMinAiExecutor();
const originalFetch = globalThis.fetch;
let requestedUrl = "";
globalThis.fetch = async (url) => {
requestedUrl = String(url);
return sseResponse([
'event: content\ndata: {"content": "Artificial intelligence is"}\n\n',
'event: content\ndata: {"content": " a branch of computer science."}\n\n',
'event: done\ndata: {"message": "Stream completed"}\n\n',
]);
};
try {
const result = await executor.execute({
model: "gpt-4o-mini",
body: { messages: [{ role: "user", content: "What is AI?" }] },
stream: true,
credentials: { apiKey: "1min-key" },
signal: AbortSignal.timeout(10_000),
log: null,
});
assert.equal(requestedUrl, "https://api.1min.ai/api/chat-with-ai?isStreaming=true");
assert.equal(result.response.headers.get("Content-Type"), "text/event-stream");
const text = await result.response.text();
assert.match(text, /data: \{"id":"chatcmpl-oneminai-/);
assert.match(text, /Artificial intelligence is/);
assert.match(text, /a branch of computer science\./);
assert.match(text, /"finish_reason":"stop"/);
assert.match(text, /data: \[DONE\]/);
} finally {
globalThis.fetch = originalFetch;
}
});
test("OneMinAiExecutor maps upstream auth failures to OpenAI-style errors", async () => {
const executor = new OneMinAiExecutor();
const originalFetch = globalThis.fetch;
globalThis.fetch = async () =>
jsonResponse(
{ success: false, error: { code: "UNAUTHORIZED", message: "Invalid or missing API key" } },
401
);
try {
const result = await executor.execute({
model: "gpt-4o-mini",
body: { messages: [{ role: "user", content: "hi" }] },
stream: false,
credentials: { apiKey: "bad-key" },
signal: AbortSignal.timeout(10_000),
log: null,
});
assert.equal(result.response.status, 401);
const body = await result.response.json();
assert.match(body.error.message, /Invalid or missing API key/i);
} finally {
globalThis.fetch = originalFetch;
}
});