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 d4232c9eac
commit 85151f7dfd
5 changed files with 145 additions and 11 deletions
+34 -7
View File
@@ -28,6 +28,19 @@ function getFullModelKey(model: AgentModel): string {
return `${model.providerID}/${model.modelID}`
}
function isVisionCapableAgentModel(
agentModel: AgentModel | undefined,
visionCapableModels: Array<AgentModel>,
): agentModel is AgentModel {
if (!agentModel) {
return false
}
return visionCapableModels.some((visionCapableModel) =>
getFullModelKey(visionCapableModel) === getFullModelKey(agentModel),
)
}
function parseAgentModel(model: string): AgentModel | undefined {
const [providerID, ...modelIDParts] = model.split("/")
const modelID = modelIDParts.join("/")
@@ -90,6 +103,10 @@ async function resolveDynamicAgentMetadata(
})
const agentModel = resolution ? parseAgentModel(resolution.model) : undefined
if (!isVisionCapableAgentModel(agentModel, visionCapableModels)) {
return {}
}
return {
agentModel,
agentVariant: resolution?.variant,
@@ -113,22 +130,32 @@ export async function resolveMultimodalLookerAgentMetadata(
try {
const registeredMetadata = await resolveRegisteredAgentMetadata(ctx)
const visionCapableModels = readVisionCapableModelsCache()
if (registeredMetadata.agentModel && visionCapableModels.length === 0) {
return registeredMetadata
}
const registeredModelIsVisionCapable = isVisionCapableAgentModel(
registeredMetadata.agentModel,
visionCapableModels,
)
const dynamicMetadata = await resolveDynamicAgentMetadata(ctx, visionCapableModels)
if (isConfiguredVisionModel(registeredMetadata.agentModel, dynamicMetadata.agentModel)) {
return registeredMetadata
if (
registeredModelIsVisionCapable &&
isConfiguredVisionModel(registeredMetadata.agentModel, dynamicMetadata.agentModel)
) {
return {
agentModel: registeredMetadata.agentModel,
agentVariant: registeredMetadata.agentVariant ?? dynamicMetadata.agentVariant,
}
}
if (dynamicMetadata.agentModel) {
return dynamicMetadata
}
return registeredMetadata
if (registeredModelIsVisionCapable) {
return registeredMetadata
}
return {}
} catch (error) {
log("[look_at] Failed to resolve multimodal-looker model info", error)
return {}