Flows

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