Genkit-Abläufe über Ihre App aufrufen

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 Authentifizierungsinformationen hinzugefügt werden.

Hinweis

  • Sie sollten mit dem Konzept von Genkit-Abläufen und deren Erstellung vertraut sein. Bei den Anleitungen auf dieser Seite wird davon ausgegangen, dass Sie bereits einige Abläufe 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

  1. Erstellen Sie ein neues Firebase-Projekt über die Firebase-Konsole oder wählen Sie ein vorhandenes Projekt aus.

  2. Führen Sie ein Upgrade des Projekts auf das Blaze-Preismodell (Pay as you go) durch, das für die Cloud Functions-Produktionsbereitstellung erforderlich ist.

  3. Installieren Sie Firebase CLI.

  4. Melden Sie sich in der Firebase-Befehlszeile an:

    firebase login
    firebase login --reauth # alternative, if necessary
    firebase login --no-localhost # if running in a remote shell
  5. Erstellen Sie ein neues Projektverzeichnis:

    export PROJECT_ROOT=~/tmp/genkit-firebase-project1
    mkdir -p $PROJECT_ROOT
  6. 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 schreiben.

Ablauf in onCallGenkit verpacken

Nachdem Sie ein Firebase-Projekt eingerichtet und Cloud Functions darin initialisiert haben, können Sie Ablaufdefinitionen in das Verzeichnis functions des Projekts kopieren oder schreiben. Hier ein Beispiel:

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, verpacken 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 müssen sich Ihre Abläufe bei allen Remote-Diensten authentifizieren, 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)

  1. Generieren Sie einen API-Schlüssel für die Gemini Developer API mit Google AI Studio.

  2. Speichern Sie Ihren API-Schlüssel in Google Cloud Secret Manager:

    firebase functions:secrets:set GOOGLE_GENAI_API_KEY

    Dieser Schritt ist wichtig, um zu verhindern, dass Ihr API-Schlüssel versehentlich preisgegeben wird, da er Zugriff auf einen potenziell kostenpflichtigen Dienst gewährt.

    Weitere Informationen zum Verwalten von Secrets finden Sie unter Vertrauliche Konfigurationsinformationen speichern und darauf zugreifen.

  3. 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 Secret-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 in der Cloud Functions-Umgebung verfügbar.

Gemini (Vertex AI)

  1. Aktivieren Sie in der Google Cloud-Konsole die Vertex AI API für Ihr Firebase-Projekt.

  2. Prüfen Sie auf der Seite IAM, ob dem Standard-Compute-Dienstkonto die Rolle Vertex AI-Nutzer zugewiesen ist.

Das einzige Secret, das Sie für diese Anleitung einrichten müssen, ist das für den Modellanbieter. Im Allgemeinen müssen Sie jedoch für jeden Dienst, den Ihr Ablauf verwendet, etwas Ähnliches tun.

(Optional) Firebase App Check-Erzwingung hinzufügen

Firebase App Check verwendet die native Attestierung, um zu prü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 zulässig sind. Wenn Sie einige, aber nicht alle ursprungsübergreifenden Anfragen zulassen möchten, übergeben Sie eine Liste bestimmter Domains oder regulärer Ausdrücke, 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 in 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 Abläufe mit onCallGenkit definiert haben, können Sie sie wie andere Funktionen bereitstellen:

cd $PROJECT_ROOT
firebase deploy --only functions