У Cloud Functions for Firebase есть метод onCallGenkit, который позволяет создать вызываемую функцию с действием Genkit (потоком).
Эти функции можно вызывать с помощью genkit/beta/client или Cloud Functions for Firebase Client SDK, который автоматически добавляет информацию для аутентификации.
Подготовка
- Вы должны быть знакомы с концепцией потоков Genkit и уметь их писать. В инструкциях на этой странице предполагается, что вы уже определили потоки, которые хотите развернуть.
- Желательно, но не обязательно, чтобы вы уже пользовались Cloud Functions for Firebase.
Как настроить проект Firebase
Создайте новый проект Firebase в консоли Firebase или выберите существующий.
Переведите проект на тарифный план Blaze с оплатой по мере использования, который требуется для развертывания рабочей версии Cloud Functions.
Установите Firebase CLI.
Войдите в интерфейс командной строки Firebase:
firebase loginfirebase login --reauth # alternative, if necessaryfirebase login --no-localhost # if running in a remote shellСоздайте каталог для нового проекта:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1mkdir -p $PROJECT_ROOTИнициализируйте проект Firebase в каталоге:
cd $PROJECT_ROOTfirebase init functions
В оставшейся части этой статьи предполагается, что вы решили написать функции на JavaScript.
Оберните поток в onCallGenkit
После того как вы настроите проект Firebase и инициализируете в нем Cloud Functions, вы сможете скопировать или написать определения потоков в каталоге functions проекта. Вот пример того, как это работает:
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; }, );
Чтобы развернуть такой поток, оберните его в onCallGenkit, доступный в firebase-functions/https. Этот вспомогательный метод обладает всеми функциями вызываемых функций и автоматически поддерживает как потоковую передачу, так и ответы JSON.
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 доступными для развернутых потоков
После развертывания потокам потребуется способ аутентификации в удаленных сервисах, на которые они опираются. Как минимум, большинству потоков требуются учетные данные для доступа к используемому ими сервису API модели.
В этом примере выполните одно из следующих действий в зависимости от выбранного поставщика модели:
Gemini (ИИ от Google)
Создайте ключ API для Gemini Developer API с помощью Google AI Studio.
Сохраните ключ API в файле Google Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEYЭто важно, чтобы предотвратить случайную утечку ключа API, который предоставляет доступ к потенциально тарифицируемому сервису.
Подробнее о том, как хранить конфиденциальную информацию о конфигурации и получать к ней доступ…
Отредактируйте файл
src/index.jsи добавьте после существующих импортов следующее:const {defineSecret} = require("firebase-functions/params");
// Store the Gemini API key in Cloud Secret Manager. const apiKey = defineSecret("GOOGLE_GENAI_API_KEY");
Затем в определении вызываемой функции укажите, что ей нужен доступ к этому секретному значению:
// Bind the Gemini API key secret parameter to the function. secrets: [apiKey],
Теперь при развертывании этой функции ключ API будет храниться в Google Cloud Secret Manager и будет доступен из среды Cloud Functions.
Gemini (Vertex AI)
В консоли Google Cloud включите Vertex AI API для проекта Firebase.
На странице IAM убедитесь, что сервисному аккаунту Compute Engine по умолчанию назначена роль Vertex AI User.
В этом руководстве вам нужно настроить только один секрет – для поставщика модели. Но в целом вам нужно будет сделать что-то подобное для каждого сервиса, который использует ваш поток.
Добавьте принудительное применение Firebase App Check (необязательно)
Firebase App Check использует встроенную аттестацию, чтобы убедиться, что наш API вызывается только вашим приложением. Метод onCallGenkit поддерживает декларативное применение App Check.
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 (совместное использование ресурсов из разных источников)
Используйте параметр cors, чтобы указать, какие источники могут получить доступ к вашей функции.
По умолчанию для вызываемых функций настроен CORS, разрешающий запросы из всех источников. Чтобы разрешить некоторые перекрестные запросы, передайте список определенных доменов или регулярных выражений, которые должны быть разрешены. Пример:
export const tellJoke = onCallGenkit({
cors: 'mydomain.com',
}, jokeTeller);
Полный пример
После того как вы внесете все изменения, описанные в этом руководстве, ваш развертываемый поток будет выглядеть примерно так:
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, );
Развертывание потоков в Firebase
После того как вы определили потоки с помощью onCallGenkit, вы можете развернуть их так же, как и другие функции:
cd $PROJECT_ROOTfirebase deploy --only functions