Firebase Genkit の機能は、プラグインによって拡張できるように設計されています。Genkit プラグインは、モデル、リトリーバー、インデクサ、トレース ストアなどを提供できる構成可能なモジュールです。Genkit を使用するだけで、プラグインが実際に動作しているのを確認できます。
import { genkit } from 'genkit';
import { vertexAI } from '@genkit-ai/vertexai';
const ai = genkit({
plugins: [vertexAI({ projectId: 'my-project' })],
});
Vertex AI プラグインは、構成(ユーザーの Google Cloud プロジェクト ID など)を受け取り、さまざまな新しいモデルやエンベッダーを Genkit レジストリに登録します。レジストリは、モデルやプロンプトなどの実行と検査を行うための Genkit のローカル UI を強化し、実行時に名前付きアクションの検索サービスとして機能します。
プラグインの作成
通常、プラグインを作成するには、新しい NPM パッケージを作成します。
mkdir genkitx-my-plugin
cd genkitx-my-plugin
npm init -y
npm i --save genkit
npm i --save-dev typescript
npx tsc --init
次に、メイン エントリ ポイントからプラグインを定義してエクスポートします。
import { Genkit, z } from 'genkit';
import { GenkitPlugin, genkitPlugin } from 'genkit/plugin';
interface MyPluginOptions {
// add any plugin configuration here
}
export function myPlugin(options?: MyPluginOptions) {
return genkitPlugin('myPlugin', async (ai: Genkit) => {
ai.defineModel(...);
ai.defineEmbedder(...)
// ....
});
};
プラグイン オプションに関するガイダンス
通常、プラグインは、機能に必要なプラグイン全体の構成を含む単一の options
引数を受け取る必要があります。API キーなど、シークレット値を必要とするプラグイン オプションの場合は、オプションとデフォルトの環境変数の両方を提供して構成する必要があります。
import { Genkit, z } from 'genkit';
import { GenkitPlugin, genkitPlugin } from 'genkit/plugin';
import { GenkitError } from '@genkit-ai/core';
interface MyPluginOptions {
apiKey?: string;
}
export function myPlugin(options?: MyPluginOptions) {
return genkitPlugin('myPlugin', async (ai: Genkit) => {
if (!apiKey)
throw new GenkitError({
source: 'my-plugin',
status: 'INVALID_ARGUMENT',
message:
'Must supply either `options.apiKey` or set `MY_PLUGIN_API_KEY` environment variable.',
});
ai.defineModel(...);
ai.defineEmbedder(...)
// ....
});
};
プラグインのビルド
1 つのプラグインで、Genkit 内で多くの新しい機能を有効にできます。たとえば、Vertex AI プラグインは、いくつかの新しいモデルとエンベッダーを有効にします。
モデル プラグイン
Genkit モデル プラグインは、1 つ以上の生成 AI モデルを Genkit レジストリに追加します。モデルは、プロンプトを入力として受け取り、テキスト、メディア、データを出力として生成できる生成モデルを表します。通常、モデル プラグインは初期化関数で 1 つ以上の defineModel
呼び出しを行います。
カスタムモデルは通常、次の 3 つのコンポーネントで構成されます。
- モデルの機能を定義するメタデータ。
- モデルでサポートされている特定のパラメータを含む構成スキーマ。
GenerateRequest
を受け取ってGenerateResponse
を返すモデルを実装する関数。
モデル プラグインをビルドするには、@genkit-ai/ai
パッケージを使用する必要があります。
npm i --save @genkit-ai/ai
モデル プラグインの概要は次のようになります。
import { genkitPlugin, GenkitPlugin } from 'genkit/plugin';
import { GenkitError } from '@genkit-ai/core';
import { GenerationCommonConfigSchema } from '@genkit-ai/ai/model';
import { simulateSystemPrompt } from '@genkit-ai/ai/model/middleware';
import { z } from 'genkit';
export function myPlugin(options?: MyPluginOptions) {
return genkitPlugin('my-plugin', async (ai: Genkit) => {
ai.defineModel({
// be sure to include your plugin as a provider prefix
name: 'my-plugin/my-model',
// label for your model as shown in Genkit Developer UI
label: 'My Awesome Model',
// optional list of supported versions of your model
versions: ['my-model-001', 'my-model-001'],
// model support attributes
supports: {
multiturn: true, // true if your model supports conversations
media: true, // true if your model supports multimodal input
tools: true, // true if your model supports tool/function calling
systemRole: true, // true if your model supports the system role
output: ['text', 'media', 'json'], // types of output your model supports
},
// Zod schema for your model's custom configuration
configSchema: GenerationCommonConfigSchema.extend({
safetySettings: z.object({...}),
}),
// list of middleware for your model to use
use: [simulateSystemPrompt()]
}, async request => {
const myModelRequest = toMyModelRequest(request);
const myModelResponse = await myModelApi(myModelRequest);
return toGenerateResponse(myModelResponse);
});
});
};
リクエストとレスポンスの変換
Genkit モデル プラグインの主な処理は、GenerateRequest
を Genkit の共通形式からモデルの API で認識され、サポートされている形式に変換し、モデルからのレスポンスを Genkit で使用される GenerateResponseData
形式に変換することです。
モデルの制限を回避するために、データの調整や操作が必要になる場合があります。たとえば、モデルが system
メッセージをネイティブにサポートしていない場合は、プロンプトのシステム メッセージをユーザー/モデル メッセージのペアに変換する必要があります。
モデル参照
defineModel
を使用してモデルを登録すると、名前でリクエストしたときに常に使用できるようになります。ただし、入力と IDE 自動補完を改善するには、モデルのメタデータのみを含み、実装を含まないモデル参照をパッケージからエクスポートできます。
import { modelRef } from "@genkit-ai/ai/model";
export myModelRef = modelRef({
name: "my-plugin/my-model",
configSchema: MyConfigSchema,
info: {
// ... model-specific info
},
})
generate()
を呼び出すときに、モデル参照と文字列モデル名を同じ意味で使用できます。
import { myModelRef } from 'genkitx-my-plugin';
import { generate } from '@genkit-ai/ai';
generate({ model: myModelRef });
// is equivalent to
generate({ model: 'my-plugin/my-model' });
プラグインを公開する
Genkit プラグインは、通常の NPM パッケージとして公開できます。見つけやすさを向上させ、一貫性を最大限に高めるには、パッケージに genkitx-{name}
という名前を付けて、Genkit プラグインであることを示します。また、プラグインに関連する次の keywords
を package.json
にできるだけ多く含めます。
genkit-plugin
: Genkit プラグインであることを示すために、このキーワードをパッケージに必ず含めます。genkit-model
: パッケージでモデルを定義する場合は、このキーワードを含めます。genkit-retriever
: パッケージで取得ツールを定義している場合は、このキーワードを含めます。genkit-indexer
: パッケージでインデックス エンジンを定義する場合は、このキーワードを含めます。genkit-embedder
: パッケージでインデックス エンジンを定義する場合は、このキーワードを含めます。genkit-tracestore
: パッケージでトレース ストアを定義する場合は、このキーワードを含めます。genkit-statestore
: パッケージで状態ストアを定義する場合は、このキーワードを含めます。genkit-telemetry
: パッケージでテレメトリー プロバイダを定義する場合は、このキーワードを含めます。genkit-deploy
: パッケージに、Genkit アプリをクラウド プロバイダにデプロイするヘルパーが含まれている場合は、このキーワードを含めます。genkit-flow
: パッケージが Genkit フローを拡張する場合は、このキーワードを含めます。
リトリーバー、エンベッダー、モデルを提供するプラグインには、次のような package.json
があります。
{
"name": "genkitx-my-plugin",
"keywords": ["genkit-plugin", "genkit-retriever", "genkit-embedder", "genkit-model"],
// ... dependencies etc.
}