Gemini i inne modele generatywnej AI przetwarzają dane wejściowe i wyjściowe z poziomu szczegółowości zwanej tokenem.
Informacje o tokenach
Tokeny mogą być pojedynczymi znakami, np. z
, lub całymi słowami, np. cat
. Długie słowa są dzielone na kilka tokenów. Zbiór wszystkich tokenów używanych przez model nazywa się słownictwem, a proces dzielenia tekstu na tokeny to tokenizacja.
W przypadku modeli Gemini token odpowiada około 4 znakom. 100 tokenów to około 60–80 słów w języku angielskim.
Gdy płatności są włączone, koszt wywołania interfejsu Gemini API jest częściowo określany przez liczbę tokenów wejściowych i wyjściowych, więc warto wiedzieć, jak je zliczać.
Liczba tokenów
Wszystkie dane wejściowe i wyjściowe Gemini API są tokenizowane, w tym tekst, pliki graficzne i inne dane nietekstowe.
Tokeny możesz zliczać na te sposoby:
Wywołaj funkcję
countTokens
z danymi z żądania.
Zwraca łączną liczbę tokenów tylko w danych wejściowych. Możesz wykonać to wywołanie przed wysłaniem danych wejściowych do modelu, aby sprawdzić rozmiar żądań.Użyj atrybutu
usageMetadata
w obiekcieresponse
po wywołaniu funkcjigenerate_content
.
Zwraca łączną liczbę tokenów zarówno na wejściu, jak i na wyjściu:totalTokenCount
.
Zwraca też liczbę tokenów wejściowych i wyjściowych oddzielnie:promptTokenCount
(tokeny wejściowe) icandidatesTokenCount
(tokeny wyjściowe).
Liczenie tokenów tekstowych
Jeśli wywołasz funkcję countTokens
z tekstem jako jedynym wejściem, zwraca ona liczbę tokenów tekstu w tylko wejściu (totalTokens
). Możesz wywołać tę funkcję przed wywołaniem funkcji generateContent
, aby sprawdzić rozmiar swoich żądań.
Inną opcją jest wywołanie generateContent
, a następnie użycie atrybutu usageMetadata
w obiekcie response
, aby uzyskać:
- Liczba tokenów wejściowych (
promptTokenCount
) i wyjściowych (candidatesTokenCount
) - Łączna liczba tokenów w danych wejściowych i wyjściowych (
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);
Liczenie tokenów czatu wieloetapowego
Jeśli wywołasz funkcję countTokens
z historią czatu, zwraca ona łączną liczbę tokenów tekstu z każdej roli w czacie (totalTokens
).
Inną opcją jest wywołanie sendMessage
, a następnie użycie atrybutu usageMetadata
w obiekcie response
, aby uzyskać:
- Liczba tokenów wejściowych (
promptTokenCount
) i wyjściowych (candidatesTokenCount
) - Łączna liczba tokenów w danych wejściowych i wyjściowych (
totalTokenCount
).
Aby dowiedzieć się, jak długi będzie Twój następny wątek konwersacji, musisz dodać go do historii, gdy wywołasz funkcję 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,
);
Liczenie tokenów multimodalnych
Wszystkie dane wejściowe do interfejsu Gemini API są tokenizowane, w tym tekst, pliki graficzne i inne moduły nietekstowe. Pamiętaj o tych ogólnych kluczowych informacjach dotyczących tokenizacji danych multimodalnych podczas przetwarzania przez interfejs Gemini API:
W Gemini 2.0 dane wejściowe dotyczące obrazu, których oba wymiary są mniejsze niż 384 piksele, są zliczane jako 258 tokenów. Obrazy większe w jednym lub obu wymiarach są przycinane i skalowane w razie potrzeby do rozmiaru 768 x 768 pikseli. Każdy z nich jest liczony jako 258 tokenów. Przed wersją Gemini 2.0 obrazy używały stałych 258 tokenów.
Pliki wideo i audio są konwertowane na tokeny z użyciem tych stałych współczynników: filmy – 263 tokeny na sekundę, a dźwięk – 32 tokeny na sekundę.
Pliki graficzne
Jeśli wywołasz countTokens
z danymi wejściowymi zawierającymi tekst i obraz, zwróci to połączoną liczbę tokenów tekstu i obrazu w danych wejściowych (totalTokens
). Możesz wykonać to wywołanie przed wywołaniem generateContent
, aby sprawdzić rozmiar swoich żądań. Opcjonalnie możesz też wywołać countTokens
osobno dla tekstu i pliku.
Inną opcją jest wywołanie generateContent
, a następnie użycie atrybutu usageMetadata
w obiekcie response
, aby uzyskać:
- Liczba tokenów wejściowych (
promptTokenCount
) i wyjściowych (candidatesTokenCount
) - Łączna liczba tokenów w danych wejściowych i wyjściowych (
totalTokenCount
).
Przykład, który używa przesłanego obrazu z interfejsu 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);
Przykład obrazka jako danych wstawionych:
// 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);
pliki wideo lub audio,
Dźwięk i obraz są przekształcane w tokeny według tych stałych stawek:
- Film: 263 tokeny na sekundę
- Dźwięk: 32 tokeny na sekundę
Jeśli wywołasz funkcję countTokens
z tekstem i filmem lub dźwiękiem, zwróci ona połączoną liczbę tokenów tekstu i pliku wideo lub dźwięku w tylko wejściu (totalTokens
). Możesz wykonać to wywołanie przed wywołaniem funkcji generateContent
, aby sprawdzić rozmiar swoich żądań. Opcjonalnie możesz też wywołać countTokens
osobno dla tekstu i pliku.
Inną opcją jest wywołanie generateContent
, a następnie użycie atrybutu usageMetadata
w obiekcie response
, aby uzyskać:
- Liczba tokenów wejściowych (
promptTokenCount
) i wyjściowych (candidatesTokenCount
) - Łączna liczba tokenów w danych wejściowych i wyjściowych (
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);
Instrukcje i narzędzia systemowe
Instrukcje i narzędzia systemowe również wliczają się do łącznej liczby tokenów dla danych wejściowych.
Jeśli używasz instrukcji systemowych, liczba totalTokens
zwiększy się, aby odzwierciedlić dodanie systemInstruction
.
Jeśli używasz wywołania funkcji, liczba totalTokens
zwiększa się, aby odzwierciedlić dodanie tools
.