เรียกใช้เวิร์กโฟลว์ Genkit จากแอป

Cloud Functions for Firebase มีเมธอด onCallGenkit ที่ช่วยให้คุณสร้างฟังก์ชันที่เรียกใช้ได้ด้วยการดำเนินการ Genkit (โฟลว์) คุณเรียกใช้ฟังก์ชันเหล่านี้ได้ด้วย genkit/beta/client หรือ Cloud Functions for Firebase Client SDK ซึ่งจะ เพิ่มข้อมูลการให้สิทธิ์โดยอัตโนมัติ

ก่อนเริ่มต้น

  • คุณควรคุ้นเคยกับแนวคิดของGenkitโฟลว์และวิธีเขียนโฟลว์ วิธีการในหน้านี้ถือว่าคุณได้ กําหนดโฟลว์บางอย่างที่ต้องการนําไปใช้งานแล้ว
  • ซึ่งจะเป็นประโยชน์ แต่ไม่จำเป็น หากคุณเคยใช้ Cloud Functions for Firebase มาก่อน

ตั้งค่าโปรเจ็กต์ Firebase

  1. สร้างโปรเจ็กต์ Firebase ใหม่โดยใช้Firebaseคอนโซล หรือเลือกโปรเจ็กต์ที่มีอยู่

  2. อัปเกรดโปรเจ็กต์เป็นแพ็กเกจราคา Blaze แบบจ่ายเมื่อใช้ ซึ่งจำเป็นสำหรับ Cloud Functions การติดตั้งใช้งานจริง

  3. ติดตั้ง Firebase CLI

  4. เข้าสู่ระบบ Firebase CLI โดยทำดังนี้

    firebase login
    firebase login --reauth # alternative, if necessary
    firebase login --no-localhost # if running in a remote shell
  5. สร้างไดเรกทอรีโปรเจ็กต์ใหม่

    export PROJECT_ROOT=~/tmp/genkit-firebase-project1
    mkdir -p $PROJECT_ROOT
  6. เริ่มต้นโปรเจ็กต์ Firebase ในไดเรกทอรี

    cd $PROJECT_ROOT
    firebase init functions

ส่วนที่เหลือของหน้านี้จะถือว่าคุณเลือกเขียนฟังก์ชันใน JavaScript

Wrap the flow in onCallGenkit

หลังจากตั้งค่าโปรเจ็กต์ Firebase และเริ่มต้น Cloud Functions แล้ว คุณจะคัดลอกหรือเขียนคำจำกัดความของโฟลว์ในไดเรกทอรี functions ของโปรเจ็กต์ได้ ตัวอย่างโฟลว์เพื่อแสดงให้เห็นถึงการทำงานนี้มีดังนี้

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

const jokeTeller = ai.defineFlow({
  name: "jokeTeller",
  inputSchema: z.string().nullable(),
  outputSchema: z.string(),
  streamSchema: z.string(),
}, async (jokeType = "knock-knock", {sendChunk}) => {
  const prompt = `Tell me a ${jokeType} joke.`;

  // Call the `generateStream()` method to
  // receive the `stream` async iterable.
  const {stream, response: aiResponse} = ai.generateStream(prompt);

  // Send new words of the generative AI response
  // to the client as they are generated.
  for await (const chunk of stream) {
    sendChunk(chunk.text);
  }

  // Return the full generative AI response
  // to clients that may not support streaming.
  return (await aiResponse).text;
},
);

หากต้องการติดตั้งใช้งานโฟลว์เช่นนี้ ให้ห่อหุ้มด้วย onCallGenkit ซึ่งมีให้บริการใน firebase-functions/https เมธอดตัวช่วยนี้มีฟีเจอร์ทั้งหมดของฟังก์ชันที่เรียกใช้ได้ และรองรับทั้งการสตรีมและการตอบกลับ JSON โดยอัตโนมัติ

const {onCallGenkit} = require("firebase-functions/https");
exports.tellJoke = onCallGenkit({
  // Bind the Gemini API key secret parameter to the function.
  secrets: [apiKey],
},
// Pass in the genkit flow.
jokeTeller,
);

ทำให้ข้อมูลเข้าสู่ระบบ API พร้อมใช้งานในโฟลว์ที่ใช้งานจริง

เมื่อติดตั้งใช้งานแล้ว โฟลว์ของคุณจะต้องมีวิธีตรวจสอบสิทธิ์กับบริการระยะไกลที่ใช้ โดยส่วนใหญ่แล้ว ขั้นตอนการทำงานส่วนใหญ่ต้องใช้ข้อมูลเข้าสู่ระบบเพื่อเข้าถึงบริการ Model API ที่ใช้

สำหรับตัวอย่างนี้ ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้ ขึ้นอยู่กับผู้ให้บริการโมเดลที่คุณเลือก

Gemini (AI ของ Google)

  1. สร้างคีย์ API สำหรับ Gemini Developer API โดยใช้ Google AI Studio

  2. จัดเก็บคีย์ API ใน Google Cloud Secret Manager ดังนี้

    firebase functions:secrets:set GOOGLE_GENAI_API_KEY

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

    ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการข้อมูลลับได้ที่ จัดเก็บและเข้าถึงข้อมูลการกำหนดค่าที่ละเอียดอ่อน

  3. แก้ไข src/index.js และเพิ่มรายการต่อไปนี้หลังจากการนำเข้าที่มีอยู่

    const {defineSecret} = require("firebase-functions/params");
    // Store the Gemini API key in Cloud Secret Manager.
    const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");

    จากนั้นในการกำหนดฟังก์ชันที่เรียกใช้ได้ ให้ประกาศว่าฟังก์ชัน ต้องมีสิทธิ์เข้าถึงค่าลับนี้

    // Bind the Gemini API key secret parameter to the function.
    secrets: [apiKey],

ตอนนี้เมื่อคุณติดตั้งใช้งานฟังก์ชันนี้ ระบบจะจัดเก็บคีย์ API ไว้ใน Google Cloud Secret Manager และพร้อมใช้งานจากสภาพแวดล้อม Cloud Functions

Gemini (Vertex AI)

  1. ในGoogle Cloudคอนโซล เปิดใช้ Vertex AI API สำหรับโปรเจ็กต์ Firebase

  2. ใน หน้า IAM ตรวจสอบว่าบัญชีบริการ Compute เริ่มต้นได้รับบทบาท ผู้ใช้ Vertex AI

ความลับเดียวที่คุณต้องตั้งค่าสำหรับบทแนะนำนี้คือความลับสำหรับผู้ให้บริการโมเดล แต่โดยทั่วไปแล้ว คุณต้องทำสิ่งที่คล้ายกันสำหรับแต่ละบริการที่โฟลว์ใช้

(ไม่บังคับ) เพิ่มFirebase App Checkการบังคับใช้

Firebase App Check ใช้การรับรองแบบเนทีฟเพื่อยืนยันว่า แอปพลิเคชันของคุณเท่านั้นที่เรียก API ของเรา วิธี onCallGenkit รองรับการบังคับใช้ App Check โดยการประกาศ

export const generatePoem = onCallGenkit({
  enforceAppCheck: true,
  // Optional. Makes App Check tokens only usable once. This adds extra security
  // at the expense of slowing down your app to generate a token for every API
  // call
  consumeAppCheckToken: true,
}, generatePoemFlow);

กำหนดค่า CORS (การแชร์ทรัพยากรแบบข้ามต้นทาง)

ใช้ตัวเลือก cors เพื่อควบคุมว่าต้นทางใดเข้าถึงฟังก์ชันได้

โดยค่าเริ่มต้น ฟังก์ชันที่เรียกใช้ได้จะมี CORS ที่กำหนดค่าไว้เพื่ออนุญาตคำขอจากต้นทางทั้งหมด หากต้องการอนุญาตคำขอแบบข้ามต้นทางบางรายการ แต่ไม่อนุญาตทั้งหมด ให้ส่งรายการโดเมนที่เฉพาะเจาะจงหรือนิพจน์ทั่วไปที่ควรได้รับอนุญาต เช่น

export const tellJoke = onCallGenkit({
  cors: 'mydomain.com',
}, jokeTeller);

ตัวอย่างที่สมบูรณ์

หลังจากทำการเปลี่ยนแปลงทั้งหมดตามที่อธิบายไว้ในคู่มือนี้แล้ว โฟลว์ที่พร้อมใช้งาน จะมีลักษณะคล้ายกับตัวอย่างต่อไปนี้

const {onCallGenkit} = require("firebase-functions/https");
const {defineSecret} = require("firebase-functions/params");

// Dependencies for Genkit.
const {gemini15Flash, googleAI} = require("@genkit-ai/googleai");
const {genkit, z} = require("genkit");

// Store the Gemini API key in Cloud Secret Manager.
const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

const jokeTeller = ai.defineFlow({
  name: "jokeTeller",
  inputSchema: z.string().nullable(),
  outputSchema: z.string(),
  streamSchema: z.string(),
}, async (jokeType = "knock-knock", {sendChunk}) => {
  const prompt = `Tell me a ${jokeType} joke.`;

  // Call the `generateStream()` method to
  // receive the `stream` async iterable.
  const {stream, response: aiResponse} = ai.generateStream(prompt);

  // Send new words of the generative AI response
  // to the client as they are generated.
  for await (const chunk of stream) {
    sendChunk(chunk.text);
  }

  // Return the full generative AI response
  // to clients that may not support streaming.
  return (await aiResponse).text;
},
);

exports.tellJoke = onCallGenkit({
  // Bind the Gemini API key secret parameter to the function.
  secrets: [apiKey],
},
// Pass in the genkit flow.
jokeTeller,
);

ทําให้โฟลว์ใช้งานได้กับ Firebase

หลังจากกำหนดโฟลว์โดยใช้ onCallGenkit แล้ว คุณจะนำไปใช้ได้เช่นเดียวกับ ฟังก์ชันอื่นๆ

cd $PROJECT_ROOT
firebase deploy --only functions