Thực thi mã

Gemini API cung cấp một công cụ thực thi mã cho phép mô hình tạo và chạy mã Python. Sau đó, mô hình có thể học lặp lại từ kết quả thực thi mã cho đến khi đạt được kết quả cuối cùng. Bạn có thể sử dụng tính năng thực thi mã để xây dựng các ứng dụng hưởng lợi từ việc suy luận dựa trên mã. Ví dụ: bạn có thể sử dụng tính năng thực thi mã để giải phương trình hoặc xử lý văn bản. Bạn cũng có thể sử dụng thư viện có trong môi trường thực thi mã để thực hiện các tác vụ chuyên biệt hơn.

Gemini chỉ có thể thực thi mã bằng Python. Bạn vẫn có thể yêu cầu Gemini tạo mã bằng một ngôn ngữ khác, nhưng mô hình không thể sử dụng công cụ thực thi mã để chạy mã đó.

Bật tính năng thực thi mã

Để bật tính năng thực thi mã, hãy định cấu hình công cụ thực thi mã trên mô hình. Điều này cho phép mô hình tạo và chạy mã.

Python

from google import genai
from google.genai import types

client = genai.Client()

response = client.models.generate_content(
    model="gemini-2.0-flash",
    contents="What is the sum of the first 50 prime numbers? "
    "Generate and run code for the calculation, and make sure you get all 50.",
    config=types.GenerateContentConfig(
        tools=[types.Tool(code_execution=types.ToolCodeExecution)]
    ),
)

for part in response.candidates[0].content.parts:
    if part.text is not None:
        print(part.text)
    if part.executable_code is not None:
        print(part.executable_code.code)
    if part.code_execution_result is not None:
        print(part.code_execution_result.output)

JavaScript

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

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });

let response = await ai.models.generateContent({
  model: "gemini-2.0-flash",
  contents: [
    "What is the sum of the first 50 prime numbers? " +
      "Generate and run code for the calculation, and make sure you get all 50.",
  ],
  config: {
    tools: [{ codeExecution: {} }],
  },
});

const parts = response?.candidates?.[0]?.content?.parts || [];
parts.forEach((part) => {
  if (part.text) {
    console.log(part.text);
  }

  if (part.executableCode && part.executableCode.code) {
    console.log(part.executableCode.code);
  }

  if (part.codeExecutionResult && part.codeExecutionResult.output) {
    console.log(part.codeExecutionResult.output);
  }
});

Go

package main

import (
    "context"
    "fmt"
    "os"
    "google.golang.org/genai"
)

func main() {

    ctx := context.Background()
    client, _ := genai.NewClient(ctx, &genai.ClientConfig{
        APIKey:  os.Getenv("GOOGLE_API_KEY"),
        Backend: genai.BackendGeminiAPI,
    })

    config := &genai.GenerateContentConfig{
        Tools: []*genai.Tool{
            {CodeExecution: &genai.ToolCodeExecution{}},
        },
    }

    result, _ := client.Models.GenerateContent(
        ctx,
        "gemini-2.0-flash",
        genai.Text("What is the sum of the first 50 prime numbers? " +
                  "Generate and run code for the calculation, and make sure you get all 50."),
        config,
    )

    fmt.Println(result.Text())
    fmt.Println(result.ExecutableCode())
    fmt.Println(result.CodeExecutionResult())
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-d ' {"tools": [{"code_execution": {}}],
    "contents": {
      "parts":
        {
            "text": "What is the sum of the first 50 prime numbers? Generate and run code for the calculation, and make sure you get all 50."
        }
    },
}'

Kết quả có thể có dạng như sau, đã được định dạng để dễ đọc:

Okay, I need to calculate the sum of the first 50 prime numbers. Here's how I'll
approach this:

1.  **Generate Prime Numbers:** I'll use an iterative method to find prime
    numbers. I'll start with 2 and check if each subsequent number is divisible
    by any number between 2 and its square root. If not, it's a prime.
2.  **Store Primes:** I'll store the prime numbers in a list until I have 50 of
    them.
3.  **Calculate the Sum:**  Finally, I'll sum the prime numbers in the list.

Here's the Python code to do this:

def is_prime(n):
  """Efficiently checks if a number is prime."""
  if n <= 1:
    return False
  if n <= 3:
    return True
  if n % 2 == 0 or n % 3 == 0:
    return False
  i = 5
  while i * i <= n:
    if n % i == 0 or n % (i + 2) == 0:
      return False
    i += 6
  return True

primes = []
num = 2
while len(primes) < 50:
  if is_prime(num):
    primes.append(num)
  num += 1

sum_of_primes = sum(primes)
print(f'{primes=}')
print(f'{sum_of_primes=}')

primes=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67,
71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229]
sum_of_primes=5117

The sum of the first 50 prime numbers is 5117.

Kết quả này kết hợp một số phần nội dung mà mô hình trả về khi sử dụng quá trình thực thi mã:

  • text: Văn bản cùng dòng do mô hình tạo
  • executableCode: Mã do mô hình tạo ra và cần được thực thi
  • codeExecutionResult: Kết quả của mã có thể thực thi

Quy ước đặt tên cho các phần này khác nhau tuỳ theo ngôn ngữ lập trình.

Sử dụng tính năng thực thi mã trong cuộc trò chuyện

Bạn cũng có thể sử dụng tính năng thực thi mã trong cuộc trò chuyện.

Python

from google import genai
from google.genai import types

client = genai.Client()

chat = client.chats.create(
    model="gemini-2.0-flash",
    config=types.GenerateContentConfig(
        tools=[types.Tool(code_execution=types.ToolCodeExecution)]
    ),
)

response = chat.send_message("I have a math question for you.")
print(response.text)

response = chat.send_message(
    "What is the sum of the first 50 prime numbers? "
    "Generate and run code for the calculation, and make sure you get all 50."
)

for part in response.candidates[0].content.parts:
    if part.text is not None:
        print(part.text)
    if part.executable_code is not None:
        print(part.executable_code.code)
    if part.code_execution_result is not None:
        print(part.code_execution_result.output)

JavaScript

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

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });

const chat = ai.chats.create({
  model: "gemini-2.0-flash",
  history: [
    {
      role: "user",
      parts: [{ text: "I have a math question for you:" }],
    },
    {
      role: "model",
      parts: [{ text: "Great! I'm ready for your math question. Please ask away." }],
    },
  ],
  config: {
    tools: [{codeExecution:{}}],
  }
});

const response = await chat.sendMessage({
  message: "What is the sum of the first 50 prime numbers? " +
            "Generate and run code for the calculation, and make sure you get all 50."
});
console.log("Chat response:", response.text);

Go

package main

import (
    "context"
    "fmt"
    "os"
    "google.golang.org/genai"
)

func main() {

    ctx := context.Background()
    client, _ := genai.NewClient(ctx, &genai.ClientConfig{
        APIKey:  os.Getenv("GOOGLE_API_KEY"),
        Backend: genai.BackendGeminiAPI,
    })

    config := &genai.GenerateContentConfig{
        Tools: []*genai.Tool{
            {CodeExecution: &genai.ToolCodeExecution{}},
        },
    }

    chat, _ := client.Chats.Create(
        ctx,
        "gemini-2.0-flash",
        config,
        nil,
    )

    result, _ := chat.SendMessage(
                    ctx,
                    genai.Part{Text: "What is the sum of the first 50 prime numbers? " +
                                          "Generate and run code for the calculation, and " +
                                          "make sure you get all 50.",
                              },
                )

    fmt.Println(result.Text())
    fmt.Println(result.ExecutableCode())
    fmt.Println(result.CodeExecutionResult())
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"tools": [{"code_execution": {}}],
    "contents": [
        {
            "role": "user",
            "parts": [{
                "text": "Can you print \"Hello world!\"?"
            }]
        },{
            "role": "model",
            "parts": [
              {
                "text": ""
              },
              {
                "executable_code": {
                  "language": "PYTHON",
                  "code": "\nprint(\"hello world!\")\n"
                }
              },
              {
                "code_execution_result": {
                  "outcome": "OUTCOME_OK",
                  "output": "hello world!\n"
                }
              },
              {
                "text": "I have printed \"hello world!\" using the provided python code block. \n"
              }
            ],
        },{
            "role": "user",
            "parts": [{
                "text": "What is the sum of the first 50 prime numbers? Generate and run code for the calculation, and make sure you get all 50."
            }]
        }
    ]
}'

Đầu vào/đầu ra (I/O)

Kể từ Gemini 2.0 Flash, quá trình thực thi mã sẽ hỗ trợ đầu vào tệp và đầu ra biểu đồ. Khi sử dụng các chức năng đầu vào và đầu ra này, bạn có thể tải tệp CSV và tệp văn bản lên, đặt câu hỏi về các tệp đó và tạo biểu đồ Matplotlib trong phản hồi. Các tệp đầu ra được trả về dưới dạng hình ảnh nội tuyến trong phản hồi.

Giá của I/O

Khi sử dụng I/O thực thi mã, bạn sẽ bị tính phí cho mã thông báo đầu vào và mã thông báo đầu ra:

Mã thông báo đầu vào:

  • Lời nhắc người dùng

Mã thông báo đầu ra:

  • Mã do mô hình tạo
  • Kết quả thực thi mã trong môi trường mã
  • Bản tóm tắt do mô hình tạo

Thông tin chi tiết về I/O

Khi bạn làm việc với I/O thực thi mã, hãy lưu ý đến các thông tin kỹ thuật sau:

  • Thời gian chạy tối đa của môi trường mã là 30 giây.
  • Nếu môi trường mã tạo ra lỗi, mô hình có thể quyết định tạo lại đầu ra mã. Quá trình này có thể diễn ra tối đa 5 lần.
  • Kích thước đầu vào tệp tối đa bị giới hạn bởi cửa sổ mã thông báo mô hình. Trong AI Studio, khi sử dụng Gemini Flash 2.0, kích thước tệp đầu vào tối đa là 1 triệu mã thông báo (khoảng 2 MB đối với tệp văn bản của các loại dữ liệu đầu vào được hỗ trợ). Nếu bạn tải một tệp quá lớn lên, AI Studio sẽ không cho phép bạn gửi tệp đó.
  • Việc thực thi mã hoạt động hiệu quả nhất với các tệp văn bản và CSV.
  • Bạn có thể truyền tệp đầu vào trong part.inlineData hoặc part.fileData (được tải lên thông qua Files API) và tệp đầu ra luôn được trả về dưới dạng part.inlineData.
Một lượt Hai chiều (API Trực tiếp đa phương thức)
Các mô hình được hỗ trợ Tất cả các mẫu Gemini 2.0 Chỉ các mô hình thử nghiệm Flash
Các loại đầu vào tệp được hỗ trợ .png, .jpeg, .csv, .xml, .cpp, .java, .py, .js, .ts .png, .jpeg, .csv, .xml, .cpp, .java, .py, .js, .ts
Các thư viện lập biểu đồ được hỗ trợ Matplotlib Matplotlib
Sử dụng nhiều công cụ Không

Thanh toán

Bạn không phải trả thêm phí khi kích hoạt tính năng thực thi mã từ Gemini API. Bạn sẽ được tính phí theo mức giá hiện tại của mã thông báo đầu vào và đầu ra dựa trên mô hình Gemini mà bạn đang sử dụng.

Dưới đây là một số điều khác bạn cần biết về việc tính phí cho việc thực thi mã:

  • Bạn chỉ bị tính phí một lần cho các mã thông báo đầu vào mà bạn truyền vào mô hình và bạn sẽ bị tính phí cho các mã thông báo đầu ra cuối cùng mà mô hình trả về cho bạn.
  • Các mã thông báo đại diện cho mã được tạo được tính là mã thông báo đầu ra. Mã được tạo có thể bao gồm văn bản và đầu ra đa phương thức như hình ảnh.
  • Kết quả thực thi mã cũng được tính là mã thông báo đầu ra.

Mô hình thanh toán được thể hiện trong sơ đồ sau:

mô hình thanh toán theo lượt thực thi mã

  • Bạn sẽ được tính phí theo tỷ lệ hiện tại của mã thông báo đầu vào và đầu ra dựa trên mô hình Gemini mà bạn đang sử dụng.
  • Nếu Gemini sử dụng tính năng thực thi mã khi tạo câu trả lời, thì câu lệnh ban đầu, mã được tạo và kết quả của mã được thực thi sẽ được gắn nhãn là mã thông báo trung gian và được tính phí là mã thông báo đầu vào.
  • Sau đó, Gemini sẽ tạo một bản tóm tắt và trả về mã đã tạo, kết quả của mã đã thực thi và bản tóm tắt cuối cùng. Các lượt truy cập này được tính phí dưới dạng mã thông báo đầu ra.
  • API Gemini bao gồm số lượng mã thông báo trung gian trong phản hồi API, vì vậy, bạn sẽ biết lý do bạn nhận được mã thông báo đầu vào bổ sung ngoài lời nhắc ban đầu.

Các điểm hạn chế

  • Mô hình chỉ có thể tạo và thực thi mã. Phương thức này không thể trả về các cấu phần phần mềm khác như tệp phương tiện.
  • Trong một số trường hợp, việc bật tính năng thực thi mã có thể dẫn đến sự hồi quy trong các khu vực khác của đầu ra mô hình (ví dụ: viết một câu chuyện).
  • Có một số khác biệt về khả năng sử dụng tính năng thực thi mã thành công của các mô hình.

Thư viện được hỗ trợ

Môi trường thực thi mã bao gồm các thư viện sau:

  • attrs
  • cờ vua
  • contourpy
  • fpdf
  • geopandas
  • imageio
  • jinja2
  • joblib
  • jsonschema
  • jsonschema-specifications
  • lxml
  • matplotlib
  • mpmath
  • numpy
  • opencv-python
  • openpyxl
  • đóng gói ứng dụng
  • gấu trúc
  • cái gối
  • protobuf
  • pylatex
  • pyparsing
  • PyPDF2
  • python-dateutil
  • python-docx
  • python-pptx
  • reportlab
  • scikit-learn
  • scipy
  • seaborn
  • sáu
  • striprtf
  • sympy
  • lập bảng
  • tensorflow
  • toolz
  • xlrd

Bạn không thể cài đặt thư viện của riêng mình.

Bước tiếp theo