Files
OmniRoute/tests/unit/free-models-isfree.test.ts
Dizzle 39f9fc06c2 fix(models): stop treating provider-supplied free flags as trusted without a documented free tier (#12744)
Validado numa worktree combinada com a onda de roteamento/free-tier desta leva sobre `release/v3.8.51`: typecheck:core limpo, check-api-typecheck OK (288), check-file-size OK após rebaseline, 84/85 nos testes focados no runner Node.

Parar de honrar `isFree:true`, `:free` e `0/0` vindos do upstream **antes** de consultar o catálogo é a inversão certa: hoje um provider sem tier livre documentado consegue se declarar grátis e o listing diverge do roteador `auto/*`. Checar as heurísticas depois do hit de catálogo fecha a porta sem quebrar o caminho de linhas custom locais, que continuam confiáveis pelo caminho próprio.

O `isFreeModel("or", …)` com um alias que não existe é o tipo de bug que passa despercebido porque falha silenciosamente para o lado permissivo.

**Integração:** o `decideHidePaid` que o #12795 extraiu passou a usar o seu `isFreeForProvider` por id, em vez de OR-ear os dois aliases num único `freeProvider`. A forma por id é a garantia que esta PR estabelece, então ela prevaleceu.
2026-09-10 09:12:07 -03:00

66 lines
3.4 KiB
TypeScript

import { describe, it } from "node:test";
import assert from "node:assert/strict";
import { isFreeModel, providerHasFreeModels } from "../../src/shared/utils/freeModels.ts";
describe("isFreeModel isFree opt-in", () => {
it("isFree:true fetched → free only for a provider with a documented free tier", async () => {
const { FREE_MODEL_BUDGETS } = await import("@omniroute/open-sse/config/freeModelCatalog");
const freeProvider = FREE_MODEL_BUDGETS[0].provider;
assert.equal(isFreeModel("any", { id: "x", isFree: true }), false);
assert.equal(isFreeModel("local", { id: "my-model", isFree: true }), false);
assert.equal(isFreeModel(freeProvider, { id: "x", isFree: true }), true);
});
it("isFree:false/null/undefined/1/'true' → not free (strict ===true)", () => {
const junk: unknown[] = [false, null, undefined, 1, "true"];
for (const v of junk) {
assert.equal(
isFreeModel("any", { id: "x", isFree: v as boolean }),
false,
`isFree=${String(v)} should be false`
);
}
});
it("providerHasFreeModels unchanged by custom isFree", () => {
assert.equal(providerHasFreeModels("local"), false);
assert.equal(providerHasFreeModels("openai"), providerHasFreeModels("openai"));
});
it(":free and pricing 0 still work when isFree absent — only for free-tier providers", async () => {
const { FREE_MODEL_BUDGETS } = await import("@omniroute/open-sse/config/freeModelCatalog");
const freeProvider = FREE_MODEL_BUDGETS[0].provider;
assert.equal(isFreeModel("any", { id: "foo:free" }), false);
assert.equal(isFreeModel("local", { id: "foo", pricing: { prompt: 0, completion: 0 } }), false);
assert.equal(isFreeModel(freeProvider, { id: "foo:free" }), true);
assert.equal(
isFreeModel(freeProvider, { id: "foo", pricing: { prompt: 0, completion: 0 } }),
true
);
assert.equal(isFreeModel("any", { id: "foo", pricing: { prompt: 0, completion: 1 } }), false);
});
it("selectModelsForImport matches isFreeForProvider on every catalogued free model", async () => {
// FREE_MODEL_IDS_BY_PROVIDER is module-private, so rebuild (provider, id) pairs from the
// exported FREE_MODEL_BUDGETS: every budgeted provider has a documented free tier.
const { FREE_MODEL_BUDGETS } = await import("@omniroute/open-sse/config/freeModelCatalog");
const { selectModelsForImport, isFreeForProvider } =
await import("../../src/shared/utils/freeModels.ts");
for (const { provider } of FREE_MODEL_BUDGETS) {
const m = { id: `${provider}/probe-lock`, pricing: { prompt: 0, completion: 0 } };
const expected = isFreeForProvider(provider, m);
const { models } = selectModelsForImport(provider, [m], true);
assert.equal(models.length, expected ? 1 : 0, `${provider}/probe-lock`);
}
});
it("selectModelsForImport drops zero-price models on providers without documented free tier", async () => {
// "local" has no documented free tier, so its zero-price model is not free.
const { selectModelsForImport, providerHasFreeModels } =
await import("../../src/shared/utils/freeModels.ts");
assert.equal(providerHasFreeModels("local"), false);
const { models, freeFilterEmpty } = selectModelsForImport(
"local",
[{ id: "local/x", pricing: { prompt: 0, completion: 0 } }],
true
);
assert.deepEqual(models, []);
assert.equal(freeFilterEmpty, true);
});
});