OpenCode 配置自定义网关时的视觉支持

绕海飞行的鱼🐟 发布于 22 小时前 11 次阅读


DeepSeek 最近的视觉模型 deepseek-v4-flash-vision-exp,刚好手头想让它根据图片做个网页出来,谁知道在 OpenCode Desktop 中无论怎么样问,这个模型都返回不支持图片识别,看起来似乎与官方宣称的不一致呀~

换用了官方的 API KEY 之后,在 OpenCode 中分分钟认出来了。那么问题只剩下自定义网关和 OpenCode 两者的问题了。

用自定义路由抄了一下 DeepSeek 官方的请求样例:

import base64
from openai import OpenAI
client = OpenAI(api_key="<自定义网关的KEY>", base_url="<自定义网关的地址>")
with open(".\\src\\test\\favicon.png", "rb") as f:
    b64 = base64.b64encode(f.read()).decode("utf-8")
response = client.chat.completions.create(
    model="deepseek-v4-flash-vision-exp",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "这张图片里有什么?"},
                {
                    "type": "image_url",
                    "image_url": {"url": f"data:image/jpeg;base64,{b64}"},
                },
            ],
        }
    ],
)
print(response.choices[0].message.content)

似乎它能看到图片:

自家的 LOGO 认成了 Docker 的,真有你的 DeepSeek。。。

那么最后只剩下 OpenCode 的问题了,查了一下发现是需要显式声明其多模态能力,防止 OpenCode 在发送请求前强行剔除图片附件,修改下 OpenCode 的配置:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "omniroute": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "OmniRoute",
      "options": {
        "baseURL": "<自定义网关地址>"
      },
      "models": {
        "ds/deepseek-v4-flash": {
          "name": "deepseek-v4-flash"
        },
        "ds/deepseek-v4-flash-vision-exp": {
          "name": "deepseek-v4-flash-vision-exp",
          "supportsAttachments": true,  # 显式声明支持附件
          "modalities": {               # 显式声明输入格式包含 image
            "input": ["text", "image"],
            "output": ["text"]
          }
        },
        "ds/deepseek-v4-pro": {
          "name": "deepseek-v4-pro"
        }
      }
    }
  }
}

最后重启下 OpenCode Desktop 刷新配置再试就正常了!