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 Cloud Functions for Firebase Client SDK aufgerufen werden. In diesem Fall werden automatisch Autorisierungsinformationen hinzugefügt.
Hinweis
- Sie sollten mit dem Konzept von Genkit-Abläufen und dem Schreiben von Genkit-Abläufen vertraut sein. Die Anleitung auf dieser Seite setzt voraus, dass Sie bereits einige Flows definiert haben, die Sie bereitstellen möchten.
- Es ist hilfreich, aber nicht erforderlich, wenn Sie Cloud Functions for Firebase schon einmal verwendet haben.
Firebase-Projekt einrichten
Erstellen Sie ein neues Firebase-Projekt mit der Firebase-Konsole oder wählen Sie ein vorhandenes Projekt aus.
Führen Sie für das Projekt ein Upgrade auf den Blaze-Tarif (Pay as you go) durch, der 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.
Ablauf in onCallGenkit einfügen
Nachdem Sie ein Firebase-Projekt eingerichtet und Cloud Functions darin initialisiert haben, können Sie Flussdefinitionen in das Verzeichnis functions 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 Flows verfügbar machen
Nach der Bereitstellung benötigen Ihre Flows eine Möglichkeit zur Authentifizierung bei allen Remote-Diensten, auf die sie angewiesen sind. Die meisten Abläufe benötigen mindestens Anmeldedaten für den Zugriff auf den verwendeten Modell-API-Dienst.
Führen Sie für dieses Beispiel je nach ausgewähltem Modellanbieter einen der folgenden Schritte aus:
Gemini (Google AI)
API-Schlüssel für Gemini Developer API mit Google AI Studio generieren
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 preisgegeben wird. Dadurch könnte der Zugriff auf einen potenziell kostenpflichtigen Dienst ermöglicht werden.
Weitere Informationen zum Verwalten von Secrets finden Sie unter Vertrauliche Konfigurationsinformationen speichern und darauf zugreifen.
Bearbeiten Sie
src/index.jsund fügen Sie Folgendes nach den vorhandenen Importen 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 in der Google Cloud Console für Ihr Firebase-Projekt.
Achten Sie auf der Seite IAM darauf, dass dem Standarddienstkonto für Compute die Rolle Vertex AI-Nutzer zugewiesen ist.
Das einzige Secret, das Sie für diese Anleitung einrichten müssen, ist für den Modellanbieter. Im Allgemeinen müssen Sie jedoch für jeden Dienst, der in Ihrem Flow verwendet wird, 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 CORS für aufrufbare Funktionen 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 zulässig sein 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