Cloud Functions for Firebase có phương thức onCallGenkit cho phép bạn tạo một
hàm có thể gọi bằng một hành động Genkit (một quy trình).
Bạn có thể gọi các hàm này bằng genkit/beta/client hoặc
Cloud Functions for Firebase Client SDK. SDK này
sẽ tự động thêm thông tin xác thực.
Trước khi bắt đầu
- Bạn cần nắm rõ khái niệm về Genkit quy trình và cách viết quy trình. 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 sử dụng Cloud Functions for Firebase trước đó (không bắt buộc).
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 Firebase hoặc chọn một dự án hiện có.
Nâng cấp dự án lên gói giá linh hoạt (trả tiền theo mức dùng) Blaze. Đây là gói bắt buộc để triển khai trong môi trường Cloud Functionssản xuất.
Cài đặt Firebase CLI.
Đăng nhập vào Firebase CLI:
firebase loginfirebase login --reauth # alternative, if necessaryfirebase login --no-localhost # if running in a remote shellTạo một thư mục dự án mới:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1mkdir -p $PROJECT_ROOTKhởi chạy một dự án Firebase trong thư mục:
cd $PROJECT_ROOTfirebase 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 quy trình trong onCallGenkit
Sau khi thiết lập một dự án Firebase và khởi chạy Cloud Functions trong
đó, bạn có thể sao chép hoặc viết định nghĩa quy trình trong thư mục functions
của dự án. Sau đây là một quy trình mẫu để 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 quy trình như quy trình này, hãy gói quy trình đó 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
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/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 quy trình đã triển khai
Sau khi triển khai, các quy trình 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 nhất, hầu hết các quy trình đề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 thực hiện một trong những thao tác sau, tuỳ thuộc vào nhà cung cấp mô hình mà bạn đã chọn:
Gemini (AI của Google)
Tạo khoá API cho Gemini Developer API bằng Google AI Studio.
Lưu trữ khoá API trong Google Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEYBước này rất quan trọng để tránh vô tình làm rò rỉ khoá API. Khoá này cấp quyền truy cập vào một dịch vụ có thể tính phí.
Hãy xem bài viết 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ý bí mật.
Chỉnh sửa
src/index.jsvà thêm nội dung sau vào các lượt 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 sẽ được lưu trữ trong Google Cloud Secret Manager và có trong môi trường Cloud Functions.
Gemini (Vertex AI)
Trong bảng điều khiển Google Cloud, hãy bật Vertex AI API cho dự án Firebase.
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à cho nhà cung cấp mô hình. Tuy nhiên, nói chung, bạn phải thực hiện tương tự cho từng dịch vụ mà quy trình của bạn sử dụng.
(Không bắt buộc) Thêm chế độ thực thi Firebase App Check
Firebase App Check sử dụng chứng thực gốc để xác minh rằng
API của chúng tôi chỉ được ứng dụng của bạn gọi. Phương thức onCallGenkit hỗ trợ App Check chế độ thực thi 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 tuỳ chọn cors để kiểm soát những nguồn gốc 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ả nguồn gốc. Để 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 phép. Ví dụ:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Ví dụ đầy đủ
Sau khi bạn thực hiện tất cả các thay đổi được mô tả trong hướng dẫn này, quy trình có thể triển khai của bạn sẽ trông giống như ví dụ sau:
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, );
Triển khai quy trình lên Firebase
Sau khi xác định các quy trình bằng onCallGenkit, bạn có thể triển khai các quy trình đó như cách bạn triển khai các hàm khác:
cd $PROJECT_ROOTfirebase deploy --only functions