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.
37 lines
1.8 KiB
TypeScript
37 lines
1.8 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
// #FIX: regression guard for the WAF retry config. The BaseExecutor must
|
|
// expose a WAF_RETRY_CONFIG with sane defaults and a backoff multiplier
|
|
// so the executor can retry 400 content-blocked before falling through to
|
|
// the 429/401/fallback chain.
|
|
|
|
test("WAF_RETRY_CONFIG has expected shape", async () => {
|
|
const { BaseExecutor } = await import("../../open-sse/executors/base.ts");
|
|
const cfg = BaseExecutor.WAF_RETRY_CONFIG;
|
|
assert.equal(typeof cfg.maxAttempts, "number");
|
|
assert.equal(typeof cfg.delayMs, "number");
|
|
assert.equal(typeof cfg.backoffMultiplier, "number");
|
|
assert.ok(cfg.maxAttempts >= 1, "maxAttempts must allow at least 1 retry");
|
|
assert.ok(cfg.maxAttempts <= 5, "maxAttempts must be bounded to avoid runaway loops");
|
|
assert.ok(cfg.delayMs >= 500, "initial delay must be long enough to clear the WAF");
|
|
assert.ok(cfg.backoffMultiplier >= 1);
|
|
|
|
// Derived: the second attempt should wait at least as long as the first
|
|
const secondAttemptWait = cfg.delayMs * cfg.backoffMultiplier;
|
|
assert.ok(
|
|
secondAttemptWait > cfg.delayMs || cfg.backoffMultiplier === 1,
|
|
"backoffMultiplier should produce a longer wait on the second attempt"
|
|
);
|
|
});
|
|
|
|
test("WAF_RETRY_CONFIG differs from generic RETRY_CONFIG (different problem)", async () => {
|
|
const { BaseExecutor } = await import("../../open-sse/executors/base.ts");
|
|
const generic = BaseExecutor.RETRY_CONFIG;
|
|
const waf = BaseExecutor.WAF_RETRY_CONFIG;
|
|
assert.ok(waf !== generic, "WAF retry config should be distinct from generic retry config");
|
|
// The WAF needs a different starting delay (longer) than the generic 429 path
|
|
// because the WAF's per-IP suspicion bucket relaxes more slowly.
|
|
assert.ok(waf.delayMs >= 500, "WAF initial delay should be >= 500ms");
|
|
});
|