从 Anthropic 官方切过来:迁移 SDK

/v1/messages、x-api-key、anthropic-version 都不变。变的是 model id,外加一条关于退役 id 的规则。

协议本来就是对的

Claude 模型走 POST https://token-share.app/v1/messages,用 x-api-key 鉴权,带 anthropic-version: 2023-06-01。这些正是 Anthropic SDK 本来就在发的路径和头,所以传输层要改的只有 base URL 一处。

请求体原样可用:messages、system、max_tokens、tools、tool_choice、stop_sequences、temperature、stream 都照旧。响应由 Anthropic 上游返回,所以 content block、stop_reason 和 usage 都是官方的,不是我们重新拼的。

目录接口 GET /v1/models 同样可用。带上 anthropic-version,返回的就是 Anthropic 形态的列表,所以按 Anthropic 方式做模型发现的客户端不用改。

官方 @anthropic-ai/sdk 接本网关。
import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic({
  baseURL: 'https://token-share.app',
  apiKey: process.env.TOKEN_SHARE_KEY,
});

const message = await client.messages.create({
  model: 'claude-sonnet-5',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Explain this stack trace.' }],
});

for (const block of message.content) {
  if (block.type === 'text') console.log(block.text);
}

model id,以及那些退役的

这里路由了 12 个 Claude id。其中 claude-opus-5、claude-opus-4-8、claude-opus-4-6、claude-sonnet-5、claude-sonnet-4-6 这 5 个属于池内 id,按 0.1 倍计费;余下 7 个是 stable-* 专属通道,0.4 倍。这些 id 是我们自己的命名,请从目录里复制,别抄上游的发版说明。

有几个 id 已经退役、由专属通道接替,调用会返回 400 而不是被悄悄改道。消息里会点名替代者:发 claude-haiku-4-5,会被告知改用 stable-claude-haiku-4-5。这是故意的——替代者按 0.4 倍而不是 0.1 倍计费,要不要换得你自己拍板,不能变成一次「悄悄变贵」的升级。

另外,Claude 请求只从充值钱包扣。充值余额为空,或者手里只有奖励余额,会在转发之前返回 402,code 为 claude_minimum_balance。

Claude Code 与带装饰的 id

Claude Code 会给模型名加装饰:[1m] 表示要长上下文变体,末尾的 (budget) 携带 thinking 预算,两者也可能同时出现,形如 name[1m](1024)。allowlist 会先把这些剥掉再判断基础 id,所以只要基础 id 在目录里,带装饰的写法照样能过。

要注意这是按基础 id 比对而非子串匹配,目录里没有的变体仍然被拒——真打错了字,不会被悄悄升级成另一个你并不打算付钱的模型。

至于工具链,用 ANTHROPIC_BASE_URL 设 base URL、ANTHROPIC_API_KEY 设 key,任何基于 Anthropic SDK 的工具都会跟着走,CLI 没有另一条独立的接入路径。

常见问题

这些和 Anthropic 官方提供的是同一批模型吗?
是的。请求转发到上游,返回的就是 Anthropic 的结果。不同的是计费,以及请求由哪把凭证承载——普通 id 走共享账号池,stable-* 走我们自己直接持有的 key。
提示词缓存还能用吗?
能。走 /v1/messages 时 cache_control 会随请求一起带过去,cache read 与 cache write 各自作为独立的计费桶,按各自的单价算,不是按输入价算。每个 id 在目录里都标了自己的 cache read 与 cache creation 价格。
请求返回 400,还提到了另一个 model id,这是怎么回事?
你调的是一个已退役、由专属通道接替的 id。消息里点了替代者的名字,改一行就好。之所以是拒绝而不是改道:替代者的倍率不一样,悄悄替你服务等于按更高的价格给你计费一个你没点过的 id,返回的 model 名也和你发的对不上。