التدفقات

التدفقات عبارة عن دوال مزودة ببعض الخصائص الإضافية مقارنةً ب الدوال المباشرة المكالمات: تكون مكتوبة بقوة وقابلة للبث ويمكن الاتصال بها محليًا وعن بُعد قابلة للملاحظة بالكامل. توفّر حزمة Firebase Genkit أدوات واجهة سطر الأوامر (CLI) وواجهة مستخدم المطوّرين لمساعدتك في مسارات التشغيل وتصحيح الأخطاء.

تحديد التدفقات

في أبسط صوره، يؤدي التدفق فقط إلى التفاف دالة:

انتقال

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

تدفقات نشر

إذا كنت تريد أن تكون قادرًا على الوصول إلى التدفق عبر 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) تابعة لجهات خارجية وغير مخصّصة للملاحظة، قد تحتاج إلى عرضها كخطوة تتبُّع منفصلة في واجهة مستخدم المطوّرين. ما عليك سوى فعله هو التفاف الرمز في دالة 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
    })