Возможности 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
в своей функции инициализации.
Пользовательская модель обычно состоит из трех компонентов:
- Метаданные, определяющие возможности модели.
- Схема конфигурации с любыми конкретными параметрами, поддерживаемыми моделью.
- Функция, реализующая модель, принимающая
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.
}