フロー

フローは、いくつかの追加特性を持つ関数です。 型付けされ、ストリーミング可能、ローカルとリモートからの呼び出しが可能で、完全に監視可能です。 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 と Cloud Functions、 Cloud Run などの Express.js ホスト。

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

Cloud Functions for Firebase

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 など)を提供します。次のように POST リクエストを介してフローを呼び出すことができます。

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

必要に応じて、次のように、特定のフローリストを提供するフロー サーバーをカスタマイズできます。カスタムポートを指定したり(設定されていれば 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;
  }
);