fix: add fallback resolution warnings for unavailable models

This commit is contained in:
YeonGyu-Kim
2026-02-17 10:29:48 +09:00
parent 6abe98fb4c
commit fcf3adf43a
3 changed files with 146 additions and 11 deletions
+46 -11
View File
@@ -2,29 +2,64 @@ import { readConnectedProvidersCache } from "./connected-providers-cache"
import { log } from "./logger"
import { fuzzyMatchModel } from "./model-name-matcher"
export function isAnyFallbackModelAvailable(
fallbackChain: Array<{ providers: string[]; model: string }>,
type FallbackEntry = { providers: string[]; model: string }
type ResolvedFallbackModel = {
provider: string
model: string
}
export function resolveFirstAvailableFallback(
fallbackChain: FallbackEntry[],
availableModels: Set<string>,
): boolean {
if (availableModels.size > 0) {
for (const entry of fallbackChain) {
const hasAvailableProvider = entry.providers.some((provider) => {
return fuzzyMatchModel(entry.model, availableModels, [provider]) !== null
): ResolvedFallbackModel | null {
for (const entry of fallbackChain) {
for (const provider of entry.providers) {
const matchedModel = fuzzyMatchModel(entry.model, availableModels, [provider])
log("[resolveFirstAvailableFallback] attempt", {
provider,
requestedModel: entry.model,
resolvedModel: matchedModel,
})
if (hasAvailableProvider) {
return true
if (matchedModel !== null) {
log("[resolveFirstAvailableFallback] resolved", {
provider,
requestedModel: entry.model,
resolvedModel: matchedModel,
})
return { provider, model: matchedModel }
}
}
}
log("[resolveFirstAvailableFallback] WARNING: no fallback model resolved", {
chain: fallbackChain.map((entry) => ({
model: entry.model,
providers: entry.providers,
})),
availableCount: availableModels.size,
})
return null
}
export function isAnyFallbackModelAvailable(
fallbackChain: FallbackEntry[],
availableModels: Set<string>,
): boolean {
if (resolveFirstAvailableFallback(fallbackChain, availableModels) !== null) {
return true
}
const connectedProviders = readConnectedProvidersCache()
if (connectedProviders) {
const connectedSet = new Set(connectedProviders)
for (const entry of fallbackChain) {
if (entry.providers.some((p) => connectedSet.has(p))) {
log(
"[isAnyFallbackModelAvailable] model not in available set, but provider is connected",
{ model: entry.model, availableCount: availableModels.size },
"[isAnyFallbackModelAvailable] WARNING: No fuzzy match found for any model in fallback chain, but provider is connected. Agent may fail at runtime.",
{ chain: fallbackChain.map((entryItem) => entryItem.model), availableCount: availableModels.size },
)
return true
}