Files
OmniRoute/tests/unit/catalog-hidePaid.test.ts
Dizzle 8ecdd88c15 fix(pool): diagnose empty pools, align catalog filter, and surface drop reasons (#12795)
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.
2026-09-10 09:25:59 -03:00

45 lines
1.6 KiB
TypeScript

/**
* The catalog paid filter and the `auto/*` pool filter share one predicate:
* a model stays listed only when its provider documents free models AND the
* model itself qualifies as free.
*/
import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { decideHidePaid } from "../../src/app/api/v1/models/catalogPaidFilter.ts";
describe("catalog decideHidePaid", () => {
it("keeps a catalog-free model on a free-tier provider listed", () => {
assert.equal(decideHidePaid(true, "cerebras", "zai-glm-4.7"), false);
});
it("hides a paid model even when the payload claims it is free", () => {
assert.equal(decideHidePaid(true, "openai", "gpt-4o", undefined, true), true);
});
it("lists everything when the paid filter is off", () => {
assert.equal(decideHidePaid(false, "openai", "gpt-4o", undefined, true), false);
});
it("lists a catalog-free model that STRICT still excludes without hard-stop proof", async () => {
assert.equal(decideHidePaid(true, "bluesminds", "gpt-4o"), false);
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");
});
});