54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import type { FallbackEntry } from "../shared/model-requirements"
|
|
import type { ProviderAvailability } from "./model-fallback-types"
|
|
import { CLI_AGENT_MODEL_REQUIREMENTS } from "./model-fallback-requirements"
|
|
import { isProviderAvailable } from "./provider-availability"
|
|
import { transformModelForProvider } from "./provider-model-id-transform"
|
|
|
|
export function resolveModelFromChain(
|
|
fallbackChain: FallbackEntry[],
|
|
availability: ProviderAvailability
|
|
): { model: string; variant?: string } | null {
|
|
for (const entry of fallbackChain) {
|
|
for (const provider of entry.providers) {
|
|
if (isProviderAvailable(provider, availability)) {
|
|
const transformedModel = transformModelForProvider(provider, entry.model)
|
|
return {
|
|
model: `${provider}/${transformedModel}`,
|
|
variant: entry.variant,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return null
|
|
}
|
|
|
|
export function getSisyphusFallbackChain(): FallbackEntry[] {
|
|
return CLI_AGENT_MODEL_REQUIREMENTS.sisyphus.fallbackChain
|
|
}
|
|
|
|
export function isAnyFallbackEntryAvailable(
|
|
fallbackChain: FallbackEntry[],
|
|
availability: ProviderAvailability
|
|
): boolean {
|
|
return fallbackChain.some((entry) =>
|
|
entry.providers.some((provider) => isProviderAvailable(provider, availability))
|
|
)
|
|
}
|
|
|
|
export function isRequiredModelAvailable(
|
|
requiresModel: string,
|
|
fallbackChain: FallbackEntry[],
|
|
availability: ProviderAvailability
|
|
): boolean {
|
|
const matchingEntry = fallbackChain.find((entry) => entry.model === requiresModel)
|
|
if (!matchingEntry) return false
|
|
return matchingEntry.providers.some((provider) => isProviderAvailable(provider, availability))
|
|
}
|
|
|
|
export function isRequiredProviderAvailable(
|
|
requiredProviders: string[],
|
|
availability: ProviderAvailability
|
|
): boolean {
|
|
return requiredProviders.some((provider) => isProviderAvailable(provider, availability))
|
|
}
|