ขั้นตอน

โฟลว์คือฟังก์ชันที่รวมเข้าด้วยกันซึ่งมีลักษณะเพิ่มเติมบางอย่างมากกว่าโดยตรง การโทร: การโทรเป็นการพิมพ์อย่างชัดเจน สตรีมได้ โทรออกได้ภายในประเทศและจากระยะไกล สามารถสังเกตได้ทั้งหมด Firebase Genkit มีเครื่องมือ UI สำหรับนักพัฒนาซอฟต์แวร์และ CLI สำหรับการเรียกใช้และการแก้ไขข้อบกพร่อง

การกำหนดขั้นตอน

ในรูปแบบที่ง่ายที่สุด โฟลว์จะมีเพียงฟังก์ชันเดียว:

Go

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

การทำเช่นนี้จะทำให้คุณสามารถเรียกใช้ฟังก์ชันจาก Genkit CLI และ UI ของนักพัฒนาซอฟต์แวร์ และ สำหรับฟีเจอร์หลายอย่างของ Genkit รวมถึงการติดตั้งใช้งาน ความสามารถในการสังเกต

ข้อได้เปรียบสำคัญที่ขั้นตอนของ Genkit มีมากกว่าการเรียกใช้ Model API โดยตรงคือ ความปลอดภัยของทั้งอินพุตและเอาต์พุต

Go

ประเภทอาร์กิวเมนต์และผลลัพธ์ของโฟลว์อาจเป็นค่าที่เรียบง่ายหรือค่าที่มีโครงสร้าง 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
  },
)

โฟลว์การวิ่ง

วิธีเรียกใช้ขั้นตอนในโค้ด

Go

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

คุณใช้ CLI เพื่อเรียกใช้โฟลว์ได้เช่นกัน

genkit flow:run menuSuggestionFlow '"French"'

สตรีมแล้ว

ต่อไปนี้เป็นตัวอย่างง่ายๆ ของขั้นตอนที่สตรีมค่าได้

Go

// 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
  },
)

โปรดทราบว่าไม่สามารถระบุการเรียกกลับของสตรีมมิงได้ ซึ่งมีการกำหนดก็ต่อเมื่อ ไคลเอ็นต์ที่เรียกใช้กำลังขอคำตอบแบบสตรีม

วิธีเรียกใช้โฟลว์ในโหมดสตรีมมิง

Go

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().

คุณใช้ CLI เพื่อสตรีมโฟลว์ได้ด้วย โดยทำดังนี้

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

การติดตั้งใช้งานขั้นตอน

หากต้องการเข้าถึงโฟลว์ผ่าน HTTP ได้ คุณจะต้องติดตั้งใช้งาน ก่อน

Go

หากต้องการทำให้โฟลว์ใช้งานได้โดยใช้ 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)

พารามิเตอร์ที่ 2 คือ Options ที่ไม่บังคับซึ่งระบุข้อมูลต่อไปนี้

  • FlowAddr: ที่อยู่และพอร์ตที่จะใช้ฟัง หากไม่ได้ระบุ เซิร์ฟเวอร์รับคำสั่งบนพอร์ตที่ระบุโดยตัวแปรสภาพแวดล้อมของพอร์ต หากเว้นว่างไว้ ระบบจะใช้พอร์ต 3400 เป็นค่าเริ่มต้น
  • Flows: ขั้นตอนที่จะแสดง หากไม่ได้ระบุไว้ Init จะแสดงทั้งหมด ขั้นตอนที่คุณกำหนด

หากต้องการแสดงโฟลว์บนโฮสต์และพอร์ตเดียวกันกับปลายทางอื่นๆ คุณต้อง สามารถตั้งค่า FlowAddr เป็น - และเรียกใช้ NewFlowServeMux() เพื่อรับเครื่องจัดการแทน สำหรับขั้นตอน Genkit ของคุณ ซึ่งคุณใช้มัลติเพล็กซ์กับเครื่องจัดการเส้นทางอื่นๆ ได้ ดังนี้

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

ความสามารถในการสังเกตการไหล

บางครั้งเมื่อใช้ 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
    })