Genkit プラグインの作成

Firebase Genkit の機能は、プラグインによって拡張できるように設計されています。Genkit プラグインは、モデル、レトリーバー、インデクサー、トレースストアなどを提供できる構成可能なモジュールです。Genkit を使用したプラグインの動作は すでに見てきました

import { configureGenkit } from '@genkit-ai/core';
import { vertexAI } from '@genkit-ai/vertexai';

configureGenkit({
  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-ai/core
npm i --save-dev typescript
npx tsc --init

次に、メインのエントリ ポイントからプラグインを定義してエクスポートします。

import { genkitPlugin } from '@genkit-ai/core';

interface MyPluginOptions {
  // add any plugin configuration here
}

export const myPlugin = genkitPlugin(
  'my-plugin',
  async (options: MyPluginOptions) => {
    // initialize your plugin here...
  }
);

プラグイン オプションのガイダンス

一般に、プラグインは options 引数を 1 つ受け取り、そこにはプラグイン全体の構成も含めるようにします。API キーなど、シークレット値を必要とするプラグイン オプションでは、オプションとデフォルトの環境変数の両方を指定して構成する必要があります。

import { genkitPlugin, GenkitError } from '@genkit-ai/core';

interface MyPluginOptions {
  apiKey?: string;
}

export const myPlugin = genkitPlugin(
  'my-plugin',
  async (options: MyPluginOptions) => {
    const apiKey = options.apiKey || process.env.MY_PLUGIN_API_KEY;
    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.',
      });
    // ... continue initialization
  }
);

プラグインをビルドする

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, GenkitError } from '@genkit-ai/core';
import { defineModel, GenerationCommonConfigSchema } from '@genkit-ai/ai/model';
import { simulateSystemPrompt } from '@genkit-ai/ai/model/middleware';
import { z } from 'zod';

export const myPlugin = genkitPlugin('my-plugin', async (options: {apiKey?: string}) => {
  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 テレメトリー プラグインの作成をご覧ください。

プラグインを公開する

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 フローを強化する場合は、このキーワードを含めます。

Retriever、Embedder、モデルを提供するプラグインの package.json は次のようになります。

{
  "name": "genkitx-my-plugin",
  "keywords": ["genkit-plugin", "genkit-retriever", "genkit-embedder", "genkit-model"],
  // ... dependencies etc.
}