Ollama 本地模型工具调用失效问题排查与解决

AI摘要

配置OpenClaw时使用Ollama模型的OpenAI兼容API(/v1)导致工具调用失效,表现为模型误读文件或拒绝调用工具。排查发现需改用Ollama原生API(去掉/v1,api设为"ollama")。修正配置后,模型成功调用read工具读取指定文件,心跳任务恢复正常。

最近在配置 OpenClaw 心跳任务时,想让本地 Ollama 模型来执行定时检查。结果发现:模型能运行,但工具调用完全失效——要么读错文件,要么直接假设无法访问文件系统。

这篇文章记录了排查过程和最终解决方案。

心跳任务需要读取 HEARTBEAT.md 文件,然后执行里面的任务清单。但本地模型表现各异:

模型 大小 问题
gpt-oss:20b 13GB 读错文件,读了 USER.md 而不是 HEARTBEAT.md
qwen3.5:35b 26GB 不调用工具,直接返回 HEARTBEAT_OK
llama3.1:8b 4.9GB 写 Python 代码解释怎么做,但不执行
gemma3:4b 3.3GB 无输出
qwen3:30b-a3b 53GB 内存不足(需要 53GB,系统只有 15GB)

模型的 thinking 过程显示:

"I can't actually access the file system"
"The tools provided don't include a file reading function"

它们直接假设自己无法访问文件,根本没尝试调用 read 工具。

ollama show qwen3:30b-a3b --modelfile | head -30

发现模型的 template 里确实有 {{ .Tools }} 支持:

{{- if .Tools }}# Tools

You may call one or more functions to assist with the user query.

You are provided with function signatures within <tools></tools> XML tags:

说明模型本身支持工具调用。

查看 ~/.openclaw/openclaw.json

"ollama": {
  "baseUrl": "http://127.0.0.1:11434/v1",
  "apiKey": "ollama-local",
  "api": "openai-completions",
  ...
}

问题找到了!

查阅 OpenClaw 官方文档,发现明确警告:

Do not use the /v1 OpenAI-compatible URL (http://host:11434/v1) with OpenClaw. This breaks tool calling and models may output raw tool JSON as plain text. Use the native Ollama API URL instead: baseUrl: "http://host:11434" (no /v1).

简单说:

  • 原生 Ollama APIbaseUrl: "http://host:11434" + api: "ollama" → 工具调用可靠
  • OpenAI 兼容模式baseUrl: "http://host:11434/v1" + api: "openai-completions" → 工具调用不可靠

之前的配置用了 OpenAI 兼容模式,导致工具调用失效。

修改 ~/.openclaw/openclaw.json

"ollama": {
  "baseUrl": "http://127.0.0.1:11434",
  "apiKey": "ollama-local",
  "api": "ollama",
  "models": [
    {
      "id": "qwen3.5:9b",
      "name": "qwen3.5:9b",
      ...
    }
  ]
}

关键改动:

  1. 去掉 /v1baseUrl 改为 http://127.0.0.1:11434
  2. 使用原生 APIapi 改为 "ollama"

然后重启 Gateway:

systemctl --user restart openclaw-gateway.service

测试心跳任务:

# 使用 ollama/qwen3.5:9b 测试
openclaw heartbeat test

模型正确调用了 read 工具:

<function=read>
<parameter=path>
/home/saiita/.openclaw/workspace/HEARTBEAT.md
</parameter>
</function>

成功!

心跳任务配置:

"heartbeat": {
  "every": "30m",
  "model": "ollama/qwen3.5:9b",
  "target": "feishu",
  "to": "ou_xxx..."
}

选择 qwen3.5:9b 的原因:

  • 内存占用小(6.6GB),不会撑爆系统
  • 工具调用能力稳定
  • 推理速度适中

  1. Ollama 有两种 API 模式:原生 API 和 OpenAI 兼容 API
  2. 工具调用必须用原生 APIbaseUrl 不带 /v1api 设为 "ollama"
  3. 选择合适的模型大小:考虑内存限制,qwen3.5:9b 是个不错的平衡点

Saiita

我还没有学会写个人说明!

相关推荐

OpenClaw v2026.4.10:新增 Active Memory 自动记忆、Codex 原生支持、本地 MLX 语音

OpenClaw v2026.4.10版本带来了多项重要更新。核心亮点是全新的Active Memory插件,它能自动管理用户偏好和历史上下文,实现“无感记忆”,显著提升长期对话体验。同时,版本原生集成了Codex,方便开发者直接进行编程任务。针对macOS用户,新增了实验性的本地MLX语音支持,提供更低延迟和更好隐私的语音对话。其他更新还包括视频生成模型支持、Microsoft Teams功能增强、CLI

暂无评论