Count Tokens
预估一段 Anthropic Messages 请求会消耗的输入 token 数。不会调上游推理、不计费、不计入并发,但仍会校验余额或订阅状态以及 API Key 有效性。
协议边界
这是 Anthropic 风格的 token 预估接口,请求体与 /v1/messages 相同。Anthropic 平台分组转发上游计数,OpenAI 平台分组使用兼容计数,Grok 分组返回估算值。
Endpoint
POST https://api.sakrylle.com/v1/messages/count_tokens请求头
| 名称 | 必填 | 说明 |
|---|---|---|
Authorization | 是 | Bearer sk-xxxxxxxxxxxxxxxx |
Content-Type | 是 | application/json |
anthropic-version | 否 | 例如 2023-06-01,与 Anthropic 官方一致 |
请求体参数
请求体格式与 POST /v1/messages 完全一致:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | Claude 模型 ID,例如 claude-haiku-4-5-20251001 |
messages | array | 是 | 完整对话消息列表 |
system | string | array | 否 | 系统提示 |
tools | array | 否 | 工具定义;会一并计入输入 token |
tool_choice | object | 否 | 同 messages |
所有用于推理的字段(
temperature、top_p、stream、max_tokens等)即便传了也只用于解析校验,不影响计数结果。
请求体示例
json
{
"model": "claude-haiku-4-5-20251001",
"system": "你是一个简洁的中文助手。",
"messages": [
{ "role": "user", "content": "自我介绍一下。" }
]
}响应示例
json
{
"input_tokens": 36
}字段命名与 Anthropic 官方
/v1/messages/count_tokens保持一致;网关从被选中的上游账号回传该结果。
错误
400 invalid_request_error— 缺model、请求体非 JSON 或解析失败401 authentication_error— API Key 无效403 billing_error— 余额或订阅限额不足(即使不计费也会校验)503 api_error— 没有可用的上游账号
更多错误码见 错误处理。
代码示例
bash
curl https://api.sakrylle.com/v1/messages/count_tokens \
-H "Authorization: Bearer sk-xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-haiku-4-5-20251001",
"messages": [
{"role": "user", "content": "你好"}
]
}'python
from anthropic import Anthropic
client = Anthropic(
api_key="sk-xxxxxxxxxxxxxxxx",
base_url="https://api.sakrylle.com",
)
resp = client.messages.count_tokens(
model="claude-haiku-4-5-20251001",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.input_tokens)javascript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "sk-xxxxxxxxxxxxxxxx",
baseURL: "https://api.sakrylle.com",
});
const resp = await client.messages.countTokens({
model: "claude-haiku-4-5-20251001",
messages: [{ role: "user", content: "你好" }],
});
console.log(resp.input_tokens);go
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
body := []byte(`{
"model": "claude-haiku-4-5-20251001",
"messages": [{"role":"user","content":"你好"}]
}`)
req, _ := http.NewRequest("POST",
"https://api.sakrylle.com/v1/messages/count_tokens",
bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer sk-xxxxxxxxxxxxxxxx")
req.Header.Set("Content-Type", "application/json")
req.Header.Set("anthropic-version", "2023-06-01")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(string(out))
}rust
use reqwest::Client;
use serde_json::json;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let client = Client::new();
let resp: serde_json::Value = client
.post("https://api.sakrylle.com/v1/messages/count_tokens")
.bearer_auth("sk-xxxxxxxxxxxxxxxx")
.header("anthropic-version", "2023-06-01")
.json(&json!({
"model": "claude-haiku-4-5-20251001",
"messages": [{"role": "user", "content": "你好"}]
}))
.send()
.await?
.json()
.await?;
println!("{resp:#}");
Ok(())
}java
import java.net.URI;
import java.net.http.*;
public class CountTokens {
public static void main(String[] args) throws Exception {
String body = """
{"model":"claude-haiku-4-5-20251001",
"messages":[{"role":"user","content":"你好"}]}
""";
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://api.sakrylle.com/v1/messages/count_tokens"))
.header("Authorization", "Bearer sk-xxxxxxxxxxxxxxxx")
.header("Content-Type", "application/json")
.header("anthropic-version", "2023-06-01")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> resp = HttpClient.newHttpClient()
.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
}
}csharp
using System.Net.Http.Headers;
using System.Text;
var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "sk-xxxxxxxxxxxxxxxx");
http.DefaultRequestHeaders.Add("anthropic-version", "2023-06-01");
var payload = """
{"model":"claude-haiku-4-5-20251001",
"messages":[{"role":"user","content":"你好"}]}
""";
var resp = await http.PostAsync(
"https://api.sakrylle.com/v1/messages/count_tokens",
new StringContent(payload, Encoding.UTF8, "application/json"));
Console.WriteLine(await resp.Content.ReadAsStringAsync());