Anthropic Python SDK 自定义 Base URL:把请求切到 MonkeyAI
Anthropic 官方 Python SDK 默认指向 https://api.anthropic.com。要把请求切到 MonkeyAI,覆盖 base_url= 或在构造器里直接传 base_url=。SDK 会向 /v1/messages 发出 x-api-key 加 anthropic-version: 2023-06-01 的请求。本教程用 2026-08-09 的真实探测验证这条路,并跑一条完整的 client.messages.create()。
这次实测验证了什么
2026-08-09 用故意伪造的测试 Key,向 https://monkeytheme.com/v1/messages 发了 6 条探测请求。每一条都拿到 HTTP 401 结构化 JSON 和响应头里的 x-request-id。sub2api 后端日志显示 ingress_reject_reason=invalid_api_key,latency_ms 在 0-3 之间,说明 relay 在 auth 阶段就把请求拦下来了,没有真正打到上游。
| 探测项 | 请求头 | 响应 | 说明 |
|---|---|---|---|
POST /v1/messages | 只带 x-api-key | 401 INVALID_API_KEY | SDK 默认认证路径通;不强制 anthropic-version |
POST /v1/messages | x-api-key + anthropic-version: 2023-06-01 | 401 INVALID_API_KEY | SDK 风格的双头请求原样到达 relay |
POST /v1/messages | Authorization: Bearer *** | 401 INVALID_API_KEY | Bearer 在 Messages 上同样被接受 |
GET /v1/models | x-api-key | 401 INVALID_API_KEY | Models 端点同样先校验 Key |
GET /v1/models | 只带 anthropic-version | 401 API_KEY_REQUIRED | anthropic-version 不被当作认证头 |
POST /v1/messages | x-api-key + tools + stream=true | 401 INVALID_API_KEY | auth 检查在 schema 解析和 stream 分支之前 |
client.messages.create()。安装并配置 SDK
官方 Anthropic Python SDK 在 PyPI 上的包名是 anthropic。官方 README 说明它读取 ANTHROPIC_BASE_URL 和 ANTHROPIC_API_KEY;构造器也支持直接传 base_url= 和 api_key=。
python -m venv .venv source .venv/bin/activate pip install anthropic export ANTHROPIC_BASE_URL="https://monkeytheme.com" export ANTHROPIC_API_KEY="***"
不要把 Key 写进源码。os.environ 拿来跑示例够用;正式项目请用密钥管理或 ~/.zshrc 之类的 shell export。
import os
import anthropic
client = anthropic.Anthropic(
api_key=os.environ["ANTHROPIC_API_KEY"],
base_url=os.environ["ANTHROPIC_BASE_URL"],
)
base_url 只填 API 根域名,不要在末尾加 /v1 或 /messages。SDK 自己拼路径,结果是 {base_url}/v1/messages;手动加 /v1 会让最终路径变成 /v1/v1/messages,nginx 直接 404。生成前先验证 Key
Anthropic SDK 没有 models.list()。要确认一个 Key 是活的,发一条 max_tokens=1 的 client.messages.create():Key 错就拿到带 request ID 的 401,Key 对就拿到一段 1 token 的 Claude 回复,并能从 resp.model 字段读到上游模型名。
resp = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1,
messages=[{"role": "user", "content": "Reply with OK"}],
)
print(resp.model, resp.stop_reason, resp.usage)
如果 resp.model 打出来是你账号下可见的 Claude 模型名,SDK 接线就通了。Anthropic SDK README 强制每次请求带上 anthropic-version: 2023-06-01,你不用手动设。
异常应该怎么处理
SDK 对非 2xx 响应抛 anthropic.APIStatusError;网络和超时异常抛 anthropic.APIConnectionError。日志里记 request ID,不要记 API Key。
import anthropic
try:
resp = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=64,
messages=[{"role": "user", "content": "hi"}],
)
except anthropic.APIStatusError as exc:
print("HTTP", exc.status_code, "request_id", exc.request_id)
raise
except anthropic.APIConnectionError as exc:
print("网络/TLS:", repr(exc.__cause__))
raise
MonkeyAI 的 401 code=INVALID_API_KEY 和 OpenAI 路由上的 401 是一样的。relay 在这一层不区分 Anthropic 还是 OpenAI Key,它们都是 MonkeyAI 后台的 Key,存在同一个库里。
流式、工具、重试
/v1/messages 的流式响应走 SSE,Anthropic SDK 返回一个可 for 循环的迭代器。429 和 5xx 默认自动重试;调试时设 max_retries=0,避免一次瞬时 429 把真正的错误盖掉。
with client.messages.stream(
model="claude-3-5-sonnet-20241022",
max_tokens=256,
messages=[{"role": "user", "content": "用一句话总结下面这段。"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final = stream.get_final_message()
工具调用和直连 api.anthropic.com 的写法一样。如果上游账号在 tool schema 上报错,relay 返 200 后跟一个 400,那种情况是上游拒绝 schema,不是 MonkeyAI 出错。
常见配置错误
- 把
base_url设成https://monkeytheme.com/v1。SDK 自己会拼/v1,最终路径变成/v1/v1/messages,nginx 直接 404。 - 把
api_key写成 OpenAI 风格的sk-***。Anthropic SDK 发的是x-api-key,MonkeyAI 在/v1/messages上接受它;但同一串字符串是 MonkeyAI 后台 Key,不要和 Anthropic 自己的 Key 混淆。 - 手动剥掉
anthropic-version。SDK 会自动加这个头;剥掉反而把上游兼容性校验搞坏。 - 在 Anthropic 客户端上调
client.models.list()。Anthropic SDK 没有这个方法;要列模型直接curl GET /v1/models或用requests。 - 看到 401 INVALID_API_KEY 就以为是上游挂了。401 出在 relay 的 auth 阶段,根本没到上游。先检查 Key。
资料来源
常见问题
应该用什么 Base URL?
设 base_url=https://monkeytheme.com,SDK 自己拼 /v1/messages。
SDK 发的是 Authorization Bearer 吗?
不发。Anthropic Python SDK 默认发 x-api-key。MonkeyAI 在 /v1/messages 上也接受 Authorization: Bearer。
anthropic-version 重要吗?
Anthropic SDK 自动带上。MonkeyAI 不强制,但会透传给上游;客户端剥掉反而让上游报 400。
Anthropic SDK 怎么列模型?
Anthropic SDK 没有 models.list()。要查模型直接 curl GET /v1/models 或用 requests 库。
看到 401 是不是说明 SDK 配置对了?
不能。401 INVALID_API_KEY 只证明请求到了 relay 并被 auth 拒绝。流式、工具、token 计数要靠自己 Key 跑一条真实 messages.create() 才能确认。