В Cloud Functions для Firebase есть метод onCallGenkit
, позволяющий создать вызываемую функцию с действием Genkit (Flow). Эти функции можно вызывать с помощью genkit/beta/client
или клиентских SDK Cloud Functions , которые автоматически добавляют информацию об авторизации.
Прежде чем начать
- Вы должны быть знакомы с концепцией потоков в Genkit и с тем, как их писать. Инструкции на этой странице предполагают, что вы уже определили несколько потоков, которые хотите развернуть.
- Это полезно, но не обязательно, если вы ранее использовали Cloud Functions для Firebase.
Настройте проект Firebase
Создайте новый проект Firebase с помощью консоли Firebase или выберите существующий.
Обновите проект до плана Blaze, который требуется для развертывания производственной среды Cloud Functions.
Установите Firebase CLI .
Войдите в систему с помощью Firebase CLI:
firebase login
firebase login --reauth # alternative, if necessary
firebase login --no-localhost # if running in a remote shell
Создайте новый каталог проекта:
export PROJECT_ROOT=~/tmp/genkit-firebase-project1
mkdir -p $PROJECT_ROOT
Инициализируйте проект Firebase в каталоге:
cd $PROJECT_ROOT
firebase 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/v2/https");
exports.tellJoke = onCallGenkit({ // Bind the Gemini API key secret parameter to the function. secrets: [apiKey], }, // Pass in the genkit flow. jokeTeller, );
Сделайте учетные данные API доступными для развернутых потоков
После развертывания вашим потокам потребуется способ аутентификации во всех удалённых сервисах, к которым они обращаются. Большинству потоков как минимум требуются учётные данные для доступа к API-сервису модели, который они используют.
Для этого примера выполните одно из следующих действий в зависимости от выбранного вами поставщика модели:
Близнецы (Google AI)
Убедитесь, что Google AI доступен в вашем регионе .
Сгенерируйте ключ API для API Gemini с помощью Google AI Studio.
Сохраните свой ключ API в 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 будет сохранен в Cloud Secret Manager и доступен из среды Cloud Functions.
Близнецы (Vertex AI)
В консоли Cloud включите API Vertex AI для вашего проекта Firebase.
На странице IAM убедитесь, что учетной записи службы вычислений по умолчанию предоставлена роль пользователя Vertex AI .
Единственный секрет, который вам нужно настроить для этого руководства, — это поставщик модели, но в целом вам необходимо сделать что-то подобное для каждой службы, которую использует ваш поток.
(Необязательно) Добавьте принудительное выполнение проверки приложений
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/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, );
Развертывание потоков в Firebase
После определения потоков с помощью onCallGenkit
вы можете развернуть их так же, как и другие функции:
cd $PROJECT_ROOT
firebase deploy --only functions