Cloud Functions cho 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 Flow). Bạn có thể gọi các hàm này bằng genkit/beta/client hoặc
SDK máy khách Cloud Functions,
tự động thêm thông tin xác thực.
Trước khi bắt đầu
- Bạn nên làm quen với khái niệm về flowcủa Genkit, và cách viết các flow đó. Hướng dẫn trên trang này giả định rằng bạn đã xác định một số flow 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).
Đăng nhập bằng CLI của Firebase:
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 flow 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 định nghĩa flow trong thư mục functions của dự án. Sau đây là một flow 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 flow như thế này, hãy gói flow đó 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 flow đã triển khai
Sau khi triển khai, các flow 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 flow đề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 (Google AI)
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_KEYBước này rất quan trọng để tránh vô tình làm rò rỉ khoá API, cấp quyền truy cập vào một dịch vụ có thể tính phí.
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ý bí mật.
Chỉnh sửa
src/index.jsvà thêm nội dung sau vào sau các lệnh 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 Cloud Secret Manager và có sẵn trong môi trường Cloud Functions.
Gemini (Vertex AI)
Trong bảng điều khiển 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 mà 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. Tuy nhiên, nói chung, bạn phải thực hiện một thao tác tương tự cho mỗi dịch vụ mà flow của bạn sử dụng.
(Không bắt buộc) Thêm tính năng thực thi Kiểm tra ứng dụng
Kiểm tra ứng dụng Firebase sử dụng tính năng chứng thực gốc
để xác minh rằng API của bạn chỉ được ứng dụng của bạn gọi.
onCallGenkit hỗ trợ tính nă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 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ả cá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ụ hoàn chỉnh
Sau khi bạn thực hiện tất cả các thay đổi được mô tả ở trên, flow 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 flow lên Firebase
Sau khi xác định các flow bằng onCallGenkit, bạn có thể triển khai các flow đó như cách triển khai các hàm khác:
cd $PROJECT_ROOTfirebase deploy --only functions