Anthropic SDK 接入

使用 Anthropic 官方 SDK 时,base URL 指向 https://api.tokenhouse.ai(SDK 会自动补 /v1/messages)。可用模型别名(如 claude-sonnet-4-6)见 /models,费率见 /pricing

auth_token / authToken(发 Authorization: Bearer)与 api_key / apiKey(发 x-api-key)均可使用——网关两种头都接受。

Python

from anthropic import Anthropic
 
client = Anthropic(
    base_url="https://api.tokenhouse.ai",
    auth_token="<your-key>",
)
 
msg = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "你好"}],
)
print(msg.content[0].text)

Node.js / TypeScript

import Anthropic from '@anthropic-ai/sdk';
 
const client = new Anthropic({
  baseURL: 'https://api.tokenhouse.ai',
  authToken: '<your-key>',
});
 
const msg = await client.messages.create({
  model: 'claude-sonnet-4-6',
  max_tokens: 1024,
  messages: [{ role: 'user', content: '你好' }],
});
console.log(msg.content[0].type === 'text' ? msg.content[0].text : '');

环境变量

ANTHROPIC_AUTH_TOKENANTHROPIC_BASE_URL 都会被 SDK 自动读取,设好之后构造 client 不需要传任何参数:

export ANTHROPIC_AUTH_TOKEN="<your-key>"
export ANTHROPIC_BASE_URL="https://api.tokenhouse.ai"
from anthropic import Anthropic
 
client = Anthropic()  # 自动读取上面两个环境变量

base URL 不要带 /v1。SDK 会自己在路径上追加 /v1/messages,如果你写成 https://api.tokenhouse.ai/v1,最终路径会多出一层 /v1 导致请求失败。

流式输出

Python

client.messages.stream(...) 返回上下文管理器,text_stream 按增量产出文本:

with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "写一首关于雪山的短诗"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
    final = stream.get_final_message()
 
print()
print(final.usage)

TypeScript

const stream = client.messages.stream({
  model: 'claude-sonnet-4-6',
  max_tokens: 1024,
  messages: [{ role: 'user', content: '写一首关于雪山的短诗' }],
});
 
stream.on('text', (text) => process.stdout.write(text));
 
const final = await stream.finalMessage();
console.log(final.usage);

流式连接中断时,已产生输出的请求按已观测到的 token 数计费并标记 estimated,详见 /docs/billing

Token 计数

client.messages.count_tokens(...) 在发送前估算输入 token 数,对应网关的 POST /v1/messages/count_tokens该接口不计费

count = client.messages.count_tokens(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "你好"}],
)
print(count.input_tokens)
const count = await client.messages.countTokens({
  model: 'claude-sonnet-4-6',
  messages: [{ role: 'user', content: '你好' }],
});
console.log(count.input_tokens);

错误处理

网关返回统一的错误形状:

{ "error": { "type": "auth_error", "code": "invalid_api_key", "message": "..." } }
  • 401 auth_error —— key 缺失、格式错误或已被撤销(key_revoked_or_disabled,撤销即刻生效)。请确认已通过 auth_token / authTokenapi_key / apiKey 传入完整的 sk-tokenhouse_… key。
  • 400 invalid_request_errorunknown_model —— 模型名不在可用列表中,对照 /models
  • 402 insufficient_funds_error —— 余额不足,去 /account/billing 充值;两种触发条件见 /docs/billing
  • 503 upstream_unavailable —— 上游暂不可达;上游自身的错误会以 upstream_error 透传。

失败请求(4xx/5xx/超时)一律不扣费。