フローは、いくつかの追加特性を持つ関数です。 型付けされ、ストリーミング可能、ローカルとリモートからの呼び出しが可能で、完全に監視可能です。 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 と Cloud Functions、 Cloud Run などの Express.js ホスト。
デプロイされたフローは、ローカルフローと同じ機能(ストリーミング、 オブザーバビリティなど)。
Cloud Functions for Firebase
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
など)を提供します。次のように 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;
}
);