方案 V3 · 价格、额度及容量为拟定 · 仅供产品评审
Claude源头中转站CLAUDE API RELAY

Docs / Quickstart

Claude API 接入文档与 Claude Code 国内使用教程

本站提供 Anthropic Messages 形态的 API,网关国内直连,不用代理。用 Claude Code 的话,直接看 Claude Code 国内使用一节。下文用 <你的网关地址> 表示网关基址(含协议和域名),请替换为实际地址。

快速开始

  1. 在控制台开通套餐或充值,然后创建 API Key。完整 Key 只在创建时显示一次,请当场保存。
  2. 查询当前 Key 可用的模型版本。
  3. 发起调用,model 填上一步返回的版本 ID。
curl <你的网关地址>/v1/models \
  -H "x-api-key: $API_KEY"
curl -N <你的网关地址>/v1/messages \
  -H "x-api-key: $API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "<模型版本 ID>",
    "max_tokens": 1024,
    "stream": true,
    "messages": [{ "role": "user", "content": "你好" }]
  }'

stream 为 true 时返回 SSE 事件流,正常结束的最后一个事件是 message_stop;去掉 stream 则返回一次性 JSON。max_tokens 必填。

个别上游在带 stop_reason 的最终 message_delta 之后直接结束连接,没有发出完整的 message_stop。这时内容和用量都已完整,网关按正常完成结算,不发错误事件,也不会替上游补写 message_stop,请以最终 message_delta 判断生成已结束。

流里的注释行统一写成 : keepalive,只保留保活的节奏;上游的 id:、retry: 字段不转发。协议之外的新事件照常转发,其中的地址、凭证形态的内容会替换为 [已隐藏]。

请求体不能压缩:带 identity 以外的 Content-Encoding 返回 400 unsupported_content_encoding,请求不会发往上游。

每个响应都带 request-id 响应头。遇到问题时,用这个编号可以在控制台定位到对应的请求。

anthropic-version 未传时按 2023-06-01 处理,不在通道允许清单内的版本返回 400。

鉴权

接口

接口用途说明
POST /v1/messages普通和流式调用Anthropic Messages 形态。
POST /v1/messages/count_tokens请求 Token 预估结果是预估,不是账单。带 cache_control 的请求实际调用时会多一段按账户固定的短文本,计数结果不含它,见计费规则。当前通道未提供计数时返回 404 count_tokens_unavailable。账户没有可用余额时返回 402。
GET /v1/models可用模型列表可用目录与当前 Key 权限的交集,不暴露全部上游模型。
GET /v1/models/{id}单个模型信息同样取交集,不在交集内返回 404 model_not_found。
/compat/openai/v1/chat/completionsOpenAI 兼容入口后续按映射能力开放,目前不可用。

模型别名

model 除了版本 ID,也可以填稳定别名。别名当前指向哪个版本、最近一次切换的通知,公开在首页价目表(接口是 GET /api/public/models 的 aliases)。

请求字段

支持的顶层字段:model、messages、max_tokens、system、metadata、stop_sequences、stream、temperature、top_k、top_p、tools、tool_choice、thinking、output_config、cache_control、context_management。

其他字段一律返回明确的 400(capability_mismatch),不会被默默丢弃。包括:

同样在发往上游前返回 400 的还有:max_tokens 超过模型上限(max_tokens_exceeded)、不支持的内容来源(见下一节)、模型或通道不支持的能力。支持范围按模型和通道维护。

图片和文档

内容块source.type处理
documentbase64可用。PDF 按页数冻结费用上限;读不出页数的 PDF 和其它 base64 文档按完整上下文窗口冻结,见下文。
documenttext、content可用,按请求体大小估算输入。
documenturl、file返回 400 capability_mismatch,请把内容内联到请求里。
imagebase64、url可用,数量和单个大小受通道限制。
imagefile返回 400 capability_mismatch,请直接内联内容。

base64 PDF 按页数冻结。网关从 PDF 的结构里读出页数,输入上限按每页 12000 Token 加上请求里其余内容的估算,再加 max_tokens 计算费用上限,不超过模型的上下文窗口。页数读不出来时(加密、结构损坏、页树放在压缩的对象流里、页数前后矛盾),以及其它 base64 文档,费用上限按该模型的完整上下文窗口加 max_tokens 计算,单价档也按这个窗口选取。可用额度覆盖不了这个上限时返回 402,文件再小也一样;这时可以降低 max_tokens、改用 text 类型,或补足额度。结算按实际用量,差额全部释放;实际费用超过冻结时,在资金来源和 Key 预算允许的范围内补扣。

图片数量超限返回 413 too_many_images,单个媒体内容超限返回 413 media_too_large。

错误

错误体结构兼容 Anthropic 错误格式,并带 request_id。error.code 是本服务的扩展字段,用来区分具体原因。下面是一个示例:

{
  "type": "error",
  "error": {
    "type": "billing_error",
    "code": "subscription_insufficient",
    "message": "本次请求费用上限 ¥X,套餐剩余 ¥Y,未开启超额使用钱包。可降低 max_tokens,或在控制台开启超额使用。"
  },
  "request_id": "req_示例"
}
状态原因error.type 与 error.code是否自动重试
400参数或模型能力不匹配 invalid_request_errorcredential_conflict、capability_mismatch、duplicate_key、missing_model、invalid_model、missing_max_tokens、invalid_max_tokens、max_tokens_exceeded、invalid_json、invalid_stream、invalid_messages、invalid_system、invalid_tools、invalid_context_management、unsupported_query、unsupported_content_encoding、amount_overflow、read_failed、upstream_rejected 否
401Key 无效、过期或已撤销 authentication_errorinvalid_api_key 否
402可用消费额度或授权预算不足 billing_errorsubscription_insufficient、subscription_expired、wallet_insufficient、key_budget_exceeded、request_amount_too_large 否,修正后再请求
403模型或账户没有权限 permission_errormodel_not_allowed、account_suspended、ip_not_allowed、region_not_eligible 否
404模型不存在或未开放 not_found_errormodel_not_found 否
404当前通道未提供 Token 计数 not_found_errorcount_tokens_unavailable 否
408请求体没有在时限内读完 invalid_request_errorbody_read_timeout 否
413请求体超限(默认上限 32 MB),图片数量、单个媒体内容超过通道限制,或超过上游通道的大小限制 request_too_largebody_too_large、too_many_images、media_too_large 否
429账户、项目、Key 或上游的速率与并发限制 rate_limit_errorrpm_limit、tpm_limit、concurrency_limit、upstream_capacity、platform_capacity、auth_abuse、entry_limit、body_read_limit 依 Retry-After 和安全条件
503没有合格上游可服务 overloaded_errorno_available_upstreamapi_errorupstream_error、upstream_invalid_response、service_unavailable 有限且仅在安全条件下
504首响应、流空闲、总时长超时,或连接状态不明 timeout_errorconnect_timeout、first_response_timeout、stream_idle_timeout、upstream_idle_timeout、total_timeout、connection_unknown、upstream_timeout、upstream_interrupted 需区分是否已被上游接受

402 和平台业务原因属于本服务扩展,并不声称全部是 Anthropic 原生契约。

504 表示请求可能已被上游接受:网关不会自动重复生成,用量进入核算。自行重发前请先按 request_id 查看这次请求,重发是一次新请求。

请求已经发到上游、结果不明(用量进入核算)的错误响应带 x-should-retry: false,官方 SDK 据此不会自动重试,例如 first_response_timeout、total_timeout、connection_unknown、upstream_timeout。connect_timeout 和 no_available_upstream 表示请求没有被上游接受,不带这个头,可以重试。上游返回普通 500、503 并给出 Retry-After 时,upstream_error 响应会带上它,最多 60 秒。

HTTP 响应头发出后不能再改状态码。流式响应中途出错时,错误以 SSE error 事件给出,结构相同,并且不会出现 message_stop:

event: error
data: {"type":"error","error":{"type":"api_error","code":"stream_interrupted","message":"上游流中断,响应未完整。可用请求编号查询本次用量。"},"request_id":"req_示例"}

控制台接口

控制台使用的 /api/ 接口用登录会话鉴权,不接受 API Key。错误体和模型接口不同,结构是 {"error":{"code":"…","message":"…"}}。写操作的请求体里不能含 \u0000,否则返回 400 bad_json。

状态error.code场景
400bad_project、bad_model_allowlist、bad_ip_allowlist创建 Key:项目不存在;模型白名单超过 100 项、有空项,或不是版本 ID(别名也不行);IP 白名单超过 100 项、有空项或格式无效。
400bad_limitKey 或项目的 RPM、TPM、并发不是正整数。不限制请留空。
403account_suspended账户已暂停时创建 Key、下单或付款。查看数据和取消待支付订单不受影响。
404not_foundPATCH /api/keys/{id} 和撤销 Key:Key 不存在、属于别的账户或已撤销,三种情况不作区分。
409key_limitKey 数量已达当前套餐上限。
409order_not_cancellable只有待支付的订单可以取消。重复取消已取消的订单不报错。

并发与速率

各档套餐的上限见首页套餐区,未订阅的按量账户使用单独的基础档。

计费规则

  1. 支付验证且权益发放成功后开始周期。套餐金额和单价版本在订单中快照保存。
  2. 当期 API 额度 30 天有效,到期不结转、不提现。
  3. 扣款顺序:有效套餐、最早到期的赠送额度、本金。有效套餐先扣,只有用户主动开启超额使用钱包,才在套餐不足后继续扣有效赠送额度与本金。
  4. 套餐已到期与从未订阅的按量用户状态分开:已到期且未允许钱包继续消费时暂停收费请求,避免静默切换扣款方式。此时返回 402 subscription_expired;从未订阅的按量账户直接使用赠送额度与本金。
  5. 自动续费默认关闭;已授权的站内续费仅从钱包本金扣款,不能用赠送或套餐额度再次购买订阅。
  6. 关闭续费不取消当期权益。首期升降级安排在下一周期;一个账户同一时刻只有一个生效套餐。
  7. 消费金额精确记录,界面按需要显示四至六位小数。避免小请求逐笔四舍五入到「分」。

每个请求先冻结费用上限,结束时按接受时固定的价格版本分项结算,差额释放。费用上限超过可用额度时返回 402,不会先扣一部分再失败,可以降低 max_tokens 后重试。base64 PDF 按页数冻结,读不出页数的按完整上下文窗口冻结,见图片和文档。

模型在输出任何内容之前拒答(stop_reason 为 refusal、没有内容块)时,按上游的规则计费:类别(stop_details.category)为 bio、frontier_llm、reasoning_extraction 的照常按用量计费,其它类别和没有类别的不收费,冻结全部释放,请求明细的关闭原因显示「模型在输出任何内容之前拒答」。已经输出了内容之后才拒答的,按实际用量计费。

带缓存标记的请求会多一小段输入。请求里任何位置带 cache_control 时,网关在 system 最前面加一个按账户固定的文本块:cache-scope: 加 16 位十六进制数,共 29 个字符。上游的提示词缓存按前缀内容共用,加了这段之后每个账户的前缀都不一样,别的账户无法从缓存命中情况得知你发过什么;你自己的前缀不变,缓存照常命中。这段文本和其它输入一样计费,按每 2 到 4 字节 1 个 Token 估算约 8 到 15 个 Token,确切数量以上游报告、请求明细里显示的用量为准。count_tokens 的结果不包含这段文本,所以带缓存标记的请求实际计费的输入会比计数结果多这几个 Token。没有缓存标记的请求不加任何内容。

Key 撤销

Key 撤销后,新请求立即被拦截,返回 401。已经在途的请求允许收尾并正常结算,已产生的费用不因撤销而免计。

待核算(usage_pending)

请求已发送或已开始输出,却拿不到可靠用量时,账务进入 usage_pending,冻结保留,并尝试核对用量。

待核算不会无限期冻结额度。

数据记录

默认记录脱敏元数据(请求编号、模型、状态、用量、金额、时间和来源 IP),不记录提示词和生成正文。

Claude Code 国内使用(中转站配置)

在国内使用 Claude Code(常简称 cc)不用代理,命令行客户端可以直接接入本站这个 Claude Code 中转站。设置两个环境变量后照常启动:

export ANTHROPIC_BASE_URL=<你的网关地址>
export ANTHROPIC_API_KEY=<控制台创建的 API Key>
claude

Windows PowerShell 写作 $env:ANTHROPIC_BASE_URL="…" 和 $env:ANTHROPIC_API_KEY="…"。

客户端兼容

已经测试并声明支持的客户端是 Claude Code(见上一节)。其他 CLI 客户端在声明之前,请不要假定它的全部功能都可用。

默认放行的 anthropic-beta:claude-code-20250219、interleaved-thinking-2025-05-14、context-management-2025-06-27、per-turn-control-2026-07-01、mid-conversation-tool-changes-2026-07-01、thinking-token-count-2026-05-13、advanced-tool-use-2025-11-20、effort-2025-11-24。其他不在通道允许清单内的值返回 400。查询参数只接受 beta=true,原样转发给上游;其他查询参数同样返回 400。