现场是这样的。把 openai 从 0.28 升到 1.51,环境变量里还留着 0.28 时代的 api_base,结果是请求打到了 /v1/v1/chat/completions,返回 404,日志里能看到重复的版本段。

中间走过弯路,把「自定义网关本身路径就带 /v1,客户端又补了一次」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。旧变量 API_BASE 仍被读取,与新参数叠加了一层;代码里同时传了 base_url 与默认值,后者覆盖前者;环境变量在容器里被镜像固化了旧值。

先打印客户端实际使用的基础地址

python -c "import openai;print(openai.OpenAI().base_url)"

然后清掉旧变量后显式传参

python -c "import os;os.environ.pop('OPENAI_API_BASE',None);import openai;print(openai.OpenAI(base_url='http://127.0.0.1:8000/v1').base_url)"

直接请求确认最终拼接结果

curl -sS -o /dev/null -w '%{http_code} %{url_effective}\n' http://127.0.0.1:8000/v1/models

末了容器内确认环境变量来源

docker exec api env | grep -i openai

恢复的判定其实很直接。实际请求路径只出现一次 /v1,模型列表返回 200,SDK 与 curl 访问同一地址结果一致。

0.28 到 1.x 的变量名变了语义没变,迁移时清理环境变量比改代码更关键,容器镜像里最容易被忘掉。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189