Akışlar

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ış. Belirtilmezse Init ş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
    })