ブログに戻る

AI入門ガイド

入力トークンと出力トークン:AI APIが課金するもの

AI APIが入力トークンと出力トークンを別々に数える理由、usageフィールドでの確認場所、1リクエストのコスト計算方法を説明します。

投稿者: CheapTokens Team公開日 更新日 読了時間 7 分

暗いグリッド背景に「入力トークンと出力トークン」というタイトルと「APIリクエストで支払うもの」という行を配置したカバー
このページの内容
  1. 入力と出力の境界
  2. 数値の確認場所:usageブロック
  3. 入力と出力で価格が異なる理由
  4. 計算式
  5. 実モデルでの計算例
  6. コードでの使用
  7. トークン消費を減らす方法
  8. 覚えておくべきこと

言語モデルへの最初のAPI呼び出しを行ったばかりなら、レスポンスに含まれるusageブロックを見て、これが正確に何を数えているのか疑問に思ったことでしょう。簡単に言えば、すべてのリクエストには2つのメーターがあります。1つは送信したトークン(入力)を数え、もう1つはモデルが書き戻したトークン(出力)を数えます。各メーターにはそれぞれの価格があり、リクエストのコストは両方の合計です。

このガイドでは、数値の確認場所、ドルへの換算方法、支出を減らすために変更できる点を説明します。「トークン」という言葉がまだ曖昧な場合は、AIにおけるトークンとは?から始めてください。

入力と出力の境界#

入力トークンは、モデルがあなたに答えるために読む必要があるすべてのものです:

  • 最新のメッセージ;
  • システムプロンプト(「簡潔に英語で答えて」などの指示);
  • 会話の以前のメッセージ(再送信する場合);
  • リクエストに貼り付けたドキュメント、コード、検索結果。

出力トークンは、モデルが返信として生成するすべてのものです。OpenAI互換形式では、これはchoices[0].message.content内のテキストです。一部のモデルは思考モードで最終回答の前に推論トークンを生成します。出力として課金されるかどうかは、モデルの料金ページを確認してください。

初心者にとって重要な点:モデルはリクエスト間でチャットを記憶しません。チャットアプリは毎回履歴全体を再送信するため、長い会話の入力はターンごとに増加します。新しいメッセージが1行であってもです。

数値の確認場所:usageブロック#

OpenAI互換APIからの非ストリーミングレスポンスは、必ずusageオブジェクトで終わります。これはその形状を示す教育用の例です:

json
{
  "choices": [
    { "message": { "role": "assistant", "content": "..." }, "finish_reason": "stop" }
  ],
  "usage": {
    "prompt_tokens": 2000,
    "completion_tokens": 500,
    "total_tokens": 2500
  }
}
フィールド 意味 課金区分
prompt_tokens 送信したすべてのトークン数 入力
completion_tokens モデルが生成したトークン数 出力
total_tokens prompt_tokens + completion_tokens 別価格ではなく、単なる合計

初心者がよくする間違いは、total_tokensに1つの価格を掛けることです。入力と出力は価格が異なるため、2つの数値を別々に扱う必要があります。

一部のプロバイダーは追加フィールドを加えます。例えば、DeepSeekの独自APIはprompt_tokensをprompt_cache_hit_tokensとprompt_cache_miss_tokensに分割し、思考モードではreasoning_tokensを報告します(出典:DeepSeek APIドキュメント、2026年10月21日確認)。表の3つのフィールドは、OpenAI互換レスポンスで信頼できるものです。

回答をストリーミングする場合、usageは最初にはわかりません。DeepSeekの独自APIでは、data: [DONE]の前の最後のコンテンツチャンクで届きます(DeepSeek APIドキュメント、2026年10月21日確認)。他のAPIは異なる方法で送信するか、リクエスト時のみ送信する場合があるため、クライアントが何を受け取るか確認してください。ストリーミング自体はPythonでのストリーミングレスポンスで扱っています。

入力と出力で価格が異なる理由#

プロンプトを読むことと回答を書くことは、異なる種類の作業です。モデルはプロンプト全体を1回のパスで処理しますが、回答は1トークンずつ生成する必要があり、新しい各トークンは前のトークンに依存します。そのためプロバイダーは通常、出力を入力より高く価格設定し、どの料金表でもモデルごとに2つの数値が表示されます。

以下の例で使用するモデルMiniMax-M2.7(id minimax-m2.7)はこのパターンに従います。現在の1Mトークンあたりの価格は、入力$0.05、出力$0.15です。

計算式#

価格は100万トークンあたりで提示されるため、1リクエストのコストは:

text
cost = input_tokens × input_price ÷ 1,000,000
     + output_tokens × output_price ÷ 1,000,000

以下は計算方法を示すための架空の丸い価格での例です(例であり、現在の価格は下の表から置き換えてください):

python
# example, substitute current prices from the table
price_in = 0.20    # USD per 1M input tokens
price_out = 0.80   # USD per 1M output tokens

prompt_tokens = 2000
completion_tokens = 500

cost = (prompt_tokens * price_in + completion_tokens * price_out) / 1_000_000
# 2000 × 0.20 ÷ 1,000,000 = 0.0004 (input)
# 500 × 0.80 ÷ 1,000,000 = 0.0004 (output)
# 0.0004 + 0.0004 = 0.0008 USD

実モデルでの計算例#

上のusageの例のリクエストを取ります:入力2,000トークン、出力500トークン。CheapTokens経由のMiniMax-M2.7では$0.00018かかります。この数値はページが表示されるたびに現在の料金表から計算されます。

1回のリクエストはごく小さいため、スケールアップするとわかりやすくなります。このサイズのリクエストを10,000回送信する小さなアプリは、入力20,000,000トークンと出力5,000,000トークンを使用し、$1.75になります。

同じリクエストを当社リストの他のモデルで実行した場合:

モデル コスト OpenRouter
GLM-5.3-Flash $0.00006 $0.00012
DeepSeek-V4-Flash $0.00008 $0.00017
MiniMax-M2.7 $0.00018 $0.0012

合計 2,000 入力トークンと 500 出力トークン。100万トークンあたりの価格は現行のもので、当社の料金体系に合わせて変動します。OpenRouter 列は同じワークロードの参考価格を示しています。

ここで出力はトークン数ではわずかな部分(2,500中500)ですが、トークンシェアより請求額の割合が大きいことに注意してください。出力トークンの価格が高いためです(表を参照)。このモデルでは、OpenRouterの参照価格に対する節約が出力側で確認できることも重要です。アプリが長い回答を書く場合に役立ちます。

コードでの使用#

公式openai Pythonパッケージからusageを読み取るには、CheapTokensのベースURLを指定します:

python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key="YOUR_API_KEY",
)

response = client.chat.completions.create(
    model="MiniMaxAI/MiniMax-M2.7",
    messages=[{"role": "user", "content": "Explain input and output tokens in two sentences."}],
)

usage = response.usage
print("input:", usage.prompt_tokens)
print("output:", usage.completion_tokens)
print("total:", usage.total_tokens)

# example, substitute current prices from the table above
price_in, price_out = 0.20, 0.80
cost = (usage.prompt_tokens * price_in + usage.completion_tokens * price_out) / 1_000_000
print(f"approx. cost: ${cost:.6f}")

まだリクエストを送信していない場合は、先にCheapTokensでの最初のAPIリクエストに従ってください。

トークン消費を減らす方法#

  • プロンプトを短くする。 システムプロンプトを削り、モデルに不要な指示を削除します。送信するすべてのトークンは毎回のリクエストで課金されます。
  • 履歴を削る。 長いチャットでは、会話全体ではなく最後の数ターンまたは短い要約を保持します。
  • ドキュメントの関連部分のみを送信する。 1ページのテキストはファイル全体より安価です。
  • 必要な形式を指定する。 「3つの箇条書きで答えて」は、自由形式のエッセイより出力トークンが少なくなります。
  • max_tokensを意図的に設定する。 これは出力のみを制限します。低すぎると回答が途切れます。詳細はAIの回答が途中で止まるのはなぜ?にあります。CheapTokensのMiniMax-M2.7は回答あたり最大8,192出力トークンを許可し、180Kのコンテキストウィンドウを持ちます。

より大きなワークフローのコスト見積もりについては、AIエージェントのコストを見積もる方法を参照してください。

覚えておくべきこと#

  1. すべてのリクエストには入力トークン(prompt_tokens)と出力トークン(completion_tokens)があります。
  2. それぞれ別の価格があり、通常は出力が高くなります。
  3. コスト = 入力トークン × 入力価格 + 出力トークン × 出力価格(価格は1Mトークンあたり)。
  4. 推測せず、レスポンスのusageから数値を読み取ります。

CheapTokensでは、1つの前払い残高ですべてのモデルをカバーし、モデルごとの価格は固定でピーク時間料金はなく、APIはOpenAI Chat CompletionsとAnthropic Messagesに互換です。上の例を試すには、APIキーを取得して最初のリクエストを送信してください。

すべてのモデルの現在価格:CheapTokensの料金。