fix(look-at): preserve variant metadata in fallback chain and block non-vision models

- fallback-chain.ts: cache-derived entries inherit variant from matching hardcoded entries
- agent-metadata.ts: new isVisionCapableAgentModel() guard blocks non-vision registered models
- tools.ts: early vision-capability check before session creation
- Added regression tests for variant preservation and non-vision model rejection
This commit is contained in:
YeonGyu-Kim
2026-03-11 21:45:48 +09:00
parent b40de091b4
commit fee414fd61
5 changed files with 145 additions and 11 deletions
+18 -1
View File
@@ -8,6 +8,15 @@ function getFullModelKey(providerID: string, modelID: string): string {
return `${providerID}/${modelID}`
}
function findHardcodedFallbackEntry(
providerID: string,
modelID: string,
): FallbackEntry | undefined {
return MULTIMODAL_LOOKER_REQUIREMENT.fallbackChain.find((entry) =>
entry.model === modelID && entry.providers.includes(providerID),
)
}
export function isHardcodedMultimodalFallbackModel(model: VisionCapableModel): boolean {
return MULTIMODAL_LOOKER_REQUIREMENT.fallbackChain.some((entry) =>
entry.providers.some((providerID) =>
@@ -26,10 +35,16 @@ export function buildMultimodalLookerFallbackChain(
const key = getFullModelKey(visionCapableModel.providerID, visionCapableModel.modelID)
if (seen.has(key)) continue
const hardcodedEntry = findHardcodedFallbackEntry(
visionCapableModel.providerID,
visionCapableModel.modelID,
)
seen.add(key)
fallbackChain.push({
providers: [visionCapableModel.providerID],
model: visionCapableModel.modelID,
...(hardcodedEntry?.variant ? { variant: hardcodedEntry.variant } : {}),
})
}
@@ -41,7 +56,9 @@ export function buildMultimodalLookerFallbackChain(
continue
}
providerModelKeys.forEach((key) => seen.add(key))
providerModelKeys.forEach((key) => {
seen.add(key)
})
fallbackChain.push(entry)
}