把 base_url 设成 http://localhost:11434 后直接调 /chat/completions,返回 404 page not found,换成 /api/generate 却能通。

这类报错背后常见的原因有几处,逐个排除就行。OpenAI 兼容接口的路径前缀是 /v1;客户端把 base_url 又拼了一层,出现重复路径;老版本 Ollama 尚未提供兼容接口;用了 /v1/completions 但模型是对话模型。

动手时先确认服务版本支持兼容接口

ollama --version

补全 /v1 前缀再请求

curl http://localhost:11434/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"qwen2.5:7b","messages":[{"role":"user","content":"hi"}]}'

SDK 里 base_url 只写到 /v1 为止

client = OpenAI(base_url='http://localhost:11434/v1', api_key='ollama')

剩下的就是打印最终请求地址排查重复拼接

print(client.base_url)

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

白天有业务在跑,能验证的部分都压到了晚上做。

当时还开着另一个排查窗口,两边日志对照着看才定位到。

改完先别撤,确认这几项。请求返回 200 且结构与 OpenAI 一致,SDK 无需改业务代码即可复用,日志里不再出现 404,客户端也不必为本地和云端各写一套调用逻辑。

兼容层只是模拟接口,tools、response_format 等高级参数支持有限,遇到奇怪的空响应优先换回原生 /api 接口。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189