mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-16 20:02:45 +03:00
Um pool `auto/*` vazio que não diz por que está vazio é a pior forma de falha: o operador vê ausência e não sabe se é config, cota ou catálogo. Registrar qual estágio removeu quantos, e carregar `dropReason` em cada entrada de `quotaHealth.providers`, transforma silêncio em diagnóstico. Os três defeitos achados de carona valem tanto quanto a feature — em especial a cota livre recorrente sem teto sendo tratada como desconhecida em vez de segura, que é justamente o caso que mais aparece. Revalidei após reconstruir sobre o tip: **15/15**, typecheck:core limpo, `check-api-typecheck` OK (289). **Uma mudança minha no `catalogPaidFilter.ts`.** Mantive a sua extração — ela é mais limpa que o predicado inline — mas troquei o corpo para usar `isFreeForProvider` por id. O módulo OR-eava `providerHasFreeModels(resolved) || providerHasFreeModels(canonical)` num único `freeProvider` e depois testava `isFreeModel` em cada um. Com isso, um id cujo próprio provider não documenta tier livre passa a ler como grátis sempre que o alias irmão documenta — que é exatamente o buraco que o #12744 fechou e já está no tip. Por id preserva a garantia; nenhuma outra linha do módulo mudou. **Dívida registrada:** o `virtualFactory.ts` foi de 1187 para 1219 somando esta onda e cruzou o teto de 1200 pela primeira vez. Congelado com os candidatos a extração nomeados na justificativa.
66 lines
2.8 KiB
TypeScript
66 lines
2.8 KiB
TypeScript
/**
|
|
* Pool-diagnosis wiring: paid-only filter, model lockout, and STRICT-zero-cost
|
|
* exclusions each report what they removed so an empty `auto/*` pool names
|
|
* the stage that emptied it instead of failing silently.
|
|
*/
|
|
import assert from "node:assert/strict";
|
|
import { describe, it } from "node:test";
|
|
import { filterPaidOnlyCandidatesWithDiagnosis } from "../../open-sse/services/autoCombo/paidModelFilter.ts";
|
|
import { filterLockoutCandidates } from "../../open-sse/services/autoCombo/modelLockoutFilter.ts";
|
|
|
|
describe("virtualFactory pool diagnosis wiring", () => {
|
|
it("reports one paid exclusion out of two on a mixed pool", () => {
|
|
const pool = [
|
|
{ provider: "openai", model: "gpt-4o" },
|
|
{ provider: "cerebras", model: "zai-glm-4.7" },
|
|
] as Array<{ provider: string; model: string }>;
|
|
const { pool: kept, diagnosis } = filterPaidOnlyCandidatesWithDiagnosis(pool, true);
|
|
assert.equal(kept.length, 1);
|
|
assert.equal(diagnosis!.excludedPaid, 1);
|
|
assert.equal(diagnosis!.total, 2);
|
|
});
|
|
|
|
it("excludes fully locked candidates and rewrites the unlocked subset", () => {
|
|
const locked = (_provider: string, _connectionId: string, _model: string) => true;
|
|
const pool = [
|
|
{ provider: "openai", model: "m1", connectionId: null, allowedConnectionIds: ["c1", "c2"] },
|
|
{ provider: "openai", model: "m2", connectionId: "c9", allowedConnectionIds: ["c9"] },
|
|
];
|
|
const result = filterLockoutCandidates(pool, { isModelLocked: locked });
|
|
assert.equal(result.pool.length, 0);
|
|
assert.equal(result.diagnosis!.excludedLockout, 2);
|
|
const partial = (_provider: string, connectionId: string, _model: string) =>
|
|
connectionId === "c1";
|
|
const rewritten = filterLockoutCandidates(pool.slice(0, 1), { isModelLocked: partial });
|
|
assert.deepEqual(rewritten.pool[0]!.allowedConnectionIds, ["c2"]);
|
|
});
|
|
|
|
it("keeps a candidate without usable ids with a null diagnosis", () => {
|
|
const pool = [{ provider: "openai", model: "m1", connectionId: null }];
|
|
const result = filterLockoutCandidates(pool, { isModelLocked: () => true });
|
|
assert.equal(result.pool.length, 1);
|
|
assert.equal(result.diagnosis, null);
|
|
});
|
|
|
|
it("classifies a catalog-free model without hard-stop guarantee as no-hard-stop", async () => {
|
|
const { classifyStrictZeroCostCandidate, findBudgetEntry } =
|
|
await import("../../open-sse/services/autoCombo/strictZeroCostFilter.ts");
|
|
const candidate = {
|
|
provider: "bluesminds",
|
|
model: "gpt-4o",
|
|
connectionId: "c1",
|
|
allowedConnectionIds: ["c1"],
|
|
};
|
|
const verdict = classifyStrictZeroCostCandidate(
|
|
candidate,
|
|
findBudgetEntry(candidate),
|
|
() => null,
|
|
{
|
|
minRemainingAllowance: 1,
|
|
maxStateAgeMs: 180_000,
|
|
}
|
|
);
|
|
assert.equal(verdict.outcome, "no-hard-stop");
|
|
});
|
|
});
|