تتضمّن 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:
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, );
إتاحة بيانات اعتماد واجهة برمجة التطبيقات للمسارات المنشورة
بعد نشر التدفقات، يجب أن تتمكّن من المصادقة مع أي خدمات عن بُعد تعتمد عليها. كحد أدنى، تحتاج معظم المسارات إلى بيانات اعتماد للوصول إلى خدمة واجهة برمجة التطبيقات للنموذج التي تستخدمها.
في هذا المثال، نفِّذ أحد الإجراءات التالية، استنادًا إلى موفّر النموذج الذي اخترته:
Gemini (ذكاء Google الاصطناعي)
أنشِئ مفتاح واجهة برمجة تطبيقات لـ "Gemini Developer API" باستخدام Google AI Studio.
خزِّن مفتاح واجهة برمجة التطبيقات في Google Cloud Secret Manager:
firebase functions:secrets:set GOOGLE_GENAI_API_KEYهذه الخطوة مهمة لمنع تسرُّب مفتاح واجهة برمجة التطبيقات عن طريق الخطأ، والذي يمنح إمكانية الوصول إلى خدمة قد تكون محدودة الاستخدام.
لمزيد من المعلومات حول إدارة الأسرار، يُرجى الاطّلاع على تخزين معلومات الإعدادات الحساسة والوصول إليها.
عدِّل
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],
الآن، عند نشر هذه الدالة، سيتم تخزين مفتاح واجهة برمجة التطبيقات في Google Cloud Secret Manager، وسيكون متاحًا من بيئة Cloud Functions.
Gemini (Vertex AI)
في وحدة تحكّم Google Cloud، فعِّل واجهة برمجة التطبيقات Vertex AI API لمشروع Firebase.
في صفحة إدارة الهوية وإمكانية الوصول، تأكَّد من منح حساب خدمة Compute التلقائي دور مستخدم Vertex AI.
السرّ الوحيد الذي عليك إعداده لهذا البرنامج التعليمي هو لموفّر النموذج، ولكن بشكل عام، عليك تنفيذ إجراء مشابه لكل خدمة يستخدمها سير العمل.
(اختياري) إضافة إجراء تنفيذ واحد (Firebase App Check)
يستخدم Firebase App Check شهادة المصادقة الأصلية للتأكّد من أنّ
تطبيقك هو الوحيد الذي يطلب واجهة برمجة التطبيقات. تتيح طريقة 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