llama.cpp b3xxx 版本加载 Qwen2.5-7B-Instruct,通过 /v1/chat/completions 传 tools,模型回了文本形式的 JSON,tool_calls 字段为空,换 Ollama 用同一模型能正常调用。

把日志和配置对完,能解释这个现象的基本就这几处。服务端没开 --jinja,模板不渲染工具段;GGUF 内嵌模板不支持 tools 变量;请求里 tool_choice 用了 auto 之外的取值;上下文长度不足,工具定义被截断。

带 --jinja 重启并确认端口

./llama-server -m qwen2.5-7b-instruct-q4_k_m.gguf --jinja -c 8192 --port 8080

发送一次工具请求验证返回结构

curl http://127.0.0.1:8080/v1/chat/completions -H 'Content-Type: application/json' -d @tool_req.json

不开 jinja 时对照一次输出

./llama-server -m model.gguf --port 8081

剩下的就是检查模板里有没有 tools 段

python -c "print(open('chat_template.jinja').read().count('tools'))"

命令输出我都留了记录,免得改完记不清原来的值。

改之前先确认了最近有没有人动过配置,避免白查一遍。

这次没动代码,只在配置和运行环境上找原因。

隔了一天再看,现象没变,说明不是偶发。

改完先别撤,确认这几项。返回体里 tool_calls 有名称和参数,参数能被 json.loads 解析,结果与 Ollama 一致。

本地推理的工具调用依赖模板渲染,模型会写 JSON 不代表服务端会组装成 tool_calls。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189