Tutorial: chamada de funções com a API Gemini


A chamada de função facilita a geração de saídas de dados estruturados de modelos generativos. Assim, é possível usar essas saídas para chamar outras APIs e retornar os dados de resposta relevantes para o modelo. Em outras palavras, a chamada de função ajuda a conectar modelos generativos a sistemas externos para que o conteúdo gerado inclua as informações mais atualizadas e precisas.

É possível fornecer modelos do Gemini com descrições de funções. São funções que você escreve na linguagem do seu app (ou seja, não são funções do Google Cloud). O modelo pode pedir que você chame uma função e envie o resultado para ajudar o modelo a processar a consulta.

Se ainda não fez isso, confira a Introdução à chamada de função para saber mais.

Configurar seu projeto

Antes de chamar a API Gemini, você precisa configurar seu projeto, o que inclui a configuração da chave de API, a instalação do pacote do SDK e a inicialização do modelo.

Configurar uma chamada de função

Neste tutorial, o modelo vai interagir com uma API hipotética de troca de moedas compatível com os seguintes parâmetros:

Parâmetro Tipo Obrigatório Descrição
currencyFrom string sim Moeda de conversão
currencyTo string sim Moeda de conversão

Exemplo de solicitação de API

{
  "currencyFrom": "USD",
  "currencyTo": "SEK"
}

Exemplo de resposta da API

{
  "base": "USD",
  "rates": {"SEK": 0.091}
}

Etapa 1: criar a função que faz a solicitação de API

Comece criando a função que faz uma solicitação de API, caso ainda não tenha feito isso.

Para fins de demonstração neste tutorial, em vez de enviar uma solicitação de API real, você retornará valores fixados no código no mesmo formato que uma API real retornaria.

async function makeApiRequest(currencyFrom, currencyTo) {
  // This hypothetical API returns a JSON such as:
  // {"base":"USD","rates":{"SEK": 0.091}}
  return {
    base: currencyFrom,
    rates: { [currencyTo]: 0.091 },
  };
}

Etapa 2: criar uma declaração de função

Crie a declaração da função que você vai transmitir para o modelo generativo (próxima etapa deste tutorial).

Inclua o máximo de detalhes possível nas descrições da função e do parâmetro. O modelo generativo usa essas informações para determinar qual função selecionar e como fornecer valores para os parâmetros na chamada de função.

// Function declaration, to pass to the model.
const getExchangeRateFunctionDeclaration = {
  name: "getExchangeRate",
  parameters: {
    type: "OBJECT",
    description: "Get the exchange rate for currencies between countries",
    properties: {
      currencyFrom: {
        type: "STRING",
        description: "The currency to convert from.",
      },
      currencyTo: {
        type: "STRING",
        description: "The currency to convert to.",
      },
    },
    required: ["currencyTo", "currencyFrom"],
  },
};

// Executable function code. Put it in a map keyed by the function name
// so that you can call it once you get the name string from the model.
const functions = {
  getExchangeRate: ({ currencyFrom, currencyTo }) => {
    return makeApiRequest( currencyFrom, currencyTo)
  }
};

Etapa 3: especificar a declaração da função durante a inicialização do modelo

Especifique a declaração da função ao inicializar o modelo generativo definindo o parâmetro tools do modelo:

const { GoogleGenerativeAI } = require("@google/generative-ai");

// Access your API key as an environment variable (see "Set up your API key" above)
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

// ...

const generativeModel = genAI.getGenerativeModel({
  // Use a model that supports function calling, like a Gemini 1.5 model
  model: "gemini-1.5-flash",

  // Specify the function declaration.
  tools: {
    functionDeclarations: [getExchangeRateFunctionDeclaration],
  },
});

Etapa 4: gerar uma chamada de função

Agora é possível solicitar o modelo com a função definida.

A maneira recomendada de usar a chamada de funções é pela interface de chat, já que as chamadas de função se encaixam perfeitamente na estrutura de várias interações do chat.

const chat = generativeModel.startChat();
const prompt = "How much is 50 US dollars worth in Swedish krona?";

// Send the message to the model.
const result = await chat.sendMessage(prompt);

// For simplicity, this uses the first function call found.
const call = result.response.functionCalls()[0];

if (call) {
  // Call the executable function named in the function call
  // with the arguments specified in the function call and
  // let it call the hypothetical API.
  const apiResponse = await functions[call.name](call.args);

  // Send the API response back to the model so it can generate
  // a text response that can be displayed to the user.
  const result2 = await chat.sendMessage([{functionResponse: {
    name: 'getExchangeRate',
    response: apiResponse
  }}]);

  // Log the text response.
  console.log(result2.response.text());
}