Łączenie wbudowanych narzędzi i wywoływania funkcji

Gemini umożliwia łączenie wbudowanych narzędzi, takich jak google_search, i wywoływanie funkcji (znanych też jako narzędzia niestandardowe) w ramach jednej interakcji przez zachowywanie i udostępnianie historii kontekstu wywołań narzędzi. Wbudowane i niestandardowe kombinacje narzędzi umożliwiają tworzenie złożonych przepływów pracy opartych na agentach, w których np. model może opierać się na danych internetowych w czasie rzeczywistym przed wywołaniem konkretnej logiki biznesowej.

Oto przykład, który umożliwia kombinacje wbudowanych i niestandardowych narzędzi z użyciem google_search i niestandardowej funkcji 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(""));

Go

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

Jak to działa

Modele Gemini 3 korzystają z obiegu kontekstu narzędzia, aby umożliwić wbudowane i niestandardowe kombinacje narzędzi. Obieg kontekstu narzędzia umożliwia zachowanie i udostępnianie kontekstu wbudowanych narzędzi oraz udostępnianie go narzędziom niestandardowym w ramach tej samej interakcji.

Włączanie kombinacji narzędzi

  • Aby wywołać zachowanie kombinacji, dodaj function_declarations wraz z wbudowanymi narzędziami, których chcesz użyć.

Instrukcje dotyczące zwrotów w przypadku interfejsu API

W odpowiedzi na interakcję interfejs API zwraca osobne kroki dla wywołań wbudowanych narzędzi i wywołań funkcji (narzędzi niestandardowych):

  • Wbudowane kroki narzędzia: interfejs API zarządza nimi automatycznie, zachowując kontekst między kolejnymi turami.
  • Kroki wywołania funkcji: interfejs API zwraca function_call kroków dla Twoich funkcji niestandardowych. Wykonujesz funkcję i zwracasz wynik.

Krytyczne pola w zwróconych krokach

Niektóre pola w zwracanych krokach mają kluczowe znaczenie dla zachowania kontekstu narzędzia i umożliwienia łączenia narzędzi:

  • id: znajdziesz je w krokach function_call i function_response. Unikalny identyfikator, który mapuje wywołanie na odpowiedź.
  • signature: występuje w krokach thought, a także we wszystkich krokach wywołania narzędzia (np. function_call) i wyniku (np. function_response) w przypadku modeli Gemini 3+. Ten zaszyfrowany kontekst umożliwia przekazywanie kontekstu narzędzia między interakcjami.

Zarządzanie tymi polami:

  • Tryb stanowy (zalecany): gdy używasz previous_interaction_id, serwer automatycznie obsługuje pola id i signature.
  • Tryb bezstanowy: jeśli zarządzasz historią rozmów ręcznie, musisz w kolejnych żądaniach przekazywać do modelu pola id i signature, aby potwierdzić autentyczność i zachować kontekst. Oficjalne pakiety SDK obsługują to automatycznie, jeśli przekazujesz pełny obiekt odpowiedzi z powrotem do historii.

Dane dotyczące konkretnego narzędzia

Niektóre wbudowane narzędzia zwracają argumenty danych widoczne dla użytkownika, które są specyficzne dla typu narzędzia.

Narzędzie Argumenty wywołania narzędzia widoczne dla użytkownika (jeśli występują) Odpowiedź narzędzia widoczna dla użytkownika (jeśli występuje)
google_search queries search_suggestions
google_maps queries places
google_maps_widget_context_token
url_context urls
Adresy URL do przeglądania
status: Stan przeglądania
retrieved_url: Przeglądane adresy URL
file_search Brak Brak

Tokeny i ceny

Pamiętaj, że wbudowane części wywołania narzędzia w żądaniach są wliczane do limitu prompt_token_count. Ponieważ te pośrednie kroki narzędzia są teraz widoczne i zwracane, stanowią część historii rozmowy. Dotyczy to tylko żądań, a nie odpowiedzi.

Wyjątkiem od tej reguły jest narzędzie wyszukiwarki Google. Wyszukiwarka Google stosuje już własny model cenowy na poziomie zapytania, więc tokeny nie są naliczane podwójnie (więcej informacji znajdziesz na stronie Ceny).

Więcej informacji znajdziesz na stronie Tokeny.

Ograniczenia

  • Domyślnie włączaj tryb validated (tryb auto nie jest obsługiwany), gdy włączone jest przekazywanie kontekstu narzędzia.
  • Wbudowane narzędzia, takie jak google_search, korzystają z informacji o lokalizacji i bieżącym czasie, więc jeśli system_instruction lub function_declaration.description mają sprzeczne informacje o lokalizacji i czasie, funkcja łączenia narzędzi może nie działać prawidłowo.

Obsługiwane narzędzia

W przypadku narzędzi po stronie serwera (wbudowanych) obowiązuje standardowe przekazywanie kontekstu narzędzia. Wykonywanie kodu to również narzędzie po stronie serwera, ale ma własne wbudowane rozwiązanie do przekazywania kontekstu. Korzystanie z komputera i wywoływanie funkcji to narzędzia po stronie klienta, które mają też wbudowane rozwiązania do przekazywania kontekstu.

Narzędzie Strona wykonania Obsługa przekazywania kontekstu
Wyszukiwarka Google Po stronie serwera Obsługiwane
Mapy Google Po stronie serwera Obsługiwane
Kontekst adresu URL Po stronie serwera Obsługiwane
Wyszukiwanie plików Po stronie serwera Obsługiwane
Wykonywanie kodu Po stronie serwera Obsługiwane (wbudowane, korzysta z działań code_execution i code_execution_result)
Korzystanie z komputera Po stronie klienta Obsługiwane (wbudowane, korzysta z działań function_call i function_response)
Funkcje niestandardowe Po stronie klienta Obsługiwane (wbudowane, korzysta z działań function_call i function_response)

Co dalej?