代码执行

Gemini API 提供了一个代码执行工具,可让模型生成和运行 Python 代码。然后,模型可以根据代码执行结果进行迭代学习,直到获得最终输出。您可以使用代码执行功能来构建可从基于代码的推理中受益的应用。例如,您可以使用代码执行功能来求解方程式或处理文本。您还可以使用代码执行环境中包含的来执行更专业的任务。

Gemini 只能执行 Python 代码。您仍然可以要求 Gemini 生成其他语言的代码,但模型无法使用代码执行工具运行该代码。

启用代码执行

如需启用代码执行,请在模型上配置代码执行工具。这样,模型就可以生成和运行代码。

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

输出可能如下所示,已调整格式以便于阅读:

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:可执行代码的结果

这些部分的命名惯例因编程语言而异。

在对话中使用代码执行

您还可以在对话中使用代码执行。

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

输入/输出 (I/O)

Gemini 2.0 Flash 开始,代码执行支持文件输入和图表输出。借助这些输入和输出功能,您可以上传 CSV 和文本文件、询问文件相关问题,并在回答中生成 Matplotlib 图表。输出文件会作为内嵌图片返回在响应中。

I/O 价格

使用代码执行 I/O 时,您需要为输入令牌和输出令牌支付费用:

输入令牌

  • 用户提示

输出令牌

  • 模型生成的代码
  • 代码环境中的代码执行输出
  • 模型生成的摘���

I/O 详情

使用代码执行 I/O 时,请注意以下技术细节:

  • 代码环境的运行时长上限为 30 秒。
  • 如果代码环境生成错误,模型可能会决定重新生成代码输出。最多可以重试 5 次。
  • 文件输入大小上限受模型令牌窗口的限制。在 AI Studio 中,使用 Gemini Flash 2.0 时,输入文件大小上限为 100 万个令牌(对于支持的输入类型的文本文件,大约为 2MB)。如果您上传的文件过大,AI Studio 将不允许您发送。
  • 代码执行最适合与文本和 CSV 文件搭配使用。
  • 输入文件可以以 part.inlineDatapart.fileData 的形式传递(通过 Files API 上传),输出文件始终以 part.inlineData 的形式返回。
单轮 双向(Multimodal Live API)
支持的模型 所有 Gemini 2.0 型号 仅限 Flash 实验性模型
支持的文件输入类型 .png、.jpeg、.csv、.xml、.cpp、.java、.py、.js、.ts .png、.jpeg、.csv、.xml、.cpp、.java、.py、.js、.ts
支持的绘图库 Matplotlib Matplotlib
多工具使用

结算

通过 Gemini API 启用代码执行不会产生额外的费用。系统会根据您使用的 Gemini 模型,按当前的输入和输出令牌费率向您收费。

以下是关于代码执行结算的一些其他注意事项:

  • 您只需为您传递给模型的输入 token 支付一次费用,并需要为模型返回给您的最终输出 token 支付费用。
  • 表示生成的代码的令牌会计为输出令牌。生成的代码可以包含文本和多模态输出(例如图片)。
  • 代码执行结果也会计为输出令牌。

结算模型如下图所示:

代码执行结算模型

  • 系统会根据您使用的 Gemini 模型,按当前的输入和输出令牌费率向您收费。
  • 如果 Gemini 在生成响应时使用代码执行,���原始提示、生成的代码以及执行的代码的结果会被标记为中间令牌,并按输入令牌计费。
  • 然后,Gemini 会生成摘要,并返回生成的代码、执行的代码的结果和最终摘要。这些数据按输出令牌计费。
  • Gemini API 在 API 响应中包含中间 token 数,因此您可以了解为何会收到除初始提示之外的其他输入 token。

限制

  • 模型只能生成和执行代码。它无法返回其他制品,例如媒体文件。
  • 在某些情况下,启用代码执行可能会导致模型输出的其他方面(例如,撰写故事)出现回归问题。
  • 不同模型成功使用代码执行功能的能力有所不同。

受支持的库

代码执行环境包含以下库:

  • attrs
  • 国际象棋
  • contourpy
  • fpdf
  • geopandas
  • imageio
  • jinja2
  • joblib
  • jsonschema
  • jsonschema-specifications
  • lxml
  • matplotlib
  • mpmath
  • numpy
  • opencv-python
  • openpyxl
  • 打包
  • pandas
  • pillow
  • protobuf
  • pylatex
  • pyparsing
  • PyPDF2
  • python-dateutil
  • python-docx
  • python-pptx
  • reportlab
  • scikit-learn
  • scipy
  • seaborn
  • six
  • striprtf
  • sympy
  • 编制表格
  • tensorflow
  • toolz
  • xlrd

您无法安装自己的库。

后续步骤