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")
})
test("selectFallbackProvider maps opencode fallback to quotio when quotio is connected", () => {
test("selectFallbackProvider uses connected preferred provider when fallback providers are unavailable", () => {
//#given
writeFileSync(
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
const provider = selectFallbackProvider(["opencode"], "quotio")
const provider = selectFallbackProvider(["provider-y"], "provider-x")
//#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.
* Priority:
* 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(
providers: string[],
@@ -149,19 +150,19 @@ export function selectFallbackProvider(
const connectedProviders = readConnectedProvidersCache()
if (connectedProviders) {
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) {
if (connectedSet.has(provider.toLowerCase())) {
return provider
}
}
if (
preferredProviderID &&
connectedSet.has(preferredProviderID.toLowerCase())
) {
return preferredProviderID
}
}
return providers[0] || preferredProviderID || "opencode"