Genkit-Plug-ins schreiben

Die Funktionen von Firebase Genkit wurden durch Plug-ins erweitert. Genkit-Plug-ins sind konfigurierbare Module die Modelle, Fetcher, Indexierung, Trace-Speicher und mehr zur Verfügung stellen können. Sie haben bereits Plug-ins in ganz einfach mit Genkit:

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

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

Das Vertex AI-Plug-in verwendet die Konfiguration (z. B. die Google Cloud-Projekt-ID des Nutzers) und registriert eine Vielzahl neuer Modelle, Embedder und mehr in der Genkit-Registrierung. Die Registry unterstützt die lokale Benutzeroberfläche von Genkit zum Ausführen und die Überprüfung von Modellen, Prompts und mehr. Außerdem dient sie als Suchdienst für benannte Aktionen zur Laufzeit ausführen.

Plug-in erstellen

Normalerweise erstellen Sie ein neues NPM-Paket, um ein Plug-in zu erstellen:

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

Definieren und exportieren Sie dann Ihr Plug-in über Ihren Haupteinstiegspunkt:

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

Informationen zu Plug-in-Optionen

Im Allgemeinen sollte dein Plug-in ein einzelnes options-Argument annehmen, das alle für die Funktion erforderlichen pluginweiten Konfigurationen enthält. Für alle Plug-in-Optionen, einen Secret-Wert wie API-Schlüssel erfordert, sollten Sie sowohl eine Option Standard-Umgebungsvariable, um sie zu konfigurieren:

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

Plug-in erstellen

Ein einzelnes Plug-in kann viele neue Elemente in Genkit aktivieren. Das Vertex AI-Plug-in aktiviert beispielsweise mehrere neue Modelle sowie einen Embedder.

Modell-Plug-ins

Mit Genkit-Modell-Plug-ins werden der Genkit-Registry ein oder mehrere generative KI-Modelle hinzugefügt. Ein Modell ist ein beliebiges generatives Modell, das einen Prompt als Eingabe entgegennehmen und Text, Medien oder Daten als Ausgabe generieren kann. In der Regel führt ein Modell-Plug-in in seiner Initialisierungsfunktion einen oder mehrere defineModel-Aufrufe aus.

Ein benutzerdefiniertes Modell besteht in der Regel aus drei Komponenten:

  1. Metadaten, die die Funktionen des Modells definieren.
  2. Ein Konfigurationsschema mit allen vom Modell unterstützten Parametern.
  3. Eine Funktion, die das Modell implementiert, das GenerateRequest und mit Rückgabe von GenerateResponse.

Zum Erstellen eines Modell-Plug-ins müssen Sie das Paket @genkit-ai/ai verwenden:

npm i --save @genkit-ai/ai

Ein Modell-Plug-in könnte in etwa so aussehen:

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

Anfragen und Antworten transformieren

Die Hauptaufgabe eines Genkit-Modell-Plug-ins besteht darin, das GenerateRequest aus dem gängigen Genkit-Format in ein Format umzuwandeln, das von der API Ihres Modells erkannt und unterstützt wird, und dann die Antwort Ihres Modells in das von Genkit verwendete GenerateResponseData-Format umzuwandeln.

Manchmal müssen die Daten dabei massiert oder verändert werden, um Einschränkungen des Modells zu umgehen. Wenn Ihr Modell beispielsweise eine system-Nachricht nicht nativ unterstützt, müssen Sie möglicherweise die Systemnachricht einer Aufforderung in ein Nutzer/Modell-Nachrichtenpaar umwandeln.

Modellreferenzen

Nachdem ein Modell mit defineModel registriert wurde, ist es immer verfügbar, wenn es per Name angefordert wird. Zur Verbesserung der Eingabe und der IDE-Autovervollständigung können Sie eine Modellreferenz aus Ihrem Paket zu exportieren, die nur die Metadaten für ein Modell, aber nicht seine Implementierung:

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

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

Beim Aufrufen von generate() können Modellreferenzen und Zeichenfolgenmodellnamen austauschbar verwendet werden:

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

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

Telemetrie-Plug-ins

Siehe Genkit Telemetry-Plug-in schreiben.

Plug-in veröffentlichen

Genkit-Plug-ins können als normale NPM-Pakete veröffentlicht werden. Um die Auffindbarkeit zu erhöhen und für Einheitlichkeit zu sorgen, sollte Ihr Paket den Namen genkitx-{name} haben, um anzuzeigen, dass es sich um ein Genkit-Plug-in handelt. Außerdem sollten Sie in Ihrer package.json so viele der folgenden keywords angeben, wie für Ihr Plug-in relevant sind:

  • genkit-plugin: Nehmen Sie dieses Keyword immer in das Paket auf, um anzugeben, dass es sich um ein Genkit-Plug-in handelt.
  • genkit-model: Fügen Sie dieses Keyword hinzu, wenn Ihr Paket Modelle definiert.
  • genkit-retriever: Fügen Sie dieses Keyword hinzu, wenn Ihr Paket Abholer definiert.
  • genkit-indexer: Fügen Sie dieses Keyword hinzu, wenn Ihr Paket Indexierung definiert.
  • genkit-embedder: Fügen Sie dieses Keyword ein, wenn Ihr Paket Indexierungsprogramme definiert.
  • genkit-tracestore: Fügen Sie dieses Keyword hinzu, wenn Ihr Paket Trace-Stores definiert.
  • genkit-statestore: Fügen Sie dieses Keyword hinzu, wenn Ihr Paket Statusspeicher definiert.
  • genkit-telemetry: Verwenden Sie dieses Schlüsselwort, wenn in Ihrem Paket ein Telemetrieanbieter definiert ist.
  • genkit-deploy: Verwenden Sie dieses Schlüsselwort, wenn Ihr Paket Hilfselemente zur Bereitstellung von Genkit-Anwendungen für Cloud-Anbieter enthält.
  • genkit-flow: Verwenden Sie dieses Keyword, wenn Ihr Paket Genkit-Abläufe optimiert.

Ein Plug-in, das einen Retriever, einen Embedder und ein Modell bereitstellt, könnte eine package.json haben, die so aussieht:

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