问题出现得很突然,日志倒是留得挺全。接自建网关时把 base_url 写成 https://gateway.example.com/v1,openai 1.40 把请求打到了 /v1/v1/chat/completions,返回 404,原文 Invalid URL (POST /v1/v1/chat/completions)。

刚开始盯着「网关只挂了一个前缀 没有做路径兼容」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。SDK 会补全路径但不会去掉重复的版本段。还有一种是环境变量和代码两处都设了 base_url。

少数情况下是旧版 SDK 的 api_base 语义与现在不同。

动手时先打印客户端最终使用的 base_url

python -c "import openai;print(openai.OpenAI(base_url='https://gateway.example.com/v1').base_url)"

随后用 curl 验证网关真实路径

curl -s -o /dev/null -w '%{http_code}' https://gateway.example.com/v1/chat/completions -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"hi"}]}'

然后把 base_url 改成不带版本段的根地址

python -c "print('https://gateway.example.com')"

等前面都确认过,再清掉环境变量后重启服务

Remove-Item Env:OPENAI_BASE_URL; python app.py

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

怎么算真的好了,看的是同一批现象。请求路径变成 /v1/chat/completions,返回 200,网关访问日志里没有重复前缀。

补一句。base_url 是拼接用的根路径,不是完整接口地址,带不带版本段要看网关怎么挂。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189