フロー

フローはラップされた関数で、直接的な機能にはない特徴があります。 厳密に型指定され、ストリーミング可能で、ローカルでもリモートでも呼び出し可能であり、 可視化できます。 Firebase Genkit は、フローの実行とデバッグのための CLI とデベロッパー UI ツールを提供します。

フローの定義

最も単純な形式では、フローは関数をラップするだけです。

Go

menuSuggestionFlow := genkit.DefineFlow(
  "menuSuggestionFlow",
  func(ctx context.Context, restaurantTheme string) (string, error) {
      suggestion := makeMenuItemSuggestion(restaurantTheme)
      return suggestion, nil
  })

これにより、Genkit CLI とデベロッパー UI から関数を実行できるようになります。 Genkit の多くの機能の要件は、Genkit のデプロイメントや 説明します。

モデル API を直接呼び出すよりも、Genkit のフローが持つ重要な利点は、 入力と出力の両方の型安全性:

Go

フローの引数と結果の型は、単純な値または構造化された値にすることができます。 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
  },
)

フローの実行

コード内でフローを実行するには:

Go

suggestion, err := menuSuggestionFlow.Run(context.Background(), "French")

CLI を使用してフローを実行することもできます。

genkit flow:run menuSuggestionFlow '"French"'

ライブ配信済み

値をストリーミングできるフローの簡単な例を次に示します。

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
  },
)

ストリーミング コールバックは未定義である可能性があるので注意してください。これは、kubectl の ストリーミング レスポンスをリクエストしています。

ストリーミング モードでフローを呼び出すには:

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
  }
})

フローにストリーミングを実装しない場合、StreamFlow() は以下と同じように動作します。 RunFlow()

CLI を使用してフローをストリーミングすることもできます。

genkit flow:run menuSuggestionFlow '"French"' -s

フローのデプロイ

HTTP 経由でフローにアクセスできるようにするには、フローをデプロイする必要があります。 見てみましょう。

Go

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 がフローを HTTP として公開する net/http サーバーを起動します。 エンドポイント(例: http://localhost:3400/menuSuggestionFlow

2 番目のパラメータはオプションの Options で、以下を指定します。

  • FlowAddr: リッスンするアドレスとポート。指定しない場合、 サーバーは PORT 環境変数で指定されたポートをリッスンします。 空の場合、デフォルトのポート 3400 が使用されます。
  • Flows: 提供するフロー。指定しない場合、Init はすべての できます。

他のエンドポイントと同じホストとポートでフローを処理する場合は、 FlowAddr- に設定し、代わりに NewFlowServeMux() を呼び出してハンドラを取得できます。 他のルート ハンドラと多重化できます。

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
    })