Firebase Cloud Functions ile Genkit

Firebase Genkit, akışlarınızı Firebase Cloud Functions'a dağıtmanıza yardımcı olan bir eklenti içerir. Örnek olarak bu sayfada, varsayılan örnek akışını Firebase'e dağıtma süreci açıklanmaktadır.

Bir akışı Cloud Functions işlevi olarak dağıtma

  1. Gerekli araçları yükleyin:

    1. Node.js 20 veya sonraki bir sürümü kullandığınızdan emin olun (kontrol etmek için node --version komutunu çalıştırın).

    2. Firebase CLI'ı yükleyin.

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

    Projeyi, Cloud Functions işlevlerini dağıtmak için gerekli olan Blaze planına yükseltin.

  3. Firebase CLI ile giriş yapın:

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

    export PROJECT_ROOT=~/tmp/genkit-firebase-project1
    mkdir -p $PROJECT_ROOT
    
  5. Klasördeki Genkit ile bir Firebase projesi başlatın:

    cd $PROJECT_ROOT
    firebase init genkit
    
    • Daha önce oluşturduğunuz projeyi seçin.
    • Kullanmak istediğiniz model sağlayıcıyı seçin.

    Kalan istemler için varsayılanları kabul edin. genkit aracı, kendi AI akışlarınızı geliştirmeye başlamanız için bazı örnek kaynak dosyaları oluşturur. Ancak bu eğiticinin geri kalanında yalnızca örnek akışı dağıtacaksınız.

  6. API kimlik bilgilerini Cloud Functions işlevinizde kullanılabilir hale getirin. Seçtiğiniz model sağlayıcıya bağlı olarak aşağıdakilerden birini yapın:

    Gemini (Google Yapay Zeka)

    1. Google Yapay Zeka'nın bölgenizde kullanılabildiğinden emin olun.

    2. Google AI Studio'yu kullanarak Gemini API için API anahtarı oluşturun.

    3. GOOGLE_GENAI_API_KEY ortam değişkenini anahtarınıza ayarlayın:

      export GOOGLE_GENAI_API_KEY=<your API key>
      
    4. src/index.ts dosyasını düzenleyin ve mevcut içe aktarma işlemlerinden sonra aşağıdakileri ekleyin:

    import {defineSecret} from "firebase-functions/params";
    defineSecret("GOOGLE_GENAI_API_KEY");
    

    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)

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

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

    3. İsteğe bağlı: Sonraki adımda olduğu gibi akışınızı yerel olarak çalıştırmak istiyorsanız ek ortam değişkenleri ayarlayın ve gcloud aracını kullanarak uygulama varsayılan kimlik bilgilerini ayarlayın:

      export GCLOUD_PROJECT=<your project ID>
      export GCLOUD_LOCATION=us-central1
      gcloud auth application-default login
      

    Bu eğitim için ayarlamanız gereken tek sır 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.

  7. Akışınıza bir web uygulamasından erişecekseniz (sonraki bölümde bunu yapacaksınız) httpsOptions parametresinde bir CORS politikası ayarlayın:

    export const menuSuggestionFlow = onFlow(
      {
        name: "menuSuggestionFlow",
        // ...
        httpsOptions: {cors: true}, // Add this line.
      },
      async (subject) => {
        // ...
      }
    );
    

    Üretim uygulamaları için muhtemelen daha kısıtlayıcı bir politika isteyebilirsiniz ancak bu, eğitimde geçerli olacaktır.

  8. İsteğe bağlı: Geliştirici kullanıcı arayüzündeki adımlarınızı deneyin:

    1. Kullanıcı arayüzünü başlatın:

      cd $PROJECT_ROOT/functions
      genkit start
      
    2. Geliştiricinin kullanıcı arayüzünde (http://localhost:4000/) akışı çalıştırın:

      1. menuSuggestionFlow'u tıklayın.

      2. Input JSON sekmesinde model için bir konu sağlayın:

        "AI app developers"
        
      3. Auth JSON sekmesinde, simüle edilmiş bir kimlik doğrulama nesnesi sağlayın:

        {
          "uid": 0,
          "email_verified": true
        }
        
      4. Çalıştır'ı tıklayın.

  9. Şimdiye kadar her şey beklendiği gibi çalışıyorsa akışı dağıtabilirsiniz:

    cd $PROJECT_ROOT
    firebase deploy --only functions
    

Akışı bir Cloud Functions işlevi olarak dağıttınız. Ancak akışın yetkilendirme politikası nedeniyle, dağıtılan uç noktanıza curl veya benzeri bir araçla erişemezsiniz. Akışa güvenli bir şekilde nasıl erişebileceğinizi öğrenmek için sonraki bölüme geçin.

Dağıtılan akışı deneyin

Dağıttığınız her akışın bir yetkilendirme politikası belirlemesi son derece önemlidir. Yapay zeka olmasaydı, pahalı olabilecek üretken yapay zeka akışlarınız herkese hitap ederdi.

Varsayılan örnek akışı, aşağıdaki gibi bir yetkilendirme politikasına sahiptir:

firebaseAuth((user) => {
  if (!user.email_verified) {
    throw new Error('Verified email required to run flow');
  }
});

Bu politika, uygulamanızın yalnızca doğrulanmış e-posta adresleri olan kayıtlı kullanıcılarına erişim izni vermek için firebaseAuth() yardımcısını kullanır. İstemci tarafında Authorization: Bearer başlığını, politikanıza uygun bir Firebase kimliği jetonuna ayarlamanız gerekir. Cloud Functions istemci SDK'ları, bu işlemi otomatikleştiren çağrılanabilir işlev yöntemleri sunar.

Akış uç noktanızı denemek için aşağıdaki minimum örnek web uygulamasını dağıtabilirsiniz:

  1. Firebase konsolunun Proje ayarları bölümünde yeni bir web uygulaması ekleyin ve Hosting'i de ayarlama seçeneğini belirleyin.

  2. Firebase konsolunun Kimlik Doğrulama bölümünde, bu örnekte kullanacağınız Google sağlayıcısını etkinleştirin.

  3. Proje dizininizde, örnek uygulamayı dağıtacağınız Firebase Hosting'i kurun:

    cd $PROJECT_ROOT
    firebase init hosting
    

    Tüm istemler için varsayılanları kabul edin.

  4. public/index.html değerini şununla değiştirin:

    <!doctype html>
    <html>
      <head>
        <title>Genkit demo</title>
      </head>
      <body>
        <div id="signin" hidden>
          <button id="signinBtn">Sign in with Google</button>
        </div>
        <div id="callGenkit" hidden>
          Subject: <input type="text" id="subject" />
          <button id="suggestMenuItem">Suggest a menu theme</button>
          <p id="menuItem"></p>
        </div>
        <script type="module">
          import { initializeApp } from 'https://www.gstatic.com/firebasejs/10.10.0/firebase-app.js';
          import {
            getAuth,
            onAuthStateChanged,
            GoogleAuthProvider,
            signInWithPopup,
          } from 'https://www.gstatic.com/firebasejs/10.10.0/firebase-auth.js';
          import {
            getFunctions,
            httpsCallable,
          } from 'https://www.gstatic.com/firebasejs/10.10.0/firebase-functions.js';
    
          const firebaseConfig = await fetch('/__/firebase/init.json');
          initializeApp(await firebaseConfig.json());
    
          async function generateMenuItem() {
            const menuSuggestionFlow = httpsCallable(
              getFunctions(),
              'menuSuggestionFlow'
            );
            const subject = document.querySelector('#subject').value;
            const response = await menuSuggestionFlow(subject);
            document.querySelector('#menuItem').innerText = response.data;
          }
    
          function signIn() {
            signInWithPopup(getAuth(), new GoogleAuthProvider());
          }
    
          document
            .querySelector('#signinBtn')
            .addEventListener('click', signIn);
          document
            .querySelector('#suggestMenuItem')
            .addEventListener('click', generateMenuItem);
    
          const signinEl = document.querySelector('#signin');
          const genkitEl = document.querySelector('#callGenkit');
    
          onAuthStateChanged(getAuth(), (user) => {
            if (!user) {
              signinEl.hidden = false;
              genkitEl.hidden = true;
            } else {
              signinEl.hidden = true;
              genkitEl.hidden = false;
            }
          });
        </script>
      </body>
    </html>
    
  5. Web uygulamasını ve Cloud Functions işlevini dağıtın:

    cd $PROJECT_ROOT
    firebase deploy
    

deploy komutuyla yazdırılan URL'yi ziyaret ederek web uygulamasını açın. Uygulama bir Google Hesabı ile oturum açmanızı gerektirir. Bunun ardından uç nokta istekleri başlatabilirsiniz.

Firebase Local Emulator Suite kullanarak geliştirme

Firebase, yerel geliştirme için bir emülatör paketi sunar. Bu paketi Genkit ile kullanabilirsiniz.

Genkit'i Firebase Emulator Suite ile kullanmak için Firebase emülatörlerini şu şekilde başlatın:

GENKIT_ENV=dev firebase emulators:start --inspect-functions

Bu işlem, kodunuzu emülatörde çalıştırır ve Genkit çerçevesini geliştirme modunda çalıştırır. Bu durumda, Genkit yansıma API'si başlatılır ve kullanıma sunulur (ancak geliştirici kullanıcı arayüzü gösterilmez).

Ardından, Firebase Emulator'da çalışan kodunuza bağlamak için --attach seçeneğiyle Genkit Dev kullanıcı arayüzünü başlatın:

genkit start --attach http://localhost:3100 --port 4001

Yeni geliştirilenler arayüzünde Firestore'daki izleri görmek için Denetle sekmesine gidip "Dev/Prod" anahtarını açıp kapatabilirsiniz. "Üretim" olarak ayarlandığında firestore'daki izler yüklenir.