流程是經過包裝的函式,具有比直接呼叫更豐富的特性:它們具有強型別、可透過串流傳輸、可在本機和遠端呼叫,且可完全觀察。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 功能要求,包括 可觀察到的情況
相較於直接呼叫模型 API,Genkit 資料流程的一大優點是輸入和輸出內容的型別安全性。流程的引數和結果類型可以是簡單值,也可以是結構化值。
Genkit 會使用 invopop/jsonschema
為這些值產生 JSON 結構定義。
以下流程會將 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
)。
第二個參數是選用的 Options
,可指定下列項目:
FlowAddr
:要監聽的位址和通訊埠。如未指定 伺服器會監聽 PORT 環境變數指定的通訊埠。 如果該空白,系統會使用預設的通訊埠 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
})