Cloud Functions para Firebase tiene un método onCallGenkit
que te permite
crear una función que se pueda llamar con una acción de Genkit (un flujo). Se puede llamar a estas funciones con genkit/beta/client
o los
SDK de cliente de Cloud Functions,
que agregan información de autenticación automáticamente.
Antes de comenzar
- Debes estar familiarizado con el concepto de flujos de Genkit y cómo escribirlos. En las instrucciones de esta página, se da por sentado que ya has definido algunos flujos que deseas implementar.
- Es útil, pero no obligatorio, que ya hayas usado Cloud Functions para Firebase.
Configura un proyecto de Firebase:
Crea un proyecto de Firebase nuevo con Firebase console o elige uno existente.
Actualiza el proyecto al plan Blaze, que es obligatorio para la implementación en producción de Cloud Functions.
Instala Firebase CLI.
Accede con Firebase CLI:
firebase login
firebase login --reauth # alternative, if necessary
firebase login --no-localhost # if running in a remote shell
Crea un directorio de proyecto nuevo:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1
mkdir -p $PROJECT_ROOT
Inicializa un proyecto de Firebase en el directorio:
cd $PROJECT_ROOT
firebase init functions
En el resto de esta página, se da por sentado que elegiste escribir tus funciones en JavaScript.
Une el flujo en onCallGenkit
Después de configurar un proyecto de Firebase con Cloud Functions, puedes copiar o escribir definiciones de flujo en el directorio functions
del proyecto. Este es un
flujo de ejemplo para demostrar esto:
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 implementar un flujo como este, únelo con onCallGenkit
, disponible en firebase-functions/https
. Este método de ayuda tiene todas las funciones de las funciones que se pueden llamar y admite automáticamente las respuestas JSON y de transmisión.
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,
);
Haz que las credenciales de la API estén disponibles para los flujos implementados
Una vez que se implementan, tus flujos necesitan una forma de autenticarse con los servicios remotos de los que dependen. Como mínimo, la mayoría de los flujos necesitan credenciales para acceder al servicio de la API del modelo que usan.
En este ejemplo, realiza una de las siguientes acciones según el proveedor del modelo que hayas elegido:
Gemini (IA de Google)
Asegúrate de que la IA de Google esté disponibles en tu región.
Genera una clave de API para la API de Gemini con Google AI Studio.
Almacena tu clave de API en Cloud Secret Manager
firebase functions:secrets:set GOOGLE_GENAI_API_KEY
Este paso es importante para evitar que se filtre accidentalmente tu clave de API, que otorga acceso a un servicio de potencial uso medido.
Consulta Almacena información de configuración sensible y accede a ella para obtener más información sobre cómo administrar secretos.
Edita
src/index.js
y agrega lo siguiente después de las importaciones existentes:const {defineSecret} = require("firebase-functions/params"); // Store the Gemini API key in Cloud Secret Manager. const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
Luego, en la definición de la función que se puede llamar, declara que la función necesita acceso a este valor secreto:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Ahora, cuando implementes esta función, tu clave de API se almacenará en Cloud Secret Manager y estará disponible desde el entorno de Cloud Functions.
Gemini (Vertex AI)
En la consola de Cloud, Habilita la API de Vertex AI para tu proyecto de Firebase.
En la página IAM asegúrate de que la cuenta de servicio de procesamiento predeterminada tenga otorgado el rol de usuario de Vertex AI.
El único secreto que debes configurar para este instructivo es para el proveedor del modelo, pero, en general, debes hacer algo similar para cada servicio que tu flujo use.
Agrega la aplicación forzosa de la Verificación de aplicaciones (opcional)
La Verificación de aplicaciones de Firebase usa la certificación nativa para verificar que solo tu aplicación llame a tu API.
onCallGenkit
admite la aplicación forzosa de la Verificación de aplicaciones 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);
Configura el CORS (uso compartido de recursos entre dominios)
Usa la opción cors
para controlar qué orígenes pueden acceder a tu función.
De forma predeterminada, las funciones que admiten llamadas tienen el CORS configurado para permitir solicitudes de todos los orígenes. Para permitir algunas solicitudes de origen cruzado, pero no todas, debes pasar una lista de dominios específicos o expresiones regulares que deberían permitirse. Por ejemplo:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Ejemplo completo
Después de realizar todos los cambios descritos anteriormente, tu flujo implementable se verá como en el siguiente ejemplo:
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,
);
Implementa flujos en Firebase
Después de definir flujos con onCallGenkit
, puedes implementarlos como implementarías otras funciones:
cd $PROJECT_ROOT
firebase deploy --only functions