launch: `ollama launch opencode` fails on OpenCode v2 because `opencode debug config` returns an array

这个报错通常出现在已经升级到 OpenCode v2,却仍用 Ollama 0.40.11 的 ollama launch opencode 启动本地模型的场景;优先把 Ollama 升级到包含 #19310 修复的版本( v0.40.12-rc1 及之后)。

快速结论:这个报错通常出现在已经升级到 OpenCode v2,却仍用 Ollama 0.40.11 的 ollama launch opencode 启动本地模型的场景;优先把 Ollama 升级到包含 #19310 修复的版本(v0.40.12-rc1 及之后)。

适用环境:Issue 已确认的环境为 Ollama 0.40.11、macOS(Apple Silicon / arm64,Apple M4)、OpenCode v2.1.4 与 v2.0.31。Python、CUDA、PyTorch 等不在讨论范围内。

最快修复方案:升级到 v0.40.12-rc1 或更高的 Ollama 版本,然后用本地模型、不附加 OpenCode 转发参数重新执行 ollama launch opencode --model <本地模型>。官方已在 OpenCode 2.1.4 上验证修复有效。

注意事项:修复目前只在 v0.40.12-rc1 预发布版中提供,正式版 0.40.12 发布前仍可能遇到该问题。Issue 中提到,此问题修复后还会撞上另一个独立问题 #19296(Unrecognized flag: --model),需要分别处理。

问题场景

用户在 OpenCode v2(Issue 中为 v2.1.4,评论区另有 v2.0.31)环境下,通过 Ollama 0.40.11 的 ollama launch opencode --model <本地模型> 启动本地模型。命令在 OpenCode 真正启动之前就被中断,换成不同模型(如 flint、gemma4:12b、GGUF 模型)都会复现,与具体模型无关。云端模型不走这段读取逻辑,因此不受影响。

报错原文

$ ollama launch opencode --model flint
Loading flint:latest...
Error: could not read OpenCode model limits: json: cannot unmarshal array into Go value of type struct { Provider map[string]struct { Models map[string]struct { Limit struct { Input int; Output int } } } }

原因分析

cmd/launch/opencode.go 中的 runContent 会执行 opencode debug config,并把输出按 OpenCode v1 的配置结构反序列化。OpenCode v2 的 debug config 改为输出配置来源列表,顶层是一个由 {type, path, info} 条目组成的 JSON 数组,因此 Go 端在解析第一个字符时就报 cannot unmarshal array,启动流程直接中止且没有回退逻辑。

Issue 正文指出,仅去掉数组外壳还不够:v2 同时改掉了结构键名,providers 取代 provider、package 取代 npm、settings 取代 options,且 model 变成带 providerID 和 model 的对象,所以即便解包也找不到 ollama provider。

触发该读取还需要同时满足:使用本地模型、没有转发参数、内联配置中含模型条目、且 /api/ps 返回的上下文长度至少为 4。这段读取的唯一目的是让用户配置中更小的 limit.input / limit.output 覆盖启动器计算出的限额,因此适合把无法识别的配置视为“无用户限额”并继续启动。

环境排查

  • Ollama 版本:确认是否为 0.40.11,是否已升级到 v0.40.12-rc1 或更高。
  • OpenCode 版本:确认是否为 v2.x(Issue 中复现版本为 v2.1.4 与 v2.0.31)。
  • 平台:Issue 中为 macOS / Apple Silicon;其他平台未在讨论中确认。
  • 模型类型:是否为本地模型(云端模型不触发该读取路径)。
  • 启动参数:是否附加了会被转发给 OpenCode 的参数。
  • 配置位置:本地内联配置中是否存在模型条目,以及 opencode debug config 输出的顶层是数组还是对象。

解决步骤

  1. 可优先尝试:将 Ollama 升级到 v0.40.12-rc1 或更高版本(修复提交为 #19310)。
  2. 如前一步暂不可行,评论区提供的绕过方式是:在 ~/.config/opencode/opencode.json 中直接声明 ollama provider,采用 openai-compatible 形式,baseURL 指向 http://127.0.0.1:11434/v1,并为每个模型声明真实的 limit: { context, output }(评论区指出 OpenCode 需要不少于 64k 的上下文),然后直接运行 opencode,不再经过 ollama launch。评论区反馈该方式在 0.40.11 / v2.0.31 上可端到端工作,包括工具调用类 agent。
  3. 另一种临时做法是回退 OpenCode 版本:评论区有人先执行 opencode uninstall,再通过 Ollama 重新安装(Ollama 初始默认安装的是可用版本),从而暂时恢复使用;升级到 v2 后问题再次出现。
  4. 升级并重测时,按官方说明使用本地模型、不附加 OpenCode 转发参数。若此时出现 Unrecognized flag: --model,那是 #19296 的独立问题,不属于本 Issue 范围。

验证方法

在升级后的 Ollama 上执行 ollama launch opencode --model <本地模型>,确认不再出现 could not read OpenCode model limits 报错,并且 OpenCode 能正常启动。维护者说明修复后仍保留输入/输出限额覆盖与项目优先级行为,可同时确认自定义的 limit.input / limit.output 仍然生效、更小的用户设置仍能覆盖启动器计算值。

参考来源

ollama/ollama #19303

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 30551

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注