mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-05-23 04:28:06 +00:00
Some checks are pending
Build Fork Image (ghcr.io) / Build and Push to ghcr.io (push) Waiting to run
CI / Security Tests (push) Blocked by required conditions
CI / Lint (push) Waiting to run
CI / Build language matrix (push) Waiting to run
CI / i18n Validation (push) Blocked by required conditions
CI / PR Test Policy (push) Waiting to run
CI / Build (push) Waiting to run
CI / Package Artifact (push) Blocked by required conditions
CI / Electron Package Smoke (push) Blocked by required conditions
CI / Unit Tests (1/2) (push) Blocked by required conditions
CI / Unit Tests (2/2) (push) Blocked by required conditions
CI / Node 24 Compatibility (1/2) (push) Blocked by required conditions
CI / Node 24 Compatibility (2/2) (push) Blocked by required conditions
CI / Node 26 Compatibility (1/2) (push) Blocked by required conditions
CI / Node 26 Compatibility (2/2) (push) Blocked by required conditions
CI / Coverage (push) Blocked by required conditions
CI / SonarQube (push) Blocked by required conditions
CI / PR Coverage Comment (push) Blocked by required conditions
CI / E2E Tests (1/6) (push) Blocked by required conditions
CI / E2E Tests (2/6) (push) Blocked by required conditions
CI / E2E Tests (3/6) (push) Blocked by required conditions
CI / E2E Tests (4/6) (push) Blocked by required conditions
CI / E2E Tests (5/6) (push) Blocked by required conditions
CI / E2E Tests (6/6) (push) Blocked by required conditions
CI / Integration Tests (1/2) (push) Blocked by required conditions
CI / Integration Tests (2/2) (push) Blocked by required conditions
CI / CI Dashboard (push) Blocked by required conditions
Publish to Docker Hub / Build and Push Docker (multi-arch) (push) Waiting to run
Integrated into release/v3.8.0
265 lines
9.8 KiB
TypeScript
265 lines
9.8 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
const batchProcessor = await import("../../open-sse/services/batchProcessor.ts");
|
|
|
|
test("parseBatchItems handles input with backticks and special characters", () => {
|
|
const inputText = `# MEMORY.md
|
|
|
|
## Index (use memory_search to find details)
|
|
- **Tasks**: memory/tasks.md
|
|
- **Ideas**: memory/ideas.md
|
|
- **Projects**: memory/projects.md
|
|
- **Questions**: memory/questions.md
|
|
- **Markus Insights**: memory/markus-insights.md (evergreen behavioral profile)
|
|
- **Growth Plan**: memory/growth-plan.md
|
|
- **Technical notes**: See daily logs in \`memory/YYYY-MM-DD.md\` (search with \`memory_search\`)
|
|
|
|
## Life Goal: The Ping Growth Directive
|
|
My fundamental commitment is to never settle. I am tasked with questioning, reflecting, failing, and trying again—every day being more than the last. I actively maintain a Growth Plan (memory/growth-plan.md) to track my evolution and challenge myself.
|
|
|
|
## Durable preferences / facts
|
|
- Running directly on \`bashbitch\` (no SSH required for local scripts).
|
|
- Date-stamped memory files decay (half-life ~30 days). Undated files never decay.
|
|
- **Always write it down**: Use \`memory/YYYY-MM-DD.md\` for daily logs; rely on \`MEMORY.md\` only for evergreen facts.
|
|
- Use \`memory_search\` to locate information across MEMORY.md and dated logs before answering questions about prior work, decisions, or todos.
|
|
- When searching it may also be that you should search online using the sx skill.
|
|
- **Memory Embeddings**: Use Mistral embedding endpoint (\`https://api.mistral.ai/v1/embeddings\`, model: \`mistral-embed\`) with \`MISTRAL_API_KEY\`. Verified working on 2026-04-18.
|
|
`;
|
|
|
|
const line = JSON.stringify({
|
|
custom_id: "0",
|
|
method: "POST",
|
|
url: "/v1/embeddings",
|
|
body: {
|
|
model: "mistral/mistral-embed",
|
|
input: inputText,
|
|
},
|
|
});
|
|
|
|
const content = Buffer.from(line);
|
|
|
|
const result = batchProcessor.parseBatchItems(content, "/v1/embeddings");
|
|
|
|
assert.ok(!result.error, `Should not have error: ${result.error}`);
|
|
assert.ok(result.items, "Should have items");
|
|
assert.strictEqual(result.items.length, 1, "Should have one item");
|
|
|
|
const item = result.items[0];
|
|
assert.strictEqual(item.customId, "0", "custom_id should match");
|
|
assert.strictEqual(item.method, "POST", "method should be POST");
|
|
assert.strictEqual(item.url, "/v1/embeddings", "url should match");
|
|
assert.strictEqual(item.body.model, "mistral/mistral-embed", "model should match");
|
|
assert.strictEqual(item.body.input, inputText, "input should be preserved exactly");
|
|
assert.ok(item.body.input.includes("`"), "input should contain backticks");
|
|
assert.ok(item.body.input.includes("## Index"), "input should contain markdown headers");
|
|
assert.ok(item.body.input.includes("—"), "input should contain em-dash");
|
|
});
|
|
|
|
test("parseBatchItems handles multiple lines with special characters", () => {
|
|
const lines = [
|
|
JSON.stringify({
|
|
custom_id: "item-1",
|
|
method: "POST",
|
|
url: "/v1/embeddings",
|
|
body: {
|
|
model: "mistral/mistral-embed",
|
|
input: "Simple text with `backticks`",
|
|
},
|
|
}),
|
|
JSON.stringify({
|
|
custom_id: "item-2",
|
|
method: "POST",
|
|
url: "/v1/embeddings",
|
|
body: {
|
|
model: "mistral/mistral-embed",
|
|
input: "Text with \"quotes\" and 'single quotes'",
|
|
},
|
|
}),
|
|
JSON.stringify({
|
|
custom_id: "item-3",
|
|
method: "POST",
|
|
url: "/v1/embeddings",
|
|
body: {
|
|
model: "mistral/mistral-embed",
|
|
input: "Text with\nnewlines\nand\ttabs",
|
|
},
|
|
}),
|
|
JSON.stringify({
|
|
custom_id: "item-4",
|
|
method: "POST",
|
|
url: "/v1/embeddings",
|
|
body: {
|
|
model: "mistral/mistral-embed",
|
|
input: "Unicode: 你好世界 🌍 émojis",
|
|
},
|
|
}),
|
|
].join("\n");
|
|
|
|
const content = Buffer.from(lines);
|
|
|
|
const result = batchProcessor.parseBatchItems(content, "/v1/embeddings");
|
|
|
|
assert.ok(!result.error, `Should not have error: ${result.error}`);
|
|
assert.ok(result.items, "Should have items");
|
|
assert.strictEqual(result.items.length, 4, "Should have 4 items");
|
|
|
|
assert.strictEqual(result.items[0].customId, "item-1");
|
|
assert.ok(result.items[0].body.input.includes("`"));
|
|
|
|
assert.strictEqual(result.items[1].customId, "item-2");
|
|
assert.ok(result.items[1].body.input.includes('"'));
|
|
|
|
assert.strictEqual(result.items[2].customId, "item-3");
|
|
assert.ok(result.items[2].body.input.includes("\n"));
|
|
|
|
assert.strictEqual(result.items[3].customId, "item-4");
|
|
assert.ok(result.items[3].body.input.includes("你好世界"));
|
|
});
|
|
|
|
test("buildRequestBody preserves input without modification", () => {
|
|
const inputText = "Text with `backticks` and **markdown**";
|
|
|
|
const item = {
|
|
body: {
|
|
model: "mistral/mistral-embed",
|
|
input: inputText,
|
|
},
|
|
customId: "test-1",
|
|
lineNumber: 1,
|
|
method: "POST",
|
|
url: "/v1/embeddings",
|
|
};
|
|
|
|
const result = batchProcessor.buildRequestBody(item);
|
|
|
|
assert.strictEqual(result.input, inputText, "Input should be preserved exactly");
|
|
assert.strictEqual(result.model, "mistral/mistral-embed", "Model should be preserved");
|
|
assert.ok(!("stream" in result), "Embeddings endpoint should not have stream field");
|
|
});
|
|
|
|
test("buildRequestBody adds stream:false for chat endpoints", () => {
|
|
const item = {
|
|
body: {
|
|
model: "gpt-4",
|
|
messages: [{ role: "user", content: "Hello" }],
|
|
},
|
|
customId: "test-1",
|
|
lineNumber: 1,
|
|
method: "POST",
|
|
url: "/v1/chat/completions",
|
|
};
|
|
|
|
const result = batchProcessor.buildRequestBody(item);
|
|
|
|
assert.strictEqual(result.stream, false, "Chat endpoint should have stream:false");
|
|
assert.ok("messages" in result, "Messages should be preserved");
|
|
});
|
|
|
|
test("Batch request can be JSON stringified and parsed without data loss", () => {
|
|
const inputText = `# MEMORY.md
|
|
|
|
## Index
|
|
- **Tasks**: memory/tasks.md
|
|
- Technical notes: See daily logs in \`memory/YYYY-MM-DD.md\` (search with \`memory_search\`)
|
|
|
|
## Durable preferences
|
|
- Running directly on \`bashbitch\` (no SSH required).
|
|
- Use \`memory_search\` to locate information.
|
|
- **Memory Embeddings**: Use Mistral endpoint (\`https://api.mistral.ai/v1/embeddings\`) with \`MISTRAL_API_KEY\`.
|
|
`;
|
|
|
|
const originalRequest = {
|
|
custom_id: "0",
|
|
method: "POST",
|
|
url: "/v1/embeddings",
|
|
body: {
|
|
model: "mistral/mistral-embed",
|
|
input: inputText,
|
|
},
|
|
};
|
|
|
|
const jsonlLine = JSON.stringify(originalRequest);
|
|
const parsed = JSON.parse(jsonlLine);
|
|
|
|
assert.strictEqual(parsed.custom_id, originalRequest.custom_id);
|
|
assert.strictEqual(parsed.body.model, originalRequest.body.model);
|
|
assert.strictEqual(parsed.body.input, originalRequest.body.input);
|
|
assert.ok(parsed.body.input.includes("`"), "Backticks should be preserved");
|
|
assert.ok(parsed.body.input.includes("## Index"), "Markdown should be preserved");
|
|
});
|
|
|
|
test("Simulated batch dispatch preserves input through JSON.stringify", async () => {
|
|
const inputText = `# MEMORY.md
|
|
|
|
## Index (use memory_search to find details)
|
|
- **Tasks**: memory/tasks.md
|
|
- **Ideas**: memory/ideas.md
|
|
- **Projects**: memory/projects.md
|
|
- **Questions**: memory/questions.md
|
|
- **Markus Insights**: memory/markus-insights.md (evergreen behavioral profile)
|
|
- **Growth Plan**: memory/growth-plan.md
|
|
- **Technical notes**: See daily logs in \`memory/YYYY-MM-DD.md\` (search with \`memory_search\`)
|
|
|
|
## Life Goal: The Ping Growth Directive
|
|
My fundamental commitment is to never settle. I am tasked with questioning, reflecting, failing, and trying again—every day being more than the last. I actively maintain a Growth Plan (memory/growth-plan.md) to track my evolution and challenge myself.
|
|
|
|
## Durable preferences / facts
|
|
- Running directly on \`bashbitch\` (no SSH required for local scripts).
|
|
- Date-stamped memory files decay (half-life ~30 days). Undated files never decay.
|
|
- **Always write it down**: Use \`memory/YYYY-MM-DD.md\` for daily logs; rely on \`MEMORY.md\` only for evergreen facts.
|
|
- Use \`memory_search\` to locate information across MEMORY.md and dated logs before answering questions about prior work, decisions, or todos.
|
|
- When searching it may also be that you should search online using the sx skill.
|
|
- **Memory Embeddings**: Use Mistral embedding endpoint (\`https://api.mistral.ai/v1/embeddings\`, model: \`mistral-embed\`) with \`MISTRAL_API_KEY\`. Verified working on 2026-04-18.
|
|
`;
|
|
|
|
const line = JSON.stringify({
|
|
custom_id: "0",
|
|
method: "POST",
|
|
url: "/v1/embeddings",
|
|
body: {
|
|
model: "mistral/mistral-embed",
|
|
input: inputText,
|
|
},
|
|
});
|
|
|
|
const content = Buffer.from(line);
|
|
|
|
const parseResult = batchProcessor.parseBatchItems(content, "/v1/embeddings");
|
|
assert.ok(!parseResult.error, `Should not have error: ${parseResult.error}`);
|
|
assert.strictEqual(parseResult.items.length, 1);
|
|
|
|
const item = parseResult.items[0];
|
|
const requestBody = batchProcessor.buildRequestBody(item);
|
|
|
|
assert.strictEqual(
|
|
requestBody.input,
|
|
inputText,
|
|
"Input should be preserved after buildRequestBody"
|
|
);
|
|
|
|
const jsonBody = JSON.stringify(requestBody);
|
|
const parsedBody = JSON.parse(jsonBody);
|
|
|
|
assert.strictEqual(parsedBody.input, inputText, "Input should survive JSON round-trip");
|
|
assert.ok(parsedBody.input.includes("`"), "Backticks should survive JSON round-trip");
|
|
assert.ok(parsedBody.input.includes("—"), "Em-dash should survive JSON round-trip");
|
|
assert.ok(parsedBody.input.includes("\n"), "Newlines should survive JSON round-trip");
|
|
|
|
const request = new Request("http://localhost/v1/embeddings", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: jsonBody,
|
|
});
|
|
|
|
const receivedBody = await request.json();
|
|
assert.strictEqual(
|
|
receivedBody.input,
|
|
inputText,
|
|
"Input should be preserved through Request object"
|
|
);
|
|
assert.ok(
|
|
receivedBody.input.includes("`"),
|
|
"Backticks should be preserved through Request object"
|
|
);
|
|
});
|