Genkit eklentileri yazma

Firebase Genkit'in özellikleri, eklentilerle genişletilecek şekilde tasarlanmıştır. Genkit eklentileri, modeller, alıcı, dizine ekleyen, izleme depoları ve daha fazlasını sağlayabilen yapılandırılabilir modüllerdir. Genkit'i kullanarak eklentileri daha önce de görmüştünüz:

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

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

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

Eklenti oluşturma

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

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

Ardından, ana giriş noktanızdan eklentinizi tanımlayıp dışa aktarın:

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

Eklenti seçenekleri kılavuzu

Genel olarak, eklentiniz, çalışması için gerekli olan tüm eklenti genelindeki yapılandırmaları içeren tek bir options bağımsız değişkeni almalıdır. API anahtarları gibi gizli bir değer gerektiren tüm eklenti seçenekleri için hem bir seçenek hem de yapılandırmak üzere varsayılan bir ortam değişkeni sunmanız gerekir:

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

Eklentinizi oluşturma

Tek bir eklenti, Genkit'te birçok yeni özelliği etkinleştirebilir. Örneğin, Vertex AI eklentisi, yerleştiricinin yanı sıra çeşitli yeni modelleri etkinleştirir.

Model eklentileri

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

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

  1. Modelin özelliklerini tanımlayan meta veriler.
  2. Model tarafından desteklenen belirli parametreleri içeren bir yapılandırma şeması.
  3. GenerateRequest değerini kabul edip GenerateResponse değerini 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

Genel hatlarıyla bir model eklentisi aşağıdaki gibi görünebilir:

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


İstekleri ve yanıtları dönüştürme

Genkit model eklentisinin birincil işlevi, Genkit'in ortak biçimindeki GenerateRequest öğesini modelinizin API'si tarafından tanınan ve desteklenen bir biçime dönüştürmek ve ardından modelinizden gelen yanıtı Genkit tarafından kullanılan GenerateResponseData biçimine dönüştürmektir.

Bazen, model sınırlamalarından kaçınmak için verileri değiştirmek veya veriler üzerinde işlem yapmak gerekebilir. Örneğin, modeliniz system mesajını doğal olarak desteklemiyorsa bir istemin sistem mesajını kullanıcı/model mesaj çiftine dönüştürmeniz gerekebilir.

Model referansları

defineModel kullanılarak kaydedilen modeller, adlarıyla istendiğinde her zaman kullanılabilir. Ancak yazma işlemini ve IDE otomatik tamamlama özelliğini iyileştirmek için paketinizden yalnızca bir modelin meta verilerini içeren ancak uygulamasını içermeyen bir model referansı 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' });

Eklenti yayınlama

Genkit eklentileri normal NPM paketleri olarak yayınlanabilir. Bulanıklığı artırmak ve tutarlılığı en üst düzeye çıkarmak için paketinizin, Genkit eklentisi olduğunu belirtmek üzere genkitx-{name} olarak adlandırılması ve package.json dosyanıza eklentinizle alakalı olan aşağıdaki keywords dosyalarından mümkün olduğunca fazlası eklenmesi gerekir:

  • genkit-plugin: Genkit eklentisi olduğunu belirtmek için paketinize her zaman bu anahtar kelimeyi ekleyin.
  • genkit-model: Paketinizde model tanımlanıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-retriever: Paketinizde alıcı tanımlanıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-indexer: Paketiniz herhangi bir dizine ekleyen tanımlarsa bu anahtar kelimeyi ekleyin.
  • genkit-embedder: Paketiniz herhangi bir dizine ekleyen tanımlarsa bu anahtar kelimeyi ekleyin.
  • genkit-tracestore: Paketinizde herhangi bir izleme mağazası tanımlanmışsa bu anahtar kelimeyi ekleyin.
  • genkit-statestore: Paketinizde herhangi bir eyalet mağazası tanımlanıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-telemetry: Paketiniz bir telemetri sağlayıcısı tanıyorsa bu anahtar kelimeyi ekleyin.
  • genkit-deploy: Paketinizde Genkit uygulamalarını bulut sağlayıcılara dağıtmak için yardımcılar varsa bu anahtar kelimeyi ekleyin.
  • genkit-flow: Paketiniz Genkit akışlarını iyileştiriyorsa bu anahtar kelimeyi ekleyin.

Ayıklama, yerleştirme ve model sağlayan bir eklentide şuna benzer bir package.json bulunabilir:

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