代码执行

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.5-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({});

let response = await ai.models.generateContent({
  model: "gemini-2.5-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, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

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

    result, _ := client.Models.GenerateContent(
        ctx,
        "gemini-2.5-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.5-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_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.5-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({});

const chat = ai.chats.create({
  model: "gemini-2.5-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, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

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

    chat, _ := client.Chats.Create(
        ctx,
        "gemini-2.5-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.5-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_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 和 2.5 型号 仅限 Flash 实验性模型
支持的文件输入类型 .png、.jpeg、.csv、.xml、.cpp、.java、.py、.js、.ts .png、.jpeg、.csv、.xml、.cpp、.java、.py、.js、.ts
支持的绘图库 Matplotlib、seaborn Matplotlib、seaborn
多工具使用 是(仅限代码执行 + 接地)

结算

通过 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

您无法安装自己的库。

后续步骤