Flow là các hàm được gói với một số đặc điểm bổ sung so với các lệnh gọi trực tiếp: các hàm này được nhập mạnh, có thể truyền trực tuyến, có thể gọi cục bộ và từ xa, đồng thời có thể quan sát đầy đủ. Firebase Genkit cung cấp công cụ giao diện người dùng dành cho nhà phát triển và CLI để chạy và gỡ lỗi luồng.
Xác định flow
Ở dạng đơn giản nhất, luồng chỉ bao bọc một hàm:
menuSuggestionFlow := genkit.DefineFlow(
"menuSuggestionFlow",
func(ctx context.Context, restaurantTheme string) (string, error) {
suggestion := makeMenuItemSuggestion(restaurantTheme)
return suggestion, nil
})
Thao tác như vậy sẽ cho phép bạn chạy hàm từ Genkit CLI cũng như giao diện người dùng của nhà phát triển, đồng thời một yêu cầu đối với nhiều tính năng của Genkit, bao gồm cả việc triển khai và khả năng ghi nhận.
Một lợi thế quan trọng của luồng Genkit so với việc gọi trực tiếp API mô hình là tính an toàn của loại dữ liệu đầu vào và đầu ra.
Loại đối số và kết quả của luồng có thể là giá trị đơn giản hoặc giá trị có cấu trúc.
Genkit sẽ tạo giản đồ JSON cho các giá trị này bằng cách sử dụng invopop/jsonschema
.
Quy trình sau đây lấy string
làm dữ liệu đầu vào và xuất ra 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
},
)
Chạy luồng
Cách chạy flow trong mã:
suggestion, err := menuSuggestionFlow.Run(context.Background(), "French")
Bạn cũng có thể sử dụng CLI để chạy luồng:
genkit flow:run menuSuggestionFlow '"French"'
Đã phát trực tiếp
Dưới đây là ví dụ đơn giản về quy trình có thể truyền trực tuyến giá trị:
// 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
},
)
Xin lưu ý rằng lệnh gọi lại truyền trực tuyến có thể không được xác định. Phương thức này chỉ được xác định nếu ứng dụng gọi đang yêu cầu phản hồi truyền trực tuyến.
Cách gọi một flow ở chế độ truyền trực tuyến:
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
}
})
Nếu luồng không triển khai tính năng truyền trực tuyến, StreamFlow()
sẽ hoạt động giống hệt với RunFlow()
.
Bạn cũng có thể dùng CLI để truyền trực tuyến luồng:
genkit flow:run menuSuggestionFlow '"French"' -s
Triển khai flow
Nếu muốn truy cập vào flow của mình qua HTTP, bạn cần phải triển khai flow
đầu tiên.
Để triển khai luồng bằng Cloud Run và các dịch vụ tương tự, hãy xác định luồng của bạn và
sau đó gọi 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
khởi động một máy chủ net/http
để hiển thị các luồng của bạn dưới dạng HTTP
điểm cuối (ví dụ: http://localhost:3400/menuSuggestionFlow
).
Tham số thứ hai là Options
không bắt buộc chỉ định những tham số sau:
FlowAddr
: Địa chỉ và cổng để nghe. Nếu không được chỉ định, máy chủ sẽ nghe trên cổng do biến môi trường PORT chỉ định; nếu cổng đó trống, máy chủ sẽ sử dụng cổng mặc định là 3400.Flows
: Luồng nào cần phân phát. Nếu không được chỉ định,Init
sẽ phân phát tất cả các quy trình đã xác định của bạn.
Nếu muốn phân phát luồng trên cùng một máy chủ lưu trữ và cổng với các điểm cuối khác, bạn có thể đặt FlowAddr
thành -
và gọi NewFlowServeMux()
để lấy trình xử lý cho các luồng Genkit. Bạn có thể đaплекс với các trình xử lý tuyến khác:
mainMux := http.NewServeMux()
mainMux.Handle("POST /flow/", http.StripPrefix("/flow/", genkit.NewFlowServeMux(nil)))
Khả năng quan sát luồng
Đôi khi, khi bạn sử dụng SDK của bên thứ ba không được đo lường để quan sát,
bạn có thể muốn xem chúng dưới dạng một bước theo dõi riêng biệt trong Giao diện người dùng dành cho nhà phát triển. Tất cả những gì bạn cần làm là gói mã trong hàm 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
})