Выполнение кода

API Gemini предоставляет инструмент выполнения кода, который позволяет модели генерировать и запускать код Python. Затем модель может итеративно обучаться на основе результатов выполнения кода, пока не достигнет окончательного результата. Вы можете использовать выполнение кода для создания приложений, которые выигрывают от рассуждений на основе кода. Например, вы можете использовать выполнение кода для решения уравнений или обработки текста. Вы также можете использовать библиотеки , включенные в среду выполнения кода, для выполнения более специализированных задач.

Gemini может выполнять код только на Python. Вы по-прежнему можете попросить Gemini сгенерировать код на другом языке, но модель не сможет использовать инструмент выполнения кода для его запуска.

Включить выполнение кода

Чтобы включить выполнение кода, настройте инструмент выполнения кода на модели. Это позволяет модели генерировать и запускать код.

Питон

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);
  }
});

Идти

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())
}

ОТДЫХ

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."
        }
    },
}'

Вывод может выглядеть примерно так: он отформатирован для удобства чтения:

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.

Этот вывод объединяет несколько частей контента, которые модель возвращает при выполнении кода:

  • text : встроенный текст, сгенерированный моделью.
  • executableCode : код, сгенерированный моделью, предназначенный для выполнения.
  • codeExecutionResult : Результат исполняемого кода.

Соглашения об именах этих частей различаются в зависимости от языка программирования.

Используйте выполнение кода в чате

Вы также можете использовать выполнение кода в чате.

Питон

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);

Идти

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())
}

ОТДЫХ

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."
            }]
        }
    ]
}'

Ввод/вывод (В/В)

Начиная с Gemini 2.0 Flash , выполнение кода поддерживает ввод файлов и вывод графиков. Используя эти возможности ввода и вывода, вы можете загружать CSV и текстовые файлы, задавать вопросы о файлах и создавать графики Matplotlib как часть ответа. Выходные файлы возвращаются в ответе как встроенные изображения.

Цены ввода-вывода

При использовании ввода-вывода для выполнения кода с вас взимается плата за входные и выходные токены:

Входные токены:

  • Подсказка пользователя

Выходные токены:

  • Код, сгенерированный моделью
  • Вывод выполнения кода в среде кода
  • Сводная информация, созданная моделью

Детали ввода/вывода

Когда вы работаете с вводом-выводом выполнения кода, помните о следующих технических деталях:

  • Максимальное время выполнения среды кода — 30 секунд.
  • Если среда кода генерирует ошибку, модель может решить повторно сгенерировать выходные данные кода. Это может произойти до 5 раз.
  • Максимальный размер входного файла ограничен окном токена модели. В AI Studio с использованием Gemini Flash 2.0 максимальный размер входного файла составляет 1 миллион токенов (примерно 2 МБ для текстовых файлов поддерживаемых типов ввода). Если вы загрузите слишком большой файл, AI Studio не позволит вам его отправить.
  • Выполнение кода лучше всего работает с текстовыми файлами и файлами CSV.
  • Входной файл можно передать в part.inlineData или part.fileData (загруженный через Files API ), а выходной файл всегда возвращается как part.inlineData .
Одиночный поворот Двунаправленный (мультимодальный Live API)
Поддерживаемые модели Все модели Близнецов 2.0 Только экспериментальные модели Flash
Поддерживаемые типы ввода файлов .png, .jpeg, .csv, .xml, .cpp, .java, .py, .js, .ts .png, .jpeg, .csv, .xml, .cpp, .java, .py, .js, .ts
Поддерживаются библиотеки печати Матплотлиб Матплотлиб
Использование нескольких инструментов Нет Да

Биллинг

За включение выполнения кода из API Gemini не взимается дополнительная плата. Вам будет выставлен счет по текущей ставке входных и выходных токенов в зависимости от используемой вами модели Gemini.

Вот еще несколько вещей, которые нужно знать о выставлении счетов за выполнение кода:

  • Вам выставляется счет только один раз за входные токены, которые вы передаете модели, и вам выставляется счет за окончательные выходные токены, возвращенные вам моделью.
  • Токены, представляющие сгенерированный код, считаются выходными токенами. Сгенерированный код может включать в себя текст и мультимодальный вывод, например изображения.
  • Результаты выполнения кода также считаются выходными токенами.

Модель выставления счетов показана на следующей схеме:

модель биллинга выполнения кода

  • Вам выставляется счет по текущей ставке входных и выходных токенов в зависимости от используемой вами модели Gemini.
  • Если Gemini использует выполнение кода при формировании ответа, исходное приглашение, сгенерированный код и результат выполненного кода помечаются как промежуточные токены и оплачиваются как входные токены .
  • Затем Gemini генерирует сводку и возвращает сгенерированный код, результат выполненного кода и окончательную сводку. Они оплачиваются как выходные токены .
  • API Gemini включает в ответ API промежуточное количество токенов, чтобы вы знали, почему вы получаете дополнительные входные токены помимо первоначального запроса.

Ограничения

  • Модель может только генерировать и выполнять код. Он не может возвращать другие артефакты, такие как медиафайлы.
  • В некоторых случаях включение выполнения кода может привести к регрессии в других областях вывода модели (например, при написании истории).
  • Существуют некоторые различия в способности разных моделей успешно использовать выполнение кода.

Поддерживаемые библиотеки

Среда выполнения кода включает в себя следующие библиотеки:

  • атрибуты
  • шахматы
  • контурный
  • fpdf
  • геопанды
  • имиджио
  • Джинджа2
  • библиотека заданий
  • jsonschema
  • jsonschema-спецификации
  • lxml
  • matplotlib
  • мпматематика
  • бестолковый
  • opencv-питон
  • openpyxl
  • упаковка
  • панды
  • подушка
  • протобуф
  • пилатекс
  • пипарсинг
  • PyPDF2
  • python-dateutil
  • python-docx
  • python-pptx
  • отчетная лаборатория
  • scikit-learn
  • острый
  • рожденный в море
  • шесть
  • стрипртф
  • симпатия
  • сводить в таблицы
  • тензорный поток
  • инструменты
  • кслрд

Вы не можете устанавливать свои собственные библиотеки.

Что дальше