Как использовать встроенные инструменты и функцию вызова функций

Gemini позволяет сочетать встроенные инструменты, такие как google_search, и вызов функций (также известный как персонализированные инструменты) в рамках одного взаимодействия, сохраняя и предоставляя историю вызовов инструментов. Встроенные и пользовательские комбинации инструментов позволяют создавать сложные рабочие процессы, в которых, например, модель может получать актуальные данные из интернета, прежде чем вызывать определенную бизнес-логику.

Вот пример, в котором сочетаются встроенные и специальные инструменты с использованием разметки google_search и специальной функции getWeather:

Python

# This will only work for SDK newer than 2.0.0
from google import genai

client = genai.Client()

getWeather = {
    "type": "function",
    "name": "getWeather",
    "description": "Gets the weather for a requested city.",
    "parameters": {
        "type": "object",
        "properties": {
            "city": {
                "type": "string",
                "description": "The city and state, e.g. Utqiaġvik, Alaska",
            },
        },
        "required": ["city"],
    },
}

# The Interactions API manages context automatically across tool calls.
# The model will first use Google Search, then call getWeather.
interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input="What is the northernmost city in the United States? What's the weather like there today?",
    tools=[
        {"type": "google_search"},
        getWeather,
    ],
)

# Process steps: the interaction contains search results and a function call
for step in interaction.steps:
    if step.type == "function_call":
        print(f"Function call: {step.name} with args: {step.arguments}")
        # In a real application, you would execute the function here
        # and provide the result back to the model.

JavaScript

// This will only work for SDK newer than 2.0.0
import { GoogleGenAI } from '@google/genai';

const client = new GoogleGenAI({});

const getWeather = {
    type: "function",
    name: "getWeather",
    description: "Get the weather in a given location",
    parameters: {
        type: "object",
        properties: {
            location: {
                type: "string",
                description: "The city and state, e.g. San Francisco, CA"
            }
        },
        required: ["location"]
    }
};

// The Interactions API manages context automatically across tool calls.
// The model will first use Google Search, then call getWeather.
const interaction = await client.interactions.create({
    model: "gemini-3.8-flash",
    input: "What is the northernmost city in the United States? What's the weather like there today?",
    tools: [
        { type: "google_search" },
        getWeather,
    ],
});

// Process steps: the interaction contains search results and a function call
for (const step of interaction.steps) {
    if (step.type === "function_call") {
        console.log(`Function call: ${step.name} with args: ${JSON.stringify(step.arguments)}`);
        // In a real application, you would execute the function here
        // and provide the result back to the model.
    }
}

Java

import com.google.genai.Client;
import com.google.genai.gaos.models.interactions.CreateModelInteraction;
import com.google.genai.gaos.models.interactions.Function;
import com.google.genai.gaos.models.interactions.GoogleSearch;
import com.google.genai.gaos.models.interactions.Interaction;
import com.google.genai.gaos.models.interactions.InteractionsInput;
import com.google.genai.gaos.models.interactions.Model;
import com.google.genai.gaos.models.operations.CreateInteractionRequestBody;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

Client client = new Client();

Map<String, Object> parameters = new HashMap<>();
parameters.put("type", "object");

Function customFunc =
    Function.builder()
        .name("get_user_location")
        .description("Retrieves user current location.")
        .parameters(parameters)
        .build();

CreateModelInteraction params =
    CreateModelInteraction.builder()
        .model(Model.of("gemini-3.8-flash"))
        .input(InteractionsInput.of("What is the weather like where I am right now?"))
        .tools(Arrays.asList(customFunc, new GoogleSearch()))
        .build();

Interaction interaction =
    client.interactions.create(CreateInteractionRequestBody.of(params)).interaction().get();

System.out.println(interaction.outputText().orElse(""));

Проложить маршрут

package main

import (
    "context"
    "fmt"
    "log"

    "google.golang.org/genai"
    "google.golang.org/genai/interactions/models/interactions"
    "google.golang.org/genai/interactions/models/operations"
)

func main() {
    ctx := context.Background()
    client, err := genai.NewClient(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }

    customFunc := interactions.NewTool(interactions.Function{
        Name:        genai.Ptr("get_user_location"),
        Description: genai.Ptr("Retrieves user current location."),
        Parameters: map[string]any{
            "type": "object",
        },
    })

    res, err := client.Interactions.Create(ctx, operations.CreateInteractionRequest{
        Body: operations.NewCreateInteractionRequestBody(interactions.CreateModelInteraction{
            Model: interactions.Model("gemini-3.8-flash"),
            Input: interactions.NewInteractionsInput("What is the weather like where I am right now?"),
            Tools: []interactions.Tool{
                customFunc,
                interactions.NewTool(interactions.GoogleSearch{}),
            },
        }),
    })
    if err != nil {
        log.Fatal(err)
    }
    if res.Interaction.OutputText != nil {
        fmt.Println(*res.Interaction.OutputText)
    }
}

REST

# Specifies the API revision to avoid breaking changes when they become default
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
  "model": "gemini-3.8-flash",
  "input": "What is the northernmost city in the United States? What'\''s the weather like there today?",
  "tools": [
    { "type": "google_search" },
    {
      "type": "function",
      "name": "getWeather",
      "description": "Get the weather in a given location",
      "parameters": {
          "type": "object",
          "properties": {
              "location": {
                  "type": "string",
                  "description": "The city and state, e.g. San Francisco, CA"
              }
          },
          "required": ["location"]
      }
    }
  ]
}'

Принцип работы

Модели Gemini 3 используют циркуляцию контекста инструментов, чтобы поддерживать комбинации встроенных и пользовательских инструментов. Передача контекста позволяет сохранять и предоставлять контекст встроенных инструментов, а также делиться им со специальными инструментами в рамках одного взаимодействия.

Включить комбинацию инструментов

  • Чтобы активировать комбинированное поведение, включите function_declarations вместе со встроенными инструментами, которые вы хотите использовать.

Возврат товаров через API

В ответе на взаимодействие API возвращает отдельные шаги для вызовов встроенных инструментов и функций (пользовательских инструментов):

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

Ключевые поля в возвращаемых шагах

Некоторые поля в возвращаемых шагах имеют решающее значение для поддержания контекста инструмента и включения комбинаций инструментов:

  • id: обнаружено на шагах function_call и function_response. Уникальный идентификатор, который сопоставляет вызов с ответом.
  • signature: встречается на шагах thought, а также на всех шагах вызова инструмента (например, function_call) и результата (например, function_response) для моделей Gemini 3 и более новых. Зашифрованный контекст позволяет передавать контекст инструмента между взаимодействиями.

Управление этими полями

  • Режим с сохранением состояния (рекомендуется). При использовании previous_interaction_id сервер автоматически обрабатывает поля id и signature.
  • Режим без сохранения состояния. При управлении историей разговоров вручную необходимо передавать в модель поля id и signature в последующих запросах, чтобы подтвердить подлинность и сохранить контекст. Официальные SDK обрабатывают это автоматически, если вы передаете полный объект ответа в историю.

Данные, относящиеся к определенному инструменту

Некоторые встроенные инструменты возвращают видимые пользователю аргументы данных, относящиеся к определенному типу инструмента.

Инструмент Аргументы вызова инструмента, видимые пользователю (если есть) Ответ инструмента, видимый пользователю (если есть)
google_search queries search_suggestions
google_maps queries places
google_maps_widget_context_token
url_context urls
URL, которые будут просмотрены
status: статус сканирования
retrieved_url: количество просканированных URL
file_search Нет Нет

Токены и цены

Обратите внимание, что части вызовов встроенных инструментов в запросах учитываются в prompt_token_count. Поскольку промежуточные шаги теперь видны и возвращаются вам, они являются частью истории чата. Это относится только к запросам, но не к ответам.

Исключение составляет инструмент Google Поиска. В Google Поиске уже применяется собственная модель ценообразования на уровне запроса, поэтому токены не оплачиваются дважды (см. страницу Цены).

Подробнее о токенах…

Ограничения

  • Если включена передача контекста инструмента, по умолчанию используется режим validated (режим auto не поддерживается).
  • Встроенные инструменты, такие как google_search, используют данные о местоположении и текущем времени. Если в system_instruction или function_declaration.description указаны несовпадающие сведения о местоположении и времени, функция комбинирования инструментов может работать некорректно.

Поддерживаемые инструменты

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

Инструмент Сторона исполнения Поддержка передачи контекста
Google Поиск Сторона сервера Поддерживается
Google Карты Сторона сервера Поддерживается
URL-контекст Сторона сервера Поддерживается
Поиск файлов Сторона сервера Поддерживается
Выполнение кода Сторона сервера Поддерживается (встроенная, использует шаги code_execution и code_execution_result)
Использование компьютера Сторона клиента Поддерживается (встроенная, использует шаги function_call и function_response)
Пользовательские функции Сторона клиента Поддерживается (встроенная, использует шаги function_call и function_response)

Дальнейшие действия