transformModelForProvider only handled github-copilot provider, leaving google provider models untransformed. This caused ProviderModelNotFoundError when google/gemini-3-flash was sent to the API (correct ID is gemini-3-flash-preview). Changes: - Add google provider to transformModelForProvider with idempotent regex negative lookahead to prevent double -preview suffix - Fix category-default path in model-resolution-pipeline when availableModels is empty but connected provider exists - Fix getFirstFallbackModel first-run path that constructed raw model IDs without transformation - Fix github-copilot provider gemini transforms to also use idempotent regex (was vulnerable to double-transform) - Extract transformModelForProvider to shared module (single source of truth, imported by cli and shared layers) - Add 20 new test cases: unit tests for both providers, runtime integration tests for category-default and fallback-chain paths, double-transform prevention for both providers
32 lines
1.2 KiB
TypeScript
32 lines
1.2 KiB
TypeScript
import { resolveModelPipeline } from "../../shared"
|
|
import { transformModelForProvider } from "../../shared/provider-model-id-transform"
|
|
|
|
export function applyModelResolution(input: {
|
|
uiSelectedModel?: string
|
|
userModel?: string
|
|
requirement?: { fallbackChain?: { providers: string[]; model: string; variant?: string }[] }
|
|
availableModels: Set<string>
|
|
systemDefaultModel?: string
|
|
}) {
|
|
const { uiSelectedModel, userModel, requirement, availableModels, systemDefaultModel } = input
|
|
return resolveModelPipeline({
|
|
intent: { uiSelectedModel, userModel },
|
|
constraints: { availableModels },
|
|
policy: { fallbackChain: requirement?.fallbackChain, systemDefaultModel },
|
|
})
|
|
}
|
|
|
|
export function getFirstFallbackModel(requirement?: {
|
|
fallbackChain?: { providers: string[]; model: string; variant?: string }[]
|
|
}) {
|
|
const entry = requirement?.fallbackChain?.[0]
|
|
if (!entry || entry.providers.length === 0) return undefined
|
|
const provider = entry.providers[0]
|
|
const transformedModel = transformModelForProvider(provider, entry.model)
|
|
return {
|
|
model: `${provider}/${transformedModel}`,
|
|
provenance: "provider-fallback" as const,
|
|
variant: entry.variant,
|
|
}
|
|
}
|