ขั้นตอน

โฟลว์คือฟังก์ชันที่รวมเข้าด้วยกันโดยมีลักษณะเฉพาะเพิ่มเติมบางอย่างเหนือการโทรโดยตรง นั่นคือ เป็นฟังก์ชันที่พิมพ์อย่างชัดเจน สตรีมได้ เรียกใช้ได้ในพื้นที่และจากระยะไกล และสังเกตได้โดยสมบูรณ์ 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: ที่อยู่และพอร์ตที่จะฟัง หากไม่ระบุ เซิร์ฟเวอร์จะรับคำสั่งบนพอร์ตที่ระบุโดยตัวแปรสภาพแวดล้อมของพอร์ต หากเว้นว่างไว้ เซิร์ฟเวอร์จะใช้ค่าเริ่มต้นของพอร์ต 3400
  • Flows: การแสดงโฆษณาตามกลุ่มเป้าหมาย หากไม่ได้ระบุ 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
	})