In einem typischen KI-Workflow werden dieselben Eingabetokens immer wieder an ein Modell übergeben. Die Gemini API bietet zwei verschiedene Caching-Mechanismen:
- Implizites Caching (für die meisten Gemini-Modelle automatisch aktiviert, keine Garantie für Kosteneinsparungen)
- Explizites Caching (für die meisten Modelle manuell aktivierbar, Garantie für Kosteneinsparungen)
Explizites Caching ist nützlich, wenn Sie Kosteneinsparungen garantieren möchten, aber mit etwas mehr Aufwand für Entwickler.
Implizites Caching
Implizites Caching ist standardmäßig aktiviert und für die meisten Gemini-Modelle verfügbar. Wir geben Kosteneinsparungen automatisch weiter, wenn Ihre Anfrage Caches trifft. Sie müssen nichts tun, um diese Funktion zu aktivieren. Sie ist ab dem 8. Mai 2025 wirksam. Die Mindestanzahl an Eingabe tokens für das Kontext-Caching ist in der folgenden Tabelle für jedes Modell aufgeführt:
| Modell | Mindestanzahl an Tokens |
|---|---|
| Gemini 3.1 Pro (Vorschau) | 4.096 |
| Gemini 3 Flash (Vorschau) | 1024 |
| Gemini 2.5 Flash | 1024 |
| Gemini 2.5 Pro | 4.096 |
So erhöhen Sie die Wahrscheinlichkeit eines impliziten Cache-Treffers:
- Platzieren Sie große und häufig verwendete Inhalte am Anfang Ihres Prompts.
- Senden Sie Anfragen mit ähnlichem Präfix in kurzer Zeit.
Die Anzahl der Tokens, die Cache-Treffer waren, finden Sie im Feld
usage_metadata des Antwortobjekts.
Explizites Caching
Mit der Funktion für explizites Caching der Gemini API können Sie einige Inhalte einmal an das Modell übergeben, die Eingabetokens im Cache speichern und dann bei nachfolgenden Anfragen auf die im Cache gespeicherten Tokens verweisen. Bei bestimmten Mengen ist die Verwendung von im Cache gespeicherten Tokens kostengünstiger als das wiederholte Übergeben desselben Token-Korpus.
Wenn Sie eine Gruppe von Tokens im Cache speichern, können Sie festlegen, wie lange der Cache vorhanden sein soll, bevor die Tokens automatisch gelöscht werden. Diese Caching-Dauer wird als die Gültigkeitsdauer (Time-to-Live, TTL) bezeichnet. Wenn nichts anderes festgelegt ist, beträgt die TTL standardmäßig 1 Stunde. Die Kosten für das Caching hängen von der Größe der Eingabetokens und der Dauer ab, für die die Tokens beibehalten werden sollen.
In diesem Abschnitt wird davon ausgegangen, dass Sie ein Gemini SDK installiert haben (oder curl installiert ist) und dass Sie einen API-Schlüssel konfiguriert haben, wie in der Kurzanleitungbeschrieben.
Inhalte mit einem Cache generieren
Python
Im folgenden Beispiel wird gezeigt, wie Sie Inhalte mit einer im Cache gespeicherten System anweisung und einer Videodatei generieren.
Videos
import os
import pathlib
import requests
import time
from google import genai
from google.genai import types
client = genai.Client()
# Download a test video file and save it locally
url = 'https://storage.googleapis.com/generativeai-downloads/data/SherlockJr._10min.mp4'
path_to_video_file = pathlib.Path('SherlockJr._10min.mp4')
if not path_to_video_file.exists():
path_to_video_file.write_bytes(requests.get(url).content)
# Upload the video using the Files API
video_file = client.files.upload(file=path_to_video_file)
# Wait for the file to finish processing
while video_file.state.name == 'PROCESSING':
time.sleep(2.5)
video_file = client.files.get(name=video_file.name)
print(f'Video processing complete: {video_file.uri}')
model='models/gemini-3-flash-preview'
# Create a cache with a 5 minute TTL (300 seconds)
cache = client.caches.create(
model=model,
config=types.CreateCachedContentConfig(
display_name='sherlock jr movie', # used to identify the cache
system_instruction=(
'You are an expert video analyzer, and your job is to answer '
'the user\'s query based on the video file you have access to.'
),
contents=[video_file],
ttl="300s",
)
)
response = client.models.generate_content(
model = model,
contents= (
'Introduce different characters in the movie by describing '
'their personality, looks, and names. Also list the timestamps '
'they were introduced for the first time.'),
config=types.GenerateContentConfig(cached_content=cache.name)
)
print(response.usage_metadata)
print(response.text)
PDF-Dateien
from google import genai
from google.genai import types
import io
import httpx
client = genai.Client()
long_context_pdf_path = "https://sma.nasa.gov/SignificantIncidents/assets/a11_missionreport.pdf"
# Retrieve and upload the PDF using the File API
doc_io = io.BytesIO(httpx.get(long_context_pdf_path).content)
document = client.files.upload(
file=doc_io,
config=dict(mime_type='application/pdf')
)
model_name = "gemini-3-flash-preview"
system_instruction = "You are an expert analyzing transcripts."
# Create a cached content object
cache = client.caches.create(
model=model_name,
config=types.CreateCachedContentConfig(
system_instruction=system_instruction,
contents=[document],
)
)
print(f'{cache=}')
response = client.models.generate_content(
model=model_name,
contents="Please summarize this transcript",
config=types.GenerateContentConfig(
cached_content=cache.name
))
print(f'{response.usage_metadata=}')
print('\n\n', response.text)
JavaScript
Im folgenden Beispiel wird gezeigt, wie Sie Inhalte mit einer im Cache gespeicherten System anweisung und einer Textdatei generieren.
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-3-flash-preview";
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();
Ok
Im folgenden Beispiel wird gezeigt, wie Sie Inhalte mit einem Cache generieren.
package main
import (
"context"
"fmt"
"log"
"google.golang.org/genai"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, &genai.ClientConfig{
APIKey: "GOOGLE_API_KEY",
Backend: genai.BackendGeminiAPI,
})
if err != nil {
log.Fatal(err)
}
modelName := "gemini-3-flash-preview"
document, err := client.Files.UploadFromPath(
ctx,
"media/a11.txt",
&genai.UploadFileConfig{
MIMEType: "text/plain",
},
)
if err != nil {
log.Fatal(err)
}
parts := []*genai.Part{
genai.NewPartFromURI(document.URI, document.MIMEType),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
cache, err := client.Caches.Create(ctx, modelName, &genai.CreateCachedContentConfig{
Contents: contents,
SystemInstruction: genai.NewContentFromText(
"You are an expert analyzing transcripts.", genai.RoleUser,
),
})
if err != nil {
log.Fatal(err)
}
fmt.Println("Cache created:")
fmt.Println(cache)
// Use the cache for generating content.
response, err := client.Models.GenerateContent(
ctx,
modelName,
genai.Text("Please summarize this transcript"),
&genai.GenerateContentConfig{
CachedContent: cache.Name,
},
)
if err != nil {
log.Fatal(err)
}
printResponse(response) // helper for printing response parts
}
REST
Im folgenden Beispiel wird gezeigt, wie Sie einen Cache erstellen und ihn dann zum Generieren von Inhalten verwenden.
Videos
wget https://storage.googleapis.com/generativeai-downloads/data/a11.txt
echo '{
"model": "models/gemini-3-flash-preview",
"contents":[
{
"parts":[
{
"inline_data": {
"mime_type":"text/plain",
"data": "'$(base64 $B64FLAGS a11.txt)'"
}
}
],
"role": "user"
}
],
"systemInstruction": {
"parts": [
{
"text": "You are an expert at analyzing transcripts."
}
]
},
"ttl": "300s"
}' > request.json
curl -X POST "https://generativelanguage.googleapis.com/v1beta/cachedContents?key=$GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d @request.json \
> cache.json
CACHE_NAME=$(cat cache.json | grep '"name":' | cut -d '"' -f 4 | head -n 1)
curl -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-3-flash-preview:generateContent?key=$GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"contents": [
{
"parts":[{
"text": "Please summarize this transcript"
}],
"role": "user"
},
],
"cachedContent": "'$CACHE_NAME'"
}'
PDF-Dateien
DOC_URL="https://sma.nasa.gov/SignificantIncidents/assets/a11_missionreport.pdf"
DISPLAY_NAME="A11_Mission_Report"
SYSTEM_INSTRUCTION="You are an expert at analyzing transcripts."
PROMPT="Please summarize this transcript"
MODEL="models/gemini-3-flash-preview"
TTL="300s"
# Download the PDF
wget -O "${DISPLAY_NAME}.pdf" "${DOC_URL}"
MIME_TYPE=$(file -b --mime-type "${DISPLAY_NAME}.pdf")
NUM_BYTES=$(wc -c < "${DISPLAY_NAME}.pdf")
echo "MIME_TYPE: ${MIME_TYPE}"
echo "NUM_BYTES: ${NUM_BYTES}"
tmp_header_file=upload-header.tmp
# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "${BASE_URL}/upload/v1beta/files?key=${GOOGLE_API_KEY}" \
-D upload-header.tmp \
-H "X-Goog-Upload-Protocol: resumable" \
-H "X-Goog-Upload-Command: start" \
-H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
-H "Content-Type: application/json" \
-d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null
upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"
# Upload the actual bytes.
curl "${upload_url}" \
-H "Content-Length: ${NUM_BYTES}" \
-H "X-Goog-Upload-Offset: 0" \
-H "X-Goog-Upload-Command: upload, finalize" \
--data-binary "@${DISPLAY_NAME}.pdf" 2> /dev/null > file_info.json
file_uri=$(jq ".file.uri" file_info.json)
echo "file_uri: ${file_uri}"
# Clean up the downloaded PDF
rm "${DISPLAY_NAME}.pdf"
# Create the cached content request
echo '{
"model": "'$MODEL'",
"contents":[
{
"parts":[
{"file_data": {"mime_type": "'$MIME_TYPE'", "file_uri": '$file_uri'}}
],
"role": "user"
}
],
"system_instruction": {
"parts": [
{
"text": "'$SYSTEM_INSTRUCTION'"
}
],
"role": "system"
},
"ttl": "'$TTL'"
}' > request.json
# Send the cached content request
curl -X POST "${BASE_URL}/v1beta/cachedContents?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-d @request.json \
> cache.json
CACHE_NAME=$(cat cache.json | grep '"name":' | cut -d '"' -f 4 | head -n 1)
echo "CACHE_NAME: ${CACHE_NAME}"
# Send the generateContent request using the cached content
curl -X POST "${BASE_URL}/${MODEL}:generateContent?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"contents": [
{
"parts":[{
"text": "'$PROMPT'"
}],
"role": "user"
}
],
"cachedContent": "'$CACHE_NAME'"
}' > response.json
cat response.json
echo jq ".candidates[].content.parts[].text" response.json
Caches auflisten
Es ist nicht möglich, im Cache gespeicherte Inhalte abzurufen oder anzusehen. Sie können jedoch
Cache-Metadaten abrufen (name, model, display_name, usage_metadata,
create_time, update_time und expire_time).
Python
Verwenden Sie CachedContent.list(), um Metadaten für alle hochgeladenen Caches aufzulisten:
for cache in client.caches.list():
print(cache)
Verwenden Sie get, um die Metadaten für ein Cache-Objekt abzurufen, wenn Sie den Namen kennen:
client.caches.get(name=name)
JavaScript
Verwenden Sie GoogleGenAI.caches.list(), um Metadaten für alle hochgeladenen Caches aufzulisten:
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();
}
Ok
Im folgenden Beispiel werden alle Caches aufgelistet.
caches, err := client.Caches.All(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Println("Listing all caches:")
for _, item := range caches {
fmt.Println(" ", item.Name)
}
Im folgenden Beispiel werden Caches mit einer Seitengröße von 2 aufgelistet.
page, err := client.Caches.List(ctx, &genai.ListCachedContentsConfig{PageSize: 2})
if err != nil {
log.Fatal(err)
}
pageIndex := 1
for {
fmt.Printf("Listing caches (page %d):\n", pageIndex)
for _, item := range page.Items {
fmt.Println(" ", item.Name)
}
if page.NextPageToken == "" {
break
}
page, err = page.Next(ctx)
if err == genai.ErrPageDone {
break
} else if err != nil {
return err
}
pageIndex++
}
REST
curl "https://generativelanguage.googleapis.com/v1beta/cachedContents?key=$GEMINI_API_KEY"
Cache aktualisieren
Sie können eine neue ttl oder expire_time für einen Cache festlegen. Andere Änderungen am Cache
werden nicht unterstützt.
Python
Im folgenden Beispiel wird gezeigt, wie Sie die ttl eines Cache mit
client.caches.update() aktualisieren.
from google import genai
from google.genai import types
client.caches.update(
name = cache.name,
config = types.UpdateCachedContentConfig(
ttl='300s'
)
)
Wenn Sie die Ablaufzeit festlegen möchten, können Sie entweder ein datetime Objekt
oder einen im ISO-Format formatierten datetime-String (dt.isoformat(), z. B.
2025-01-27T16:02:36.473528+00:00) verwenden. Ihre Zeit muss eine Zeitzone enthalten
(datetime.utcnow() fügt keine Zeitzone an,
datetime.now(datetime.timezone.utc) fügt eine Zeitzone an).
from google import genai
from google.genai import types
import datetime
# You must use a time zone-aware time.
in10min = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(minutes=10)
client.caches.update(
name = cache.name,
config = types.UpdateCachedContentConfig(
expire_time=in10min
)
)
JavaScript
Im folgenden Beispiel wird gezeigt, wie Sie die ttl eines Cache mit
GoogleGenAI.caches.update() aktualisieren.
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);
Ok
Im folgenden Beispiel wird gezeigt, wie Sie die TTL eines Cache aktualisieren.
// Update the TTL (2 hours).
cache, err = client.Caches.Update(ctx, cache.Name, &genai.UpdateCachedContentConfig{
TTL: 7200 * time.Second,
})
if err != nil {
log.Fatal(err)
}
fmt.Println("After update:")
fmt.Println(cache)
REST
Im folgenden Beispiel wird gezeigt, wie Sie die ttl eines Cache aktualisieren.
curl -X PATCH "https://generativelanguage.googleapis.com/v1beta/$CACHE_NAME?key=$GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"ttl": "600s"}'
Cache löschen
Der Caching-Dienst bietet einen Löschvorgang zum manuellen Entfernen von Inhalten aus dem Cache. Im folgenden Beispiel wird gezeigt, wie Sie einen Cache löschen:
Python
client.caches.delete(cache.name)
JavaScript
await ai.caches.delete({ name: cache.name });
Ok
_, err = client.Caches.Delete(ctx, cache.Name, &genai.DeleteCachedContentConfig{})
if err != nil {
log.Fatal(err)
}
fmt.Println("Cache deleted:", cache.Name)
REST
curl -X DELETE "https://generativelanguage.googleapis.com/v1beta/$CACHE_NAME?key=$GEMINI_API_KEY"
Explizites Caching mit der OpenAI-Bibliothek
Wenn Sie eine OpenAI-Bibliothek verwenden, können Sie
explizites Caching mit der cached_content Eigenschaft für
extra_body aktivieren.
Wann explizites Caching verwendet werden sollte
Kontext-Caching eignet sich besonders für Szenarien, bei denen in kürzeren Anfragen wiederholt auf eine hohe anfängliche Kontextmenge verwiesen wird. Ziehen Sie die Verwendung von Kontext-Caching für Anwendungsfälle wie diese in Betracht:
- Chatbots mit ausführlichen Systemanweisungen
- Wiederholte Analyse langer Videodateien
- Wiederkehrende Abfragen großer Dokumentgruppen
- Häufige Analyse von Code-Repositories oder Fehlerbehebung
So reduziert explizites Caching die Kosten
Kontext-Caching ist eine kostenpflichtige Funktion, die Kosten senken soll. Die Abrechnung basiert auf den folgenden Faktoren:
- Anzahl der Cache-Tokens: Die Anzahl der im Cache gespeicherten Eingabetokens, für die ein ermäßigter Tarif für die Nutzung in nachfolgenden Prompts gilt.
- Speicherdauer: Die Zeit, über die hinweg im Cache gespeicherte Tokens erhalten werden (TTL), die Abrechnung erfolgt auf Grundlage der TTL-Dauer der Anzahl der im Cache gespeicherten Tokens. Es gibt keine Mindest- oder Höchstgrenzen für die TTL.
- Andere Faktoren: Es fallen weitere Gebühren an, z. B. für nicht im Cache gespeicherte Eingabe- und Ausgabetokens.
Aktuelle Preisangaben finden Sie auf der Seite Gemini API Preise Seite. Informationen zum Zählen von Tokens finden Sie im Leitfaden zu Tokens.
Weitere Überlegungen
Beachten Sie bei der Verwendung von Kontext-Caching Folgendes:
- Die Mindestanzahl an Eingabetokens für das Kontext-Caching variiert je nach Modell. Die Höchstanzahl entspricht der Höchstanzahl für das jeweilige Modell. Weitere Informationen zum Zählen von Tokens finden Sie im Leitfaden zu Tokens.
- Das Modell unterscheidet nicht zwischen im Cache gespeicherten Tokens und regulären Eingabetokens. Im Cache gespeicherte Inhalte sind ein Präfix für den Prompt.
- Für das Kontext-Caching gelten keine besonderen Raten- oder Nutzungslimits. Es gelten die Standard
Ratenlimits für
GenerateContentund die Tokenlimits umfassen im Cache gespeicherte Tokens. - Die Anzahl der im Cache gespeicherten Tokens wird in der
usage_metadataaus den Vorgängen zum Erstellen, Abrufen und Auflisten des Cache-Dienstes und auch inGenerateContentzurückgegeben, wenn der Cache verwendet wird.