Gemini و سایر مدلهای هوش مصنوعی مولد ورودی و خروجی را با یک دانهبندی به نام توکن پردازش میکنند.
در مورد توکن ها
توکن ها می توانند نویسه های تکی مانند z
یا کلمات کامل مانند cat
باشند. کلمات طولانی به چندین نشانه تقسیم می شوند. مجموعه تمام نشانه های استفاده شده توسط مدل، واژگان نامیده می شود، و فرآیند تقسیم متن به نشانه ها، توکن سازی نامیده می شود.
برای مدل های Gemini، یک توکن معادل حدود 4 کاراکتر است. 100 توکن برابر با 60-80 کلمه انگلیسی است.
وقتی صورتحساب فعال است، هزینه تماس با Gemini API تا حدی با تعداد نشانههای ورودی و خروجی تعیین میشود، بنابراین دانستن نحوه شمارش نشانهها میتواند مفید باشد.
توکن ها را بشمار
تمام ورودی ها و خروجی ها از Gemini API، از جمله متن، فایل های تصویری، و سایر روش های غیر متنی، نشانه گذاری می شوند.
شما می توانید توکن ها را به روش های زیر بشمارید:
با ورودی درخواست
countTokens
فراخوانی کنید.
این فقط تعداد کل نشانهها را در ورودی برمیگرداند. می توانید این تماس را قبل از ارسال ورودی به مدل انجام دهید تا اندازه درخواست های خود را بررسی کنید.پس از فراخوانی
generate_content
از ویژگیusageMetadata
روی شیresponse
استفاده کنید.
این تعداد کل توکنها را هم در ورودی و هم در خروجی برمیگرداند:totalTokenCount
.
همچنین تعداد توکن های ورودی و خروجی را به طور جداگانه برمی گرداند:promptTokenCount
(توکن های ورودی) وcandidatesTokenCount
(توکن های خروجی).
شمارش نشانه های متنی
اگر countTokens
با ورودی فقط متنی فراخوانی کنید، تعداد نشانههای متن را فقط در ورودی برمیگرداند ( totalTokens
). می توانید این تماس را قبل از تماس با generateContent
انجام دهید تا اندازه درخواست های خود را بررسی کنید.
گزینه دیگر فراخوانی generateContent
و سپس استفاده از ویژگی usageMetadata
در شیء response
برای دریافت موارد زیر است:
- تعداد توکن های جداگانه ورودی (
promptTokenCount
) و خروجی (candidatesTokenCount
) - تعداد کل توکن ها در ورودی و خروجی (
totalTokenCount
)
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "The quick brown fox jumps over the lazy dog.";
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: prompt,
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: prompt,
});
console.log(generateResponse.usageMetadata);
توکن های چند نوبتی (چت) را بشمارید
اگر countTokens
با سابقه چت فراخوانی کنید، تعداد توکن کل متن از هر نقش در چت ( totalTokens
) را برمی گرداند.
گزینه دیگر فراخوانی sendMessage
و سپس استفاده از ویژگی usageMetadata
در شی response
برای دریافت موارد زیر است:
- تعداد توکن های جداگانه ورودی (
promptTokenCount
) و خروجی (candidatesTokenCount
) - تعداد کل توکن ها در ورودی و خروجی (
totalTokenCount
)
برای درک اینکه نوبت بعدی مکالمه شما چقدر بزرگ خواهد بود، باید هنگام تماس countTokens
آن را به تاریخچه اضافه کنید.
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
// Initial chat history.
const history = [
{ role: "user", parts: [{ text: "Hi my name is Bob" }] },
{ role: "model", parts: [{ text: "Hi Bob!" }] },
];
const chat = ai.chats.create({
model: "gemini-2.0-flash",
history: history,
});
// Count tokens for the current chat history.
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: chat.getHistory(),
});
console.log(countTokensResponse.totalTokens);
const chatResponse = await chat.sendMessage({
message: "In one sentence, explain how a computer works to a young child.",
});
console.log(chatResponse.usageMetadata);
// Add an extra user message to the history.
const extraMessage = {
role: "user",
parts: [{ text: "What is the meaning of life?" }],
};
const combinedHistory = chat.getHistory();
combinedHistory.push(extraMessage);
const combinedCountTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: combinedHistory,
});
console.log(
"Combined history token count:",
combinedCountTokensResponse.totalTokens,
);
توکن های چندوجهی را بشمارید
تمام ورودیهای Gemini API از جمله متن، فایلهای تصویری و سایر روشهای غیر متنی توکنیزه میشوند. به نکات کلیدی سطح بالا زیر در مورد رمزگذاری ورودی چند وجهی در طول پردازش توسط Gemini API توجه کنید:
با Gemini 2.0، ورودی های تصویر با هر دو ابعاد <=384 پیکسل به عنوان 258 توکن محاسبه می شود. تصاویر بزرگتر در یک یا هر دو بعد برش داده می شوند و در صورت نیاز به کاشی هایی با ابعاد 768x768 پیکسل برش داده می شوند که هر کدام به عنوان 258 توکن به حساب می آیند. قبل از Gemini 2.0، تصاویر از 258 توکن ثابت استفاده می کردند.
فایلهای ویدیویی و صوتی با نرخهای ثابت زیر به توکن تبدیل میشوند: ویدیو با ۲۶۳ توکن در ثانیه و صدا با ۳۲ توکن در ثانیه.
فایل های تصویری
اگر countTokens
با ورودی متن و تصویر فراخوانی کنید، تعداد توکن های ترکیبی متن و تصویر را فقط در ورودی ( totalTokens
) برمی گرداند. می توانید این تماس را قبل از تماس با generateContent
انجام دهید تا اندازه درخواست های خود را بررسی کنید. همچنین می توانید به صورت اختیاری countTokens
روی متن و فایل به طور جداگانه فراخوانی کنید.
گزینه دیگر فراخوانی generateContent
و سپس استفاده از ویژگی usageMetadata
در شیء response
برای دریافت موارد زیر است:
- تعداد توکن های جداگانه ورودی (
promptTokenCount
) و خروجی (candidatesTokenCount
) - تعداد کل توکن ها در ورودی و خروجی (
totalTokenCount
)
مثالی که از یک تصویر آپلود شده از File API استفاده می کند:
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this image";
const organ = await ai.files.upload({
file: path.join(media, "organ.jpg"),
config: { mimeType: "image/jpeg" },
});
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(organ.uri, organ.mimeType),
]),
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(organ.uri, organ.mimeType),
]),
});
console.log(generateResponse.usageMetadata);
مثالی که تصویر را به عنوان داده درون خطی ارائه می کند:
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this image";
const imageBuffer = fs.readFileSync(path.join(media, "organ.jpg"));
// Convert buffer to base64 string.
const imageBase64 = imageBuffer.toString("base64");
// Build contents using createUserContent and createPartFromBase64.
const contents = createUserContent([
prompt,
createPartFromBase64(imageBase64, "image/jpeg"),
]);
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: contents,
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: contents,
});
console.log(generateResponse.usageMetadata);
فایل های ویدئویی یا صوتی
صدا و تصویر هر کدام با نرخ های ثابت زیر به توکن تبدیل می شوند:
- ویدئو: 263 توکن در ثانیه
- صدا: 32 توکن در ثانیه
اگر countTokens
با ورودی متن و ویدیو/صوت فراخوانی کنید، تعداد توکن های ترکیبی متن و فایل ویدیویی/صوتی را فقط در ورودی ( totalTokens
) برمی گرداند. می توانید این تماس را قبل از تماس با generateContent
انجام دهید تا اندازه درخواست های خود را بررسی کنید. همچنین می توانید به صورت اختیاری countTokens
روی متن و فایل به طور جداگانه فراخوانی کنید.
گزینه دیگر فراخوانی generateContent
و سپس استفاده از ویژگی usageMetadata
در شیء response
برای دریافت موارد زیر است:
- تعداد توکن های جداگانه ورودی (
promptTokenCount
) و خروجی (candidatesTokenCount
) - تعداد کل توکن ها در ورودی و خروجی (
totalTokenCount
)
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this video";
let videoFile = await ai.files.upload({
file: path.join(media, "Big_Buck_Bunny.mp4"),
config: { mimeType: "video/mp4" },
});
// Poll until the video file is completely processed (state becomes ACTIVE).
while (!videoFile.state || videoFile.state.toString() !== "ACTIVE") {
console.log("Processing video...");
console.log("File state: ", videoFile.state);
await sleep(5000);
videoFile = await ai.files.get({ name: videoFile.name });
}
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(videoFile.uri, videoFile.mimeType),
]),
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(videoFile.uri, videoFile.mimeType),
]),
});
console.log(generateResponse.usageMetadata);
دستورالعمل ها و ابزارهای سیستم
دستورالعملها و ابزارهای سیستم نیز در شمار کل توکنهای ورودی حساب میشوند.
اگر از دستورالعملهای سیستم استفاده میکنید، تعداد totalTokens
افزایش مییابد تا نشان دهنده اضافه شدن systemInstruction
باشد.
اگر از فراخوانی تابع استفاده می کنید، تعداد totalTokens
افزایش می یابد تا افزودن tools
را منعکس کند.
جمینی و سایر مدل های AI تولید کننده ، ورودی و خروجی را در یک دانه بندی به نام یک توکن انجام می دهند.
درباره توکن ها
توکن ها می توانند شخصیت های مجرد مانند z
یا کلمات کامل مانند cat
باشند. کلمات طولانی به چندین نشانه تقسیم می شوند. مجموعه ای از نشانه های مورد استفاده توسط مدل ، واژگان نامیده می شود و روند تقسیم متن به نشانه ها نامیده می شود.
برای مدل های جمینی ، یک نشانه معادل 4 کاراکتر است. 100 توکن برابر با حدود 60-80 کلمه انگلیسی است.
در صورت فعال شدن صورتحساب ، هزینه تماس با API Gemini تا حدودی با تعداد نشانه های ورودی و خروجی تعیین می شود ، بنابراین دانستن چگونگی شمارش نشانه ها می تواند مفید باشد.
توکن ها را بشمار
تمام ورودی و خروجی از API Gemini ، از جمله متن ، پرونده های تصویری و سایر روشهای غیر متن ، نشانه گذاری شده است.
شما می توانید نشانه ها را به روش های زیر حساب کنید:
با ورودی درخواست
countTokens
تماس بگیرید.
این تعداد کل نشانه ها را فقط در ورودی باز می گرداند. می توانید قبل از ارسال ورودی به مدل ، این تماس را انجام دهید تا اندازه درخواست های خود را بررسی کنید.پس از فراخوانی
generate_content
از ویژگیusageMetadata
در شیءresponse
استفاده کنید.
این تعداد کل نشانه ها را در ورودی و خروجی باز می گرداند:totalTokenCount
.
همچنین تعداد نشانه های ورودی و خروجی را به طور جداگانه برمی گرداند:promptTokenCount
(نشانه های ورودی) وcandidatesTokenCount
(نشانه های خروجی).
نشانه های متن را بشمارید
اگر با countTokens
با ورودی فقط متن تماس می گیرید ، تعداد متن متن را فقط در ورودی ( totalTokens
) برمی گرداند. می توانید قبل از تماس با generateContent
این تماس را انجام دهید تا اندازه درخواست های خود را بررسی کنید.
گزینه دیگر فراخوانی generateContent
و سپس استفاده از ویژگی usageMetadata
در شیء response
برای دریافت موارد زیر است:
- تعداد توکن جداگانه ورودی (
promptTokenCount
) و خروجی (candidatesTokenCount
) - تعداد کل نشانه ها در ورودی و خروجی (
totalTokenCount
)
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "The quick brown fox jumps over the lazy dog.";
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: prompt,
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: prompt,
});
console.log(generateResponse.usageMetadata);
توکن های چند چرخش (گپ) را بشمارید
اگر با تاریخچه چت با countTokens
تماس بگیرید ، تعداد کل متن متن را از هر نقش در گپ ( totalTokens
) برمی گرداند.
گزینه دیگر تماس با sendMessage
و سپس استفاده از ویژگی usageMetadata
در شیء response
برای دریافت موارد زیر است:
- تعداد توکن جداگانه ورودی (
promptTokenCount
) و خروجی (candidatesTokenCount
) - تعداد کل نشانه ها در ورودی و خروجی (
totalTokenCount
)
برای درک اینکه نوبت مکالمه بعدی شما چقدر بزرگ خواهد بود ، باید هنگام تماس countTokens
، آن را به تاریخ اضافه کنید.
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
// Initial chat history.
const history = [
{ role: "user", parts: [{ text: "Hi my name is Bob" }] },
{ role: "model", parts: [{ text: "Hi Bob!" }] },
];
const chat = ai.chats.create({
model: "gemini-2.0-flash",
history: history,
});
// Count tokens for the current chat history.
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: chat.getHistory(),
});
console.log(countTokensResponse.totalTokens);
const chatResponse = await chat.sendMessage({
message: "In one sentence, explain how a computer works to a young child.",
});
console.log(chatResponse.usageMetadata);
// Add an extra user message to the history.
const extraMessage = {
role: "user",
parts: [{ text: "What is the meaning of life?" }],
};
const combinedHistory = chat.getHistory();
combinedHistory.push(extraMessage);
const combinedCountTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: combinedHistory,
});
console.log(
"Combined history token count:",
combinedCountTokensResponse.totalTokens,
);
نشانه های چندمودال را بشمارید
تمام ورودی به API Gemini ، از جمله متن ، پرونده های تصویری و سایر روشهای غیر متن ، نشانه گذاری شده است. توجه داشته باشید نکات کلیدی سطح بالا در مورد سموم سازی ورودی مولتی حالت در هنگام پردازش توسط API Gemini:
با Gemini 2.0 ، ورودی های تصویر با هر دو بعد <= 384 پیکسل به عنوان 258 توکن شمارش می شوند. تصاویر بزرگتر در یک یا هر دو بعد برش داده می شوند و در صورت نیاز به کاشی هایی با ابعاد 768x768 پیکسل برش داده می شوند که هر کدام به عنوان 258 توکن به حساب می آیند. قبل از Gemini 2.0 ، تصاویر از 258 نشانه ثابت استفاده می کردند.
فایلهای ویدئویی و صوتی با نرخ ثابت زیر به نشانه ها تبدیل می شوند: فیلم در 263 نشانه در ثانیه و صوتی با 32 نشانه در ثانیه.
فایل های تصویری
اگر با یک ورودی متن و تصویر با countTokens
تماس بگیرید ، تعداد توکن ترکیبی متن و تصویر را فقط در ورودی ( totalTokens
) برمی گرداند. می توانید قبل از تماس با generateContent
این تماس را انجام دهید تا اندازه درخواست های خود را بررسی کنید. همچنین می توانید به طور اختیاری countTokens
در متن و پرونده به طور جداگانه تماس بگیرید.
گزینه دیگر فراخوانی generateContent
و سپس استفاده از ویژگی usageMetadata
در شیء response
برای دریافت موارد زیر است:
- تعداد توکن جداگانه ورودی (
promptTokenCount
) و خروجی (candidatesTokenCount
) - تعداد کل نشانه ها در ورودی و خروجی (
totalTokenCount
)
مثالی که از یک تصویر بارگذاری شده از API پرونده استفاده می کند:
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this image";
const organ = await ai.files.upload({
file: path.join(media, "organ.jpg"),
config: { mimeType: "image/jpeg" },
});
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(organ.uri, organ.mimeType),
]),
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(organ.uri, organ.mimeType),
]),
});
console.log(generateResponse.usageMetadata);
مثال که تصویر را به عنوان داده های درون خطی ارائه می دهد:
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this image";
const imageBuffer = fs.readFileSync(path.join(media, "organ.jpg"));
// Convert buffer to base64 string.
const imageBase64 = imageBuffer.toString("base64");
// Build contents using createUserContent and createPartFromBase64.
const contents = createUserContent([
prompt,
createPartFromBase64(imageBase64, "image/jpeg"),
]);
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: contents,
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: contents,
});
console.log(generateResponse.usageMetadata);
پرونده های ویدئویی یا صوتی
صوتی و تصویری هر یک با نرخ ثابت زیر به نشانه ها تبدیل می شوند:
- ویدئو: 263 نشانه در ثانیه
- صدا: 32 نشانه در ثانیه
اگر با یک ورودی متن و تصویری/صوتی با countTokens
تماس می گیرید ، تعداد توکن ترکیبی متن و پرونده ویدیو/صوتی را فقط در ورودی ( totalTokens
) باز می گرداند. می توانید قبل از تماس با generateContent
این تماس را انجام دهید تا اندازه درخواست های خود را بررسی کنید. همچنین می توانید به طور اختیاری countTokens
در متن و پرونده به طور جداگانه تماس بگیرید.
گزینه دیگر فراخوانی generateContent
و سپس استفاده از ویژگی usageMetadata
در شیء response
برای دریافت موارد زیر است:
- تعداد توکن جداگانه ورودی (
promptTokenCount
) و خروجی (candidatesTokenCount
) - تعداد کل نشانه ها در ورودی و خروجی (
totalTokenCount
)
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this video";
let videoFile = await ai.files.upload({
file: path.join(media, "Big_Buck_Bunny.mp4"),
config: { mimeType: "video/mp4" },
});
// Poll until the video file is completely processed (state becomes ACTIVE).
while (!videoFile.state || videoFile.state.toString() !== "ACTIVE") {
console.log("Processing video...");
console.log("File state: ", videoFile.state);
await sleep(5000);
videoFile = await ai.files.get({ name: videoFile.name });
}
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(videoFile.uri, videoFile.mimeType),
]),
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(videoFile.uri, videoFile.mimeType),
]),
});
console.log(generateResponse.usageMetadata);
دستورالعمل ها و ابزارهای سیستم
دستورالعمل ها و ابزارهای سیستم نیز به تعداد کل توکن برای ورودی توجه می کنند.
اگر از دستورالعمل های سیستم استفاده می کنید ، تعداد totalTokens
افزایش می یابد تا منعکس کننده افزودن systemInstruction
باشد.
اگر از فراخوانی عملکرد استفاده می کنید ، تعداد totalTokens
افزایش می یابد تا منعکس کننده افزودن tools
باشد.
Gemini and other generative AI models process input and output at a granularity called a token .
About tokens
Tokens can be single characters like z
or whole words like cat
. Long words are broken up into several tokens. The set of all tokens used by the model is called the vocabulary, and the process of splitting text into tokens is called tokenization .
For Gemini models, a token is equivalent to about 4 characters. 100 tokens is equal to about 60-80 English words.
When billing is enabled, the cost of a call to the Gemini API is determined in part by the number of input and output tokens, so knowing how to count tokens can be helpful.
توکن ها را بشمار
All input to and output from the Gemini API is tokenized, including text, image files, and other non-text modalities.
You can count tokens in the following ways:
Call
countTokens
with the input of the request.
This returns the total number of tokens in the input only . You can make this call before sending the input to the model to check the size of your requests.Use the
usageMetadata
attribute on theresponse
object after callinggenerate_content
.
This returns the total number of tokens in both the input and the output :totalTokenCount
.
It also returns the token counts of the input and output separately:promptTokenCount
(input tokens) andcandidatesTokenCount
(output tokens).
Count text tokens
If you call countTokens
with a text-only input, it returns the token count of the text in the input only ( totalTokens
). You can make this call before calling generateContent
to check the size of your requests.
Another option is calling generateContent
and then using the usageMetadata
attribute on the response
object to get the following:
- The separate token counts of the input (
promptTokenCount
) and the output (candidatesTokenCount
) - The total number of tokens in both the input and the output (
totalTokenCount
)
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "The quick brown fox jumps over the lazy dog.";
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: prompt,
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: prompt,
});
console.log(generateResponse.usageMetadata);
Count multi-turn (chat) tokens
If you call countTokens
with the chat history, it returns the total token count of the text from each role in the chat ( totalTokens
).
Another option is calling sendMessage
and then using the usageMetadata
attribute on the response
object to get the following:
- The separate token counts of the input (
promptTokenCount
) and the output (candidatesTokenCount
) - The total number of tokens in both the input and the output (
totalTokenCount
)
To understand how big your next conversational turn will be, you need to append it to the history when you call countTokens
.
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
// Initial chat history.
const history = [
{ role: "user", parts: [{ text: "Hi my name is Bob" }] },
{ role: "model", parts: [{ text: "Hi Bob!" }] },
];
const chat = ai.chats.create({
model: "gemini-2.0-flash",
history: history,
});
// Count tokens for the current chat history.
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: chat.getHistory(),
});
console.log(countTokensResponse.totalTokens);
const chatResponse = await chat.sendMessage({
message: "In one sentence, explain how a computer works to a young child.",
});
console.log(chatResponse.usageMetadata);
// Add an extra user message to the history.
const extraMessage = {
role: "user",
parts: [{ text: "What is the meaning of life?" }],
};
const combinedHistory = chat.getHistory();
combinedHistory.push(extraMessage);
const combinedCountTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: combinedHistory,
});
console.log(
"Combined history token count:",
combinedCountTokensResponse.totalTokens,
);
Count multimodal tokens
All input to the Gemini API is tokenized, including text, image files, and other non-text modalities. Note the following high-level key points about tokenization of multimodal input during processing by the Gemini API:
With Gemini 2.0, image inputs with both dimensions <=384 pixels are counted as 258 tokens. تصاویر بزرگتر در یک یا هر دو بعد برش داده می شوند و در صورت نیاز به کاشی هایی با ابعاد 768x768 پیکسل برش داده می شوند که هر کدام به عنوان 258 توکن به حساب می آیند. Prior to Gemini 2.0, images used a fixed 258 tokens.
Video and audio files are converted to tokens at the following fixed rates: video at 263 tokens per second and audio at 32 tokens per second.
فایل های تصویری
If you call countTokens
with a text-and-image input, it returns the combined token count of the text and the image in the input only ( totalTokens
). You can make this call before calling generateContent
to check the size of your requests. You can also optionally call countTokens
on the text and the file separately.
Another option is calling generateContent
and then using the usageMetadata
attribute on the response
object to get the following:
- The separate token counts of the input (
promptTokenCount
) and the output (candidatesTokenCount
) - The total number of tokens in both the input and the output (
totalTokenCount
)
Example that uses an uploaded image from the File API:
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this image";
const organ = await ai.files.upload({
file: path.join(media, "organ.jpg"),
config: { mimeType: "image/jpeg" },
});
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(organ.uri, organ.mimeType),
]),
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(organ.uri, organ.mimeType),
]),
});
console.log(generateResponse.usageMetadata);
Example that provides the image as inline data:
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this image";
const imageBuffer = fs.readFileSync(path.join(media, "organ.jpg"));
// Convert buffer to base64 string.
const imageBase64 = imageBuffer.toString("base64");
// Build contents using createUserContent and createPartFromBase64.
const contents = createUserContent([
prompt,
createPartFromBase64(imageBase64, "image/jpeg"),
]);
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: contents,
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: contents,
});
console.log(generateResponse.usageMetadata);
Video or audio files
Audio and video are each converted to tokens at the following fixed rates:
- Video: 263 tokens per second
- Audio: 32 tokens per second
If you call countTokens
with a text-and-video/audio input, it returns the combined token count of the text and the video/audio file in the input only ( totalTokens
). You can make this call before calling generateContent
to check the size of your requests. You can also optionally call countTokens
on the text and the file separately.
Another option is calling generateContent
and then using the usageMetadata
attribute on the response
object to get the following:
- The separate token counts of the input (
promptTokenCount
) and the output (candidatesTokenCount
) - The total number of tokens in both the input and the output (
totalTokenCount
)
// Make sure to include the following import:
// import {GoogleGenAI} from '@google/genai';
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const prompt = "Tell me about this video";
let videoFile = await ai.files.upload({
file: path.join(media, "Big_Buck_Bunny.mp4"),
config: { mimeType: "video/mp4" },
});
// Poll until the video file is completely processed (state becomes ACTIVE).
while (!videoFile.state || videoFile.state.toString() !== "ACTIVE") {
console.log("Processing video...");
console.log("File state: ", videoFile.state);
await sleep(5000);
videoFile = await ai.files.get({ name: videoFile.name });
}
const countTokensResponse = await ai.models.countTokens({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(videoFile.uri, videoFile.mimeType),
]),
});
console.log(countTokensResponse.totalTokens);
const generateResponse = await ai.models.generateContent({
model: "gemini-2.0-flash",
contents: createUserContent([
prompt,
createPartFromUri(videoFile.uri, videoFile.mimeType),
]),
});
console.log(generateResponse.usageMetadata);
System instructions and tools
System instructions and tools also count towards the total token count for the input.
If you use system instructions, the totalTokens
count increases to reflect the addition of systemInstruction
.
If you use function calling, the totalTokens
count increases to reflect the addition of tools
.