Claude API 中转接入:Messages 请求与 Python 示例
Claude 中转接入先确认服务与账户条件,再把 API Key、Base URL 和模型 ID 分开:先用 curl 验证原生 Messages,再接 Python SDK,并验收流式 message_stop、usage 与 request-id。

Claude API 接入首先要分清原生 Messages 协议与 OpenAI SDK compatibility:它们的 Base URL 边界、请求头、消息结构和功能覆盖不同。
说到“Claude API 中转”,要先讲清是原生 Claude Messages API 还是 OpenAI 兼容层;本文以 Claude API Key、ANTHROPIC_BASE_URL 和可核验事件为边界,不用一个“兼容”标签代替协议说明。
直接复制:Claude API 接入第一条 Messages 请求
以下请求发到 GPTZZZ 的 Claude Messages 端点 https://gptzzz.ai/v1/messages。Key 用控制台 /keys 页面里 Claude官key 分组的 Key;CLAUDE_MODEL 是本文自定义变量,示例填模型价格页上的 claude-sonnet-5。原生 SDK 的 Base URL 只填主机根 https://gptzzz.ai。
export GPTZZZ_API_KEY="YOUR_GPTZZZ_API_KEY"
export CLAUDE_MODEL="claude-sonnet-5"
curl --fail-with-body -sS -D /tmp/claude-headers.txt \
"https://gptzzz.ai/v1/messages" \
-H "x-api-key: $GPTZZZ_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d "{\"model\":\"$CLAUDE_MODEL\",\"max_tokens\":256,\"messages\":[{\"role\":\"user\",\"content\":\"只回复 CLAUDE_OK\"}]}"
Windows PowerShell:
$env:GPTZZZ_API_KEY = "YOUR_GPTZZZ_API_KEY"
$env:CLAUDE_MODEL = "claude-sonnet-5"
$body = @{
model = $env:CLAUDE_MODEL
max_tokens = 256
messages = @(@{ role = "user"; content = "只回复 CLAUDE_OK" })
} | ConvertTo-Json -Depth 5
Invoke-RestMethod -Method Post -Uri "https://gptzzz.ai/v1/messages" `
-Headers @{ "x-api-key" = $env:GPTZZZ_API_KEY; "anthropic-version" = "2023-06-01" } `
-ContentType "application/json; charset=utf-8" `
-Body ([System.Text.Encoding]::UTF8.GetBytes($body))
验收 HTTP 2xx、type=message、role=assistant、带类型的 content[]、stop_reason、usage,并保存响应头 request-id。
Claude 模型都在 Claude官key 分组(计费倍率 0.39x)。一个 Key 只属于一个分组,只能调用这个分组里的模型;同时要用 GPT 等其他模型时,给对应分组再建一个 Key,余额共用。
| 模型 | 分组 · 倍率 | 输入 ¥/百万 Token | 输出 ¥/百万 Token |
|---|---|---|---|
| claude-fable-5.1 价格 | Claude官key · 0.39x | ¥46.90 | ¥234.00 |
| claude-opus-5.5 价格 | Claude官key · 0.39x | ¥18.70 | ¥93.70 |
| claude-opus-5 价格 | Claude官key · 0.39x | ¥23.40 | ¥117.00 |
| claude-opus-4.8 价格 | Claude官key · 0.39x | ¥3.91 | ¥19.50 |
| claude-sonnet-5 价格 | Claude官key · 0.39x | ¥1.56 | ¥7.81 |
| claude-sonnet-4.6 价格 | Claude官key · 0.39x | ¥2.34 | ¥11.70 |
表中价格取自 2026-10-09 的模型价格页,单位是元/百万 Token(充值 ¥1 = 余额 $1),已乘分组倍率;价格页共列 12 个 Claude 模型,缓存读写价格也在那里。实际扣费以 GPTZZZ 模型价格页和控制台为准。
Claude Base URL 与密钥位置
| 客户端/协议 | Base URL | 鉴权与资源 |
|---|---|---|
| Anthropic 原生官方 | https://api.anthropic.com | x-api-key;POST /v1/messages |
| GPTZZZ Anthropic 兼容 | https://gptzzz.ai | x-api-key;POST /v1/messages |
| Anthropic OpenAI SDK compatibility | https://api.anthropic.com/v1/ | OpenAI SDK 的 Chat Completions surface |
原生 SDK 会读取 ANTHROPIC_API_KEY 与 ANTHROPIC_BASE_URL。CLAUDE_MODEL、ANTHROPIC_MODEL 和 ANTHROPIC_VERSION 都不是 Python SDK 自动读取的模型/版本环境变量;SDK 会管理必要的 API 版本请求头。下面的 GPTZZZ 示例把 GPTZZZ_API_KEY 和 base_url 显式传给客户端,避免和官方 Key 混用。
Claude Python SDK 与完整响应验证
python -m pip install -U anthropic
import os
from anthropic import Anthropic
client = Anthropic(
api_key=os.environ["GPTZZZ_API_KEY"],
base_url="https://gptzzz.ai", # 只填主机根,不写 /v1/messages
timeout=90.0,
max_retries=2,
)
message = client.messages.create(
model=os.environ["CLAUDE_MODEL"],
max_tokens=256,
messages=[{"role": "user", "content": "只回复 CLAUDE_OK"}],
)
texts = [block.text for block in message.content if block.type == "text"]
if message.type != "message" or message.role != "assistant" or not texts:
raise RuntimeError(f"unexpected response: {message.to_json()}")
if message.stop_reason != "end_turn":
raise RuntimeError(f"unexpected stop_reason={message.stop_reason!r}")
print("".join(texts))
print({
"request_id": message._request_id,
"input_tokens": message.usage.input_tokens,
"output_tokens": message.usage.output_tokens,
})
对这条“只回复固定文本”的探针,end_turn 是预期;真实应用还要分别处理 max_tokens、tool_use、pause_turn、refusal 等有业务含义的结束原因。
Claude 流式输出与 message_stop
with client.messages.stream(
model=os.environ["CLAUDE_MODEL"],
max_tokens=512,
messages=[{"role": "user", "content": "分三点解释 API 网关"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final_message = stream.get_final_message()
request_id = stream.request_id
print()
print(final_message.stop_reason)
print(final_message.usage.output_tokens)
print(request_id)
Raw SSE 正常链路包含 message_start、内容块事件、message_delta 与 message_stop;可夹有 ping。错误也可能在 HTTP 200 后以 error 事件到达,解析器还应忽略它暂时不认识的新事件类型。
Claude 的 OpenAI 兼容层能做什么
Anthropic 官方将 OpenAI SDK compatibility 定位为测试和比较模型能力的便捷层,而不是多数场景的长期生产方案。需要 PDF、citations、完整 thinking、prompt caching 或原生内容块时,使用 Messages API。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ANTHROPIC_API_KEY"],
base_url="https://api.anthropic.com/v1/",
)
response = client.chat.completions.create(
model="claude-opus-5-5", # Anthropic 官方模型 ID,不是 GPTZZZ 的 ID
messages=[{"role": "user", "content": "只回复 CLAUDE_OK"}],
)
print(response.choices[0].message.content)
兼容层会忽略或降级部分字段:工具调用的 strict 不生效,audio 会被丢弃,prompt caching 不支持,多个 system/developer 消息会被合并,n 必须为 1。不要把无报错当成字段已生效。
错误类型与重试边界
| HTTP / error.type | 含义 | 动作 |
|---|---|---|
400 invalid_request_error | 格式、内容或额度上限 | 修复请求,不重试 |
401 authentication_error | Key 错误、撤销或过期 | 检查凭据 |
403 permission_error | 资源或策略无权限 | 核对项目与模型 |
404 not_found_error | 路径或资源不存在 | 核对 Base URL |
413 request_too_large | Messages 请求超过当前限制 | 缩小请求 |
429 rate_limit_error | 速率或额度 | 有限退避 |
529 overloaded_error | 服务过载 | 带抖动限次重试 |
Claude Code 的环境变量接入见 Claude Code 中转站配置;内容块、工具与 SSE 用 流式与工具兼容性矩阵验证;密钥隔离参考 API Key 安全指南;退避与幂等边界见 重试与回退设计。
Claude API 验证指标与回滚
对固定探针记录 HTTP 状态、首个 content_block_delta 时间、message_stop 完成率、总耗时、stop_reason、输入/输出 Token、重试次数和 request-id。工具用例另算完整闭环率(成功回传 tool_result 的任务数 ÷ 工具任务总数)。
- 终止在途消息与工具任务,保存最后事件和未执行的 tool_use ID。
- 恢复原
ANTHROPIC_BASE_URL、Key 来源和模型 ID,关闭旧连接。 - 在新进程运行相同 curl、Python 与流式探针。
- 确认内容块、结束原因、用量和工具闭环恢复后,再清理中转配置。
官方资料
- Anthropic API Overview
- Anthropic Messages API
- Anthropic Python SDK
- Anthropic Streaming
- Anthropic Errors
- Anthropic OpenAI SDK compatibility
第一次接入的完整步骤见 API 中转站怎么用;网关的工作原理与请求链路见 API 中转站是什么。
常见问题
Claude API Base URL 要不要包含 /v1?
Anthropic 原生 Python SDK 的 ANTHROPIC_BASE_URL 或 base_url 应是主机根,例如 https://api.anthropic.com;messages.create 会追加 /v1/messages。OpenAI SDK compatibility 的 base_url 才使用 https://api.anthropic.com/v1/。
Claude API 为什么使用 x-api-key 请求头?
Anthropic 静态 Console API Key 的原生 HTTP 请求可以使用 x-api-key,并同时发送 anthropic-version 与 content-type。Anthropic 认证文档把 Authorization: Bearer <key> 列为直接 HTTP 请求的主要写法,x-api-key 是仍受支持的旧写法;两种都可用于静态 Console Key。
Claude Python SDK 会自动读取哪些环境变量?
官方 Python SDK读取 ANTHROPIC_API_KEY 和 ANTHROPIC_BASE_URL。本文的 CLAUDE_MODEL 是为了示例清晰而自定义的变量,不是 SDK 自动读取的官方模型变量。
Claude API 能否直接使用 OpenAI SDK?
Anthropic 提供 OpenAI SDK compatibility,但定位主要是模型测试与比较。严格工具 Schema、音频、prompt caching、citations 和完整 thinking 等能力有缺失或字段被忽略,长期接入应优先原生 Messages API。
Claude 流式输出怎样确认 message_stop?
消费完整 SSE 事件链并等待 message_stop;使用 SDK 时调用 get_final_message,再检查 stop_reason、usage 与 request-id。HTTP 200 之后仍可能出现流内 error,不能只看首段文本。
Claude API 返回 401、429 或 529 怎么处理?
401 检查 Key 格式与状态,不重试;429 区分速率与额度并有限退避;529 是过载错误,可带抖动限次重试。三者都应保存稳定的 error.type 与 request_id,而不是按错误文案分支。
Claude Messages API 怎样用 curl 调用?
向主机根后的 /v1/messages 发送 x-api-key、anthropic-version: 2023-06-01 和 content-type,并在 JSON 中提供 model、max_tokens 与 messages;保存 request-id 和最终 usage。
Claude Python SDK 如何设置中转 Base URL?
把中转主机根放入 ANTHROPIC_BASE_URL,Key 放入 ANTHROPIC_API_KEY,再使用 Anthropic();不要把 /v1/messages 写进原生 SDK 的 base_url。
Claude API 返回 401 怎么排查?
检查 x-api-key 值、Key 是否撤销或过期、环境变量来源和请求主机。记录 authentication_error 与 request_id,修复凭据后再试,不要循环重试。
Claude 工具调用为什么普通聊天成功但工具失败?
工具链还依赖 tool_use ID、输入 JSON、tool_result 回传、内容块顺序和 stop_reason;网关只实现文本 Messages 时,普通聊天成功也不能证明工具协议完整。
国内如何使用 Claude API 中转接入?
国内使用 Claude API 中转的接入方式与本文一致:把中转站提供的主机根写入 ANTHROPIC_BASE_URL,先用测试 Key 验证 Messages 请求、流式输出与错误码,再决定是否接入业务。接入前应确认服务的合同条款与数据边界,可参考本站《API 中转站合法吗》的合规检查清单。
本文技术参数与官方资料复核于 2026-10-09;模型、价格、限额与客户端界面会变化,使用前请再次核对官方文档和当前控制台。

