Cloud Functions for Firebase hat eine onCallGenkit-Methode, mit der Sie eine aufrufbare Funktion mit einer Genkit-Aktion (einem Ablauf) erstellen können.
Diese Funktionen können mit genkit/beta/client oder einem Cloud Functions for Firebase Client SDK aufgerufen werden, wodurch automatisch Autorisierungsinformationen hinzugefügt werden.
Hinweis
- Sie sollten mit dem Konzept von Genkit-Abläufen und dem Schreiben von -Abläufen vertraut sein. Bei der Anleitung auf dieser Seite wird davon ausgegangen, dass Sie bereits einige Flows definiert haben, die Sie bereitstellen möchten.
- Es ist hilfreich, aber nicht erforderlich, wenn Sie Cloud Functions for Firebase bereits verwendet haben.
Firebase-Projekt einrichten
Erstellen Sie ein neues Firebase-Projekt über die Firebase-Konsole oder wählen Sie ein vorhandenes Projekt aus.
Führen Sie für das Projekt ein Upgrade auf das Blaze-Preismodell (Pay as you go) durch, das für die Bereitstellung in der Produktion von Cloud Functions erforderlich ist.
Installieren Sie Firebase CLI.
Melden Sie sich in der Firebase CLI an:
firebase loginfirebase login --reauth # alternative, if necessaryfirebase login --no-localhost # if running in a remote shellErstellen Sie ein neues Projektverzeichnis:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1mkdir -p $PROJECT_ROOTInitialisieren Sie ein Firebase-Projekt im Verzeichnis:
cd $PROJECT_ROOTfirebase init functions
Im weiteren Verlauf dieser Seite wird davon ausgegangen, dass Sie Ihre Funktionen in JavaScript schreiben.
Umschließe den Ablauf mit onCallGenkit.
Nachdem Sie ein Firebase-Projekt eingerichtet und Cloud Functions darin initialisiert haben, können Sie Flussdefinitionen in das functions-Verzeichnis des Projekts kopieren oder schreiben. Hier ist ein Beispiel für einen Ablauf, der dies veranschaulicht:
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; }, );
Wenn Sie einen solchen Ablauf bereitstellen möchten, umschließen Sie ihn mit onCallGenkit, das in firebase-functions/https verfügbar ist. Diese Hilfsmethode bietet alle Funktionen von aufrufbaren Funktionen und unterstützt automatisch sowohl Streaming- als auch JSON-Antworten.
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, );
API-Anmeldedaten für bereitgestellte Abläufe verfügbar machen
Nach der Bereitstellung benötigen Ihre Flows eine Möglichkeit, sich bei allen Remote-Diensten zu authentifizieren, auf die sie angewiesen sind. Die meisten Abläufe benötigen mindestens Anmeldedaten für den Zugriff auf den Modell-API-Dienst, den sie verwenden.
Führen Sie für dieses Beispiel je nach ausgewähltem Modellanbieter einen der folgenden Schritte aus:
Gemini (Google AI)
Generieren Sie einen API-Schlüssel für Gemini Developer API mit Google AI Studio.
Speichern Sie Ihren API-Schlüssel in Google Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEYDieser Schritt ist wichtig, um zu verhindern, dass Ihr API-Schlüssel versehentlich weitergegeben wird. Er gewährt Zugriff auf einen Dienst, der möglicherweise abgerechnet wird.
Weitere Informationen zum Verwalten von Secrets finden Sie unter Vertrauliche Konfigurationsinformationen speichern und darauf zugreifen.
Bearbeiten Sie
src/index.jsund fügen Sie nach den vorhandenen Importen Folgendes hinzu:const {defineSecret} = require("firebase-functions/params");
// Store the Gemini API key in Cloud Secret Manager. const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
Deklarieren Sie dann in der Definition der aufrufbaren Funktion, dass die Funktion Zugriff auf diesen geheimen Wert benötigt:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Wenn Sie diese Funktion jetzt bereitstellen, wird Ihr API-Schlüssel in Google Cloud Secret Manager gespeichert und ist über die Cloud Functions-Umgebung verfügbar.
Gemini (Vertex AI)
Aktivieren Sie die Vertex AI API für Ihr Firebase-Projekt in der Google CloudConsole.
Prüfen Sie auf der Seite IAM>, ob dem Standarddienstkonto für Compute die Rolle Vertex AI-Nutzer zugewiesen ist.
Das einzige Secret, das Sie für dieses Tutorial einrichten müssen, ist für den Modellanbieter. Im Allgemeinen müssen Sie jedoch für jeden Dienst, den Ihr Flow verwendet, etwas Ähnliches tun.
Optional: Firebase App Check-Erzwingung hinzufügen
Firebase App Check verwendet die native Attestierung, um zu überprüfen, ob unsere API nur von Ihrer Anwendung aufgerufen wird. Die Methode onCallGenkit unterstützt die deklarative Erzwingung von App Check.
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);
CORS (Cross-Origin Resource Sharing) konfigurieren
Mit der Option cors können Sie steuern, welche Ursprünge auf Ihre Funktion zugreifen können.
Standardmäßig ist für aufrufbare Funktionen CORS so konfiguriert, dass Anfragen von allen Ursprüngen zugelassen werden. Wenn Sie einige, aber nicht alle ursprungsübergreifenden Anfragen zulassen möchten, übergeben Sie eine Liste mit bestimmten Domains oder regulären Ausdrücken, die zugelassen werden sollen. Beispiel:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Vollständiges Beispiel
Nachdem Sie alle in diesem Leitfaden beschriebenen Änderungen vorgenommen haben, sieht Ihr bereitstellbarer Ablauf etwa so aus:
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, );
Abläufe in Firebase bereitstellen
Nachdem Sie Flows mit onCallGenkit definiert haben, können Sie sie wie andere Funktionen bereitstellen:
cd $PROJECT_ROOTfirebase deploy --only functions