كتابة مكونات 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 واحدة يجب أن تتضمّن أي إعدادات على مستوى المكوِّن الإضافي ضرورية لتعمل. بالنسبة إلى أي خيار مكوّن إضافي يتطلب قيمة سرية، مثل مفاتيح واجهة برمجة التطبيقات، يجب توفير خيار ومتغير تلقائي للبيئة لتهيئته:

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. يمثل النموذج أي نموذج توليدي قادر على تلقي مطالبة كإدخال وإنشاء نص أو وسائط أو بيانات كمخرجات. بشكل عام، سيُجري المكوِّن الإضافي للطراز طلبًا واحدًا أو أكثر من طلبات defineModel في وظيفة الإعداد الخاصة به.

يتألف النموذج المخصّص عادةً من ثلاثة مكوّنات:

  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 إلى تنسيق يمكن التعرف عليه ومتوافق مع واجهة برمجة تطبيقات النموذج الخاص بك، ثم تحويل الرد من نموذجك إلى تنسيق 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 Telemetry.

نشر مكوّن إضافي

يمكن نشر مكونات Genkit الإضافية كحزم NPM عادية. لزيادة قابلية الاكتشاف وزيادة الاتّساق، يجب تسمية حزمتك باسم genkitx-{name} للإشارة إلى أنّها مكوّن إضافي من Genkit ويجب تضمين العديد من keywords التالية في package.json حسب الصلة بالمكوّن الإضافي:

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