diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index 8ae8b4d9f16b..aa6db1810e4c 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -431,7 +431,12 @@ function unsupportedParts(msgs: ModelMessage[], model: Provider.Model): ModelMes const filename = part.type === "file" ? part.filename : undefined const modality = mimeToModality(mime) if (!modality) return part - if (model.capabilities.input[modality]) return part + if ( + Array.isArray(model.capabilities.input) + ? model.capabilities.input.includes(modality) + : model.capabilities.input[modality] + ) + return part const name = filename ? `"${filename}"` : modality return { diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts index cf42346716ea..72b26edb61ee 100644 --- a/packages/opencode/test/provider/transform.test.ts +++ b/packages/opencode/test/provider/transform.test.ts @@ -2577,6 +2577,21 @@ describe("ProviderTransform.message - empty image handling", () => { expect(result[0].content[1]).toEqual({ type: "image", image: `data:image/png;base64,${validBase64}` }) }) + test("should keep images when custom-provider input capabilities use modalities", () => { + const image = { type: "image" as const, image: "data:image/png;base64,abcd" } + const model = { + ...mockModel, + capabilities: { + ...mockModel.capabilities, + input: ["text", "image"], + }, + } as unknown as Parameters[1] + + const result = ProviderTransform.message([{ role: "user", content: [image] }], model, {}) + + expect(result[0].content[0]).toEqual(image) + }) + test("should handle mixed valid and empty images", () => { const validBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="