mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-14 10:52:17 +03:00
Validado numa worktree combinada com as 16 PRs desta leva sobre `release/v3.8.51`: typecheck:core limpo, check-file-size e check-changelog-integrity OK, complexity 2788/3218 e cognitive 1261/1437, ESLint 0 erros nos 152 arquivos alterados, e a suíte vitest:ui completa (2149) verde. Sobre esta PR especificamente: rodei os **23 arquivos de teste** que ela toca sobre o tip final, depois do merge da base — **392/392**. A migration `174_server_tool_executions.sql` não colide (o tip está em 173, e você já a renumerou em `c35f0fd7`). O dono foi consultado antes do merge, porque o loop está atrás da flag `SERVER_OWNED_TOOL_LOOP_ENABLED` mas o primeiro send não-streaming mudou de dono sem flag, e a verificação manual em combo com Memory continuava desmarcada. A condição dele foi: entra se os testes focados passarem aqui. Passaram. O lock de passthrough (`fetchCalls.length === 1`) é a parte que mais me convenceu — o double-dispatch que um `if (stream)` em volta do send existente causaria é exatamente o tipo de regressão que não aparece em teste de comportamento, só em contagem de chamada. **Três ajustes meus na sua branch:** 1. `tests/unit/chatcore-stream-error-result.test.ts` procurava `"const legResult = await runNonStreamingProviderLeg"`, mas o seu commit final `6077b9dd` passou a reatribuir `legResult` e trocou para `let`. O guard falhava na sua própria branch (confirmei que o arquivo e o `chatCore.ts` eram byte-idênticos ao head da PR, então não era efeito da leva). Passou a aceitar `const|let` — a intenção do guard é o try/catch em volta da chamada, não a palavra-chave. 2. `tests/integration/skills-pipeline.test.ts` foi de 1156 para 1338 linhas e estourou o `testCap` de 1200. Segui o mesmo caminho que você já tinha tomado em `a1d2d20d` para os testes unitários: extraí os três casos do server-owned tool loop para `tests/integration/server-owned-tool-loop-pipeline.test.ts` (259 linhas), com instância própria do harness. O glob `tests/integration/*.test.ts` pega o arquivo novo sem registro adicional. 3/3 verdes isolados. 3. O arquivo novo herdou cinco `any` do original — que só passavam por estarem congelados no `eslint-suppressions.json` sob o nome antigo. Tipei como `Record<string, unknown>`. E `tests/unit/non-streaming-finalization.test.ts` tinha dois argumentos não usados em `trackPendingRequest`, agora prefixados com `_`. Nada disso toca produção nem enfraquece asserção.
138 lines
4.2 KiB
TypeScript
138 lines
4.2 KiB
TypeScript
// tests/unit/chatcore-failure-usage.test.ts
|
|
// Characterization of buildFailureUsageRecord — the failed-request usage payload builder extracted
|
|
// from handleChatCore's persistFailureUsage closure (chatCore god-file decomposition, #3501). Pure:
|
|
// the handler keeps the fire-and-forget saveRequestUsage(...).catch() call and computes latencyMs;
|
|
// this builds the record. Locks the unknown/undefined fallbacks, the zeroed token/timing fields,
|
|
// the combo-strategy gate, and the ISO timestamp.
|
|
import { test } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { buildFailureUsageRecord } from "../../open-sse/handlers/chatCore/failureUsage.ts";
|
|
|
|
const ISO = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
|
|
|
|
test("maps a fully-populated failure into the usage record", () => {
|
|
const r = buildFailureUsageRecord({
|
|
provider: "openai",
|
|
model: "gpt-4o",
|
|
connectionId: "conn-1",
|
|
apiKeyInfo: { id: "key-1", name: "My Key" },
|
|
effectiveServiceTier: "priority",
|
|
isCombo: true,
|
|
comboStrategy: "weighted",
|
|
statusCode: 429,
|
|
errorCode: "rate_limited",
|
|
latencyMs: 1234,
|
|
});
|
|
assert.equal(r.provider, "openai");
|
|
assert.equal(r.model, "gpt-4o");
|
|
assert.deepEqual(r.tokens, { input: 0, output: 0, cacheRead: 0, cacheCreation: 0, reasoning: 0 });
|
|
assert.equal(r.status, "429");
|
|
assert.equal(r.success, false);
|
|
assert.equal(r.latencyMs, 1234);
|
|
assert.equal(r.timeToFirstTokenMs, 0);
|
|
assert.equal(r.errorCode, "rate_limited");
|
|
assert.match(String(r.timestamp), ISO);
|
|
assert.equal(r.connectionId, "conn-1");
|
|
assert.equal(r.apiKeyId, "key-1");
|
|
assert.equal(r.apiKeyName, "My Key");
|
|
assert.equal(r.serviceTier, "priority");
|
|
assert.equal(r.comboStrategy, "weighted");
|
|
});
|
|
|
|
test("applies the unknown/undefined fallbacks", () => {
|
|
const r = buildFailureUsageRecord({
|
|
provider: null,
|
|
model: undefined,
|
|
connectionId: null,
|
|
apiKeyInfo: null,
|
|
effectiveServiceTier: "standard",
|
|
isCombo: false,
|
|
comboStrategy: "priority",
|
|
statusCode: 502,
|
|
errorCode: null,
|
|
latencyMs: 7,
|
|
});
|
|
assert.equal(r.provider, "unknown");
|
|
assert.equal(r.model, "unknown");
|
|
assert.equal(r.errorCode, "502"); // falls back to String(statusCode)
|
|
assert.equal(r.connectionId, undefined);
|
|
assert.equal(r.apiKeyId, undefined);
|
|
assert.equal(r.apiKeyName, undefined);
|
|
// isCombo false → comboStrategy is dropped even when supplied
|
|
assert.equal(r.comboStrategy, undefined);
|
|
});
|
|
|
|
test("combo strategy is included only for combo requests", () => {
|
|
const combo = buildFailureUsageRecord({
|
|
provider: "x",
|
|
model: "y",
|
|
connectionId: null,
|
|
apiKeyInfo: null,
|
|
effectiveServiceTier: "standard",
|
|
isCombo: true,
|
|
comboStrategy: "round-robin",
|
|
statusCode: 500,
|
|
errorCode: "boom",
|
|
latencyMs: 1,
|
|
});
|
|
assert.equal(combo.comboStrategy, "round-robin");
|
|
|
|
const comboNoStrategy = buildFailureUsageRecord({
|
|
provider: "x",
|
|
model: "y",
|
|
connectionId: null,
|
|
apiKeyInfo: null,
|
|
effectiveServiceTier: "standard",
|
|
isCombo: true,
|
|
comboStrategy: null,
|
|
statusCode: 500,
|
|
errorCode: "boom",
|
|
latencyMs: 1,
|
|
});
|
|
assert.equal(comboNoStrategy.comboStrategy, undefined);
|
|
});
|
|
|
|
test("maps aggregate usage onto failure tokens instead of zeros", () => {
|
|
const r = buildFailureUsageRecord({
|
|
provider: "openai",
|
|
model: "gpt-4o",
|
|
connectionId: "conn-1",
|
|
apiKeyInfo: { id: "key-1", name: "My Key" },
|
|
effectiveServiceTier: "priority",
|
|
isCombo: false,
|
|
comboStrategy: null,
|
|
statusCode: 429,
|
|
errorCode: "rate_limited",
|
|
latencyMs: 50,
|
|
aggregate: {
|
|
prompt_tokens: 100,
|
|
completion_tokens: 20,
|
|
cache_read_input_tokens: 10,
|
|
reasoning_tokens: 5,
|
|
},
|
|
});
|
|
assert.deepEqual(r.tokens, {
|
|
input: 100,
|
|
output: 20,
|
|
cacheRead: 10,
|
|
cacheCreation: 0,
|
|
reasoning: 5,
|
|
});
|
|
});
|
|
|
|
test("keeps zeroed tokens when aggregate is absent", () => {
|
|
const r = buildFailureUsageRecord({
|
|
provider: "openai",
|
|
model: "gpt-4o",
|
|
connectionId: null,
|
|
apiKeyInfo: null,
|
|
effectiveServiceTier: "standard",
|
|
isCombo: false,
|
|
comboStrategy: null,
|
|
statusCode: 502,
|
|
errorCode: null,
|
|
latencyMs: 7,
|
|
});
|
|
assert.deepEqual(r.tokens, { input: 0, output: 0, cacheRead: 0, cacheCreation: 0, reasoning: 0 });
|
|
});
|