OpenCode 接本地 Ollama 一直不会调工具?排查一上午,最后发现是上下文长度的坑

0 阅读4分钟

背景

之前使用opencode调用远端模型一切都很顺利,最近想着自己还有个RTX 5060Ti 16G的GPU,想着在家里部署一个本地模型服务,这样能使用本地的模型。整体配置是 OpenCode + Ollama + 本地大模型。原本以为把模型接上就能像在线编程助手一样,直接读写文件、生成页面、修改代码,结果却很坑:同样的提示词,Kimi 能正常生成 HTML 文件,本地的 qwen / gemma 却总是只输出命令、甚至偶尔显示要调用工具,但就是不真正执行。排查一上午才发现真正的问题并不是权限、也不是模型完全不会工具调用,而是一个非常容易被忽略的点:Ollama 的上下文长度太小了。

现象:模型“看起来会”,但就是“不落地”

我遇到的症状大概有这几种:

  • 模型会输出一段 Thinking
  • 模型会说“我准备先列出目录,再创建文件……”
  • 有时候会直接把 lsecho ... > file 这种命令打印出来
  • 有时候界面里甚至会出现 Bash
  • 但最终就是没有真正创建文件,没有真正执行工具

image.png

最开始我怀疑的是下面这些方向:

  1. OpenCode 权限没配好
  2. Ollama 的 OpenAI-compatible 接口不支持工具调用
  3. 本地模型(比如 qwen/gemma)根本不适合 agent
  4. OpenCode 和 Ollama 的兼容有 bug

这些怀疑都不是完全没道理,但它们都不是这次问题的真正根因。

排查过程

在chatgpt建议下,我首先尝试绕过 OpenCode,直接用 curl 调 Ollama 的 /v1/chat/completions,强制要求模型调用工具。

结果非常明确:模型是能返回标准 tool_calls 的。
这说明两件事:

  • Ollama 的 OpenAI-compatible 接口本身支持 tools/function calling。(Ollama 文档)
  • 模型也不是完全不会工具调用,至少在“被强制要求调用工具”的场景里,它是能按格式返回的。

接着我又看了 OpenCode 的日志,发现:

  • bash / read / write / edit / glob / grep 这些工具都已经成功注册
  • 权限也是放开的
  • 但是后续只有模型流式输出,没有真正的工具执行记录

这时候问题范围已经被大幅缩小了:
不是工具没注册,也不是权限挡住了,而是模型在 OpenCode 这类多轮 agent 流程里没有稳定地完成工具调用。

真正的元凶:Ollama 默认上下文太小

最后我去翻官方文档,才确认了真正的问题。

Ollama 官方写得很直接:默认上下文长度会根据显存大小决定。如果显存小于 24 GiB,默认上下文就是 4k;而像 agents、coding tools、web search 这种任务,建议至少设置到 64k tokens。(Ollama 文档)

更关键的是,Ollama 官方在 OpenCode 集成文档里也明确写了:OpenCode 需要更大的上下文窗口,推荐至少 64k tokens。 (Ollama 文档)

这就完全解释了我遇到的现象:

  • 普通聊天时模型看起来没问题
  • 简单问候、解释类任务也没问题
  • 一到 OpenCode 这种需要系统提示词、工具描述、上下文状态、文件操作规划一起塞进上下文里的场景,4k 很快就不够用了
  • 最终表现出来就是:模型像是“知道要做什么”,但就是不能稳定地把动作真正执行出来

说白了,不是模型完全不会,而是上下文太小,Agent 框架需要的信息塞不下

最终解决方案

我的解决办法很简单:把 Ollama 的上下文长度调大到 64k

如果你的 Ollama 跑在 Windows

这也是很多人最常见的情况:
Ollama 在 Windows 上运行,OpenCode 在 WSL 里连接它。

这种情况下,要改的是 Windows 侧的 Ollama 环境变量。Ollama 官方 FAQ 说明,Windows 版会继承用户和系统环境变量。(Ollama 文档)

设置方式:

  1. 退出 Ollama
  2. 打开“编辑账户环境变量”
  3. 新建变量:

image.png

OLLAMA_CONTEXT_LENGTH=65534

4. 保存 5. 重新启动 Ollama,这时就正常了。

image.png

总结

这次踩坑最核心的一句话就是:

OpenCode 接本地 Ollama 模型时,如果工具调用总是“看起来会、实际上不会”,非常有可能不是模型不行,而是上下文长度太小。

最终把上下文提到 64k 之后,问题才终于恢复正常。 回头看,这个坑真的很浪费时间,但也确实值得记下来——因为它太像“模型能力问题”了,实际上却是“运行参数问题”。

参考

  1. ollama和qwen3.5:9b在opencode中根本无法正常工作,www.reddit.com/r/LocalLLaM…