Akışlar, doğrudan yerine bazı ek özelliklere sahip sarmalanmış işlevlerdir Aramalar: güçlü bir şekilde yazılmış, akışa uygun, yerel ve uzaktan aranabilirdir tümüyle gözlemlenebilir. Firebase Genkit, akışları çalıştırmak ve hata ayıklamak için CLI ve geliştirici kullanıcı arayüzü araçları sağlar.
Akışları tanımlama
Akış, en basit haliyle bir fonksiyonu sarmalar:
Go
menuSuggestionFlow := genkit.DefineFlow(
"menuSuggestionFlow",
func(ctx context.Context, restaurantTheme string) (string, error) {
suggestion := makeMenuItemSuggestion(restaurantTheme)
return suggestion, nil
})
Bu sayede işlevi Genkit CLI ve geliştirici kullanıcı arayüzünden çalıştırabilirsiniz. dağıtım ve erişim dahil olmak üzere birçok Genkit özelliği için gözlemlenebilirlik.
Genkit akışlarının doğrudan model API çağrılarına kıyasla önemli bir avantajı: giriş ve çıkışların tür güvenliği:
Go
Bir akışın bağımsız değişkeni ve sonuç türleri, basit veya yapılandırılmış değerler olabilir.
Genkit bu değerler için JSON şemalarını
invopop/jsonschema
.
Aşağıdaki akışta giriş olarak string
alınır ve struct
çıkışı yapılır:
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
},
)
Devam eden akışlar
Kodunuzda bir akış çalıştırmak için:
Go
suggestion, err := menuSuggestionFlow.Run(context.Background(), "French")
CLI'yı akışları çalıştırmak için de kullanabilirsiniz:
genkit flow:run menuSuggestionFlow '"French"'
Yayınlandı
Aşağıda, değerleri akış şeklinde aktarabilen bir akışa ilişkin basit bir örnek verilmiştir:
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
},
)
Akış geri çağırmasının tanımsız olabileceğini unutmayın. Bu yalnızca çağrı yapan istemci akışlı yanıt istiyor.
Akış modunda bir akışı çağırmak için:
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
}
})
Akışta akış uygulanmazsa StreamFlow()
aşağıdaki gibi davranır:
RunFlow()
.
CLI'yı akış akışı için de kullanabilirsiniz:
genkit flow:run menuSuggestionFlow '"French"' -s
Akışları dağıtma
Akışınıza HTTP üzerinden erişebilmek istiyorsanız dağıtımı dağıtmanız gerekir tıklayın.
Go
Cloud Run ve benzer hizmetleri kullanarak akış dağıtmak için akışlarınızı tanımlayın ve
ardından Init()
numaralı telefonu arayın:
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
, akışlarınızı HTTP olarak gösteren bir net/http
sunucusu başlatır
uç noktalar (örneğin, http://localhost:3400/menuSuggestionFlow
).
İkinci parametre, aşağıdakileri belirten isteğe bağlı bir Options
parametresidir:
FlowAddr
: Dinlenecek adres ve bağlantı noktası. Belirtilmemişse sunucu, PORT ortam değişkeni tarafından belirtilen bağlantı noktasını dinler; Bu değer boşsa varsayılan bağlantı noktası olan 3400'ü kullanır.Flows
: Yayınlanacak akış. BelirtilmezseInit
şunların tümünü sunar: tanımlamanız gerekir.
Akışları diğer uç noktalarla aynı ana makine ve bağlantı noktasında sunmak isterseniz
FlowAddr
öğesini -
olarak ayarlayabilir ve bunun yerine bir işleyici almak için NewFlowServeMux()
öğesini çağırabilirsiniz
diğer rota işleyicilerinizle çoğullaabileceğiniz Genkit akışlarınız için:
mainMux := http.NewServeMux()
mainMux.Handle("POST /flow/", http.StripPrefix("/flow/", genkit.NewFlowServeMux(nil)))
Akış gözlemlenebilirliği
Gözlemlenebilirlik için uygun olmayan üçüncü taraf SDK'ları kullanırken bazen
bunları Geliştirici arayüzünde ayrı bir iz adımı olarak görmek isteyebilirsiniz. Tek yapmanız gereken
tek yapmanız gereken, kodu run
işlevine sarmalamaktır.
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
})