একটি সাধারণ AI ওয়ার্কফ্লোতে, আপনি একই ইনপুট টোকেন বারবার একটি মডেলে পাঠাতে পারেন। জেমিনি API দুটি ভিন্ন ক্যাশিং প্রক্রিয়া অফার করে:
- অন্তর্নিহিত ক্যাশিং (বেশিরভাগ জেমিনি মডেলে স্বয়ংক্রিয়ভাবে সক্ষম, খরচ সাশ্রয়ের কোনও গ্যারান্টি নেই)
- স্পষ্ট ক্যাশিং (বেশিরভাগ মডেলে ম্যানুয়ালি সক্ষম করা যেতে পারে, খরচ সাশ্রয়ের গ্যারান্টি)
যেখানে আপনি খরচ সাশ্রয়ের নিশ্চয়তা দিতে চান, সেখানে স্পষ্ট ক্যাশিং কার্যকর, তবে কিছু অতিরিক্ত ডেভেলপার কাজের সাথে।
অন্তর্নিহিত ক্যাশিং
ইমপ্লিসিট ক্যাশিং ডিফল্টরূপে সক্ষম এবং বেশিরভাগ জেমিনি মডেলের জন্য উপলব্ধ। আপনার অনুরোধ ক্যাশে পৌঁছালে আমরা স্বয়ংক্রিয়ভাবে খরচ সাশ্রয় প্রদান করি। এটি সক্ষম করার জন্য আপনাকে কিছুই করতে হবে না। এটি 8ই মে, 2025 থেকে কার্যকর। প্রতিটি মডেলের জন্য প্রসঙ্গ ক্যাশিংয়ের জন্য ন্যূনতম ইনপুট টোকেন গণনা নিম্নলিখিত সারণীতে তালিকাভুক্ত করা হয়েছে:
| মডেল | ন্যূনতম টোকেন সীমা |
|---|---|
| জেমিনি ৩ ফ্ল্যাশ প্রিভিউ | ১০২৪ |
| জেমিনি ৩ প্রো প্রিভিউ | ৪০৯৬ |
| জেমিনি 2.5 ফ্ল্যাশ | ১০২৪ |
| জেমিনি ২.৫ প্রো | ৪০৯৬ |
অন্তর্নিহিত ক্যাশে আঘাতের সম্ভাবনা বাড়ানোর জন্য:
- আপনার প্রম্পটের শুরুতে বড় এবং সাধারণ বিষয়বস্তু রাখার চেষ্টা করুন।
- অল্প সময়ের মধ্যে একই রকম প্রিফিক্স সহ অনুরোধ পাঠানোর চেষ্টা করুন।
রেসপন্স অবজেক্টের usage_metadata ফিল্ডে আপনি ক্যাশে হিট হওয়া টোকেনের সংখ্যা দেখতে পাবেন।
স্পষ্ট ক্যাশিং
জেমিনি এপিআই স্পষ্ট ক্যাশিং বৈশিষ্ট্য ব্যবহার করে, আপনি একবার মডেলে কিছু কন্টেন্ট পাস করতে পারেন, ইনপুট টোকেনগুলি ক্যাশে করতে পারেন এবং তারপরে পরবর্তী অনুরোধের জন্য ক্যাশেড টোকেনগুলি উল্লেখ করতে পারেন। নির্দিষ্ট পরিমাণে, ক্যাশেড টোকেন ব্যবহার করা একই টোকেনগুলির কর্পাস বারবার পাস করার চেয়ে কম খরচ হয়।
যখন আপনি টোকেনের একটি সেট ক্যাশে করেন, তখন টোকেনগুলি স্বয়ংক্রিয়ভাবে মুছে ফেলার আগে আপনি কতক্ষণ ক্যাশেটি বিদ্যমান রাখতে চান তা বেছে নিতে পারেন। এই ক্যাশিং সময়কালকে টাইম টু লাইভ (TTL) বলা হয়। যদি সেট না করা থাকে, তাহলে TTL ডিফল্টভাবে ১ ঘন্টা থাকে। ক্যাশিংয়ের খরচ ইনপুট টোকেনের আকার এবং আপনি কতক্ষণ টোকেনগুলি টিকে থাকতে চান তার উপর নির্ভর করে।
এই বিভাগটি ধরে নেয় যে আপনি একটি Gemini SDK ইনস্টল করেছেন (অথবা curl ইনস্টল করেছেন) এবং আপনি একটি API কী কনফিগার করেছেন, যেমনটি quickstart এ দেখানো হয়েছে।
ক্যাশে ব্যবহার করে কন্টেন্ট তৈরি করুন
পাইথন
নিম্নলিখিত উদাহরণে ক্যাশেড সিস্টেম নির্দেশনা এবং ভিডিও ফাইল ব্যবহার করে কীভাবে কন্টেন্ট তৈরি করতে হয় তা দেখানো হয়েছে।
ভিডিও
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)
পিডিএফ
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)
জাভাস্ক্রিপ্ট
নিম্নলিখিত উদাহরণে ক্যাশেড সিস্টেম নির্দেশনা এবং একটি টেক্সট ফাইল ব্যবহার করে কীভাবে কন্টেন্ট তৈরি করা যায় তা দেখানো হয়েছে।
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();
যাও
নিম্নলিখিত উদাহরণটি ক্যাশে ব্যবহার করে কীভাবে সামগ্রী তৈরি করতে হয় তা দেখায়।
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
}
বিশ্রাম
নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি ক্যাশে তৈরি করতে হয় এবং তারপর কন্টেন্ট তৈরি করতে এটি ব্যবহার করতে হয়।
ভিডিও
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'"
}'
পিডিএফ
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
ক্যাশে তালিকাভুক্ত করুন
ক্যাশে করা কন্টেন্ট পুনরুদ্ধার করা বা দেখা সম্ভব নয়, তবে আপনি ক্যাশে মেটাডেটা ( name , model , display_name , usage_metadata , create_time , update_time , এবং expire_time ) পুনরুদ্ধার করতে পারেন।
পাইথন
আপলোড করা সমস্ত ক্যাশের মেটাডেটা তালিকাভুক্ত করতে, CachedContent.list() ব্যবহার করুন:
for cache in client.caches.list():
print(cache)
একটি ক্যাশে অবজেক্টের মেটাডেটা আনতে, যদি আপনি এর নাম জানেন, get ব্যবহার করুন:
client.caches.get(name=name)
জাভাস্ক্রিপ্ট
আপলোড করা সমস্ত ক্যাশের মেটাডেটা তালিকাভুক্ত করতে, 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();
}
যাও
নিম্নলিখিত উদাহরণে সমস্ত ক্যাশে তালিকাভুক্ত করা হয়েছে।
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)
}
নিম্নলিখিত উদাহরণে 2 পৃষ্ঠার আকার ব্যবহার করে ক্যাশে তালিকাভুক্ত করা হয়েছে।
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++
}
বিশ্রাম
curl "https://generativelanguage.googleapis.com/v1beta/cachedContents?key=$GEMINI_API_KEY"
একটি ক্যাশে আপডেট করুন
আপনি ক্যাশের জন্য একটি নতুন ttl অথবা expire_time সেট করতে পারেন। ক্যাশের অন্য কিছু পরিবর্তন করা সমর্থিত নয়।
পাইথন
নিম্নলিখিত উদাহরণে client.caches.update() ব্যবহার করে ক্যাশের ttl আপডেট করার পদ্ধতি দেখানো হয়েছে।
from google import genai
from google.genai import types
client.caches.update(
name = cache.name,
config = types.UpdateCachedContentConfig(
ttl='300s'
)
)
মেয়াদ শেষ হওয়ার সময় নির্ধারণ করার জন্য, এটি একটি datetime অবজেক্ট অথবা একটি ISO-ফরম্যাটেড datetime স্ট্রিং ( dt.isoformat() গ্রহণ করবে, যেমন 2025-01-27T16:02:36.473528+00:00 )। আপনার সময়ের মধ্যে একটি সময় অঞ্চল অন্তর্ভুক্ত থাকতে হবে ( datetime.utcnow() একটি সময় অঞ্চল সংযুক্ত করে না, datetime.now(datetime.timezone.utc) একটি সময় অঞ্চল সংযুক্ত করে)।
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
)
)
জাভাস্ক্রিপ্ট
নিম্নলিখিত উদাহরণটি দেখায় কিভাবে 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);
যাও
নিম্নলিখিত উদাহরণটি দেখায় কিভাবে ক্যাশের TTL আপডেট করতে হয়।
// 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)
বিশ্রাম
নিম্নলিখিত উদাহরণটি দেখায় কিভাবে ক্যাশের ttl আপডেট করতে হয়।
curl -X PATCH "https://generativelanguage.googleapis.com/v1beta/$CACHE_NAME?key=$GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"ttl": "600s"}'
একটি ক্যাশে মুছুন
ক্যাশিং পরিষেবা ক্যাশ থেকে ম্যানুয়ালি কন্টেন্ট মুছে ফেলার জন্য একটি ডিলিট অপারেশন প্রদান করে। নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি ক্যাশ মুছে ফেলা যায়:
পাইথন
client.caches.delete(cache.name)
জাভাস্ক্রিপ্ট
await ai.caches.delete({ name: cache.name });
যাও
_, err = client.Caches.Delete(ctx, cache.Name, &genai.DeleteCachedContentConfig{})
if err != nil {
log.Fatal(err)
}
fmt.Println("Cache deleted:", cache.Name)
বিশ্রাম
curl -X DELETE "https://generativelanguage.googleapis.com/v1beta/$CACHE_NAME?key=$GEMINI_API_KEY"
OpenAI লাইব্রেরি ব্যবহার করে স্পষ্ট ক্যাশিং
যদি আপনি একটি OpenAI লাইব্রেরি ব্যবহার করেন, তাহলে extra_body তে cached_content প্রপার্টি ব্যবহার করে স্পষ্ট ক্যাশিং সক্ষম করতে পারেন।
কখন স্পষ্ট ক্যাশিং ব্যবহার করবেন
কনটেক্সট ক্যাশিং বিশেষ করে সেইসব পরিস্থিতিতে উপযুক্ত যেখানে ছোট অনুরোধের মাধ্যমে একটি উল্লেখযোগ্য প্রাথমিক কনটেক্সট বারবার উল্লেখ করা হয়। ব্যবহারের ক্ষেত্রে কনটেক্সট ক্যাশিং ব্যবহার করার কথা বিবেচনা করুন যেমন:
- বিস্তৃত সিস্টেম নির্দেশাবলী সহ চ্যাটবট
- দীর্ঘ ভিডিও ফাইলের পুনরাবৃত্তিমূলক বিশ্লেষণ
- বৃহৎ ডকুমেন্ট সেটের বিপরীতে পুনরাবৃত্তিমূলক প্রশ্ন
- ঘন ঘন কোড রিপোজিটরি বিশ্লেষণ বা বাগ ফিক্সিং
স্পষ্ট ক্যাশিং কীভাবে খরচ কমায়
কনটেক্সট ক্যাশিং একটি অর্থপ্রদানের বৈশিষ্ট্য যা খরচ কমানোর জন্য ডিজাইন করা হয়েছে। বিলিং নিম্নলিখিত বিষয়গুলির উপর ভিত্তি করে তৈরি করা হয়:
- ক্যাশে টোকেন গণনা: ক্যাশে করা ইনপুট টোকেনের সংখ্যা, পরবর্তী প্রম্পটে অন্তর্ভুক্ত করলে কম হারে বিল করা হয়।
- স্টোরেজের সময়কাল: ক্যাশেড টোকেন কত সময় ধরে সংরক্ষণ করা হয় (TTL), ক্যাশেড টোকেন গণনার TTL সময়কালের উপর ভিত্তি করে বিল করা হয়। TTL-তে কোনও সর্বনিম্ন বা সর্বোচ্চ সীমা নেই।
- অন্যান্য বিষয়: অন্যান্য চার্জ প্রযোজ্য, যেমন নন-ক্যাশেড ইনপুট টোকেন এবং আউটপুট টোকেনের জন্য।
হালনাগাদ মূল্য নির্ধারণের বিশদ বিবরণের জন্য, জেমিনি API মূল্য নির্ধারণ পৃষ্ঠাটি দেখুন। টোকেন গণনা করতে শিখতে, টোকেন নির্দেশিকাটি দেখুন।
অতিরিক্ত বিবেচ্য বিষয়
কনটেক্সট ক্যাশিং ব্যবহার করার সময় নিম্নলিখিত বিবেচ্য বিষয়গুলি মনে রাখবেন:
- কনটেক্সট ক্যাশিংয়ের জন্য সর্বনিম্ন ইনপুট টোকেন গণনা মডেল অনুসারে পরিবর্তিত হয়। সর্বোচ্চটি প্রদত্ত মডেলের সর্বোচ্চের সমান। (টোকেন গণনা সম্পর্কে আরও জানতে, টোকেন নির্দেশিকা দেখুন)।
- মডেলটি ক্যাশেড টোকেন এবং নিয়মিত ইনপুট টোকেনের মধ্যে কোনও পার্থক্য করে না। ক্যাশেড কন্টেন্ট হল প্রম্পটের একটি উপসর্গ।
- কনটেক্সট ক্যাশিংয়ের ক্ষেত্রে কোনও বিশেষ হার বা ব্যবহারের সীমা নেই;
GenerateContentজন্য স্ট্যান্ডার্ড হার সীমা প্রযোজ্য, এবং টোকেন সীমাতে ক্যাশেড টোকেন অন্তর্ভুক্ত। - ক্যাশেড টোকেনের সংখ্যা ক্যাশ পরিষেবার create, get, এবং list অপারেশন থেকে
usage_metadataতে এবং ক্যাশ ব্যবহার করার সময়GenerateContentতেও ফেরত পাঠানো হয়।