Cloud Functions cho Firebase có một phương thức onCallGenkit
cho phép bạn tạo một hàm có thể gọi bằng một thao tác Genkit (một Flow). Bạn có thể gọi các hàm này bằng genkit/beta/client
hoặc Cloud Functions client SDK (SDK ứng dụng Cloud Functions). SDK này sẽ tự động thêm thông tin uỷ quyền.
Trước khi bắt đầu
- Bạn nên làm quen với khái niệm luồng của Genkit và cách viết các luồng đó. Hướng dẫn trên trang này giả định rằng bạn đã xác định một số quy trình mà bạn muốn triển khai.
- Bạn nên (nhưng không bắt buộc) sử dụng Cloud Functions cho Firebase trước đây.
Thiết lập dự án Firebase
Tạo một dự án Firebase mới bằng bảng điều khiển của Firebase hoặc chọn một dự án hiện có.
Nâng cấp dự án lên gói Blaze (bắt buộc để triển khai sản xuất Cloud Functions).
Cài đặt Firebase CLI.
Đăng nhập bằng Giao diện dòng lệnh (CLI) của Firebase:
firebase login
firebase login --reauth # alternative, if necessary
firebase login --no-localhost # if running in a remote shell
Tạo một thư mục dự án mới:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1
mkdir -p $PROJECT_ROOT
Khởi động một dự án Firebase trong thư mục:
cd $PROJECT_ROOT
firebase init functions
Phần còn lại của trang này giả định rằng bạn đã chọn viết các hàm bằng JavaScript.
Gói luồng trong onCallGenkit
Sau khi thiết lập một dự án Firebase bằng Cloud Functions, bạn có thể sao chép hoặc viết các định nghĩa luồng trong thư mục functions
của dự án. Sau đây là một luồng ví dụ minh hoạ điều này:
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; }, );
Để triển khai một luồng như thế này, hãy gói luồng đó bằng onCallGenkit
, có trong firebase-functions/https
. Phương thức trợ giúp này có tất cả các tính năng của các hàm có thể gọi và tự động hỗ trợ cả phản hồi truyền trực tuyến và phản hồi JSON.
const {onCallGenkit} = require("firebase-functions/v2/https");
exports.tellJoke = onCallGenkit({ // Bind the Gemini API key secret parameter to the function. secrets: [apiKey], }, // Pass in the genkit flow. jokeTeller, );
Cung cấp thông tin đăng nhập API cho các luồng đã triển khai
Sau khi triển khai, các luồng của bạn cần có cách xác thực với mọi dịch vụ từ xa mà chúng dựa vào. Tối thiểu, hầu hết các luồng đều cần thông tin đăng nhập để truy cập vào dịch vụ API mô hình mà chúng sử dụng.
Đối với ví dụ này, hãy làm theo một trong những cách sau, tuỳ thuộc vào nhà cung cấp mô hình mà bạn đã chọn:
Gemini (AI của Google)
Đảm bảo rằng AI của Google có ở khu vực của bạn.
Tạo khoá API cho Gemini API bằng Google AI Studio.
Lưu trữ khoá API trong Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEY
Bước này rất quan trọng để tránh vô tình làm lộ khoá API của bạn. Khoá này cấp quyền truy cập vào một dịch vụ có thể được đo lường.
Hãy xem phần Lưu trữ và truy cập thông tin cấu hình nhạy cảm để biết thêm thông tin về cách quản lý khoá bí mật.
Chỉnh sửa
src/index.js
và thêm nội dung sau vào sau các nội dung nhập hiện có:const {defineSecret} = require("firebase-functions/params");
// Store the Gemini API key in Cloud Secret Manager. const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
Sau đó, trong định nghĩa hàm có thể gọi, hãy khai báo rằng hàm cần có quyền truy cập vào giá trị bí mật này:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Giờ đây, khi bạn triển khai hàm này, khoá API của bạn sẽ được lưu trữ trong Cloud Secret Manager và có sẵn trong môi trường Cloud Functions.
Gemini (Vertex AI)
Trong Cloud Console, hãy Bật Vertex AI API cho dự án Firebase của bạn.
Trên trang IAM, hãy đảm bảo rằng Tài khoản dịch vụ điện toán mặc định được cấp vai trò Người dùng Vertex AI.
Bí mật duy nhất bạn cần thiết lập cho hướng dẫn này là dành cho nhà cung cấp mô hình, nhưng nói chung, bạn phải làm điều tương tự cho mỗi dịch vụ mà luồng của bạn sử dụng.
(Không bắt buộc) Thêm quy trình thực thi App Check
Tính năng Kiểm tra ứng dụng Firebase sử dụng chứng thực gốc để xác minh rằng API của bạn chỉ được ứng dụng gọi.
onCallGenkit
hỗ trợ hoạt động thực thi Kiểm tra ứng dụng một cách khai báo.
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);
Định cấu hình CORS (Chia sẻ tài nguyên trên nhiều nguồn gốc)
Sử dụng lựa chọn cors
để kiểm soát những nguồn nào có thể truy cập vào hàm của bạn.
Theo mặc định, các hàm có thể gọi được đã định cấu hình CORS để cho phép các yêu cầu từ tất cả các nguồn. Để cho phép một số yêu cầu trên nhiều nguồn gốc, nhưng không phải tất cả, hãy truyền một danh sách các miền cụ thể hoặc biểu thức chính quy cần được cho phép. Ví dụ:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Ví dụ hoàn chỉnh
Sau khi bạn thực hiện tất cả các thay đổi được mô tả ở trên, quy trình có thể triển khai của bạn sẽ có dạng như ví dụ sau:
const {onCallGenkit} = require("firebase-functions/v2/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, );
Triển khai luồng đến Firebase
Sau khi xác định các luồng bằng onCallGenkit
, bạn có thể triển khai các luồng đó như cách bạn triển khai các hàm khác:
cd $PROJECT_ROOT
firebase deploy --only functions