Luồng

Luồng là các hàm có một số đặc điểm bổ sung: chúng được định kiểu rõ ràng, truyền trực tuyến, cục bộ và có thể gọi từ xa, đồng thời có thể quan sát 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 để làm việc với 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 đồ này cho dữ liệu đầu vào và đầu ra.

Luồng đang chạy

Dùng hàm runFlow để chạy quy trình:

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

Bạn cũng có thể sử dụng CLI để chạy các 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 các 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);
      });
    }
  }
);

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 dùng hàm streamFlow:

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

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

Nếu flow không triển khai việc truyền trực tuyến streamFlow sẽ hoạt động giống hệt với runFlow.

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

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

Triển khai luồng

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

Các luồng đã triển khai hỗ trợ tất cả các tính năng tương tự như các luồng cục bộ (chẳng hạn như luồng và khả năng quan sát).

Chức năng đám mây cho Firebase

Để sử dụng các luồng bằng Chức năng đám mây 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 các luồng bằng Cloud Run và các dịch vụ tương tự, hãy xác định các luồng 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 luồng mà bạn đã xác định trong cơ sở mã của mình dưới dạng điểm cuối HTTP (ví dụ: http://localhost:3400/menuSuggestionFlow).

Bạn có thể chọn những luồng sẽ được hiển thị 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ể thiết lập 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 SDK của bên thứ ba không được đo lường để ghi nhận, bạn có thể muốn xem chúng dưới dạng một bước theo dõi riêng biệt trong giao diện người dùng dành cho Nhà phát triển. Bạn chỉ cần gói mã này trong 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;
  }
);