Files
OmniRoute/tests/unit/combo-bootstrap-latency.test.ts
Dizzle d88fc2bce7 fix(routing): table pricing with catalog fallback for off-table models, pooled latency bootstrap, fresh tier cache (#12792)
Um modelo grátis fora da tabela herdando $5/$15 por milhão e afundando no roteamento cost-aware é o defeito mais caro desta onda: silencioso, e inverte exatamente a decisão que o operador quer.

Parar de chutar 1500ms de latência para modelo desconhecido e usar a mediana observada do pool — com contador de quantas vezes o chute dispara — é trocar heurística por medição do jeito certo. O contador é o que permite saber se valeu.

Revalidei após reconstruir a branch sobre o tip: **33/33** nas suítes da PR, typecheck:core limpo, `check-api-typecheck` OK (289).

**Duas integrações:**

1. `computeSnapshotWeights` conflitou com o #12794 (health via breaker + quality), já mergeado. Os dois compõem e ambos ficaram: o seu termo de `reliability` — que era a única chave que o caminho de snapshot ainda ignorava — mais o health observado e o quality do #12794.
2. `scripts/quality/run-all-gates.mjs` conflitou com o `check:provider-order-sync` do #12790. Aditivo, os dois gates coexistem.

**Nota de dívida:** o `virtualFactory.ts` cruzou o teto de 1200 linhas pela primeira vez (1187 → 1207) somando esta onda. Congelei em vez de dividir e registrei os dois candidatos a extração na justificativa — `computeSnapshotWeights` (~85 linhas) e o grupo de elegibilidade de credencial (~70). Qualquer um dos dois volta o arquivo para baixo do cap.
2026-09-10 09:20:18 -03:00

54 lines
1.9 KiB
TypeScript

// tests/unit/combo-bootstrap-latency.test.ts
import { test } from "node:test";
import assert from "node:assert/strict";
// Median helper lives in combo.ts; import it directly (export it non-default).
import {
poolMedianP95Ms,
bootstrapMs,
shouldWarnBootstrap,
resetBootstrapCounters,
bootstrapLatencyHits,
bootstrapLatencyTotal,
} from "../../open-sse/services/combo.ts";
test("median ignores corrupt entries", () => {
const m = poolMedianP95Ms({
"a/x": { p95LatencyMs: 1000 },
"b/y": { p95LatencyMs: NaN },
"c/z": { p95LatencyMs: -5 },
"d/w": { p95LatencyMs: 3000 },
} as never);
assert.equal(m, 1000);
});
test("empty stats yield undefined (caller falls back to 1500, no cold-start alarm)", () => {
assert.equal(poolMedianP95Ms({}), undefined);
});
test("counters start at zero", () => {
resetBootstrapCounters();
assert.equal(bootstrapLatencyHits, 0);
assert.equal(bootstrapLatencyTotal, 0);
});
test("table hit bumps Total but not Hits; miss bumps both", () => {
resetBootstrapCounters();
assert.equal(bootstrapMs("gpt-4o-mini", 9999), 2764); // table hit
assert.equal(bootstrapLatencyTotal, 1);
assert.equal(bootstrapLatencyHits, 0);
assert.equal(bootstrapMs("some-new-model-xyz", 1234), 1234); // miss -> median
assert.equal(bootstrapLatencyTotal, 2);
assert.equal(bootstrapLatencyHits, 1);
assert.equal(bootstrapMs("another-new-model", undefined), 1500); // miss, no median
resetBootstrapCounters();
});
test("warn gate is pure: cold start and low ratio stay silent, dominant warns once", () => {
assert.equal(shouldWarnBootstrap(10, 10, false, 9999, 0), false); // cold start
assert.equal(shouldWarnBootstrap(2, 10, true, 9999, 0), false); // ratio <= 0.3
assert.equal(shouldWarnBootstrap(5, 10, true, 9999, 0), false); // throttled 1h
assert.equal(shouldWarnBootstrap(5, 10, true, 3600_001, 0), true); // window elapsed
assert.equal(shouldWarnBootstrap(5, 10, true, 9999, 9000), false); // throttled 1h
});