Anthropic Messages
公式 SDK を使い、Anthropic Messages API で Claude を呼び出します。ストリーミング、拡張思考、ツール使用、プロンプトキャッシュ、トークンのカウントは、Anthropic のドキュメントどおりに動作します。
Lovely Router は、POST /v1/messages と POST /v1/messages/count_tokens を Anthropic の定義どおりに提供します。既存のコードはそのままに、ベース URL を https://lovelyrouter.com に変更し、Lovely Router のキーを使ってください。リクエスト本文は変更されずに転送されるため、各パラメータのリファレンスには Anthropic のドキュメントをご利用ください。
SDK を設定する#
Anthropic SDK はキーを x-api-key で送ります。Authorization: Bearer でも使えます。
curl https://lovelyrouter.com/v1/messages \
-H "x-api-key: $LOVELY_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5.5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Explain HTTP caching in two sentences."}]
}'SDK は環境変数 ANTHROPIC_BASE_URL と ANTHROPIC_API_KEY も読み込みます。そのため、既定のクライアントを作成するコードなら export ANTHROPIC_BASE_URL=https://lovelyrouter.com だけで十分です。
現在利用できる Claude のモデルは、claude-fable-5.1、claude-opus-5.5、claude-sonnet-5.5、claude-haiku-5.5 と、それ以前のバージョンです。価格を含む最新の一覧は GET /v1/models で取得できます。
レスポンスをストリーミングする#
stream: true を設定するか、SDK のストリームヘルパーを使います。受け取るのは標準のイベントシーケンス(message_start、content_block_start、content_block_delta、content_block_stop、message_delta、message_stop)です。
with client.messages.stream(
model="claude-sonnet-5.5",
max_tokens=2048,
messages=[{"role": "user", "content": "Write a limerick about latency."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final = stream.get_final_message()
print("\n", final.usage)ゲートウェイは最初のトークンまでストリームを保留するため、早い段階で失敗したチャネルは気付かないうちに置き換えられます。詳しくはストリーミングを参照してください。
拡張思考を使う#
thinking と output_config は、呼び出すモデルについて Anthropic が説明しているとおりに送ってください。現行のモデルは、努力レベル(effort)を指定するアダプティブ思考を使います。以前のモデル(Claude 4.5 以前)は、固定の budget_tokens を受け付けます。各モデルのルールは Anthropic の思考ガイドで確認してください。
message = client.messages.create(
model="claude-opus-5.5",
max_tokens=16000,
thinking={"type": "adaptive", "display": "summarized"},
output_config={"effort": "high"},
messages=[{"role": "user", "content": "How many weekdays are there in 2027?"}],
)
for block in message.content:
if block.type == "thinking":
print("Thinking:", block.thinking)
elif block.type == "text":
print("Answer:", block.text)思考トークンは usage.output_tokens に含まれ、出力の料金で課金されます。ツールを使って会話を続けるときは、思考ブロックを変更せずにそのまま送り返してください。
ツールを使う#
ツールは JSON Schema の input_schema で定義します。レスポンスが stop_reason: "tool_use" の場合は、ツールを実行し、その結果を tool_result ブロックで送り返します。
tools = [{
"name": "get_weather",
"description": "Current weather for a city.",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
}]
messages = [{"role": "user", "content": "Do I need an umbrella in Lisbon?"}]
response = client.messages.create(
model="claude-sonnet-5.5", max_tokens=1024, tools=tools, messages=messages,
)
if response.stop_reason == "tool_use":
call = next(b for b in response.content if b.type == "tool_use")
result = {"city": call.input["city"], "forecast": "light rain"} # your code here
messages += [
{"role": "assistant", "content": response.content},
{"role": "user", "content": [
{"type": "tool_result", "tool_use_id": call.id, "content": str(result)},
]},
]
response = client.messages.create(
model="claude-sonnet-5.5", max_tokens=1024, tools=tools, messages=messages,
)
print(response.content[0].text)tool_choice や strict など、その他のツールオプションも変更されずに転送されます。詳しくは Anthropic のツール使用ガイドを参照してください。
長いプロンプトをキャッシュする#
プロンプトのうち変化しない部分の末尾に cache_control を付けます。最初のリクエストでキャッシュが書き込まれ、同じプレフィックスで始まる以降のリクエストは、入力料金のごく一部でキャッシュを読み取ります。
response = client.messages.create(
model="claude-sonnet-5.5",
max_tokens=1024,
system=[{
"type": "text",
"text": LONG_REFERENCE_DOCUMENT,
"cache_control": {"type": "ephemeral"},
}],
messages=[{"role": "user", "content": "Summarize section 3."}],
)
u = response.usage
print(u.cache_creation_input_tokens, u.cache_read_input_tokens, u.input_tokens)claude-sonnet-5.5 の場合、100 万トークンあたりの料金は、キャッシュ書き込みが $2.50、キャッシュ読み取りが $0.10 です。キャッシュされない入力は $2.00 です。モデルの最小長より短いプレフィックスはキャッシュされず、両方のフィールドが 0 になります。ゲートウェイは各会話をキャッシュを持つチャネルに固定します。プロンプトキャッシュを参照してください。
トークンをカウントする#
POST /v1/messages/count_tokens は、メッセージのリクエストから max_tokens を除いたものと同じ本文を受け取り、input_tokens を返します。無料で、残高が 0 でも使えます。
curl https://lovelyrouter.com/v1/messages/count_tokens \
-H "x-api-key: $LOVELY_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model": "claude-sonnet-5.5",
"messages": [{"role": "user", "content": "Hello, Claude"}]}'カウントは概算です
count_tokens は、プロンプトがコンテキストウィンドウに収まるかの確認や、予算の見積もりに使ってください。呼び出しの請求額は、常にモデルがレスポンスで報告する usage に基づきます。
Claude Code を使う#
Claude Code はこの API を使います。ANTHROPIC_BASE_URL=https://lovelyrouter.com を設定し、ANTHROPIC_AUTH_TOKEN にキーを設定してください。各セッションは 1 つのチャネルに固定されるため、プロンプトキャッシュが機能し続けます。モデルの設定を含む完全な手順はお使いのツールで使うにあります。
ヘッダー#
| ヘッダー | 説明 |
|---|---|
x-api-key または Authorization: Bearer | Lovely Router のキー。必須です。 |
anthropic-version | 転送されます。省略した場合は 2023-06-01 になります。 |
anthropic-beta | 送ったとおりに転送されます。 |
x-lovely-group | 任意。キーがグループに紐付けられていない場合に、リクエストをチャネルグループに固定します。 |
x-session-id | 任意。キャッシュを意識したルーティングのために、リクエストを 1 つの会話としてまとめます。本文の metadata.user_id でも同じことができます。 |
その他のリクエストヘッダーは転送されません。エラーは Anthropic の形式 {"type": "error", "error": {"type": "...", "message": "..."}} で返ります。エラーを参照してください。