Anthropic SDK · Python · MonkeyAI · 2026-08-09 实测

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()。

Base URLhttps://monkeytheme.com
端点POST /v1/messages
认证头x-api-key(SDK 默认)
实测日期2026-08-09

这次实测验证了什么

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-key401 INVALID_API_KEYSDK 默认认证路径通;不强制 anthropic-version
POST /v1/messagesx-api-key + anthropic-version: 2023-06-01401 INVALID_API_KEYSDK 风格的双头请求原样到达 relay
POST /v1/messagesAuthorization: Bearer ***401 INVALID_API_KEYBearer 在 Messages 上同样被接受
GET /v1/modelsx-api-key401 INVALID_API_KEYModels 端点同样先校验 Key
GET /v1/models只带 anthropic-version401 API_KEY_REQUIREDanthropic-version 不被当作认证头
POST /v1/messagesx-api-key + tools + stream=true401 INVALID_API_KEYauth 检查在 schema 解析和 stream 分支之前
本页没有用真实账号跑端到端生成。401 INVALID_API_KEY 只能证明路由和认证层通了,不能证明生成能力。要确认 Claude 真能返回文本,用自己的 Key 跑下面那段 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?

设 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() 才能确认。

相关教程

OpenAI Python SDK

/v1/chat/completions 和 /v1/responses 的 OpenAI 兼容等价写法。

打开页面

Anthropic Node SDK

Node.js 版的同一套接线,用 @anthropic-ai/sdk 和 baseURL。

打开页面

Claude Code 网关

把 Anthropic SDK 用在 Claude Code CLI 上,靠 ANTHROPIC_BASE_URL。

打开页面

401 invalid token

401 INVALID_API_KEY 在 /v1/messages 上到底意味着什么。

打开页面

端点覆盖

2026-08-09 实测的 /v1 完整端点矩阵。

打开 page

504 upstream timeout

为什么同一条路由,401 几十毫秒,504 就要等很久。

打开页面