mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-06 06:52:09 +03:00
Validado em lote numa worktree combinada com os 10 PRs desta leva sobre o tip de `release/v3.8.51`: `typecheck:core` limpo, `check-file-size` OK e **241/242** nos 29 arquivos de teste que os PRs tocam. A única "falha" não é falha: `tests/unit/autoCombo/strict-zero-cost-filter.test.ts` é um teste em estilo Vitest que eu incluí por engano na invocação do runner nativo do Node — ele quebra no import (`@vitest/runner`), não numa asserção. Ao investigar, descobri que esse arquivo não roda em nenhum dos dois runners hoje (o glob do `test:unit` não lista `autoCombo` e o `include` do Vitest só pega `.tsx` nessa pasta); é um problema pré-existente do repositório, sem relação com esta leva, e vou registrá-lo separadamente. O #12636 conflitava apenas na lista de testes do `@omniroute/opencode-plugin/package.json`, de forma aditiva: o tip já tinha `models-fetcher.test.ts` (do #12607, irmão desta mesma leva) e o #12636 acrescenta `telemetry.test.ts`. Fiz a união dos dois lados (25 arquivos contra 24 de cada) em vez de escolher um, o que teria removido um arquivo da suíte do plugin em silêncio. Obrigado, @RaviTharuma.
104 lines
3.6 KiB
TypeScript
104 lines
3.6 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import {
|
|
applyOmniRouteInferenceTelemetry,
|
|
attachOmniRouteTelemetryToPayload,
|
|
attachOmniRouteTelemetryToSseLine,
|
|
parseOmniRouteInferenceTelemetry,
|
|
} from "../src/telemetry.js";
|
|
|
|
test("parseOmniRouteInferenceTelemetry: copies cost, tokens, tok/s, winning model", () => {
|
|
const headers = new Headers({
|
|
"X-OmniRoute-Response-Cost": "0.0123",
|
|
"X-OmniRoute-Tokens-In": "10",
|
|
"X-OmniRoute-Tokens-Out": "200",
|
|
"X-OmniRoute-Tokens-Per-Second": "100.5",
|
|
"X-OmniRoute-Ttft-Ms": "300",
|
|
"X-OmniRoute-Latency-Ms": "2300",
|
|
"X-OmniRoute-Model": "winner-model",
|
|
"X-OmniRoute-Provider": "openai",
|
|
});
|
|
const got = parseOmniRouteInferenceTelemetry(headers);
|
|
assert.equal(got.costUsd, 0.0123);
|
|
assert.equal(got.tokensIn, 10);
|
|
assert.equal(got.tokensOut, 200);
|
|
assert.equal(got.tokensPerSecond, 100.5);
|
|
assert.equal(got.ttftMs, 300);
|
|
assert.equal(got.model, "winner-model");
|
|
assert.equal(got.provider, "openai");
|
|
});
|
|
|
|
test("parseOmniRouteInferenceTelemetry: omits tok/s when header missing (do not invent from latency)", () => {
|
|
const headers = new Headers({
|
|
"X-OmniRoute-Tokens-Out": "200",
|
|
"X-OmniRoute-Latency-Ms": "2000",
|
|
});
|
|
const got = parseOmniRouteInferenceTelemetry(headers);
|
|
assert.equal(got.tokensPerSecond, undefined);
|
|
assert.equal(got.tokensOut, 200);
|
|
const payload = attachOmniRouteTelemetryToPayload(
|
|
{ object: "chat.completion", usage: { prompt_tokens: 10, completion_tokens: 200 } },
|
|
got,
|
|
) as { usage: { tokens_per_second?: number } };
|
|
assert.equal(payload.usage.tokens_per_second, undefined);
|
|
});
|
|
|
|
test("attachOmniRouteTelemetryToPayload: writes usage.tokens_per_second and winning model", () => {
|
|
const got = attachOmniRouteTelemetryToPayload(
|
|
{
|
|
object: "chat.completion",
|
|
model: "combo/auto",
|
|
usage: { prompt_tokens: 10, completion_tokens: 200 },
|
|
},
|
|
{ tokensPerSecond: 80, ttftMs: 250, costUsd: 0, model: "gpt-winner" },
|
|
) as {
|
|
model: string;
|
|
usage: { tokens_per_second: number; ttft_ms: number; cost: number };
|
|
};
|
|
assert.equal(got.model, "gpt-winner");
|
|
assert.equal(got.usage.tokens_per_second, 80);
|
|
assert.equal(got.usage.ttft_ms, 250);
|
|
assert.equal(got.usage.cost, 0);
|
|
});
|
|
|
|
test("attachOmniRouteTelemetryToPayload: does not mutate /v1/models catalog JSON", () => {
|
|
const catalog = { object: "list", data: [{ id: "m1" }] };
|
|
const got = attachOmniRouteTelemetryToPayload(catalog, {
|
|
tokensPerSecond: 99,
|
|
model: "should-not-apply",
|
|
});
|
|
assert.deepEqual(got, catalog);
|
|
});
|
|
|
|
test("attachOmniRouteTelemetryToSseLine: patches terminal usage data line", () => {
|
|
const line =
|
|
'data: {"object":"chat.completion.chunk","usage":{"completion_tokens":200}}';
|
|
const got = attachOmniRouteTelemetryToSseLine(line, { tokensPerSecond: 50 });
|
|
assert.match(got, /"tokens_per_second":50/);
|
|
assert.match(got, /^data: /);
|
|
});
|
|
|
|
test("applyOmniRouteInferenceTelemetry: JSON response gets header tok/s", async () => {
|
|
const response = new Response(
|
|
JSON.stringify({
|
|
object: "chat.completion",
|
|
model: "combo/auto",
|
|
usage: { prompt_tokens: 1, completion_tokens: 20 },
|
|
}),
|
|
{
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"X-OmniRoute-Tokens-Per-Second": "40",
|
|
"X-OmniRoute-Model": "winner",
|
|
},
|
|
},
|
|
);
|
|
const next = await applyOmniRouteInferenceTelemetry(response);
|
|
const body = JSON.parse(await next.text()) as {
|
|
model: string;
|
|
usage: { tokens_per_second: number };
|
|
};
|
|
assert.equal(body.model, "winner");
|
|
assert.equal(body.usage.tokens_per_second, 40);
|
|
});
|