Uygulamanızdan Genkit akışlarını çağırma

Cloud Functions for Firebase, Genkit işlemi (akış) içeren bir çağrılabilir işlev oluşturmanıza olanak tanıyan bir onCallGenkit yöntemine sahiptir. Bu işlevler, kimlik doğrulama bilgilerini otomatik olarak ekleyen genkit/beta/client veya Cloud Functions for Firebase Client SDK ile çağrılabilir.

Başlamadan önce

  • Genkit Akışlar kavramını ve bunları nasıl yazacağınızı biliyor olmalısınız. Bu sayfadaki talimatlarda, dağıtmak istediğiniz bazı akışları tanımladığınız varsayılır.
  • Cloud Functions for Firebase'ı daha önce kullandıysanız bu adım yararlı olur ancak zorunlu değildir.

Firebase projesi oluşturma

  1. Firebase konsolunu kullanarak yeni bir Firebase projesi oluşturun veya mevcut bir projeyi seçin.

  2. Üretim dağıtımı için gerekli olan kullandıkça öde Blaze fiyatlandırma planına projeyi yükseltin.Cloud Functions

  3. Firebase KSA'yı yükleyin.

  4. Firebase KSA'ya giriş yapın:

    firebase login
    firebase login --reauth # alternative, if necessary
    firebase login --no-localhost # if running in a remote shell
  5. Yeni bir proje dizini oluşturun:

    export PROJECT_ROOT=~/tmp/genkit-firebase-project1
    mkdir -p $PROJECT_ROOT
  6. Dizinde bir Firebase projesi başlatın:

    cd $PROJECT_ROOT
    firebase init functions

Bu sayfanın geri kalanında, işlevlerinizi JavaScript ile yazmayı seçtiğiniz varsayılır.

Akışı onCallGenkit içine sarmalama

Bir Firebase projesi oluşturup Cloud Functions'ı başlattıktan sonra akış tanımlarını projenin functions dizinine kopyalayabilir veya yazabilirsiniz. Bunu göstermek için ö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;
},
);

Bunun gibi bir akışı dağıtmak için onCallGenkit ile sarmalayın. onCallGenkit, firebase-functions/https içinde kullanılabilir. 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/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ışlarda kullanılabilir hale getirme

Dağıtıldıktan sonra akışlarınızın, bağlı oldukları tüm uzak hizmetlerde kimlik doğrulaması yapması gerekir. Çoğu akışın, kullandığı model API hizmetine erişmek için en azından kimlik bilgilerine ihtiyacı vardır.

Bu örnekte, seçtiğiniz model sağlayıcıya bağlı olarak aşağıdakilerden birini yapın:

Gemini (Google AI)

  1. Google AI Studio kullanarak Gemini Developer API için API anahtarı oluşturun.

  2. API anahtarınızı Google Cloud Secret Manager konumunda saklayın:

    firebase functions:secrets:set GOOGLE_GENAI_API_KEY

    Bu adım, ücretli olabilecek bir hizmete erişim sağlayan API anahtarınızın yanlışlıkla sızdırılmasını önlemek için önemlidir.

    Gizli dizileri yönetme hakkında daha fazla bilgi için Hassas yapılandırma bilgilerini depolama ve bunlara erişme başlıklı makaleyi inceleyin.

  3. src/index.js dosyasını düzenleyin ve mevcut içe aktarmaların ardından aşağıdakileri 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 bildirin:

    // 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 Google Cloud Secret Manager içinde saklanır ve Cloud Functions ortamında kullanılabilir.

Gemini (Vertex AI)

  1. Google Cloud konsolunda Firebase projeniz için Vertex AI API'yi etkinleştirin.

  2. IAM sayfasında, Varsayılan Compute hizmet hesabına Vertex AI Kullanıcısı rolünün verildiğinden emin olun.

Bu eğitim için ayarlamanız gereken tek sır, model sağlayıcıya aittir. Ancak genel olarak, akışınızın kullandığı her hizmet için benzer bir işlem yapmanız gerekir.

(İsteğe bağlı) Firebase App Check yaptırım ekleme

Firebase App Check, API'mizin yalnızca uygulamanız tarafından çağrıldığını doğrulamak için yerel onaylama özelliğini kullanır. onCallGenkit yöntemi, App Check zorunlu kılmayı bildirimsel olarak 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

Hangi kaynakların işlevinize 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ılır. Tüm kaynaklar arası isteklere değil, yalnızca bazılarına izin vermek için izin verilmesi gereken belirli alan adlarının veya normal ifadelerin listesini iletin. Örneğin:

export const tellJoke = onCallGenkit({
  cors: 'mydomain.com',
}, jokeTeller);

Eksiksiz örnek

Bu kılavuzda açıklanan tüm değişiklikleri yaptıktan sonra dağıtılabilir akışınız aşağıdaki örneğe benzer şekilde görünür:

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,
);

Akışları Firebase'e dağıtma

onCallGenkit kullanarak akışları tanımladıktan sonra, diğer işlevleri dağıtırken yaptığınız gibi dağıtabilirsiniz:

cd $PROJECT_ROOT
firebase deploy --only functions