Genkit प्लगिन लिखना

Firebase Genkit की सुविधाओं को प्लग इन की मदद से बेहतर बनाया जा सकता है. Genkit प्लग इन, कॉन्फ़िगर किए जा सकने वाले मॉड्यूल होते हैं. इनसे मॉडल, रीट्रिवर, इंडेक्सर, ट्रेस स्टोर वगैरह मिल सकते हैं. Genkit का इस्तेमाल करके, आपको पहले ही प्लग इन काम करते हुए दिख चुके हैं:

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

const ai = genkit({
  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
npm i --save-dev typescript
npx tsc --init

इसके बाद, अपने मुख्य एंट्री पॉइंट से प्लग इन तय करें और उसे एक्सपोर्ट करें:

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

प्लग इन के विकल्पों के बारे में दिशा-निर्देश

आम तौर पर, आपके प्लग इन में एक options आर्ग्युमेंट होना चाहिए. इसमें, प्लग इन के काम करने के लिए ज़रूरी कॉन्फ़िगरेशन शामिल होना चाहिए. एपीआई पासकोड जैसे किसी भी प्लग इन विकल्प के लिए, आपको उसे कॉन्फ़िगर करने के लिए, एक विकल्प और डिफ़ॉल्ट एनवायरमेंट वैरिएबल, दोनों की सुविधा देनी चाहिए:

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

प्लग इन बनाना

एक प्लग इन, Genkit में कई नई चीज़ें चालू कर सकता है. उदाहरण के लिए, Vertex AI प्लगिन कई नए मॉडल के साथ-साथ एम्बेडर को भी चालू करता है.

मॉडल प्लग इन

Genkit मॉडल प्लग इन, Genkit रजिस्ट्री में एक या उससे ज़्यादा जनरेटिव एआई मॉडल जोड़ते हैं. मॉडल, किसी भी जनरेटिव मॉडल को दिखाता है. यह मॉडल, इनपुट के तौर पर प्रॉम्प्ट स्वीकार कर सकता है और आउटपुट के तौर पर टेक्स्ट, मीडिया या डेटा जनरेट कर सकता है. आम तौर पर, मॉडल प्लगिन अपने शुरुआती फ़ंक्शन में एक या उससे ज़्यादा defineModel कॉल करेगा.

आम तौर पर, कस्टम मॉडल में तीन कॉम्पोनेंट होते हैं:

  1. मॉडल की क्षमताओं के बारे में बताने वाला मेटाडेटा.
  2. मॉडल के साथ काम करने वाले किसी खास पैरामीटर वाला कॉन्फ़िगरेशन स्कीमा.
  3. ऐसा फ़ंक्शन जो GenerateRequest को स्वीकार करके GenerateResponse दिखाने वाले मॉडल को लागू करता है.

मॉडल प्लग इन बनाने के लिए, आपको @genkit-ai/ai पैकेज का इस्तेमाल करना होगा:

npm i --save @genkit-ai/ai

हाई लेवल पर, मॉडल प्लग इन कुछ ऐसा दिख सकता है:

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


अनुरोधों और रिस्पॉन्स को बदलना

Genkit मॉडल प्लग इन का मुख्य काम, GenerateRequest को Genkit के सामान्य फ़ॉर्मैट से उस फ़ॉर्मैट में बदलना है जिसे आपके मॉडल के एपीआई से पहचाना और इस्तेमाल किया जा सकता है. इसके बाद, आपके मॉडल से मिले रिस्पॉन्स को Genkit के इस्तेमाल किए जाने वाले GenerateResponseData फ़ॉर्मैट में बदलना है.

कभी-कभी, मॉडल की सीमाओं को दूर करने के लिए, डेटा में बदलाव करने या उसे मैसेज करने की ज़रूरत पड़ सकती है. उदाहरण के लिए, अगर आपका मॉडल 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 प्लग इन को सामान्य 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.
}