mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-09-14 02:42:24 +03:00
Landed with the design call resolved per the owner's pick — **option 1**: the synced store is now endpoint-agnostic (persistDiscoveredModels and managedModelImport no longer drop non-chat models at write time), and chat selectability moved to read time (auto-pool expansion in autoStrategy applies filterChatSelectableModels; the models-route projection already had its chatOnly filter). Your discovery test now passes end-to-end (3/3): /api/show capabilities persist per connection and image/embedding requests route through the advertising host. Reconciliation notes: conflicted areas merged onto the current tip (adobe discovery import, requestedModel preflight signature, resolvedProvider fast-path coexists with the synced-route override — explicit resolution wins); carried base-red drains (#10055 memoization, #11071 test variants) dropped as already-landed; the managed-model-import exclusion test was propagated to the new contract (image/video models persist; the read filter still hides them from chat pickers — pinned by a new assertion). Full battery: 205/206 focused (the one red is a confirmed periodic-timer timing flake on the loaded devbox — 20/20 isolated), autoCombo vitest 30/30, combo suites 46/46, gates + typecheck clean. Thank you @yourspraveen — the capability probe + routing design was right; it just needed the store contract opened up. Fixes #11087.
60 lines
2.0 KiB
TypeScript
60 lines
2.0 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
createBodyTimeoutError,
|
|
createUpstreamStartTimeoutError,
|
|
createAbortError,
|
|
computeBillableTokens,
|
|
getExecutorTimeoutMs,
|
|
normalizeExecutorResult,
|
|
} from "../../open-sse/handlers/chatCore/upstreamTimeouts.ts";
|
|
|
|
test("error factories set name and message", () => {
|
|
const body = createBodyTimeoutError(1234);
|
|
assert.equal(body.name, "BodyTimeoutError");
|
|
assert.match(body.message, /1234ms/);
|
|
|
|
const start = createUpstreamStartTimeoutError(500, "openai", "gpt-4o");
|
|
assert.equal(start.name, "TimeoutError");
|
|
assert.match(start.message, /openai\/gpt-4o/);
|
|
|
|
const ctrl = new AbortController();
|
|
ctrl.abort("nope");
|
|
const ab = createAbortError(ctrl.signal);
|
|
assert.equal(ab.name, "AbortError");
|
|
});
|
|
|
|
test("computeBillableTokens sums input+output+reasoning (no cache double-count)", () => {
|
|
const total = computeBillableTokens({
|
|
prompt_tokens: 10,
|
|
completion_tokens: 5,
|
|
reasoning_tokens: 2,
|
|
});
|
|
assert.equal(total, 17);
|
|
});
|
|
|
|
test("getExecutorTimeoutMs floors valid values and falls back to default", () => {
|
|
assert.equal(getExecutorTimeoutMs({ getTimeoutMs: () => 1234.9 }), 1234);
|
|
assert.equal(getExecutorTimeoutMs({ getTimeoutMs: () => NaN }), getExecutorTimeoutMs(null));
|
|
assert.ok(Number.isFinite(getExecutorTimeoutMs(null)));
|
|
});
|
|
|
|
test("normalizeExecutorResult wraps bare Response and passes through rich result", () => {
|
|
const r = new Response("x");
|
|
const wrapped = normalizeExecutorResult(r);
|
|
assert.equal(wrapped.response, r);
|
|
assert.equal(wrapped.url, "");
|
|
const rich = normalizeExecutorResult({ response: r, url: "u", headers: { a: "b" } });
|
|
assert.equal(rich.url, "u");
|
|
assert.equal(rich.headers.a, "b");
|
|
});
|
|
|
|
test("normalizeExecutorResult rejects malformed executor output", () => {
|
|
assert.throws(() => normalizeExecutorResult({}), /must contain a Response/);
|
|
assert.throws(
|
|
() => normalizeExecutorResult({ response: "not-a-response" }),
|
|
/must contain a Response/
|
|
);
|
|
});
|