Genkit-Abläufe über Ihre App aufrufen

Cloud Functions for Firebase bietet die Methode onCallGenkit, 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, das automatisch Authentifizierungsinformationen hinzufügt.

Hinweis

  • Sie sollten mit dem Konzept von Genkit Abläufen und dem Schreiben von Abläufen 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 zuvor verwendet haben.

Firebase-Projekt einrichten

  1. Erstellen Sie in der Firebase Console ein neues Firebase-Projekt oder wählen Sie ein vorhandenes aus.

  2. Aktualisieren Sie das Projekt auf das Blaze-Preismodell (Pay as you go), das für die Cloud Functions Produktionsbereitstellung erforderlich ist.

  3. Installieren Sie die Firebase CLI.

  4. Melden Sie sich in der Firebase CLI 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 Rest dieser Anleitung wird davon ausgegangen, dass Sie Ihre Funktionen in JavaScript schreiben.

Ablauf in onCallGenkit einbinden

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 ist ein Beispielablauf, um dies zu veranschaulichen:

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, binden Sie ihn mit onCallGenkit ein, 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 Abläufe 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 API-Dienst des verwendeten Modells.

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 weitergegeben wird. Mit diesem Schlüssel erhalten Sie Zugriff auf einen potenziell kostenpflichtigen Dienst.

    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. Achten Sie auf der IAM Seite, darauf, dass dem Standardmäßigen Compute-Dienstkonto die Vertex AI-Nutzer Rolle 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 onCallGenkit Methode unterstützt App Check Erzwingung 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 Cross-Origin-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 dieser Anleitung beschriebenen Änderungen vorgenommen haben, sieht Ihr bereitstellbarer Ablauf in etwa so aus wie im folgenden Beispiel:

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