כתיבת פלאגינים של Genkit

היכולות של Firebase Genkit מיועדות להרחבה באמצעות יישומי פלאגין. הפלאגינים של Genkit הם מודולים שניתנים להתאמה אישית, שיכולים לספק מודלים, שירותי אחזור, שירותי הוספה לאינדקס, מאגרי מעקב ועוד. כבר ראיתם תוספים בפעולה באמצעות Genkit:

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

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

הפלאגין של Vertex AI מקבל את ההגדרות האישיות (למשל, Google Cloud של המשתמש מזהה פרויקט) ולרשום מגוון מודלים חדשים, הטמעות ועוד רישום Genkit. הרישום מפעיל את ממשק המשתמש המקומי של Genkit להפעלה ולבדיקה של מודלים, הנחיות ועוד, וגם משמש כשירות חיפוש של פעולות בעלות שם בזמן הריצה.

יצירת פלאגין

כדי ליצור פלאגין, בדרך כלל כדאי ליצור חבילת 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

לאחר מכן, מגדירים את הפלאגין ומיצאים אותו מנקודת הכניסה הראשית:

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

הנחיות לגבי אפשרויות יישומי פלאגין

באופן כללי, התוסף צריך לקבל ארגומנטים options יחיד שכולל את כל ההגדרות ברמת התוסף שנדרשות לתפקוד שלו. לכל אפשרות של יישומי פלאגין שנדרש ערך סודי, כמו מפתחות API, צריך להציע גם אפשרות וגם משתנה הסביבה שמוגדר כברירת מחדל כדי להגדיר אותו:

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

פיתוח הפלאגין

פלאגין אחד יכול להפעיל הרבה דברים חדשים ב-Genkit. לדוגמה, הפלאגין של Vertex AI מפעיל כמה מודלים חדשים וגם כלי להטמעה.

יישומי פלאגין של דגם

יישומי הפלאגין של המודלים ב-Genkit מוסיפים למרשם של Genkit מודל אחד או יותר של AI גנרטיבי. מודל מייצג כל מודל גנרטיבי שיכול לקבל הנחיה כקלט וליצור טקסט, מדיה או נתונים כפלט. באופן כללי, פלאגין של מודל יבצע קריאה אחת או יותר ל-defineModel בפונקציית האי initialization שלו.

מודל מותאם אישית מורכב בדרך כלל משלושה רכיבים:

  1. מטא-נתונים שמגדירים את היכולות של המודל.
  2. סכימת הגדרות אישיות עם פרמטרים ספציפיים שנתמכים על ידי המודל.
  3. פונקציה שמממשת את המודל שמקבל את GenerateRequest החזרה GenerateResponse.

כדי לבנות פלאגין של מודל, צריך להשתמש בחבילה @genkit-ai/ai:

npm i --save @genkit-ai/ai

ברמת העל, פלאגין של מודל עשוי להיראות כך:

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

טרנספורמציה של בקשות ותגובות

העבודה העיקרית של פלאגין של מודל Genkit משנה את GenerateRequest מהפורמט הנפוץ של Genkit לפורמט מזוהה שנתמכים על ידי ה-API של המודל, ואז משנים את התגובה בפורמט GenerateResponseData שמשמש את Genkit.

לפעמים הדבר עשוי לדרוש ביצוע אנונימיזציה או מניפולציה של הנתונים כדי לעקוף את מגבלות המודל. לדוגמה, אם המודל לא תומך במקור בהודעה מסוג system, יכול להיות שתצטרכו להפוך את הודעת המערכת של ההנחיה לצמד הודעות של משתמש או מודל.

הפניות למודלים

אחרי שמירשם מודל באמצעות defineModel, הוא תמיד זמין כשמבקשים אותו לפי שם. עם זאת, כדי לשפר את ההקלדה ואת ההשלמה האוטומטית של סביבת הפיתוח המשולבת (IDE), אפשר לייצא מהחבילה הפניה למודל שכוללת רק את המטא-נתונים של המודל, אבל לא את ההטמעה שלו:

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

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

כשקוראים ל-generate(), אפשר להשתמש בהפניות למודלים ובשמות של מודלים של מחרוזות באופן חלופי:

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

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

פלאגינים של טלמטריה

כתיבה של פלאגין טלמטריה של Genkit

פרסום פלאגין

ניתן לפרסם יישומי פלאגין של Genkit כחבילות NPM רגילות. כדי לשפר את היכולת למצוא את הפלאגין ולשמור על עקביות, כדאי לקרוא לחבילה genkitx-{name} כדי לציין שהיא פלאגין של Genkit, ולכלול ב-package.json כמה שיותר מה-keywords הבאים שרלוונטיים לפלאגין:

  • genkit-plugin: תמיד צריך לכלול את מילת המפתח הזו בחבילה כדי לציין שהיא פלאגין של Genkit.
  • genkit-model: כוללים את מילת המפתח הזו אם החבילה מגדירה מודלים כלשהם.
  • genkit-retriever: צריך לכלול את מילת המפתח הזו אם החבילה שלכם מגדירה רטריזרים כלשהם.
  • genkit-indexer: צריך לכלול את מילת המפתח הזו אם החבילה שלכם מגדירה אינדקסים כלשהם.
  • genkit-embedder: צריך לכלול את מילת המפתח הזו אם החבילה מגדירה מפתחות אינדקס.
  • genkit-tracestore: צריך לכלול את מילת המפתח הזו אם בחבילה מוגדרים מאגרים של מעקב המרות.
  • genkit-statestore: צריך לכלול את מילת המפתח הזו אם בחבילה מוגדרות חנויות במדינה.
  • genkit-telemetry: כוללים את מילת המפתח הזו אם החבילה מגדירה ספק טלמטריה.
  • genkit-deploy: צריך לכלול את מילת המפתח הזו אם החבילה כוללת עוזרים לפריסת אפליקציות של Genkit אצל ספקי שירותי ענן.
  • genkit-flow: צריך לכלול את מילת המפתח הזו אם החבילה משפרת את תהליכי Genkit.

פלאגין שסיפק רטריבר, כלי הטמעה ומודל עשוי לכלול package.json שנראה כך:

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