โฟลว์คือฟังก์ชันที่รวมเข้าด้วยกันซึ่งมีลักษณะเพิ่มเติมบางอย่างมากกว่าโดยตรง การโทร: การโทรเป็นการพิมพ์อย่างชัดเจน สตรีมได้ โทรออกได้ภายในประเทศและจากระยะไกล สามารถสังเกตได้ทั้งหมด Firebase Genkit มีเครื่องมือ UI สำหรับนักพัฒนาซอฟต์แวร์และ CLI สำหรับการเรียกใช้และการแก้ไขข้อบกพร่อง
การกำหนดขั้นตอน
ในรูปแบบที่ง่ายที่สุด โฟลว์จะมีเพียงฟังก์ชันเดียว:
Go
menuSuggestionFlow := genkit.DefineFlow(
"menuSuggestionFlow",
func(ctx context.Context, restaurantTheme string) (string, error) {
suggestion := makeMenuItemSuggestion(restaurantTheme)
return suggestion, nil
})
การทำเช่นนี้จะทำให้คุณสามารถเรียกใช้ฟังก์ชันจาก Genkit CLI และ UI ของนักพัฒนาซอฟต์แวร์ และ สำหรับฟีเจอร์หลายอย่างของ Genkit รวมถึงการติดตั้งใช้งาน ความสามารถในการสังเกต
ข้อได้เปรียบสำคัญที่ขั้นตอนของ Genkit มีมากกว่าการเรียกใช้ Model API โดยตรงคือ ความปลอดภัยของทั้งอินพุตและเอาต์พุต
Go
ประเภทอาร์กิวเมนต์และผลลัพธ์ของโฟลว์อาจเป็นค่าที่เรียบง่ายหรือค่าที่มีโครงสร้าง
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
},
)
โฟลว์การวิ่ง
วิธีเรียกใช้ขั้นตอนในโค้ด
Go
suggestion, err := menuSuggestionFlow.Run(context.Background(), "French")
คุณใช้ CLI เพื่อเรียกใช้โฟลว์ได้เช่นกัน
genkit flow:run menuSuggestionFlow '"French"'
สตรีมแล้ว
ต่อไปนี้เป็นตัวอย่างง่ายๆ ของขั้นตอนที่สตรีมค่าได้
Go
// 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
},
)
โปรดทราบว่าไม่สามารถระบุการเรียกกลับของสตรีมมิงได้ ซึ่งมีการกำหนดก็ต่อเมื่อ ไคลเอ็นต์ที่เรียกใช้กำลังขอคำตอบแบบสตรีม
วิธีเรียกใช้โฟลว์ในโหมดสตรีมมิง
Go
menuSuggestionFlow.Stream(
context.Background(),
"French",
)(func(sfv *genkit.StreamFlowValue[OutputType, StreamType], err error) bool {
if !sfv.Done {
fmt.Print(sfv.Output)
return true
} else {
return false
}
})
หากขั้นตอนดังกล่าวไม่ใช้สตรีมมิง StreamFlow()
จะทํางานเหมือนกับ
RunFlow()
.
คุณใช้ CLI เพื่อสตรีมโฟลว์ได้ด้วย โดยทำดังนี้
genkit flow:run menuSuggestionFlow '"French"' -s
การติดตั้งใช้งานขั้นตอน
หากต้องการเข้าถึงโฟลว์ผ่าน HTTP ได้ คุณจะต้องติดตั้งใช้งาน ก่อน
Go
หากต้องการทำให้โฟลว์ใช้งานได้โดยใช้ 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
: ที่อยู่และพอร์ตที่จะใช้ฟัง หากไม่ได้ระบุ เซิร์ฟเวอร์รับคำสั่งบนพอร์ตที่ระบุโดยตัวแปรสภาพแวดล้อมของพอร์ต หากเว้นว่างไว้ ระบบจะใช้พอร์ต 3400 เป็นค่าเริ่มต้นFlows
: ขั้นตอนที่จะแสดง หากไม่ได้ระบุไว้Init
จะแสดงทั้งหมด ขั้นตอนที่คุณกำหนด
หากต้องการแสดงโฟลว์บนโฮสต์และพอร์ตเดียวกันกับปลายทางอื่นๆ คุณต้อง
สามารถตั้งค่า FlowAddr
เป็น -
และเรียกใช้ NewFlowServeMux()
เพื่อรับเครื่องจัดการแทน
สำหรับขั้นตอน Genkit ของคุณ ซึ่งคุณใช้มัลติเพล็กซ์กับเครื่องจัดการเส้นทางอื่นๆ ได้ ดังนี้
mainMux := http.NewServeMux()
mainMux.Handle("POST /flow/", http.StripPrefix("/flow/", genkit.NewFlowServeMux(nil)))
ความสามารถในการสังเกตการไหล
บางครั้งเมื่อใช้ 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
})