Генкит с облачными функциями Firebase

Firebase Genkit включает плагин, который поможет вам развернуть потоки в облачных функциях Firebase. На этой странице в качестве примера описан процесс развертывания примера потока по умолчанию в Firebase.

Развертывание потока как облачной функции

  1. Установите необходимые инструменты:

    1. Убедитесь, что вы используете Node.js версии 20 или выше (для проверки запустите node --version ).

    2. Установите Firebase CLI .

  2. Создайте новый проект Firebase с помощью консоли Firebase или выберите существующий.

    Обновите проект до плана Blaze, который необходим для развертывания облачных функций.

  3. Войдите в систему с помощью Firebase CLI:

    firebase login
    firebase login --reauth # alternative, if necessary
    firebase login --no-localhost # if running in a remote shell
    
  4. Создайте новый каталог проекта:

    export PROJECT_ROOT=~/tmp/genkit-firebase-project1
    mkdir -p $PROJECT_ROOT
    
  5. Инициализируйте проект Firebase с помощью Genkit в папке:

    cd $PROJECT_ROOT
    firebase init genkit
    
    • Выберите проект, который вы создали ранее.
    • Выберите поставщика модели, которого вы хотите использовать.

    Примите значения по умолчанию для остальных запросов. Инструмент genkit создаст несколько примеров исходных файлов, которые помогут вам приступить к разработке собственных потоков ИИ. Однако в оставшейся части этого руководства вы просто развернете пример потока.

  6. Сделайте учетные данные API доступными для вашей облачной функции. Выполните одно из следующих действий в зависимости от выбранного вами поставщика модели:

    Близнецы (ИИ Google)

    1. Убедитесь, что Google AI доступен в вашем регионе .

    2. Создайте ключ API для Gemini API с помощью Google AI Studio.

    3. Установите для переменной среды GOOGLE_GENAI_API_KEY свой ключ:

      export GOOGLE_GENAI_API_KEY=<your API key>
      
    4. Отредактируйте src/index.ts и добавьте следующее после существующего импорта:

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

    Теперь, когда вы развернете эту функцию, ваш ключ API будет храниться в Cloud Secret Manager и доступен из среды Cloud Functions.

    Близнецы (Vertex AI)

    1. В облачной консоли включите API Vertex AI для вашего проекта Firebase.

    2. На странице IAM убедитесь, что учетной записи службы вычислений по умолчанию предоставлена ​​роль пользователя Vertex AI .

    3. Необязательно : если вы хотите запустить поток локально, как на следующем шаге, установите некоторые дополнительные переменные среды и используйте инструмент gcloud для настройки учетных данных приложения по умолчанию:

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

    Единственный секрет, который вам нужно настроить для этого руководства, — это поставщик модели, но в целом вы должны сделать что-то подобное для каждой службы, которую использует ваш поток.

  7. Если вы будете получать доступ к своему потоку из веб-приложения (что вы будете делать в следующем разделе), в параметре httpsOptions установите политику CORS:

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

    Вероятно, вам понадобится более строгая политика для рабочих приложений, но для данного руководства этого достаточно.

  8. Необязательно : попробуйте свой алгоритм в пользовательском интерфейсе разработчика:

    1. Запустите пользовательский интерфейс:

      cd $PROJECT_ROOT/functions
      genkit start
      
    2. В пользовательском интерфейсе разработчика (http://localhost:4000/) запустите поток:

      1. Нажмите менюПоток предложений .

      2. На вкладке «Ввод JSON» укажите тему модели:

        "AI app developers"
        
      3. На вкладке Auth JSON укажите смоделированный объект аутентификации:

        {
          "uid": 0,
          "email_verified": true
        }
        
      4. Нажмите «Выполнить» .

  9. Если пока все работает так, как ожидалось, вы можете развернуть поток:

    cd $PROJECT_ROOT
    firebase deploy --only functions
    

Теперь вы развернули поток как облачную функцию! Но вы не сможете получить доступ к развернутой конечной точке с помощью curl или аналогичного средства из-за политики авторизации потока. Перейдите к следующему разделу, чтобы узнать, как безопасно получить доступ к потоку.

Попробуйте развернутый поток

Крайне важно, чтобы каждый развертываемый поток устанавливал политику авторизации. Без него ваши потенциально дорогостоящие генеративные потоки ИИ были бы доступны любому.

Поток выборки по умолчанию имеет политику авторизации, подобную следующей:

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

Эта политика использует помощник firebaseAuth() чтобы разрешить доступ только зарегистрированным пользователям вашего приложения с проверенными адресами электронной почты. На стороне клиента вам необходимо установить заголовок Authorization: Bearer для токена Firebase ID, который соответствует вашей политике. Клиентские SDK Cloud Functions предоставляют вызываемые методы функций , которые автоматизируют это.

Чтобы опробовать конечную точку потока, вы можете развернуть следующий минимальный пример веб-приложения:

  1. В разделе «Настройки проекта» консоли Firebase добавьте новое веб-приложение, выбрав опцию также настроить хостинг.

  2. В разделе «Аутентификация» консоли Firebase включите провайдера Google , который вы будете использовать в этом примере.

  3. В каталоге вашего проекта настройте хостинг Firebase, где вы будете развертывать пример приложения:

    cd $PROJECT_ROOT
    firebase init hosting
    

    Примите значения по умолчанию для всех запросов.

  4. Замените public/index.html следующим:

    <!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. Разверните веб-приложение и облачную функцию:

    cd $PROJECT_ROOT
    firebase deploy
    

Откройте веб-приложение, посетив URL-адрес, напечатанный командой deploy . Приложение требует входа в систему с учетной записью Google, после чего вы можете инициировать запросы к конечным точкам.

Разработка с использованием пакета локального эмулятора Firebase

Firebase предлагает набор эмуляторов для локальной разработки , которые вы можете использовать с Genkit.

Чтобы использовать Genkit с пакетом эмуляторов Firebase, запустите эмуляторы Firebase следующим образом:

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

Это запустит ваш код в эмуляторе и запустит платформу Genkit в режиме разработки, которая запускает и предоставляет API отражения Genkit (но не пользовательский интерфейс Dev).

Затем запустите пользовательский интерфейс Genkit Dev с опцией --attach , чтобы подключить его к вашему коду, работающему внутри эмулятора Firebase:

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

Чтобы увидеть трассировки из Firestore в пользовательском интерфейсе разработчика, вы можете перейти на вкладку «Проверка» и переключить переключатель «Разработка/Прод». При переключении на «prod» будут загружаться трассировки из Firestore.