O Cloud Functions para Firebase tem um método onCallGenkit
que permite
criar uma função que pode ser chamada com uma ação do Genkit (um fluxo). Essas funções podem ser chamadas com genkit/beta/client
ou os
SDKs do cliente do Cloud Functions,
que adicionam automaticamente informações de autenticação.
Antes de começar
- Você precisa conhecer o conceito de fluxos do Genkit e como programá-los. As instruções nesta página pressupõem que você já definiu alguns fluxos que quer implantar.
- Isso é útil, mas não obrigatório, se você já usou o Cloud Functions para Firebase.
Configurar um projeto do Firebase
Crie um novo projeto do Firebase usando o console do Firebase ou escolha um projeto atual.
Faça upgrade do projeto para o plano Blaze, que é necessário para a implantação de produção do Cloud Functions.
Instale a CLI do Firebase.
Faça login com a CLI do Firebase:
firebase login
firebase login --reauth # alternative, if necessary
firebase login --no-localhost # if running in a remote shell
Crie um novo diretório do projeto:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1
mkdir -p $PROJECT_ROOT
Inicialize um novo projeto do Firebase no diretório:
cd $PROJECT_ROOT
firebase init functions
O restante desta página pressupõe que você escolheu escrever suas funções em JavaScript.
Envolver o fluxo em onCallGenkit
Depois de configurar um projeto do Firebase com o Cloud Functions, é possível copiar ou
gravar definições de fluxo no diretório functions
do projeto. Confira um
exemplo de fluxo para demonstrar isso:
const ai = genkit({
plugins: [googleAI()],
model: gemini15Flash,
});
const jokeTeller = ai.defineFlow({
name: "jokeTeller",
inputSchema: z.string().nullable(),
outputSchema: z.string(),
streamSchema: z.string(),
}, async (jokeType = "knock-knock", {sendChunk}) => {
const prompt = `Tell me a ${jokeType} joke.`;
// Call the `generateStream()` method to
// receive the `stream` async iterable.
const {stream, response: aiResponse} = ai.generateStream(prompt);
// Send new words of the generative AI response
// to the client as they are generated.
for await (const chunk of stream) {
sendChunk(chunk.text);
}
// Return the full generative AI response
// to clients that may not support streaming.
return (await aiResponse).text;
},
);
Para implantar um fluxo como esse, envolva-o com onCallGenkit
, disponível em
firebase-functions/https
. Esse método auxiliar tem todos os recursos de funções
chamáveis e oferece suporte automático a
respostas de streaming e JSON.
const {onCallGenkit} = require("firebase-functions/v2/https");
exports.tellJoke = onCallGenkit({
// Bind the Gemini API key secret parameter to the function.
secrets: [apiKey],
},
// Pass in the genkit flow.
jokeTeller,
);
Disponibilizar credenciais da API para fluxos implantados
Depois de implantados, os fluxos precisam de uma maneira de se autenticar com todos os serviços remotos em que eles dependem. No mínimo, a maioria dos fluxos precisa de credenciais para acessar o serviço de API de modelo que eles usam.
Para este exemplo, siga um destes procedimentos, dependendo do provedor de modelos escolhido:
Gemini (IA do Google)
Garanta que a IA do Google disponíveis na sua região.
Gere uma chave de API para à API Gemini usando o Google AI Studio.
Armazene sua chave de API no Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEY
Essa etapa é importante para evitar o vazamento acidental da chave de API, que concede acesso a um serviço potencialmente medido.
Consulte Armazenar e acessar informações de configuração sensíveis para mais informações sobre como gerenciar secrets.
Edite
src/index.js
e adicione o seguinte após as importações atuais:const {defineSecret} = require("firebase-functions/params"); // Store the Gemini API key in Cloud Secret Manager. const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
Em seguida, na definição da função que pode ser chamada, declare que a função precisa ter acesso a esse valor secreto:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Agora, quando você implantar essa função, a chave da API será armazenada no Cloud Secret Manager e estará disponível no ambiente do Cloud Functions.
Gemini (Vertex AI)
No console do Cloud, Ative a API Vertex AI para seu projeto.
Na página IAM, verifique se a Conta de serviço padrão do Compute tem o papel de Usuário da Vertex AI.
O único secret que você precisa configurar para este tutorial é para o provedor de modelo, mas em geral, você precisa fazer algo semelhante para cada serviço que seu fluxo usa.
(Opcional) Adicionar a aplicação obrigatória do App Check
O Firebase App Check usa atestados
nativos para verificar se a API está sendo chamada apenas pelo seu aplicativo.
O onCallGenkit
oferece suporte à aplicação obrigatória do App Check de forma declarativa.
export const generatePoem = onCallGenkit({
enforceAppCheck: true,
// Optional. Makes App Check tokens only usable once. This adds extra security
// at the expense of slowing down your app to generate a token for every API
// call
consumeAppCheckToken: true,
}, generatePoemFlow);
Configurar CORS (Compartilhamento de recursos entre origens)
Use a opção cors
para controlar quais origens podem acessar a função.
Por padrão, as funções chamáveis têm o CORS configurado para permitir solicitações de todas as origens. Para permitir algumas solicitações de origem cruzada, mas não todas, transmita uma lista de domínios específicos ou expressões regulares que precisam ser permitidas. Por exemplo:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Exemplo completo
Depois de fazer todas as mudanças descritas acima, o fluxo de implantação vai ficar parecido com este exemplo:
const {onCallGenkit} = require("firebase-functions/v2/https");
const {defineSecret} = require("firebase-functions/params");
// Dependencies for Genkit.
const {gemini15Flash, googleAI} = require("@genkit-ai/googleai");
const {genkit, z} = require("genkit");
// Store the Gemini API key in Cloud Secret Manager.
const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
const ai = genkit({
plugins: [googleAI()],
model: gemini15Flash,
});
const jokeTeller = ai.defineFlow({
name: "jokeTeller",
inputSchema: z.string().nullable(),
outputSchema: z.string(),
streamSchema: z.string(),
}, async (jokeType = "knock-knock", {sendChunk}) => {
const prompt = `Tell me a ${jokeType} joke.`;
// Call the `generateStream()` method to
// receive the `stream` async iterable.
const {stream, response: aiResponse} = ai.generateStream(prompt);
// Send new words of the generative AI response
// to the client as they are generated.
for await (const chunk of stream) {
sendChunk(chunk.text);
}
// Return the full generative AI response
// to clients that may not support streaming.
return (await aiResponse).text;
},
);
exports.tellJoke = onCallGenkit({
// Bind the Gemini API key secret parameter to the function.
secrets: [apiKey],
},
// Pass in the genkit flow.
jokeTeller,
);
Implantar fluxos no Firebase
Depois de definir os fluxos usando onCallGenkit
, você pode implantá-los como faria com
outras funções:
cd $PROJECT_ROOT
firebase deploy --only functions