import test from "node:test"; import assert from "node:assert/strict"; import fs from "node:fs"; import os from "node:os"; import path from "node:path"; const TEST_DATA_DIR = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-combo-routing-")); const ORIGINAL_DATA_DIR = process.env.DATA_DIR; process.env.DATA_DIR = TEST_DATA_DIR; const { getComboFromData, getComboModelsFromData, validateComboDAG, resolveNestedComboModels, handleComboChat, } = await import("../../open-sse/services/combo.ts"); const { resolveReasoningBufferedMaxTokens } = await import("../../open-sse/services/reasoningTokenBuffer.ts"); const { normalizeComboStep } = await import("../../src/lib/combos/steps.ts"); const { registerStrategy } = await import("../../open-sse/services/autoCombo/routerStrategy.ts"); const { touchSession, clearSessions } = await import("../../open-sse/services/sessionManager.ts"); const core = await import("../../src/lib/db/core.ts"); const settingsDb = await import("../../src/lib/db/settings.ts"); const providersDb = await import("../../src/lib/db/providers.ts"); const evalsDb = await import("../../src/lib/db/evals.ts"); const { saveModelsDevCapabilities, clearModelsDevCapabilities } = await import("../../src/lib/modelsDevSync.ts"); const { getComboMetrics, recordComboRequest, resetAllComboMetrics } = await import("../../open-sse/services/comboMetrics.ts"); const { resetEvalRoutingCache } = await import("../../open-sse/services/evalRouting.ts"); const { resetAllCircuitBreakers } = await import("../../src/shared/utils/circuitBreaker.ts"); const { acquire: acquireSemaphore, resetAll: resetAllSemaphores } = await import("../../open-sse/services/rateLimitSemaphore.ts"); const { _resetAllDecks } = await import("../../src/shared/utils/shuffleDeck.ts"); const { _setSecureRandomFloatSource } = await import("../../src/shared/utils/secureRandom.ts"); function createLog() { const entries: any[] = []; return { info: (tag: any, msg: any) => entries.push({ level: "info", tag, msg }), warn: (tag: any, msg: any) => entries.push({ level: "warn", tag, msg }), error: (tag: any, msg: any) => entries.push({ level: "error", tag, msg }), debug: (tag: any, msg: any) => entries.push({ level: "debug", tag, msg }), entries, }; } function okResponse(body: any = { choices: [{ message: { content: "ok" } }] }) { return new Response(JSON.stringify(body), { status: 200, headers: { "content-type": "application/json" }, }); } function errorResponse(status: number, message: string = `Error ${status}`) { return new Response(JSON.stringify({ error: { message } }), { status, headers: { "content-type": "application/json" }, }); } function waitForBackgroundWork() { return new Promise((resolve) => setTimeout(resolve, 25)); } function providerBreakerOpenResponse() { return new Response( JSON.stringify({ error: { message: "Provider circuit breaker is open", code: "provider_circuit_open", }, }), { status: 503, headers: { "content-type": "application/json", "x-omniroute-provider-breaker": "open", }, } ); } function streamResponse(chunks: any[]) { return new Response(chunks.join(""), { status: 200, headers: { "content-type": "text/event-stream" }, }); } function capabilityEntry(limitContext: unknown, overrides: Record = {}) { return { tool_call: true, reasoning: false, attachment: false, structured_output: true, temperature: true, modalities_input: JSON.stringify(["text"]), modalities_output: JSON.stringify(["text"]), knowledge_cutoff: null, release_date: null, last_updated: null, status: null, family: null, open_weights: false, limit_context: limitContext, limit_input: limitContext, limit_output: 4096, interleaved_field: null, ...overrides, }; } function getComboTargetExecutionKey(comboName: string, index: number, stepInput: any) { const step = normalizeComboStep(stepInput, { comboName, index }); if (!step) throw new Error(`Failed to normalize combo step for ${comboName}#${index}`); return `combo:${comboName}:${step.id}`; } async function cleanupTestDataDir() { let lastError; for (let attempt = 0; attempt < 5; attempt += 1) { try { core.resetDbInstance(); fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); return; } catch (error: any) { lastError = error; await new Promise((resolve) => setTimeout(resolve, 25)); } } if (lastError) { throw lastError; } } async function resetStorage() { await cleanupTestDataDir(); fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); await settingsDb.resetAllPricing(); settingsDb.clearAllLKGP(); clearModelsDevCapabilities(); } test.beforeEach(async () => { resetAllComboMetrics(); resetEvalRoutingCache(); resetAllCircuitBreakers(); resetAllSemaphores(); _resetAllDecks(); clearSessions(); await resetStorage(); }); test.after(async () => { resetAllComboMetrics(); resetEvalRoutingCache(); resetAllCircuitBreakers(); resetAllSemaphores(); _resetAllDecks(); clearModelsDevCapabilities(); settingsDb.clearAllLKGP(); if (ORIGINAL_DATA_DIR === undefined) { delete process.env.DATA_DIR; } else { process.env.DATA_DIR = ORIGINAL_DATA_DIR; } await cleanupTestDataDir(); }); test("getComboFromData and getComboModelsFromData resolve combos from array and object containers", () => { const combos = [ { name: "alpha", models: ["openai/gpt-4o-mini", { model: "claude/sonnet", weight: 2 }] }, ]; const fromArray = getComboFromData("alpha", combos); const fromObject = getComboFromData("alpha", { combos }); const models = getComboModelsFromData("alpha", { combos }); assert.equal(fromArray.name, "alpha"); assert.equal(fromObject.name, "alpha"); assert.deepEqual(models, ["openai/gpt-4o-mini", "claude/sonnet"]); }); test("validateComboDAG rejects circular references and resolveNestedComboModels expands nested combos", () => { const combos = [ { name: "root", models: ["child-a", "openai/gpt-4o-mini"] }, { name: "child-a", models: ["child-b", "claude/sonnet"] }, { name: "child-b", models: ["groq/llama-3.3-70b"] }, ]; validateComboDAG("root", combos); assert.deepEqual(resolveNestedComboModels(combos[0], combos), [ "groq/llama-3.3-70b", "claude/sonnet", "openai/gpt-4o-mini", ]); assert.throws( () => validateComboDAG("loop-a", [ { name: "loop-a", models: ["loop-b"] }, { name: "loop-b", models: ["loop-a"] }, ]), /Circular combo reference detected/ ); }); test("resolveNestedComboModels expands explicit combo-ref steps", () => { const combos = [ { name: "root", models: [ { id: "root-ref-child", kind: "combo-ref", comboName: "child", weight: 0 }, { id: "root-model", kind: "model", providerId: "openai", model: "openai/gpt-4o-mini" }, ], }, { name: "child", models: [ { id: "child-model", kind: "model", providerId: "anthropic", model: "claude/sonnet" }, ], }, ]; validateComboDAG("root", combos); assert.deepEqual(resolveNestedComboModels(combos[0], combos), [ "claude/sonnet", "openai/gpt-4o-mini", ]); }); test("validateComboDAG enforces maximum nesting depth", () => { const combos = [ { name: "c1", models: ["c2"] }, { name: "c2", models: ["c3"] }, { name: "c3", models: ["c4"] }, { name: "c4", models: ["c5"] }, { name: "c5", models: ["openai/gpt-4o-mini"] }, ]; assert.throws(() => validateComboDAG("c1", combos), /Max combo nesting depth/); }); test("handleComboChat priority strategy defaults to first model and records success metrics", async () => { const calls: any[] = []; const combo = { name: "priority-default", models: ["openai/gpt-4o-mini", "claude/sonnet"], }; const result = await handleComboChat({ body: {}, combo, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, allCombos: null, }); const metrics = getComboMetrics("priority-default"); const firstStep = normalizeComboStep(combo.models[0], { comboName: combo.name, index: 0, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/gpt-4o-mini"]); assert.equal(metrics.totalRequests, 1); assert.equal(metrics.totalSuccesses, 1); assert.equal(metrics.byModel["openai/gpt-4o-mini"].requests, 1); assert.equal(metrics.byTarget[firstStep.id].requests, 1); assert.equal(metrics.byTarget[firstStep.id].model, "openai/gpt-4o-mini"); assert.equal(metrics.strategy, "priority"); }); test("handleComboChat runs shadow targets without changing the primary response or metrics", async () => { const calls: any[] = []; const shadowRequests: any[] = []; const combo = { name: "shadow-routing-priority", models: ["openai/gpt-4o-mini"], config: { shadowRouting: { enabled: true, targets: [ { kind: "model", id: "shadow-anthropic", providerId: "anthropic", model: "anthropic/claude-3-haiku", label: "Dark launch target", }, ], sampleRate: 1, maxTargets: 1, }, }, }; const result = await handleComboChat({ body: { stream: true }, combo, handleSingleModel: async (body: any, modelStr: any, target?: any) => { calls.push({ modelStr, trafficType: target?.trafficType ?? "production", stream: body.stream, }); if (target?.trafficType === "shadow") { shadowRequests.push({ executionKey: target.executionKey, hasBodyMarker: body._omnirouteShadowRouting === true, }); } if (target?.trafficType === "shadow") return errorResponse(503, "shadow failed"); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, allCombos: null, }); await waitForBackgroundWork(); const metrics = getComboMetrics("shadow-routing-priority"); assert.equal(result.ok, true); calls.sort((a, b) => a.trafficType.localeCompare(b.trafficType)); assert.deepEqual(calls, [ { modelStr: "openai/gpt-4o-mini", trafficType: "production", stream: true }, { modelStr: "anthropic/claude-3-haiku", trafficType: "shadow", stream: false }, ]); assert.deepEqual(shadowRequests, [ { executionKey: "shadow>shadow-anthropic", hasBodyMarker: false }, ]); assert.equal(metrics.totalRequests, 1); assert.equal(metrics.totalSuccesses, 1); assert.equal(metrics.byModel["openai/gpt-4o-mini"].requests, 1); assert.equal(metrics.byModel["anthropic/claude-3-haiku"], undefined); assert.equal(metrics.shadow.totalRequests, 1); assert.equal(metrics.shadow.totalFailures, 1); assert.equal(metrics.shadow.byModel["anthropic/claude-3-haiku"].requests, 1); }); test("handleComboChat isolates nested shadow request bodies", async () => { type MutableChatBody = { messages: Array<{ role: string; content: string }>; stream: boolean }; const shadowMessages: string[] = []; const body = { messages: [{ role: "user", content: "original" }], stream: true }; const combo = { name: "shadow-routing-isolation", models: ["openai/gpt-4o-mini"], config: { shadowRouting: { enabled: true, targets: ["anthropic/claude-3-haiku"], sampleRate: 1, }, }, }; const result = await handleComboChat({ body, combo, handleSingleModel: async ( requestBody: MutableChatBody, _modelStr: unknown, target?: unknown ) => { const trafficType = target && typeof target === "object" && "trafficType" in target ? (target as { trafficType?: unknown }).trafficType : null; if (trafficType === "shadow") { shadowMessages.push(requestBody.messages[0].content); return okResponse(); } requestBody.messages[0].content = "mutated by production"; return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, allCombos: null, }); await waitForBackgroundWork(); assert.equal(result.ok, true); assert.deepEqual(shadowMessages, ["original"]); }); test("handleComboChat honors shadow sampleRate zero", async () => { const calls: any[] = []; const combo = { name: "shadow-routing-sampled-out", models: ["openai/gpt-4o-mini"], config: { shadowRouting: { enabled: true, targets: ["anthropic/claude-3-haiku"], sampleRate: 0, }, }, }; const result = await handleComboChat({ body: {}, combo, handleSingleModel: async (_body: any, modelStr: any, target?: any) => { calls.push({ modelStr, trafficType: target?.trafficType ?? "production" }); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, allCombos: null, }); await waitForBackgroundWork(); const metrics = getComboMetrics("shadow-routing-sampled-out"); assert.equal(result.ok, true); assert.deepEqual(calls, [{ modelStr: "openai/gpt-4o-mini", trafficType: "production" }]); assert.equal(metrics.totalRequests, 1); assert.equal(metrics.shadow.totalRequests, 0); }); test("handleComboChat priority strategy honors composite tier order before fallback", async () => { const calls: any[] = []; const combo = { name: "priority-composite-tiers", strategy: "priority", models: [ { kind: "model", id: "step-primary", providerId: "openai", model: "openai/gpt-4o-mini", }, { kind: "model", id: "step-backup", providerId: "anthropic", model: "claude/sonnet", }, { kind: "model", id: "step-last", providerId: "google", model: "gemini/gemini-2.5-flash", }, ], config: { maxRetries: 0, compositeTiers: { defaultTier: "backup", tiers: { backup: { stepId: "step-backup", fallbackTier: "primary", }, primary: { stepId: "step-primary", }, }, }, }, }; const result = await handleComboChat({ body: {}, combo, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "claude/sonnet") { return errorResponse(503, "backup failed"); } return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["claude/sonnet", "openai/gpt-4o-mini"]); }); test("handleComboChat weighted strategy selects by weight and falls back in descending weight order", async () => { const calls: any[] = []; _setSecureRandomFloatSource(() => 0.95); try { const result = await handleComboChat({ body: {}, combo: { name: "weighted-selection", strategy: "weighted", models: [ { model: "openai/gpt-4o-mini", weight: 1 }, { model: "claude/sonnet", weight: 9 }, ], config: { maxRetries: 0 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "claude/sonnet") return errorResponse(500, "temporary"); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["claude/sonnet", "openai/gpt-4o-mini"]); } finally { _setSecureRandomFloatSource(null); } }); test("handleComboChat weighted strategy falls back to uniform random when all weights are zero", async () => { const calls: any[] = []; _setSecureRandomFloatSource(() => 0.75); try { const result = await handleComboChat({ body: {}, combo: { name: "weighted-zero-fallback", strategy: "weighted", models: [ { model: "model-a", weight: 0 }, { model: "model-b", weight: 0 }, ], config: { maxRetries: 0 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["model-b"]); } finally { _setSecureRandomFloatSource(null); } }); test("handleComboChat random strategy uses shuffled model order", async () => { const calls: any[] = []; const sequence = [0.99, 0.0]; let idx = 0; _setSecureRandomFloatSource(() => sequence[idx++] ?? 0); try { await handleComboChat({ body: {}, combo: { name: "random-order", strategy: "random", models: ["model-a", "model-b", "model-c"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(calls.length, 1); assert.notEqual(calls[0], "model-a"); } finally { _setSecureRandomFloatSource(null); } }); test("handleComboChat fill-first explicitly preserves priority order", async () => { const calls: any[] = []; await handleComboChat({ body: {}, combo: { name: "fill-first-order", strategy: "fill-first", models: ["model-a", "model-b"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.deepEqual(calls, ["model-a"]); }); test("handleComboChat p2c selects the better of two random choices by metrics", async () => { const calls: any[] = []; const sequence = [0.0, 0.0]; let idx = 0; recordComboRequest("p2c-combo", "model-a", { success: true, latencyMs: 2000, strategy: "p2c", }); recordComboRequest("p2c-combo", "model-b", { success: true, latencyMs: 20, strategy: "p2c", }); _setSecureRandomFloatSource(() => sequence[idx++] ?? 0); try { await handleComboChat({ body: {}, combo: { name: "p2c-combo", strategy: "p2c", models: ["model-a", "model-b", "model-c"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.deepEqual(calls, ["model-b"]); } finally { _setSecureRandomFloatSource(null); } }); test("handleComboChat least-used strategy prefers the model with fewer recorded requests", async () => { recordComboRequest("least-used-combo", "model-a", { success: true, latencyMs: 100, strategy: "least-used", }); recordComboRequest("least-used-combo", "model-a", { success: true, latencyMs: 100, strategy: "least-used", }); recordComboRequest("least-used-combo", "model-b", { success: true, latencyMs: 100, strategy: "least-used", }); const calls: any[] = []; await handleComboChat({ body: {}, combo: { name: "least-used-combo", strategy: "least-used", models: ["model-a", "model-b", "model-c"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(calls[0], "model-c"); }); test("handleComboChat skips unavailable models and falls through to the next active target", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "availability-skip", strategy: "priority", models: ["model-a", "model-b"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async (modelStr) => modelStr !== "model-a", log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["model-b"]); }); test("handleComboChat falls through empty successful responses and records failure metrics before succeeding", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "quality-fallback", strategy: "priority", models: ["model-a", "model-b"], config: { maxRetries: 0 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "model-a") { return okResponse({ choices: [{ message: { content: "" } }] }); } return okResponse({ choices: [{ message: { content: "fallback ok" } }] }); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const metrics = getComboMetrics("quality-fallback"); assert.equal(result.ok, true); assert.deepEqual(calls, ["model-a", "model-b"]); assert.equal(metrics.totalRequests, 2); assert.equal(metrics.totalFailures, 1); assert.equal(metrics.totalSuccesses, 1); assert.equal(metrics.byModel["model-a"].lastStatus, "error"); assert.equal(metrics.byModel["model-b"].lastStatus, "ok"); }); test("handleComboChat records per-target metrics separately when the same model repeats with different accounts", async () => { const calls: any[] = []; const combo = { name: "per-target-repeat", strategy: "priority", models: [ { kind: "model", providerId: "openai", model: "openai/gpt-4o-mini", connectionId: "conn-openai-a", label: "Account A", }, { kind: "model", providerId: "openai", model: "openai/gpt-4o-mini", connectionId: "conn-openai-b", label: "Account B", }, ], config: { maxRetries: 0 }, }; const result = await handleComboChat({ body: {}, combo, handleSingleModel: async (_body: any, modelStr: any, target: any) => { calls.push(`${modelStr}:${target?.connectionId || "none"}`); if (target?.connectionId === "conn-openai-a") { return errorResponse(503, "account-a down"); } return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const firstStep = normalizeComboStep(combo.models[0], { comboName: combo.name, index: 0, }); const secondStep = normalizeComboStep(combo.models[1], { comboName: combo.name, index: 1, }); const metrics = getComboMetrics(combo.name); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/gpt-4o-mini:conn-openai-a", "openai/gpt-4o-mini:conn-openai-b"]); assert.equal(metrics.byModel["openai/gpt-4o-mini"].requests, 2); assert.equal(metrics.byTarget[firstStep.id].failures, 1); assert.equal(metrics.byTarget[firstStep.id].connectionId, "conn-openai-a"); assert.equal(metrics.byTarget[secondStep.id].successes, 1); assert.equal(metrics.byTarget[secondStep.id].connectionId, "conn-openai-b"); }); test("handleComboChat preserves the first failure status but surfaces the last error message", async () => { const result = await handleComboChat({ body: {}, combo: { name: "all-fail", strategy: "priority", models: ["model-a", "model-b"], config: { maxRetries: 0 }, }, handleSingleModel: async (_body: any, modelStr: any) => { return errorResponse(modelStr === "model-a" ? 500 : 429, `fail:${modelStr}`); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 500); assert.equal(payload.error.message, "fail:model-b"); }); test("handleComboChat round-robin rotates sequentially across requests", async () => { const calls: any[] = []; const combo = { name: "rr-sequence", strategy: "round-robin", models: ["model-a", "model-b"], config: { maxRetries: 0, concurrencyPerModel: 1, queueTimeoutMs: 1000 }, }; for (let i = 0; i < 3; i++) { const result = await handleComboChat({ body: {}, combo, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); } assert.deepEqual(calls, ["model-a", "model-b", "model-a"]); }); test("handleComboChat round-robin starts from composite tier default ordering", async () => { const calls: any[] = []; const combo = { name: "rr-composite-order", strategy: "round-robin", models: [ { kind: "model", id: "step-primary", providerId: "openai", model: "openai/gpt-4o-mini", }, { kind: "model", id: "step-backup", providerId: "anthropic", model: "claude/sonnet", }, ], config: { maxRetries: 0, concurrencyPerModel: 1, queueTimeoutMs: 1000, compositeTiers: { defaultTier: "backup", tiers: { backup: { stepId: "step-backup", fallbackTier: "primary", }, primary: { stepId: "step-primary", }, }, }, }, }; for (let i = 0; i < 2; i++) { const result = await handleComboChat({ body: {}, combo, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); } assert.deepEqual(calls, ["claude/sonnet", "openai/gpt-4o-mini"]); }); test("combo helpers short-circuit safely for missing combos, cycles, and excessive depth", () => { assert.equal(getComboFromData("missing", null), null); assert.equal(getComboModelsFromData("missing", { combos: [] }), null); assert.doesNotThrow(() => validateComboDAG("ghost", { combos: [{ name: "alpha", models: ["openai/gpt-4o-mini"] }], }) ); assert.doesNotThrow(() => validateComboDAG("empty", [{ name: "empty" }])); assert.deepEqual( resolveNestedComboModels( { name: "loop", models: ["model-a", "model-b"] }, [], new Set(["loop"]) ), [] ); assert.deepEqual( resolveNestedComboModels( { name: "deep", models: ["model-a", { model: "model-b", weight: 2 }] }, [], new Set(), 99 ), ["model-a", "model-b"] ); }); test("handleComboChat accepts binary and Responses-style 200 bodies but falls through malformed success payloads", async () => { const binaryResult = await handleComboChat({ body: {}, combo: { name: "quality-binary", strategy: "priority", models: ["model-a"], config: { maxRetries: 0 }, }, handleSingleModel: async () => new Response("binary-payload", { status: 200, headers: { "content-type": "application/octet-stream" }, }), isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(binaryResult.ok, true); assert.equal(await binaryResult.text(), "binary-payload"); const responsesResult = await handleComboChat({ body: {}, combo: { name: "quality-responses", strategy: "priority", models: ["model-a"], config: { maxRetries: 0 }, }, handleSingleModel: async () => okResponse({ output: [{ type: "output_text", text: "done" }], }), isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(responsesResult.ok, true); const calls: any[] = []; const malformedResult = await handleComboChat({ body: {}, combo: { name: "quality-malformed", strategy: "priority", models: ["model-a", "model-b", "model-c"], config: { maxRetries: 0 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "model-a") { return new Response("", { status: 200, headers: { "content-type": "application/json" }, }); } if (modelStr === "model-b") { return okResponse({ choices: [{}] }); } return okResponse({ choices: [{ message: { content: "recovered" } }] }); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(malformedResult.ok, true); assert.deepEqual(calls, ["model-a", "model-b", "model-c"]); }); test("handleComboChat accepts text-mode SSE payloads as valid non-streaming passthrough responses", async () => { const result = await handleComboChat({ body: {}, combo: { name: "quality-sse-data", strategy: "priority", models: ["model-a"], config: { maxRetries: 0 }, }, handleSingleModel: async () => new Response('data: {"choices":[{"delta":{"content":"hello"}}]}\n\n', { status: 200, headers: { "content-type": "text/plain" }, }), isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.match(await result.text(), /^data:/); }); test("handleComboChat falls through invalid JSON and embedded 200 error bodies before succeeding", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "quality-invalid-json-and-error", strategy: "priority", models: ["model-a", "model-b", "model-c"], config: { maxRetries: 0 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "model-a") { return new Response("{bad-json", { status: 200, headers: { "content-type": "text/plain" }, }); } if (modelStr === "model-b") { return new Response(JSON.stringify({ error: { message: "embedded upstream failure" } }), { status: 200, headers: { "content-type": "application/json" }, }); } return okResponse({ choices: [{ delta: { content: "recovered" } }] }); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["model-a", "model-b", "model-c"]); }); test("handleComboChat returns the earliest retry-after when all priority targets are rate-limited", async () => { const soon = new Date(Date.now() + 1_000).toISOString(); const later = new Date(Date.now() + 5_000).toISOString(); const result = await handleComboChat({ body: {}, combo: { name: "priority-retry-after", strategy: "priority", models: ["model-a", "model-b"], }, handleSingleModel: async (_body: any, modelStr: any) => new Response( JSON.stringify({ error: { message: `limited:${modelStr}` }, retryAfter: modelStr === "model-a" ? later : soon, }), { status: 429, headers: { "content-type": "application/json" }, } ), isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { maxRetries: 0, retryDelayMs: 1 }, }, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 429); assert.match(payload.error.message, /limited:model-b/); assert.ok(Number(result.headers.get("Retry-After")) >= 1); }); test("handleComboChat returns 404 model_not_found when a combo has no executable targets", async () => { const result = await handleComboChat({ body: {}, combo: { name: "empty-priority", strategy: "priority", models: [], }, handleSingleModel: async () => { throw new Error("handleSingleModel should not run for empty combos"); }, isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { maxRetries: 0, retryDelayMs: 1, }, }, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 404); assert.equal(payload.error.code, "model_not_found"); assert.match(payload.error.message, /Combo has no executable targets/); }); test("handleComboChat round-robin returns 404 when no models are configured", async () => { const result = await handleComboChat({ body: {}, combo: { name: "rr-empty", strategy: "round-robin", models: [], }, handleSingleModel: async () => { throw new Error("handleSingleModel should not run for empty round-robin combos"); }, isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { concurrencyPerModel: 1, queueTimeoutMs: 5, maxRetries: 0, retryDelayMs: 1, }, }, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 404); assert.equal(payload.error.code, "model_not_found"); assert.match(payload.error.message, /Round-robin combo has no executable targets/); }); test("handleComboChat round-robin falls through semaphore timeouts and malformed success payloads", async () => { const release = await acquireSemaphore( getComboTargetExecutionKey("rr-timeout-fallback", 0, "model-a"), { maxConcurrency: 1, timeoutMs: 100, } ); const calls: any[] = []; try { const result = await handleComboChat({ body: {}, combo: { name: "rr-timeout-fallback", strategy: "round-robin", models: ["model-a", "model-b", "model-c"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "model-b") { return okResponse({ choices: [{}] }); } return okResponse({ choices: [{ message: { content: "rr ok" } }] }); }, isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { concurrencyPerModel: 1, queueTimeoutMs: 5, maxRetries: 0, retryDelayMs: 1, }, }, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["model-b", "model-c"]); } finally { release(); } }); test("handleComboChat round-robin surfaces retry-after metadata after exhausting all models", async () => { const sooner = new Date(Date.now() + 1_500).toISOString(); const later = new Date(Date.now() + 7_000).toISOString(); const result = await handleComboChat({ body: {}, combo: { name: "rr-retry-after", strategy: "round-robin", models: ["model-a", "model-b"], }, handleSingleModel: async (_body: any, modelStr: any) => new Response( JSON.stringify({ error: { message: `rr-limited:${modelStr}` }, retryAfter: modelStr === "model-a" ? later : sooner, }), { status: 429, headers: { "content-type": "application/json" }, } ), isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { concurrencyPerModel: 1, queueTimeoutMs: 5, maxRetries: 0, retryDelayMs: 1, }, }, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 429); assert.match(payload.error.message, /rr-limited:model-b/); assert.ok(Number(result.headers.get("Retry-After")) >= 1); }); test("handleComboChat falls through generic 400s when a later priority target succeeds", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "priority-generic-400-recover", strategy: "priority", models: ["provider-a/model-a", "provider-b/model-b"], config: { maxRetries: 0, retryDelayMs: 1 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "provider-a/model-a") { return new Response(JSON.stringify({ error: { message: "Instructions are required" } }), { status: 400, headers: { "content-type": "application/json" }, }); } return okResponse({ choices: [{ message: { content: "recovered" } }] }); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 200); assert.equal(payload.choices[0].message.content, "recovered"); assert.deepEqual(calls, ["provider-a/model-a", "provider-b/model-b"]); }); test("handleComboChat preserves fallback request bodies when zero-latency optimizations are disabled", async () => { const longToolOutput = "x".repeat(2500); let fallbackBody: any = null; const result = await handleComboChat({ body: { messages: [ { role: "user", content: "please inspect this output" }, { role: "tool", content: longToolOutput }, ], }, combo: { name: "zero-latency-disabled-preserves-body", strategy: "priority", models: ["provider-a/model-a", "provider-b/model-b"], config: { maxRetries: 0, retryDelayMs: 1, fallbackCompressionMode: "lite", fallbackCompressionThreshold: 1, }, }, handleSingleModel: async (requestBody: any, modelStr: any) => { if (modelStr === "provider-a/model-a") { return errorResponse(500, "first target failed"); } fallbackBody = requestBody; return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.status, 200); assert.equal(fallbackBody.messages[1].content, longToolOutput); }); test("handleComboChat applies fallback compression only after explicit zero-latency opt-in", async () => { const longToolOutput = "x".repeat(2500); let fallbackBody: any = null; const result = await handleComboChat({ body: { messages: [ { role: "user", content: "please inspect this output" }, { role: "tool", content: longToolOutput }, ], }, combo: { name: "zero-latency-enabled-compresses-fallback", strategy: "priority", models: ["provider-a/model-a", "provider-b/model-b"], config: { maxRetries: 0, retryDelayMs: 1, zeroLatencyOptimizationsEnabled: true, fallbackCompressionMode: "lite", fallbackCompressionThreshold: 1, }, }, handleSingleModel: async (requestBody: any, modelStr: any) => { if (modelStr === "provider-a/model-a") { return errorResponse(500, "first target failed"); } fallbackBody = requestBody; return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.status, 200); const fallbackToolContent = fallbackBody.messages[1].content; assert.equal(typeof fallbackToolContent, "string"); assert.ok(fallbackToolContent.length < longToolOutput.length); assert.match(fallbackToolContent, /truncated/i); }); test("handleComboChat suppresses hedging unless zero-latency optimizations are enabled", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "hedging-disabled-with-subfeature-set", strategy: "priority", models: ["model-a", "model-b"], config: { maxRetries: 0, retryDelayMs: 1, hedging: true, hedgeDelayMs: 1, }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); await new Promise((resolve) => setTimeout(resolve, 20)); return okResponse({ choices: [{ message: { content: modelStr } }] }); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 200); assert.equal(payload.choices[0].message.content, "model-a"); assert.deepEqual(calls, ["model-a"]); }); test("handleComboChat starts hedged fallback only after explicit zero-latency opt-in", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "hedging-enabled-with-zero-latency", strategy: "priority", models: ["model-a", "model-b"], config: { maxRetries: 0, retryDelayMs: 1, zeroLatencyOptimizationsEnabled: true, hedging: true, hedgeDelayMs: 1, }, }, handleSingleModel: async (_body: any, modelStr: any, target: any) => { calls.push(modelStr); if (modelStr === "model-a") { await new Promise((resolve) => { const timer = setTimeout(resolve, 100); target?.modelAbortSignal?.addEventListener( "abort", () => { clearTimeout(timer); resolve(undefined); }, { once: true } ); }); return okResponse({ choices: [{ message: { content: "slow" } }] }); } return okResponse({ choices: [{ message: { content: "fast" } }] }); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 200); assert.equal(payload.choices[0].message.content, "fast"); assert.deepEqual(calls, ["model-a", "model-b"]); }); test("handleComboChat round-robin falls through generic 400s when a later model succeeds", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "rr-generic-400-recover", strategy: "round-robin", models: ["model-a", "model-b"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "model-a") { return new Response(JSON.stringify({ error: { message: "generic bad request" } }), { status: 400, headers: { "content-type": "application/json" }, }); } return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { concurrencyPerModel: 1, queueTimeoutMs: 5, maxRetries: 0, retryDelayMs: 1, }, }, relayOptions: null as any, allCombos: null, }); assert.equal(result.status, 200); assert.deepEqual(calls, ["model-a", "model-b"]); }); test("handleComboChat round-robin falls through 400s and returns the final error payload when no target recovers", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "rr-provider-scoped-400-fallback", strategy: "round-robin", models: ["model-a", "model-b"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "model-a") { return new Response( JSON.stringify({ error: { message: "unsupported message role for this provider" } }), { status: 400, headers: { "content-type": "application/json" }, } ); } return errorResponse(500, "rr-final-fail"); }, isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { concurrencyPerModel: 1, queueTimeoutMs: 5, maxRetries: 0, retryDelayMs: 1, }, }, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 400); assert.equal(payload.error.message, "rr-final-fail"); assert.deepEqual(calls, ["model-a", "model-b"]); }); test("handleComboChat strict-random uses the shared deck without repeating within a cycle", async () => { const calls: any[] = []; const combo = { name: "strict-random-deck", strategy: "strict-random", models: ["model-a", "model-b", "model-c"], }; for (let i = 0; i < 3; i++) { const result = await handleComboChat({ body: {}, combo, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); } assert.equal(new Set(calls).size, 3); }); test("handleComboChat cost-optimized orders models by the cheapest configured input price", async () => { await settingsDb.updatePricing({ openai: { "gpt-4o-mini": { input: 5, output: 10 }, "gpt-4o": { input: 1, output: 2 }, "gpt-4o-nano": { input: 0.1, output: 0.2 }, }, }); const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "cost-optimized-combo", strategy: "cost-optimized", models: ["openai/gpt-4o-mini", "openai/gpt-4o", "openai/gpt-4o-nano"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.equal(calls[0], "openai/gpt-4o-nano"); }); test("handleComboChat weighted strategy resolves nested combos before falling back to the next weighted target", async () => { const calls: any[] = []; _setSecureRandomFloatSource(() => 0.01); try { const result = await handleComboChat({ body: {}, combo: { name: "weighted-nested-selection", strategy: "weighted", models: [ { model: "nested-priority", weight: 9 }, { model: "model-c", weight: 1 }, ], config: { maxRetries: 0 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "model-a") return errorResponse(500, "nested-first-fail"); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: [ { name: "weighted-nested-selection", models: [ { model: "nested-priority", weight: 9 }, { model: "model-c", weight: 1 }, ], }, { name: "nested-priority", models: ["model-a", "model-b"] }, ], }); assert.equal(result.ok, true); assert.deepEqual(calls, ["model-a", "model-b"]); } finally { _setSecureRandomFloatSource(null); } }); test("handleComboChat context-optimized orders models by the largest synced context window", async () => { saveModelsDevCapabilities({ openai: { "gpt-4o-mini": capabilityEntry(128000), "gpt-4o": capabilityEntry(64000), "gpt-4o-max": capabilityEntry(256000), }, }); const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "context-optimized-combo", strategy: "context-optimized", models: ["openai/gpt-4o-mini", "openai/gpt-4o", "openai/gpt-4o-max"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.equal(calls[0], "openai/gpt-4o-max"); }); test("handleComboChat context-optimized preserves order when all context limits are unknown", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "context-optimized-unknown", strategy: "context-optimized", models: ["unknown/model-a", "unknown/model-b"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["unknown/model-a"]); }); test("handleComboChat skips fallback targets with too small context windows", async () => { saveModelsDevCapabilities({ openai: { "tiny-context": capabilityEntry(32), "large-context": capabilityEntry(4096), }, }); const calls: any[] = []; const result = await handleComboChat({ body: { messages: [{ role: "user", content: "x".repeat(800) }], }, combo: { name: "context-aware-fallback-context", strategy: "priority", models: ["openai/tiny-context", "openai/large-context"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/large-context"]); }); test("handleComboChat skips tool, vision, and structured-output incompatible fallbacks", async () => { saveModelsDevCapabilities({ openai: { "no-tools": capabilityEntry(128000, { tool_call: false, attachment: true, structured_output: true, modalities_input: JSON.stringify(["text", "image"]), }), "no-vision": capabilityEntry(128000, { tool_call: true, attachment: false, structured_output: true, modalities_input: JSON.stringify(["text"]), }), "no-json": capabilityEntry(128000, { tool_call: true, attachment: true, structured_output: false, modalities_input: JSON.stringify(["text", "image"]), }), compatible: capabilityEntry(128000, { tool_call: true, attachment: true, structured_output: true, modalities_input: JSON.stringify(["text", "image"]), }), }, }); const calls: any[] = []; const result = await handleComboChat({ body: { messages: [ { role: "user", content: [ { type: "text", text: "Describe this image and return JSON." }, { type: "image_url", image_url: { url: "data:image/png;base64,AAAA" } }, ], }, ], tools: [{ type: "function", function: { name: "save", parameters: {} } }], response_format: { type: "json_schema", json_schema: { name: "result", schema: {} } }, }, combo: { name: "context-aware-fallback-capabilities", strategy: "priority", models: ["openai/no-tools", "openai/no-vision", "openai/no-json", "openai/compatible"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/compatible"]); }); test("handleComboChat preserves strategy order when context-aware filtering rejects all targets", async () => { saveModelsDevCapabilities({ openai: { "no-tools-a": capabilityEntry(128000, { tool_call: false }), "no-tools-b": capabilityEntry(128000, { tool_call: false }), }, }); const calls: any[] = []; const result = await handleComboChat({ body: { messages: [{ role: "user", content: "Use a tool." }], tools: [{ type: "function", function: { name: "lookup", parameters: {} } }], }, combo: { name: "context-aware-fallback-full-filter", strategy: "priority", models: ["openai/no-tools-a", "openai/no-tools-b"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/no-tools-a"]); }); test("handleComboChat eval-driven routing prioritizes higher scoring evaluated targets", async () => { evalsDb.saveEvalRun({ suiteId: "routing-quality", suiteName: "Routing Quality", target: { type: "model", id: "openai/eval-low", label: "Model: openai/eval-low" }, summary: { total: 10, passed: 4, failed: 6, passRate: 40 }, avgLatencyMs: 100, results: [], createdAt: new Date().toISOString(), }); evalsDb.saveEvalRun({ suiteId: "routing-quality", suiteName: "Routing Quality", target: { type: "model", id: "openai/eval-high", label: "Model: openai/eval-high" }, summary: { total: 10, passed: 9, failed: 1, passRate: 90 }, avgLatencyMs: 120, results: [], createdAt: new Date().toISOString(), }); const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "eval-driven-priority", strategy: "priority", models: ["openai/eval-low", "openai/eval-high"], config: { evalRouting: { enabled: true, suiteIds: ["routing-quality"], qualityWeight: 1, latencyWeight: 0, }, }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/eval-high"]); }); test("handleComboChat eval-driven routing ignores stale and undersized eval runs", async () => { evalsDb.saveEvalRun({ suiteId: "routing-quality", suiteName: "Routing Quality", target: { type: "model", id: "openai/stale-good", label: "Model: openai/stale-good" }, summary: { total: 10, passed: 10, failed: 0, passRate: 100 }, avgLatencyMs: 50, results: [], createdAt: "2020-01-01T00:00:00.000Z", }); evalsDb.saveEvalRun({ suiteId: "routing-quality", suiteName: "Routing Quality", target: { type: "model", id: "openai/small-good", label: "Model: openai/small-good" }, summary: { total: 1, passed: 1, failed: 0, passRate: 100 }, avgLatencyMs: 50, results: [], createdAt: new Date().toISOString(), }); const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "eval-driven-ignored-runs", strategy: "priority", models: ["openai/stale-good", "openai/small-good", "openai/no-evals"], config: { evalRouting: { enabled: true, suiteIds: ["routing-quality"], maxAgeHours: 24, minCases: 5, qualityWeight: 1, latencyWeight: 0, }, }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/stale-good"]); }); test("handleComboChat eval-driven routing can match bare model eval target ids", async () => { evalsDb.saveEvalRun({ suiteId: "routing-quality", suiteName: "Routing Quality", target: { type: "model", id: "bare-high", label: "Model: bare-high" }, summary: { total: 8, passed: 8, failed: 0, passRate: 100 }, avgLatencyMs: 200, results: [], createdAt: new Date().toISOString(), }); const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "eval-driven-bare-model-id", strategy: "priority", models: ["openai/bare-low", "openai/bare-high"], config: { evalRouting: { enabled: true, suiteIds: ["routing-quality"], qualityWeight: 1, latencyWeight: 0, }, }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/bare-high"]); }); test("handleComboChat normalizes legacy strategy names at runtime", async () => { const usageCalls: any[] = []; recordComboRequest("legacy-usage-combo", "model-a", { success: true, latencyMs: 100, strategy: "least-used", }); await handleComboChat({ body: {}, combo: { name: "legacy-usage-combo", strategy: "usage", models: ["model-a", "model-b"], }, handleSingleModel: async (_body: any, modelStr: any) => { usageCalls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.deepEqual(usageCalls, ["model-b"]); }); test("handleComboChat returns a 503 when every model is unavailable before execution", async () => { const result = await handleComboChat({ body: {}, combo: { name: "inactive-accounts", strategy: "priority", models: ["openai/model-a", "openai/model-b"], }, handleSingleModel: async () => { throw new Error("handleSingleModel should not run when all models are inactive"); }, isModelAvailable: async () => false, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 503); assert.equal(payload.error.code, "ALL_ACCOUNTS_INACTIVE"); }); test("handleComboChat treats provider circuit breaker responses as ordinary target failures", async () => { const calls = []; const result = await handleComboChat({ body: {}, combo: { name: "provider-breaker-open", strategy: "priority", models: ["openai/model-a", "openai/model-b"], config: { maxRetries: 0 }, }, handleSingleModel: async (_body, modelStr) => { calls.push(modelStr); if (modelStr === "openai/model-a") { return providerBreakerOpenResponse(); } return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/model-a", "openai/model-b"]); }); test("handleComboChat auto strategy honors LKGP after filtering to tool-capable models", async () => { await settingsDb.setLKGP("auto-lkgp", "auto-lkgp", "claude"); const calls: any[] = []; const result = await handleComboChat({ body: { messages: [{ role: "user", content: "Write code using a tool" }], tools: [{ type: "function", function: { name: "lookup_weather" } }], }, combo: { id: "auto-lkgp", name: "auto-lkgp", strategy: "auto", models: ["openai/gpt-oss-120b", "openai/gpt-4o-mini", "claude/claude-sonnet-4-6"], autoConfig: { routerStrategy: "lkgp" }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.equal(calls[0], "claude/claude-sonnet-4-6"); }); test("handleComboChat auto strategy preserves selected same-provider connection identity", async () => { const connA = await providersDb.createProviderConnection({ provider: "openai", authType: "apikey", name: "OpenAI A", apiKey: "sk-auto-conn-a", defaultModel: "gpt-4o-mini", }); const connB = await providersDb.createProviderConnection({ provider: "openai", authType: "apikey", name: "OpenAI B", apiKey: "sk-auto-conn-b", defaultModel: "gpt-4o-mini", }); touchSession("sticky-auto-session", connB.id); const calls: Array<{ modelStr: string; connectionId: string | null | undefined }> = []; const result = await handleComboChat({ body: { messages: [{ role: "user", content: "Continue the existing conversation" }] }, combo: { id: "auto-same-provider-connection", name: "auto-same-provider-connection", strategy: "auto", models: [ { kind: "model", providerId: "openai", model: "openai/gpt-4o-mini", connectionId: connA.id, label: "OpenAI A", }, { kind: "model", providerId: "openai", model: "openai/gpt-4o-mini", connectionId: connB.id, label: "OpenAI B", }, ], autoConfig: { candidatePool: ["openai"], explorationRate: 0, weights: { quota: 0, health: 0, costInv: 0, latencyInv: 0, taskFit: 0, stability: 0, tierPriority: 0, tierAffinity: 0, specificityMatch: 0, contextAffinity: 1, resetWindowAffinity: 0, connectionDensity: 0, }, }, }, handleSingleModel: async (_body: any, modelStr: any, target: any) => { calls.push({ modelStr, connectionId: target?.connectionId }); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: { sessionId: "sticky-auto-session" } as any, allCombos: null, }); assert.equal(result.ok, true); assert.equal(calls.length, 1, "successful auto dispatch should call exactly one selected target"); assert.deepEqual(calls, [ { modelStr: "openai/gpt-4o-mini", connectionId: connB.id, }, ]); }); test("handleComboChat standalone lkgp strategy prioritizes the last known good provider", async () => { await settingsDb.setLKGP("standalone-lkgp", "standalone-lkgp", "anthropic"); const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { id: "standalone-lkgp", name: "standalone-lkgp", strategy: "lkgp", models: ["openai/gpt-4o-mini", "anthropic/claude-sonnet-4-6"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.equal(calls[0], "anthropic/claude-sonnet-4-6"); }); test("handleComboChat standalone lkgp strategy falls back to original order when no state exists", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { id: "standalone-lkgp-no-state", name: "standalone-lkgp-no-state", strategy: "lkgp", models: ["openai/gpt-4o-mini", "anthropic/claude-sonnet-4-6"], }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.equal(calls[0], "openai/gpt-4o-mini"); }); test("handleComboChat standalone lkgp strategy updates LKGP after a successful call", async () => { const result = await handleComboChat({ body: {}, combo: { id: "standalone-lkgp-save", name: "standalone-lkgp-save", strategy: "lkgp", models: ["openai/gpt-4o-mini"], }, handleSingleModel: async () => okResponse(), isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); // Give the async fire-and-forget LKGP update a chance to execute let persistedProvider: any = null; for (let i = 0; i < 20; i++) { persistedProvider = await settingsDb.getLKGP("standalone-lkgp-save", "standalone-lkgp-save"); if (persistedProvider?.provider === "openai") { break; } await new Promise((resolve) => setTimeout(resolve, 10)); } assert.equal(result.ok, true); // getLKGP now returns LKGPRecord | null — source: src/lib/db/settings.ts getLKGP() assert.equal(persistedProvider?.provider, "openai"); }); test("handleComboChat auto strategy falls back to the full pool when tool filtering empties candidates", async () => { await settingsDb.updatePricing({ openai: { "gpt-oss-120b": { input: 5, output: 10 }, }, deepseek: { reasoner: { input: 0.1, output: 0.2 }, }, }); const calls: any[] = []; const result = await handleComboChat({ body: { input: [{ role: "user", text: "Summarize this request" }], tools: [{ type: "function", function: { name: "unsupported_tool" } }], }, combo: { name: "auto-cost-fallback", strategy: "auto", models: ["openai/gpt-oss-120b", "deepseek/reasoner"], autoConfig: { routerStrategy: "cost" }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: { intentSimpleMaxWords: 5, intentExtraSimpleKeywords: "summarize, brief", }, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.equal(calls[0], "deepseek/reasoner"); }); test("handleComboChat auto strategy falls back to rules when a custom router strategy throws", async () => { registerStrategy("throwing-test", { name: "throwing-test", description: "test strategy that always throws", select() { throw new Error("synthetic router failure"); }, }); const log = createLog(); const calls: any[] = []; const result = await handleComboChat({ body: { prompt: "Hello there" }, combo: { name: "auto-throwing-strategy", strategy: "auto", models: ["openai/gpt-4o-mini"], autoConfig: { routerStrategy: "throwing-test" }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log, settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/gpt-4o-mini"]); assert.ok( log.entries.some( (entry) => entry.level === "warn" && /falling back to rules/i.test(String(entry.msg)) ) ); }); test("handleComboChat auto strategy reads strategyName from combo.config.auto and can prefer latency", async () => { const calls: any[] = []; const result = await handleComboChat({ body: { prompt: "Just answer briefly" }, combo: { name: "auto-latency-strategy-name", strategy: "auto", models: ["openai/gpt-4o-mini", "gemini/gemini-2.5-flash"], config: { auto: { strategyName: "latency", }, }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.equal(calls[0], "gemini/gemini-2.5-flash"); }); test("handleComboChat auto strategy can route by SLA targets", async () => { const calls: any[] = []; const log = createLog(); const result = await handleComboChat({ body: { prompt: "Keep this response fast and reliable" }, combo: { name: "auto-sla-aware", strategy: "auto", models: ["openai/gpt-4o-mini", "gemini/gemini-2.5-flash", "claude/claude-sonnet-4-6"], autoConfig: { routerStrategy: "sla-aware", slaTargetP95Ms: 1500, slaMaxErrorRate: 0.05, }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse(); }, isModelAvailable: async () => true, log, settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.equal(calls[0], "gemini/gemini-2.5-flash"); assert.ok( log.entries.some( (entry) => entry.level === "info" && /strategy=sla-aware/i.test(String(entry.msg)) ) ); }); test("handleComboChat context cache protection pins the model and tags tool-call responses", async () => { // PR #3399: tag extraction replaced by server-side session pinning. // combo uses priority order; the tag in the input message is stripped but no // longer drives routing. No tag is injected in responses. const calls: any[] = []; const result = await handleComboChat({ body: { model: "openai/gpt-4o-mini", messages: [ { role: "assistant", content: "cached\nclaude/claude-sonnet-4-6", }, ], }, combo: { name: "context-cache-pinned", strategy: "priority", models: ["openai/gpt-4o-mini", "claude/claude-sonnet-4-6"], context_cache_protection: true, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); return okResponse({ choices: [ { message: { role: "assistant", tool_calls: [ { id: "call_1", type: "function", function: { name: "lookup_weather", arguments: "{}" }, }, ], }, }, ], }); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.ok, true); // Server-side pinning: routes via priority order, not the tag. assert.deepEqual(calls, ["openai/gpt-4o-mini"]); // No tag injected into response content (replaced by session store). assert.ok(!payload.choices[0].message.content); }); test("handleComboChat context cache protection does not inject omniModel tag in streamed output", async () => { // PR #3399: tag injection in stream output removed (server-side session pinning). const result = await handleComboChat({ body: { stream: true, messages: [{ role: "user", content: "stream it" }] }, combo: { name: "context-cache-stream", strategy: "priority", models: ["openai/gpt-4o-mini"], context_cache_protection: true, }, handleSingleModel: async () => streamResponse([ 'data: {"choices":[{"index":0,"delta":{"content":"hello world"},"finish_reason":null}]}\n\n', 'data: {"choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}\n\n', "data: [DONE]\n\n", ]), isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const text = await result.text(); assert.equal(result.ok, true); assert.match(text, /hello world/); assert.doesNotMatch(text, //); }); test("handleComboChat context cache protection does not inject tag for tool-call-only streams", async () => { // PR #3399: tag injection removed; tool-call streams pass through unmodified. const result = await handleComboChat({ body: { stream: true, messages: [{ role: "user", content: "tool only" }] }, combo: { name: "context-cache-tool-stream", strategy: "priority", models: ["openai/gpt-4o-mini"], context_cache_protection: true, }, handleSingleModel: async () => streamResponse([ 'data: {"choices":[{"index":0,"delta":{"tool_calls":[{"index":0,"id":"call_1","type":"function","function":{"name":"lookup","arguments":"{}"}}]},"finish_reason":null}]}\n\n', 'data: {"choices":[{"index":0,"delta":{},"finish_reason":"tool_calls"}]}\n\n', "data: [DONE]\n\n", ]), isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const text = await result.text(); assert.equal(result.ok, true); assert.match(text, /"finish_reason":"tool_calls"/); assert.doesNotMatch(text, //); }); test("handleComboChat context cache protection flushes cleanly when a stream ends without content", async () => { // PR #3399: no tag injected; empty stream passes through [DONE] unchanged. const result = await handleComboChat({ body: { stream: true, messages: [{ role: "user", content: "empty stream" }] }, combo: { name: "context-cache-empty-stream", strategy: "priority", models: ["openai/gpt-4o-mini"], context_cache_protection: true, }, handleSingleModel: async () => streamResponse(["data: [DONE]\n\n"]), isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const text = await result.text(); assert.equal(result.ok, true); assert.match(text, /data: \[DONE\]/); assert.doesNotMatch(text, //); }); test("handleComboChat round-robin resolves nested combos and returns inactive when every target is skipped", async () => { const result = await handleComboChat({ body: {}, combo: { name: "rr-nested-inactive", strategy: "round-robin", models: ["nested-combo"], }, handleSingleModel: async () => { throw new Error("round-robin should not execute when all nested targets are inactive"); }, isModelAvailable: async () => false, log: createLog(), settings: null, relayOptions: null as any, allCombos: [ { name: "rr-nested-inactive", models: ["nested-combo"] }, { name: "nested-combo", models: ["openai/model-a"] }, ], }); const payload = (await result.json()) as any; assert.equal(result.status, 503); assert.equal(payload.error.code, "ALL_ACCOUNTS_INACTIVE"); }); test("handleComboChat round-robin treats provider circuit breaker responses as ordinary target failures", async () => { const calls = []; const result = await handleComboChat({ body: {}, combo: { name: "rr-provider-breaker-open", strategy: "round-robin", models: ["openai/model-a", "openai/model-b"], config: { maxRetries: 0 }, }, handleSingleModel: async (_body, modelStr) => { calls.push(modelStr); if (modelStr === "openai/model-a") { return providerBreakerOpenResponse(); } return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/model-a", "openai/model-b"]); }); test("handleComboChat round-robin retries a transient failure on the same model before succeeding", async () => { const calls: any[] = []; let attempts = 0; const result = await handleComboChat({ body: {}, combo: { name: "rr-same-model-retry", strategy: "round-robin", models: ["model-a"], config: { maxRetries: 1, retryDelayMs: 1, concurrencyPerModel: 1, queueTimeoutMs: 5 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); attempts += 1; if (attempts === 1) return errorResponse(503, "try again"); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["model-a", "model-a"]); }); test("handleComboChat round-robin recovers from 400s when a later model succeeds", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "rr-provider-400-recover", strategy: "round-robin", models: ["model-a", "model-b"], config: { maxRetries: 0, retryDelayMs: 1, concurrencyPerModel: 1, queueTimeoutMs: 5 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "model-a") { return new Response( JSON.stringify({ error: { message: "unsupported message role for this provider" } }), { status: 400, headers: { "content-type": "application/json" }, } ); } return okResponse({ choices: [{ message: { content: "recovered" } }] }); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); assert.equal(result.ok, true); assert.deepEqual(calls, ["model-a", "model-b"]); }); test("handleComboChat single-target quality failure returns explicit quality error instead of ALL_ACCOUNTS_INACTIVE", async () => { const result = await handleComboChat({ body: {}, combo: { name: "single-target-quality-failure", strategy: "priority", models: ["openai/model-a"], config: { maxRetries: 0 }, }, handleSingleModel: async () => new Response('{"choices":[{"message":{"content":"unterminated"}}', { status: 200, headers: { "content-type": "application/json" }, }), isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 502); assert.match(payload.error.message, /quality validation/i); assert.notEqual(payload.error.code, "ALL_ACCOUNTS_INACTIVE"); }); test("handleComboChat round-robin single-target quality failure returns explicit quality error instead of ALL_ACCOUNTS_INACTIVE", async () => { const result = await handleComboChat({ body: {}, combo: { name: "rr-single-target-quality-failure", strategy: "round-robin", models: ["openai/model-a"], config: { maxRetries: 0, retryDelayMs: 1, concurrencyPerModel: 1, queueTimeoutMs: 5 }, }, handleSingleModel: async () => new Response('{"choices":[{"message":{"content":"unterminated"}}', { status: 200, headers: { "content-type": "application/json" }, }), isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.status, 502); assert.match(payload.error.message, /quality validation/i); assert.notEqual(payload.error.code, "ALL_ACCOUNTS_INACTIVE"); }); test("handleComboChat falls back to next model when first model returns all-accounts-rate-limited 503", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "all-accounts-rate-limited-fallback", strategy: "priority", models: ["model-a", "model-b"], config: { maxRetries: 0 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "model-b") { return okResponse({ choices: [{ message: { content: "ok" } }] }); } // Simulate handleNoCredentials returning a 503 with "unavailable" message // This is the signal emitted when getProviderCredentialsWithQuotaPreflight exhausts all accounts return new Response( JSON.stringify({ error: { message: `[provider/model] Service temporarily unavailable` } }), { status: 503, headers: { "content-type": "application/json" }, } ); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; // First model returns 503 with "unavailable" → combo should try model-b next // If the fix is not applied, combo would abort here and return 503 immediately assert.equal(result.ok, true); assert.deepEqual(calls, ["model-a", "model-b"]); assert.equal(payload.choices[0].message.content, "ok"); }); test("handleComboChat round-robin falls back when all-accounts-rate-limited 503 is returned", async () => { const calls: any[] = []; // Use distinct provider prefixes so #1731 exhaustedProviders does not block model-b // (getTargetProvider("openai/model-a") → "openai"; getTargetProvider("anthropic/model-b") → "anthropic") const result = await handleComboChat({ body: {}, combo: { name: "rr-all-accounts-rate-limited", strategy: "round-robin", models: ["openai/model-a", "anthropic/model-b"], config: { maxRetries: 0, retryDelayMs: 1, concurrencyPerModel: 1, queueTimeoutMs: 5 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); if (modelStr === "anthropic/model-b") { return okResponse({ choices: [{ message: { content: "ok" } }] }); } // Simulate all accounts rate-limited — handleNoCredentials signal return new Response( JSON.stringify({ error: { message: `[provider/model] Service temporarily unavailable` } }), { status: 503, headers: { "content-type": "application/json" }, } ); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; assert.equal(result.ok, true); assert.deepEqual(calls, ["openai/model-a", "anthropic/model-b"]); assert.equal(payload.choices[0].message.content, "ok"); }); test("handleComboChat aborts combo when 503 response does NOT contain the unavailable signal", async () => { const calls: any[] = []; const result = await handleComboChat({ body: {}, combo: { name: "503-no-signal-abort", strategy: "priority", models: ["model-a", "model-b"], config: { maxRetries: 0 }, }, handleSingleModel: async (_body: any, modelStr: any) => { calls.push(modelStr); // A generic 503 that is NOT an all-accounts-rate-limited signal // (missing "unavailable" in message or wrong content-type) return new Response(JSON.stringify({ error: { message: "Server error" } }), { status: 503, headers: { "content-type": "text/html" }, }); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null as any, allCombos: null, }); const payload = (await result.json()) as any; // Without the fix, combo would abort (still 503). With the fix, it's still 503 because // the signal check filters out non-JSON or non-"unavailable" responses. assert.equal(result.status, 503); // Model-a was tried, it failed with 503, so it fell back to model-b, which also returned 503. assert.deepEqual(calls, ["model-a", "model-b"]); assert.ok( payload.error?.message?.includes("Server error") || payload.error?.message?.includes("unavailable") || result.status === 503 ); }); test("#3587 reasoning model gets max_tokens buffer applied", async () => { saveModelsDevCapabilities({ openai: { "gpt-4o-reasoning": capabilityEntry(12000, { reasoning: true, limit_output: 12000 }), }, }); const bodies: Array> = []; const result = await handleComboChat({ body: { max_tokens: 4096 }, combo: { name: "reasoning-buffer", models: ["openai/gpt-4o-reasoning"], }, handleSingleModel: async (body: Record) => { bodies.push(body); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null, allCombos: null, }); assert.equal(result.ok, true); assert.equal(bodies.length, 1, "should have called handleSingleModel once"); // 4096 * 1.5 = 6144; max(4096+1000, 6144) = 6144 assert.equal(bodies[0].max_tokens, 6144, "max_tokens should be buffered for reasoning model"); }); test("#3587 reasoning buffer preserves max_tokens when the full buffer exceeds model cap", async () => { saveModelsDevCapabilities({ openai: { "gemini-high-cap": capabilityEntry(65536, { reasoning: true, limit_output: 65536 }), }, }); assert.equal( resolveReasoningBufferedMaxTokens("openai/gemini-high-cap", 64000), 64000, "near-cap requests should not be inflated beyond the model's accepted range" ); assert.equal( resolveReasoningBufferedMaxTokens("openai/gemini-high-cap", "4096"), 6144, "numeric string max_tokens should be normalized before applying a safe buffer" ); assert.equal( resolveReasoningBufferedMaxTokens("openai/gemini-high-cap", "not-a-number"), null, "non-numeric string max_tokens should not be changed" ); assert.equal( resolveReasoningBufferedMaxTokens("openai/gemini-high-cap", 70000), 65536, "already over-cap max_tokens should be clamped to a known explicit cap" ); const bodies: Array> = []; const result = await handleComboChat({ body: { max_tokens: 64000 }, combo: { name: "reasoning-buffer-near-cap", models: ["openai/gemini-high-cap"], }, handleSingleModel: async (body: Record) => { bodies.push(body); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null, allCombos: null, }); assert.equal(result.ok, true); assert.equal(bodies.length, 1, "should have called handleSingleModel once"); assert.equal(bodies[0].max_tokens, 64000, "max_tokens should remain within the cap"); }); test("#3587 reasoning buffer is disabled without explicit model capability data", async () => { assert.equal( resolveReasoningBufferedMaxTokens("missing-provider/unknown-reasoning-model", 100), null, "unknown models must not receive heuristic token inflation" ); saveModelsDevCapabilities({ openai: { "capless-reasoning": capabilityEntry(8192, { reasoning: true, limit_output: null, }), "default-cap-reasoning": capabilityEntry(8192, { reasoning: true, limit_output: 8192, }), }, }); assert.equal( resolveReasoningBufferedMaxTokens("openai/capless-reasoning", 100), null, "reasoning metadata without an explicit output cap is not safe enough to inflate" ); assert.equal( resolveReasoningBufferedMaxTokens("openai/default-cap-reasoning", 300), 1300, "explicit default-sized caps are treated as real capability data" ); }); test("#3588 reasoning token buffer feature flag preserves client max_tokens", async () => { saveModelsDevCapabilities({ openai: { "flagged-reasoning": capabilityEntry(12000, { reasoning: true, limit_output: 12000 }), }, }); assert.equal( resolveReasoningBufferedMaxTokens("openai/flagged-reasoning", 4096, { enabled: false }), null, "disabled feature flag should skip reasoning token inflation" ); const bodies: Array> = []; const result = await handleComboChat({ body: { max_tokens: 4096 }, combo: { name: "reasoning-buffer-disabled", models: ["openai/flagged-reasoning"], }, handleSingleModel: async (body: Record) => { bodies.push(body); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { reasoningTokenBufferEnabled: false, }, }, relayOptions: null, allCombos: null, }); assert.equal(result.ok, true); assert.equal(bodies.length, 1, "should have called handleSingleModel once"); assert.equal(bodies[0].max_tokens, 4096, "feature flag should preserve client max_tokens"); }); test("#3587 non-reasoning model does not get max_tokens buffer", async () => { saveModelsDevCapabilities({ openai: { "gpt-4o-plain": capabilityEntry(4096, { reasoning: false }), }, }); const bodies: Array> = []; const result = await handleComboChat({ body: { max_tokens: 4096 }, combo: { name: "no-reasoning-buffer", models: ["openai/gpt-4o-plain"], }, handleSingleModel: async (body: Record) => { bodies.push(body); return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: null, relayOptions: null, allCombos: null, }); assert.equal(result.ok, true); assert.equal(bodies.length, 1, "should have called handleSingleModel once"); // Non-reasoning model: max_tokens should NOT be buffered assert.equal( bodies[0].max_tokens, 4096, "max_tokens should remain unchanged for non-reasoning model" ); }); test("#3587 round-robin buffer does NOT compound across reasoning models", async () => { // Two reasoning models in a round-robin combo. The first fails (400) so the // loop falls through to the second. The buffer must be computed from the // ORIGINAL max_tokens for each attempt — never from an already-buffered value — // so both attempts see 6144 (4096 * 1.5), not [6144, 9216, ...]. Regression for // the shared-`body` mutation that compounded the buffer on every RR iteration. saveModelsDevCapabilities({ openai: { "rr-reasoning-a": capabilityEntry(12000, { reasoning: true, limit_output: 12000 }), "rr-reasoning-b": capabilityEntry(12000, { reasoning: true, limit_output: 12000 }), }, }); const seen: Array<{ model: string; maxTokens: unknown }> = []; const result = await handleComboChat({ body: { max_tokens: 4096 }, combo: { name: "rr-reasoning-no-compound", strategy: "round-robin", models: ["openai/rr-reasoning-a", "openai/rr-reasoning-b"], }, handleSingleModel: async (body: Record, modelStr: string) => { seen.push({ model: modelStr, maxTokens: body.max_tokens }); if (modelStr === "openai/rr-reasoning-a") { return new Response(JSON.stringify({ error: { message: "transient" } }), { status: 400, headers: { "content-type": "application/json" }, }); } return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { concurrencyPerModel: 1, queueTimeoutMs: 5, maxRetries: 0, retryDelayMs: 1, }, }, relayOptions: null, allCombos: null, }); assert.equal(result.status, 200); assert.equal(seen.length, 2, "both reasoning models should have been attempted"); // Each attempt buffers from the original 4096 → 6144. No compounding. assert.equal(seen[0].maxTokens, 6144, "first reasoning model buffered from original"); assert.equal( seen[1].maxTokens, 6144, "second reasoning model must ALSO buffer from original 4096, not 6144" ); }); test("#3588 round-robin honors disabled reasoning token buffer feature flag", async () => { saveModelsDevCapabilities({ openai: { "rr-flagged-a": capabilityEntry(12000, { reasoning: true, limit_output: 12000 }), "rr-flagged-b": capabilityEntry(12000, { reasoning: true, limit_output: 12000 }), }, }); const seen: Array<{ model: string; maxTokens: unknown }> = []; const result = await handleComboChat({ body: { max_tokens: 4096 }, combo: { name: "rr-reasoning-buffer-disabled", strategy: "round-robin", models: ["openai/rr-flagged-a", "openai/rr-flagged-b"], }, handleSingleModel: async (body: Record, modelStr: string) => { seen.push({ model: modelStr, maxTokens: body.max_tokens }); if (modelStr === "openai/rr-flagged-a") { return new Response(JSON.stringify({ error: { message: "transient" } }), { status: 400, headers: { "content-type": "application/json" }, }); } return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { concurrencyPerModel: 1, queueTimeoutMs: 5, maxRetries: 0, retryDelayMs: 1, reasoningTokenBufferEnabled: false, }, }, relayOptions: null, allCombos: null, }); assert.equal(result.status, 200); assert.equal(seen.length, 2, "both reasoning models should have been attempted"); assert.equal(seen[0].maxTokens, 4096, "first model should preserve client max_tokens"); assert.equal(seen[1].maxTokens, 4096, "second model should preserve client max_tokens"); }); test("#3587 round-robin keeps near-cap reasoning max_tokens unchanged", async () => { saveModelsDevCapabilities({ openai: { "rr-near-cap-a": capabilityEntry(65536, { reasoning: true, limit_output: 65536 }), "rr-near-cap-b": capabilityEntry(65536, { reasoning: true, limit_output: 65536 }), }, }); const seen: Array<{ model: string; maxTokens: unknown }> = []; const result = await handleComboChat({ body: { max_tokens: 64000 }, combo: { name: "rr-reasoning-near-cap", strategy: "round-robin", models: ["openai/rr-near-cap-a", "openai/rr-near-cap-b"], }, handleSingleModel: async (body: Record, modelStr: string) => { seen.push({ model: modelStr, maxTokens: body.max_tokens }); if (modelStr === "openai/rr-near-cap-a") { return new Response(JSON.stringify({ error: { message: "transient" } }), { status: 400, headers: { "content-type": "application/json" }, }); } return okResponse(); }, isModelAvailable: async () => true, log: createLog(), settings: { comboDefaults: { concurrencyPerModel: 1, queueTimeoutMs: 5, maxRetries: 0, retryDelayMs: 1, }, }, relayOptions: null, allCombos: null, }); assert.equal(result.status, 200); assert.equal(seen.length, 2, "both reasoning models should have been attempted"); assert.equal(seen[0].maxTokens, 64000, "first reasoning model should keep max_tokens"); assert.equal(seen[1].maxTokens, 64000, "second reasoning model should keep max_tokens"); });