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);
}
フローがストリーミングを実装しない場合、streamFlow
は runFlow
と同じように動作します。
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
プラグインを使用します。defineFlow
を onFlow
に置き換えて、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;
}
);