这个坑值得记一笔。在 Windows 用 openai 1.55 把 base_url 指到 kg.openai.azure.com/openai/deployments/gpt-4o,api_version 填的 2024-12-01-preview,调用返回 401,原文 Unauthorized. Access token is missing or invalid,换成 api-key 头也一样。
刚开始盯着「key 属于另一个订阅下的 Azure OpenAI 资源」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。资源名或路径写错,请求打到了另一个 endpoint;api_version 在该区域还没上线,网关直接按未授权处理;SDK 走了 Entra ID 令牌,没有带 api-key。
动手时先把 SDK 实际拼出的 URL 和请求头打出来
python -c "from openai import AzureOpenAI;c=AzureOpenAI(azure_endpoint='https://kg.openai.azure.com',api_version='2024-10-21',api_key='k');print(c.base_url)"
随后用 curl 带 api-key 直连同一部署做对照
curl -s -o - -w '%{http_code}' "https://kg.openai.azure.com/openai/deployments/gpt-4o/chat/completions?api-version=2024-10-21" -H "api-key: $AZURE_KEY" -H 'Content-Type: application/json' -d '{"messages":[{"role":"user","content":"ping"}]}'
然后列出该资源下真实存在的部署名
az cognitiveservices account deployment list --name kg --resource-group rg-ai -o table
固定 endpoint 与 api_version 后重开进程再请求
python smoke_azure.py --api-version 2024-10-21
那几天正好在做别的变更,先把时间线对齐才敢动手。
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
改完先别撤,确认这几项。同一个 curl 返回 200 且 choices 非空,日志里的 URL 只出现一层 /openai,401 不再复现。
Azure 的 base_url 不能像官方接口那样带 /v1,不同 SDK 版本对 azure_endpoint 的拼接方式也不一样,先把最终 URL 打印出来再改参数,比猜快得多。这类问题最好一次改到位,反复小改反而容易把原因搅混。
