Genkit eklentileri yazma

Firebase Genkit'in özellikleri, eklentilerle genişletilecek şekilde tasarlanmıştır. Genkit eklentileri; modeller, retriever'lar, dizinleyiciler, iz depoları ve daha fazlasını sağlayabilen yapılandırılabilir modüllerdir. Yalnızca Genkit'i kullanarak eklentileri çalışırken görmüştünüz:

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

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

Vertex AI eklentisi, yapılandırmayı (kullanıcının Google Cloud proje kimliği gibi) alır ve Genkit kayıt defterine çeşitli yeni modeller, yerleştirilmiş öğeler ve daha fazlasını kaydeder. Kayıt defteri, Genkit'in modelleri, istemleri ve daha fazlasını çalıştırmak ve incelemek için yerel kullanıcı arayüzünü destekler ve çalışma zamanında adlandırılmış işlemler için bir arama hizmeti görevi görür.

Eklenti Oluşturma

Eklenti oluşturmak için genellikle yeni bir AİOY paketi oluşturmanız gerekir:

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

Ardından, eklentinizi ana giriş noktasından tanımlayın ve dışa aktarın:

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

Eklenti seçenekleri kılavuzu

Genel olarak, eklentinizin çalışması için gerekli, eklenti genelindeki tüm yapılandırmaları içeren tek bir options bağımsız değişkeni alması gerekir. Gizli anahtar değeri gerektiren tüm eklenti seçeneklerini (ör. API anahtarları) yapılandırmak için hem seçenek hem de varsayılan ortam değişkeni sunmanız gerekir:

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

Eklentinizi oluşturma

Tek bir eklentiyle Genkit'teki birçok yeni öğe etkinleştirilebilir. Örneğin, Vertex AI eklentisi hem birçok yeni modeli hem de bir yerleştirme aracını etkinleştirir.

Model eklentileri

Genkit model eklentileri, Genkit kayıt defterine bir veya daha fazla üretken yapay zeka modeli ekler. Model, giriş olarak istem alabilen ve çıktı olarak metin, medya veya veri oluşturabilen tüm üretken modelleri temsil eder. Genellikle bir model eklentisi, başlatma işlevinde bir veya daha fazla defineModel çağrısı yapar.

Özel model genellikle üç bileşenden oluşur:

  1. Modelin özelliklerini tanımlayan meta veri.
  2. Modelin desteklediği belirli parametreleri içeren bir yapılandırma şeması.
  3. GenerateRequest değerini kabul eden ve GenerateResponse döndüren modeli uygulayan bir işlev.

Model eklentisi oluşturmak için @genkit-ai/ai paketini kullanmanız gerekir:

npm i --save @genkit-ai/ai

Yüksek düzeyde, bir model eklentisi aşağıdaki gibi görünebilir:

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

İstekleri ve Yanıtları Dönüştürme

Genkit model eklentisinin ana görevi, GenerateRequest değerini Genkit'in ortak biçiminden modelinizin API'si tarafından tanınan ve desteklenen bir biçime dönüştürmek ve ardından modelinizden alınan yanıtı Genkit tarafından kullanılan GenerateResponseData biçimine dönüştürmektir.

Bazen bu işlem, model sınırlamalarını aşmak için verilere müdahale etmeyi veya verileri değiştirmeyi gerektirebilir. Örneğin, modeliniz bir system mesajını yerel olarak desteklemiyorsa bir istemin sistem mesajını kullanıcı/model mesaj çiftine dönüştürmeniz gerekebilir.

Model referansları

Bir model defineModel kullanılarak kaydedildikten sonra, adıyla istendiğinde her zaman kullanılabilir. Bununla birlikte, yazma ve IDE otomatik tamamlama özelliklerini iyileştirmek için paketinizden, modelin uygulanmasını değil yalnızca meta verilerini içeren bir model referansını dışa aktarabilirsiniz:

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

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

generate() çağrılırken, model referansları ve dize model adları birbirinin yerine kullanılabilir:

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

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

Telemetri eklentileri

Genkit Telemetry Eklentisi Yazma bölümüne bakın.

Eklenti yayınlama

Genkit eklentileri, normal AİOY paketleri olarak yayınlanabilir. Bulunabilirliği artırmak ve tutarlılığı en üst düzeye çıkarmak için paketiniz, Genkit eklentisi olduğunu belirtecek şekilde genkitx-{name} olarak adlandırılmalıdır. Ayrıca package.json öğenize aşağıdaki keywords öğelerinden eklentinizle alakalı olabildiğince çok sayıda öğe eklemelisiniz:

  • genkit-plugin: Genkit eklentisi olduğunu belirtmek için paketinize her zaman bu anahtar kelimeyi ekleyin.
  • genkit-model: Paketiniz herhangi bir model tanımlıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-retriever: Paketiniz herhangi bir retriever tanımlıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-indexer: Paketiniz herhangi bir dizinleyiciyi tanımlıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-embedder: Paketiniz herhangi bir dizinleyiciyi tanımlıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-tracestore: Paketiniz herhangi bir iz deposu tanımlıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-statestore: Paketiniz herhangi bir eyalet deposunu tanımlıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-telemetry: Paketiniz bir telemetri sağlayıcısı tanımlıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-deploy: Paketiniz, Genkit uygulamalarını bulut sağlayıcılara dağıtmak için yardımcılar içeriyorsa bu anahtar kelimeyi ekleyin.
  • genkit-flow: Paketiniz Genkit akışlarını geliştiriyorsa bu anahtar kelimeyi ekleyin.

Bir retriever, yerleştirme aracı ve model sağlayan eklentide şunun gibi bir package.json bulunabilir:

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