mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-14 02:42:24 +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.
48 lines
1.9 KiB
TypeScript
48 lines
1.9 KiB
TypeScript
/**
|
|
* Combo health names the reason a provider contributes no usable quota:
|
|
* with zero snapshots the entry carries `no-snapshot` instead of a bare 0%.
|
|
*/
|
|
import assert from "node:assert/strict";
|
|
import { describe, it } from "node:test";
|
|
import fs from "node:fs";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
|
|
const TEST_DATA_DIR = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-combo-health-drop-"));
|
|
const PREV_DATA_DIR = process.env.DATA_DIR;
|
|
process.env.DATA_DIR = TEST_DATA_DIR;
|
|
const core = await import("../../src/lib/db/core.ts");
|
|
const comboMetrics = await import("../../open-sse/services/comboMetrics.ts");
|
|
|
|
describe("comboHealth dropReason", () => {
|
|
it("reports no-snapshot for a provider with zero quota snapshots", async () => {
|
|
comboMetrics.resetAllComboMetrics();
|
|
core.resetDbInstance();
|
|
fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
|
|
fs.mkdirSync(TEST_DATA_DIR, { recursive: true });
|
|
const { buildComboHealthResponse } = await import("../../src/lib/usage/comboHealth.ts");
|
|
const response = (await buildComboHealthResponse({
|
|
range: "1h",
|
|
combos: [
|
|
{
|
|
id: "00000000-0000-1000-8000-000000000001",
|
|
name: "t",
|
|
strategy: "priority",
|
|
models: [{ kind: "model", model: "openai/gpt-4o" }],
|
|
},
|
|
],
|
|
} as never)) as {
|
|
combos: Array<{ quotaHealth?: { providers?: Array<{ dropReason?: string | null }> } }>;
|
|
};
|
|
assert.ok(
|
|
Array.isArray(response.combos) && response.combos.length > 0,
|
|
"combos passed as input must come back"
|
|
);
|
|
const providers = response.combos[0]!.quotaHealth?.providers ?? [];
|
|
assert.ok(providers.length > 0, "quotaHealth.providers must exist even without snapshots");
|
|
assert.equal(providers[0]!.dropReason, "no-snapshot");
|
|
if (PREV_DATA_DIR === undefined) delete process.env.DATA_DIR;
|
|
else process.env.DATA_DIR = PREV_DATA_DIR;
|
|
});
|
|
});
|