mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-05 23:02:10 +03:00
## New Features - Combo Builder v2 wizard UI (multi-stage: Basics → Steps → Strategy → Review) - Combo Step Architecture Schema v2 (ComboModelStep, ComboRefStep, pinned accounts) - Composite Tiers system for tiered model routing with fallback chains - Model Capabilities Registry (unified resolver merging specs + registry + synced data) - Observability module (buildHealthPayload, buildTelemetryPayload, buildSessionsSummary) - Session & Quota Monitor panels on Health dashboard - Combo Health per-target analytics via resolveNestedComboTargets() - Combo Builder Options API (GET /api/combos/builder/options) ## Performance - Middleware lazy loading (apiAuth, db/settings, modelSyncScheduler) - E2E auth bypass mode (NEXT_PUBLIC_OMNIROUTE_E2E_MODE) ## Bug Fixes - P2C credential selection with quota headroom awareness - Fixed-account combo steps bypass model cooldowns/circuit breakers - Combo metrics per-target tracking (byTarget with executionKey) - Call logs schema expansion (7 new columns + composite index) - Quota monitor lifecycle enrichment (status, snapshots, summary) - Codex quota fetcher hardening ## Maintenance - DB migration 021 (combo_call_log_targets) - Combo CRUD normalization on read - Playwright config + build script improvements - OpenAPI spec version sync to 3.6.4 ## Tests - 16 new test suites + 12 existing test updates - 86 files changed, +8318 -1378 lines
132 lines
3.1 KiB
JavaScript
132 lines
3.1 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
const { validateCompositeTiersConfig } = await import("../../src/lib/combos/compositeTiers.ts");
|
|
|
|
function createComboInput(overrides = {}) {
|
|
return {
|
|
name: "tiered-codex",
|
|
strategy: "priority",
|
|
models: [
|
|
{
|
|
kind: "model",
|
|
id: "step-primary",
|
|
providerId: "codex",
|
|
model: "gpt-5.4",
|
|
connectionId: "conn-codex-a",
|
|
},
|
|
{
|
|
kind: "model",
|
|
id: "step-backup",
|
|
providerId: "codex",
|
|
model: "gpt-5.4",
|
|
connectionId: "conn-codex-b",
|
|
},
|
|
],
|
|
config: {
|
|
compositeTiers: {
|
|
defaultTier: "primary",
|
|
tiers: {
|
|
primary: {
|
|
stepId: "step-primary",
|
|
fallbackTier: "backup",
|
|
},
|
|
backup: {
|
|
stepId: "step-backup",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
test("validateCompositeTiersConfig accepts a valid tier graph that references combo steps", () => {
|
|
const result = validateCompositeTiersConfig(createComboInput());
|
|
|
|
assert.deepEqual(result, { success: true });
|
|
});
|
|
|
|
test("validateCompositeTiersConfig rejects tiers that point to missing step ids", () => {
|
|
const result = validateCompositeTiersConfig(
|
|
createComboInput({
|
|
config: {
|
|
compositeTiers: {
|
|
defaultTier: "primary",
|
|
tiers: {
|
|
primary: {
|
|
stepId: "step-missing",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
);
|
|
|
|
assert.equal(result.success, false);
|
|
assert.deepEqual(result.error.details, [
|
|
{
|
|
field: "config.compositeTiers.tiers.primary.stepId",
|
|
message: 'stepId "step-missing" does not exist in combo.models',
|
|
},
|
|
]);
|
|
});
|
|
|
|
test("validateCompositeTiersConfig rejects duplicate step ownership across tiers", () => {
|
|
const result = validateCompositeTiersConfig(
|
|
createComboInput({
|
|
config: {
|
|
compositeTiers: {
|
|
defaultTier: "primary",
|
|
tiers: {
|
|
primary: {
|
|
stepId: "step-primary",
|
|
},
|
|
backup: {
|
|
stepId: "step-primary",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
);
|
|
|
|
assert.equal(result.success, false);
|
|
assert.deepEqual(result.error.details, [
|
|
{
|
|
field: "config.compositeTiers.tiers.backup.stepId",
|
|
message: 'stepId "step-primary" is already assigned to tier "primary"',
|
|
},
|
|
]);
|
|
});
|
|
|
|
test("validateCompositeTiersConfig rejects fallback cycles", () => {
|
|
const result = validateCompositeTiersConfig(
|
|
createComboInput({
|
|
config: {
|
|
compositeTiers: {
|
|
defaultTier: "primary",
|
|
tiers: {
|
|
primary: {
|
|
stepId: "step-primary",
|
|
fallbackTier: "backup",
|
|
},
|
|
backup: {
|
|
stepId: "step-backup",
|
|
fallbackTier: "primary",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
})
|
|
);
|
|
|
|
assert.equal(result.success, false);
|
|
assert.deepEqual(result.error.details, [
|
|
{
|
|
field: "config.compositeTiers.tiers.primary.fallbackTier",
|
|
message: "fallbackTier cycle detected: primary -> backup -> primary",
|
|
},
|
|
]);
|
|
});
|