Flows

Flow adalah fungsi dengan beberapa karakteristik tambahan: memiliki jenis tipe kuat, dapat di-streaming, dapat dipanggil secara lokal dan jarak jauh, serta dapat diamati sepenuhnya. Firebase Genkit menyediakan alat CLI dan UI Developer untuk menangani alur (berjalan, proses debug, dll.).

Menentukan alur

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

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

    return suggestion;
  }
);

Skema input dan output untuk alur dapat ditentukan menggunakan zod.

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

Jika skema ditentukan, Genkit akan memvalidasi skema untuk input dan output.

Alur berjalan

Gunakan fungsi runFlow untuk menjalankan flow:

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

Anda juga dapat menggunakan CLI untuk menjalankan flow:

genkit flow:run menuSuggestionFlow '"French"'

Di-streaming

Berikut adalah contoh sederhana flow yang dapat mengalirkan nilai dari flow:

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

Perlu diperhatikan bahwa streamingCallback dapat tidak ditentukan. Ini hanya didefinisikan jika klien yang memanggil meminta respons yang di-streaming.

Untuk memanggil flow dalam mode streaming, gunakan fungsi streamFlow:

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

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

Jika flow tidak menerapkan streaming, streamFlow akan berperilaku identik dengan runFlow.

Anda juga dapat menggunakan CLI untuk melakukan streaming flow:

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

Men-deploy flow

Jika ingin dapat mengakses alur melalui HTTP, Anda harus men-deploy-nya terlebih dahulu. Genkit menyediakan integrasi untuk host Cloud Functions for Firebase dan Express.js seperti Cloud Run.

Flow yang di-deploy mendukung semua fitur yang sama seperti flow lokal (seperti streaming dan kemampuan observasi).

Cloud Function for Firebase

Untuk menggunakan flow dengan Cloud Functions for Firebase, gunakan plugin firebase, ganti defineFlow dengan onFlow dan sertakan authPolicy.

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

Untuk men-deploy flow menggunakan Cloud Run dan layanan serupa, tentukan flow Anda menggunakan defineFlow, lalu panggil startFlowsServer():

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

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

startFlowsServer();

Secara default, startFlowsServer akan menyalurkan semua flow yang telah Anda tentukan dalam codebase sebagai endpoint HTTP (misalnya, http://localhost:3400/menuSuggestionFlow).

Anda dapat memilih flow mana yang ditampilkan melalui server flow. Anda dapat menentukan port kustom (port ini akan menggunakan variabel lingkungan PORT jika ditetapkan). Anda juga dapat menetapkan setelan CORS.

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: '*',
  },
});

Kemampuan observasi alur

Terkadang saat menggunakan SDK pihak ketiga yang tidak diinstrumentasikan untuk kemampuan observasi, Anda mungkin ingin melihatnya sebagai langkah rekaman aktivitas terpisah di UI Developer. Anda hanya perlu menggabungkan kode dalam fungsi run.

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