التدفقات

التدفقات هي دوال لها بعض الخصائص الإضافية: أنها مكتوبة بقوة، وقابلة للتدفق، وقابلة للاتصال محليًا وعن بُعد، ويمكن ملاحظتها بالكامل. يوفر Firebase Genkit أدوات واجهة سطر الأوامر وواجهة المستخدم للمطور للعمل مع التدفقات (التشغيل وتصحيح الأخطاء وما إلى ذلك).

تحديد التدفقات

import { defineFlow } from '@genkit-ai/flow';

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
  },
  async (restaurantTheme) => {
    const suggestion = makeMenuItemSuggestion(restaurantTheme);

    return suggestion;
  }
);

يمكن تحديد مخططات الإدخال والإخراج للتدفقات باستخدام zod.

import { defineFlow } from '@genkit-ai/flow';
import * as z from 'zod';

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
    inputSchema: z.string(),
    outputSchema: z.string(),
  },
  async (restaurantTheme) => {
    const suggestion = makeMenuItemSuggestion(input.restaurantTheme);

    return suggestion;
  }
);

عند تحديد المخطط، ستتحقّق Genkit من صحة المخطط للمدخلات والمخرجات.

التدفقات الجارية

استخدِم الدالة runFlow لتشغيل التدفق:

const response = await runFlow(menuSuggestionFlow, 'French');

يمكنك استخدام واجهة سطر الأوامر لتشغيل التدفقات أيضًا:

genkit flow:run menuSuggestionFlow '"French"'

بث مكتمل

فيما يلي مثال بسيط لتدفق يمكن أن يتدفق القيم من التدفق:

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
    streamSchema: z.string(),
  },
  async (restaurantTheme, streamingCallback) => {
    if (streamingCallback) {
      makeMenuItemSuggestionsAsync(restaurantTheme).subscribe((suggestion) => {
        streamingCallback(suggestion);
      });
    }
  }
);

تجدر الإشارة إلى أنّه يمكن أن تكون السمة streamingCallback غير معرَّفة. ولا يتم تحديده إلا إذا كان عميل الاستدعاء يطلب استجابة بث.

ولاستدعاء مسار في وضع البث، استخدِم الوظيفة streamFlow:

const response = streamFlow(menuSuggestionFlow, 'French');

for await (const suggestion of response.stream()) {
  console.log('suggestion', suggestion);
}

وإذا لم يؤدِ التدفق إلى تنفيذ البث، ستعمل ميزة streamFlow بشكلٍ مماثل للسلوك runFlow.

يمكنك استخدام واجهة سطر الأوامر (CLI) لتدفق البيانات أيضًا:

genkit flow:run menuSuggestionFlow '"French"' -s

تدفقات النشر

إذا أردت التمكّن من الوصول إلى التدفق عبر HTTP، عليك نشره أولاً. توفّر Genkit عمليات دمج لدوال السحابة في Firebase ومضيفات Express.js مثل Cloud Run.

تدعم التدفقات المنشورة جميع الميزات نفسها المتوفرة في التدفقات المحلية (مثل البث والملاحظة).

وظيفة السحابة الإلكترونية لبرنامج Firebase

لاستخدام التدفقات مع دوال السحابة الإلكترونية في Firebase، استخدِم المكوِّن الإضافي firebase، واستبدِل defineFlow بـ onFlow، وضمِّن authPolicy.

import { onFlow } from '@genkit-ai/firebase/functions';
import { firebaseAuth } from '@genkit-ai/firebase/auth';

export const menuSuggestionFlow = onFlow(
  {
    name: 'menuSuggestionFlow',
    authPolicy: firebaseAuth((user) => {
      if (!user.email_verified) {
        throw new Error("Verified email required to run flow");
      }
    }
  },
  async (restaurantTheme) => {
    // ....
  }
);

مقتطف Express.js

لنشر المسارات باستخدام Cloud Run والخدمات المشابهة، حدِّد المسارات باستخدام defineFlow، ثم استدعِ startFlowsServer():

import { defineFlow, startFlowsServer } from '@genkit-ai/flow';

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
  },
  async (restaurantTheme) => {
    // ....
  }
);

startFlowsServer();

سيقدّم startFlowsServer بشكل تلقائي جميع المسارات التي حدّدتها في قاعدة الرموز كنقاط نهاية HTTP (مثل http://localhost:3400/menuSuggestionFlow).

ويمكنك اختيار التدفقات التي يتم عرضها عبر خادم التدفقات. يمكنك تحديد منفذ مخصّص (سيتم استخدام متغير بيئة PORT في حال ضبطه). يمكنك أيضًا ضبط إعدادات CORS.

import { defineFlow, startFlowsServer } from '@genkit-ai/flow';

export const flowA = defineFlow({ name: 'flowA' }, async (subject) => {
  // ....
});

export const flowB = defineFlow({ name: 'flowB' }, async (subject) => {
  // ....
});

startFlowsServer({
  flows: [flowB],
  port: 4567,
  cors: {
    origin: '*',
  },
});

قابلية ملاحظة التدفق

في بعض الأحيان، عند استخدام حِزم تطوير برامج (SDK) تابعة لجهات خارجية لم يتم ضبط إعداداتها لرصد البيانات، قد تحتاج إلى الاطّلاع عليها كخطوة تتبُّع منفصلة في واجهة مستخدم المطوِّر. ما عليك سوى لف الرمز في الدالة run.

import { defineFlow, run } from '@genkit-ai/flow';

export const menuSuggestionFlow = defineFlow(
  {
    name: 'menuSuggestionFlow',
    outputSchema: z.array(s.string()),
  },
  async (restaurantTheme) => {
    const themes = await run('find-similar-themes', async () => {
      return await findSimilarRestaurantThemes(restaurantTheme);
    });

    const suggestions = makeMenuItemSuggestions(themes);

    return suggestions;
  }
);