A chamada de função, também conhecida como uso de ferramentas, fornece ao LLM definições de ferramentas externas (por exemplo, uma função get_current_weather
). Ao processar uma instrução, o modelo determina de forma inteligente se uma ferramenta é necessária e, se for, gera dados estruturados que especificam a ferramenta a ser chamada e os parâmetros dela (por exemplo, get_current_weather(location='Boston')
). Em seguida, o aplicativo executa essa ferramenta e envia o resultado de volta ao modelo, permitindo que ele conclua a resposta com informações dinâmicas do mundo real ou o resultado de uma ação. Isso conecta o LLM aos seus sistemas e amplia os recursos dele.
As chamadas de função permitem dois casos de uso principais:
Busca de dados: extraia informações atualizadas para respostas de modelos, como clima atual, conversão de moeda ou dados específicos de bases de conhecimento e APIs (RAG).
Tomar medidas: realizar operações externas, como enviar formulários, atualizar o estado do aplicativo ou orquestrar fluxos de trabalho de agentes (por exemplo, transferências de conversa). Confira mais casos de uso e exemplos com base em chamadas de função aqui.
Recursos e limitações
Os modelos a seguir oferecem suporte à chamada de função:
- Gemini 2.5 Flash com áudio nativo da API Live
Prévia - Flash 2.0 do Gemini com a API Live
Pré-lançamento - Vertex AI Model Optimizer
Experimental - Gemini 2.5 Pro
Pré-lançamento - Gemini 2.5 Flash
Pré-lançamento - Gemini 2.0 Flash
- Gemini 2.0 Flash-Lite
- Gemini 2.5 Flash com áudio nativo da API Live
É possível especificar até 128
FunctionDeclarations
.Defina suas funções no formato do esquema da OpenAPI.
Para conferir as práticas recomendadas relacionadas às declarações de função, incluindo dicas para nomes e descrições, consulte Práticas recomendadas.
Como criar um aplicativo de chamada de função
Para usar a chamada de função, execute as seguintes tarefas:
Etapa 1: enviar o comando e as declarações de função para o modelo
Declare um Tool
em um formato de esquema compatível com o esquema da OpenAPI. Para mais informações, consulte Exemplos de esquemas.
Os exemplos a seguir enviam uma instrução e uma declaração de função ao modelo.
REST
PROJECT_ID=myproject
LOCATION=us-central1
MODEL_ID=gemini-2.0-flash-001
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"
]
}
}
]
}]
}'
Python
Você pode especificar o esquema manualmente usando um dicionário Python ou automaticamente com a função auxiliar from_func
. O exemplo a seguir demonstra como declarar uma função manualmente.
import vertexai
from vertexai.generative_models import (
Content,
FunctionDeclaration,
GenerationConfig,
GenerativeModel,
Part,
Tool,
ToolConfig
)
# Initialize Vertex AI
# TODO(developer): Update the project
vertexai.init(project="PROJECT_ID", location="us-central1")
# Initialize Gemini model
model = GenerativeModel(model_name="gemini-2.0-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],
)
]
)
Como alternativa, declare a função automaticamente com a função auxiliar from_func
, conforme mostrado no exemplo a seguir:
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
Este exemplo demonstra um cenário de texto com uma só função e um só comando.
Node.js
Antes de testar essa amostra, siga as instruções de configuração para Node.js Guia de início rápido da Vertex AI: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vertex AI para Node.js.
Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Go
Este exemplo demonstra um cenário de texto com uma só função e um só comando.
Saiba como instalar ou atualizar o Gen AI SDK for Go.
Para saber mais, consulte a documentação de referência do SDK.
Defina variáveis de ambiente para usar o SDK da IA generativa com a 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_VERTEXAI=True
C#
Este exemplo demonstra um cenário de texto com uma só função e um só comando.
C#
Antes de testar esse exemplo, siga as instruções de configuração para C# no Guia de início rápido da Vertex AI sobre como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vertex AI para C#.
Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Java
Java
Antes de testar esse exemplo, siga as instruções de configuração para Java no Guia de início rápido da Vertex AI sobre como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vertex AI para Java.
Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Se o modelo determinar que precisa da saída de uma função específica, a resposta que o aplicativo recebe do modelo conterá o nome da função e os valores de parâmetro com os quais a função precisa ser chamada.
Veja a seguir um exemplo de resposta de modelo para o comando do usuário "Como está o clima em Boston?". O modelo propõe chamar a função get_current_weather
com o parâmetro Boston, MA
.
candidates { content { role: "model" parts { function_call { name: "get_current_weather" args { fields { key: "location" value { string_value: "Boston, MA" } } } } } } ... }
Etapa 2: fornecer a saída da API ao modelo
Invoque a API externa e transmita a saída dela de volta ao modelo.
O exemplo a seguir usa dados sintéticos para simular um payload de resposta de uma API externa e envia a saída de volta ao modelo.
REST
PROJECT_ID=myproject
MODEL_ID=gemini-2.0-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"
]
}
}
]
}
]
}'
Python
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)
Para conferir as práticas recomendadas relacionadas à invocação de API, consulte Práticas recomendadas: invocação de API.
Se o modelo propôs várias chamadas de função paralelas, o aplicativo precisa fornecer todas as respostas de volta ao modelo. Para saber mais, consulte o Exemplo de chamada de função paralela.
O modelo pode determinar que a saída de outra função é necessária para responder ao comando. Nesse caso, a resposta que o aplicativo recebe do modelo contém outro nome de função e outro conjunto de valores de parâmetro.
Se o modelo determinar que a resposta da API é suficiente para responder ao comando do usuário, ele criará uma resposta com linguagem natural e a retornará para o aplicativo. Nesse caso, o aplicativo precisa transmitir a resposta de volta ao usuário. Confira a seguir um exemplo de resposta de linguagem natural:
It is currently 38 degrees Fahrenheit in Boston, MA with partly cloudy skies.
Chamada de função paralela
Para comandos como "Receber detalhes do clima em Boston e São Francisco?", o modelo pode propor várias chamadas de função paralelas. Para conferir uma lista de modelos que oferecem suporte à chamada de função paralela, consulte Modelos compatíveis.
REST
Este exemplo demonstra um cenário com uma função get_current_weather
.
O comando do usuário é "Receber detalhes do clima em Boston e São Francisco?". O
modelo propõe duas chamadas de função get_current_weather
paralelas: uma com o
parâmetro Boston
e outra com o parâmetro San Francisco
.
Para saber mais sobre os parâmetros de solicitação, consulte a API Gemini.
{ "candidates": [ { "content": { "role": "model", "parts": [ { "functionCall": { "name": "get_current_weather", "args": { "location": "Boston" } } }, { "functionCall": { "name": "get_current_weather", "args": { "location": "San Francisco" } } } ] }, ... } ], ... }
O comando a seguir demonstra como fornecer a saída da função para o modelo. Substitua my-project pelo nome do Google Cloud projeto.
Solicitação de modelo
PROJECT_ID=my-project MODEL_ID=gemini-2.0-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" ] } } ] } ] }'
A resposta de linguagem natural criada pelo modelo é semelhante a esta:
Resposta do modelo
[ { "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
Este exemplo demonstra um cenário com uma função get_current_weather
.
O comando do usuário é "Como está o clima em Boston e São Francisco?".
Substitua my-project pelo nome do Google Cloud projeto.
import vertexai
from vertexai.generative_models import (
Content,
FunctionDeclaration,
GenerationConfig,
GenerativeModel,
Part,
Tool,
ToolConfig
)
# Initialize Vertex AI
# TODO(developer): Update the project
vertexai.init(project="my-project", location="us-central1")
# Initialize Gemini model
model = GenerativeModel(model_name="gemini-2.0-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],
)
]
)
O comando a seguir demonstra como fornecer a saída da função para o modelo.
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)
Go
Chamada de função forçada
Em vez de permitir que o modelo escolha entre uma resposta de linguagem natural e uma chamada de função, é possível forçar o modelo a prever apenas chamadas de função. Isso é conhecido como chamada de função forçada. Também é possível fornecer ao modelo um conjunto completo de declarações de função, mas restringir as respostas a um subconjunto dessas funções.
Modo | Descrição |
---|---|
AUTO |
O comportamento padrão do modelo. O modelo decide se quer prever chamadas de função ou uma resposta de linguagem natural. |
ANY |
O modelo é restrito a sempre prever uma chamada de função. Se allowed_function_names não for fornecido, o modelo vai escolher entre todas as declarações de função disponíveis. Se allowed_function_names for fornecido, o modelo vai escolher entre o conjunto de funções permitidas. |
NONE |
O modelo não deve prever chamadas de função. Esse comportamento é equivalente a uma solicitação de modelo sem declarações de função associadas. |
O exemplo a seguir é forçado a prever apenas chamadas de função 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"],
)
)
)
Exemplos de esquema de função
As declarações de função são compatíveis com o esquema da OpenAPI. Os seguintes atributos são aceitos: type
, nullable
, required
, format
, description
, properties
, items
, enum
, anyOf
, $ref
e $defs
. Os outros atributos não são compatíveis.
Função com parâmetros de objeto e matriz
O exemplo a seguir usa um dicionário Python para declarar uma função que usa parâmetros de objeto e matriz:
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"], }, )
Função com parâmetro de tipo enumerado
O exemplo a seguir usa um dicionário Python para declarar uma função que recebe um parâmetro "enum" inteiro:
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. } }, }, )
Função com ref e def
A declaração de função JSON a seguir usa os atributos ref
e 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" } } } } ] } ] }
Observações sobre o uso:
- Ao contrário do esquema da OpenAPI, especifique
ref
edefs
sem o símbolo$
. ref
precisa se referir ao filho direto dedefs
. Não são permitidas referências externas.- A profundidade máxima do esquema aninhado é 32.
- A profundidade de recursão em
defs
(autoreferência) é limitada a duas.
from_func
com parâmetro de matriz
O exemplo de código abaixo declara uma função que multiplica uma matriz de números e usa from_func
para gerar o esquema 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'}} """
Práticas recomendadas para chamadas de função
Escreva nomes de funções, descrições de parâmetros e instruções claros e detalhados
Os nomes de função precisam começar com uma letra ou sublinhado e conter apenas caracteres a-z, A-Z, 0-9, sublinhados, pontos ou traços com um comprimento máximo de 64.
As descrições das funções precisam ser claras e detalhadas. Por exemplo, uma função
book_flight_ticket
pode ter a descriçãobook flight tickets after confirming users' specific requirements, such as time, departure, destination, party size and preferred airline
Usar parâmetros fortemente tipados
Se os valores de parâmetro forem de um conjunto finito, adicione um campo enum
em vez de colocar o conjunto de valores na descrição. Se o valor do parâmetro for sempre um número inteiro, defina o tipo como integer
em vez de number
.
Usar as instruções de sistema
Ao usar funções com parâmetros de data, hora ou local, inclua a data, a hora ou as informações de local relevantes (por exemplo, cidade e país) na instrução do sistema. Isso fornece ao modelo o contexto necessário para processar a solicitação com precisão, mesmo que a solicitação do usuário não tenha detalhes.
Atualizar o comando do usuário
Para melhores resultados, adicione ao início os seguintes detalhes antes do comando do usuário:
- Contexto adicional para o modelo, por exemplo,
You are a flight API assistant to help with searching flights based on user preferences.
. - Detalhes ou instruções sobre como e quando usar as funções, por exemplo,
Don't make assumptions on the departure or destination airports. Always use a future date for the departure or destination time.
- Instruções para fazer perguntas esclarecedoras se as consultas do usuário forem ambíguas, por exemplo,
Ask clarifying questions if not enough information is available.
Usar a configuração de geração
Para o parâmetro de temperatura, use 0
ou outro valor baixo. Isso instrui o modelo a gerar resultados mais confiáveis e reduz alucinações.
Validar a chamada de API
Se o modelo propor a invocação de uma função que envia uma ordem, atualiza um banco de dados ou tem consequências significativas, valide a chamada de função com o usuário antes de executá-la.
Preços
Os preços da chamada de funções são baseados no número de caracteres nas entradas e saídas de texto. Para saber mais, consulte os preços da Vertex AI.
Aqui, a entrada de texto (comando) se refere ao comando do usuário sobre o turno da conversa atual, as declarações de função para o turno da conversa atual e o histórico da conversa. O histórico da conversa inclui as consultas, as chamadas de função e as respostas de função das interações anteriores. A Vertex AI trunca o histórico da conversa em 32.000 caracteres.
Saída de texto (resposta) refere-se às chamadas de função e às respostas de texto da rodada de conversa atual.
A seguir
Consulte a referência da API para chamada de função.
Saiba mais sobre o Vertex AI Agent Engine.