Pisanie wtyczek Genkit

Funkcje Firebase Genkit zostały zaprojektowane tak, aby można je było rozszerzać za pomocą wtyczek. Wtyczki Genkit to konfigurowalne moduły, które mogą udostępniać modele, moduły pobierania, indeksery, magazyny śledzenia itp. Wiesz już, jak działają wtyczki dzięki 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. identyfikator projektu Google Cloud użytkownika) i rejestruje w rejestrze Genkit różne nowe modele, elementy do umieszczenia i inne elementy. Rejestr jest używany w lokalnym interfejsie użytkownika Genkit do uruchamiania i sprawdzania modeli, promptów i nie tylko. Służy również jako usługa wyszukiwania nazw działań w czasie działania.

Tworzenie wtyczki

Aby utworzyć wtyczkę, najlepiej jest 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ć jeden argument options, który zawiera dowolną konfigurację obejmującą całą wtyczkę, która jest niezbędna do działania. W przypadku każdej opcji wtyczki, która wymaga wartości obiektu tajnego, np. kluczy interfejsu API, musisz udostępnić zarówno opcję, jak i domyślną zmienną środowiskową do jej konfigurowania:

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

Jedna wtyczka może aktywować wiele nowych rzeczy w Genkit. Na przykład wtyczka Vertex AI aktywuje kilka nowych modeli oraz narzędzie do umieszczania.

Wtyczki modelu

Wtyczki modelu Genkit dodają co najmniej 1 model generatywnej AI do rejestru Genkit. Model reprezentuje każdy model generatywny, który może odbierać prompt jako dane wejściowe i generować tekst, multimedia lub dane jako dane wyjściowe. Ogólnie wtyczka modelu wykonuje w ramach 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 określonymi parametrami obsługiwanymi przez model.
  3. Funkcja, która implementuje model akceptujący GenerateRequest i zwracający 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ć mniej więcej 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, który jest rozpoznawany i obsługiwany przez interfejs API Twojego modelu, a następnie przekształcenie odpowiedzi z modelu na format GenerateResponseData używany przez Genkit.

Czasami może to wymagać masowania lub manipulowania danymi w celu obejścia ograniczeń modelu. Jeśli na przykład Twój model natywnie nie obsługuje komunikatu system, może być konieczne przekształcenie komunikatu systemowego promptu w parę wiadomości użytkownik/model.

Odwołania do modelu

Po zarejestrowaniu modelu za pomocą defineModel jest on zawsze dostępny, gdy zostanie zażądany jego nazwa. Jednak aby poprawić wpisywanie i autouzupełnianie w IDE, możesz wyeksportować z pakietu odniesienie do modelu, które zawiera tylko metadane modelu, ale nie jego implementację:

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(), odniesienia do modelu i nazwy modeli w postaci ciągów mogą być używane zamiennie:

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 Zapisywanie wtyczki telemetrycznej Genkit.

Publikowanie wtyczki

Wtyczki Genkit można publikować jako normalne pakiety NPM. Aby zwiększyć wykrywalność i zmaksymalizować spójność pakietu, nadaj pakietowi nazwę genkitx-{name}, by zaznaczyć, że jest to wtyczka Genkit. Dodatkowo w interfejsie package.json uwzględnij jak najwięcej z tych elementów keywords, które mają znaczenie dla Twojej wtyczki:

  • genkit-plugin: zawsze dodawaj to słowo kluczowe do pakietu, by zaznaczyć, że jest to wtyczka Genkit.
  • genkit-model: uwzględnij to słowo kluczowe, jeśli Twój pakiet definiuje jakieś modele.
  • genkit-retriever: uwzględnij to słowo kluczowe, jeśli w pakiecie są zdefiniowane moduły pobierające.
  • genkit-indexer: uwzględnij to słowo kluczowe, jeśli Twój pakiet określa indeksatory.
  • genkit-embedder: uwzględnij to słowo kluczowe, jeśli Twój pakiet określa indeksatory.
  • genkit-tracestore: uwzględnij to słowo kluczowe, jeśli w pakiecie są zdefiniowane magazyny śledzenia.
  • genkit-statestore: uwzględnij to słowo kluczowe, jeśli pakiet zawiera sklepy stanowe.
  • genkit-telemetry: uwzględnij to słowo kluczowe, jeśli pakiet określa dostawcę usług telemetrycznych.
  • genkit-deploy: uwzględnij to słowo kluczowe, jeśli pakiet zawiera pomocników we wdrażaniu aplikacji Genkit u dostawców chmury.
  • genkit-flow: uwzględnij to słowo kluczowe, jeśli Twój pakiet ulepsza przepływy Genkit.

Wtyczka, która udostępnia mechanizm pobierania, narzędzie do umieszczania elementów i model, może mieć atrybut package.json podobny do tego:

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