مسارات البيانات هي دوالّ مُغلفة لها بعض الخصائص الإضافية مقارنةً بالدوالّ المباشرة: فهي ذات أنواع محدّدة بدقة وقابلة للبث وقابلة للاتّصال بها محليًا وبعيدًا وقابلة للتتبّع بالكامل. توفّر أداة 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
})