Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/maintenance/13056-retired-claude-fixture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- **fix(tests):** eight combo integration suites still targeted the retired `claude-3-5-sonnet-20241022`, which the lifecycle registry rejects with 410; they now use its successor `claude-sonnet-4-6`, un-hiding 23 routing cases ([#13056](https://github.com/diegosouzapw/OmniRoute/pull/13056)) — thanks @doramirdor
6 changes: 3 additions & 3 deletions tests/integration/combo-failover-e2e.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ test("priority combo walks a 3-target chain: 500 → 503 → success", async ()
config: { maxRetries: 0, retryDelayMs: 0, fallbackDelayMs: 0 },
models: [
"openai/gpt-4o-mini",
"claude/claude-3-5-sonnet-20241022",
"claude/claude-sonnet-4-6",
"gemini/gemini-2.5-flash",
],
});
Expand Down Expand Up @@ -100,7 +100,7 @@ test("priority combo fails over when the first target exceeds its per-target tim
strategy: "priority",
// 80ms per-target ceiling; the first target hangs past it and is aborted.
config: { maxRetries: 0, retryDelayMs: 0, fallbackDelayMs: 0, targetTimeoutMs: 80 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});

const attempts: string[] = [];
Expand Down Expand Up @@ -139,7 +139,7 @@ test("auto combo selects and dispatches a scored candidate end-to-end", async ()
name: "router-auto",
strategy: "auto",
config: { maxRetries: 0, retryDelayMs: 0 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});

const seen: string[] = [];
Expand Down
4 changes: 2 additions & 2 deletions tests/integration/combo-matrix/fusion.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ test("fusion: fans out to the whole panel then routes a judge synthesis turn", a
name: "m-fusion",
strategy: "fusion",
config: { judgeModel: "openai/gpt-4o-mini", fusionTuning: { minPanel: 2 } },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022", "gemini/gemini-2.5-flash"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6", "gemini/gemini-2.5-flash"],
});
h.installRecordingFetch();

Expand All @@ -50,7 +50,7 @@ test("fusion: returns 503 when the whole panel fails", async () => {
name: "m-fusion-dead",
strategy: "fusion",
config: { judgeModel: "openai/gpt-4o-mini" },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});
// Every panel call fails → fusion has nothing to synthesize → 503.
h.installRecordingFetch(() => h.failure(503));
Expand Down
16 changes: 8 additions & 8 deletions tests/integration/combo-matrix/ordered.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ test("priority: always dispatches the first healthy target", async () => {
name: "m-priority",
strategy: "priority",
config: { maxRetries: 0, retryDelayMs: 0 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});
h.installRecordingFetch();

Expand All @@ -47,7 +47,7 @@ test("priority: falls back to the next target when the first fails", async () =>
name: "m-priority-fail",
strategy: "priority",
config: { maxRetries: 0, retryDelayMs: 0 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});
// First upstream call (openai) fails → must fall over to claude.
h.installRecordingFetch((call) => (call.index === 0 ? h.failure(503) : undefined));
Expand All @@ -64,7 +64,7 @@ test("fill-first: keeps using the first target until it fails, then moves on", a
name: "m-fill-first",
strategy: "fill-first",
config: { maxRetries: 0, retryDelayMs: 0 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});
h.installRecordingFetch();

Expand All @@ -84,7 +84,7 @@ test("round-robin: cycles through targets in batches (sticky limit = 3 default)"
name: "m-rr",
strategy: "round-robin",
config: { maxRetries: 0, retryDelayMs: 0 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022", "gemini/gemini-2.5-flash"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6", "gemini/gemini-2.5-flash"],
});
h.installRecordingFetch();

Expand All @@ -106,7 +106,7 @@ test("least-used: prefers the target with the fewest recent uses", async () => {
name: "m-least-used",
strategy: "least-used",
config: { maxRetries: 0, retryDelayMs: 0, stickyRoundRobinLimit: 1 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});
h.installRecordingFetch();

Expand All @@ -129,7 +129,7 @@ test("random: over many calls reaches every target", async () => {
name: "m-random",
strategy: "random",
config: { maxRetries: 0, retryDelayMs: 0, stickyRoundRobinLimit: 1 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022", "gemini/gemini-2.5-flash"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6", "gemini/gemini-2.5-flash"],
});
h.installRecordingFetch();

Expand All @@ -151,7 +151,7 @@ test("strict-random: uses every target once before repeating (deck, no early rep
name: "m-strict-random",
strategy: "strict-random",
config: { maxRetries: 0, retryDelayMs: 0, stickyRoundRobinLimit: 1 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022", "gemini/gemini-2.5-flash"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6", "gemini/gemini-2.5-flash"],
});
h.installRecordingFetch();

Expand All @@ -171,7 +171,7 @@ test("p2c: spreads load across targets over many calls (no single-target pin)",
name: "m-p2c",
strategy: "p2c",
config: { maxRetries: 0, retryDelayMs: 0, stickyRoundRobinLimit: 1 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022", "gemini/gemini-2.5-flash"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6", "gemini/gemini-2.5-flash"],
});
h.installRecordingFetch();

Expand Down
6 changes: 3 additions & 3 deletions tests/integration/combo-matrix/quota-aware.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ test("reset-aware: exhausted connection (limitReached) demoted — second target
id: "ra-claude",
kind: "model",
providerId: "claude",
model: "claude-3-5-sonnet-20241022",
model: "claude-sonnet-4-6",
connectionId: claudeConn.id,
},
],
Expand Down Expand Up @@ -212,7 +212,7 @@ test("headroom: target with most free capacity dispatched first despite being se
id: "hr-claude",
kind: "model",
providerId: "claude",
model: "claude-3-5-sonnet-20241022",
model: "claude-sonnet-4-6",
connectionId: claudeConn.id,
},
],
Expand Down Expand Up @@ -264,7 +264,7 @@ test("lkgp: last-known-good provider is prioritised above definition order", asy
// openai FIRST in definition — must be deprioritised (LKGP record points to claude)
"openai/gpt-4o-mini",
// claude SECOND — must be moved to front by the LKGP record
"claude/claude-3-5-sonnet-20241022",
"claude/claude-sonnet-4-6",
],
});
h.installRecordingFetch();
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/combo-matrix/weighted.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ test("weighted: 70/30 weights produce roughly proportional distribution", async
config: { maxRetries: 0, retryDelayMs: 0, stickyWeightedLimit: 1 },
models: [
{ id: "w-openai", kind: "model", providerId: "openai", model: "gpt-4o-mini", weight: 70 },
{ id: "w-claude", kind: "model", providerId: "claude", model: "claude-3-5-sonnet-20241022", weight: 30 },
{ id: "w-claude", kind: "model", providerId: "claude", model: "claude-sonnet-4-6", weight: 30 },
],
});
h.installRecordingFetch();
Expand Down
14 changes: 7 additions & 7 deletions tests/integration/combo-provider-exhaustion.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ test("fast-skip on quota-exhausted 429: first same-provider target causes remain
models: [
"openai/gpt-4o-mini",
"openai/gpt-3.5-turbo", // Same provider as first target
"anthropic/claude-3-5-sonnet-20241022",
"anthropic/claude-sonnet-4-6",
],
});

Expand Down Expand Up @@ -133,7 +133,7 @@ test("fast-skip on credits-exhausted 429: same-provider targets are skipped (#17
name: "credits-exhausted-combo",
strategy: "priority",
config: { maxRetries: 0, retryDelayMs: 0, fallbackDelayMs: 0 },
models: ["openai/gpt-4o-mini", "openai/gpt-3.5-turbo", "anthropic/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "openai/gpt-3.5-turbo", "anthropic/claude-sonnet-4-6"],
});

let openaiCalls = 0;
Expand Down Expand Up @@ -203,7 +203,7 @@ test("no skip on transient 429: plain rate-limit does not skip same-provider tar
name: "transient-429-combo",
strategy: "priority",
config: { maxRetries: 0, retryDelayMs: 0, fallbackDelayMs: 0 },
models: ["openai/gpt-4o-mini", "openai/gpt-3.5-turbo", "anthropic/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "openai/gpt-3.5-turbo", "anthropic/claude-sonnet-4-6"],
});

let openaiCalls = 0;
Expand Down Expand Up @@ -274,8 +274,8 @@ test("cross-provider not affected: different providers both return 429, both are
config: { maxRetries: 0, retryDelayMs: 0, fallbackDelayMs: 0 },
models: [
"openai/gpt-4o-mini",
"anthropic/claude-3-5-sonnet-20241022",
"claude/claude-3-5-sonnet-20241022",
"anthropic/claude-sonnet-4-6",
"claude/claude-sonnet-4-6",
],
});

Expand Down Expand Up @@ -357,7 +357,7 @@ test("exhaustion does not persist across requests: second request starts fresh (
name: "persistence-test-combo",
strategy: "priority",
config: { maxRetries: 0, retryDelayMs: 0, fallbackDelayMs: 0 },
models: ["openai/gpt-4o-mini", "openai/gpt-3.5-turbo", "anthropic/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "openai/gpt-3.5-turbo", "anthropic/claude-sonnet-4-6"],
});

let requestCount = 0;
Expand Down Expand Up @@ -460,7 +460,7 @@ test("round-robin path fast-skip: round-robin combo also skips exhausted provide
name: "rr-exhaustion-combo",
strategy: "round-robin",
config: { maxRetries: 0, retryDelayMs: 0, fallbackDelayMs: 0 },
models: ["openai/gpt-4o-mini", "openai/gpt-3.5-turbo", "anthropic/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "openai/gpt-3.5-turbo", "anthropic/claude-sonnet-4-6"],
});

let openaiCalls = 0;
Expand Down
8 changes: 4 additions & 4 deletions tests/integration/combo-routing-e2e.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ test("round-robin combo cycles through three providers", async () => {
name: "router-rr",
strategy: "round-robin",
config: { maxRetries: 0, retryDelayMs: 0 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022", "gemini/gemini-2.5-flash"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6", "gemini/gemini-2.5-flash"],
});

const seenProviders = [];
Expand Down Expand Up @@ -130,7 +130,7 @@ test("priority combo sticks to the primary model while healthy", async () => {
await combosDb.createCombo({
name: "router-priority-healthy",
strategy: "priority",
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});

const seenTargets = [];
Expand Down Expand Up @@ -163,7 +163,7 @@ test("priority combo falls back to the secondary model when the first one fails"
name: "router-fallback",
strategy: "priority",
config: { maxRetries: 0, retryDelayMs: 0 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});

const attempts = [];
Expand Down Expand Up @@ -378,7 +378,7 @@ test("strategy updates take effect for later requests on the same combo name", a
const combo = await combosDb.createCombo({
name: "router-dynamic",
strategy: "priority",
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});

const seenProviders = [];
Expand Down
4 changes: 2 additions & 2 deletions tests/integration/proxy-context-passthrough.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ test("combo targets each execute under their own connection's proxy", async () =
name: "proxy-per-target-combo",
strategy: "priority",
config: { maxRetries: 0, retryDelayMs: 0, fallbackDelayMs: 0 },
models: ["openai/gpt-4o-mini", "claude/claude-3-5-sonnet-20241022"],
models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"],
});

const proxySeen: Record<string, string | null> = {};
Expand Down Expand Up @@ -166,7 +166,7 @@ test("count_tokens provider call runs inside the connection's proxy context", as
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: "claude/claude-3-5-sonnet-20241022",
model: "claude/claude-sonnet-4-6",
messages: [{ role: "user", content: "count me" }],
}),
})
Expand Down