OpenCode 只认它自己的模型目录(models.dev)和你配置里写的 modalities。自定义中转商的模型默认被当成“纯文本”,于是你会看到 this model does not support image input,哪怕模型本身能看图。下面三种接法任选其一,都由 TommyAPI 每小时自动生成、每周用真实图片实测,不用你手写模型能力。
这是 OpenCode 的本地判定,不是 TommyAPI 返回的错误。
OpenCode 从 models.opencode.ai(models.dev 镜像)读取每个 provider 的模型能力:能不能收图、能不能调工具、上下文多大。
用 @ai-sdk/openai-compatible 手工接入的中转,只要模型条目没写 modalities.input 包含 image,读图工具就会在本地直接拦下,请求根本不会发出去。
要么让 tommyapi 进入它读的目录(方案 A),要么把能力写进你的 opencode.json(方案 B / C)。TommyAPI 这边 deepseek-v4.1-flash、kimi-k2.6、qwen3.8-max 等模型传图是通的。
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密钥"
~/.cache/opencode/),再重启一次就能在 provider 列表里看到 TommyAPI;之后每小时自动刷新。执行 /connect,列表里选 TommyAPI(或直接用上面的 TOMMYAPI_API_KEY 环境变量,不用再填)。/models,选 tommyapi/deepseek-v4.1-flash 或任意模型。能看图的模型会直接带图片能力,上下文、价格、推理档位也一并带上。镜像地址直接可访问:https://tommyapi.com/models.dev/api.json。OpenCode 会先请求 /experimental/v2.0/api.json,收到 404 后自动回退到这个 v1 目录,这是它对自定义镜像的既定行为。
不想改环境变量,就把自动生成的 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.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": { "...": "见下载文件" }
}
}
}如果你已经按自己的方式配好了 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,以下面这份实测清单为准。
TommyAPI 每周给货架上每个文本模型发一张 128×128 纯红色图片,答对颜色才标记为支持图片输入;上游拒收或答错的标记为纯文本。结果同时写进 GET /v1/models 的 architecture.input_modalities,Cline、Roo Code、Cherry Studio 等读 /v1/models 的客户端也会自动拿到。
纯文本模型(传图会被 OpenCode 在本地拦下,属正常):
机器可读:/opencode/vision-models.json · 完整 provider 条目(models.dev v1 格式):/opencode/tommyapi.json
OpenCode 会缓存模型目录。换了 OPENCODE_MODELS_URL 后完整退出再启动一次;用方案 B/C 时确认模型 id 和配置里的键完全一致(区分大小写)。
不需要。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- 开头的密钥提交进仓库或贴到前端。