التدفقات

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

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

في أبسط أشكاله، لا يفعل المسار سوى لف دالة:

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

ويتيح لك ذلك تشغيل الدالة من واجهة سطر الأوامر Genkit وواجهة المستخدم لمطور البرامج، وهو متطلب للعديد من ميزات 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 err != nil {
		// handle err
		return false
	}
	if !sfv.Done {
		fmt.Print(sfv.Stream)
		return true
	} else {
		fmt.Print(sfv.Output)
		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 يعرِض عملياتك كمَعلمات 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
	})