报错是这么冒出来的。在 Windows 上用 anthropic 0.40 统计历史长度,client.messages.count_tokens(model='claude-3-5-sonnet-20241022', messages=[...]) 直接抛 404,原文是 {'type': 'not_found_error', 'message': 'Not found'},同一个 key 调 messages.create 正常,只是 base_url 指向了公司自建网关,换过 key、重装 SDK 都一样。
中间走过弯路,把「请求缺 anthropic-version 头被网关直接挡成 404」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。网关只转发了 /v1/messages 没有实现计数路由。另一种情况是base_url 尾部多写一层 /v1 拼成 /v1/v1/messages/count_tokens。
不容易想到的是,旧版 SDK 走 beta 路径带 query 参数网关不认。
动手时先绕开 SDK 用 curl 打官方计数端点
curl https://api.anthropic.com/v1/messages/count_tokens -H "x-api-key: $KEY" -H "anthropic-version: 2023-06-01" -H "content-type: application/json" -d '{"model":"claude-3-5-sonnet-20241022","messages":[{"role":"user","content":"hi"}]}'
再用同样的头打网关地址对比返回码
curl -i https://gw.internal/anthropic/v1/messages/count_tokens -H "x-api-key: $KEY" -H "anthropic-version: 2023-06-01" -d '{"model":"claude-3-5-sonnet-20241022","messages":[{"role":"user","content":"hi"}]}'
接着打开 SDK 日志看它实际请求的 URL
$env:ANTHROPIC_LOG='debug'; python count.py
网关暂不支持时先用本地分词估算兜底
python -c "import tiktoken;e=tiktoken.get_encoding('cl100k_base');print(len(e.encode('要统计的文本')))"
恢复的判定其实很直接。官方 curl 返回 input_tokens 数值,网关补上路由后 SDK 拿到的计数与官方相差不超过 5%,不再出现 404。
计数接口本身不计费,但同样会校验模型快照名,名字写错时返回的也是 404,别只怀疑网络。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
