文档

文档

Messages API

面向 Claude 系列的原生 Anthropic Messages API。发送真正的 Anthropic 请求格式 —— cache_control、tools 和 extended thinking 会直接透传,不作转换。

端点:POST /v1/messages。请求和响应与 Anthropic 的 Messages API 完全一致,因此 Anthropic SDK 或任何支持该协议的工具,只需更换基础 URL 和密钥即可用于 Kunavo。

我应该使用哪个端点?

Kunavo 通过两种方式提供 Claude 系列。两者的计费完全相同;请根据代码当前使用的请求格式选择。

端点形状适用场景
/v1/chat/completionsOpenAI 聊天你已经在使用 OpenAI SDK,或者希望 Claude 和 GPT 共用一条代码路径。
/v1/messagesAnthropic Messages你使用 Anthropic SDK / Claude Code,或者希望原生使用 cache_control、tools 和 thinking,且不经过转换层。

认证

将基础 URL 指向 https://api.kunavo.com —— Anthropic SDK 会自行追加 /v1/messages。将 Kunavo 密钥(sk-kn-...)作为 API 密钥传入;此端点接受通过 x-api-key 请求头(Anthropic SDK 默认值)或 Authorization: Bearer 传入。

from anthropic import Anthropic

client = Anthropic(
    api_key="sk-kn-...",                  # your Kunavo key
    base_url="https://api.kunavo.com",    # SDK appends /v1/messages
)

msg = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    system="You are a senior staff engineer.",
    messages=[
        {"role": "user", "content": "Pros and cons of event sourcing?"},
    ],
)
print(msg.content[0].text)

提示缓存

这是使用原生端点的主要原因。可将 cache_control 缓存断点附加到任意系统块、消息内容块或工具定义。标记的前缀会写入缓存一次,之后共享该前缀的调用即可重放缓存内容。

缓存本身并不需要这个端点:在 /v1/chat/completions 和 /v1/responses 上,对于较长的提示,Kunavo 会自行为 Claude 模型设置断点。这个端点的不同之处在于不添加任何断点:请求体会按你发送的原样传递,因此其中的每个断点都是你自己设置的。

# Mark a large, stable prefix with cache_control. The first call writes that
# span to cache at 1.25× the input token price; later calls that reuse it read
# it back at ~10%.
msg = client.messages.create(
    model="claude-opus-4-7",
    max_tokens=1024,
    system=[
        {
            "type": "text",
            "text": LONG_STYLE_GUIDE,            # tens of thousands of tokens
            "cache_control": {"type": "ephemeral"},
        },
    ],
    messages=[{"role": "user", "content": "Review this PR against the guide."}],
)
u = msg.usage
print(u.cache_creation_input_tokens, u.cache_read_input_tokens)

Kunavo 上 Claude 系列的定价:

  • cache_read_input_tokens —— 从缓存读取,按输入费率的 0.10× 计费(优惠 90%);在Claude Fable 5.1上的比例为0.025×,在Claude Opus 5.5上的比例为0.05×。
  • cache_creation_input_tokens —— 写入缓存,按输入费率的 1.25 倍计费。对于 1 小时 TTL 的写入,Kunavo 也按 1.25 倍计费,低于 Anthropic 的 2 倍费率。
Kunavo 会自动保持缓存处于热状态:共享提示词前缀的请求会路由到同一个上游账户,你无需进行任何配置。

流式传输

设置 stream: true(或使用 SDK 的 stream() 辅助方法)。Kunavo 会原样转发 Anthropic 原生事件流 —— message_start、content_block_delta、message_delta、message_stop。

with client.messages.stream(
    model="claude-sonnet-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain CRDTs in one paragraph."}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

图像

以 base64 源或 url 源的形式发送图像。url 源是请求体中 Kunavo 会改写的唯一部分:Kunavo 会自行下载 https 图像(或解包 data: URI),并将其转发为 base64,因为上游会忽略 url 源,并像未发送图像一样作答。tool_result 中的图像也会以相同方式处理。限制:每个请求最多 16 张图像,每张图像最大 5 MB,总计最大 20 MB;无法获取的图像会导致错误,而不会被跳过。

用量对象

每个响应(以及流式传输中的 message_delta / message_start 事件)都包含原生 Anthropic usage 对象:

字段含义
input_tokens未缓存的新输入 token。
cache_read_input_tokens从缓存提供的 Token 按 0.10× 输入 Token(在Claude Fable 5.1上的比例为0.025×,在Claude Opus 5.5上的比例为0.05×) 计费。
cache_creation_input_tokens本次调用写入缓存的 token(按输入费率的 1.25 倍计费)。
output_tokens输出 token,包含 extended thinking。

服务器工具

Anthropic 的服务器工具(web_search、web_fetch、code_execution)会作为普通工具定义透传。它们为对话添加的内容(搜索结果、获取的页面、程序输出)会作为 token 在 usage 中返回,并按上述费率计费。

网页搜索还会在 token 费用之外按搜索次数计费:Anthropic 列出的价格为每 1,000 次搜索 $10,Kunavo 则按各模型自身的折扣费率收取该项费用。计数位于响应中的 usage.server_tool_use.web_search_requests 或流式传输的最后一个 message_delta 中;返回错误的搜索(例如 max_uses_exceeded)不计数。网页获取和代码执行除 token 费用外不产生额外费用。

每 1,000 次网页搜索模型
$7.00claude-fable-5-1, claude-fable-5, claude-opus-5-5, claude-opus-5, claude-opus-4-8, claude-opus-4-7, claude-opus-4-6, claude-sonnet-5, claude-sonnet-4-6, claude-haiku-4-5

支持的模型

任何已启用的 Claude 模型都接受 /v1/messages。将 Kunavo slug 作为 model 发送:

  • claude-fable-5, claude-sonnet-5
  • claude-opus-5, claude-opus-4-7, claude-opus-4-6
  • claude-sonnet-4-6, claude-haiku-4-5

此处不提供 GPT 模型 ——请通过 /v1/chat/completions 调用。

原始 HTTP

无需 SDK ——该端点接受普通 JSON POST 请求:

curl https://api.kunavo.com/v1/messages \
  -H "x-api-key: sk-kn-..." \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-sonnet-5",
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "Hello, Claude"}]
  }'

接下来