AI入門ガイド
長いAIチャットが高くつく理由:APIは履歴を再送する
AIチャットでは新しいメッセージごとに履歴全体を再送するため、ターンごとに入力が増えます。計算例とコストを抑える3つの方法をご紹介します。

このページの内容
チャットの最初のメッセージは安く済みます。50通目のメッセージは、同じ量を入力したにもかかわらず、10通目より明らかに高くつきます。壊れているわけではありません。これがチャットAPIの仕組みです。
短い答え#
モデルは以前のリクエストを覚えていません。OpenAIのドキュメントにはこう明記されています。「各テキスト生成リクエストは独立しており、ステートレスである」と。マルチターンの会話では、以前のメッセージとモデルの前回の回答を次のリクエストに含めます。AnthropicのMessages APIも同じパターンを説明しています。ステートレスなマルチターン会話であり、以前のターンはmessagesパラメータで渡します。
つまり、アプリで見えるチャットウィンドウはアプリが作った幻想です。その裏では、新しいメッセージごとに、それまでの会話全体を運ぶ新しいリクエストが送られます。リクエストごとに入力トークンを支払い、履歴はその入力の一部です。用語に不慣れな場合は、まずトークンとは何かと入力トークンと出力トークンをお読みください。
OpenAIはレスポンスチェーンの課金について明示しています。チェーン内の以前の入力トークンはすべて入力トークンとして課金されます。履歴を自分で送るAPIにも同じ原則が当てはまります。送ったものがカウントされるのです。
架空の数字を使った計算例#
以下の数字は説明用の例であり、実測値ではありません。各メッセージが約200トークン、各回答が約300トークンだとします。1回のやり取りが完了すると、履歴に500トークンが追加されます。
テーブルを右にスクロールしてください →
| ターン | 再送される以前の履歴 | 新しいメッセージ | このリクエストの入力 | 出力 |
|---|---|---|---|---|
| 1 | 0 | 200 | 200 | 300 |
| 5 | 500 × 4 = 2,000 | 200 | 2,200 | 300 |
| 10 | 500 × 9 = 4,500 | 200 | 4,700 | 300 |
| 20 | 500 × 19 = 9,500 | 200 | 9,700 | 300 |
回答の長さは変わりませんが、20ターン目の入力は1ターン目のほぼ50倍です。出力は増えません。増えるのは入力です。
次に20ターンのチャットの合計です。履歴はやり取りの数だけ0、1、2…19回再送されるので、単純な和になります。
- 再送される古いやり取り: 500 × 190 = 95,000トークン(190は0 + 1 + 2 + … + 19)。
- 新しいメッセージ: 200 × 20 = 4,000トークン。
- チャットの入力合計: 95,000 + 4,000 = 99,000トークン。
- 出力合計: 300 × 20 = 6,000トークン。
モデルがすべてを無料で記憶していれば、入力は200 × 20 = 4,000トークンだけです。残りは履歴の再送です。ターン数を2倍にしても履歴のコストは2倍にならず、ほぼ4倍になります。和はターン数の2乗で増えるからです。
実際の価格でのコスト#
同じ20ターンのチャット(入力99,000、出力6,000)を現在の価格で示します。この表はライブで、料金が変わると更新されます。最後の列は比較用のOpenRouterの参考価格です。
| モデル | 入力 $/1M | 出力 $/1M | コスト | OpenRouter |
|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.0022 | $0.0045 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.0021 | $0.0056 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.0059 | $0.0369 |
合計 99,000 入力トークンと 6,000 出力トークン。100万トークンあたりの価格は現行のもので、当社の料金体系に合わせて変動します。OpenRouter 列は同じワークロードの参考価格を示しています。
テキストで簡単に確認すると、MiniMax-M2.7ではこの会話全体で$0.0059かかります。このような入力が支配的なチャットでは、入力価格が最も重要です。MiniMax-M2.7ではOpenRouterの参考価格より安くなっています。100万トークンあたり、MiniMax-M2.7は入力が$0.05、出力が$0.15です。
コストを抑える3つの方法#
1. 話題が変わったら新しいチャットを始める#
最も安い履歴は空の履歴です。ある関数のデバッグを終えてレシピを知りたいなら、新しいチャットは9,700ではなく200トークンを送るだけです。アプリではボタン1つ、コードではhistory = []です。以前のコンテキストが次の質問に役立たなくなったら、いつでもそうしてください。
2. 履歴を削る#
最後の数メッセージだけを残し、残りは捨てます。最後の3回のやり取りだけを残すと、履歴は500 × 3 = 1,500トークンを超えません。
- ターン1〜3は通常どおり増加: 履歴は0 + 500 + 1,000 = 1,500トークン。
- ターン4〜20はそれぞれ上限の1,500を運ぶ: 1,500 × 17 = 25,500トークン。
- 履歴合計: 1,500 + 25,500 = 27,000トークン、これに新しいメッセージの4,000を加えて入力は31,000トークン。
同じ20ターンで99,000ではなく31,000となり、MiniMax-M2.7では$0.0025になります。削る代償は、モデルがチャットの前半を忘れることです。システムプロンプトや失ってはならない事実は、削る部分の外に置いてください。
3. 古いターンを要約に置き換える#
履歴が長くなったら、一度だけモデルに要約を依頼し、その後は全文ではなく要約で続けます。上の例では、9回のやり取りが4,500トークンです。約300トークンの要約が要点を引き継ぎます。要約を書くために余分なリクエスト1回分を支払い、それ以降のリクエストは軽くなります。多少の詳細は失われますが、単純に削るより多くの意味を保てます。
コンテキストウィンドウは別の制限です。1回のリクエストが保持できるトークン数(回答を含む)に上限を設けます。履歴はいずれこの上限に達します。AIの回答が途中で止まるのはなぜか?で説明しています。
自分のコードで確認する#
レスポンスにはusageオブジェクトが含まれるので、増加を自分で観察できます。これは例です。プロバイダー間でIDが異なるため、キーを置き換え、モデルIDはCheapTokensのドキュメントから取得してください。
from openai import OpenAI
client = OpenAI(base_url='https://api.cheaptokens.dev/v1', api_key='YOUR_KEY')
system = {'role': 'system', 'content': 'You are a helpful assistant.'}
history = []
KEEP = 7 # new message + last 3 exchanges (6 messages); None keeps everything
def ask(text):
history.append({'role': 'user', 'content': text})
r = client.chat.completions.create(
model='MODEL_ID_FROM_DOCS',
messages=[system] + (history[-KEEP:] if KEEP else history),
)
answer = r.choices[0].message.content
history.append({'role': 'assistant', 'content': answer})
print(r.usage.prompt_tokens, r.usage.completion_tokens)
return answerask()を続けて何度か呼び出し、prompt_tokensを出力してください。KEEP = Noneでは毎ターン増加し、KEEP = 7では頭打ちになります。多くのステップをループするエージェントでは、同じ効果が各ステップに当てはまります。AIエージェントのコストを見積もる方法で予算の立て方を示しています。
長いチャットを実行する場所#
長い対話やエージェントのループは、まさに入力量が支配的なワークロードです。そのため、大きなコンテキストウィンドウと長い回答のための余裕の両方が重要です。
- MiniMax-M2.7: 180Kコンテキスト、回答あたり最大8,192トークン、入力と出力の両方がOpenRouterの参考価格より安い。
- DeepSeek-V4-Flash: 380Kコンテキスト、回答あたり最大32,768トークン、出力がOpenRouterの参考価格より安い。
CheapTokensはすべてのモデルで1つの残高を使い、モデルごとの固定価格でピーク時間はなく、OpenAI Chat CompletionsとAnthropic Messagesに互換のAPIを備えているため、上のコードはベースURLを変えるだけで動作します。CheapTokensでの最初のAPIリクエストに従って残高をチャージし、最初のリクエストを送ってください。



