Tìm hiểu và tính mã thông báo

Gemini và các mô hình AI tạo sinh khác xử lý dữ liệu đầu vào và đầu ra ở mức độ chi tiết được gọi là token.

Đối với các mô hình Gemini, một token tương đương với khoảng 4 ký tự. 100 token tương đương với khoảng 60 đến 80 từ tiếng Anh.

Giới thiệu về token

Token có thể là các ký tự đơn như z hoặc toàn bộ từ như cat. Các từ dài được chia thành nhiều token. Tập hợp tất cả token mà mô hình sử dụng được gọi là từ vựng và quá trình chia văn bản thành token được gọi là token hoá.

Khi tính năng thanh toán được bật, chi phí của một lệnh gọi đến Gemini API được xác định một phần dựa trên số lượng token đầu vào và đầu ra. Vì vậy, việc biết cách đếm token có thể hữu ích.

Bạn có thể thử đếm token trong Colab của chúng tôi.

Xem trên ai.google.dev Dùng thử sổ tay Colab Xem sổ tay trên GitHub

Đếm token

Tất cả dữ liệu đầu vào và đầu ra từ Gemini API đều được token hoá, bao gồm văn bản, tệp hình ảnh và các phương thức không phải văn bản khác.

Bạn có thể đếm token theo những cách sau:

  • Gọi count_tokens bằng dữ liệu đầu vào của yêu cầu.
    Hàm này trả về tổng số token trong dữ liệu đầu vào. Bạn có thể thực hiện lệnh gọi này trước khi gửi dữ liệu đầu vào đến mô hình để kiểm tra kích thước của yêu cầu.

  • Sử dụng thuộc tính usage_metadata trên đối tượng response sau khi gọi generate_content.
    Hàm này trả về tổng số token trong cả dữ liệu đầu vào và đầu ra: total_token_count.
    Hàm này cũng trả về số token của dữ liệu đầu vào và đầu ra riêng biệt: prompt_token_count (token đầu vào) và candidates_token_count (token đầu ra).

    Nếu bạn đang sử dụng mô hình tư duy, thì các token được dùng trong quá trình tư duy sẽ được trả về trong thoughts_token_count. Và nếu bạn đang sử dụng bộ nhớ đệm ngữ cảnh, thì số token được lưu vào bộ nhớ đệm sẽ nằm trong cached_content_token_count.

Đếm token văn bản

Nếu bạn gọi count_tokens bằng dữ liệu đầu vào chỉ có văn bản, thì hàm này sẽ trả về số token của văn bản trong dữ liệu đầu vào (total_tokens). Bạn có thể thực hiện lệnh gọi này trước khi gọi generate_content để kiểm tra kích thước của yêu cầu.

Một lựa chọn khác là gọi generate_content, sau đó sử dụng thuộc tính usage_metadata trên đối tượng response để nhận các giá trị sau:

  • Số token riêng biệt của dữ liệu đầu vào (prompt_token_count), nội dung được lưu vào bộ nhớ đệm (cached_content_token_count) và dữ liệu đầu ra (candidates_token_count)
  • Số token cho quá trình tư duy (thoughts_token_count)
  • Tổng số token trong cả dữ liệu đầu vào và đầu ra (total_token_count)

Python

from google import genai

client = genai.Client()
prompt = "The quick brown fox jumps over the lazy dog."

total_tokens = client.models.count_tokens(
    model="gemini-3.8-flash", contents=prompt
)
print("total_tokens: ", total_tokens)

response = client.models.generate_content(
    model="gemini-3.8-flash", contents=prompt
)

print(response.usage_metadata)

JavaScript

import { GoogleGenAI } from '@google/genai';

const ai = new GoogleGenAI({});
const prompt = "The quick brown fox jumps over the lazy dog.";

async function main() {
  const countTokensResponse = await ai.models.countTokens({
    model: "gemini-3.8-flash",
    contents: prompt,
  });
  console.log(countTokensResponse.totalTokens);

  const generateResponse = await ai.models.generateContent({
    model: "gemini-3.8-flash",
    contents: prompt,
  });
  console.log(generateResponse.usageMetadata);
}

await main();

Go

ctx := context.Background()
client, err := genai.NewClient(ctx, nil)

// Convert prompt to a slice of *genai.Content using the helper.
contents := []*genai.Content{
  genai.NewContentFromText(prompt, genai.RoleUser),
}
countResp, err := client.Models.CountTokens(ctx, "gemini-3.8-flash", contents, nil)
if err != nil {
  return err
}
fmt.Println("total_tokens:", countResp.TotalTokens)

response, err := client.Models.GenerateContent(ctx, "gemini-3.8-flash", contents, nil)
if err != nil {
  log.Fatal(err)
}
usageMetadata, err := json.MarshalIndent(response.UsageMetadata, "", "  ")
if err != nil {
  log.Fatal(err)
}
fmt.Println(string(usageMetadata))
    ```

Đếm token nhiều lượt (trò chuyện)

Nếu bạn gọi count_tokens bằng nhật ký trò chuyện, thì hàm này sẽ trả về tổng số token của văn bản từ từng vai trò trong cuộc trò chuyện (total_tokens).

Một lựa chọn khác là gọi send_message, sau đó sử dụng thuộc tính usage_metadata trên đối tượng response để nhận các giá trị sau:

  • Số token riêng biệt của dữ liệu đầu vào (prompt_token_count), nội dung được lưu vào bộ nhớ đệm (cached_content_token_count) và dữ liệu đầu ra (candidates_token_count)
  • Số token cho quá trình tư duy (thoughts_token_count)
  • Tổng số token trong cả dữ liệu đầu vào và đầu ra (total_token_count)

Để biết lượt trò chuyện tiếp theo của bạn sẽ có kích thước bao nhiêu, bạn cần thêm lượt đó vào nhật ký khi gọi count_tokens.

Python

from google import genai
from google.genai import types

client = genai.Client()

chat = client.chats.create(
    model="gemini-3.8-flash",
    history=[
        types.Content(
            role="user", parts=[types.Part(text="Hi my name is Bob")]
        ),
        types.Content(role="model", parts=[types.Part(text="Hi Bob!")]),
    ],
)

print(
    client.models.count_tokens(
        model="gemini-3.8-flash", contents=chat.get_history()
    )
)

response = chat.send_message(
    message="In one sentence, explain how a computer works to a young child."
)
print(response.usage_metadata)

extra = types.UserContent(
    parts=[
        types.Part(
            text="What is the meaning of life?",
        )
    ]
)
history = [*chat.get_history(), extra]
print(client.models.count_tokens(model="gemini-3.8-flash", contents=history))

JavaScript

import { GoogleGenAI } from '@google/genai';

const ai = new GoogleGenAI({});

async function main() {
  const history = [
    { role: "user", parts: [{ text: "Hi my name is Bob" }] },
    { role: "model", parts: [{ text: "Hi Bob!" }] },
  ];
  const chat = ai.chats.create({
    model: "gemini-3.8-flash",
    history: history,
  });

  const countTokensResponse = await ai.models.countTokens({
    model: "gemini-3.8-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);

  const extraMessage = {
    role: "user",
    parts: [{ text: "What is the meaning of life?" }],
  };
  const combinedHistory = [...chat.getHistory(), extraMessage];
  const combinedCountTokensResponse = await ai.models.countTokens({
    model: "gemini-3.8-flash",
    contents: combinedHistory,
  });
  console.log(
    "Combined history token count:",
    combinedCountTokensResponse.totalTokens,
  );
}

await main();

Go

ctx := context.Background()
client, err := genai.NewClient(ctx, nil)

history := []*genai.Content{
  {Role: genai.RoleUser, Parts: []*genai.Part({Text: "Hi my name is Bob"})},
  {Role: genai.RoleModel, Parts: []*genai.Part({Text: "Hi Bob!"})},
}
chat, err := client.Chats.Create(ctx, "gemini-3.8-flash", nil, history)
if err != nil {
  log.Fatal(err)
}

firstTokenResp, err := client.Models.CountTokens(ctx, "gemini-3.8-flash", chat.History(false), nil)
if err != nil {
  log.Fatal(err)
}
fmt.Println(firstTokenResp.TotalTokens)

resp, err := chat.SendMessage(ctx, genai.NewPartFromText("In one sentence, explain how a computer works to a young child."))
if err != nil {
  log.Fatal(err)
}
fmt.Printf("%#v\n", resp.UsageMetadata)

extra := genai.NewContentFromText("What is the meaning of life?", genai.RoleUser)
hist := chat.History(false)
hist = append(hist, extra)

secondTokenResp, err := client.Models.CountTokens(ctx, "gemini-3.8-flash", hist, nil)
if err != nil {
  log.Fatal(err)
}
fmt.Println(secondTokenResp.TotalTokens)

Đếm token đa phương thức

Tất cả dữ liệu đầu vào cho Gemini API đều được token hoá, bao gồm văn bản, tệp hình ảnh và các phương thức không phải văn bản khác. Hãy lưu ý những điểm chính cấp cao sau đây về việc token hoá dữ liệu đầu vào đa phương thức trong quá trình xử lý bằng Gemini API:

  • Dữ liệu đầu vào hình ảnh có cả hai kích thước <= 384 pixel được tính là 258 token. Hình ảnh lớn hơn ở một hoặc cả hai kích thước sẽ được cắt và điều chỉnh tỷ lệ khi cần thành các ô 768x768 pixel, mỗi ô được tính là 258 token.

  • Tệp video và tệp âm thanh được chuyển đổi thành token theo các tỷ lệ cố định sau: video ở mức 263 token mỗi giây và âm thanh ở mức 32 token mỗi giây. Tỷ lệ này áp dụng cho quá trình xử lý tĩnh (mặc định). Đối với quá trình xử lý theo tác nhân, mức sử dụng token sẽ khác nhau. Xem Mức sử dụng token video theo chế độ xử lý.

Độ phân giải nội dung đa phương tiện

Các mô hình Gemini 3 giới thiệu khả năng kiểm soát chi tiết đối với quá trình xử lý hình ảnh đa phương thức bằng tham số media_resolution. Tham số media_resolution xác định số lượng token tối đa được phân bổ cho mỗi hình ảnh hoặc khung video đầu vào. Độ phân giải cao hơn giúp cải thiện khả năng đọc văn bản chi tiết hoặc xác định các chi tiết nhỏ của mô hình, nhưng làm tăng mức sử dụng token và độ trễ.

Để biết thêm thông tin chi tiết về tham số này và cách tham số này có thể ảnh hưởng đến việc tính toán token, hãy xem hướng dẫn về độ phân giải nội dung đa phương tiện.

Tệp hình ảnh

Nếu bạn gọi count_tokens bằng dữ liệu đầu vào văn bản và hình ảnh, thì hàm này sẽ trả về số token kết hợp của văn bản và hình ảnh trong dữ liệu đầu vào (total_tokens). Bạn có thể thực hiện lệnh gọi này trước khi gọi generate_content để kiểm tra kích thước của yêu cầu. Bạn cũng có thể tuỳ ý gọi count_tokens trên văn bản và tệp riêng biệt.

Một lựa chọn khác là gọi generate_content, sau đó sử dụng thuộc tính usage_metadata trên đối tượng response để nhận các giá trị sau:

  • Số token riêng biệt của dữ liệu đầu vào (prompt_token_count), nội dung được lưu vào bộ nhớ đệm (cached_content_token_count) và dữ liệu đầu ra (candidates_token_count)
  • Số token cho quá trình tư duy (thoughts_token_count)
  • Tổng số token trong cả dữ liệu đầu vào và đầu ra (total_token_count)

Ví dụ sử dụng hình ảnh đã tải lên từ File API:

Python

from google import genai

client = genai.Client()
prompt = "Tell me about this image"
your_image_file = client.files.upload(file=media / "organ.jpg")

print(
    client.models.count_tokens(
        model="gemini-3.8-flash", contents=[prompt, your_image_file]
    )
)

response = client.models.generate_content(
    model="gemini-3.8-flash", contents=[prompt, your_image_file]
)
print(response.usage_metadata)

JavaScript

import { GoogleGenAI } from '@google/genai';

const ai = new GoogleGenAI({});
const prompt = "Tell me about this image";

async function main() {
  const organ = await ai.files.upload({
    file: path.join(media, "organ.jpg"),
    config: { mimeType: "image/jpeg" },
  });

  const countTokensResponse = await ai.models.countTokens({
    model: "gemini-3.8-flash",
    contents: createUserContent([
      prompt,
      createPartFromUri(organ.uri, organ.mimeType),
    ]),
  });
  console.log(countTokensResponse.totalTokens);

  const generateResponse = await ai.models.generateContent({
    model: "gemini-3.8-flash",
    contents: createUserContent([
      prompt,
      createPartFromUri(organ.uri, organ.mimeType),
    ]),
  });
  console.log(generateResponse.usageMetadata);
}

await main();

Go

ctx := context.Background()
client, err := genai.NewClient(ctx, nil)

file, err := client.Files.UploadFromPath(
  ctx, 
  filepath.Join(getMedia(), "organ.jpg"), 
  &genai.UploadFileConfig{
    MIMEType : "image/jpeg",
  },
)
if err != nil {
  log.Fatal(err)
}
parts := []*genai.Part{
  genai.NewPartFromText("Tell me about this image"),
  genai.NewPartFromURI(file.URI, file.MIMEType),
}
contents := []*genai.Content{
  genai.NewContentFromParts(parts, genai.RoleUser),
}

tokenResp, err := client.Models.CountTokens(ctx, "gemini-3.8-flash", contents, nil)
if err != nil {
  log.Fatal(err)
}
fmt.Println("Multimodal image token count:", tokenResp.TotalTokens)

response, err := client.Models.GenerateContent(ctx, "gemini-3.8-flash", contents, nil)
if err != nil {
  log.Fatal(err)
}
usageMetadata, err := json.MarshalIndent(response.UsageMetadata, "", "  ")
if err != nil {
  log.Fatal(err)
}
fmt.Println(string(usageMetadata))

Ví dụ cung cấp hình ảnh dưới dạng dữ liệu nội tuyến:

Python

from google import genai
import PIL.Image

client = genai.Client()
prompt = "Tell me about this image"
your_image_file = PIL.Image.open(media / "organ.jpg")

print(
    client.models.count_tokens(
        model="gemini-3.8-flash", contents=[prompt, your_image_file]
    )
)

response = client.models.generate_content(
    model="gemini-3.8-flash", contents=[prompt, your_image_file]
)
print(response.usage_metadata)

JavaScript

import { GoogleGenAI } from '@google/genai';

const ai = new GoogleGenAI({});
const prompt = "Tell me about this image";
const imageBuffer = fs.readFileSync(path.join(media, "organ.jpg"));

const imageBase64 = imageBuffer.toString("base64");

const contents = createUserContent([
  prompt,
  createPartFromBase64(imageBase64, "image/jpeg"),
]);

async function main() {
  const countTokensResponse = await ai.models.countTokens({
    model: "gemini-3.8-flash",
    contents: contents,
  });
  console.log(countTokensResponse.totalTokens);

  const generateResponse = await ai.models.generateContent({
    model: "gemini-3.8-flash",
    contents: contents,
  });
  console.log(generateResponse.usageMetadata);
}

await main();

Go

ctx := context.Background()
client, err := genai.NewClient(ctx, nil)

imageBytes, err := os.ReadFile("organ.jpg")
if err != nil {
    log.Fatalf("Failed to read image file: %v", err)
}
parts := []*genai.Part{
  genai.NewPartFromText("Tell me about this image"),
  {
        InlineData: &genai.Blob{
              MIMEType: "image/jpeg",
              Data:     imageBytes,
        },
  },
}
contents := []*genai.Content{
  genai.NewContentFromParts(parts, genai.RoleUser),
}

tokenResp, err := client.Models.CountTokens(ctx, "gemini-3.8-flash", contents, nil)
if err != nil {
  log.Fatal(err)
}
fmt.Println("Multimodal image token count:", tokenResp.TotalTokens)

response, err := client.Models.GenerateContent(ctx, "gemini-3.8-flash", contents, nil)
if err != nil {
  log.Fatal(err)
}
usageMetadata, err := json.MarshalIndent(response.UsageMetadata, "", "  ")
if err != nil {
  log.Fatal(err)
}
fmt.Println(string(usageMetadata))

Tệp video hoặc tệp âm thanh

Âm thanh và video được chuyển đổi thành token theo các tỷ lệ cố định sau:

  • Video: 263 token mỗi giây
  • Âm thanh: 32 token mỗi giây

Nếu bạn gọi count_tokens bằng dữ liệu đầu vào văn bản và video/tệp âm thanh, thì hàm này sẽ trả về số token kết hợp của văn bản và tệp video/tệp âm thanh trong dữ liệu đầu vào (total_tokens). Bạn có thể thực hiện lệnh gọi này trước khi gọi generate_content để kiểm tra kích thước của yêu cầu. Bạn cũng có thể tuỳ ý gọi count_tokens trên văn bản và tệp riêng biệt.

Một lựa chọn khác là gọi generate_content, sau đó sử dụng thuộc tính usage_metadata trên đối tượng response để nhận các giá trị sau:

  • Số token riêng biệt của dữ liệu đầu vào (prompt_token_count), nội dung được lưu vào bộ nhớ đệm (cached_content_token_count) và dữ liệu đầu ra (candidates_token_count)
  • Số token cho quá trình tư duy (thoughts_token_count)
  • Tổng số token trong cả dữ liệu đầu vào và đầu ra (total_token_count).

Python

from google import genai
import time

client = genai.Client()
prompt = "Tell me about this video"
your_file = client.files.upload(file=media / "Big_Buck_Bunny.mp4")

while not your_file.state or your_file.state.name != "ACTIVE":
    print("Processing video...")
    print("File state:", your_file.state)
    time.sleep(5)
    your_file = client.files.get(name=your_file.name)

print(
    client.models.count_tokens(
        model="gemini-3.8-flash", contents=[prompt, your_file]
    )
)

response = client.models.generate_content(
    model="gemini-3.8-flash", contents=[prompt, your_file]
)
print(response.usage_metadata)

JavaScript

import { GoogleGenAI } from '@google/genai';

const ai = new GoogleGenAI({});
const prompt = "Tell me about this video";

async function main() {
  let videoFile = await ai.files.upload({
    file: path.join(media, "Big_Buck_Bunny.mp4"),
    config: { mimeType: "video/mp4" },
  });

  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-3.8-flash",
    contents: createUserContent([
      prompt,
      createPartFromUri(videoFile.uri, videoFile.mimeType),
    ]),
  });
  console.log(countTokensResponse.totalTokens);

  const generateResponse = await ai.models.generateContent({
    model: "gemini-3.8-flash",
    contents: createUserContent([
      prompt,
      createPartFromUri(videoFile.uri, videoFile.mimeType),
    ]),
  });
  console.log(generateResponse.usageMetadata);
}

await main();

Go

ctx := context.Background()
client, err := genai.NewClient(ctx, nil)

file, err := client.Files.UploadFromPath(
  ctx,
  filepath.Join(getMedia(), "Big_Buck_Bunny.mp4"),
  &genai.UploadFileConfig{
    MIMEType : "video/mp4",
  },
)
if err != nil {
  log.Fatal(err)
}

for file.State == genai.FileStateUnspecified || file.State != genai.FileStateActive {
  fmt.Println("Processing video...")
  fmt.Println("File state:", file.State)
  time.Sleep(5 * time.Second)

  file, err = client.Files.Get(ctx, file.Name, nil)
  if err != nil {
    log.Fatal(err)
  }
}

parts := []*genai.Part{
  genai.NewPartFromText("Tell me about this video"),
  genai.NewPartFromURI(file.URI, file.MIMEType),
}
contents := []*genai.Content{
  genai.NewContentFromParts(parts, genai.RoleUser),
}

tokenResp, err := client.Models.CountTokens(ctx, "gemini-3.8-flash", contents, nil)
if err != nil {
  log.Fatal(err)
}
fmt.Println("Multimodal video/audio token count:", tokenResp.TotalTokens)
response, err := client.Models.GenerateContent(ctx, "gemini-3.8-flash", contents, nil)
if err != nil {
  log.Fatal(err)
}
usageMetadata, err := json.MarshalIndent(response.UsageMetadata, "", "  ")
if err != nil {
  log.Fatal(err)
}
fmt.Println(string(usageMetadata))

Mức sử dụng token video theo chế độ xử lý

Mức sử dụng token cho video phụ thuộc vào chế độ xử lý:

Chế độ xử lý Cách tính token Mức sử dụng thông thường
Tĩnh (mặc định) Khoảng 100 token/giây theo mặc định (độ phân giải thấp) hoặc khoảng 300 token/giây (độ phân giải cao). Tất cả khung hình được lấy mẫu ở mức 1 FPS. Có thể dự đoán, tỷ lệ thuận với thời lượng video.
Theo tác nhân Khác nhau tuỳ theo độ phức tạp của nội dung. Mô hình chỉ tải bản chép lời và/hoặc khung hình và/hoặc âm thanh cần thiết để trả lời câu lệnh. Giảm tới 88% số token cho nội dung dạng dài.

Với quá trình xử lý theo tác nhân, một bài giảng dài 1 giờ sử dụng khoảng 1,08 triệu token ở chế độ tĩnh có thể sử dụng khoảng 108.000 token, tuỳ thuộc vào câu lệnh và nội dung.

Để kiểm tra mức sử dụng token thực tế cho một yêu cầu, hãy sử dụng trường usage_metadata trong phản hồi. Trong UsageMetadata, các token video theo tác nhân được báo cáo trên các trường sau:

  • Câu lệnh ban đầu (tham chiếu video + câu lệnh của người dùng): prompt_token_count
  • Tư duy điều hướng: thoughts_token_count
  • Bản chép lời, khung hình và âm thanh được tải theo yêu cầu: tool_use_prompt_token_count
  • Câu trả lời cuối cùng: candidates_token_count

Đếm token tư duy

Khi bạn bật tính năng tư duy, giá phản hồi là tổng số token đầu ra và token tư duy. Bạn có thể truy xuất tổng số token tư duy đã tạo từ trường thoughtsTokenCount (hoặc SDK tương đương).

Python

# ...
print("Thoughts tokens:", response.usage_metadata.thoughts_token_count)
print("Output tokens:", response.usage_metadata.candidates_token_count)

JavaScript

// ...
console.log(`Thoughts tokens: ${response.usageMetadata.thoughtsTokenCount}`);
console.log(`Output tokens: ${response.usageMetadata.candidatesTokenCount}`);

Go

// ...
fmt.Println("Thoughts tokens:", response.UsageMetadata.ThoughtsTokenCount)
fmt.Println("Output tokens:", response.UsageMetadata.CandidatesTokenCount)

Các mô hình tư duy tạo ra toàn bộ ý tưởng để cải thiện chất lượng của câu trả lời cuối cùng, sau đó đưa ra bản tóm tắt để cung cấp thông tin chi tiết về quá trình tư duy. Vì vậy, API tính giá dựa trên toàn bộ token tư duy mà mô hình tạo ra để tạo bản tóm tắt, mặc dù API chỉ đưa ra bản tóm tắt.

Bạn có thể tìm hiểu thêm về cách định cấu hình tính năng tư duy trong hướng dẫn tư duy của Gemini.

Cửa sổ ngữ cảnh

Các mô hình có sẵn thông qua Gemini API có cửa sổ ngữ cảnh được đo bằng token. Cửa sổ ngữ cảnh xác định lượng dữ liệu đầu vào mà bạn có thể cung cấp và lượng dữ liệu đầu ra mà mô hình có thể tạo. Bạn có thể xác định kích thước của cửa sổ ngữ cảnh bằng cách gọi điểm cuối models.get hoặc bằng cách xem tài liệu về mô hình.

  • Các mô hình Gemini 4 (gemini-4-argon): Chia sẻ một cửa sổ ngữ cảnh duy nhất gồm 1 triệu token (1,048,576 token) trên các token đầu vào, tư duy và đầu ra. Các yêu cầu riêng lẻ bị giới hạn ở mức 65,536 token đầu ra cho tính năng phát trực tuyến (streamGenerateContent) và 32,768 token đầu ra cho tính năng không phát trực tuyến (generateContent), hoặc bạn có thể tạo tối đa 1,048,576 token bằng cách sử dụng tính năng giải mã dài. Nếu token đầu vào của bạn cộng với max_output_tokens vượt quá 1.048.576 token, thì API sẽ tự động giới hạn đầu ra ở mức không gian còn lại trong cửa sổ ngữ cảnh (1,048,576 trừ token đầu vào của bạn).
  • Các mô hình Gemini 3 và 2.5: Sử dụng ngân sách đầu vào (1,048,576 token) và đầu ra (65,536 token) riêng biệt.

Python

from google import genai

client = genai.Client()
model_info = client.models.get(model="gemini-3.8-flash")
print(f"{model_info.input_token_limit=}")
print(f"{model_info.output_token_limit=}")

JavaScript

import { GoogleGenAI } from '@google/genai';

const ai = new GoogleGenAI({});

async function main() {
  const modelInfo = await ai.models.get({model: 'gemini-3.8-flash'});
  console.log(modelInfo.inputTokenLimit);
  console.log(modelInfo.outputTokenLimit);
}

await main();

Go

ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
  log.Fatal(err)
}
modelInfo, err := client.ModelInfo(ctx, "models/gemini-3.8-flash")
if err != nil {
  log.Fatal(err)
}
fmt.Println("input token limit:", modelInfo.InputTokenLimit)
fmt.Println("output token limit:", modelInfo.OutputTokenLimit)