fix: add fallback resolution warnings for unavailable models
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user