প্রবাহিত হয়

প্রবাহ হল সরাসরি কলের উপর কিছু অতিরিক্ত বৈশিষ্ট্য সহ মোড়ানো ফাংশন: এগুলি দৃঢ়ভাবে টাইপ করা, স্ট্রিমযোগ্য, স্থানীয়ভাবে এবং দূরবর্তীভাবে কল করা যায় এবং সম্পূর্ণরূপে পর্যবেক্ষণযোগ্য। Firebase Genkit চলমান এবং ডিবাগিং প্রবাহের জন্য CLI এবং বিকাশকারী UI টুলিং প্রদান করে।

সংজ্ঞায়িত প্রবাহ

এর সহজতম আকারে, একটি প্রবাহ কেবল একটি ফাংশনকে মোড়ানো করে:

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

এটি করার ফলে আপনি Genkit CLI এবং বিকাশকারী UI থেকে ফাংশনটি চালাতে পারবেন এবং এটি স্থাপন এবং পর্যবেক্ষণযোগ্যতা সহ জেনকিটের অনেক বৈশিষ্ট্যের জন্য প্রয়োজনীয়।

Genkit ফ্লোতে সরাসরি একটি মডেল API কল করার একটি গুরুত্বপূর্ণ সুবিধা হল ইনপুট এবং আউটপুট উভয়ের নিরাপত্তা। একটি প্রবাহের যুক্তি এবং ফলাফলের ধরন সহজ বা কাঠামোগত মান হতে পারে। Genkit invopop/jsonschema ব্যবহার করে এই মানগুলির জন্য JSON স্কিমা তৈরি করবে।

নিম্নলিখিত প্রবাহ ইনপুট হিসাবে একটি 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")

আপনি প্রবাহ চালানোর জন্য CLI ব্যবহার করতে পারেন:

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() এর সাথে অভিন্ন আচরণ করে।

আপনি পাশাপাশি প্রবাহ স্ট্রিম করতে CLI ব্যবহার করতে পারেন:

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

প্রবাহ স্থাপন

আপনি যদি HTTP এর মাধ্যমে আপনার প্রবাহ অ্যাক্সেস করতে সক্ষম হতে চান তবে আপনাকে প্রথমে এটি স্থাপন করতে হবে। ক্লাউড রান এবং অনুরূপ পরিষেবাগুলি ব্যবহার করে প্রবাহ স্থাপন করতে, আপনার প্রবাহকে সংজ্ঞায়িত করুন এবং তারপরে কল করুন 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 এ সেট করতে পারেন - এবং পরিবর্তে আপনার Genkit ফ্লোগুলির জন্য একটি হ্যান্ডলার পেতে NewFlowServeMux() কল করুন, যা আপনি আপনার অন্যান্য রুট হ্যান্ডলারদের সাথে মাল্টিপ্লেক্স করতে পারেন:

mainMux := http.NewServeMux()
mainMux.Handle("POST /flow/", http.StripPrefix("/flow/", genkit.NewFlowServeMux(nil)))

প্রবাহ পর্যবেক্ষণযোগ্যতা

কখনও কখনও 3য় পক্ষের SDK ব্যবহার করার সময় যেগুলি পর্যবেক্ষণযোগ্যতার জন্য উপকরণ নয়, আপনি বিকাশকারী UI-তে একটি পৃথক ট্রেস পদক্ষেপ হিসাবে দেখতে চাইতে পারেন৷ আপনাকে যা করতে হবে তা হল 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
	})