一般的な AI ワークフローでは、同じ入力トークンをモデルに繰り返し渡すことがあります。Gemini API には、次の 2 つの異なるキャッシュ保存メカニズムが用意されています。
- 暗黙的なキャッシュ保存(Gemini 2.5 モデルで自動的に有効になります。費用削減は保証されません)
- 明示的なキャッシュ保存(ほとんどのモデルで手動で有効にできる、コスト削減保証)
明示的なキャッシュ保存は、コスト削減を保証したいが、開発者の作業が追加される場合に便利です。
暗黙的なキャッシュ保存
暗黙的キャッシュ保存は、すべての Gemini 2.5 モデルでデフォルトで有効になっています。リクエストがキャッシュにヒットした場合、費用の削減が自動的に適用されます。この機能を有効にするために必要な操作はありません。この変更は 2025 年 5 月 8 日から有効になります。コンテキスト キャッシュの最小入力トークン数は、2.5 Flash の場合は 1,024、2.5 Pro の場合は 4,096 です。
暗黙的なキャッシュ ヒットの可能性を高めるには:
- 大規模で一般的なコンテンツは、プロンプトの先頭に配置します。
- 類似した接頭辞を含むリクエストを短時間で送信しようとします。
キャッシュ ヒットしたトークンの数は、レスポンス オブジェクトの usage_metadata フィールドで確認できます。
明示的なキャッシュ保存
Gemini API の明示的なキャッシュ保存機能を使用すると、一部のコンテンツをモデルに 1 回渡して入力トークンをキャッシュに保存し、後続のリクエストでキャッシュに保存されたトークンを参照できます。特定のボリュームでは、キャッシュに保存されたトークンを使用する方が、同じトークン コーパスを繰り返し渡すよりも費用が安くなります。
一連のトークンをキャッシュに保存するときに、トークンが自動的に削除されるまでのキャッシュの存続期間を選択できます。このキャッシュ保存期間は、有効期間(TTL)と呼ばれます。設定しない場合、TTL はデフォルトで 1 時間になります。キャッシュ保存の費用は、入力トークンのサイズとトークンの存続期間によって異なります。
このセクションでは、クイックスタートで説明されているように、Gemini SDK がインストールされている(または curl がインストールされている)ことと、API キーが構成されていることを前提としています。
キャッシュを使用してコンテンツを生成する
次の例は、キャッシュに保存されたシステム指示とテキスト ファイルを使用してコンテンツを生成する方法を示しています。
import {
GoogleGenAI,
createUserContent,
createPartFromUri,
} from "@google/genai";
const ai = new GoogleGenAI({ apiKey: "GEMINI_API_KEY" });
async function main() {
const doc = await ai.files.upload({
file: "path/to/file.txt",
config: { mimeType: "text/plain" },
});
console.log("Uploaded file name:", doc.name);
const modelName = "gemini-2.0-flash-001";
const cache = await ai.caches.create({
model: modelName,
config: {
contents: createUserContent(createPartFromUri(doc.uri, doc.mimeType)),
systemInstruction: "You are an expert analyzing transcripts.",
},
});
console.log("Cache created:", cache);
const response = await ai.models.generateContent({
model: modelName,
contents: "Please summarize this transcript",
config: { cachedContent: cache.name },
});
console.log("Response text:", response.text);
}
await main();
キャッシュのリストを表示する
キャッシュに保存されたコンテンツを取得または表示することはできませんが、キャッシュ メタデータ(name、model、displayName、usageMetadata、createTime、updateTime、expireTime)は取得できます。
アップロードされたすべてのキャッシュのメタデータを一覧表示するには、GoogleGenAI.caches.list() を使用します。
console.log("My caches:");
const pager = await ai.caches.list({ config: { pageSize: 10 } });
let page = pager.page;
while (true) {
for (const c of page) {
console.log(" ", c.name);
}
if (!pager.hasNextPage()) break;
page = await pager.nextPage();
}
キャッシュを更新する
キャッシュに新しい ttl または expireTime を設定できます。キャッシュに関するその他の変更はサポートされていません。
次の例は、GoogleGenAI.caches.update() を使用してキャッシュの ttl を更新する方法を示しています。
const ttl = `${2 * 3600}s`; // 2 hours in seconds
const updatedCache = await ai.caches.update({
name: cache.name,
config: { ttl },
});
console.log("After update (TTL):", updatedCache);
キャッシュを削除する
キャッシュ サービスには、キャッシュからコンテンツを手動で削除するための削除オペレーションが用意されています。次の例は、GoogleGenAI.caches.delete() を使用してキャッシュを削除する方法を示しています。
await ai.caches.delete({ name: cache.name });
OpenAI ライブラリを使用した明示的なキャッシュ保存
OpenAI ライブラリを使用している場合は、extra_body の cached_content プロパティを使用して明示的なキャッシュ保存を有効にできます。
明示的なキャッシュ保存を使用する状況
コンテキスト キャッシュ保存は、初期コンテキストの実体部分が、短いリクエストで繰り返し参照されるシナリオに特に適しています。次のようなユースケースでは、コンテキスト キャッシュ保存の使用を検討してください。
- 広範なシステム指示を伴う chatbot
- 長時間の動画ファイルの繰り返し分析
- 大規模なドキュメント セットに対する繰り返しのクエリ
- 頻繁なコード リポジトリの分析やバグ修正
明示的なキャッシュ保存によるコスト削減
コンテキスト キャッシュ保存は、全体的な運用コストを削減するために設計された有料の機能です。ご請求は次の項目に基づいて行われます。
- キャッシュ トークン数: キャッシュに保存された入力トークンの数。後続のプロンプトに含まれる場合は、割引料金で請求されます。
- 保存期間: キャッシュに保存されたトークンの保存時間(TTL)。キャッシュに保存されたトークン数の TTL 期間に基づいて課金されます。TTL に最小値や最大値の制限はありません。
- その他の項目: 入力トークンや出力トークンがキャッシュされていない場合などは、別の料金が適用されます。
最新の料金の詳細については、Gemini API の料金ページをご覧ください。トークンをカウントする方法については、トークンガイドをご覧ください。
その他の考慮事項
コンテキスト キャッシュ保存を使用する場合は、次の点に注意してください。
- コンテキスト キャッシュ保存の入力トークンの最小数は、2.5 Flash の場合は 1,024、2.5 Pro の場合は 4,096 です。最大値は、指定されたモデルの最大値と同じです。(トークンのカウントについて詳しくは、トークンガイドをご覧ください)。
- モデルは、キャッシュに保存されたトークンと通常の入力トークンを区別しません。キャッシュに保存されたコンテンツはプロンプトの接頭辞です。
- コンテキスト キャッシュには特別なレート制限や使用量上限はありません。
GenerateContentの標準レート制限が適用され、トークン上限にはキャッシュに保存されたトークンが含まれます。 - キャッシュに保存されたトークンの数は、キャッシュ サービスの作成、取得、リスト オペレーションの
usage_metadataで返されます。また、キャッシュを使用する場合はGenerateContentでも返されます。