Abläufe

Abläufe sind Funktionen mit einigen zusätzlichen Eigenschaften: Sie sind stark typisiert, streambar, lokal und aus der Ferne aufrufbar und vollständig beobachtbar. Firebase Genkit bietet eine CLI und eine Entwickler-UI für die Arbeit mit Abläufen (z. B. Ausführen und Debuggen).

Datenflüsse definieren

import { defineFlow } from '@genkit-ai/flow';

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
  },
  async (restaurantTheme) => {
    const suggestion = makeMenuItemSuggestion(restaurantTheme);

    return suggestion;
  }
);

Eingabe- und Ausgabeschemas für Abläufe können mit zod definiert werden.

import { defineFlow } from '@genkit-ai/flow';
import * as z from 'zod';

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
    inputSchema: z.string(),
    outputSchema: z.string(),
  },
  async (restaurantTheme) => {
    const suggestion = makeMenuItemSuggestion(input.restaurantTheme);

    return suggestion;
  }
);

Wenn ein Schema angegeben ist, validiert Genkit das Schema für Eingaben und Ausgaben.

Laufende Datenflüsse

Verwenden Sie die Funktion runFlow, um den Ablauf auszuführen:

const response = await runFlow(menuSuggestionFlow, 'French');

Sie können auch die Befehlszeile verwenden, um Abläufe auszuführen:

genkit flow:run menuSuggestionFlow '"French"'

Gestreamt

Hier ein einfaches Beispiel für einen Ablauf, der Werte aus einem Ablauf streamen kann:

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
    streamSchema: z.string(),
  },
  async (restaurantTheme, streamingCallback) => {
    if (streamingCallback) {
      makeMenuItemSuggestionsAsync(restaurantTheme).subscribe((suggestion) => {
        streamingCallback(suggestion);
      });
    }
  }
);

streamingCallback kann nicht definiert sein. Sie wird nur definiert, wenn das Der Aufruf des Clients fordert eine gestreamte Antwort an.

Verwenden Sie die Funktion streamFlow, um einen Ablauf im Streamingmodus aufzurufen:

const response = streamFlow(menuSuggestionFlow, 'French');

for await (const suggestion of response.stream()) {
  console.log('suggestion', suggestion);
}

Wenn der Ablauf kein Streaming implementiert, verhält sich streamFlow genauso wie runFlow.

Sie können auch die Befehlszeile verwenden, um Abläufe zu streamen:

genkit flow:run menuSuggestionFlow '"French"' -s

Abläufe bereitstellen

Wenn Sie über HTTP auf Ihren Ablauf zugreifen möchten, müssen Sie ihn bereitstellen . Genkit bietet Integrationen für Cloud Functions for Firebase und Express.js-Hosts wie Cloud Run.

Bereitgestellte Abläufe unterstützen die gleichen Funktionen wie lokale Abläufe, z. B. Streaming und Beobachtbarkeit).

Cloud Functions für Firebase

Wenn Sie Abläufe mit Cloud Functions for Firebase verwenden möchten, verwenden Sie das Plug-in firebase. Ersetzen Sie defineFlow durch onFlow und fügen Sie ein authPolicy ein.

import { onFlow } from '@genkit-ai/firebase/functions';
import { firebaseAuth } from '@genkit-ai/firebase/auth';

export const menuSuggestionFlow = onFlow(
  {
    name: 'menuSuggestionFlow',
    authPolicy: firebaseAuth((user) => {
      if (!user.email_verified) {
        throw new Error("Verified email required to run flow");
      }
    }
  },
  async (restaurantTheme) => {
    // ....
  }
);

Express.js

Wenn Sie Workflows mit Cloud Run und ähnlichen Diensten bereitstellen möchten, definieren Sie Ihre Workflows mit defineFlow und rufen Sie dann startFlowsServer() auf:

import { defineFlow, startFlowsServer } from '@genkit-ai/flow';

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
  },
  async (restaurantTheme) => {
    // ....
  }
);

startFlowsServer();

Standardmäßig stellt startFlowsServer alle Abläufe bereit, die Sie in Ihrer Codebasis als HTTP-Endpunkte definiert haben (z.B. http://localhost:3400/menuSuggestionFlow). So können Sie einen Ablauf über eine POST-Anfrage aufrufen:

curl -X POST "http://localhost:3400/menuSuggestionFlow" -H "Content-Type: application/json"  -d '{"data": "banana"}'

Bei Bedarf können Sie den Server für Abläufe so anpassen, dass eine bestimmte Liste von Abläufen bereitgestellt wird, wie unten gezeigt. Sie können auch einen benutzerdefinierten Port angeben (wenn festgelegt wird die Umgebungsvariable PORT) oder CORS-Einstellungen festlegen.

import { defineFlow, startFlowsServer } from '@genkit-ai/flow';

export const flowA = defineFlow({ name: 'flowA' }, async (subject) => {
  // ....
});

export const flowB = defineFlow({ name: 'flowB' }, async (subject) => {
  // ....
});

startFlowsServer({
  flows: [flowB],
  port: 4567,
  cors: {
    origin: '*',
  },
});

Beobachtbarkeit des Datenflusses

Wenn Sie Drittanbieter-SDKs verwenden, die nicht für die Beobachtbarkeit instrumentiert sind, möchten Sie sie manchmal als separaten Trace-Schritt auf der Entwickler-UI sehen. Sie müssen den Code lediglich in die Funktion run einfügen.

import { defineFlow, run } from '@genkit-ai/flow';

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
    outputSchema: z.array(s.string()),
  },
  async (restaurantTheme) => {
    const themes = await run('find-similar-themes', async () => {
      return await findSimilarRestaurantThemes(restaurantTheme);
    });

    const suggestions = makeMenuItemSuggestions(themes);

    return suggestions;
  }
);