oh-my-opencode/src/shared/fallback-model-availability.ts
YeonGyu-Kim 4e5792ce4d refactor(shared): split model-availability.ts into model resolution modules
Extract model availability checking pipeline:
- available-models-fetcher.ts: top-level model fetching orchestration
- model-cache-availability.ts, models-json-cache-reader.ts
- provider-models-cache-model-reader.ts: provider cache reading with null guard
- fallback-model-availability.ts, model-name-matcher.ts
- open-code-client-accessors.ts, open-code-client-shapes.ts
- record-type-guard.ts
2026-02-08 16:24:52 +09:00

68 lines
1.8 KiB
TypeScript

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 }>,
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
})
if (hasAvailableProvider) {
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 },
)
return true
}
}
}
return false
}
export function isAnyProviderConnected(
providers: string[],
availableModels: Set<string>,
): boolean {
if (availableModels.size > 0) {
const providerSet = new Set(providers)
for (const model of availableModels) {
const [provider] = model.split("/")
if (providerSet.has(provider)) {
log("[isAnyProviderConnected] found model from required provider", {
provider,
model,
})
return true
}
}
}
const connectedProviders = readConnectedProvidersCache()
if (connectedProviders) {
const connectedSet = new Set(connectedProviders)
for (const provider of providers) {
if (connectedSet.has(provider)) {
log("[isAnyProviderConnected] provider connected via cache", { provider })
return true
}
}
}
return false
}