Pisanie wtyczek Genkit

Możliwości Firebase Genkit zostały zaprojektowane tak, aby można było je rozszerzać przez wtyczki. Wtyczki Genkit to moduły, które można skonfigurować które mogą dostarczać modele, narzędzia do pobierania, indeksujące, magazyny śledzenia i nie tylko. Wtyczki zostały już przez Ciebie wyświetlone za pomocą Genkit:

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

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

Wtyczka Vertex AI pobiera konfigurację (np. usługę Google Cloud użytkownika identyfikatora projektu) i rejestruje różne nowe modele, elementy osadzone i nie tylko Rejestr Genkit. Lokalny interfejs użytkownika aplikacji Genkit jest zasilany przez rejestr bada modele, prompty i nie tylko, a także służy jako usługa wyszukiwania nazwane działania w czasie działania.

Tworzenie wtyczki

Aby utworzyć wtyczkę, należy utworzyć nowy pakiet NPM:

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

Następnie zdefiniuj i wyeksportuj wtyczkę z głównego punktu wejścia:

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

Wskazówki dotyczące opcji wtyczek

Ogólnie rzecz biorąc, wtyczka powinna przyjmować pojedynczy argument options, który zawiera wszelkie konfiguracje obejmujące wszystkie wtyczki niezbędne do działania. W przypadku każdej opcji wtyczki, wymaga wartości obiektu tajnego, takiej jak klucze interfejsu API, należy udostępnić zarówno opcję, jak i aby skonfigurować domyślną zmienną środowiskową:

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

Tworzenie wtyczki

Pojedyncza wtyczka może aktywować wiele nowych funkcji w Genkit. Na przykład wtyczka Vertex AI aktywuje kilka nowych modeli oraz komponent do umieszczania.

Wtyczki modelu

Wtyczki modelu Genkit dodają do rejestru Genkit co najmniej 1 model generatywnej AI. Model reprezentuje dowolną generatywną model zdolny do odbierania promptu jako danych wejściowych i generowania tekstu, multimediów lub danych jako danych wyjściowych. Ogólnie rzecz biorąc, wtyczka modelu wywoła w swojej funkcji inicjowania co najmniej 1 wywołanie defineModel.

Model niestandardowy składa się zwykle z 3 komponentów:

  1. Metadane określające możliwości modelu.
  2. Schemat konfiguracji z dowolnymi parametrami obsługiwanymi przez model.
  3. Funkcja implementująca model akceptujący GenerateRequest i powrót: GenerateResponse.

Aby utworzyć wtyczkę modelu, musisz użyć pakietu @genkit-ai/ai:

npm i --save @genkit-ai/ai

Ogólnie wtyczka modelu może wyglądać tak:

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

Przekształcanie żądań i odpowiedzi

Głównym zadaniem wtyczki modelu Genkit jest przekształcenie GenerateRequest z popularnego formatu Genkit na format rozpoznawalny i obsługiwany przez interfejs API Twojego modelu, a potem przekształcenie odpowiedzi z do formatu GenerateResponseData używanego przez Genkit.

Czasami może to wymagać masowania lub manipulowania danymi, aby obejść ograniczenia modelu. Jeśli na przykład model nie obsługuje natywnie wiadomości system, może być konieczne przekształcenie komunikatu systemowego promptu w parę wiadomości użytkownika/model.

Odwołania do modelu

Po zarejestrowaniu modelu za pomocą defineModel jest on zawsze dostępny, gdy: wymagane jest imię i nazwisko. Jednak aby usprawnić pisanie i autouzupełnianie w IDE, możesz: wyeksportuj z pakietu odwołanie do modelu, które zawiera tylko metadane model, ale nie jego implementacja:

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

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

Gdy wywołujesz funkcję generate(), odwołania do modeli i nazwy modeli w postaci ciągów mogą być używane wymiennie:

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

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

Wtyczki telemetryczne

Zobacz Pisanie wtyczki telemetrycznej Genkit.

Publikowanie wtyczki

Wtyczki Genkit można publikować jako zwykłe pakiety NPM. Aby zwiększyć i zwiększyć wykrywalność i spójność, pakiet powinien mieć nazwę genkitx-{name}, aby wskazać, że jest to wtyczka Genkit i należy dodać parametr te elementy (keywords) w tabeli package.json są dopasowane do wtyczka:

  • genkit-plugin: zawsze umieszczaj to słowo kluczowe w pakiecie, aby wskazać, że chodzi o wtyczkę Genkit.
  • genkit-model: uwzględnij to słowo kluczowe, jeśli pakiet zawiera zdefiniowane jakieś modele.
  • genkit-retriever: dodaj to słowo kluczowe, jeśli w pakiecie są zdefiniowane jakieś retrievery.
  • genkit-indexer: uwzględnij to słowo kluczowe, jeśli pakiet określa jakieś roboty indeksujące.
  • genkit-embedder: uwzględnij to słowo kluczowe, jeśli pakiet określa jakieś roboty indeksujące.
  • genkit-tracestore: uwzględnij to słowo kluczowe, jeśli Twój pakiet określa jakieś magazyny śledzenia.
  • genkit-statestore: uwzględnij to słowo kluczowe, jeśli Twój pakiet określa jakieś magazyny stanu.
  • genkit-telemetry: uwzględnij to słowo kluczowe, jeśli pakiet określa dostawcę telemetrycznego.
  • genkit-deploy: uwzględnij to słowo kluczowe, jeśli pakiet obejmuje osoby pomocne przy wdrażaniu aplikacji Genkit u dostawców chmury.
  • genkit-flow: uwzględnij to słowo kluczowe, jeśli Twój pakiet usprawnia przepływ danych w Genkit.

Wtyczka udostępniająca narzędzia do pobierania, umieszczania i modelu może mieć interfejs package.json podobny do tego:

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