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;
}
);