フロー

Flow には、厳密に型指定され、ストリーミング可能で、ローカルとリモートで呼び出し可能で、完全に監視できるという特性があります。Firebase Genkit は、フローを操作するための CLI ツールとデベロッパー UI ツール(実行、デバッグなど)を提供します。

フローの定義

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

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

    return suggestion;
  }
);

フローの入力スキーマと出力スキーマは、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;
  }
);

スキーマを指定すると、Genkit は入力と出力のスキーマを検証します。

実行中のフロー

runFlow 関数を使用してフローを実行します。

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

CLI を使用してフローを実行することもできます。

genkit flow:run menuSuggestionFlow '"French"'

配信済み

フローから値をストリーミングできるフローの簡単な例を次に示します。

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

streamingCallback は未定義でもかまいません。呼び出し元のクライアントがストリーミング レスポンスをリクエストしている場合にのみ定義されます。

ストリーミング モードでフローを呼び出すには、streamFlow 関数を使用します。

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

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

フローがストリーミングを実装しない場合、streamFlowrunFlow と同じように動作します。

CLI を使用してフローをストリーミングすることもできます。

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

フローのデプロイ

HTTP 経由でフローにアクセスできるようにするには、まずフローをデプロイする必要があります。Genkit は、Cloud Functions for Firebase と Express.js ホスト(Cloud Run など)の統合を提供します。

デプロイされたフローは、ローカルフローと同じ機能(ストリーミングやオブザーバビリティなど)をすべてサポートします。

Firebase 向け Cloud Functions

Cloud Functions for Firebase で Flow を使用するには、firebase プラグインを使用します。defineFlowonFlow に置き換えて、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

Cloud Run などのサービスを使用してフローをデプロイするには、defineFlow を使用してフローを定義し、startFlowsServer() を呼び出します。

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

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

startFlowsServer();

デフォルトでは、startFlowsServer はコードベースで定義したすべてのフローを HTTP エンドポイント(http://localhost:3400/menuSuggestionFlow など)として提供します。

フローサーバー経由で公開するフローを選択できます。カスタムポートを指定できます(設定されている場合は PORT 環境変数が使用されます)。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: '*',
  },
});

フローのオブザーバビリティ

オブザーバビリティ用にインストルメント化されていないサードパーティの SDK を使用している場合、デベロッパー UI で個別のトレース ステップとして表示したい場合があります。必要な作業は、コードを 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;
  }
);