配置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 工具。
排查过程
1. 检查模型是否支持工具调用
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:
说明模型本身支持工具调用。
2. 检查 OpenClaw 配置
查看 ~/.openclaw/openclaw.json:
"ollama": {
"baseUrl": "http://127.0.0.1:11434/v1",
"apiKey": "ollama-local",
"api": "openai-completions",
...
}
问题找到了!
根本原因
查阅 OpenClaw 官方文档,发现明确警告:
Do not use the
/v1OpenAI-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 API:
baseUrl: "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",
...
}
]
}
关键改动:
- 去掉
/v1:baseUrl改为http://127.0.0.1:11434 - 使用原生 API:
api改为"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),不会撑爆系统
- 工具调用能力稳定
- 推理速度适中
总结
- Ollama 有两种 API 模式:原生 API 和 OpenAI 兼容 API
- 工具调用必须用原生 API:
baseUrl不带/v1,api设为"ollama" - 选择合适的模型大小:考虑内存限制,
qwen3.5:9b是个不错的平衡点

暂无评论
要发表评论,您必须先 登录