Menulis plugin Genkit

Kemampuan Firebase Genkit dirancang untuk diperluas melalui plugin. Plugin Genkit adalah modul yang dapat dikonfigurasi yang dapat menyediakan model, pengambil, pengindeks, penyimpanan rekaman aktivitas, dan banyak lagi. Anda telah melihat cara kerja plugin hanya dengan menggunakan Genkit:

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

const ai = genkit({
  plugins: [vertexAI({ projectId: 'my-project' })],
});

Plugin Vertex AI mengambil konfigurasi (seperti project ID Google Cloud pengguna) dan mendaftarkan berbagai model baru, penyemat, dan masih banyak lagi dengan registry Genkit. Registry mendukung UI lokal Genkit untuk menjalankan dan memeriksa model, perintah, dan lainnya serta berfungsi sebagai layanan pencarian untuk tindakan bernama saat runtime.

Membuat Plugin

Untuk membuat plugin, Anda biasanya ingin membuat paket NPM baru:

mkdir genkitx-my-plugin
cd genkitx-my-plugin
npm init -y
npm i --save genkit
npm i --save-dev typescript
npx tsc --init

Kemudian, tentukan dan ekspor plugin dari titik entri utama:

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(...)
    // ....
  });
};

Panduan opsi plugin

Secara umum, plugin Anda harus menggunakan satu argumen options yang menyertakan konfigurasi seluruh plugin yang diperlukan untuk berfungsi. Untuk opsi plugin apa pun yang memerlukan nilai secret, seperti kunci API, Anda harus menawarkan opsi dan variabel lingkungan default untuk mengonfigurasinya:

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(...)
    
    // ....
  });
};

Mem-build plugin

Satu plugin dapat mengaktifkan banyak hal baru di dalam Genkit. Misalnya, plugin Vertex AI akan mengaktifkan beberapa model baru dan penyemat.

Plugin model

Plugin model Genkit menambahkan satu atau beberapa model AI generatif ke registry Genkit. Model mewakili semua model generatif yang mampu menerima perintah sebagai input dan menghasilkan teks, media, atau data sebagai output. Biasanya, plugin model akan melakukan satu atau beberapa panggilan defineModel dalam fungsi inisialisasinya.

Model kustom umumnya terdiri dari tiga komponen:

  1. Metadata yang menentukan kemampuan model.
  2. Skema konfigurasi dengan parameter tertentu yang didukung oleh model.
  3. Fungsi yang mengimplementasikan model yang menerima GenerateRequest dan menampilkan GenerateResponse.

Untuk mem-build plugin model, Anda harus menggunakan paket @genkit-ai/ai:

npm i --save @genkit-ai/ai

Pada tingkat tinggi, plugin model mungkin terlihat seperti ini:

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);
    });
  });
};


Mentransformasi Permintaan dan Respons

Tugas utama plugin model Genkit adalah mengubah GenerateRequest dari format umum Genkit menjadi format yang dikenali dan didukung oleh API model Anda, lalu mengubah respons dari model Anda menjadi format GenerateResponseData yang digunakan oleh Genkit.

Terkadang, hal ini mungkin memerlukan pengiriman pesan atau manipulasi data untuk mengatasi keterbatasan model. Misalnya, jika model Anda tidak mendukung pesan system secara native, Anda mungkin perlu mengubah pesan sistem prompt menjadi pasangan pesan pengguna/model.

Referensi model

Setelah terdaftar menggunakan defineModel, model akan selalu tersedia saat diminta berdasarkan nama. Namun, untuk meningkatkan pengetikan dan pelengkapan otomatis IDE, Anda dapat mengekspor referensi model dari paket yang hanya menyertakan metadata untuk model, tetapi bukan implementasinya:

import { modelRef } from "@genkit-ai/ai/model";

export myModelRef = modelRef({
  name: "my-plugin/my-model",
  configSchema: MyConfigSchema,
  info: {
    // ... model-specific info
  },
})

Saat memanggil generate(), referensi model dan nama model string dapat digunakan secara bergantian:

import { myModelRef } from 'genkitx-my-plugin';
import { generate } from '@genkit-ai/ai';

generate({ model: myModelRef });
// is equivalent to
generate({ model: 'my-plugin/my-model' });

Memublikasikan plugin

Plugin genkit dapat dipublikasikan sebagai paket NPM normal. Untuk meningkatkan visibilitas dan memaksimalkan konsistensi, paket Anda harus diberi nama genkitx-{name} untuk menunjukkan bahwa paket tersebut adalah plugin Genkit dan Anda harus menyertakan sebanyak mungkin keywords berikut di package.json yang relevan dengan plugin Anda:

  • genkit-plugin: selalu sertakan kata kunci ini dalam paket Anda untuk menunjukkan bahwa ini adalah plugin Genkit.
  • genkit-model: sertakan kata kunci ini jika paket Anda menentukan model apa pun.
  • genkit-retriever: sertakan kata kunci ini jika paket Anda menentukan pengambil.
  • genkit-indexer: sertakan kata kunci ini jika paket Anda menentukan pengindeksan.
  • genkit-embedder: sertakan kata kunci ini jika paket Anda menentukan pengindeksan.
  • genkit-tracestore: sertakan kata kunci ini jika paket Anda menentukan penyimpanan rekaman aktivitas.
  • genkit-statestore: sertakan kata kunci ini jika paket Anda menentukan penyimpanan status.
  • genkit-telemetry: sertakan kata kunci ini jika paket Anda menentukan penyedia telemetri.
  • genkit-deploy: sertakan kata kunci ini jika paket Anda menyertakan helper untuk men-deploy aplikasi Genkit ke penyedia cloud.
  • genkit-flow: sertakan kata kunci ini jika paket Anda meningkatkan alur Genkit.

Plugin yang menyediakan retriever, penyemat, dan model mungkin memiliki package.json yang terlihat seperti:

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