זרימות

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

הגדרת תהליכים

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 Functions for Firebase ולמארחים של Express.js, כמו Cloud Run.

תהליכים שנפרסו תומכים בכל התכונות של תהליכים מקומיים (כמו סטרימינג וניטור).

הפונקציה של Cloud Functions ל-Firebase

כדי להשתמש בתהליכים עם Cloud Functions for 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 יציג את כל התהליכים שהגדרת ב-codebase כנקודות קצה (endpoint) של HTTP (למשל http://localhost:3400/menuSuggestionFlow). אפשר להפעיל תהליך באמצעות בקשת POST באופן הבא:

curl -X POST "http://localhost:3400/menuSuggestionFlow" -H "Content-Type: application/json"  -d '{"data": "banana"}'

במקרה הצורך, ניתן להתאים אישית את שרת ה-תהליכים כדי להציג רשימה ספציפית של תהליכים, כפי שמוצג בהמשך. אפשר גם לציין יציאה מותאמת אישית (אם משתנה הסביבה 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: '*',
  },
});

ניראות (observability) הזרימה

לפעמים כשמשתמשים בערכות SDK של צד שלישי שלא מותאמות לניראות (observability), כדאי לראות אותן כשלב נפרד למעקב בממשק המשתמש למפתחים. כל מה שצריך לעשות הוא לתחום את הקוד בפונקציה 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;
  }
);