[v3.8.50] fix(open-sse): filter non-numeric values in comboTargetLimits before min calculation (#8774)

Validated in post-merge-train sweep (boards clean on release/v3.8.50 tip)
This commit is contained in:
Austin Liu
2026-08-06 23:38:59 +09:30
committed by GitHub
parent 7bb4bfc4fb
commit 1e55fbd20b
2 changed files with 31 additions and 8 deletions

View File

@@ -1724,14 +1724,16 @@ export async function handleChatCore({
comboConfig as unknown as { name: string; models: unknown[] },
allCombosData as unknown as { name: string; models: unknown[] }[]
);
comboTargetLimits = targets.map((t: { modelStr?: string; provider?: string }) =>
// Fall back to ResolvedComboTarget.provider when modelStr lacks a
// provider/ prefix — parseModel alone returns provider:null (#8716).
getComboTargetTokenLimit({
modelStr: t.modelStr,
provider: t.provider,
})
);
// Fall back to ResolvedComboTarget.provider when modelStr lacks a
// provider/ prefix — parseModel alone returns provider:null (#8716).
comboTargetLimits = targets
.map((t: { modelStr?: string; provider?: string }) =>
getComboTargetTokenLimit({ modelStr: t.modelStr, provider: t.provider })
)
.filter(
(limit): limit is number =>
typeof limit === "number" && Number.isFinite(limit) && limit > 0
);
}
// chatCore executes per concrete target (handleSingleModel resolves
// provider/effectiveModel before delegating). Compress against THIS

View File

@@ -0,0 +1,21 @@
import test from "node:test";
import assert from "node:assert/strict";
import { resolveComboContextLimit } from "../../open-sse/services/contextManager.ts";
test("resolveComboContextLimit handles array of combo target objects ({ name, models }) in comboTargetLimits", () => {
const result = resolveComboContextLimit({
provider: "unknown_provider",
model: "unknown_model",
comboTargetLimits: [
{ name: "subcombo1", models: [{ provider: "openai", model: "gpt-4" }] },
{ name: "subcombo2", models: [{ provider: "anthropic", model: "claude-3-5-sonnet" }] },
] as unknown as number[],
});
// Default fallback limit for unknown provider should be returned without throwing NaN or crash
assert.equal(typeof result.limit, "number");
assert.ok(!Number.isNaN(result.limit));
assert.ok(result.limit > 0);
assert.equal(result.source, "fallback");
});