Menulis plugin Genkit

Kemampuan Firebase Genkit dirancang untuk diperluas oleh plugin. Plugin Genkit adalah modul yang dapat dikonfigurasi yang dapat menyediakan model, pengambil, pengindeks, penyimpanan rekaman aktivitas, dan lainnya. Anda telah melihat penggunaan plugin hanya dengan menggunakan Genkit:

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

configureGenkit({
  plugins: [vertexAI({ projectId: 'my-project' })],
});

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

Membuat Plugin

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

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

Kemudian, tentukan dan ekspor plugin Anda dari titik entri utama:

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

Panduan opsi plugin

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

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

Membuat plugin

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

Plugin model

Plugin model Genkit menambahkan satu atau beberapa model AI generatif ke registry Genkit. Model mewakili model generatif yang mampu menerima perintah sebagai input dan menghasilkan teks, media, atau data sebagai output. Umumnya, 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 membuat plugin model, Anda harus menggunakan paket @genkit-ai/ai:

npm i --save @genkit-ai/ai

Pada level tinggi, plugin model mungkin terlihat seperti ini:

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

Mentransformasi Permintaan dan Respons

Pekerjaan utama plugin model Genkit adalah mengubah GenerateRequest dari format umum Genkit ke dalam format yang dikenali dan didukung oleh API model Anda, kemudian mengubah respons dari model Anda menjadi format GenerateResponseData yang digunakan oleh Genkit.

Terkadang, hal ini mungkin memerlukan pemijatan 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 didaftarkan menggunakan defineModel, model akan selalu tersedia saat diminta berdasarkan nama. Namun, untuk meningkatkan kualitas pengetikan dan pelengkapan otomatis IDE, Anda dapat mengekspor referensi model dari paket yang hanya menyertakan metadata untuk model, tetapi tidak 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' });

Plugin telemetri

Lihat Menulis Plugin Telemetry Genkit.

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 merupakan plugin Genkit dan Anda harus menyertakan sebanyak mungkin keywords berikut dalam 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: menyertakan kata kunci ini jika paket Anda menentukan model apa pun.
  • genkit-retriever: menyertakan kata kunci ini jika paket Anda menentukan retriever apa pun.
  • genkit-indexer: menyertakan kata kunci ini jika paket Anda menentukan pengindeks.
  • genkit-embedder: menyertakan kata kunci ini jika paket Anda menentukan pengindeks.
  • genkit-tracestore: menyertakan kata kunci ini jika paket Anda menentukan penyimpanan rekaman aktivitas.
  • genkit-statestore: menyertakan kata kunci ini jika paket Anda menentukan penyimpanan status.
  • genkit-telemetry: menyertakan kata kunci ini jika paket Anda menentukan penyedia telemetri.
  • genkit-deploy: sertakan kata kunci ini jika paket Anda berisi helper untuk men-deploy aplikasi Genkit ke penyedia cloud.
  • genkit-flow: menyertakan 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.
}