מבוא לבקשות להפעלת פונקציות

בקשה להפעלת פונקציה, שנקראת גם שימוש בכלים, מספקת ל-LLM הגדרות של כלים חיצוניים (לדוגמה, פונקציית get_current_weather). כשמעבדים הנחיה, המודל קובע בצורה חכמה אם נדרש כלי. אם כן, הוא מפיק נתונים מובנים שמציינים את הכלי להפעלה ואת הפרמטרים שלו (לדוגמה, get_current_weather(location='Boston')). לאחר מכן, האפליקציה מפעילה את הכלי הזה ומעבירה את התוצאה בחזרה למודל, וכך הוא יכול להשלים את התגובה שלו עם מידע דינמי מהעולם האמיתי או עם תוצאה של פעולה. הפעולה הזו יוצרת גשר בין מודל ה-LLM לבין המערכות שלכם, ומרחיבה את היכולות שלו.

תרשים שממחיש את תהליך האינטראקציה של קריאה לפונקציה 

קריאה להפעלת פונקציות מאפשרת שני תרחישי שימוש עיקריים:

  • אחזור נתונים: אחזור מידע עדכני לתשובות של המודל, כמו מזג האוויר הנוכחי, המרת מטבע או נתונים ספציפיים ממאגרי ידע ומממשקי API‏ (RAG).

  • ביצוע פעולה: ביצוע פעולות חיצוניות כמו שליחת טפסים, עדכון מצב האפליקציה או תזמור של תהליכי עבודה מבוססי-סוכן (למשל, העברת שיחות).

דוגמאות נוספות לתרחישי שימוש שמבוססים על קריאה להפעלת פונקציות זמינות במאמר תרחישי שימוש.

תכונות ומגבלות

  • המודלים הבאים תומכים בקריאה להפעלת פונקציות:

    • מודלים של Gemini:

לחצו כדי להרחיב את רשימת המודלים הנתמכים

איך יוצרים אפליקציה עם קריאה להפעלת פונקציות

כדי להשתמש בהפעלת פונקציות, צריך לבצע את המשימות הבאות:

  1. שולחים למודל הצהרות על פונקציות ופרומפט.
  2. מספקים למודל את הפלט של ה-API.

שלב 1: שולחים את ההנחיה ואת הצהרות הפונקציה למודל

מצהירים על Tool בפורמט סכימה שתואם לסכימת OpenAPI. מידע נוסף זמין במאמר בנושא דוגמאות לסכימות.

בדוגמאות הבאות נשלחים פרומפט והצהרת פונקציה למודלים של Gemini:

REST

PROJECT_ID=myproject
LOCATION=us-central1
MODEL_ID=gemini-2.5-flash

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:generateContent \
  -d '{
    "contents": [{
      "role": "user",
      "parts": [{
        "text": "What is the weather in Boston?"
      }]
    }],
    "tools": [{
      "functionDeclarations": [
        {
          "name": "get_current_weather",
          "description": "Get the current weather in a given location",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "The city name of the location for which to get the weather.",
                "default": {
                  "string_value": "Boston, MA"
                }
              }
            },
            "required": [
              "location"
            ]
          }
        }
      ]
    }]
  }'

Google Gen AI SDK ל-Python

from google import genai
from google.genai.types import GenerateContentConfig, Part

# The project and location are passed directly to the client,
# and vertexai=True is added to specify the use of the Agent Platform backend.
client = genai.Client(vertexai=True, project="PROJECT_ID", location="global")

def get_current_weather(location: str) -> str:
  """Returns the current weather.

  Args:
    location: The city and state, e.g. San Francisco, CA
  """
  return 'sunny'

response = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="What is the weather in boston?",
    config=GenerateContentConfig(tools=[get_current_weather]),
)

Agent Platform SDK

אתם יכולים לציין את הסכימה באופן ידני באמצעות מילון Python, או באופן אוטומטי באמצעות פונקציית העזר from_func. בדוגמה הבאה אפשר לראות איך מגדירים פונקציה באופן ידני:

import vertexai
from vertexai.generative_models import (
    Content,
    FunctionDeclaration,
    GenerationConfig,
    GenerativeModel,
    Part,
    Tool,
    ToolConfig
)

# Initialize Agent Platform
# TODO(developer): Update the project
vertexai.init(project="PROJECT_ID", location="us-central1")

# Initialize Gemini model
model = GenerativeModel(model_name="gemini-2.5-flash")

# Manual function declaration
get_current_weather_func = FunctionDeclaration(
    name="get_current_weather",
    description="Get the current weather in a given location",
    # Function parameters are specified in JSON schema format
    parameters={
        "type": "object",
        "properties": {
            "location": {
              "type": "string",
              "description": "The city name of the location for which to get the weather.",
              "default": {
                "string_value": "Boston, MA"
              }
           }
        },
    },
)

response = model.generate_content(
    contents = [
      Content(
        role="user",
          parts=[
              Part.from_text("What is the weather like in Boston?"),
          ],
      )
    ],
    generation_config = GenerationConfig(temperature=0),
    tools = [
      Tool(
        function_declarations=[get_current_weather_func],
      )
    ]
)

אפשר גם להצהיר על הפונקציה באופן אוטומטי באמצעות פונקציית העזר from_func, כמו בדוגמה הבאה:

def get_current_weather(location: str = "Boston, MA"):
  """
  Get the current weather in a given location

  Args:
      location: The city name of the location for which to get the weather.

  """
  # This example uses a mock implementation.
  # You can define a local function or import the requests library to call an API
  return {
    "location": "Boston, MA",
    "temperature": 38,
    "description": "Partly Cloudy",
    "icon": "partly-cloudy",
    "humidity": 65,
    "wind": {
        "speed": 10,
        "direction": "NW"
    }
  }
get_current_weather_func = FunctionDeclaration.from_func(get_current_weather)

Node.js

בדוגמה הזו מוצג תרחיש טקסט עם פונקציה אחת והנחיה אחת.

Node.js

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsההוראות להגדרה במאמר התחלה מהירה של פלטפורמת הסוכנים באמצעות ספריות לקוח.

כדי לבצע אימות בפלטפורמת הסוכן, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

const {GoogleGenAI} = require('@google/genai');

const tools = [
  {
    functionDeclarations: [
      {
        name: 'get_current_weather',
        description: 'get weather in a given location',
        parameters: {
          type: 'OBJECT',
          properties: {
            location: {type: 'STRING'},
            unit: {type: 'STRING', enum: ['celsius', 'fahrenheit']},
          },
          required: ['location'],
        },
      },
    ],
  },
];

const functionResponseParts = [
  {
    functionResponse: {
      name: 'get_current_weather',
      response: {weather: 'super nice'},
    },
  },
];

/**
 * TODO(developer): Update these variables before running the sample.
 */
async function functionCallingStreamContent(
  projectId = 'PROJECT_ID',
  location = 'us-central1',
  model = 'gemini-2.5-flash'
) {
  // Initialize client with your Cloud project and location
  const client = new GoogleGenAI({
    vertexai: true,
    project: projectId,
    location: location,
  });

  const request = [
    {role: 'user', parts: [{text: 'What is the weather in Boston?'}]},
    {
      role: 'model',
      parts: [
        {
          functionCall: {
            name: 'get_current_weather',
            args: {location: 'Boston'},
          },
        },
      ],
    },
    {role: 'user', parts: functionResponseParts},
  ];

  const streamingResp = await client.models.generateContentStream({
    model: model,
    contents: request,
    config: {tools: tools},
  });

  let completeResponseText = '';
  for await (const chunk of streamingResp) {
    if (chunk.text) {
      completeResponseText += chunk.text;
    }
  }
  console.log(completeResponseText);
}

המשך

הדוגמה הזו ממחישה תרחיש טקסט עם פונקציה אחת והנחיה אחת.

איך מתקינים או מעדכנים את Go

מידע נוסף זמין ב מאמרי העזרה של ה-SDK.

מגדירים משתני סביבה כדי להשתמש ב-Google Gen AI SDK עם Vertex AI:

# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values
# with appropriate values for your project.
export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT
export GOOGLE_CLOUD_LOCATION=global
export GOOGLE_GENAI_USE_ENTERPRISE=True

import (
	"context"
	"fmt"
	"io"

	genai "google.golang.org/genai"
)

// generateWithFuncCall shows how to submit a prompt and a function declaration to the model,
// allowing it to suggest a call to the function to fetch external data. Returning this data
// enables the model to generate a text response that incorporates the data.
func generateWithFuncCall(w io.Writer) error {
	ctx := context.Background()

	client, err := genai.NewClient(ctx, &genai.ClientConfig{
		HTTPOptions: genai.HTTPOptions{APIVersion: "v1"},
	})
	if err != nil {
		return fmt.Errorf("failed to create genai client: %w", err)
	}

	weatherFunc := &genai.FunctionDeclaration{
		Description: "Returns the current weather in a location.",
		Name:        "getCurrentWeather",
		Parameters: &genai.Schema{
			Type: "object",
			Properties: map[string]*genai.Schema{
				"location": {Type: "string"},
			},
			Required: []string{"location"},
		},
	}
	config := &genai.GenerateContentConfig{
		Tools: []*genai.Tool{
			{FunctionDeclarations: []*genai.FunctionDeclaration{weatherFunc}},
		},
		Temperature: genai.Ptr(float32(0.0)),
	}

	modelName := "gemini-2.5-flash"
	contents := []*genai.Content{
		{Parts: []*genai.Part{
			{Text: "What is the weather like in Boston?"},
		},
			Role: genai.RoleUser},
	}

	resp, err := client.Models.GenerateContent(ctx, modelName, contents, config)
	if err != nil {
		return fmt.Errorf("failed to generate content: %w", err)
	}

	var funcCall *genai.FunctionCall
	for _, p := range resp.Candidates[0].Content.Parts {
		if p.FunctionCall != nil {
			funcCall = p.FunctionCall
			fmt.Fprint(w, "The model suggests to call the function ")
			fmt.Fprintf(w, "%q with args: %v\n", funcCall.Name, funcCall.Args)
			// Example response:
			// The model suggests to call the function "getCurrentWeather" with args: map[location:Boston]
		}
	}
	if funcCall == nil {
		return fmt.Errorf("model did not suggest a function call")
	}

	// Use synthetic data to simulate a response from the external API.
	// In a real application, this would come from an actual weather API.
	funcResp := &genai.FunctionResponse{
		Name: "getCurrentWeather",
		Response: map[string]any{
			"location":         "Boston",
			"temperature":      "38",
			"temperature_unit": "F",
			"description":      "Cold and cloudy",
			"humidity":         "65",
			"wind":             `{"speed": "10", "direction": "NW"}`,
		},
	}

	// Return conversation turns and API response to complete the model's response.
	contents = []*genai.Content{
		{Parts: []*genai.Part{
			{Text: "What is the weather like in Boston?"},
		},
			Role: genai.RoleUser},
		{Parts: []*genai.Part{
			{FunctionCall: funcCall},
		}},
		{Parts: []*genai.Part{
			{FunctionResponse: funcResp},
		}},
	}

	resp, err = client.Models.GenerateContent(ctx, modelName, contents, config)
	if err != nil {
		return fmt.Errorf("failed to generate content: %w", err)
	}

	respText := resp.Text()

	fmt.Fprintln(w, respText)

	// Example response:
	// The weather in Boston is cold and cloudy with a temperature of 38 degrees Fahrenheit. The humidity is ...

	return nil
}

C#‎

בדוגמה הזו מוצג תרחיש טקסט עם פונקציה אחת והנחיה אחת.

C#

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#ההוראות להגדרה במאמר התחלה מהירה של פלטפורמת הסוכנים באמצעות ספריות לקוח.

כדי לבצע אימות ב-Agent Platform, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.


using Google.Cloud.AIPlatform.V1;
using System;
using System.Threading.Tasks;
using Type = Google.Cloud.AIPlatform.V1.Type;
using Value = Google.Protobuf.WellKnownTypes.Value;

public class FunctionCalling
{
    public async Task<string> GenerateFunctionCall(
        string projectId = "your-project-id",
        string location = "us-central1",
        string publisher = "google",
        string model = "gemini-2.5-flash")
    {
        var predictionServiceClient = new PredictionServiceClientBuilder
        {
            Endpoint = $"{location}-aiplatform.googleapis.com"
        }.Build();

        // Define the user's prompt in a Content object that we can reuse in
        // model calls
        var userPromptContent = new Content
        {
            Role = "USER",
            Parts =
            {
                new Part { Text = "What is the weather like in Boston?" }
            }
        };

        // Specify a function declaration and parameters for an API request
        var functionName = "get_current_weather";
        var getCurrentWeatherFunc = new FunctionDeclaration
        {
            Name = functionName,
            Description = "Get the current weather in a given location",
            Parameters = new OpenApiSchema
            {
                Type = Type.Object,
                Properties =
                {
                    ["location"] = new()
                    {
                        Type = Type.String,
                        Description = "Get the current weather in a given location"
                    },
                    ["unit"] = new()
                    {
                        Type = Type.String,
                        Description = "The unit of measurement for the temperature",
                        Enum = {"celsius", "fahrenheit"}
                    }
                },
                Required = { "location" }
            }
        };

        // Send the prompt and instruct the model to generate content using the tool that you just created
        var generateContentRequest = new GenerateContentRequest
        {
            Model = $"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}",
            GenerationConfig = new GenerationConfig
            {
                Temperature = 0f
            },
            Contents =
            {
                userPromptContent
            },
            Tools =
            {
                new Tool
                {
                    FunctionDeclarations = { getCurrentWeatherFunc }
                }
            }
        };

        GenerateContentResponse response = await predictionServiceClient.GenerateContentAsync(generateContentRequest);

        var functionCall = response.Candidates[0].Content.Parts[0].FunctionCall;
        Console.WriteLine(functionCall);

        string apiResponse = "";

        // Check the function name that the model responded with, and make an API call to an external system
        if (functionCall.Name == functionName)
        {
            // Extract the arguments to use in your API call
            string locationCity = functionCall.Args.Fields["location"].StringValue;

            // Here you can use your preferred method to make an API request to
            // fetch the current weather

            // In this example, we'll use synthetic data to simulate a response
            // payload from an external API
            apiResponse = @"{ ""location"": ""Boston, MA"",
                    ""temperature"": 38, ""description"": ""Partly Cloudy""}";
        }

        // Return the API response to Gemini so it can generate a model response or request another function call
        generateContentRequest = new GenerateContentRequest
        {
            Model = $"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}",
            Contents =
            {
                userPromptContent, // User prompt
                response.Candidates[0].Content, // Function call response,
                new Content
                {
                    Parts =
                    {
                        new Part
                        {
                            FunctionResponse = new()
                            {
                                Name = functionName,
                                Response = new()
                                {
                                    Fields =
                                    {
                                        { "content", new Value { StringValue = apiResponse } }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            Tools =
            {
                new Tool
                {
                    FunctionDeclarations = { getCurrentWeatherFunc }
                }
            }
        };

        response = await predictionServiceClient.GenerateContentAsync(generateContentRequest);

        string responseText = response.Candidates[0].Content.Parts[0].Text;
        Console.WriteLine(responseText);

        return responseText;
    }
}

Java

Java

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaההוראות להגדרה במאמר התחלה מהירה של פלטפורמת הסוכנים באמצעות ספריות לקוח.

כדי לבצע אימות בפלטפורמת הסוכן, צריך להגדיר את Application Default Credentials. למידע נוסף, ראו הגדרת אימות לסביבת פיתוח מקומית.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.


import com.google.genai.Client;
import com.google.genai.types.FunctionCall;
import com.google.genai.types.FunctionDeclaration;
import com.google.genai.types.GenerateContentConfig;
import com.google.genai.types.GenerateContentResponse;
import com.google.genai.types.HttpOptions;
import com.google.genai.types.Schema;
import com.google.genai.types.Tool;
import com.google.genai.types.Type;
import java.util.List;
import java.util.Map;

public class ToolFunctionDescriptionWithText {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String modelId = "gemini-2.5-flash";
    String contents = "What is the weather like in Boston?";

    generateContent(modelId, contents);
  }

  // Generates content with text input and function declaration that
  // the model may use to retrieve external data for the response
  public static String generateContent(String modelId, String contents) {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests.
    try (Client client =
        Client.builder()
            .location("global")
            .vertexAI(true)
            .httpOptions(HttpOptions.builder().apiVersion("v1").build())
            .build()) {

      FunctionDeclaration getCurrentWeather =
          FunctionDeclaration.builder()
              .name("get_current_weather")
              .description("Get the current weather in a given location")
              // Function parameters are specified in schema format
              .parameters(
                  Schema.builder()
                      .type(Type.Known.OBJECT)
                      .properties(
                          Map.of(
                              "location",
                              Schema.builder()
                                  .type(Type.Known.STRING)
                                  .description(
                                      "The city name of the location for which to get the weather.")
                                  .build()))
                      .required(List.of("location"))
                      .build()) // End parameters schema
              .build(); // End function declaration

      Tool weatherTool = Tool.builder().functionDeclarations(getCurrentWeather).build();

      GenerateContentConfig config =
          GenerateContentConfig.builder().tools(weatherTool).temperature(0.0f).build();

      GenerateContentResponse response = client.models.generateContent(modelId, contents, config);

      // response.functionCalls() returns an ImmutableList<FunctionCall>.
      List<FunctionCall> functionCalls = response.functionCalls();
      if (functionCalls != null && !functionCalls.isEmpty()) {
        System.out.println(functionCalls.get(0));
        return functionCalls.toString();
      }
      System.out.println("No function calls found in response.");
      return "";
      // Example response:
      // [FunctionCall{args=Optional[{location=Boston, MA}], name=Optional[get_current_weather]}]
    }
  }
}

אם המודל קובע שהוא צריך את הפלט של פונקציה מסוימת, התגובה שהאפליקציה מקבלת מהמודל מכילה את שם הפונקציה ואת ערכי הפרמטרים שצריך להפעיל את הפונקציה איתם.

הדוגמה הבאה היא תשובה של מודל להנחיה של המשתמש "What is the weather like in Boston?‎". המודל מציע להפעיל את הפונקציה get_current_weather עם הפרמטר Boston, MA.

candidates {
  content {
    role: "model"
    parts {
      function_call {
        name: "get_current_weather"
        args {
          fields {
            key: "location"
            value {
              string_value: "Boston, MA"
            }
          }
        }
      }
    }
  }
  ...
}

שלב 2: מספקים למודל את הפלט של ה-API

מפעיל את ה-API החיצוני ומעביר את הפלט של ה-API בחזרה למודל.

בדוגמה הבאה נעשה שימוש בנתונים סינתטיים כדי לדמות מטען תגובה (payload) מ-API חיצוני, והפלט נשלח בחזרה למודל:

REST

PROJECT_ID=myproject
MODEL_ID=gemini-2.5-flash
LOCATION="us-central1"

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:generateContent \
-d '{
"contents": [
{
  "role": "user",
  "parts": {
    "text": "What is the weather in Boston?"
  }
},
{
  "role": "model",
  "parts": [
    {
      "functionCall": {
        "name": "get_current_weather",
        "args": {
          "location": "Boston, MA"
        }
      }
    }
  ]
},
{
  "role": "user",
  "parts": [
    {
      "functionResponse": {
        "name": "get_current_weather",
        "response": {
          "temperature": 20,
          "unit": "C"
        }
      }
    }
  ]
}
],
"tools": [
{
  "function_declarations": [
    {
      "name": "get_current_weather",
      "description": "Get the current weather in a specific location",
      "parameters": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "The city name of the location for which to get the weather."
          }
        },
        "required": [
          "location"
        ]
      }
    }
  ]
}
]
}'

Agent Platform SDK

function_response_contents = []
function_response_parts = []

# Iterates through the function calls in the response in case there are parallel function call requests
for function_call in response.candidates[0].function_calls:
    print(f"Function call: {function_call.name}")

    # In this example, we'll use synthetic data to simulate a response payload from an external API
    if (function_call.args['location'] == "Boston, MA"):
      api_response = { "location": "Boston, MA", "temperature": 38, "description": "Partly Cloudy" }
    if (function_call.args['location'] == "San Francisco, CA"):
      api_response = { "location": "San Francisco, CA", "temperature": 58, "description": "Sunny" }

    function_response_parts.append(
        Part.from_function_response(
            name=function_call.name,
            response={"contents": api_response}
        )
    )
    # Add the function call response to the contents
    function_response_contents = Content(role="user", parts=function_response_parts)

# Submit the User's prompt, model's response, and API output back to the model
response = model.generate_content(
  [
    Content( # User prompt
      role="user",
      parts=[
          Part.from_text("What is the weather like in Boston?"),
      ],
    ),
    response.candidates[0].content,  # Function call response
    function_response_contents   # API output
  ],
  tools=[
    Tool(
      function_declarations=[get_current_weather_func],
    )
  ],
)
# Get the model summary response
print(response.text)

לשיטות מומלצות שקשורות להפעלת API, כדאי לעיין במאמר שיטות מומלצות – הפעלת API.

אם המודל הציע כמה קריאות להפעלת פונקציות במקביל, האפליקציה צריכה לספק את כל התשובות בחזרה למודל. מידע נוסף זמין במאמר דוגמה לקריאה להפעלת פונקציות במקביל.

יכול להיות שהמודל יקבע שהפלט של פונקציה אחרת נחוץ כדי להגיב להנחיה. במקרה כזה, התשובה שהאפליקציה מקבלת מהמודל מכילה שם פונקציה אחר וקבוצה אחרת של ערכי פרמטרים.

אם המודל קובע שהתשובה של ה-API מספיקה כדי להגיב לפרומפט של המשתמש, הוא יוצר תשובה בשפה טבעית ומחזיר אותה לאפליקציה. במקרה כזה, האפליקציה צריכה להחזיר את התשובה למשתמש. זוהי דוגמה לתשובה בשפה טבעית:

It is currently 38 degrees Fahrenheit in Boston, MA with partly cloudy skies.

בקשה להפעלת פונקציה עם מחשבות

כשמפעילים פונקציות עם ההגדרה thinking, צריך לקבל את thought_signature מאובייקט התשובה של המודל ולהחזיר אותו כששולחים את התוצאה של הפעלת הפונקציה בחזרה למודל. לדוגמה:

Python

# Call the model with function declarations
# ...Generation config, Configure the client, and Define user prompt (No changes)

# Send request with declarations (using a thinking model)
response = client.models.generate_content(
  model="gemini-2.5-flash", config=config, contents=contents)

# See thought signatures
for part in response.candidates[0].content.parts:
  if not part.text:
    continue
  if part.thought and part.thought_signature:
    print("Thought signature:")
    print(part.thought_signature)

לא חובה להציג את חתימות המחשבה, אבל צריך לשנות את שלב 2 כדי שהן יוחזרו יחד עם תוצאת ההפעלה של הפונקציה, וכך המודל יוכל לשלב את המחשבות בתשובה הסופית שלו:

Python

# Create user friendly response with function result and call the model again
# ...Create a function response part (No change)

# Append thought signatures, function call and result of the function execution to contents
function_call_content = response.candidates[0].content
# Append the model's function call message, which includes thought signatures
contents.append(function_call_content)
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)

כשמחזירים חתימות של מחשבות, צריך לפעול לפי ההנחיות הבאות:

  • המודל מחזיר חתימות בחלקים אחרים בתשובה, למשל בחלקים של קריאה להפעלת פונקציות, טקסט או סיכומי מחשבות. להחזיר את כל התשובה עם כל החלקים למודל בסבבים הבאים.
  • אל תמזגו חלק עם חתימה אחת עם חלק אחר שגם מכיל חתימה. אי אפשר לשרשר חתימות.
  • אל תמזגו חלק עם חתימה עם חלק אחר בלי חתימה. זה פוגע במיקום הנכון של הרעיון שמיוצג על ידי החתימה.

מידע נוסף על מגבלות ושימוש ב'חתימות מחשבה' ועל מודלים של חשיבה

קריאה להפעלת פונקציות במקביל

בהנחיות כמו "Get weather details in Boston and San Francisco?‎", המודל עשוי להציע כמה קריאות להפעלת פונקציות במקביל. ברשימת המודלים הנתמכים מפורטים המודלים שתומכים בקריאה להפעלת פונקציות במקביל.

REST

בדוגמה הזו מוצג תרחיש עם פונקציה אחת של get_current_weather. ההנחיה של המשתמש היא "Get weather details in Boston and San Francisco?‎". המודל מציע שתי קריאות מקבילות לפונקציה get_current_weather: אחת עם הפרמטר Boston והשנייה עם הפרמטר San Francisco.

{
"candidates": [
  {
    "content": {
      "role": "model",
      "parts": [
        {
          "functionCall": {
            "name": "get_current_weather",
            "args": {
              "location": "Boston"
            }
          }
        },
        {
          "functionCall": {
            "name": "get_current_weather",
            "args": {
              "location": "San Francisco"
            }
          }
        }
      ]
    },
    ...
  }
],
...
}

הפקודה הבאה מדגימה איך אפשר לספק למודל את הפלט של הפונקציה. מחליפים את my-project בשם הפרויקט ב- Cloud de Confiance .

בקשה למודל

PROJECT_ID=my-project
MODEL_ID=gemini-2.5-flash
LOCATION="us-central1"
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_ID}:generateContent \
-d '{
"contents": [
{
  "role": "user",
  "parts": {
    "text": "What is difference in temperature in Boston and San Francisco?"
  }
},
{
  "role": "model",
  "parts": [
    {
      "functionCall": {
        "name": "get_current_weather",
        "args": {
          "location": "Boston"
        }
      }
    },
    {
      "functionCall": {
        "name": "get_current_weather",
        "args": {
          "location": "San Francisco"
        }
      }
    }
  ]
},
{
  "role": "user",
  "parts": [
    {
      "functionResponse": {
        "name": "get_current_weather",
        "response": {
          "temperature": 30.5,
          "unit": "C"
        }
      }
    },
    {
      "functionResponse": {
        "name": "get_current_weather",
        "response": {
          "temperature": 20,
          "unit": "C"
        }
      }
    }
  ]
}
],
"tools": [
{
  "function_declarations": [
    {
      "name": "get_current_weather",
      "description": "Get the current weather in a specific location",
      "parameters": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "The city name of the location for which to get the weather."
          }
        },
        "required": [
          "location"
        ]
      }
    }
  ]
}
]
}'
  

התשובה בשפה טבעית שנוצרה על ידי המודל דומה לתשובה הבאה:

תשובה מהמודל

[
{
    "candidates": [
        {
            "content": {
                "parts": [
                    {
                        "text": "The temperature in Boston is 30.5C and the temperature in San Francisco is 20C. The difference is 10.5C. \n"
                    }
                ]
            },
            "finishReason": "STOP",
            ...
        }
    ]
    ...
}
]
  

Python

בדוגמה הזו מוצג תרחיש עם פונקציית get_current_weather אחת. ההנחיה של המשתמש היא "What is the weather like in Boston and San Francisco?‎" (מה מזג האוויר בבוסטון ובסן פרנסיסקו?).

מחליפים את my-project בשם הפרויקט ב- Cloud de Confiance .

import vertexai
from vertexai.generative_models import (
    Content,
    FunctionDeclaration,
    GenerationConfig,
    GenerativeModel,
    Part,
    Tool,
    ToolConfig
)

# Initialize Agent Platform
# TODO(developer): Update the project
vertexai.init(project="my-project", location="us-central1")

# Initialize Gemini model
model = GenerativeModel(model_name="gemini-2.5-flash")

# Manual function declaration
get_current_weather_func = FunctionDeclaration(
    name="get_current_weather",
    description="Get the current weather in a given location",
    # Function parameters are specified in JSON schema format
    parameters={
        "type": "object",
        "properties": {
            "location": {
              "type": "string",
              "description": "The city name of the location for which to get the weather.",
              "default": {
                "string_value": "Boston, MA"
              }
          }
        },
    },
)

response = model.generate_content(
    contents = [
      Content(
        role="user",
          parts=[
              Part.from_text("What is the weather like in Boston and San Francisco?"),
          ],
      )
    ],
    generation_config = GenerationConfig(temperature=0),
    tools = [
      Tool(
        function_declarations=[get_current_weather_func],
      )
    ]
)

בדוגמה הבאה אפשר לראות איך מספקים את פלט הפונקציה למודל.

function_response_contents = []
function_response_parts = []

# You can have parallel function call requests for the same function type.
# For example, 'location_to_lat_long("London")' and 'location_to_lat_long("Paris")'
# In that case, collect API responses in parts and send them back to the model

for function_call in response.candidates[0].function_calls:
    print(f"Function call: {function_call.name}")

    # In this example, we'll use synthetic data to simulate a response payload from an external API
    if (function_call.args['location'] == "Boston, MA"):
      api_response = { "location": "Boston, MA", "temperature": 38, "description": "Partly Cloudy" }
    if (function_call.args['location'] == "San Francisco, CA"):
      api_response = { "location": "San Francisco, CA", "temperature": 58, "description": "Sunny" }

    function_response_parts.append(
        Part.from_function_response(
            name=function_call.name,
            response={"contents": api_response}
        )
    )
    # Add the function call response to the contents
    function_response_contents = Content(role="user", parts=function_response_parts)

function_response_contents

response = model.generate_content(
    contents = [
        Content(
        role="user",
          parts=[
              Part.from_text("What is the weather like in Boston and San Francisco?"),
          ],
        ),  # User prompt
        response.candidates[0].content,  # Function call response
        function_response_contents,  # Function response
    ],
    tools = [
      Tool(
        function_declarations=[get_current_weather_func],
      )
    ]
)
# Get the model summary response
print(response.text)

המשך

import (
	"context"
	"errors"
	"fmt"
	"io"

	genai "google.golang.org/genai"
)

// generateWithParallelFunctionCalling shows how to execute multiple function calls in parallel
// and return their results to the model for generating a complete response.
func generateWithParallelFunctionCalling(w io.Writer) error {
	ctx := context.Background()

	// Initialize the unified GenAI client for Vertex AI.
	client, err := genai.NewClient(ctx, &genai.ClientConfig{
		HTTPOptions: genai.HTTPOptions{APIVersion: "v1"},
		Backend:     genai.BackendVertexAI,
	})
	if err != nil {
		return fmt.Errorf("failed to create genai client: %w", err)
	}

	funcName := "getCurrentWeather"
	funcDecl := &genai.FunctionDeclaration{
		Name:        funcName,
		Description: "Get the current weather in a given location",
		Parameters: &genai.Schema{
			Type: "object",
			Properties: map[string]*genai.Schema{
				"location": {
					Type: "string",
					Description: "The location for which to get the weather. " +
						"It can be a city name, a city name and state, or a zip code. " +
						"Examples: 'San Francisco', 'San Francisco, CA', '95616', etc.",
				},
			},
			Required: []string{"location"},
		},
	}

	config := &genai.GenerateContentConfig{
		Temperature: genai.Ptr(float32(0.0)),
		Tools: []*genai.Tool{
			{
				FunctionDeclarations: []*genai.FunctionDeclaration{funcDecl},
			},
		},
	}

	// Initialize the conversation history with the user prompt.
	prompt := "Get weather details in New Delhi and San Francisco?"
	contents := []*genai.Content{
		{
			Role: "user",
			Parts: []*genai.Part{
				{Text: prompt},
			},
		},
	}

	modelName := "gemini-2.5-flash"

	// First API call: The model determines it needs to call tools based on the prompt.
	resp, err := client.Models.GenerateContent(ctx, modelName, contents, config)
	if err != nil {
		return fmt.Errorf("failed to generate content: %w", err)
	}

	if len(resp.Candidates) == 0 || resp.Candidates[0].Content == nil {
		return errors.New("got empty response from model")
	}

	// Extract the parallel function call requests from the model's response.
	var functionCalls []*genai.FunctionCall
	for _, part := range resp.Candidates[0].Content.Parts {
		if part.FunctionCall != nil {
			functionCalls = append(functionCalls, part.FunctionCall)
			fmt.Fprintf(w, "Model suggests to call the function %q with args: %v\n", part.FunctionCall.Name, part.FunctionCall.Args)
		}
	}

	if len(functionCalls) == 0 {
		return errors.New("got no function call suggestions from model")
	}

	// Append the model's tool call request to the conversation history.
	contents = append(contents, resp.Candidates[0].Content)

	// Simulate external API responses. The SDK now directly accepts map[string]any.
	mockAPIResp1 := map[string]any{
		"location":         "New Delhi",
		"temperature":      "42",
		"temperature_unit": "C",
		"description":      "Hot and humid",
		"humidity":         "65",
	}

	mockAPIResp2 := map[string]any{
		"location":         "San Francisco",
		"temperature":      "36",
		"temperature_unit": "F",
		"description":      "Cold and cloudy",
		"humidity":         "N/A",
	}

	// Bundle the API responses into a single Content block as Parts.
	funcRespContent := &genai.Content{
		Role: "user",
		Parts: []*genai.Part{
			{
				FunctionResponse: &genai.FunctionResponse{
					Name:     funcName,
					Response: mockAPIResp1,
				},
			},
			{
				FunctionResponse: &genai.FunctionResponse{
					Name:     funcName,
					Response: mockAPIResp2,
				},
			},
		},
	}

	// Append the tool response to the conversation history
	contents = append(contents, funcRespContent)

	// Final API call: The model synthesizes the tool results into a natural language response.
	resp, err = client.Models.GenerateContent(ctx, modelName, contents, config)
	if err != nil {
		return fmt.Errorf("failed to generate content: %w", err)
	}

	if len(resp.Candidates) == 0 || resp.Candidates[0].Content == nil || len(resp.Candidates[0].Content.Parts) == 0 {
		return errors.New("got empty response from model")
	}

	for _, part := range resp.Candidates[0].Content.Parts {
		if part.Text != "" {
			fmt.Fprintln(w, part.Text)
		}
	}

	// Example response:
	// The weather in New Delhi is hot and humid with a temperature of 42 degrees Celsius. The weather in San Francisco is ...

	return nil
}

תשובות של פונקציות מולטי-מודאליות

ב-Gemini 3 ובמודלים מתקדמים יותר, אתם יכולים לכלול תוכן מולטימודלי בחלקי התגובה של הפונקציה שאתם שולחים למודל. המודל יכול לעבד את התוכן המולטי-מודאלי הזה בסבב הבא כדי ליצור תשובה מושכלת יותר. אלה סוגי ה-MIME שנתמכים בתוכן מולטימודלי בתגובות לפונקציות:

  • תמונות: image/png, image/jpeg, image/webp
  • מסמכים: application/pdf, ‏ text/plain

כדי לכלול נתונים מרובי-אופנים בתשובה של פונקציה, צריך לכלול אותם כחלק אחד או יותר שמוטמעים בחלק functionResponse. כל חלק מולטימודלי חייב להכיל את inlineData או את fileData. אם אתם מפנים לחלק מולטימודלי מתוך השדה המובנה response, הוא חייב להכיל displayName ייחודי.

אפשר גם להפנות לחלק מולטימודלי מתוך השדה המובנה response של החלק functionResponse באמצעות פורמט ההפניה של JSON‏ {"$ref": "<displayName>"}. המודל מחליף את ההפניה בתוכן המולטימודלי כשהוא מעבד את התשובה. אפשר להפנות לכל displayName רק פעם אחת בשדה המובנה response.

בדוגמה הבאה מוצגת הודעה שמכילה functionResponse לפונקציה בשם get_image וחלק בתצורה של עץ שמכיל נתוני תמונה. השדה response של התג functionResponse מפנה לחלק התמונה הזה:

Python

from google import genai
from google.genai import types

client = genai.Client()

# This is a manual, two turn multimodal function calling workflow:

# 1. Define the function tool
get_image_declaration = types.FunctionDeclaration(
  name="get_image",
  description="Retrieves the image file reference for a specific order item.",
  parameters={
      "type": "object",
      "properties": {
          "item_name": {
              "type": "string",
              "description": "The name or description of the item ordered (e.g., 'green shirt')."
          }
      },
      "required": ["item_name"],
  },
)
tool_config = types.Tool(function_declarations=[get_image_declaration])

# 2. Send a message that triggers the tool
prompt = "Show me the green shirt I ordered last month."
response_1 = client.models.generate_content(
  model="gemini-3.5-flash",
  contents=[prompt],
  config=types.GenerateContentConfig(
      tools=[tool_config],
  )
)

# 3. Handle the function call
function_call = response_1.function_calls[0]
requested_item = function_call.args["item_name"]
print(f"Model wants to call: {function_call.name}")

# Execute your tool (e.g., call an API)
# (This is a mock response for the example)
print(f"Calling external tool for: {requested_item}")

function_response_data = {
  "image_ref": {"$ref": "dress.jpg"},
}

function_response_multimodal_data = types.FunctionResponsePart(
  file_data=types.FunctionResponseFileData(
    mime_type="image/png",
    display_name="dress.jpg",
    file_uri="gs://cloud-samples-data/generative-ai/image/dress.jpg",
  )
)

# 4. Send the tool's result back
# Append this turn's messages to history for a final response.
history = [
  types.Content(role="user", parts=[types.Part(text=prompt)]),
  response_1.candidates[0].content,
  types.Content(
    role="tool",
    parts=[
        types.Part.from_function_response(
          name=function_call.name,
          response=function_response_data,
          parts=[function_response_multimodal_data]
        )
    ],
  )
]

response_2 = client.models.generate_content(
  model="gemini-3.5-flash",
  contents=history,
  config=types.GenerateContentConfig(
      tools=[tool_config],
      thinking_config=types.ThinkingConfig(include_thoughts=True)
  ),
)

print(f"\nFinal model response: {response_2.text}")

REST

"contents": [
  ...,
  {
    "role": "user",
    "parts": [
      {
        "functionResponse": {
          "name": "get_image",
          "response": {
            "image_ref": {
              "$ref": "wakeupcat.jpg"
            }
          },
          "parts": [
            {
              "fileData": {
                "displayName": "wakeupcat.jpg",
                "mimeType": "image/jpeg",
                "fileUri": "gs://cloud-samples-data/vision/label/wakeupcat.jpg"
              }
            }
          ]
        }
      }
    ]
  }
]

ארגומנטים של בקשות להפעלת פונקציות בסטרימינג

במודלים של Gemini 3 ואילך, אפשר לבקש שהארגומנטים של קריאות הפונקציות יועברו בסטרימינג בזמן שהמודל יוצר אותם, במקום לחכות עד ליצירת כל הארגומנטים. האפשרות הזו שימושית כדי לצמצם את זמן האחזור הנתפס כשצריך להפעיל פונקציות.

יש לתכונה הזו את המגבלות הבאות:

  • התכונה הזו זמינה גם בגרסה v1 וגם בגרסה v1beta1 של ה-API.

כדי להפעיל סטרימינג של ארגומנטים של קריאות לפונקציות, מגדירים את streamFunctionCallArguments ל-true בתוך toolConfig.functionCallingConfig כשקוראים ל-streamGenerateContent.

כשהערך של streamFunctionCallArguments הוא true, תשובות ביניים יכילו אובייקט functionCall עם השדות partialArgs ו-willContinue. השדה partialArgs מכיל קטעי ארגומנטים כפי שהם נוצרים, והשדה willContinue מציין אם צפויים קטעים נוספים לבקשה להפעלת פונקציה.

  • ‫partialArgs: מערך של אובייקטים מסוג PartialArg, שכל אחד מהם מכיל:
    • ‫jsonPath: מחרוזת JSONPath שמציינת את הנתיב לקטע הזה באובייקט הפרמטרים של הפונקציה. הנתיב יכול להצביע על ארגומנט (למשל $.location) או על רכיב בתוך ארגומנט אם הארגומנט הוא אובייקט (למשל $.location.latitude).
    • ערך לקטע, שיכול להיות numberValue,‏ stringValue,‏ boolValue או nullValue.
    • ‫willContinue: ערך בוליאני בתוך אובייקט partialArgs. השדה הזה הוא true רק עבור קטעי stringValue כשערך המחרוזת מועבר בחלקים וצפויים עוד חלקים לארגומנט הזה.
  • ‫willContinue: ערך בוליאני בתוך האובייקט functionCall. אם צפויים עוד true, partialArgs עבור הקריאה הכוללת לפונקציה בתגובות הבאות שמוזרמות. אם הערך הוא false או שהוא לא קיים, זו התשובה הסופית בסטרימינג לבקשה הנוכחית להפעלת פונקציה.

בדוגמה הבאה מוצג רצף של נתחי generateContent שמוזרמים, שבהם הארגומנטים של קריאה יחידה לפונקציה מוזרמים:

{
  "parts": [
    {
      "functionCall": {
        "name": "controlLight",
        "partialArgs": [
          {
            "jsonPath": "$.brightness",
            "numberValue": 50
          }
        ],
        "willContinue": true
      }
    }
  ],
  "role": "model"
}
{
  "parts": [
    {
      "functionCall": {
        "partialArgs": [
          {
            "jsonPath": "$.colorTemperature",
            "stringValue": "warm",
            "willContinue": true
          }
        ],
        "willContinue": true
      }
    }
  ],
  "role": "model"
}
{
  "parts": [
    {
      "functionCall": {
        "partialArgs": [
          {
            "jsonPath": "$.colorTemperature"
          }
        ],
        "willContinue": true
      }
    }
  ],
  "role": "model"
}
{
  "parts": [
    {
      "functionCall": {}
    }
  ],
  "role": "model"
}

בדוגמה הבאה מוצג איך ארגומנטים לקריאות פונקציה מקבילות יכולים להיות מוזרמים בכמה תשובות להנחיה 'מה ההבדל בטמפרטורה בין ניו דלהי לסן פרנסיסקו?':

{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [{
        "functionCall": {
          "name": "get_current_weather",
          "willContinue": true
        },
      }]
    }
  }],
}
{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [{
        "functionCall": {
          "partialArgs": [{
            "jsonPath": "$.location",
            "stringValue": "New Delhi",
            "willContinue": true
          }],
          "willContinue": true
        }
      }]
    }
  }],
}
{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [{
        "functionCall": {
          "partialArgs": [{
            "jsonPath": "$.location",
            "stringValue": ""
          }],
          "willContinue": true
        }
      }]
    }
  }],
}
{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [{
        "functionCall": {
        }
      }]
    }
  }],
}
{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [{
        "functionCall": {
          "name": "get_current_weather",
          "willContinue": true
        },
      }]
    }
  }],
}
{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [{
        "functionCall": {
          "partialArgs": [{
            "jsonPath": "$.location",
            "stringValue": "San Francisco",
            "willContinue": true
          }],
          "willContinue": true
        }
      }]
    }
  }],
}
{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [{
        "functionCall": {
          "partialArgs": [{
            "jsonPath": "$.location",
            "stringValue": ""
          }],
          "willContinue": true
        }
      }]
    }
  }],
}
{
  "candidates": [{
    "content": {
      "role": "model",
      "parts": [{
        "functionCall": {
        }
      }]
    }
  }],
}

Python

from google import genai
from google.genai import types

client = genai.Client()

get_weather_declaration = types.FunctionDeclaration(
  name="get_weather",
  description="Gets the current weather temperature for a given location.",
  parameters={
      "type": "object",
      "properties": {"location": {"type": "string"}},
      "required": ["location"],
  },
)
get_weather_tool = types.Tool(function_declarations=[get_weather_declaration])

for chunk in client.models.generate_content_stream(
  model="gemini-3.5-flash",
  contents="What's the weather in London and New York?",
  config=types.GenerateContentConfig(
      tools=[get_weather_tool],
      tool_config = types.ToolConfig(
          function_calling_config=types.FunctionCallingConfig(
              mode=types.FunctionCallingConfigMode.AUTO,
              stream_function_call_arguments=True,
          )
      ),
  ),
):
  function_call = chunk.function_calls[0]
  if function_call and function_call.name:
      print(f"{function_call.name}")
      print(f"will_continue={function_call.will_continue}")

מצבי קריאה להפעלת פונקציות

אתם יכולים לקבוע איך המודל ישתמש בכלים שסיפקתם (הצהרות פונקציה) על ידי הגדרת המצב בתוך function_calling_config.

מצב תיאור
AUTO התנהגות ברירת המחדל של המודל. המודל מחליט אם לחזות בקשות להפעלת פונקציות או להגיב בשפה טבעית על סמך ההקשר. זהו המצב הגמיש ביותר והוא מומלץ לרוב התרחישים.
VALIDATED המודל מוגבל לחיזוי של בקשות להפעלת פונקציות או של שפה טבעית, ומבטיח עמידה בסכימה של הפונקציה. אם לא מציינים את allowed_function_names, המודל בוחר מכל הצהרות הפונקציות הזמינות. אם צוין allowed_function_names, המודל בוחר מתוך קבוצת הפונקציות המותרות. החל מ-Gemini 3, המצב הזה גם אוכף את הנוכחות של פרמטרים נדרשים.
ANY המודל מוגבל כך שתמיד יחזיר בקשה להפעלת פונקציה אחת או יותר, ומוודא שהסכימה של הפונקציה תואמת. אם לא מציינים את allowed_function_names, המודל בוחר מתוך כל הצהרות הפונקציות הזמינות. אם צוין allowed_function_names, המודל בוחר מתוך קבוצת הפונקציות המותרות. השתמשו במצב הזה כשאתם צריכים תשובה עם בקשה להפעלת פונקציה לכל פרומפט (אם רלוונטי).
NONE אסור למודל לבצע קריאות לפונקציות. זה שווה ערך לשליחת בקשה בלי הצהרות על פונקציות. השתמש במצב זה כדי להשבית זמנית קריאה להפעלת פונקציות בלי להסיר את הגדרות הכלים.

בקשה להפעלת פונקציה בכוח

במקום לאפשר למודל לבחור בין תשובה בשפה טבעית לבין בקשה להפעלת פונקציה, אתם יכולים לאלץ אותו לחזות רק בקשות להפעלת פונקציות. הפעולה הזו נקראת קריאה מאולצת לפונקציה. אפשר גם לספק למודל קבוצה מלאה של הצהרות פונקציות, אבל להגביל את התשובות שלו לקבוצת משנה של הפונקציות האלה.

בדוגמה הבאה, המודל נאלץ לחזות רק בקשות להפעלת פונקציה get_weather.

Python

response = model.generate_content(
    contents = [
      Content(
        role="user",
          parts=[
              Part.from_text("What is the weather like in Boston?"),
          ],
      )
    ],
    generation_config = GenerationConfig(temperature=0),
    tools = [
      Tool(
        function_declarations=[get_weather_func, some_other_function],
      )
    ],
    tool_config=ToolConfig(
        function_calling_config=ToolConfig.FunctionCallingConfig(
            # ANY mode forces the model to predict only function calls
            mode=ToolConfig.FunctionCallingConfig.Mode.ANY,
            # Allowed function calls to predict when the mode is ANY. If empty, any of
            # the provided function calls will be predicted.
            allowed_function_names=["get_weather"],
        )
    )
)

דוגמאות לסכימת פונקציות

הצהרות על פונקציות תואמות לסכימה של OpenAPI. אנחנו תומכים במאפיינים הבאים: type,‏ nullable,‏ required,‏ format,‏ description,‏ properties,‏ items,‏ enum,‏ anyOf,‏ $ref ו-$defs. אין תמיכה במאפיינים הנותרים.

פונקציה עם פרמטרים של אובייקט ומערך

בדוגמה הבאה נעשה שימוש במילון Python כדי להצהיר על פונקציה שמקבלת גם פרמטרים של אובייקטים וגם פרמטרים של מערכים:

extract_sale_records_func = FunctionDeclaration(
  name="extract_sale_records",
  description="Extract sale records from a document.",
  parameters={
      "type": "object",
      "properties": {
          "records": {
              "type": "array",
              "description": "A list of sale records",
              "items": {
                  "description": "Data for a sale record",
                  "type": "object",
                  "properties": {
                      "id": {"type": "integer", "description": "The unique id of the sale."},
                      "date": {"type": "string", "description": "Date of the sale, in the format of MMDDYY, e.g., 031023"},
                      "total_amount": {"type": "number", "description": "The total amount of the sale."},
                      "customer_name": {"type": "string", "description": "The name of the customer, including first name and last name."},
                      "customer_contact": {"type": "string", "description": "The phone number of the customer, e.g., 650-123-4567."},
                  },
                  "required": ["id", "date", "total_amount"],
              },
          },
      },
      "required": ["records"],
  },
)
  

פונקציה עם פרמטר enum

בדוגמה הבאה נעשה שימוש במילון Python כדי להצהיר על פונקציה שמקבלת פרמטר של מספר שלם enum:

set_status_func = FunctionDeclaration(
  name="set_status",
  description="set a ticket's status field",
  # Function parameters are specified in JSON schema format
  parameters={
      "type": "object",
      "properties": {
        "status": {
          "type": "integer",
          "enum": [ "10", "20", "30" ],   # Provide integer (or any other type) values as strings.
        }
      },
  },
)
  

פונקציה עם ref ו-def

ההצהרה הבאה על פונקציית JSON משתמשת במאפיינים ref ו-defs:

{
  "contents": ...,
  "tools": [
    {
      "function_declarations": [
        {
          "name": "get_customer",
          "description": "Search for a customer by name",
          "parameters": {
            "type": "object",
            "properties": {
              "first_name": { "ref": "#/defs/name" },
              "last_name": { "ref": "#/defs/name" }
            },
            "defs": {
              "name": { "type": "string" }
            }
          }
        }
      ]
    }
  ]
}
  

הערות לגבי שימוש:

  • בניגוד לסכימת OpenAPI, צריך לציין את ref ו-defs בלי הסמל $.
  • ‫ref חייב להתייחס לצאצא ישיר של defs; אסור להשתמש בהפניות חיצוניות.
  • העומק המקסימלי של סכימה בתצוגת עץ הוא 32.
  • עומק הרקורסיה ב-defs (הפניה עצמית) מוגבל לשנייה.

‫from_func עם פרמטר מערך

בדוגמת הקוד הבאה מוצהרת פונקציה שמכפילה מערך של מספרים ומשתמשת ב-from_func כדי ליצור את סכימת FunctionDeclaration.

from typing import List

# Define a function. Could be a local function or you can import the requests library to call an API
def multiply_numbers(numbers: List[int] = [1, 1]) -> int:
  """
  Calculates the product of all numbers in an array.

  Args:
      numbers: An array of numbers to be multiplied.

  Returns:
      The product of all the numbers. If the array is empty, returns 1.
  """

  if not numbers:  # Handle empty array
      return 1

  product = 1
  for num in numbers:
      product *= num

  return product

multiply_number_func = FunctionDeclaration.from_func(multiply_numbers)

"""
multiply_number_func contains the following schema:

{'name': 'multiply_numbers',
  'description': 'Calculates the product of all numbers in an array.',
  'parameters': {'properties': {'numbers': {'items': {'type': 'INTEGER'},
    'description': 'list of numbers',
    'default': [1.0, 1.0],
    'title': 'Numbers',
    'type': 'ARRAY'}},
  'description': 'Calculates the product of all numbers in an array.',
  'title': 'multiply_numbers',
  'property_ordering': ['numbers'],
  'type': 'OBJECT'}}
"""
  

שיטות מומלצות לקריאה להפעלת פונקציות

כדי לשפר את התוצאות כשמשתמשים בהפעלת פונקציות, כדאי לפעול לפי השיטות המומלצות הבאות:

לכתוב שמות ברורים ומפורטים של פונקציות, תיאורים של פרמטרים והוראות

  • שמות של פונקציות צריכים להתחיל באות או בקו תחתון, ולהכיל רק את התווים a-z,‏ A-Z,‏ 0-9, קווים תחתונים, נקודות או מקפים, באורך מקסימלי של 64 תווים.

  • התיאורים של הפונקציות והפרמטרים צריכים להיות ברורים וספציפיים מאוד. המודל מסתמך על הנתונים האלה כדי לבחור את הפונקציה הנכונה ולספק ארגומנטים מתאימים. לדוגמה, לפונקציה book_flight_ticket יכול להיות התיאור book flight tickets after confirming users' specific requirements, such as time, departure, destination, party size and preferred airline

שימוש בפרמטרים עם הקלדה חזקה

אם ערכי הפרמטרים הם מקבוצה סופית, צריך להוסיף שדה enum במקום להזין את קבוצת הערכים בתיאור. אם ערך הפרמטר הוא תמיד מספר שלם, מגדירים את הסוג בתור integer ולא בתור number.

בחירת כלי

אף על פי שהמודל יכול להשתמש במספר שרירותי של כלים, אם מספקים לו יותר מדי כלים, גדל הסיכון שהוא יבחר בכלי לא מתאים או לא אופטימלי. כדי לקבל את התוצאות הטובות ביותר, מומלץ לספק רק את הכלים הרלוונטיים להקשר או למשימה, ובאופן אידיאלי להגביל את הסט הפעיל ל-10 עד 20 כלים. אם יש לכם מספר גדול של כלים, כדאי לשקול בחירת כלים דינמית על סמך ההקשר של השיחה.

אם תספקו כלים כלליים ברמה נמוכה (כמו bash), יכול להיות שהמודל ישתמש בכלי לעיתים קרובות יותר, אבל עם פחות דיוק. אם תספקו כלי ספציפי ברמה גבוהה (כמו get_weather), המודל יוכל להשתמש בכלי בצורה מדויקת יותר, אבל יכול להיות שהוא לא ישתמש בו לעיתים קרובות.

שימוש בהוראות המערכת

כשמשתמשים בפונקציות עם פרמטרים של תאריך, שעה או מיקום, צריך לכלול בהוראות למערכת את התאריך, השעה או פרטי המיקום הרלוונטיים (לדוגמה, עיר ומדינה). כך המודל מקבל את ההקשר שדרוש לו כדי לעבד את הבקשה בצורה מדויקת, גם אם חסרים פרטים בהנחיה של המשתמש.

הנדסת פרומפטים

כדי לקבל את התוצאות הכי טובות, כדאי להוסיף את הפרטים הבאים לפני הנחיית המשתמש:

  • הקשר נוסף למודל – לדוגמה, You are a flight API assistant to help with searching flights based on user preferences.
  • פרטים או הוראות לגבי אופן השימוש בפונקציות ומתי להשתמש בהן, לדוגמה Don't make assumptions on the departure or destination airports. Always use a future date for the departure or destination time.
  • הוראות לשאילת שאלות הבהרה אם השאילתות של המשתמש לא ברורות – לדוגמה, Ask clarifying questions if not enough information is available.

שימוש בהגדרות של תהליך הייצור

בפרמטר הטמפרטורה, משתמשים בערך 0 או בערך נמוך אחר. ההנחיה הזו גורמת למודל ליצור תוצאות מהימנות יותר ומפחיתה את התופעה של הזיות.

שימוש בפלט מובנה

אפשר להשתמש בקריאה להפעלת פונקציות יחד עם פלט מובנה כדי שהמודל תמיד יחזה בקשות להפעלת פונקציות או פלטים שתואמים לסכימה ספציפית. כך תקבלו תשובות בפורמט עקבי כשהמודל לא יוצר בקשות להפעלת פונקציות.

אימות הקריאה ל-API

אם המודל מציע הפעלה של פונקציה שתשלח הזמנה, תעדכן מסד נתונים או תגרום לתוצאות משמעותיות אחרות, צריך לאמת את קריאת הפונקציה עם המשתמש לפני שמבצעים אותה.

שימוש בחתימות מחשבה

כדי לקבל את התוצאות הכי טובות, תמיד צריך להשתמש בחתימות של מחשבות עם קריאות לפונקציות.

תמחור

התמחור של קריאה להפעלת פונקציות מבוסס על מספר התווים בקלט ובפלט של הטקסט. מידע נוסף זמין במאמר בנושא תמחור של פלטפורמת הסוכנים של Gemini Enterprise.

במקרה הזה, קלט טקסט (פרומפט) מתייחס לפרומפט של המשתמש בתור הנוכחי של השיחה, להצהרות הפונקציה בתור הנוכחי של השיחה ולהיסטוריית השיחה. היסטוריית השיחה כוללת את השאילתות, בקשות להפעלת פונקציות והתשובות לפונקציות של תפניות קודמות בשיחה. פלטפורמת הסוכנים של Gemini Enterprise מקצרת את היסטוריית השיחה ל-32,000 תווים.

פלט טקסט (תשובה) מתייחס לבקשות להפעלת פונקציות ולתשובות הטקסט של התור הנוכחי בשיחה.

תרחישי שימוש של קריאה להפעלת פונקציות

אפשר להשתמש בהפעלת פונקציות למשימות הבאות:

תרחיש לדוגמה תיאור לדוגמה קישור לדוגמה
שילוב עם ממשקי API חיצוניים קבלת מידע על מזג האוויר באמצעות API מטאורולוגי מדריך ל-Notebook
המרת כתובות לקואורדינטות של קו רוחב/אורך מדריך בנושא Notebook
המרת מטבעות באמצעות API להמרת מטבעות Codelab
יצירת צ'אטבוטים מתקדמים לענות על שאלות של לקוחות לגבי מוצרים ושירותים מדריך בנושא Notebook
אפשר ליצור עוזר דיגיטלי שיענה על שאלות פיננסיות וחדשותיות לגבי חברות מדריך ל-Notebook
מבנה ושליטה בבקשות להפעלת פונקציות חילוץ ישויות מובְנות מנתוני יומן גולמיים מדריך ל-Notebook
חילוץ פרמטר אחד או כמה פרמטרים מהקלט של המשתמשים מדריך בנושא Notebook
טיפול ברשימות ובמבני נתונים מקוננים בקריאה להפעלת פונקציות מדריך ל-Notebook
הגדרת התנהגות של קריאות להפעלת פונקציות טיפול בקריאות להפעלת פונקציות ותשובות במקביל מדריך ל-Notebook
איך קובעים מתי ובאילו פונקציות המודל יכול להשתמש מדריך ל-Notebook
שליחת שאילתות למסדי נתונים בשפה טבעית המרת שאלות בשפה טבעית לשאילתות SQL ל-BigQuery אפליקציה לדוגמה
קריאה להפעלת פונקציות מולטי-מודאליות שימוש בתמונות, בסרטונים, בקובצי אודיו ובקובצי PDF כקלט להפעלת פונקציות מדריך בנושא Notebook

הנה עוד כמה תרחישי שימוש:

  • פרשנות של פקודות קוליות: יצירת פונקציות שתואמות למשימות שמתבצעות ברכב. לדוגמה, אתם יכולים ליצור פונקציות שמפעילות את הרדיו או את המזגן. שולחים למודל קובצי אודיו של פקודות קוליות של המשתמש, ומבקשים מהמודל להמיר את האודיו לטקסט ולזהות את הפונקציה שהמשתמש רוצה להפעיל.

  • אוטומציה של תהליכי עבודה על סמך טריגרים סביבתיים: יצירת פונקציות שמייצגות תהליכים שאפשר לבצע להם אוטומציה. מספקים למודל נתונים מחיישנים סביבתיים ומבקשים ממנו לנתח ולעבד את הנתונים כדי לקבוע אם צריך להפעיל אחד או יותר מהתהליכי העבודה. לדוגמה, מודל יכול לעבד נתוני טמפרטורה במחסן ולבחור להפעיל פונקציית ממטרה.

  • הקצאה אוטומטית של כרטיסי תמיכה: מספקים למודל כרטיסי תמיכה, יומנים וכללים מודעים-הקשר. מבקשים מהמודל לעבד את כל המידע הזה כדי לקבוע למי צריך להקצות את הפנייה. קוראים לפונקציה כדי להקצות את הכרטיס לאדם שהמודל הציע.

  • אחזור מידע מבסיס ידע: יצירת פונקציות לאחזור מאמרים אקדמיים בנושא מסוים וסיכומם. הפעלת המודל כדי שיענה על שאלות בנושאים אקדמיים ויספק ציטוטים לתשובות שלו.

המאמרים הבאים