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_TOKEN 与 ANTHROPIC_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/authToken或api_key/apiKey传入完整的sk-tokenhouse_…key。 - 400
invalid_request_error(unknown_model) —— 模型名不在可用列表中,对照 /models。 - 402
insufficient_funds_error—— 余额不足,去 /account/billing 充值;两种触发条件见 /docs/billing。 - 503
upstream_unavailable—— 上游暂不可达;上游自身的错误会以upstream_error透传。
失败请求(4xx/5xx/超时)一律不扣费。