Files
OmniRoute/tests/unit/native-codex-turn-pin-10379.test.ts
Praveen K Palaniswamy 65e81158ab fix(ollama): route models by advertised capability (#11088)
Landed with the design call resolved per the owner's pick — **option 1**: the synced store is now endpoint-agnostic (persistDiscoveredModels and managedModelImport no longer drop non-chat models at write time), and chat selectability moved to read time (auto-pool expansion in autoStrategy applies filterChatSelectableModels; the models-route projection already had its chatOnly filter). Your discovery test now passes end-to-end (3/3): /api/show capabilities persist per connection and image/embedding requests route through the advertising host.

Reconciliation notes: conflicted areas merged onto the current tip (adobe discovery import, requestedModel preflight signature, resolvedProvider fast-path coexists with the synced-route override — explicit resolution wins); carried base-red drains (#10055 memoization, #11071 test variants) dropped as already-landed; the managed-model-import exclusion test was propagated to the new contract (image/video models persist; the read filter still hides them from chat pickers — pinned by a new assertion). Full battery: 205/206 focused (the one red is a confirmed periodic-timer timing flake on the loaded devbox — 20/20 isolated), autoCombo vitest 30/30, combo suites 46/46, gates + typecheck clean.

Thank you @yourspraveen — the capability probe + routing design was right; it just needed the store contract opened up. Fixes #11087.
2026-08-23 11:45:01 -03:00

150 lines
4.4 KiB
TypeScript

// #10379: Native Codex turn pin must allow fill-first failover across
// compatible connections for the same provider + model.
import { test } from "node:test";
import assert from "node:assert/strict";
const {
applyNativeCodexTurnPin,
pinNativeCodexTurn,
getNativeCodexTurnPin,
clearNativeCodexTurnPinsForTests,
} = await import("../../open-sse/services/combo/nativeCodexTurnPin.ts");
const BODY = {
client_metadata: {
"x-codex-turn-metadata": JSON.stringify({ thread_id: "t1", turn_id: "turn1" }),
},
};
function makeTarget(connectionId: string, model = "gpt-5.6-sol", provider = "codex") {
return {
kind: "model" as const,
stepId: `step-${connectionId}`,
executionKey: `ek-${connectionId}`,
modelStr: model,
provider,
providerId: null,
connectionId,
weight: 1,
label: null,
};
}
test("pinned connection is preferred but siblings are included as fallback", () => {
clearNativeCodexTurnPinsForTests();
pinNativeCodexTurn({
body: BODY,
comboName: "test-combo",
target: makeTarget("conn-1"),
connectionId: "conn-1",
});
const pin = getNativeCodexTurnPin(BODY, "test-combo")!;
const targets = [makeTarget("conn-1"), makeTarget("conn-2"), makeTarget("conn-3")];
const result = applyNativeCodexTurnPin(targets, pin);
assert.equal(result.length, 3, "all compatible connections should be returned");
assert.equal(result[0].connectionId, "conn-1", "pinned connection should be first");
assert.deepEqual(result[0].allowedConnectionIds, ["conn-1", "conn-2", "conn-3"]);
});
test("fallback connections share the same allowedConnectionIds", () => {
clearNativeCodexTurnPinsForTests();
pinNativeCodexTurn({
body: BODY,
comboName: "test-combo",
target: makeTarget("conn-2"),
connectionId: "conn-2",
});
const pin = getNativeCodexTurnPin(BODY, "test-combo")!;
const targets = [makeTarget("conn-1"), makeTarget("conn-2"), makeTarget("conn-3")];
const result = applyNativeCodexTurnPin(targets, pin);
assert.equal(result[0].connectionId, "conn-2");
assert.equal(result[1].connectionId, "conn-1");
assert.equal(result[2].connectionId, "conn-3");
for (const t of result) {
assert.deepEqual(t.allowedConnectionIds, ["conn-1", "conn-2", "conn-3"]);
}
});
test("incompatible targets (different provider/model) are excluded", () => {
clearNativeCodexTurnPinsForTests();
pinNativeCodexTurn({
body: BODY,
comboName: "test-combo",
target: makeTarget("conn-1"),
connectionId: "conn-1",
});
const pin = getNativeCodexTurnPin(BODY, "test-combo")!;
const targets = [
makeTarget("conn-1"),
makeTarget("conn-2"),
makeTarget("conn-other", "different-model", "other-provider"),
];
const result = applyNativeCodexTurnPin(targets, pin);
assert.equal(result.length, 2, "incompatible target should be excluded");
assert.deepEqual(result[0].allowedConnectionIds, ["conn-1", "conn-2"]);
});
test("empty result when no compatible targets exist", () => {
clearNativeCodexTurnPinsForTests();
pinNativeCodexTurn({
body: BODY,
comboName: "test-combo",
target: makeTarget("conn-1"),
connectionId: "conn-1",
});
const pin = getNativeCodexTurnPin(BODY, "test-combo")!;
const targets = [makeTarget("conn-x", "other-model", "other-provider")];
const result = applyNativeCodexTurnPin(targets, pin);
assert.equal(result.length, 0);
});
test("pinNativeCodexTurn allows connectionId change for same provider+model", () => {
clearNativeCodexTurnPinsForTests();
pinNativeCodexTurn({
body: BODY,
comboName: "test-combo",
target: makeTarget("conn-1"),
connectionId: "conn-1",
});
// Should NOT throw when only connectionId changes
pinNativeCodexTurn({
body: BODY,
comboName: "test-combo",
target: makeTarget("conn-2"),
connectionId: "conn-2",
});
const pin = getNativeCodexTurnPin(BODY, "test-combo")!;
assert.equal(pin.connectionId, "conn-2", "pin should update to new connection");
});
test("pinNativeCodexTurn rejects provider/model change", () => {
clearNativeCodexTurnPinsForTests();
pinNativeCodexTurn({
body: BODY,
comboName: "test-combo",
target: makeTarget("conn-1"),
connectionId: "conn-1",
});
assert.throws(
() =>
pinNativeCodexTurn({
body: BODY,
comboName: "test-combo",
target: makeTarget("conn-1", "different-model", "codex"),
connectionId: "conn-1",
}),
/Native Codex turn target changed/
);
});