Cloud Functions for Firebase bietet die Methode onCallGenkit
, mit der Sie eine aufrufbare Funktion mit einer Genkit-Aktion (einem Flow) erstellen können. Diese Funktionen können mit genkit/beta/client
oder den Cloud Functions-Client-SDKs aufgerufen werden, die automatisch Authentifizierungsinformationen hinzufügen.
Hinweis
- Sie sollten mit dem Genkit-Konzept von Abläufen und deren Erstellung vertraut sein. Bei den Anleitungen auf dieser Seite wird davon ausgegangen, dass Sie bereits einige Workflows 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 in der Firebase Console oder wählen Sie ein vorhandenes Projekt aus.
Führen Sie ein Upgrade des Projekts auf den Blaze-Tarif durch, der für die Produktionsbereitstellung von Cloud Functions erforderlich ist.
Installieren Sie die Firebase CLI.
Melden Sie sich mit der Firebase CLI an:
firebase login
firebase login --reauth # alternative, if necessary
firebase login --no-localhost # if running in a remote shell
Erstellen Sie ein neues Projektverzeichnis:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1
mkdir -p $PROJECT_ROOT
Initialisieren Sie ein Firebase-Projekt im Verzeichnis:
cd $PROJECT_ROOT
firebase init functions
Im weiteren Verlauf dieser Seite wird davon ausgegangen, dass Sie Ihre Funktionen in JavaScript geschrieben haben.
Ablauf in onCallGenkit
einschließen
Nachdem Sie ein Firebase-Projekt mit Cloud Functions eingerichtet haben, können Sie Ablaufdefinitionen in das functions
-Verzeichnis des Projekts kopieren oder schreiben. Hier ist ein Beispielablauf, 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, müssen Sie ihn in onCallGenkit
einschließen, 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/v2/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 müssen sich Ihre Workflows bei allen Remote-Diensten authentifizieren können, auf die sie angewiesen sind. Für die meisten Abläufe sind mindestens Anmeldedaten für den Zugriff auf den verwendeten Modell-API-Dienst erforderlich.
Führen Sie in diesem Beispiel je nach ausgewähltem Modellanbieter einen der folgenden Schritte aus:
Gemini (Google AI)
Prüfen Sie, ob Google AI in Ihrer Region verfügbar ist.
Erstellen Sie einen API-Schlüssel für die Gemini API mit Google AI Studio.
So speichern Sie Ihren API-Schlüssel in Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEY
Dieser Schritt ist wichtig, um zu verhindern, dass Ihr API-Schlüssel versehentlich weitergegeben wird, wodurch Zugriff auf einen potenziell befristeten Dienst gewährt wird.
Weitere Informationen zum Verwalten von Secrets finden Sie unter Sensible Konfigurationsinformationen speichern und abrufen.
Bearbeiten Sie
src/index.js
und 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 Cloud Secret Manager gespeichert und ist über die Cloud Functions-Umgebung verfügbar.
Gemini (Vertex AI)
Aktivieren Sie in der Cloud Console die Vertex AI API für Ihr Firebase-Projekt.
Achten Sie darauf, dass dem Standarddienstkonto für Compute auf der Seite IAM die Rolle Vertex AI-Nutzer zugewiesen ist.
Für diese Anleitung müssen Sie nur ein Secret für den Modellanbieter einrichten. Im Allgemeinen müssen Sie jedoch für jeden Dienst, den Ihr Flow verwendet, etwas Ähnliches tun.
Optional: Erzwingung der App-Überprüfung hinzufügen
Firebase App Check verwendet native Attestierung, um zu überprüfen, ob Ihre API nur von Ihrer Anwendung aufgerufen wird.
onCallGenkit
unterstützt die App-Überprüfung deklarativ.
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 plattformübergreifenden Anfragen zulassen möchten, geben Sie eine Liste mit bestimmten Domains oder regulären Ausdrücken an, die zulässig sein sollen. Beispiel:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Vollständiges Beispiel
Nachdem Sie alle oben beschriebenen Änderungen vorgenommen haben, sollte Ihr implementierbarer Ablauf in etwa so aussehen:
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,
);
Abläufe in Firebase bereitstellen
Nachdem Sie Workflows mit onCallGenkit
definiert haben, können Sie sie wie andere Funktionen bereitstellen:
cd $PROJECT_ROOT
firebase deploy --only functions