报错是这么冒出来的。照着 OpenAI 的习惯写了 Authorization: Bearer,claude-3-5-sonnet 返回 401 invalid x-api-key,同一个 key 放到 Anthropic 控制台的示例里能通,用的是 requests 手搓请求。
中间走过弯路,把「同时带了 Authorization,被网关优先取走」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。Anthropic 鉴权头叫 x-api-key,Bearer 写法它不认。还有一种是头名大小写被中间件改过,HTTP 层不区分但网关会。
少数情况下是key 尾部带空格,从 CSV 里复制时粘进了制表符。
上来先用最小请求验证头的写法
curl -sS https://api.anthropic.com/v1/messages -H "x-api-key: $ANTHROPIC_API_KEY" -H "anthropic-version: 2023-06-01" -H "content-type: application/json" -d '{"model":"claude-3-5-sonnet-20241022","max_tokens":16,"messages":[{"role":"user","content":"hi"}]}'
然后把多余的 Authorization 头剥掉再试
curl -sS -H "Authorization:" https://api.anthropic.com/v1/messages -H "x-api-key: $ANTHROPIC_API_KEY" -H "anthropic-version: 2023-06-01" -d @p.json
末了打印 key 长度与首尾字符排除空白
python -c "k=open('key.txt').read();print(len(k),repr(k[-6:]))"
那几天正好在做别的变更,先把时间线对齐才敢动手。
恢复的判定其实很直接。响应 200 且返回体 type 为 message,日志里鉴权头只剩 x-api-key,去掉 Authorization 后行为不变。
同一套代码要接多家模型时别用一个鉴权头兜底,provider 分支写清楚,隐藏的 Bearer 头反而会让网关走错通道。这类问题最好一次改到位,反复小改反而容易把原因搅混。
