جریان می یابد

جریان ها توابعی با برخی ویژگی های اضافی هستند: آنها به شدت تایپ شده، قابل جریان، قابل فراخوانی محلی و از راه دور و کاملاً قابل مشاهده هستند. Firebase Genkit ابزارهای CLI و Developer UI را برای کار با جریان ها (اجرا، اشکال زدایی و غیره) فراهم می کند.

تعریف جریان ها

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

می توانید از CLI برای اجرای جریان ها نیز استفاده کنید:

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 ادغام هایی را برای توابع Cloud برای میزبان های Firebase و Express.js مانند Cloud Run ارائه می دهد.

جریان‌های مستقر از همه ویژگی‌های مشابه جریان‌های محلی (مانند جریان و قابلیت مشاهده) پشتیبانی می‌کنند.

Cloud Function برای 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;
  }
);