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:
- Metadaten, die die Funktionen des Modells definieren.
- Ein Konfigurationsschema mit allen vom Modell unterstützten Parametern.
- Eine Funktion, die das Modell implementiert,
GenerateRequest
akzeptiert undGenerateResponse
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.
}