Skip to content

Messages (Anthropic)

Anthropic Messages 形式のアダプターです。base URL を変えるだけで Claude Code・Anthropic SDK をそのまま接続できます。

POST/v1/messages
POST/v1/messages/count_tokens

PleumRouter は Anthropic Messages 形式のインバウンドリクエストを受け取り、 内部でルーティングします。既存の Anthropic SDK コードや Claude Code はコードを変更せず、base URL を PleumRouter に向けるだけで動作します。リクエスト・レスポンスは いずれも Anthropic Messages スキーマに従い、内部では OpenAI 形式に変換されて処理されます。

接続する#

Anthropic SDK では base_urlルート URL https://apirouter.pleum.ai に設定してください。SDK がそこに /v1/messages を付け加えます。

messages.ts

Anthropic Messages API

import Anthropic from "@anthropic-ai/sdk";

const anthropic = new Anthropic({
  apiKey: "plm_xxxxxxxxxxxxxxxx",
  // Root origin — the SDK appends /v1/messages
  baseURL: "https://apirouter.pleum.ai",
});

const message = await anthropic.messages.create({
  model: "claude-sonnet-4-6",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Why is the sky blue?" }],
});

console.log(message.content);
Anthropic SDK (Python)
from anthropic import Anthropic

client = Anthropic(
    api_key="plm_...",
    base_url="https://apirouter.pleum.ai",  # 루트  SDK가 /v1/messages를 덧붙임
)

message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}],
)
print(message.content[0].text)

Claude Code では ANTHROPIC_BASE_URL/v1 なしのルートに設定し、plm_ キーを ANTHROPIC_API_KEY に設定してください。

Claude Code
export ANTHROPIC_BASE_URL="https://apirouter.pleum.ai"
export ANTHROPIC_API_KEY="plm_..."
claude
base URL に /v1 を付けないでください。SDK が再度 /v1/messages を付け加え、/v1/v1/messages となって リクエストが失敗します。必ずルートの https://apirouter.pleum.ai のみを指定してください。

認証は plm_ API キーを Authorization: Bearer または x-api-key ヘッダーで渡します。Claude Code は両方を送信し、 どちらでも動作します。

メッセージの生成#

パラメータ必須説明
thinkingobject任意ネイティブの enabled | adaptive | disabled union。enabled には budget_tokens(1,024〜32,000)が必要です。
modelstring必須モデル ID。GET /v1/models で全一覧を確認できます。
messagesarray必須{role, content} の配列。content は文字列またはブロック配列(text / image / tool_use / tool_result)です。
max_tokensinteger任意生成する最大トークン数。デフォルト値 4096。
systemstring | array任意システムプロンプト。文字列またはブロック配列。
temperaturenumber任意サンプリング温度。
top_pnumber任意累積確率に基づくサンプリング(nucleus)。
stop_sequencesarray任意停止文字列の配列。内部的に stop にマッピングされます。
streamboolean任意true の場合は Anthropic SSE ストリーミングレスポンス。
toolsarray任意Anthropic 形式のツール {name, description, input_schema}。内部で OpenAI 形式に変換されます。
tool_choiceobject任意{type: any | none | tool} の形式でツールの使用方法を指定します。
metadataobject任意受け付けますが、プロバイダーには転送されません。

thinking が有効な場合、PleumRouter は常に upstream に display: "omitted" を要求します。tools と併用する場合、 tool_choiceauto または none のみです。required/特定ツールの強制と最後の assistant メッセージの prefill は、クレジット hold 前に 400 で拒否されます。

request
curl https://apirouter.pleum.ai/v1/messages \
  -H "x-api-key: plm_..." \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-sonnet-4-6",
    "max_tokens": 1024,
    "thinking": {"type": "adaptive", "display": "omitted"},
    "system": "You are a helpful assistant.",
    "messages": [
      {"role": "user", "content": "Hello"}
    ]
  }'

レスポンスは Anthropic Messages スキーマに従います。content はブロック配列で、 トークン使用量は usage.input_tokens / usage.output_tokens として返されます。ネイティブ thinking は opaque な {type:"thinking", thinking:"", signature} または {type:"redacted_thinking", data} ブロックとしてのみ返され、平文の思考は 公開されません。ツール継続時には、_pleum_source_model 拡張があればそれも含めて ブロックを原文のまま返してください。

stop_reason は内部の終了理由からマッピングされます — stopend_turn lengthmax_tokens tool_callstool_use

200 OK
{
  "id": "msg_01abc...",
  "type": "message",
  "role": "assistant",
  "model": "claude-sonnet-4-6",
  "content": [
    {"type": "thinking", "thinking": "", "signature": "<opaque>"},
    {"type": "text", "text": "Hello! How can I help you?"}
  ],
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 12,
    "output_tokens": 5
  }
}

ストリーミング#

stream: true でリクエストすると、Anthropic SSE のイベントシーケンスが 送信されます — message_startcontent_block_start / content_block_deltatext_delta)/ content_block_stopmessage_delta message_stop。omitted thinking は空の thinking ブロック、signature_delta、stop の順だけで送られ、thinking_delta や 平文の思考は送られません。redacted ブロックは start/stop のみです。ストリーミングモードでは費用ヘッダーは含まれません。

SSE stream
event: message_start
data: {"type":"message_start","message":{"id":"msg_01abc","type":"message","role":"assistant","model":"claude-sonnet-4-6","content":[],"stop_reason":null,"usage":{"input_tokens":12,"output_tokens":0}}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"signature_delta","signature":"<opaque>"}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: content_block_start
data: {"type":"content_block_start","index":1,"content_block":{"type":"text","text":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"text_delta","text":"Hello! How can I help you?"}}

event: content_block_stop
data: {"type":"content_block_stop","index":1}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"output_tokens":5}}

event: message_stop
data: {"type":"message_stop"}

トークン数を数える#

/v1/messages と同じ本文を受け取り、 {"input_tokens": <int>} を返します。この値はヒューリスティックな 推定値であり、実際のトークナイザーの結果ではありません。

request
curl https://apirouter.pleum.ai/v1/messages/count_tokens \
  -H "x-api-key: plm_..." \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-sonnet-4-6",
    "messages": [
      {"role": "user", "content": "Hello"}
    ]
  }'
200 OK
{
  "input_tokens": 12
}

課金方式#

費用はレスポンス本文には含まれません。代わりにレスポンスヘッダー X-Cost-Krw(整数)と X-Cost-Usd(小数)、 および x-request-id で返されます。usage.output_tokens が 唯一の課金対象出力量であり、thinking の内訳が再課金・再加算されることはありません。