mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-14 10:52:17 +03:00
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.
48 lines
2.2 KiB
TypeScript
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
|
|
});
|