Genkit-Plug-ins schreiben

Die Funktionen von Firebase Genkit können durch Plug-ins erweitert werden. Genkit-Plug-ins sind konfigurierbare Module, die unter anderem Modelle, Abrufprogramme, Indexierer und Trace-Stores bereitstellen können. Sie haben bereits Plug-ins in Genkit gesehen:

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

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

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

Plug-in erstellen

Wenn Sie ein Plug-in erstellen möchten, sollten Sie in der Regel ein neues NPM-Paket erstellen:

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

Definiere und exportiere dein Plug-in dann über den Haupteinstiegspunkt:

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

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 jede Plug-in-Option, für die ein geheimer Wert erforderlich ist, z. B. API-Schlüssel, sollten Sie sowohl eine Option als auch eine Standardumgebungsvariable zum Konfigurieren anbieten:

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

Plug-in erstellen

Mit einem einzigen Plug-in können viele neue Funktionen in Genkit aktiviert werden. 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, GenerateRequest akzeptiert und GenerateResponse zurückgibt.

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

npm i --save @genkit-ai/ai

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

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


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 Daten angepasst oder manipuliert werden, um Modelleinschränkungen zu umgehen. Wenn Ihr Modell beispielsweise keine system-Nachricht nativ unterstützt, müssen Sie die Systemnachricht eines Prompts möglicherweise in ein Nutzer-/Modellnachrichtenpaar umwandeln.

Modellreferenzen

Nachdem ein Modell mit defineModel registriert wurde, ist es immer verfügbar, wenn es per Name angefordert wird. Um das Tippen und die automatische Vervollständigung in der IDE zu verbessern, können Sie jedoch eine Modellreferenz aus Ihrem Paket exportieren, die nur die Metadaten für ein Modell, aber nicht dessen Implementierung enthält:

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

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: Fügen Sie dieses Keyword immer in Ihr Paket ein, 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 Indexierungsprogramme definiert.
  • genkit-embedder: Fügen Sie dieses Keyword hinzu, 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: Geben Sie dieses Keyword an, wenn Ihr Paket einen Anbieter für die Erfassung von Messwerten definiert.
  • genkit-deploy: Geben Sie dieses Keyword an, wenn Ihr Paket Hilfsprogramme zum Bereitstellen von Genkit-Apps bei Cloud-Anbietern enthält.
  • genkit-flow: Fügen Sie dieses Keyword hinzu, wenn Ihr Paket Genkit-Abläufe erweitert.

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