В Cloud Functions for 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 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 AI)
Убедитесь, что Google AI доступен в вашем регионе .
Сгенерируйте ключ API для Gemini API с помощью 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.
Gemini (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/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