From 338bd80a956c48490fe60da51612f3ae7f7fabcd Mon Sep 17 00:00:00 2001 From: Maksim Totmin Date: Tue, 4 Aug 2026 20:44:14 +0700 Subject: [PATCH] fix: use provider block's own vision model on legacy fallback When falling back to a provider block (providerID / legacy ludmila-ai), prefer the model flagged attachment:true in that block instead of the Google-default options.model. Prevents sending 'gemini-2.5-flash' to the ludmila endpoint which expects 'gemini/gemini-2.5-flash'. --- package.json | 2 +- src/vision-bridge.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 2710ca4..befea8b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vision-bridge", - "version": "0.2.0", + "version": "0.2.1", "type": "module", "description": "Opencode plugin: bridges images to a vision model when the active model cannot see images.", "main": "src/vision-bridge.ts", diff --git a/src/vision-bridge.ts b/src/vision-bridge.ts index 138cc09..a2aaf0f 100644 --- a/src/vision-bridge.ts +++ b/src/vision-bridge.ts @@ -147,19 +147,19 @@ export const VisionBridge: Plugin = async (_input: any, options: any = {}) => { const pBase = p?.options?.baseURL const pKey = p?.options?.apiKey if (pBase && pKey) { - let pmodel = resolveTemplates(options.model) || "" - if (!pmodel) { - for (const [id, m] of Object.entries(p?.models ?? {})) { - if (m?.attachment === true) { - pmodel = typeof m?.id === "string" && m.id ? m.id : id - break - } + // Prefer the provider block's own vision model (attachment: true). + // options.model only as a last-resort fallback. + let pmodel = "" + for (const [id, m] of Object.entries(p?.models ?? {})) { + if (m?.attachment === true) { + pmodel = typeof m?.id === "string" && m.id ? m.id : id + break } } providerInfo = { baseURL: String(pBase).replace(/\/$/, ""), apiKey: pKey, - visionModel: pmodel || DEFAULT_MODEL, + visionModel: pmodel || resolveTemplates(options.model) || DEFAULT_MODEL, } return }