Make fallback provider selection provider-agnostic

This commit is contained in:
Ravi Tharuma
2026-03-04 18:55:43 +01:00
committed by YeonGyu-Kim
parent eab5be666d
commit f2d23a8a36
2 changed files with 13 additions and 12 deletions
+4 -4
View File
@@ -88,17 +88,17 @@ describe("model-error-classifier", () => {
expect(provider).toBe("anthropic") expect(provider).toBe("anthropic")
}) })
test("selectFallbackProvider maps opencode fallback to quotio when quotio is connected", () => { test("selectFallbackProvider uses connected preferred provider when fallback providers are unavailable", () => {
//#given //#given
writeFileSync( writeFileSync(
join(TEST_CACHE_DIR, "connected-providers.json"), join(TEST_CACHE_DIR, "connected-providers.json"),
JSON.stringify({ connected: ["quotio"], updatedAt: new Date().toISOString() }, null, 2), JSON.stringify({ connected: ["provider-x"], updatedAt: new Date().toISOString() }, null, 2),
) )
//#when //#when
const provider = selectFallbackProvider(["opencode"], "quotio") const provider = selectFallbackProvider(["provider-y"], "provider-x")
//#then //#then
expect(provider).toBe("quotio") expect(provider).toBe("provider-x")
}) })
}) })
+9 -8
View File
@@ -140,7 +140,8 @@ export function hasMoreFallbacks(
* Selects the best provider for a fallback entry. * Selects the best provider for a fallback entry.
* Priority: * Priority:
* 1) First connected provider in the entry's provider preference order * 1) First connected provider in the entry's provider preference order
* 2) First provider listed in the fallback entry (when cache is missing) * 2) Preferred provider when connected (and entry providers are unavailable)
* 3) First provider listed in the fallback entry
*/ */
export function selectFallbackProvider( export function selectFallbackProvider(
providers: string[], providers: string[],
@@ -149,19 +150,19 @@ export function selectFallbackProvider(
const connectedProviders = readConnectedProvidersCache() const connectedProviders = readConnectedProvidersCache()
if (connectedProviders) { if (connectedProviders) {
const connectedSet = new Set(connectedProviders.map(p => p.toLowerCase())) const connectedSet = new Set(connectedProviders.map(p => p.toLowerCase()))
if (connectedSet.has("quotio")) {
const hasQuotio = providers.some((p) => p.toLowerCase() === "quotio")
const hasOpencode = providers.some((p) => p.toLowerCase() === "opencode")
if (hasQuotio || hasOpencode) {
return "quotio"
}
}
for (const provider of providers) { for (const provider of providers) {
if (connectedSet.has(provider.toLowerCase())) { if (connectedSet.has(provider.toLowerCase())) {
return provider return provider
} }
} }
if (
preferredProviderID &&
connectedSet.has(preferredProviderID.toLowerCase())
) {
return preferredProviderID
}
} }
return providers[0] || preferredProviderID || "opencode" return providers[0] || preferredProviderID || "opencode"