APIPace 文档 API 参考

接入 Anthropic SDK

官方 anthropic SDK 改一个 base_url 就能用。

base_url 不带 /v1。 Anthropic SDK 自己会补 /v1/messages,填成 https://api.apipace.com/v1 就变成 /v1/v1/messages,返回 404 page not found。这一点和 OpenAI SDK 正好相反。

Python

import os
import anthropic

client = anthropic.Anthropic(
    base_url="https://api.apipace.com",
    api_key=os.environ["APIPACE_KEY"],
)

msg = client.messages.create(
    model="claude-sonnet-4.6",
    max_tokens=16,
    messages=[{"role": "user", "content": "用一个词打招呼"}],
)
print(msg.content[0].text)
你好!👋

SDK 会把 key 发成 x-api-key,平台照收。tools、system、thinking、图片输入这些原生能力都原样透传。

非 Claude 的别名(kimi-k3、minimax-m3)在这个协议上一样能用——这就是双协议的意义:换模型不用换 SDK。

读平台字段

print(msg.model_extra["request_id"])       # req_01M2M7KGJ8B9GFRD30CB23HKMR
print(msg.model_extra["billable_units"])   # {'input_tokens': 16, 'output_tokens': 9, 'usage_source': 'upstream'}

usage 里的 cache_creation_input_tokens 和 cache_read_input_tokens 恒为 0:客户面冷热同价,缓存不单独计价,全部输入 token 都折进 billable_units.input_tokens。这不是 bug,见计费与账单。

流式

with client.messages.stream(
    model="claude-sonnet-4.6", max_tokens=16,
    messages=[{"role": "user", "content": "用一个词打招呼"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

流的最后有一个平台追加的自定义事件 event: asterapi_billing,SDK 不认识它、会安静跳过,text_stream 和 get_final_message() 都照常工作。想读这一帧就自己解析 SSE,data 是 {"request_id", "billable_units"}。

幂等与关联编号

msg = client.messages.create(
    model="claude-sonnet-4.6",
    max_tokens=16,
    messages=[{"role": "user", "content": "用一个词打招呼"}],
    extra_headers={"Idempotency-Key": "job-42", "X-Request-ID": "job-42"},
)

常见问题

404 page not found —— base_url 多写了 /v1,去掉它。

AUTH_FAILED —— 不显式传 api_key= 时,SDK 会去读环境变量 ANTHROPIC_API_KEY;机器上如果存着别处的 key,发出去的就是那一把。像上面那样把 key 显式传进构造函数最省事。

MODEL_NOT_FOUND —— model 要填别名(claude-sonnet-4.6),不是 claude-sonnet-4-6-20260514 这种带日期的原始名。