โฟลว์เป็นฟังก์ชันที่มีลักษณะเพิ่มเติมบางอย่าง เช่น มีการพิมพ์อย่างชัดเจน สตรีมได้ เรียกใช้ได้ในพื้นที่และจากระยะไกล และสังเกตได้อย่างเต็มรูปแบบ 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;
}
);