Gemini и другие генеративные модели ИИ обрабатывают ввод и вывод с степенью детализации, называемой токеном .
О токенах
Токенами могут быть отдельные символы, например z
, или целые слова, например cat
. Длинные слова разбиваются на несколько токенов. Набор всех токенов, используемых моделью, называется словарем, а процесс разделения текста на токены — токенизацией .
Для моделей Gemini токен эквивалентен примерно 4 символам. 100 токенов равны примерно 60-80 английским словам.
Если включено выставление счетов, стоимость вызова API Gemini частично определяется количеством входных и выходных токенов, поэтому знание того, как подсчитывать токены, может оказаться полезным.
Подсчитайте жетоны
Все входные и выходные данные Gemini API токенизированы, включая текст, файлы изображений и другие нетекстовые модальности.
Подсчитать жетоны можно следующими способами:
Вызов
countTokens
при вводе запроса.
Это возвращает общее количество токенов только во входных данных . Вы можете сделать этот вызов перед отправкой входных данных в модель, чтобы проверить размер ваших запросов.Используйте атрибут
usageMetadata
в объектеresponse
послеgenerate_content
.
Это возвращает общее количество токенов как на входе, так и на выходе :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 токенов.
Видео- и аудиофайлы конвертируются в токены по следующим фиксированным скоростям: видео — 263 токена в секунду, аудио — 32 токена в секунду.
Файлы изображений
Если вы вызываете 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
.