Luồng

Flow là hàm có một số đặc điểm bổ sung: chúng được định kiểu rõ ràng, có thể phát trực tuyến, có thể gọi cục bộ và từ xa, đồng thời có thể ghi nhận được toàn bộ. Firebase Genkit cung cấp công cụ CLI và Giao diện người dùng dành cho nhà phát triển để xử lý các luồng (chạy, gỡ lỗi, v.v.).

Xác định luồng

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

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

    return suggestion;
  }
);

Bạn có thể xác định giản đồ đầu vào và đầu ra cho các luồng bằng 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;
  }
);

Khi bạn chỉ định giản đồ, Genkit sẽ xác thực giản đồ cho đầu vào và đầu ra.

Luồng đang chạy

Sử dụng hàm runFlow để chạy luồng:

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

Bạn c��ng có thể sử dụng CLI để chạy luồng:

genkit flow:run menuSuggestionFlow '"French"'

Đã phát trực tiếp

Dưới đây là ví dụ đơn giản về một luồng có thể truyền trực tuyến giá trị từ một luồng:

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

Xin lưu ý rằng streamingCallback có thể là không xác định. Thuộc tính này chỉ được xác định nếu ứng dụng gọi đang yêu cầu phản hồi được truyền trực tuyến.

Để gọi một luồng ở chế độ phát trực tuyến, hãy sử dụng hàm streamFlow:

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

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

Nếu luồng không triển khai phương thức truyền trực tuyến, streamFlow sẽ hoạt động giống với runFlow.

Bạn cũng có thể dùng CLI để truyền trực tuyến luồng:

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

Triển khai luồng

Nếu muốn có thể truy cập vào flow của mình qua HTTP, trước tiên, bạn cần triển khai flow này. Genkit cung cấp tính năng tích hợp Cloud Functions cho Firebase và máy chủ Express.js như Cloud Run.

Luồng được triển khai hỗ trợ tất cả tính năng tương tự như luồng cục bộ (như truyền trực tuyến và khả năng quan sát).

Hàm đám mây cho Firebase

Để sử dụng luồng với Cloud Functions cho Firebase, hãy sử dụng trình bổ trợ firebase, thay thế defineFlow bằng onFlow và thêm một 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

Để triển khai flow bằng Cloud Run và các dịch vụ tương tự, hãy xác định flow bằng defineFlow rồi gọi startFlowsServer():

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

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

startFlowsServer();

Theo mặc định, startFlowsServer sẽ phân phát tất cả các flow mà bạn đã xác định trong cơ sở mã của mình dưới dạng các điểm cuối HTTP (ví dụ: http://localhost:3400/menuSuggestionFlow).

Bạn có thể chọn luồng được hiển thị thông qua máy chủ luồng. Bạn có thể chỉ định một cổng tuỳ chỉnh (cổng sẽ sử dụng biến môi trường PORT nếu được đặt). Bạn cũng có thể đặt chế độ cài đặt 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: '*',
  },
});

Khả năng quan sát dòng chảy

Đôi khi, khi sử dụng những SDK của bên thứ ba không được đo lường để quan sát, có thể bạn sẽ muốn xem chúng như một bước theo dõi riêng trong Giao diện người dùng dành cho nhà phát triển. Bạn chỉ cần gói mã đó vào hàm 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;
  }
);