Cloud Functions for Firebase ma metodę onCallGenkit, która umożliwia utworzenie funkcji wywoływalnej z działaniem Genkit (przepływem).
Te funkcje można wywoływać za pomocą genkit/beta/client lub Cloud Functions for Firebase Client SDK, które automatycznie dodają informacje uwierzytelniające.
Zanim zaczniesz
- Musisz znać koncepcję przepływów Genkit i wiedzieć, jak je pisać. Instrukcje na tej stronie zakładają, że masz już zdefiniowane przepływy, które chcesz wdrożyć.
- Jeśli masz już doświadczenie z Cloud Functions for Firebase, będzie Ci łatwiej, ale nie jest to wymagane.
Konfigurowanie projektu w Firebase
Utwórz nowy projekt w Firebase w konsoli Firebase lub wybierz istniejący.
Przejdź na abonament Blaze z płatnością według wykorzystania, który jest wymagany do wdrożenia produkcyjnego Cloud Functions.
Zainstaluj interfejs wiersza poleceń Firebase.
Zaloguj się w interfejsie wiersza poleceń Firebase:
firebase loginfirebase login --reauth # alternative, if necessaryfirebase login --no-localhost # if running in a remote shellUtwórz nowy katalog projektu:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1mkdir -p $PROJECT_ROOTZainicjuj projekt Firebase w katalogu:
cd $PROJECT_ROOTfirebase init functions
W dalszej części tej strony zakładamy, że funkcje zostały napisane w języku JavaScript.
Zawijaj przepływ w: onCallGenkit
Po skonfigurowaniu projektu w Firebase i zainicjowaniu w nim Cloud Functions możesz skopiować lub zapisać definicje przepływów w katalogu functions projektu. Oto przykładowy proces, który to ilustruje:
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; }, );
Aby wdrożyć taki przepływ, opakuj go za pomocą onCallGenkit, który jest dostępny w firebase-functions/https. Ta metoda pomocnicza ma wszystkie funkcje funkcji wywoływalnych i automatycznie obsługuje zarówno odpowiedzi strumieniowe, jak i odpowiedzi JSON.
const {onCallGenkit} = require("firebase-functions/https");
exports.tellJoke = onCallGenkit({ // Bind the Gemini API key secret parameter to the function. secrets: [apiKey], }, // Pass in the genkit flow. jokeTeller, );
Udostępnianie danych logowania interfejsu API wdrożonym przepływom
Po wdrożeniu przepływy muszą mieć możliwość uwierzytelniania w usługach zdalnych, na których polegają. Większość przepływów wymaga co najmniej danych logowania, aby uzyskać dostęp do usługi interfejsu API modelu, z której korzystają.
W tym przykładzie wykonaj jedną z tych czynności w zależności od wybranego dostawcy modelu:
Gemini (AI od Google)
Wygeneruj klucz interfejsu API dla Gemini Developer API za pomocą Google AI Studio.
Zapisz klucz interfejsu API w Google Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEYTen krok jest ważny, aby zapobiec przypadkowemu wyciekowi klucza interfejsu API, który zapewnia dostęp do potencjalnie płatnej usługi.
Więcej informacji o zarządzaniu obiektami tajnymi znajdziesz w artykule Przechowywanie poufnych informacji o konfiguracji i uzyskiwanie do nich dostępu.
Zmodyfikuj plik
src/index.jsi dodaj po istniejących instrukcjach importu te instrukcje:const {defineSecret} = require("firebase-functions/params");
// Store the Gemini API key in Cloud Secret Manager. const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
Następnie w definicji funkcji wywoływalnej zadeklaruj, że funkcja potrzebuje dostępu do tej wartości obiektu tajnego:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Teraz, gdy wdrożysz tę funkcję, klucz interfejsu API będzie przechowywany w usłudze Google Cloud Secret Manager i dostępny w środowisku Cloud Functions.
Gemini (Vertex AI)
W konsoli Google Cloud włącz interfejs Vertex AI API w projekcie w Firebase.
Na stronie Uprawnienia sprawdź, czy domyślne konto usługi Compute ma przypisaną rolę użytkownika Vertex AI.
Jedynym obiektem tajnym, który musisz skonfigurować na potrzeby tego samouczka, jest dostawca modelu, ale ogólnie musisz wykonać podobne czynności w przypadku każdej usługi, z której korzysta Twój przepływ.
(Opcjonalnie) Dodaj egzekwowanie zasad Firebase App Check
Firebase App Check używa natywnej atestacji, aby sprawdzić, czy nasz interfejs API jest wywoływany tylko przez Twoją aplikację. Metoda onCallGenkit obsługuje egzekwowanie App Check w sposób deklaratywny.
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);
Konfigurowanie CORS (współdzielenia zasobów pomiędzy serwerami z różnych domen)
Użyj opcji cors, aby określić, które źródła mogą uzyskiwać dostęp do Twojej funkcji.
Domyślnie funkcje wywoływalne mają skonfigurowaną konfigurację CORS, aby zezwalać na żądania ze wszystkich źródeł. Aby zezwolić na niektóre żądania współdzielenia, ale nie wszystkie, prześlij listę konkretnych domen lub wyrażeń regularnych, które powinny być dozwolone. Przykład:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Kompletny przykład
Po wprowadzeniu wszystkich zmian opisanych w tym przewodniku przepływ możliwy do wdrożenia będzie wyglądał mniej więcej tak:
const {onCallGenkit} = require("firebase-functions/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, );
Wdrażanie przepływów w Firebase
Po zdefiniowaniu przepływów za pomocą onCallGenkit możesz je wdrożyć tak samo jak inne funkcje:
cd $PROJECT_ROOTfirebase deploy --only functions