LLMoxy は完全互換の Anthropic Messages API インターフェースを提供し、Claude シリーズモデルに最適化されています。Anthropic 公式 SDK を使用しているユーザーは base_url を変更するだけで切り替えられます。
Base URL
https://llmoxy.com/v1
認証方式
2 つの認証方式をサポートしています:
方式 1:x-api-key(推奨)
x-api-key: YOUR_API_KEY
方式 2:Authorization
Authorization: Bearer YOUR_API_KEY
Messages API
Claude の核心対話インターフェース。
リクエスト URL
POST /v1/messages
リクエスト例
curl https://llmoxy.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Pythonで二分探索アルゴリズムを書いて"
}
]
}'
リクエストパラメータ
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
| model | string | はい | モデル名 |
| messages | array | はい | 会話メッセージリスト |
| max_tokens | integer | はい | 最大生成トークン数 |
| system | string | いいえ | システムプロンプト |
| temperature | number | いいえ | 温度パラメータ、0–1 |
| top_p | number | いいえ | nucleus sampling パラメータ |
| stream | boolean | いいえ | ストリーミング出力を有効化 |
| stop_sequences | array | いいえ | 停止シーケンス |
メッセージ形式
OpenAI とは異なり、Anthropic 形式ではシステムプロンプトが独立したパラメータです:
{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"system": "あなたはPythonプログラミングの専門家です",
"messages": [
{
"role": "user",
"content": "クイックソートを書いて"
},
{
"role": "assistant",
"content": "はい、Pythonのクイックソートを書きます..."
},
{
"role": "user",
"content": "詳細なコメントを追加して"
}
]
}
注意
- messages には
userとassistantのロールのみ含められますuserメッセージで始める必要がありますuserとassistantメッセージは交互に配置する必要があります
レスポンス形式
{
"id": "msg_123",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "これはClaudeの返信内容です"
}
],
"model": "claude-sonnet-4-20250514",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 25,
"output_tokens": 150
}
}
ストリーミング出力
stream: true を設定してストリーミング出力を有効化:
curl https://llmoxy.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "こんにちは"}],
"stream": true
}'
ストリーミングレスポンス形式
event: message_start
data: {"type":"message_start","message":{"id":"msg_123",...}}
event: content_block_delta
data: {"type":"content_block_delta","delta":{"type":"text_delta","text":"こ"}}
event: content_block_delta
data: {"type":"content_block_delta","delta":{"type":"text_delta","text":"ん"}}
event: message_stop
data: {"type":"message_stop"}
対応モデル
| モデル | 説明 | 利用可能なグループ |
|---|---|---|
| claude-opus-4-20250514 | 最高性能 | Max、Kiro |
| claude-sonnet-4-20250514 | バランスの取れた選択 | Max、Kiro |
| claude-haiku-4-20250414 | 高速応答 | Max、Kiro |
ヒント 利用可能なモデルの詳細は 公式モデル広場 を参照してください。
マルチモーダル対応
Claude は画像入力をサポートしています:
{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
},
{
"type": "text",
"text": "この画像には何がありますか?"
}
]
}
]
}
対応画像形式:JPEG、PNG、GIF、WebP。1枚最大5MB。
コード例
Python(公式 SDK)
from anthropic import Anthropic
client = Anthropic(
api_key="YOUR_API_KEY",
base_url="https://llmoxy.com/v1"
)
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{"role": "user", "content": "Pythonのデコレーターを書いて"}
]
)
print(message.content[0].text)
Python(ストリーミング)
with client.messages.stream(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "記事を書いて"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
Node.js(公式 SDK)
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: 'YOUR_API_KEY',
baseURL: 'https://llmoxy.com/v1'
});
const message = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
messages: [
{ role: 'user', content: 'クイックソートを書いて' }
]
});
console.log(message.content[0].text);
cURL
curl https://llmoxy.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, Claude!"}
]
}'
エラー処理
エラーレスポンス形式
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "エラー説明"
}
}
一般的なエラータイプ
| エラータイプ | 説明 |
|---|---|
| invalid_request_error | リクエストパラメータエラー |
| authentication_error | 認証失敗 |
| permission_error | 権限不足 |
| not_found_error | リソースが存在しません |
| rate_limit_error | リクエスト頻度が制限を超えました |
| api_error | 内部エラー |
| overloaded_error | サービス過負荷 |
エラー処理例
from anthropic import Anthropic, APIError
client = Anthropic(
api_key="YOUR_API_KEY",
base_url="https://llmoxy.com/v1"
)
try:
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}]
)
except APIError as e:
print(f"エラータイプ: {e.type}")
print(f"エラーメッセージ: {e.message}")
高度な使い方
1. システムプロンプト
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
system="あなたはPythonの専門家で、データ分析と機械学習が得意です。",
messages=[
{"role": "user", "content": "pandasで欠損値を処理するには?"}
]
)
2. 多ターン会話
conversation = [
{"role": "user", "content": "ユーザークラスを書いて"},
{"role": "assistant", "content": "はい、Userクラスを書きます..."},
{"role": "user", "content": "パスワード暗号化機能を追加して"}
]
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=conversation
)
3. 画像分析
import base64
with open("image.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": image_data
}
},
{
"type": "text",
"text": "このアーキテクチャ図を分析して"
}
]
}
]
)
ベストプラクティス
1. max_tokens を適切に設定
モデルごとに最大出力が異なります:Opus 32K、Sonnet 64K、Haiku 8K。実際のニーズに応じて設定し、無駄を避けてください。
2. system パラメータでプロンプトを設定
ロール定義は messages ではなく system パラメータに入れます:
# ✅ 推奨
message = client.messages.create(
system="あなたはPythonの専門家です",
messages=[{"role": "user", "content": "コードを書いて"}],
...
)
# ❌ 非推奨
message = client.messages.create(
messages=[{"role": "user", "content": "あなたはPythonの専門家です。コードを書いて"}],
...
)
3. 長い会話を処理
Claude は 200K のコンテキストウィンドウを持ちますが、定期的に会話を要約し、重要でない履歴メッセージを削除してトークン消費を節約することをお勧めします。
4. リトライ機構を実装
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
def call_claude():
return client.messages.create(...)
