ขั้นตอน

โฟลว์เป็นฟังก์ชันที่มีลักษณะเพิ่มเติมบางอย่าง เช่น มีการพิมพ์อย่างชัดเจน สตรีมได้ เรียกใช้ได้ในพื้นที่และจากระยะไกล และสังเกตได้อย่างเต็มรูปแบบ Firebase Genkit มีเครื่องมือ UI ของนักพัฒนาซอฟต์แวร์และ 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 สำหรับโฮสต์ Firebase และ Express.js เช่น Cloud Run

โฟลว์ที่ทำให้ใช้งานได้รองรับฟีเจอร์ทั้งหมดเดียวกันกับขั้นตอนในเครื่อง (เช่น การสตรีมและการสังเกต)

Cloud Function สำหรับ 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 จะแสดงโฟลว์ทั้งหมดที่คุณกำหนดไว้ในฐานของโค้ดเป็นปลายทาง 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 ของบุคคลที่สามที่ไม่ได้ใช้เครื่องมือสำหรับความสามารถในการสังเกต คุณอาจต้องการดู SDK เหล่านั้นเป็นขั้นตอนการติดตามแยกต่างหากใน UI ของนักพัฒนาซอฟต์แวร์ คุณเพียงแค่ต้องรวมโค้ดไว้ในฟังก์ชัน 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;
  }
);