โฟลว์คือฟังก์ชันที่รวมเข้าด้วยกันโดยมีลักษณะเฉพาะเพิ่มเติมบางอย่างเหนือการโทรโดยตรง นั่นคือ เป็นฟังก์ชันที่พิมพ์อย่างชัดเจน สตรีมได้ เรียกใช้ได้ในพื้นที่และจากระยะไกล และสังเกตได้โดยสมบูรณ์ Firebase Genkit มีเครื่องมือ CLI และ UI สําหรับนักพัฒนาซอฟต์แวร์สําหรับการเรียกใช้และการแก้ไขข้อบกพร่องของขั้นตอน
การกําหนดโฟลว์
ในรูปแบบที่ง่ายที่สุด โฟลว์จะมีเพียงการรวมฟังก์ชันดังนี้
menuSuggestionFlow := genkit.DefineFlow(
"menuSuggestionFlow",
func(ctx context.Context, restaurantTheme string) (string, error) {
suggestion := makeMenuItemSuggestion(restaurantTheme)
return suggestion, nil
})
ซึ่งจะช่วยให้คุณเรียกใช้ฟังก์ชันจาก Genkit CLI และ UI ของนักพัฒนาซอฟต์แวร์ได้ และเป็นข้อกําหนดสําหรับฟีเจอร์หลายอย่างของ Genkit ซึ่งรวมถึงการทําให้ใช้งานได้จริงและการสังเกตการณ์
ข้อได้เปรียบที่สําคัญของเวิร์กโฟลว์ Genkit เหนือการเรียก API ของโมเดลโดยตรงคือความปลอดภัยของประเภททั้งอินพุตและเอาต์พุต
ประเภทอาร์กิวเมนต์และผลลัพธ์ของโฟลว์อาจเป็นค่าแบบง่ายหรือ Structured Data
Genkit จะสร้างสคีมา JSON สำหรับค่าเหล่านี้โดยใช้ invopop/jsonschema
ขั้นตอนต่อไปนี้ใช้ string
เป็นอินพุตและแสดงผลเป็น struct
type MenuSuggestion struct {
ItemName string `json:"item_name"`
Description string `json:"description"`
Calories int `json:"calories"`
}
menuSuggestionFlow := genkit.DefineFlow(
"menuSuggestionFlow",
func(ctx context.Context, restaurantTheme string) (MenuSuggestion, error) {
suggestion := makeStructuredMenuItemSuggestion(restaurantTheme)
return suggestion, nil
},
)
การทำงาน
วิธีเรียกใช้โฟลว์ในโค้ด
suggestion, err := menuSuggestionFlow.Run(context.Background(), "French")
คุณใช้ CLI เพื่อเรียกใช้โฟลว์ได้เช่นกัน
genkit flow:run menuSuggestionFlow '"French"'
สตรีมแล้ว
ต่อไปนี้เป็นตัวอย่างง่ายๆ ของโฟลว์ที่สตรีมค่าได้
// Types for illustrative purposes.
type InputType string
type OutputType string
type StreamType string
menuSuggestionFlow := genkit.DefineStreamingFlow(
"menuSuggestionFlow",
func(
ctx context.Context,
restaurantTheme InputType,
callback func(context.Context, StreamType) error,
) (OutputType, error) {
var menu strings.Builder
menuChunks := make(chan StreamType)
go makeFullMenuSuggestion(restaurantTheme, menuChunks)
for {
chunk, ok := <-menuChunks
if !ok {
break
}
if callback != nil {
callback(context.Background(), chunk)
}
menu.WriteString(string(chunk))
}
return OutputType(menu.String()), nil
},
)
โปรดทราบว่าไม่สามารถระบุการเรียกกลับของสตรีมมิงได้ ระบบจะกำหนดเฉพาะในกรณีที่ไคลเอ็นต์ที่เรียกใช้กำลังขอการตอบกลับแบบสตรีม
วิธีเรียกใช้โฟลว์ในโหมดสตรีมมิง
menuSuggestionFlow.Stream(
context.Background(),
"French",
)(func(sfv *genkit.StreamFlowValue[OutputType, StreamType], err error) bool {
if err != nil {
// handle err
return false
}
if !sfv.Done {
fmt.Print(sfv.Stream)
return true
} else {
fmt.Print(sfv.Output)
return false
}
})
หากโฟลว์ไม่ได้ใช้การสตรีม StreamFlow()
จะทํางานเหมือนกับ
RunFlow()
คุณใช้ CLI เพื่อสตรีมโฟลว์ได้ด้วย โดยทำดังนี้
genkit flow:run menuSuggestionFlow '"French"' -s
การติดตั้งใช้งานขั้นตอน
หากต้องการเข้าถึงโฟลว์ผ่าน HTTP คุณจะต้องทำให้โฟลว์ใช้งานได้ก่อน
หากต้องการทำให้โฟลว์ใช้งานได้โดยใช้ Cloud Run และบริการที่คล้ายกัน ให้กําหนดโฟลว์ แล้วเรียกใช้ Init()
ดังนี้
func main() {
genkit.DefineFlow(
"menuSuggestionFlow",
func(ctx context.Context, restaurantTheme string) (string, error) {
// ...
return "", nil
},
)
if err := genkit.Init(context.Background(), nil); err != nil {
log.Fatal(err)
}
}
Init
เริ่มเซิร์ฟเวอร์ net/http
ที่แสดงโฟลว์เป็นปลายทาง HTTP (เช่น http://localhost:3400/menuSuggestionFlow
)
พารามิเตอร์ที่ 2 คือ Options
ที่ไม่บังคับซึ่งระบุข้อมูลต่อไปนี้
FlowAddr
: ที่อยู่และพอร์ตที่จะฟัง หากไม่ระบุ เซิร์ฟเวอร์จะรับคำสั่งบนพอร์ตที่ระบุโดยตัวแปรสภาพแวดล้อมของพอร์ต หากเว้นว่างไว้ เซิร์ฟเวอร์จะใช้ค่าเริ่มต้นของพอร์ต 3400Flows
: การแสดงโฆษณาตามกลุ่มเป้าหมาย หากไม่ได้ระบุInit
จะแสดงโฟลว์ทั้งหมดที่คุณกําหนด
หากต้องการแสดงโฟลว์ในโฮสต์และพอร์ตเดียวกับปลายทางอื่นๆ ให้ตั้งค่า FlowAddr
เป็น -
แล้วเรียกใช้ NewFlowServeMux()
เพื่อรับตัวแฮนเดิลสำหรับโฟลว์ Genkit แทน ซึ่งคุณจะมัลติเพล็กซ์กับตัวแฮนเดิลเส้นทางอื่นๆ ได้ ดังนี้
mainMux := http.NewServeMux()
mainMux.Handle("POST /flow/", http.StripPrefix("/flow/", genkit.NewFlowServeMux(nil)))
ความสามารถในการสังเกตโฟลว์
บางครั้งเมื่อใช้ SDK ของบุคคลที่สามที่ไม่ได้ใช้เครื่องมือในการสังเกต คุณอาจต้องดู SDK เหล่านั้นเป็นขั้นตอนการติดตามแยกต่างหากใน UI ของนักพัฒนาซอฟต์แวร์ คุณเพียงแค่ต้องรวมโค้ดไว้ในฟังก์ชัน run
genkit.DefineFlow(
"menuSuggestionFlow",
func(ctx context.Context, restaurantTheme string) (string, error) {
themes, err := genkit.Run(ctx, "find-similar-themes", func() (string, error) {
// ...
return "", nil
})
// ...
return themes, err
})