Anthropic Node SDK 自定义 baseURL:把请求切到 MonkeyAI
Anthropic 官方 Node SDK(@anthropic-ai/sdk)默认指向 https://api.anthropic.com。要把请求切到 MonkeyAI,在构造器里直接传 baseURL:,或导出 ANTHROPIC_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 阶段就把请求拦下来了,没有真正打到上游。Node SDK 的行为和 Python SDK 一致,因为两者实现的是同一套 wire 协议。
| 探测项 | 请求头 | 响应 | 说明 |
|---|---|---|---|
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()。安装并配置客户端
官方 Anthropic Node SDK 在 npm 上的包名是 @anthropic-ai/sdk。构造器支持 baseURL、apiKey 和 authToken 三个参数。官方 README 说明它会读 ANTHROPIC_BASE_URL 和 ANTHROPIC_API_KEY 作为环境变量兜底。
npm install @anthropic-ai/sdk export ANTHROPIC_BASE_URL="https://monkeytheme.com" export ANTHROPIC_API_KEY="***"
不要把 Key 写进源码。process.env 拿来跑示例够用;正式项目请用密钥管理或 .env.local 这种不进版本控制的文件。
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
baseURL: process.env.ANTHROPIC_BASE_URL,
});
baseURL 只填 API 根域名,不要在末尾加 /v1 或 /messages。SDK 自己拼路径,结果是 {baseURL}/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 字段读到上游模型名。
const resp = await client.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 1,
messages: [{ role: "user", content: "Reply with OK" }],
});
console.log(resp.model, resp.stop_reason, resp.usage);
如果 resp.model 打出来是你账号下可见的 Claude 模型名,SDK 接线就通了。Anthropic SDK 强制每次请求带上 anthropic-version: 2023-06-01,你不用手动设。
异常应该怎么处理
SDK 对非 2xx 响应抛 APIError,其它 SDK 内部错误抛 AnthropicError。两者都暴露 .status 和 .headers。日志里记 request ID,不要记 API Key。
try {
const resp = await client.messages.create({
model: "claude-3-5-sonnet-20241022",
max_tokens: 64,
messages: [{ role: "user", content: "hi" }],
});
} catch (err) {
if (err.status) {
const reqId = err.headers?.get?.("x-request-id");
console.error("HTTP", err.status, "request_id", reqId);
} else {
console.error("网络/TLS:", err.cause ?? err.message);
}
throw err;
}
MonkeyAI 的 401 code=INVALID_API_KEY 和 OpenAI 路由上的 401 是一样的。relay 在这一层不区分 Anthropic 还是 OpenAI Key,它们都是 MonkeyAI 后台的 Key,存在同一个库里。
流式、工具、重试
/v1/messages 的流式响应走 SSE,Anthropic Node SDK 提供 client.messages.stream(...) 助手。429 和 5xx 默认自动重试;调试时设 maxRetries: 0,避免一次瞬时 429 把真正的错误盖掉。
const stream = client.messages.stream({
model: "claude-3-5-sonnet-20241022",
max_tokens: 256,
messages: [{ role: "user", content: "用一句话总结下面这段。" }],
});
for await (const event of stream) {
if (event.type === "content_block_delta" && event.delta.type === "text_delta") {
process.stdout.write(event.delta.text);
}
}
const final = await stream.finalMessage();
工具调用和直连 api.anthropic.com 的写法一样。如果上游账号在 tool schema 上报错,relay 返 200 后跟一个 400,那种情况是上游拒绝 schema,不是 MonkeyAI 出错。
常见配置错误
- 把
baseURL设成https://monkeytheme.com/v1。SDK 自己会拼/v1,最终路径变成/v1/v1/messages,nginx 直接 404。 - 把
apiKey写成 OpenAI 风格的sk-***。Anthropic SDK 发的是x-api-key,MonkeyAI 在/v1/messages上接受它;但同一串字符串是 MonkeyAI 后台 Key,不要和 Anthropic 自己的 Key 混淆。 - 用 fetch 拦截器手动剥掉
anthropic-version。SDK 会自动加这个头;剥掉反而把上游兼容性校验搞坏。 - 在 Anthropic 客户端上调
client.models.list()。Anthropic SDK 没有这个助手;要列模型直接fetch GET /v1/models或用undici。 - 看到 401 INVALID_API_KEY 就以为是上游挂了。401 出在 relay 的 auth 阶段,根本没到上游。先检查 Key。
资料来源
常见问题
应该传什么 baseURL?
传 baseURL: https://monkeytheme.com,SDK 自己拼 /v1/messages。
SDK 发的是 Authorization Bearer 吗?
不发。@anthropic-ai/sdk 默认发 x-api-key。MonkeyAI 在 /v1/messages 上也接受 Authorization: Bearer。
anthropic-version 重要吗?
Anthropic SDK 自动带上。MonkeyAI 不强制,但会透传给上游;客户端剥掉反而让上游报 400。
Anthropic Node SDK 怎么列模型?
Anthropic SDK 没有 models.list 助手。要查模型直接 fetch GET /v1/models 或用 undici。
看到 401 是不是说明 SDK 配置对了?
不能。401 INVALID_API_KEY 只证明请求到了 relay 并被 auth 拒绝。流式、工具、token 计数要靠自己 Key 跑一条真实 messages.create() 才能确认。