Wywoływanie funkcji za pomocą interfejsu Gemini API

Wywoływanie funkcji umożliwia łączenie modeli z zewnętrznymi narzędziami i interfejsami API. Zamiast generowania odpowiedzi tekstowych model rozumie, kiedy wywołać konkretne funkcje, i przekazuje niezbędne parametry do wykonania działań w świecie rzeczywistym. Dzięki temu model może pełnić rolę łącznika między językiem naturalnym a działaniami i danymi w świecie rzeczywistym. Wywoływanie funkcji ma 3 główne zastosowania:

  • Rozszerzanie wiedzy: dostęp do informacji z zewnętrznych źródeł, takich jak bazy danych, interfejsy API i bazy wiedzy.
  • Rozszerzanie możliwości: korzystanie z zewnętrznych narzędzi do wykonywania obliczeń i rozszerzania ograniczeń modelu, np. korzystania z kalkulatora lub tworzenia wykresów.
  • Wykonywanie działań: interakcja z systemami zewnętrznymi za pomocą interfejsów API, np. planowanie spotkań, tworzenie faktur, wysyłanie e-maili czy sterowanie urządzeniami inteligentnego domu.

Jak działa wywoływanie funkcji

Wywoływanie funkcji – omówienie

Wywoływanie funkcji wymaga uporządkowanej interakcji między aplikacją, modelem i funkcjami zewnętrznymi. Oto opis tego procesu:

  1. Zdefiniuj deklarację funkcji: zdefiniuj deklarację funkcji w kodzie aplikacji. Deklaracje funkcji opisują nazwę funkcji, parametry i jej przeznaczenie w modelu.
  2. Wywołaj LLM z deklaracjami funkcji: wyślij do modelu prompt użytkownika wraz z deklaracjami funkcji. Analizuje żądanie i określa, czy wywołanie funkcji byłoby przydatne. Jeśli tak, zwraca on ustrukturyzowany obiekt JSON.
  3. Wykonywanie kodu funkcji (Twoja odpowiedzialność): model niesam nie wykonuje funkcji. Twoja aplikacja musi przetworzyć odpowiedź i sprawdzić, czy zawiera ona wywołanie funkcji.
    • Tak: wyodrębnij nazwę i argumenty funkcji oraz wykonaj odpowiednią funkcję w aplikacji.
    • Nie: model podał bezpośrednią odpowiedź tekstową na prompt (ten przepływ jest mniej podkreślony w tym przykładzie, ale jest możliwym wynikiem).
  4. Tworzenie odpowiedzi przyjaznych dla użytkownika: jeśli funkcja została wykonana, przechwyć jej wynik i prześlij go z powrotem do modelu w kolejnych turach rozmowy. Na podstawie wyniku wygeneruje ostateczną, przyjazną dla użytkownika odpowiedź, która zawiera informacje z wywołania funkcji.

Ten proces można powtarzać przez wiele tur, co umożliwia tworzenie złożonych interakcji i przepływów pracy. Model obsługuje też wywoływanie wielu funkcji w jednym wystąpieniu (wywoływanie funkcji równolegle) i w kolejności (wywoływanie funkcji kompozycyjnie).

Krok 1. Określ deklarację funkcji

Zdefiniuj funkcję i jej deklarację w kodzie aplikacji, która umożliwia użytkownikom ustawianie wartości światła i wysyłanie żądań do interfejsu API. Ta funkcja może wywoływać usługi zewnętrzne lub interfejsy API.

Python

from google.genai import types

# Define a function that the model can call to control smart lights
set_light_values_declaration = {
    "name": "set_light_values",
    "description": "Sets the brightness and color temperature of a light.",
    "parameters": {
        "type": "object",
        "properties": {
            "brightness": {
                "type": "integer",
                "description": "Light level from 0 to 100. Zero is off and 100 is full brightness",
            },
            "color_temp": {
                "type": "string",
                "enum": ["daylight", "cool", "warm"],
                "description": "Color temperature of the light fixture, which can be `daylight`, `cool` or `warm`.",
            },
        },
        "required": ["brightness", "color_temp"],
    },
}

# This is the actual function that would be called based on the model's suggestion
def set_light_values(brightness: int, color_temp: str) -> dict[str, int | str]:
    """Set the brightness and color temperature of a room light. (mock API).

    Args:
        brightness: Light level from 0 to 100. Zero is off and 100 is full brightness
        color_temp: Color temperature of the light fixture, which can be `daylight`, `cool` or `warm`.

    Returns:
        A dictionary containing the set brightness and color temperature.
    """
    return {"brightness": brightness, "colorTemperature": color_temp}

JavaScript

import { Type } from '@google/genai';

// Define a function that the model can call to control smart lights
const setLightValuesFunctionDeclaration = {
  name: 'set_light_values',
  description: 'Sets the brightness and color temperature of a light.',
  parameters: {
    type: Type.OBJECT,
    properties: {
      brightness: {
        type: Type.NUMBER,
        description: 'Light level from 0 to 100. Zero is off and 100 is full brightness',
      },
      color_temp: {
        type: Type.STRING,
        enum: ['daylight', 'cool', 'warm'],
        description: 'Color temperature of the light fixture, which can be `daylight`, `cool` or `warm`.',
      },
    },
    required: ['brightness', 'color_temp'],
  },
};

/**

*   Set the brightness and color temperature of a room light. (mock API)
*   @param {number} brightness - Light level from 0 to 100. Zero is off and 100 is full brightness
*   @param {string} color_temp - Color temperature of the light fixture, which can be `daylight`, `cool` or `warm`.
*   @return {Object} A dictionary containing the set brightness and color temperature.
*/
function setLightValues(brightness, color_temp) {
  return {
    brightness: brightness,
    colorTemperature: color_temp
  };
}

Krok 2. Wywołuj model za pomocą deklaracji funkcji

Po zdefiniowaniu deklaracji funkcji możesz poprosić model o jej użycie. Analizuje prompt i deklaracje funkcji, a następnie odpowiada bezpośrednio lub wywołuje funkcję. Jeśli wywołana zostanie funkcja, obiekt odpowiedzi będzie zawierać sugestię wywołania funkcji.

Python

from google import genai

# Generation Config with Function Declaration
tools = types.Tool(function_declarations=[set_light_values_declaration])
config = types.GenerateContentConfig(tools=[tools])

# Configure the client
client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))

# Define user prompt
contents = [
    types.Content(
        role="user", parts=[types.Part(text="Turn the lights down to a romantic level")]
    )
]

# Send request with function declarations
response = client.models.generate_content(
    model="gemini-2.0-flash", config=config, contents=contents
)

print(response.candidates[0].content.parts[0].function_call)

JavaScript

import { GoogleGenAI } from '@google/genai';

// Generation Config with Function Declaration
const config = {
  tools: [{
    functionDeclarations: [setLightValuesFunctionDeclaration]
  }]
};

// Configure the client
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });

// Define user prompt
const contents = [
  {
    role: 'user',
    parts: [{ text: 'Turn the lights down to a romantic level' }]
  }
];

// Send request with function declarations
const response = await ai.models.generateContent({
  model: 'gemini-2.0-flash',
  contents: contents,
  config: config
});

console.log(response.functionCalls[0]);

Następnie model zwraca obiekt functionCall w schemacie zgodnym z OpenAPI, który określa, jak wywołać co najmniej jedną z deklarowanych funkcji, aby odpowiedzieć na pytanie użytkownika.

Python

id=None args={'color_temp': 'warm', 'brightness': 25} name='set_light_values'

JavaScript

{
  name: 'set_light_values',
  args: { brightness: 25, color_temp: 'warm' }
}

Krok 3. Wykonaj kod funkcji set_light_values

Wyodrębnij szczegóły wywołania funkcji z odpowiedzi modelu, przeanalizuj argumenty i wykonaj funkcję set_light_values w naszym kodzie.

Python

# Extract tool call details, it may not be in the first part.
tool_call = response.candidates[0].content.parts[0].function_call

if tool_call.name == "set_light_values":
    result = set_light_values(**tool_call.args)
    print(f"Function execution result: {result}")

JavaScript

// Extract tool call details
const tool_call = response.functionCalls[0]

let result;
if (tool_call.name === 'set_light_values') {
  result = setLightValues(tool_call.args.brightness, tool_call.args.color_temp);
  console.log(`Function execution result: ${JSON.stringify(result)}`);
}

Krok 4. Utwórz przyjazną dla użytkownika odpowiedź z wynikiem funkcji i ponownie wywołaj model

Na koniec należy przesłać wynik wykonania funkcji z powrotem do modelu, aby mógł uwzględnić te informacje w ostatecznej odpowiedzi dla użytkownika.

Python

# Create a function response part
function_response_part = types.Part.from_function_response(
    name=tool_call.name,
    response={"result": result},
)

# Append function call and result of the function execution to contents
contents.append(response.candidates[0].content) # Append the content from the model's response.
contents.append(types.Content(role="user", parts=[function_response_part])) # Append the function response

final_response = client.models.generate_content(
    model="gemini-2.0-flash",
    config=config,
    contents=contents,
)

print(final_response.text)

JavaScript

// Create a function response part
const function_response_part = {
  name: tool_call.name,
  response: { result }
}

// Append function call and result of the function execution to contents
contents.push(response.candidates[0].content);
contents.push({ role: 'user', parts: [{ functionResponse: function_response_part }] });

// Get the final response from the model
const final_response = await ai.models.generateContent({
  model: 'gemini-2.0-flash',
  contents: contents,
  config: config
});

console.log(final_response.text);

To kończy proces wywoływania funkcji. Model użył funkcji set_light_values do wykonania działania związanego z żądaniem użytkownika.

Deklaracje funkcji

Gdy w promptach implementujesz wywoływanie funkcji, tworzysz obiekt tools, który zawiera co najmniej 1 element function declarations. Funkcje definiujesz za pomocą kodu JSON, a dokładnie wybranego podzbioru formatu OpenAPI schema. Jedna deklaracja funkcji może zawierać te parametry:

  • name (ciąg znaków): unikalna nazwa funkcji (get_weather_forecast, send_email). Używaj nazw opisowych bez spacji ani znaków specjalnych (użyj znaków podkreślenia lub wielkich liter).
  • description (string): wyraźne i szczegółowe wyjaśnienie przeznaczenia i możliwości funkcji. Jest to kluczowe, aby model wiedział, kiedy użyć funkcji. Bądź konkretny i w razie potrzeby podaj przykłady („znajduje kina na podstawie lokalizacji i opcjonalnie tytułu filmu, który jest obecnie wyświetlany w kinach”).
  • parameters (obiekt): definiuje parametry wejściowe, których oczekuje funkcja.
    • type (ciąg znaków): określa ogólny typ danych, np. object.
    • properties (obiekt): zawiera listę poszczególnych parametrów z tymi danymi:
      • type (ciąg znaków): typ danych parametru, np. string, integer, boolean, array.
      • description (ciąg znaków): opis przeznaczenia i formatu parametru. Podaj przykłady i ograniczenia („Miasto i stan, np. „San Francisco, CA” lub kod pocztowy, np. 95616).
      • enum (tabelka, opcjonalnie): jeśli wartości parametrów należą do stałego zbioru, użyj typu „enum”, aby podać dozwolone wartości zamiast opisywać je w opisie. Pomaga to zwiększyć dokładność („enum”: [„daylight”, „cool”, „warm”]).
    • required (tablica): tablica ciągów znaków zawierająca nazwy parametrów, które są wymagane do działania funkcji.

równoległe wywoływanie funkcji;

Oprócz wywołania funkcji w jednym obrocie możesz też wywołać wiele funkcji naraz. Wywoływanie funkcji równoległe umożliwia wykonywanie wielu funkcji jednocześnie i jest używane, gdy funkcje nie są od siebie zależne. Jest to przydatne w takich sytuacjach jak zbieranie danych z różnych niezależnych źródeł, np. pobieranie danych o klientach z różnych baz danych lub sprawdzanie poziomów zapasów w różnych magazynach czy wykonywanie wielu działań, np. przekształcanie mieszkania w dyskoteki.

Python

power_disco_ball = {
    "name": "power_disco_ball",
    "description": "Powers the spinning disco ball.",
    "parameters": {
        "type": "object",
        "properties": {
            "power": {
                "type": "boolean",
                "description": "Whether to turn the disco ball on or off.",
            }
        },
        "required": ["power"],
    },
}

start_music = {
    "name": "start_music",
    "description": "Play some music matching the specified parameters.",
    "parameters": {
        "type": "object",
        "properties": {
            "energetic": {
                "type": "boolean",
                "description": "Whether the music is energetic or not.",
            },
            "loud": {
                "type": "boolean",
                "description": "Whether the music is loud or not.",
            },
        },
        "required": ["energetic", "loud"],
    },
}

dim_lights = {
    "name": "dim_lights",
    "description": "Dim the lights.",
    "parameters": {
        "type": "object",
        "properties": {
            "brightness": {
                "type": "number",
                "description": "The brightness of the lights, 0.0 is off, 1.0 is full.",
            }
        },
        "required": ["brightness"],
    },
}

JavaScript

import { Type } from '@google/genai';

const powerDiscoBall = {
  name: 'power_disco_ball',
  description: 'Powers the spinning disco ball.',
  parameters: {
    type: Type.OBJECT,
    properties: {
      power: {
        type: Type.BOOLEAN,
        description: 'Whether to turn the disco ball on or off.'
      }
    },
    required: ['power']
  }
};

const startMusic = {
  name: 'start_music',
  description: 'Play some music matching the specified parameters.',
  parameters: {
    type: Type.OBJECT,
    properties: {
      energetic: {
        type: Type.BOOLEAN,
        description: 'Whether the music is energetic or not.'
      },
      loud: {
        type: Type.BOOLEAN,
        description: 'Whether the music is loud or not.'
      }
    },
    required: ['energetic', 'loud']
  }
};

const dimLights = {
  name: 'dim_lights',
  description: 'Dim the lights.',
  parameters: {
    type: Type.OBJECT,
    properties: {
      brightness: {
        type: Type.NUMBER,
        description: 'The brightness of the lights, 0.0 is off, 1.0 is full.'
      }
    },
    required: ['brightness']
  }
};

Wywołaj model za pomocą instrukcji, która może korzystać ze wszystkich określonych narzędzi. W tym przykładzie użyto elementu tool_config. Aby dowiedzieć się więcej, przeczytaj artykuł o konfigurowaniu wywoływania funkcji.

Python

from google import genai
from google.genai import types

# Set up function declarations
house_tools = [
    types.Tool(function_declarations=[power_disco_ball, start_music, dim_lights])
]

config = {
    "tools": house_tools,
    "automatic_function_calling": {"disable": True},
    # Force the model to call 'any' function, instead of chatting.
    "tool_config": {"function_calling_config": {"mode": "any"}},
}

# Configure the client
client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))

chat = client.chats.create(model="gemini-2.0-flash", config=config)
response = chat.send_message("Turn this place into a party!")

# Print out each of the function calls requested from this single call
print("Example 1: Forced function calling")
for fn in response.function_calls:
    args = ", ".join(f"{key}={val}" for key, val in fn.args.items())
    print(f"{fn.name}({args})")

JavaScript

import { GoogleGenAI } from '@google/genai';

// Set up function declarations
const houseFns = [powerDiscoBall, startMusic, dimLights];

const config = {
    tools: [{
        functionDeclarations: houseFns
    }],
    // Force the model to call 'any' function, instead of chatting.
    toolConfig: {
        functionCallingConfig: {
        mode: 'any'
        }
    }
};

// Configure the client
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });

// Create a chat session
const chat = ai.chats.create({
    model: 'gemini-2.0-flash',
    config: config
});
const response = await chat.sendMessage({message: 'Turn this place into a party!'});

// Print out each of the function calls requested from this single call
console.log("Example 1: Forced function calling");
for (const fn of response.functionCalls) {
    const args = Object.entries(fn.args)
        .map(([key, val]) => `${key}=${val}`)
        .join(', ');
    console.log(`${fn.name}(${args})`);
}

Każdy z wydrukowanych wyników odpowiada pojedynczemu wywołaniu funkcji, o które poprosił model. Aby wysłać wyniki, dołącz odpowiedzi w tej samej kolejności, w jakiej zostały przesłane żądania.

Pakiet Python SDK obsługuje funkcję automatycznego wywoływania funkcji, która konwertuje funkcję Pythona na deklaracje i zarządza cyklem wykonywania wywołania funkcji oraz odpowiedzi. Poniżej przedstawiamy przykład zastosowania w przypadku dyskoteki.

Python

from google import genai
from google.genai import types

# Actual implementation functions
def power_disco_ball_impl(power: bool) -> dict:
    """Powers the spinning disco ball.

    Args:
        power: Whether to turn the disco ball on or off.

    Returns:
        A status dictionary indicating the current state.
    """
    return {"status": f"Disco ball powered {'on' if power else 'off'}"}

def start_music_impl(energetic: bool, loud: bool) -> dict:
    """Play some music matching the specified parameters.

    Args:
        energetic: Whether the music is energetic or not.
        loud: Whether the music is loud or not.

    Returns:
        A dictionary containing the music settings.
    """
    music_type = "energetic" if energetic else "chill"
    volume = "loud" if loud else "quiet"
    return {"music_type": music_type, "volume": volume}

def dim_lights_impl(brightness: float) -> dict:
    """Dim the lights.

    Args:
        brightness: The brightness of the lights, 0.0 is off, 1.0 is full.

    Returns:
        A dictionary containing the new brightness setting.
    """
    return {"brightness": brightness}

config = {
    "tools": [power_disco_ball_impl, start_music_impl, dim_lights_impl],
}

chat = client.chats.create(model="gemini-2.0-flash", config=config)
response = chat.send_message("Do everything you need to this place into party!")

print("\nExample 2: Automatic function calling")
print(response.text)
# I've turned on the disco ball, started playing loud and energetic music, and dimmed the lights to 50% brightness. Let's get this party started!

Wywoływanie funkcji kompozytowej

Wywoływanie funkcji w sposób kompozytorski lub sekwencyjny umożliwia Gemini łączenie wielu wywołań funkcji w celu realizacji złożonego żądania. Na przykład, aby odpowiedzieć na pytanie „Podaj temperaturę w mojej bieżącej lokalizacji”, interfejs Gemini API może najpierw wywołać funkcję get_current_location(), a potem funkcję get_weather(), która przyjmuje lokalizację jako parametr.

Poniższy przykład pokazuje, jak zaimplementować wywoływanie funkcji kompozytowych za pomocą pakietu Python SDK i automatycznego wywoływania funkcji.

Python

W tym przykładzie użyto funkcji automatycznego wywoływania funkcji z pakietu Python SDK google-genai. Pakiet SDK automatycznie konwertuje funkcje Pythona na wymagany schemat, wykonuje wywołania funkcji, gdy model tego zażąda, i przesyła wyniki z powrotem do modelu w celu wykonania zadania.

import os
from google import genai
from google.genai import types

# Example Functions
def get_weather_forecast(location: str) -> dict:
    """Gets the current weather temperature for a given location."""
    print(f"Tool Call: get_weather_forecast(location={location})")
    # TODO: Make API call
    print("Tool Response: {'temperature': 25, 'unit': 'celsius'}")
    return {"temperature": 25, "unit": "celsius"}  # Dummy response

def set_thermostat_temperature(temperature: int) -> dict:
    """Sets the thermostat to a desired temperature."""
    print(f"Tool Call: set_thermostat_temperature(temperature={temperature})")
    # TODO: Interact with a thermostat API
    print("Tool Response: {'status': 'success'}")
    return {"status": "success"}

# Configure the client and model
client = genai.Client(
    api_key=os.getenv("GEMINI_API_KEY")
)  # Replace with your actual API key setup
config = types.GenerateContentConfig(
    tools=[get_weather_forecast, set_thermostat_temperature]
)

# Make the request
response = client.models.generate_content(
    model="gemini-2.0-flash",
    contents="If it's warmer than 20°C in London, set the thermostat to 20°C, otherwise set it to 18°C.",
    config=config,
)

# Print the final, user-facing response
print(response.text)

Oczekiwany wynik

Gdy uruchomisz kod, zobaczysz, jak pakiet SDK uruchamia wywołania funkcji. Model najpierw wywołuje funkcję get_weather_forecast, otrzymuje temperaturę, a następnie wywołuje funkcję set_thermostat_temperature z prawidłową wartością na podstawie logiki promptu.

Tool Call: get_weather_forecast(location=London)
Tool Response: {'temperature': 25, 'unit': 'celsius'}
Tool Call: set_thermostat_temperature(temperature=20)
Tool Response: {'status': 'success'}
OK. I've set the thermostat to 20°C.

JavaScript

Ten przykład pokazuje, jak za pomocą pakietu SDK JavaScript/TypeScript wywoływać funkcje kompozycyjne za pomocą ręcznej pętli wykonywania.

import { GoogleGenAI, Type } from "@google/genai";

// Configure the client
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });

// Example Functions
function get_weather_forecast({ location }) {
  console.log(`Tool Call: get_weather_forecast(location=${location})`);
  // TODO: Make API call
  console.log("Tool Response: {'temperature': 25, 'unit': 'celsius'}");
  return { temperature: 25, unit: "celsius" };
}

function set_thermostat_temperature({ temperature }) {
  console.log(
    `Tool Call: set_thermostat_temperature(temperature=${temperature})`,
  );
  // TODO: Make API call
  console.log("Tool Response: {'status': 'success'}");
  return { status: "success" };
}

const toolFunctions = {
  get_weather_forecast,
  set_thermostat_temperature,
};

const tools = [
  {
    functionDeclarations: [
      {
        name: "get_weather_forecast",
        description:
          "Gets the current weather temperature for a given location.",
        parameters: {
          type: Type.OBJECT,
          properties: {
            location: {
              type: Type.STRING,
            },
          },
          required: ["location"],
        },
      },
      {
        name: "set_thermostat_temperature",
        description: "Sets the thermostat to a desired temperature.",
        parameters: {
          type: Type.OBJECT,
          properties: {
            temperature: {
              type: Type.NUMBER,
            },
          },
          required: ["temperature"],
        },
      },
    ],
  },
];

// Prompt for the model
let contents = [
  {
    role: "user",
    parts: [
      {
        text: "If it's warmer than 20°C in London, set the thermostat to 20°C, otherwise set it to 18°C.",
      },
    ],
  },
];

// Loop until the model has no more function calls to make
while (true) {
  const result = await ai.models.generateContent({
    model: "gemini-2.0-flash",
    contents,
    config: { tools },
  });

  if (result.functionCalls && result.functionCalls.length > 0) {
    const functionCall = result.functionCalls[0];

    const { name, args } = functionCall;

    if (!toolFunctions[name]) {
      throw new Error(`Unknown function call: ${name}`);
    }

    // Call the function and get the response.
    const toolResponse = toolFunctions[name](args);

    const functionResponsePart = {
      name: functionCall.name,
      response: {
        result: toolResponse,
      },
    };

    // Send the function response back to the model.
    contents.push({
      role: "model",
      parts: [
        {
          functionCall: functionCall,
        },
      ],
    });
    contents.push({
      role: "user",
      parts: [
        {
          functionResponse: functionResponsePart,
        },
      ],
    });
  } else {
    // No more function calls, break the loop.
    console.log(result.text);
    break;
  }
}

Oczekiwany wynik

Gdy uruchomisz kod, zobaczysz, jak pakiet SDK uruchamia wywołania funkcji. Model najpierw wywołuje funkcję get_weather_forecast, otrzymuje temperaturę, a następnie wywołuje funkcję set_thermostat_temperature z odpowiednią wartością na podstawie logiki promptu.

Tool Call: get_weather_forecast(location=London)
Tool Response: {'temperature': 25, 'unit': 'celsius'}
Tool Call: set_thermostat_temperature(temperature=20)
Tool Response: {'status': 'success'}
OK. It's 25°C in London, so I've set the thermostat to 20°C.

Funkcja wywoływania kompozytowego to natywny element Live API. Oznacza to, że interfejs Live API może obsługiwać wywoływanie funkcji w sposób podobny do pakietu Python SDK.

Python

# Light control schemas
turn_on_the_lights_schema = {'name': 'turn_on_the_lights'}
turn_off_the_lights_schema = {'name': 'turn_off_the_lights'}

prompt = """
  Hey, can you write run some python code to turn on the lights, wait 10s and then turn off the lights?
  """

tools = [
    {'code_execution': {}},
    {'function_declarations': [turn_on_the_lights_schema, turn_off_the_lights_schema]}
]

await run(prompt, tools=tools, modality="AUDIO")

JavaScript

// Light control schemas
const turnOnTheLightsSchema = { name: 'turn_on_the_lights' };
const turnOffTheLightsSchema = { name: 'turn_off_the_lights' };

const prompt = `
  Hey, can you write run some python code to turn on the lights, wait 10s and then turn off the lights?
`;

const tools = [
  { codeExecution: {} },
  { functionDeclarations: [turnOnTheLightsSchema, turnOffTheLightsSchema] }
];

await run(prompt, tools=tools, modality="AUDIO")

Tryby wywoływania funkcji

Interfejs Gemini API umożliwia kontrolowanie sposobu, w jaki model korzysta z dostępnych narzędzi (deklaracji funkcji). W szczególności możesz ustawić tryb w sekcji function_calling_config.

  • AUTO (Default): model decyduje, czy wygenerować odpowiedź w języku naturalnym, czy zasugerować wywołanie funkcji na podstawie promptu i kontekstu. Jest to najbardziej elastyczny tryb i zalecany w większości scenariuszy.
  • ANY: model jest ograniczony do przewidywania wywołania funkcji i zapewnia zgodność ze schematem funkcji. Jeśli nie określisz wartości allowed_function_names, model może wybrać dowolną z podanych deklaracji funkcji. Jeśli parametr allowed_function_names jest podany jako lista, model może wybierać tylko spośród funkcji z tej listy. Użyj tego trybu, gdy wymagasz wywołania funkcji w odpowiedzi na każdy prompt (jeśli dotyczy).
  • NONE: model nie może wywoływać funkcji. Jest to równoznaczne z wysłaniem żądania bez deklaracji funkcji. Użyj tej opcji, aby tymczasowo wyłączyć wywoływanie funkcji bez usuwania definicji narzędzi.

Python

from google.genai import types

# Configure function calling mode
tool_config = types.ToolConfig(
    function_calling_config=types.FunctionCallingConfig(
        mode="ANY", allowed_function_names=["get_current_temperature"]
    )
)

# Create the generation config
config = types.GenerateContentConfig(
    temperature=0,
    tools=[tools],  # not defined here.
    tool_config=tool_config,
)

JavaScript

import { FunctionCallingConfigMode } from '@google/genai';

// Configure function calling mode
const toolConfig = {
  functionCallingConfig: {
    mode: FunctionCallingConfigMode.ANY,
    allowedFunctionNames: ['get_current_temperature']
  }
};

// Create the generation config
const config = {
  temperature: 0,
  tools: tools, // not defined here.
  toolConfig: toolConfig,
};

Automatyczne wywoływanie funkcji (tylko Python)

Korzystając z pakietu Python SDK, możesz przekazywać funkcje Pythona bezpośrednio jako narzędzia. Pakiet SDK automatycznie konwertuje funkcję Pythona na deklaracje i zajmuje się cyklem wykonywania wywołania funkcji oraz odpowiedzi. Pakiet Python SDK automatycznie:

  1. Wykrywa odpowiedzi na wywołania funkcji z modelu.
  2. Wywołaj odpowiednią funkcję Pythona w kodze.
  3. Wysyła odpowiedź funkcji z powrotem do modelu.
  4. Zwraca ostateczną odpowiedź tekstową modelu.

Aby tego użyć, zdefiniuj funkcję z podpowiedziami typów i opisem funkcji, a następnie prześlij funkcję (a nie deklarację JSON) jako narzędzie:

Python

from google import genai
from google.genai import types

# Define the function with type hints and docstring
def get_current_temperature(location: str) -> dict:
    """Gets the current temperature for a given location.

    Args:
        location: The city and state, e.g. San Francisco, CA

    Returns:
        A dictionary containing the temperature and unit.
    """
    # ... (implementation) ...
    return {"temperature": 25, "unit": "Celsius"}

# Configure the client and model
client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))  # Replace with your actual API key setup
config = types.GenerateContentConfig(
    tools=[get_current_temperature]
)  # Pass the function itself

# Make the request
response = client.models.generate_content(
    model="gemini-2.0-flash",
    contents="What's the temperature in Boston?",
    config=config,
)

print(response.text)  # The SDK handles the function call and returns the final text

Automatyczne wywoływanie funkcji możesz wyłączyć za pomocą:

Python

# To disable automatic function calling:
config = types.GenerateContentConfig(
    tools=[get_current_temperature],
    automatic_function_calling=types.AutomaticFunctionCallingConfig(disable=True)
)

Deklaracja schematu automatycznej funkcji

Automatyczne wyodrębnianie schematu z funkcji Pythona nie działa we wszystkich przypadkach. Na przykład nie obsługuje przypadków, w których opisujesz pola zagnieżdżonego obiektu słownika. Interfejs API może opisywać te typy:

Python

AllowedType = (int | float | bool | str | list['AllowedType'] | dict[str, AllowedType])

Aby zobaczyć, jak wygląda wywnioskowany schemat, możesz go przekonwertować za pomocą from_callable:

Python

def multiply(a: float, b: float):
    """Returns a * b."""
    return a * b

fn_decl = types.FunctionDeclaration.from_callable(callable=multiply, client=client)

# to_json_dict() provides a clean JSON representation.
print(fn_decl.to_json_dict())

Korzystanie z wielu narzędzi: łączenie narzędzi natywnych z wywoływaniem funkcji

Dzięki Gemini 2.0 możesz jednocześnie korzystać z wielu narzędzi, łącząc narzędzia natywne z funkcją wywoływania. Oto przykład, w którym żądanie korzystające z Live API zawiera 2 narzędzia: Grounding with Google Searchwykonanie kodu.

Python

# Multiple tasks example - combining lights, code execution, and search
prompt = """
  Hey, I need you to do three things for me.

    1.  Turn on the lights.
    2.  Then compute the largest prime palindrome under 100000.
    3.  Then use Google Search to look up information about the largest earthquake in California the week of Dec 5 2024.

  Thanks!
  """

tools = [
    {'google_search': {}},
    {'code_execution': {}},
    {'function_declarations': [turn_on_the_lights_schema, turn_off_the_lights_schema]} # not defined here.
]

# Execute the prompt with specified tools in audio modality
await run(prompt, tools=tools, modality="AUDIO")

JavaScript

// Multiple tasks example - combining lights, code execution, and search
const prompt = `
  Hey, I need you to do three things for me.

    1.  Turn on the lights.
    2.  Then compute the largest prime palindrome under 100000.
    3.  Then use Google Search to look up information about the largest earthquake in California the week of Dec 5 2024.

  Thanks!
`;

const tools = [
  { googleSearch: {} },
  { codeExecution: {} },
  { functionDeclarations: [turnOnTheLightsSchema, turnOffTheLightsSchema] } // not defined here.
];

// Execute the prompt with specified tools in audio modality
await run(prompt, {tools: tools, modality: "AUDIO"});

Deweloperzy Pythona mogą wypróbować to w notatniku dotyczącym korzystania z narzędzia interfejsu API.

Model Context Protocol (MCP)

Model Context Protocol (MCP) to otwarty standard umożliwiający łączenie aplikacji AI z zewnętrznymi narzędziami i danymi. MCP zapewnia wspólny protokół, który umożliwia modelom dostęp do kontekstu, np. funkcji (narzędzi), źródeł danych (zasobów) lub wstępnie zdefiniowanych promptów.

Pakiety Gemini SDK mają wbudowane wsparcie dla MCP, co zmniejsza ilość kodu stałego i zapewnia automatyczne wywoływanie narzędzi MCP. Gdy model wygeneruje wywołanie narzędzia MCP, pakiet SDK klienta Pythona i JavaScripta może automatycznie wykonać to narzędzie i przesłać odpowiedź z powrotem do modelu w kolejnych żądaniach. Ten cykl będzie się powtarzać, dopóki model nie wygeneruje więcej wywołań narzędzia.

Tutaj znajdziesz przykład korzystania z lokalnego serwera MCP z Gemini i pakietem SDK mcp.

Python

Upewnij się, że na wybranej platformie jest zainstalowana najnowsza wersja pakietu mcpSDK.

pip install mcp
import os
import asyncio
from datetime import datetime
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from google import genai

client = genai.Client(api_key=os.getenv("GEMINI_API_KEY"))

# Create server parameters for stdio connection
server_params = StdioServerParameters(
    command="npx",  # Executable
    args=["-y", "@philschmid/weather-mcp"],  # MCP Server
    env=None,  # Optional environment variables
)

async def run():
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            # Prompt to get the weather for the current day in London.
            prompt = f"What is the weather in London in {datetime.now().strftime('%Y-%m-%d')}?"
            # Initialize the connection between client and server
            await session.initialize()
            # Send request to the model with MCP function declarations
            response = await client.aio.models.generate_content(
                model="gemini-2.0-flash",
                contents=prompt,
                config=genai.types.GenerateContentConfig(
                    temperature=0,
                    tools=[session],  # uses the session, will automatically call the tool
                    # Uncomment if you **don't** want the sdk to automatically call the tool
                    # automatic_function_calling=genai.types.AutomaticFunctionCallingConfig(
                    #     disable=True
                    # ),
                ),
            )
            print(response.text)

# Start the asyncio event loop and run the main function
asyncio.run(run())

JavaScript

Upewnij się, że na wybranej platformie jest zainstalowana najnowsza wersja pakietu SDK mcp.

npm install @modelcontextprotocol/sdk
import { GoogleGenAI, FunctionCallingConfigMode , mcpToTool} from '@google/genai';
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";

// Create server parameters for stdio connection
const serverParams = new StdioClientTransport({
  command: "npx", // Executable
  args: ["-y", "@philschmid/weather-mcp"] // MCP Server
});

const client = new Client(
  {
    name: "example-client",
    version: "1.0.0"
  }
);

// Configure the client
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });

// Initialize the connection between client and server
await client.connect(serverParams);

// Send request to the model with MCP tools
const response = await ai.models.generateContent({
  model: "gemini-2.0-flash",
  contents: `What is the weather in London in ${new Date().toLocaleDateString()}?`,
  config: {
    tools: [mcpToTool(client)],  // uses the session, will automatically call the tool
    // Uncomment if you **don't** want the sdk to automatically call the tool
    // automaticFunctionCalling: {
    //   disable: true,
    // },
  },
});
console.log(response.text)

// Close the connection
await client.close();

Ograniczenia wbudowanej obsługi MCP

Wbudowana obsługa MCP to funkcja eksperymentalna w naszych pakietach SDK. Ma ona te ograniczenia:

  • Obsługiwane są tylko narzędzia, a nie zasoby ani prompty
  • Jest on dostępny w pakietach SDK Pythona i JavaScriptu/TypeScripta.
  • W kolejnych wersjach mogą wystąpić zmiany powodujące niezgodność.

Jeśli serwery MCP ograniczają możliwości tworzenia, możesz je zintegrować ręcznie.

Obsługiwane modele

Modele eksperymentalne nie są uwzględniane. Ich możliwości znajdziesz na stronie przeglądu modelu.

Model Wywoływanie funkcji równoległe wywoływanie funkcji; Wywoływanie funkcji kompozytowej
Gemini 2.0 Flash ✔️ ✔️ ✔️
Gemini 2.0 Flash-Lite X X X
Gemini 1.5 Flash ✔️ ✔️ ✔️
Gemini 1.5 Pro ✔️ ✔️ ✔️

Sprawdzone metody

  • Opis funkcji i parametrów: opisy powinny być bardzo jasne i konkretne. Model korzysta z nich, aby wybrać odpowiednią funkcję i podać odpowiednie argumenty.
  • Nazwy: używaj opisowych nazw funkcji (bez spacji, kropek ani myślników).
  • Sprawdzanie typów danych: aby zmniejszyć liczbę błędów, używaj w przypadku parametrów konkretnych typów (liczb całkowitych, ciągów znaków i typów enumeracji). Jeśli parametr ma ograniczony zbiór prawidłowych wartości, użyj listy.
  • Wybór narzędzia: model może używać dowolnej liczby narzędzi, ale podanie zbyt dużej ich liczby może zwiększyć ryzyko wybrania nieprawidłowego lub nieoptymalnego narzędzia. Aby uzyskać najlepsze wyniki, podawaj tylko narzędzia odpowiednie do kontekstu lub zadania. W idealnej sytuacji aktywny zestaw powinien zawierać maksymalnie 10–20 narzędzi. Jeśli masz dużą liczbę narzędzi, rozważ dynamiczny wybór narzędzi na podstawie kontekstu rozmowy.
  • Projektowanie promptów:
    • Podawanie kontekstu: określ rolę modelu (np. „Jesteś pomocnym asystentem pogodowym”.
    • Podawaj instrukcje: określaj, jak i kiedy używać funkcji (np. „Nie zgaduj dat; zawsze używaj przyszłej daty do prognoz”.
    • Zachęć do wyjaśnienia: w razie potrzeby poproś model o zadanie pytań wyjaśniających.
  • Temperatura: używaj niskiej temperatury (np. 0) w celu uzyskania bardziej deterministycznych i pewnych wywołań funkcji.
  • Weryfikacja: jeśli wywołanie funkcji ma istotne konsekwencje (np. złożenie zamówienia), przed jego wykonaniem sprawdź, czy użytkownik wyraził na to zgodę.
  • Obsługa błędów: w funkcjach zastosuj niezawodną obsługę błędów, aby sprawnie radzić sobie z nieoczekiwanymi danymi wejściowymi lub błędami interfejsu API. Zwracać przydatne komunikaty o błędach, których model może używać do generowania przydatnych odpowiedzi dla użytkownika.
  • Bezpieczeństwo: podczas wywoływania zewnętrznych interfejsów API należy pamiętać o zabezpieczeniach. Używaj odpowiednich mechanizmów uwierzytelniania i autoryzacji. Unikaj ujawniania danych poufnych w wywołaniach funkcji.
  • Limity tokenów: opisy funkcji i parametry są wliczane do limitu tokenów wejściowych. Jeśli osiągasz limity tokenów, rozważ ograniczenie liczby funkcji lub długości opisów oraz podziel złożone zadania na mniejsze, bardziej skoncentrowane zestawy funkcji.

Uwagi i ograniczenia

  • Obsługiwany jest tylko podzbiór schematu OpenAPI.
  • W Pythonie obsługiwane są tylko niektóre typy parametrów.
  • Automatyczne wywoływanie funkcji jest funkcją tylko w pakiecie Python SDK.