В Cloud Functions for Firebase есть метод onCallGenkit
, который позволяет создавать вызываемую функцию с помощью действия Genkit (поток). Эти функции можно вызывать с помощью 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 с облачными функциями вы можете скопировать или записать определения потоков в каталог 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)
Убедитесь, что 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.
Близнецы (Vertex AI)
В облачной консоли включите API Vertex AI для вашего проекта Firebase.
На странице IAM убедитесь, что учетной записи службы вычислений по умолчанию назначена роль пользователя Vertex AI .
Единственный секрет, который вам нужно настроить для этого руководства, — это поставщик модели, но в целом вы должны сделать что-то подобное для каждой службы, которую использует ваш поток.
(Необязательно) Добавьте принудительное применение проверки приложений.
Firebase App Check использует встроенную аттестацию, чтобы убедиться, что ваш API вызывается только вашим приложением. onCallGenkit
поддерживает принудительное применение проверки приложений декларативно.
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