Merge pull request #2488 from code-yeongyu/fix/issue-2295-fallback-provider-preserve

fix: preserve session provider context in fallback chain
This commit is contained in:
YeonGyu-Kim
2026-03-12 11:24:43 +09:00
committed by GitHub
3 changed files with 57 additions and 8 deletions
@@ -32,6 +32,21 @@ describe("fallback-chain-from-models", () => {
})
})
test("uses opencode as absolute fallback provider when context provider is missing", () => {
//#given
const fallbackModel = "gemini-3-flash"
//#when
const parsed = parseFallbackModelEntry(fallbackModel, undefined)
//#then
expect(parsed).toEqual({
providers: ["opencode"],
model: "gemini-3-flash",
variant: undefined,
})
})
test("builds fallback chain from normalized fallback_models input", () => {
//#given
const fallbackModels = ["quotio/kimi-k2.5", "gpt-5.2 medium"]
+7 -4
View File
@@ -39,13 +39,15 @@ function parseVariantFromModel(rawModel: string): { modelID: string; variant?: s
export function parseFallbackModelEntry(
model: string,
defaultProviderID: string,
contextProviderID: string | undefined,
defaultProviderID = "opencode",
): FallbackEntry | undefined {
const trimmed = model.trim()
if (!trimmed) return undefined
const parts = trimmed.split("/")
const providerID = parts.length >= 2 ? parts[0].trim() : defaultProviderID
const providerID =
parts.length >= 2 ? parts[0].trim() : (contextProviderID?.trim() || defaultProviderID)
const rawModelID = parts.length >= 2 ? parts.slice(1).join("/").trim() : trimmed
if (!providerID || !rawModelID) return undefined
@@ -61,13 +63,14 @@ export function parseFallbackModelEntry(
export function buildFallbackChainFromModels(
fallbackModels: string | string[] | undefined,
defaultProviderID: string,
contextProviderID: string | undefined,
defaultProviderID = "opencode",
): FallbackEntry[] | undefined {
const normalized = normalizeFallbackModels(fallbackModels)
if (!normalized || normalized.length === 0) return undefined
const parsed = normalized
.map((model) => parseFallbackModelEntry(model, defaultProviderID))
.map((model) => parseFallbackModelEntry(model, contextProviderID, defaultProviderID))
.filter((entry): entry is FallbackEntry => entry !== undefined)
if (parsed.length === 0) return undefined