Написание плагинов Genkit

Возможности Firebase Genkit предназначены для расширения с помощью плагинов. Плагины Genkit — это настраиваемые модули, которые могут предоставлять модели, средства извлечения, индексаторы, хранилища трассировок и многое другое. Вы уже видели плагины в действии, просто используя Genkit:

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

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

Плагин Vertex AI принимает конфигурацию (например, идентификатор проекта Google Cloud пользователя) и регистрирует множество новых моделей, средств внедрения и т. д. в реестре Genkit. Реестр обеспечивает локальный пользовательский интерфейс Genkit для запуска и проверки моделей, подсказок и многого другого, а также служит службой поиска именованных действий во время выполнения.

Создание плагина

Чтобы создать плагин, вам обычно нужно создать новый пакет NPM:

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

Затем определите и экспортируйте свой плагин из основной точки входа:

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

Руководство по опциям плагина

В общем, ваш плагин должен принимать один аргумент options , который включает в себя любую конфигурацию всего плагина, необходимую для работы. Для любого параметра плагина, требующего секретного значения, например ключей API, вы должны предложить как параметр, так и переменную среды по умолчанию для его настройки:

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

Создание вашего плагина

Один плагин может активировать множество новых функций в Genkit. Например, плагин Vertex AI активирует несколько новых моделей, а также встроенный инструмент.

Плагины моделей

Плагины моделей Genkit добавляют одну или несколько генеративных моделей искусственного интеллекта в реестр Genkit. Модель представляет собой любую генеративную модель, которая способна принимать приглашение в качестве входных данных и генерировать текст, мультимедиа или данные в качестве выходных данных. Обычно плагин модели выполняет один или несколько вызовов defineModel в своей функции инициализации.

Пользовательская модель обычно состоит из трех компонентов:

  1. Метаданные, определяющие возможности модели.
  2. Схема конфигурации с любыми конкретными параметрами, поддерживаемыми моделью.
  3. Функция, реализующая модель, принимающая GenerateRequest и возвращающая GenerateResponse .

Чтобы создать плагин модели, вам понадобится пакет @genkit-ai/ai :

npm i --save @genkit-ai/ai

На высоком уровне плагин модели может выглядеть примерно так:

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


Преобразование запросов и ответов

Основная работа плагина модели Genkit — преобразование GenerateRequest из общего формата Genkit в формат, который распознается и поддерживается API вашей модели, а затем преобразование ответа вашей модели в формат GenerateResponseData , используемый Genkit.

Иногда для обхода ограничений модели может потребоваться обработка данных или манипулирование ими. Например, если ваша модель изначально не поддерживает system сообщение, вам может потребоваться преобразовать системное сообщение приглашения в пару сообщений пользователя/модели.

Ссылки на модели

После регистрации модели с помощью defineModel она всегда доступна по запросу по имени. Однако, чтобы улучшить типизацию и автодополнение IDE, вы можете экспортировать ссылку на модель из вашего пакета, которая включает только метаданные модели, но не ее реализацию:

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

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

При вызове метода generate() ссылки на модели и имена строковых моделей могут использоваться как взаимозаменяемые:

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

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

Публикация плагина

Плагины Genkit можно публиковать как обычные пакеты NPM. Чтобы улучшить обнаруживаемость и обеспечить максимальную согласованность, ваш пакет должен называться genkitx-{name} , чтобы указать, что это плагин Genkit, и вы должны включить в свой package.json столько keywords которые имеют отношение к вашему плагину:

  • genkit-plugin : всегда включайте это ключевое слово в свой пакет, чтобы указать, что это плагин Genkit.
  • genkit-model : включите это ключевое слово, если ваш пакет определяет какие-либо модели.
  • genkit-retriever : включите это ключевое слово, если в вашем пакете определены какие-либо ретриверы.
  • genkit-indexer : включите это ключевое слово, если ваш пакет определяет какие-либо индексаторы.
  • genkit-embedder : включите это ключевое слово, если ваш пакет определяет какие-либо индексаторы.
  • genkit-tracestore : включите это ключевое слово, если ваш пакет определяет какие-либо хранилища трассировки.
  • genkit-statestore : включите это ключевое слово, если ваш пакет определяет какие-либо хранилища состояний.
  • genkit-telemetry : включите это ключевое слово, если ваш пакет определяет поставщика телеметрии.
  • genkit-deploy : включите это ключевое слово, если ваш пакет включает помощники для развертывания приложений Genkit у облачных провайдеров.
  • genkit-flow : включите это ключевое слово, если ваш пакет расширяет потоки Genkit.

Плагин, предоставляющий средство извлечения, средство внедрения и модель, может иметь файл package.json , который выглядит следующим образом:

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