Cloud Functions dla Firebase ma metodę onCallGenkit, która umożliwia
tworzenie funkcji wywoływalnej za pomocą działania Genkit (przepływu). Te funkcje można wywoływać za pomocą genkit/beta/client lub
pakietów SDK klienta Cloud Functions,
które automatycznie dodają informacje o autoryzacji.
Zanim zaczniesz
- Powinieneś(-aś) znać koncepcję przepływów 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 wcześniej korzystałeś(-aś) z Cloud Functions dla Firebase, będzie to pomocne, ale nie jest wymagane.
Konfigurowanie projektu w Firebase
Utwórz nowy projekt w Firebase w konsoli Firebase lub wybierz istniejący.
Przenieś projekt na abonament Blaze, który jest wymagany do wdrożenia produkcyjnego Cloud Functions.
Zainstaluj wiersz poleceń Firebase.
Zaloguj się w wierszu 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 w Firebase w katalogu:
cd $PROJECT_ROOTfirebase init functions
Dalsza część tej strony zakłada, że funkcje będziesz pisać w JavaScript.
Zawijanie przepływu w onCallGenkit
Po skonfigurowaniu projektu w Firebase za pomocą Cloud Functions możesz skopiować lub napisać definicje przepływów w katalogu functions projektu. Oto przykładowy przepływ:
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, zawij go w onCallGenkit, który jest dostępny w firebase-functions/https. Ta metoda pomocnicza ma wszystkie funkcje wywoływalnych
funkcji i automatycznie obsługuje odpowiedzi strumieniowe i 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 do interfejsu API wdrożonym przepływom
Po wdrożeniu przepływy muszą mieć możliwość uwierzytelniania się w usługach zdalnych, z których korzystają. Większość przepływów potrzebuje co najmniej danych logowania 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)
Upewnij się, że AI od Google jest dostępna w Twoim regionie.
Wygeneruj klucz interfejsu API dla Gemini API za pomocą Google AI Studio.
Zapisz klucz interfejsu API w usłudze Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEYTen krok jest ważny, aby zapobiec przypadkowemu wyciekowi klucza interfejsu API, który umożliwia dostęp do usługi rozliczanej według zużycia.
Więcej informacji o zarządzaniu tajnymi kluczami znajdziesz w artykule Przechowywanie poufnych informacji o konfiguracji i uzyskiwanie do nich dostępu.
Edytuj plik
src/index.jsi po istniejących importach dodaj ten kod: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 tajnej:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Teraz, gdy wdrożysz tę funkcję, klucz interfejsu API zostanie zapisany w usłudze Cloud Secret Manager i będzie dostępny w środowisku Cloud Functions.
Gemini (Vertex AI)
W konsoli Cloud włącz interfejs Vertex AI API w projekcie w Firebase.
Na stronie IAM upewnij się, że domyślne konto usługi Compute Engine ma przypisaną rolę Użytkownik Vertex AI.
W tym samouczku musisz skonfigurować tylko obiekt tajny dostawcy modelu, ale ogólnie musisz zrobić coś podobnego w przypadku każdej usługi, z której korzysta Twój flow.
(Opcjonalnie) Dodawanie egzekwowania sprawdzania aplikacji
Sprawdzanie aplikacji Firebase używa natywnego
potwierdzenia, aby sprawdzić, czy interfejs API jest wywoływany tylko przez Twoją aplikację.
onCallGenkit obsługuje egzekwowanie sprawdzania aplikacji deklaratywnie.
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 mię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ą skonfigurowane CORS tak, aby zezwalać na żądania ze wszystkich źródeł. Aby zezwolić na niektóre żądania z różnych źródeł, ale nie na wszystkie, przekaż listę konkretnych domen lub wyrażeń regularnych, które powinny być dozwolone. Przykład:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Pełny przykład
Po wprowadzeniu wszystkich opisanych powyżej zmian wdrożony przepływ będzie wyglądać podobnie do tego przykładu:
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