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ą pakietu genkit/beta/client
lub pakietów SDK klienta Cloud Functions, które automatycznie dodają informacje uwierzytelniające.
Zanim zaczniesz
- Powinieneś/powinnaś znać pojęcie przepływów w Genkit oraz sposób ich pisania. Instrukcje na tej stronie zakładają, że masz już zdefiniowane przepływy, które chcesz wdrożyć.
- Jest to przydatne, ale nie jest wymagane, jeśli korzystasz już z Cloud Functions dla Firebase.
Konfigurowanie projektu Firebase
Utwórz nowy projekt Firebase w konsoli Firebase lub wybierz istniejący.
Przejdź na abonament Blaze, który jest wymagany do wdrożenia Cloud Functions w środowisku produkcyjnym.
Zainstaluj Firebase CLI.
Zaloguj się za pomocą wiersza poleceń Firebase:
firebase login
firebase login --reauth # alternative, if necessary
firebase login --no-localhost # if running in a remote shell
Utwórz nowy katalog projektu:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1
mkdir -p $PROJECT_ROOT
Aby zainicjować projekt Firebase w katalogu:
cd $PROJECT_ROOT
firebase init functions
W dalszej części tej strony zakładamy, że funkcje zostały napisane w JavaScript.
Zawijaj proces w onCallGenkit
Po skonfigurowaniu projektu Firebase za pomocą Cloud Functions możesz kopiować lub pisać definicje przepływu w katalogu functions
projektu. Oto przykładowy przepływ danych:
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 proces, użyj funkcji onCallGenkit
, która jest dostępna w firebase-functions/https
. Ta metoda pomocnicza ma wszystkie funkcje funkcji wywoływalnych i automatycznie obsługuje zarówno przesyłanie strumieniowe, jak i odpowiedzi w formacie 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,
);
Udostępnianie danych logowania interfejsu API wdrożonym przepływom
Po wdrożeniu procesy muszą mieć możliwość uwierzytelniania się w usługach zdalnych, z których korzystają. Większość przepływów wymaga co najmniej danych logowania do interfejsu API modelu, którego używają.
W tym przykładzie wykonaj jedną z tych czynności w zależności od wybranego dostawcy modelu:
Gemini (Google AI)
Upewnij się, że Google AI jest dostępny 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_KEY
Ten krok jest ważny, ponieważ zapobiega przypadkowemu ujawnieniu klucza interfejsu API, który umożliwia dostęp do usługi z opłatą zależną od ilości danych.
Więcej informacji o zarządzaniu obiektami tajnymi znajdziesz w artykule Przechowywanie informacji o konfiguracji o charakterze poufnym i dostęp do nich.
Zmień plik
src/index.js
i dodaj po dotychczasowych instrukcjach importu te elementy: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 oświadcz, że funkcja potrzebuje dostępu do tej wartości tajnej:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Gdy teraz wdrożysz tę funkcję, klucz interfejsu API zostanie zapisany w usłudze Cloud Secret Manager i będzie dostępny z poziomu środowiska Cloud Functions.
Gemini (Vertex AI)
W konsoli Cloud włącz interfejs API Vertex AI w projekcie Firebase.
Na stronie Uprawnienia sprawdź, czy domyślnemu kontu usługi obliczeniowej przypisano rolę Użytkownik Vertex AI.
W tym samouczku musisz skonfigurować tylko jeden sekret – dla dostawcy modelu. Ogólnie jednak musisz wykonać podobne czynności w przypadku każdej usługi używanej przez przepływ danych.
(Opcjonalnie) Dodawanie wymuszania sprawdzania aplikacji
Sprawdzanie aplikacji Firebase korzysta z natywnego uwierzytelniania, aby potwierdzić, że interfejs API jest wywoływany tylko przez Twoją aplikację.
onCallGenkit
obsługuje deklaratywnie egzekwowanie weryfikacji aplikacji.
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ółdzielenie 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 funkcji.
Domyślnie funkcje wywoływane mają skonfigurowaną zasadę CORS, która zezwala na żądania ze wszystkich źródeł. Aby zezwolić na niektóre żądania między domenami, ale nie na 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);
Pełny przykład
Po wprowadzeniu wszystkich opisanych wyżej zmian proces wdrażania będzie wyglądał mniej więcej tak:
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,
);
Wdrażanie procesów w Firebase
Po zdefiniowaniu przepływów za pomocą funkcji onCallGenkit
możesz je wdrażać tak samo jak inne funkcje:
cd $PROJECT_ROOT
firebase deploy --only functions