Cloud Functions for Firebase'da, Genkit işlemiyle (Flow) çağrılabilir işlev oluşturmanıza olanak tanıyan bir onCallGenkit
yöntemi vardır. Bu işlevler, genkit/beta/client
ile veya kimlik doğrulama bilgilerini otomatik olarak ekleyen Cloud Functions istemci SDK'ları ile çağrılabilir.
Başlamadan önce
- Genkit'in akış kavramı ve bunların nasıl yazılacağı hakkında bilgi sahibi olmanız gerekir. Bu sayfadaki talimatlarda, dağıtmak istediğiniz bazı akışları zaten tanımladığınız varsayılmaktadır.
- Daha önce Cloud Functions for Firebase kullandıysanız bu bilgi faydalı olsa da gerekli değildir.
Firebase projesi oluşturma
Firebase konsolunu kullanarak yeni bir Firebase projesi oluşturun veya mevcut bir projeyi seçin.
Projeyi, Cloud Functions'ın üretime dağıtımı için gereken Blaze planına yükseltin.
Firebase CLI'yi yükleyin.
Firebase CLI ile oturum açın:
firebase login
firebase login --reauth # alternative, if necessary
firebase login --no-localhost # if running in a remote shell
Yeni bir proje dizini oluşturun:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1
mkdir -p $PROJECT_ROOT
Dizininde bir Firebase projesini başlatın:
cd $PROJECT_ROOT
firebase init functions
Bu sayfanın geri kalanında, işlevlerinizi JavaScript'te yazmayı seçtiğiniz varsayılmaktadır.
Akışa onCallGenkit
ekleme
Cloud Functions ile bir Firebase projesi oluşturduktan sonra projenin functions
dizininde akış tanımlarını kopyalayabilir veya yazabilirsiniz. Bunu gösteren örnek bir akış aşağıda verilmiştir:
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;
},
);
Buna benzer bir akışı dağıtmak için firebase-functions/https
'te bulunan onCallGenkit
ile sarmalayın. Bu yardımcı yöntem, çağrılabilir işlevlerin tüm özelliklerine sahiptir ve hem akış hem de JSON yanıtlarını otomatik olarak destekler.
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,
);
API kimlik bilgilerini dağıtılan akışlar için kullanılabilir hale getirme
Yayınlanan akışlarınızın, kullandıkları uzak hizmetlerle kimlik doğrulaması yapması gerekir. Çoğu akışta, kullandıkları model API hizmetine erişmek için en azından kimlik bilgileri gerekir.
Bu örnekte, seçtiğiniz model sağlayıcıya bağlı olarak aşağıdakilerden birini yapın:
Gemini (Google Yapay Zeka)
Google Yapay Zeka'nın bölgenizde kullanılabildiğinden emin olun.
Google AI Studio'yu kullanarak Gemini API için API anahtarı oluşturun.
API anahtarınızı Cloud Secret Manager'da depolayın:
firebase functions:secrets:set GOOGLE_GENAI_API_KEY
Bu adım, olası ücretli bir hizmete erişim sağlayan API anahtarınızın yanlışlıkla sızmasını önlemek için önemlidir.
Gizli bilgileri yönetme hakkında daha fazla bilgi için Hassas yapılandırma bilgilerini depolama ve bunlara erişme başlıklı makaleyi inceleyin.
src/index.js
dosyasını düzenleyin ve mevcut içe aktarma işlemlerinin ardından şunları ekleyin:const {defineSecret} = require("firebase-functions/params"); // Store the Gemini API key in Cloud Secret Manager. const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
Ardından, çağrılabilir işlev tanımında işlevin bu gizli değere erişmesi gerektiğini belirtin:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Artık bu işlevi dağıttığınızda API anahtarınız Cloud Secret Manager'da depolanır ve Cloud Functions ortamından kullanılabilir.
Gemini (Vertex AI)
Cloud Console'da, Firebase projeniz için Vertex AI API'yi etkinleştirin.
IAM sayfasında, Varsayılan Compute hizmet hesabına Vertex AI Kullanıcısı rolünün atandığından emin olun.
Bu eğitim için ayarlamanız gereken tek gizlilik, model sağlayıcı içindir ancak genel olarak akışınızın kullandığı her hizmet için benzer bir işlem yapmanız gerekir.
(İsteğe bağlı) Uygulama Kontrolü yaptırımı ekleme
Firebase Uygulama Kontrolü, API'nizin yalnızca uygulamanız tarafından çağrıldığını doğrulamak için yerel doğrulama kullanır.
onCallGenkit
, Uygulama Kontrolü yaptırımını açık bir şekilde destekler.
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);
CORS'u (Merkezler Arası Kaynak Paylaşımı) yapılandırma
İşlevinize hangi kaynakların erişebileceğini kontrol etmek için cors
seçeneğini kullanın.
Varsayılan olarak, çağrılabilir işlevlerde CORS tüm kaynaklardan gelen isteklere izin verecek şekilde yapılandırılmıştır. Kaynaklar arası isteklerin bazılarına izin vermek için (tümüne değil) izin verilmesi gereken belirli alan adlarının veya normal ifadelerin listesini iletin. Örneğin:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Tam örnek
Yukarıda açıklanan tüm değişiklikleri yaptıktan sonra dağıtılabilir akışınız aşağıdaki örnek gibi görünür:
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,
);
Akışları Firebase'e dağıtma
onCallGenkit
kullanarak akışları tanımladıktan sonra diğer işlevleri dağıttığınız gibi dağıtabilirsiniz:
cd $PROJECT_ROOT
firebase deploy --only functions