Files
OmniRoute/tests/unit/virtualFactory-valuation.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

48 lines
2.2 KiB
TypeScript

// tests/unit/virtualFactory-valuation.test.ts (part 1 — reliability)
import { test } from "node:test";
import assert from "node:assert/strict";
import { computeSnapshotWeights } from "../../open-sse/services/autoCombo/virtualFactory.ts";
import { resolveVirtualCost } from "../../open-sse/services/providerCostData.ts";
import { DEFAULT_WEIGHTS } from "../../open-sse/services/autoCombo/scoring.ts";
function candidate(over: Record<string, unknown> = {}) {
return {
provider: "openai",
connectionId: null,
model: "gpt-4o",
modelStr: "openai/gpt-4o",
costPer1MTokens: 5,
...over,
} as never;
}
test("absent failure rate reads fully reliable (neutral 1)", () => {
const weights = { ...DEFAULT_WEIGHTS, reliability: 0.2 };
const scores = computeSnapshotWeights([candidate()], weights);
const base = computeSnapshotWeights([candidate()], { ...DEFAULT_WEIGHTS, reliability: 0 });
const delta0 = scores.get("openai/gpt-4o")! - base.get("openai/gpt-4o")!;
assert.ok(Math.abs(delta0 - 0.2) < 1e-9, `expected 0.2, got ${delta0}`);
});
test("failureRate 0.2 scales the reliability weight to 0.8", () => {
const weights = { ...DEFAULT_WEIGHTS, reliability: 0.2 };
const scores = computeSnapshotWeights([candidate({ failureRate: 0.2 })], weights);
const base = computeSnapshotWeights([candidate()], { ...DEFAULT_WEIGHTS, reliability: 0 });
const delta = scores.get("openai/gpt-4o")! - base.get("openai/gpt-4o")!;
assert.ok(Math.abs(delta - 0.16) < 1e-9, `expected 0.16, got ${delta}`);
});
test("errorRate backs up a missing failureRate", () => {
const weights = { ...DEFAULT_WEIGHTS, reliability: 0.2 };
const scores = computeSnapshotWeights([candidate({ errorRate: 0.5 })], weights);
const base = computeSnapshotWeights([candidate()], { ...DEFAULT_WEIGHTS, reliability: 0 });
const delta = scores.get("openai/gpt-4o")! - base.get("openai/gpt-4o")!;
assert.ok(Math.abs(delta - 0.1) < 1e-9, `expected 0.1, got ${delta}`);
});
test("virtual cost helper returns real table costs, not zero", () => {
assert.equal(resolveVirtualCost("openai", "gpt-4o"), 2.5);
assert.equal(resolveVirtualCost("ai21", "jamba-large-1.7"), 0); // catalog free
assert.equal(resolveVirtualCost("openai", "gpt-9-never-existed"), 5.0); // conservative fallback
});