opencode · vision · tool calls · reasoning

在 OpenCode 里用 TommyAPI:一次配置,图片、工具、推理全部识别。

OpenCode 只认它自己的模型目录(models.dev)和你配置里写的 modalities。自定义中转商的模型默认被当成“纯文本”,于是你会看到 this model does not support image input,哪怕模型本身能看图。下面三种接法任选其一,都由 TommyAPI 每小时自动生成、每周用真实图片实测,不用你手写模型能力。

模型总数 …支持图片输入 …最近实测 …
Why

为什么 OpenCode 说“模型不支持图片”

这是 OpenCode 的本地判定,不是 TommyAPI 返回的错误。

1

OpenCode 先看目录

OpenCode 从 models.opencode.ai(models.dev 镜像)读取每个 provider 的模型能力:能不能收图、能不能调工具、上下文多大。

2

自定义 provider 默认纯文本

用 @ai-sdk/openai-compatible 手工接入的中转,只要模型条目没写 modalities.input 包含 image,读图工具就会在本地直接拦下,请求根本不会发出去。

3

所以要让 OpenCode“知道”

要么让 tommyapi 进入它读的目录(方案 A),要么把能力写进你的 opencode.json(方案 B / C)。TommyAPI 这边 deepseek-v4.1-flash、kimi-k2.6、qwen3.8-max 等模型传图是通的。

Option A · 推荐

一行环境变量:让 tommyapi 成为 OpenCode 内置 provider

TommyAPI 托管了一份 models.dev 格式的目录镜像:官方目录原样 + tommyapi 条目(每小时同步)。OpenCode 原生支持 OPENCODE_MODELS_URL 指向自定义镜像。

# macOS / Linux(写进 ~/.zshrc 或 ~/.bashrc)
export OPENCODE_MODELS_URL=https://tommyapi.com/models.dev
export TOMMYAPI_API_KEY=sk-你的TommyAPI密钥

# Windows PowerShell(持久化)
setx OPENCODE_MODELS_URL "https://tommyapi.com/models.dev"
setx TOMMYAPI_API_KEY "sk-你的TommyAPI密钥"
  1. 重启 OpenCode。第一次启动它会在后台拉取镜像(几秒钟,缓存在 ~/.cache/opencode/),再重启一次就能在 provider 列表里看到 TommyAPI;之后每小时自动刷新。执行 /connect,列表里选 TommyAPI(或直接用上面的 TOMMYAPI_API_KEY 环境变量,不用再填)。
  2. 执行 /models,选 tommyapi/deepseek-v4.1-flash 或任意模型。能看图的模型会直接带图片能力,上下文、价格、推理档位也一并带上。
  3. 以后新上架模型、能力变化都自动进镜像,不用改配置。

镜像地址直接可访问:https://tommyapi.com/models.dev/api.json。OpenCode 会先请求 /experimental/v2.0/api.json,收到 404 后自动回退到这个 v1 目录,这是它对自定义镜像的既定行为。

Option B

粘贴一份现成的 opencode.json

不想改环境变量,就把自动生成的 provider 配置放进你的 OpenCode 配置:全部文本模型、实测过的 modalities、上下文与输出上限、工具/推理标记。

下载

全量配置文件

https://tommyapi.com/opencode/opencode.json,每小时更新。

# 直接作为全局配置(会覆盖原文件,先备份)
mkdir -p ~/.config/opencode
curl -fsSL https://tommyapi.com/opencode/opencode.json \
  -o ~/.config/opencode/opencode.json

# 或者放到项目目录,只对这个项目生效
curl -fsSL https://tommyapi.com/opencode/opencode.json -o ./opencode.json
合并

已经有配置?只拷 provider 段

把下载文件里 provider.tommyapi 整段合并进你现有的 opencode.json 即可。密钥通过环境变量 TOMMYAPI_API_KEY 注入(配置里写的是 {env:TOMMYAPI_API_KEY}),不要把密钥写死进文件。

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "tommyapi": {
      "name": "TommyAPI",
      "npm": "@ai-sdk/openai-compatible",
      "options": {
        "baseURL": "https://tommyapi.com/v1",
        "apiKey": "{env:TOMMYAPI_API_KEY}"
      },
      "models": { "...": "见下载文件" }
    }
  }
}
Option C

手动最小修改:只给模型加上 modalities

如果你已经按自己的方式配好了 tommyapi,只是某个模型被拦了图片,在该模型条目里加 modalities 就行。

{
  "provider": {
    "tommyapi": {
      "npm": "@ai-sdk/openai-compatible",
      "options": { "baseURL": "https://tommyapi.com/v1" },
      "models": {
        "deepseek-v4.1-flash": {
          "name": "DeepSeek V4.1 Flash",
          "modalities": { "input": ["text", "image"], "output": ["text"] },
          "limit": { "context": 1048576, "output": 393216 },
          "tool_call": true,
          "reasoning": true
        }
      }
    }
  }
}

改完重启 OpenCode。哪些模型该写 image,以下面这份实测清单为准。

Verified

哪些模型能收图:按真实图片实测,不按名字猜

TommyAPI 每周给货架上每个文本模型发一张 128×128 纯红色图片,答对颜色才标记为支持图片输入;上游拒收或答错的标记为纯文本。结果同时写进 GET /v1/models 的 architecture.input_modalities,Cline、Roo Code、Cherry Studio 等读 /v1/models 的客户端也会自动拿到。

image input ✓
加载中…

纯文本模型(传图会被 OpenCode 在本地拦下,属正常):

加载中…

机器可读:/opencode/vision-models.json · 完整 provider 条目(models.dev v1 格式):/opencode/tommyapi.json

FAQ

常见问题

改了配置还是提示不支持图片?

OpenCode 会缓存模型目录。换了 OPENCODE_MODELS_URL 后完整退出再启动一次;用方案 B/C 时确认模型 id 和配置里的键完全一致(区分大小写)。

Claude 系列要走 Anthropic 格式吗?

不需要。OpenCode 走 OpenAI Chat Completions 即可,TommyAPI 的 /v1/chat/completions 对 Claude、GPT、Gemini、DeepSeek、Kimi、Qwen 统一接收 image_url。需要 Anthropic Messages 格式的客户端用 https://tommyapi.com/v1/messages。

模型回答看不到图片细节?

先看该模型在上面的清单里是否标为支持图片;再检查图片是否超过 20 MB 或不是 PNG/JPEG/WebP。仍有问题把 response.model 和时间发给支持。

以后会不会不用镜像?

TommyAPI 已向 models.dev 官方目录提交收录(anomalyco/models.dev#12821,审核中)。合并后 OpenCode 自带 tommyapi provider,方案 A 的环境变量可以去掉,配置继续有效。

安全提示:示例里的密钥用环境变量注入;不要把 sk- 开头的密钥提交进仓库或贴到前端。