फ़्लो

फ़्लो को डायरेक्ट फ़ंक्शन की तुलना में, कुछ अतिरिक्त विशेषताओं के साथ रैप किया जाता है कॉल: वे टाइप किए जा सकते हैं, स्ट्रीम किए जा सकते हैं, स्थानीय तौर पर और रिमोट तरीके से कॉल किए जा सकते हैं, और जिसकी पूरी तरह से निगरानी की जा सकती है. Firebase Genkit, फ़्लो को चलाने और डीबग करने के लिए, सीएलआई और डेवलपर यूज़र इंटरफ़ेस (यूआई) टूल उपलब्ध कराता है.

फ़्लो तय करना

अपने सबसे आसान रूप में, फ़्लो सिर्फ़ फ़ंक्शन को रैप करता है:

शुरू करें

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

ऐसा करने पर, Genkit CLI और डेवलपर यूज़र इंटरफ़ेस (यूआई) से फ़ंक्शन चलाया जा सकेगा. Genkit की कई सुविधाओं की ज़रूरत को पूरा करना. इन सुविधाओं में, डिप्लॉयमेंट और जांचने की क्षमता.

किसी मॉडल एपीआई को सीधे कॉल करने की तुलना में, Genkit फ़्लो का एक अहम फ़ायदा है इनपुट और आउटपुट, दोनों की सुरक्षा कैसी है:

शुरू करें

फ़्लो के तर्क और नतीजे के टाइप, आसान या स्ट्रक्चर्ड वैल्यू हो सकते हैं. 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
  },
)

रनिंग फ़्लो

अपने कोड में फ़्लो चलाने के लिए:

शुरू करें

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

फ़्लो चलाने के लिए, सीएलआई का इस्तेमाल भी किया जा सकता है:

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 !sfv.Done {
      fmt.Print(sfv.Output)
      return true
  } else {
      return false
  }
})

अगर फ़्लो, स्ट्रीमिंग को लागू नहीं करता है, तो StreamFlow() इसके जैसा ही काम करता है RunFlow().

फ़्लो स्ट्रीम करने के लिए, सीएलआई का इस्तेमाल भी किया जा सकता है:

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

फ़्लो डिप्लॉय करना

अगर आपको एचटीटीपी पर फ़्लो ऐक्सेस करना है, तो आपको उसे डिप्लॉय करना होगा चुनें.

शुरू करें

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://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 टूल का इस्तेमाल किया जाता है जो मॉनिटर करने के लिए नहीं बनाए गए हैं, हो सकता है कि आप उन्हें डेवलपर यूज़र इंटरफ़ेस (यूआई) में एक अलग ट्रेस चरण के रूप में देखना चाहें. आपको बस 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
    })