Mit Funktionsaufrufen können Sie Modelle mit externen Tools und APIs verbinden. Anstatt Textantworten zu generieren, bestimmt das Modell, wann bestimmte Funktionen aufgerufen werden sollen, und stellt die erforderlichen Parameter zum Ausführen realer Aktionen bereit. So kann das Modell als Brücke zwischen natürlicher Sprache und realen Aktionen und Daten fungieren. Es gibt drei primäre Anwendungsfälle für Funktionsaufrufe:
- Wissen erweitern:Auf Informationen aus externen Quellen wie Datenbanken, APIs und Wissensdatenbanken zugreifen.
- Funktionen erweitern:Verwenden Sie externe Tools, um Berechnungen durchzuführen und die Einschränkungen des Modells zu erweitern, z. B. durch die Verwendung eines Taschenrechners oder das Erstellen von Diagrammen.
- Aktionen ausführen:Über APIs mit externen Systemen interagieren, z. B. Termine planen, Rechnungen erstellen, E‑Mails senden oder Smart-Home-Geräte steuern.
Funktionsweise von Funktionsaufrufen
Funktionsaufrufe umfassen eine strukturierte Interaktion zwischen Ihrer Anwendung, dem Modell und externen Funktionen. So funktioniert es:
- Funktionsdeklaration definieren:Definieren Sie die Funktionsdeklaration in Ihrem Anwendungscode. Funktionsdeklarationen beschreiben dem Modell den Namen, die Parameter und den Zweck der Funktion.
- LLM mit Funktionsdeklarationen aufrufen:Senden Sie den Nutzer-Prompt zusammen mit den Funktionsdeklarationen an das Modell. Sie analysiert die Anfrage und ermittelt, ob ein Funktionsaufruf hilfreich wäre. Wenn ja, antwortet es mit einem strukturierten JSON-Objekt.
- Funktionscode ausführen (Ihre Verantwortung): Das Modell führt die Funktion nicht selbst aus. Ihre Anwendung ist dafür verantwortlich, die Antwort zu verarbeiten und nach Funktionsaufrufen zu suchen, wenn
- Ja: Extrahieren Sie den Namen und die Argumente der Funktion und führen Sie die entsprechende Funktion in Ihrer Anwendung aus.
- Nein:Das Modell hat eine direkte Textantwort auf den Prompt gegeben. Dieser Ablauf wird im Beispiel weniger betont, ist aber ein mögliches Ergebnis.
- Nutzerfreundliche Antwort erstellen:Wenn eine Funktion ausgeführt wurde, erfassen Sie das Ergebnis und senden Sie es in einem nachfolgenden Gesprächsbeitrag zurück an das Modell. Anhand des Ergebnisses wird dann eine endgültige, nutzerfreundliche Antwort generiert, die die Informationen aus dem Funktionsaufruf enthält.
Dieser Prozess kann über mehrere Runden wiederholt werden, was komplexe Interaktionen und Arbeitsabläufe ermöglicht. Das Modell unterstützt auch das Aufrufen mehrerer Funktionen in einem einzelnen Zug (paralleler Funktionsaufruf) und in einer Sequenz (zusammengesetzter Funktionsaufruf).
Schritt 1: Funktionsdeklaration definieren
Definieren Sie eine Funktion und ihre Deklaration in Ihrem Anwendungscode, mit der Nutzer Lichtwerte festlegen und eine API-Anfrage stellen können. Diese Funktion kann externe Dienste oder APIs aufrufen.
Python
# 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
};
}
Schritt 2: Modell mit Funktionsdeklarationen aufrufen
Nachdem Sie Ihre Funktionsdeklarationen definiert haben, können Sie das Modell auffordern, sie zu verwenden. Es analysiert den Prompt und die Funktionsdeklarationen und entscheidet, ob es direkt antworten oder eine Funktion aufrufen soll. Wenn eine Funktion aufgerufen wird, enthält das Antwortobjekt einen Vorschlag für einen Funktionsaufruf.
Python
from google.genai import types
# Configure the client and tools
client = genai.Client()
tools = types.Tool(function_declarations=[set_light_values_declaration])
config = types.GenerateContentConfig(tools=[tools])
# 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.5-flash",
contents=contents
config=config,
)
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({});
// 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.5-flash',
contents: contents,
config: config
});
console.log(response.functionCalls[0]);
Das Modell gibt dann ein functionCall
-Objekt in einem OpenAPI-kompatiblen Schema zurück, in dem angegeben wird, wie eine oder mehrere der deklarierten Funktionen aufgerufen werden, um die Frage des Nutzers zu beantworten.
Python
id=None args={'color_temp': 'warm', 'brightness': 25} name='set_light_values'
JavaScript
{
name: 'set_light_values',
args: { brightness: 25, color_temp: 'warm' }
}
Schritt 3: Code der Funktion „set_light_values“ ausführen
Extrahieren Sie die Details zum Funktionsaufruf aus der Antwort des Modells, parsen Sie die Argumente und führen Sie die Funktion set_light_values
aus.
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)}`);
}
Schritt 4: Nutzerfreundliche Antwort mit Funktionsergebnis erstellen und Modell noch einmal aufrufen
Senden Sie das Ergebnis der Funktionsausführung schließlich zurück an das Modell, damit es diese Informationen in seine endgültige Antwort an den Nutzer einbeziehen kann.
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.5-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.5-flash',
contents: contents,
config: config
});
console.log(final_response.text);
Damit ist der Ablauf für Funktionsaufrufe abgeschlossen. Das Modell hat die Funktion set_light_values
erfolgreich verwendet, um die Anfrage des Nutzers auszuführen.
Funktionsdeklarationen
Wenn Sie Funktionsaufrufe in einem Prompt implementieren, erstellen Sie ein tools
-Objekt, das ein oder mehrere function declarations
enthält. Sie definieren Funktionen mit JSON, insbesondere mit einer ausgewählten Teilmenge des OpenAPI-Schema-Formats. Eine einzelne Funktionsdeklaration kann die folgenden Parameter enthalten:
name
(String): Ein eindeutiger Name für die Funktion (get_weather_forecast
,send_email
). Verwenden Sie beschreibende Namen ohne Leerzeichen oder Sonderzeichen (Unterstriche oder CamelCase).description
(string): Eine klare und detaillierte Beschreibung des Zwecks und der Funktionen der Funktion. Das ist wichtig, damit das Modell weiß, wann die Funktion verwendet werden soll. Sei konkret und gib bei Bedarf Beispiele an („Findet Kinos basierend auf dem Standort und optional dem Filmtitel, der derzeit in den Kinos läuft.“).parameters
(Objekt): Definiert die Eingabeparameter, die von der Funktion erwartet werden.type
(String): Gibt den allgemeinen Datentyp an, z. B.object
.properties
(Objekt): Listet einzelne Parameter auf, jeweils mit:type
(String): Der Datentyp des Parameters, z. B.string
,integer
,boolean, array
.description
(String): Eine Beschreibung des Zwecks und des Formats des Parameters. Geben Sie Beispiele und Einschränkungen an („Die Stadt und der Bundesstaat, z.B. z. B. „San Francisco, CA“ oder eine Postleitzahl. '95616').enum
(Array, optional): Wenn die Parameterwerte aus einem festen Satz stammen, verwenden Sie „enum“, um die zulässigen Werte aufzulisten, anstatt sie nur in der Beschreibung zu beschreiben. Dadurch wird die Genauigkeit verbessert („enum“: [„daylight“, „cool“, „warm“]).
required
(Array): Ein Array von Strings mit den Parameternamen, die für die Funktion erforderlich sind.
Sie können FunctionDeclarations auch direkt aus Python-Funktionen mit types.FunctionDeclaration.from_callable(client=client, callable=your_function)
erstellen.
Funktionsaufrufe mit „thinking“
Wenn Sie Thinking aktivieren, kann sich die Leistung von Funktionsaufrufen verbessern, da das Modell eine Anfrage durchdenken kann, bevor es Funktionsaufrufe vorschlägt. Die Gemini API ist zustandslos. Der Kontext des Modells geht zwischen den einzelnen Zügen einer Multi-Turn-Unterhaltung verloren. Um diesen Kontext beizubehalten, können Sie Gedanken-Signaturen verwenden. Eine Gedanken-Signatur ist eine verschlüsselte Darstellung des internen Denkprozesses des Modells, die Sie in nachfolgenden Zügen an das Modell zurückgeben.
Beim Standardmuster für die Verwendung von Tools mit mehreren Durchgängen wird die vollständige vorherige Antwort des Modells an den Unterhaltungsverlauf angehängt. Das content
-Objekt enthält automatisch das thought_signatures
.
Wenn Sie diesem Muster folgen, sind keine Codeänderungen erforderlich.
Gedankensignaturen manuell verwalten
Wenn Sie den Unterhaltungsverlauf manuell ändern, anstatt die vollständige vorherige Antwort zu senden, und von der Denkweise profitieren möchten, müssen Sie die thought_signature
im Zug des Modells richtig verarbeiten.
Beachten Sie die folgenden Regeln, damit der Kontext des Modells erhalten bleibt:
- Senden Sie die
thought_signature
immer im ursprünglichenPart
zurück an das Modell. - Führen Sie keine
Part
mit einer Signatur mit einer ohne Signatur zusammen. Dadurch wird der Positionskontext des Gedankens unterbrochen. - Kombinieren Sie nicht zwei
Parts
, die beide Signaturen enthalten, da die Signatur-Strings nicht zusammengeführt werden können.
Gedankensignaturen prüfen
Das ist zwar für die Implementierung nicht erforderlich, aber Sie können die Antwort untersuchen, um die thought_signature
zu Debugging- oder Schulungszwecken zu sehen.
Python
import base64
# After receiving a response from a model with thinking enabled
# response = client.models.generate_content(...)
# The signature is attached to the response part containing the function call
part = response.candidates[0].content.parts[0]
if part.thought_signature:
print(base64.b64encode(part.thought_signature).decode("utf-8"))
JavaScript
// After receiving a response from a model with thinking enabled
// const response = await ai.models.generateContent(...)
// The signature is attached to the response part containing the function call
const part = response.candidates[0].content.parts[0];
if (part.thoughtSignature) {
console.log(part.thoughtSignature);
}
Weitere Informationen zu Einschränkungen und zur Verwendung von Gedanken-Signaturen sowie zu Denkmodellen im Allgemeinen finden Sie auf der Seite Denken.
Parallele Funktionsaufrufe
Neben einzelnen Funktionsaufrufen können Sie auch mehrere Funktionen gleichzeitig aufrufen. Beim parallelen Funktionsaufruf können mehrere Funktionen gleichzeitig ausgeführt werden. Das ist sinnvoll, wenn die Funktionen nicht voneinander abhängig sind. Das ist in Szenarien nützlich, in denen Daten aus mehreren unabhängigen Quellen erfasst werden müssen, z. B. wenn Kundendetails aus verschiedenen Datenbanken abgerufen oder Lagerbestände in verschiedenen Lagern geprüft werden müssen oder wenn mehrere Aktionen ausgeführt werden müssen, z. B. wenn Sie Ihre Wohnung in eine Disco verwandeln möchten.
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']
}
};
Konfigurieren Sie den Funktionsaufrufmodus so, dass alle angegebenen Tools verwendet werden können. Weitere Informationen zum Konfigurieren von Funktionsaufrufen
Python
from google import genai
from google.genai import types
# Configure the client and tools
client = genai.Client()
house_tools = [
types.Tool(function_declarations=[power_disco_ball, start_music, dim_lights])
]
config = types.GenerateContentConfig(
tools=house_tools,
automatic_function_calling=types.AutomaticFunctionCallingConfig(
disable=True
),
# Force the model to call 'any' function, instead of chatting.
tool_config=types.ToolConfig(
function_calling_config=types.FunctionCallingConfig(mode='ANY')
),
)
chat = client.chats.create(model="gemini-2.5-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({});
// Create a chat session
const chat = ai.chats.create({
model: 'gemini-2.5-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})`);
}
Jedes der ausgegebenen Ergebnisse entspricht einem einzelnen Funktionsaufruf, den das Modell angefordert hat. Senden Sie die Ergebnisse in derselben Reihenfolge zurück, in der sie angefordert wurden.
Das Python SDK unterstützt den automatischen Funktionsaufruf. Dabei werden Python-Funktionen automatisch in Deklarationen umgewandelt und der Ausführungs- und Antwortzyklus des Funktionsaufrufs wird für Sie übernommen. Im Folgenden finden Sie ein Beispiel für den Anwendungsfall „Disco“.
Python
from google import genai
from google.genai import types
# Actual function implementations
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}
# Configure the client
client = genai.Client()
config = types.GenerateContentConfig(
tools=[power_disco_ball_impl, start_music_impl, dim_lights_impl]
)
# Make the request
response = client.models.generate_content(
model="gemini-2.5-flash",
contents="Do everything you need to this place into party!",
config=config,
)
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!
Zusammengesetzte Funktionsaufrufe
Durch die Komposition oder das sequenzielle Aufrufen von Funktionen kann Gemini mehrere Funktionsaufrufe verketten, um eine komplexe Anfrage zu bearbeiten. Um beispielsweise die Frage „Wie ist die Temperatur an meinem aktuellen Standort?“ zu beantworten, ruft die Gemini API möglicherweise zuerst eine get_current_location()
-Funktion und dann eine get_weather()
-Funktion auf, die den Standort als Parameter verwendet.
Im folgenden Beispiel wird gezeigt, wie Sie die Komposition von Funktionsaufrufen mit dem Python SDK und automatischen Funktionsaufrufen implementieren.
Python
In diesem Beispiel wird das automatische Funktionsaufruffeature des google-genai
Python SDK verwendet. Das SDK konvertiert die Python-Funktionen automatisch in das erforderliche Schema, führt die Funktionsaufrufe aus, wenn das Modell dies anfordert, und sendet die Ergebnisse zurück an das Modell, um die Aufgabe abzuschließen.
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()
config = types.GenerateContentConfig(
tools=[get_weather_forecast, set_thermostat_temperature]
)
# Make the request
response = client.models.generate_content(
model="gemini-2.5-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)
Erwartete Ausgabe
Wenn Sie den Code ausführen, sehen Sie, wie das SDK die Funktionsaufrufe orchestriert. Das Modell ruft zuerst get_weather_forecast
auf, empfängt die Temperatur und ruft dann set_thermostat_temperature
mit dem richtigen Wert auf, der auf der Logik im Prompt basiert.
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
In diesem Beispiel wird gezeigt, wie Sie das JavaScript-/TypeScript-SDK verwenden, um zusammengesetzte Funktionsaufrufe mit einer manuellen Ausführungsschleife durchzuführen.
import { GoogleGenAI, Type } from "@google/genai";
// Configure the client
const ai = new GoogleGenAI({});
// 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.5-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;
}
}
Erwartete Ausgabe
Wenn Sie den Code ausführen, sehen Sie, wie das SDK die Funktionsaufrufe orchestriert. Das Modell ruft zuerst get_weather_forecast
auf, empfängt die Temperatur und ruft dann set_thermostat_temperature
mit dem richtigen Wert auf, der auf der Logik im Prompt basiert.
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.
Kompositionelle Funktionsaufrufe sind eine native Live API-Funktion. Das bedeutet, dass die Live API den Funktionsaufruf ähnlich wie das Python SDK verarbeiten kann.
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")
Modi für Funktionsaufrufe
Mit der Gemini API können Sie steuern, wie das Modell die bereitgestellten Tools (Funktionsdeklarationen) verwendet. Sie können den Modus in function_calling_config
festlegen.
AUTO (Default)
: Das Modell entscheidet anhand des Prompts und des Kontextes, ob eine Antwort in natürlicher Sprache generiert oder ein Funktionsaufruf vorgeschlagen werden soll. Dies ist der flexibelste Modus und wird für die meisten Szenarien empfohlen.ANY
: Das Modell ist darauf beschränkt, immer einen Funktionsaufruf vorherzusagen, und garantiert die Einhaltung des Funktionsschemas. Wennallowed_function_names
nicht angegeben ist, kann das Modell aus allen bereitgestellten Funktionsdeklarationen auswählen. Wennallowed_function_names
als Liste angegeben wird, kann das Modell nur aus den Funktionen in dieser Liste auswählen. Verwenden Sie diesen Modus, wenn Sie für jeden Prompt eine Antwort auf einen Funktionsaufruf benötigen (falls zutreffend).NONE
: Das Modell darf keine Funktionsaufrufe ausführen. Dies entspricht dem Senden einer Anfrage ohne Funktionsdeklarationen. Damit können Sie Funktionsaufrufe vorübergehend deaktivieren, ohne Ihre Tool-Definitionen zu entfernen.
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(
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 = {
tools: tools, // not defined here.
toolConfig: toolConfig,
};
Automatischer Funktionsaufruf (nur Python)
Wenn Sie das Python SDK verwenden, können Sie Python-Funktionen direkt als Tools bereitstellen. Das SDK konvertiert die Python-Funktion automatisch in Deklarationen und übernimmt die Ausführung des Funktionsaufrufs und den Antwortzyklus für Sie. Das Python SDK führt dann automatisch folgende Schritte aus:
- Erkennt Funktionsaufrufantworten des Modells.
- Rufen Sie die entsprechende Python-Funktion in Ihrem Code auf.
- Sendet die Funktionsantwort an das Modell zurück.
- Gibt die endgültige Textantwort des Modells zurück.
Dazu definieren Sie Ihre Funktion mit Typ-Hinweisen und einem Docstring und übergeben dann die Funktion selbst (nicht eine JSON-Deklaration) als Tool:
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
client = genai.Client()
config = types.GenerateContentConfig(
tools=[get_current_temperature]
) # Pass the function itself
# Make the request
response = client.models.generate_content(
model="gemini-2.5-flash",
contents="What's the temperature in Boston?",
config=config,
)
print(response.text) # The SDK handles the function call and returns the final text
Sie können automatische Funktionsaufrufe mit dem folgenden Befehl deaktivieren:
Python
config = types.GenerateContentConfig(
tools=[get_current_temperature],
automatic_function_calling=types.AutomaticFunctionCallingConfig(disable=True)
)
Automatische Deklaration von Funktionsschemata
Die automatische Schemaextraktion aus Python-Funktionen funktioniert nicht in allen Fällen. Beispielsweise werden keine Fälle behandelt, in denen Sie die Felder eines verschachtelten Dictionary-Objekts beschreiben. Die API kann die folgenden Typen beschreiben:
Python
AllowedType = (int | float | bool | str | list['AllowedType'] | dict[str, AllowedType])
Wenn Sie sehen möchten, wie das abgeleitete Schema aussieht, können Sie es mit from_callable
konvertieren:
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())
Mehrere Tools verwenden: Native Tools mit Funktionsaufrufen kombinieren
Sie können mehrere Tools gleichzeitig aktivieren und dabei native Tools mit Funktionsaufrufen kombinieren. Hier ist ein Beispiel, in dem zwei Tools, Grounding with Google Search und Codeausführung, in einer Anfrage mit der Live API aktiviert werden.
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"});
Python-Entwickler können dies im Notebook zur Verwendung des Live API-Tools ausprobieren.
Model Context Protocol (MCP)
Model Context Protocol (MCP) ist ein offener Standard zum Verbinden von KI-Anwendungen mit externen Tools und Daten. MCP bietet ein gemeinsames Protokoll für Modelle, um auf Kontext zuzugreifen, z. B. Funktionen (Tools), Datenquellen (Ressourcen) oder vordefinierte Prompts.
Die Gemini SDKs bieten integrierte Unterstützung für das MCP, wodurch Boilerplate-Code reduziert wird und automatische Tool-Aufrufe für MCP-Tools möglich sind. Wenn das Modell einen MCP-Toolaufruf generiert, können das Python- und das JavaScript-Client-SDK das MCP-Tool automatisch ausführen und die Antwort in einer nachfolgenden Anfrage an das Modell zurücksenden. Diese Schleife wird fortgesetzt, bis das Modell keine weiteren Toolaufrufe mehr ausführt.
Hier finden Sie ein Beispiel für die Verwendung eines lokalen MCP-Servers mit Gemini und dem mcp
SDK.
Python
Achten Sie darauf, dass die aktuelle Version des mcp
SDK auf der gewünschten Plattform installiert ist.
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()
# 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.5-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
Achten Sie darauf, dass die aktuelle Version des mcp
SDK auf der von Ihnen ausgewählten Plattform installiert ist.
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({});
// 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.5-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();
Einschränkungen bei der integrierten MCP-Unterstützung
Die integrierte Unterstützung für MCP ist eine experimentelle Funktion in unseren SDKs und unterliegt den folgenden Einschränkungen:
- Es werden nur Tools unterstützt, keine Ressourcen oder Prompts.
- Es ist für das Python- und das JavaScript-/TypeScript-SDK verfügbar.
- In zukünftigen Releases kann es zu nicht abwärtskompatiblen Änderungen kommen.
Die manuelle Integration von MCP-Servern ist immer eine Option, wenn diese Ihre Entwicklungsmöglichkeiten einschränken.
Unterstützte Modelle
In diesem Abschnitt werden Modelle und ihre Funktionen für Funktionsaufrufe aufgeführt. Experimentelle Modelle sind nicht enthalten. Eine umfassende Übersicht über die Funktionen finden Sie auf der Seite Modellübersicht.
Modell | Funktionsaufrufe | Parallele Funktionsaufrufe | Zusammengesetzte Funktionsaufrufe |
---|---|---|---|
Gemini 2.5 Pro | ✔️ | ✔️ | ✔️ |
Gemini 2.5 Flash | ✔️ | ✔️ | ✔️ |
Gemini 2.5 Flash-Lite | ✔️ | ✔️ | ✔️ |
Gemini 2.0 Flash | ✔️ | ✔️ | ✔️ |
Gemini 2.0 Flash-Lite | X | X | X |
Best Practices
- Funktions- und Parameterbeschreibungen:Beschreiben Sie die Funktionen und Parameter so klar und spezifisch wie möglich. Das Modell stützt sich darauf, um die richtige Funktion auszuwählen und passende Argumente zu liefern.
- Benennung:Verwenden Sie aussagekräftige Funktionsnamen ohne Leerzeichen, Punkte oder Bindestriche.
- Starke Typisierung:Verwenden Sie bestimmte Typen (Ganzzahl, String, Enum) für Parameter, um Fehler zu reduzieren. Wenn ein Parameter nur eine begrenzte Anzahl gültiger Werte haben kann, verwenden Sie ein Enum.
- Tool-Auswahl:Das Modell kann eine beliebige Anzahl von Tools verwenden. Wenn Sie jedoch zu viele Tools bereitstellen, kann das Risiko steigen, dass ein falsches oder suboptimales Tool ausgewählt wird. Die besten Ergebnisse erzielen Sie, wenn Sie nur die relevanten Tools für den Kontext oder die Aufgabe bereitstellen. Idealerweise sollte die aktive Gruppe maximal 10–20 Tools umfassen. Wenn Sie eine große Anzahl von Tools haben, sollten Sie die dynamische Tool-Auswahl basierend auf dem Kontext der Unterhaltung in Betracht ziehen.
- Prompt Engineering:
- Kontext bereitstellen: Weisen Sie das Modell auf seine Rolle hin (z.B. „Du bist ein hilfreicher Wetterassistent.“).
- Anleitung geben: Geben Sie an, wie und wann Funktionen verwendet werden sollen (z.B. „Don't guess dates; always use a future date for forecasts.“ (Schätzen Sie keine Daten. Verwenden Sie für Prognosen immer ein zukünftiges Datum.)
- Um Klärung bitten: Weisen Sie das Modell an, bei Bedarf klärende Fragen zu stellen.
- Temperatur:Verwenden Sie eine niedrige Temperatur (z.B. 0) für deterministischere und zuverlässigere Funktionsaufrufe.
- Validierung:Wenn ein Funktionsaufruf erhebliche Folgen hat (z.B. eine Bestellung aufgeben), validieren Sie den Aufruf mit dem Nutzer, bevor Sie ihn ausführen.
- Fehlerbehandlung: Implementieren Sie eine robuste Fehlerbehandlung in Ihren Funktionen, um unerwartete Eingaben oder API-Fehler ordnungsgemäß zu verarbeiten. Geben Sie informative Fehlermeldungen zurück, die das Modell verwenden kann, um hilfreiche Antworten für den Nutzer zu generieren.
- Sicherheit:Achten Sie beim Aufrufen externer APIs auf die Sicherheit. Verwenden Sie geeignete Authentifizierungs- und Autorisierungsmechanismen. Vermeiden Sie die Offenlegung vertraulicher Daten in Funktionsaufrufen.
- Tokenlimits:Funktionsbeschreibungen und Parameter werden auf Ihr Eingabetokenlimit angerechnet. Wenn Sie an die Tokenlimits stoßen, sollten Sie die Anzahl der Funktionen oder die Länge der Beschreibungen begrenzen und komplexe Aufgaben in kleinere, fokussiertere Funktionsgruppen aufteilen.
Hinweise und Einschränkungen
- Es wird nur eine Teilmenge des OpenAPI-Schemas unterstützt.
- Die unterstützten Parametertypen in Python sind begrenzt.
- Der automatische Funktionsaufruf ist nur eine Funktion des Python SDK.