Memanggil flow Genkit dari Aplikasi Anda

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

  1. Buat project Firebase baru menggunakan Firebase console, atau pilih project yang sudah ada.

  2. Upgrade project ke paket Blaze, yang diperlukan untuk deployment produksi Cloud Functions.

  3. Instal Firebase CLI.

  4. Login dengan Firebase CLI:

    firebase login
    firebase login --reauth # alternative, if necessary
    firebase login --no-localhost # if running in a remote shell
  5. Buat direktori project baru:

    export PROJECT_ROOT=~/tmp/genkit-firebase-project1
    mkdir -p $PROJECT_ROOT
  6. 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)

  1. Pastikan AI Google tersedia di region Anda.

  2. Buat kunci API untuk Gemini API menggunakan Google AI Studio.

  3. 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.

  4. 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)

  1. Di Konsol Cloud, Aktifkan Vertex AI API untuk project Firebase Anda.

  2. 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