Flow adalah fungsi gabungan dengan beberapa karakteristik tambahan dibandingkan dengan flow panggilan: formatnya sangat mudah diketik, di-streaming, dapat dipanggil secara lokal dan jarak jauh, serta sepenuhnya dapat diamati. Firebase Genkit menyediakan alat CLI dan UI developer untuk menjalankan alur dan men-debug alur.
Menentukan flow
Dalam bentuk yang paling sederhana, flow hanya menggabungkan fungsi:
Go
menuSuggestionFlow := genkit.DefineFlow(
"menuSuggestionFlow",
func(ctx context.Context, restaurantTheme string) (string, error) {
suggestion := makeMenuItemSuggestion(restaurantTheme)
return suggestion, nil
})
Dengan melakukannya, Anda dapat menjalankan fungsi dari Genkit CLI dan UI developer, serta persyaratan untuk banyak fitur Genkit, termasuk deployment dan kemampuan observasi.
Keuntungan penting yang dimiliki alur Genkit daripada memanggil API model secara langsung adalah keamanan jenis input dan output:
Go
Argumen dan jenis hasil flow dapat berupa nilai sederhana atau terstruktur.
Genkit akan menghasilkan skema JSON untuk nilai ini menggunakan
invopop/jsonschema
.
Alur berikut menggunakan string
sebagai input dan menghasilkan 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
},
)
Alur yang berjalan
Untuk menjalankan flow dalam kode Anda:
Go
suggestion, err := menuSuggestionFlow.Run(context.Background(), "French")
Anda juga dapat menggunakan CLI untuk menjalankan flow:
genkit flow:run menuSuggestionFlow '"French"'
Di-streaming
Berikut adalah contoh sederhana flow yang dapat melakukan streaming nilai:
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
},
)
Perhatikan bahwa callback streaming mungkin tidak ditentukan. Ini hanya ditentukan jika yang meminta klien meminta respons yang di-streaming.
Untuk memanggil flow dalam mode streaming:
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
}
})
Jika alur tidak mengimplementasikan streaming, StreamFlow()
berperilaku identik dengan
RunFlow()
.
Anda juga dapat menggunakan CLI untuk melakukan streaming alur:
genkit flow:run menuSuggestionFlow '"French"' -s
Men-deploy alur
Jika Anda ingin dapat mengakses alur Anda melalui HTTP, Anda harus men-deploy-nya terlebih dahulu.
Go
Untuk men-deploy alur menggunakan Cloud Run dan layanan serupa, tentukan alur Anda, dan
lalu panggil 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
memulai server net/http
yang mengekspos alur Anda sebagai HTTP
endpoint (misalnya, http://localhost:3400/menuSuggestionFlow
).
Parameter kedua adalah Options
opsional yang menentukan hal berikut:
FlowAddr
: Alamat dan port untuk memproses. Jika tidak ditentukan, server mendengarkan pada porta yang ditentukan oleh variabel lingkungan PORT; jika kosong, {i>default-<i}nya adalah porta 3400.Flows
: Flow yang akan disalurkan. Jika tidak ditentukan,Init
akan menayangkan semua alur yang Anda tentukan.
Jika Anda ingin menyalurkan flow pada host dan port yang sama dengan endpoint lainnya,
dapat menetapkan FlowAddr
ke -
dan memanggil NewFlowServeMux()
untuk mendapatkan pengendali
untuk alur Genkit, yang dapat Anda multipleks dengan pengendali rute lainnya:
mainMux := http.NewServeMux()
mainMux.Handle("POST /flow/", http.StripPrefix("/flow/", genkit.NewFlowServeMux(nil)))
Kemampuan observasi flow
Terkadang saat menggunakan SDK pihak ketiga yang tidak diinstrumentasikan untuk kemampuan observasi,
Anda mungkin ingin melihatnya sebagai langkah pelacakan terpisah di UI Developer. Anda hanya perlu
perlu lakukan adalah menggabungkan kode dalam fungsi 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
})