Genkit プラグインの作成

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 つのコンポーネントで構成されます。

  1. モデルの機能を定義するメタデータ。
  2. モデルでサポートされている特定のパラメータを含む構成スキーマ。
  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 プラグインであることを示します。また、プラグインに関連する次の keywordspackage.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.
}