Cloud Functions for Firebase memiliki metode onCallGenkit
yang memungkinkan Anda
membuat fungsi callable dengan tindakan
Genkit (Flow). Fungsi ini dapat dipanggil dengan genkit/beta/client
atau
SDK klien Cloud Functions,
yang secara otomatis menambahkan informasi autentikasi.
Sebelum memulai
- Sebaiknya pahami dahulu konsep flow Genkit, dan cara menulisnya. Petunjuk di halaman ini mengasumsikan bahwa Anda telah menentukan beberapa flow yang ingin di-deploy.
- Meski tidak wajib, pemahaman terkait penggunaan Cloud Functions for Firebase sebelumnya akan sangat membantu.
Menyiapkan project Firebase
Buat project Firebase baru menggunakan Firebase console, atau pilih project yang sudah ada.
Upgrade project ke paket Blaze, yang diperlukan untuk deployment produksi Cloud Functions.
Instal Firebase CLI.
Login dengan Firebase CLI:
firebase login
firebase login --reauth # alternative, if necessary
firebase login --no-localhost # if running in a remote shell
Buat direktori project baru:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1
mkdir -p $PROJECT_ROOT
Lakukan inisialisasi project Firebase di direktori:
cd $PROJECT_ROOT
firebase init functions
Bagian selanjutnya dari halaman ini mengasumsikan bahwa Anda telah memilih untuk menulis fungsi dalam JavaScript.
Gabungkan flow di onCallGenkit
Setelah menyiapkan project Firebase dengan Cloud Functions, Anda dapat menyalin atau
menulis definisi flow di direktori functions
project. Berikut adalah
contoh flow untuk menunjukkan hal tersebut:
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;
},
);
Untuk men-deploy flow seperti ini, gabungkan dengan onCallGenkit
, yang tersedia di
firebase-functions/https
. Metode helper ini memiliki semua fitur fungsi
callable, dan secara otomatis mendukung
streaming dan respons 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,
);
Menyediakan kredensial API untuk flow yang di-deploy
Setelah di-deploy, flow Anda memerlukan cara untuk melakukan autentikasi dengan layanan jarak jauh yang menjadi andalannya. Setidaknya, sebagian besar flow memerlukan kredensial untuk mengakses layanan API model yang mereka gunakan.
Untuk contoh tersebut, lakukan salah satu hal berikut, bergantung pada penyedia model yang Anda pilih:
Gemini (AI Google)
Pastikan AI Google tersedia di region Anda.
Buat kunci API untuk Gemini API menggunakan Google AI Studio.
Simpan kunci API Anda di Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEY
Langkah ini penting untuk mencegah kebocoran kunci API secara tidak sengaja, yang memberikan akses ke layanan yang berpotensi berbayar.
Lihat Menyimpan dan mengakses informasi konfigurasi yang sensitif untuk mengetahui informasi selengkapnya tentang cara mengelola secret.
Edit
src/index.js
dan tambahkan kode berikut setelah pengimporan yang ada:const {defineSecret} = require("firebase-functions/params"); // Store the Gemini API key in Cloud Secret Manager. const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
Kemudian, dalam definisi fungsi callable, deklarasikan bahwa fungsi memerlukan akses ke nilai secret ini:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Sekarang, saat Anda men-deploy fungsi ini, kunci API Anda akan disimpan di Cloud Secret Manager, dan tersedia dari lingkungan Cloud Functions.
Gemini (Vertex AI)
Di Konsol Cloud, Aktifkan Vertex AI API untuk project Firebase Anda.
Pada halaman IAM, pastikan bahwa Akun layanan komputasi default diberikan peran Vertex AI User.
Satu-satunya secret yang perlu Anda siapkan pada tutorial ini adalah untuk penyedia model, tetapi umumnya, Anda harus melakukan hal serupa untuk setiap layanan yang digunakan oleh flow.
(Opsional) Menambahkan penerapan App Check
Firebase App Check menggunakan pengesahan
native untuk memverifikasi bahwa API hanya dipanggil oleh aplikasi Anda.
onCallGenkit
mendukung penerapan App Check secara deklaratif.
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);
Mengonfigurasi CORS (Cross-Origin Resource Sharing)
Gunakan opsi cors
untuk mengontrol asal yang dapat mengakses fungsi Anda.
Secara default, fungsi callable telah dikonfigurasi dengan CORS untuk mengizinkan permintaan dari semua asal. Untuk mengizinkan beberapa permintaan lintas asal, tetapi tidak semua, teruskan daftar domain atau ekspresi reguler tertentu yang akan diizinkan. Contoh:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Contoh lengkap
Setelah Anda membuat semua perubahan yang dijelaskan di atas, flow yang dapat di-deploy akan terlihat seperti contoh berikut:
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,
);
Men-deploy flow ke Firebase
Setelah menentukan flow menggunakan onCallGenkit
, Anda dapat men-deploynya seperti saat
men-deploy fungsi lainnya:
cd $PROJECT_ROOT
firebase deploy --only functions