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 trace, dan lainnya. Anda sudah melihat plugin di tindakan 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 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 memeriksa model, prompt, dan lainnya, serta berfungsi sebagai layanan pencarian untuk pada waktu proses.

Membuat Plugin

Untuk membuat plugin, biasanya Anda 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 Anda harus mengambil satu argumen options yang menyertakan konfigurasi seluruh {i>plugin<i} yang diperlukan agar berfungsi. Untuk setiap 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 embeddingder.

Plugin model

Plugin model Genkit menambahkan satu atau beberapa model AI generatif ke registry Genkit. Model mewakili semua model yang mampu menerima prompt sebagai input dan menghasilkan teks, media, atau data sebagai output. Biasanya, plugin model akan membuat 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 tersebut.
  3. Fungsi yang mengimplementasikan model yang menerima GenerateRequest dan mengembalikan GenerateResponse.

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

npm i --save @genkit-ai/ai

Pada level yang 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

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

Terkadang, diperlukan 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 oleh nama. Namun, untuk meningkatkan pengetikan dan pelengkapan otomatis IDE, Anda dapat mengekspor referensi model dari paket Anda yang hanya menyertakan metadata untuk model, tetapi tidak dengan 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 Telemetri Genkit.

Memublikasikan plugin

Plugin genkit dapat dipublikasikan sebagai paket NPM normal. Untuk meningkatkan untuk visibilitas dan memaksimalkan konsistensi, paket Anda harus diberi nama genkitx-{name} untuk menunjukkan bahwa plugin ini adalah plugin Genkit dan harus Anda sertakan sebagai banyak dari keywords berikut di package.json Anda yang relevan dengan {i>plugin<i}:

  • 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 menetapkan model apa pun.
  • genkit-retriever: menyertakan kata kunci ini jika paket Anda menentukan retriever.
  • 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 menyertakan 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, embeddingder, dan model mungkin memiliki package.json yang terlihat seperti ini:

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