این راهنما نحوه شروع به کار با نسل دوم Cloud Functions با Remote Config سمت سرور را برای برقراری تماسهای سمت سرور با Agent Platform Gemini API (formerly Vertex AI) توضیح میدهد.
در این آموزش گامبهگام، Remote Config را به تابعی شبیه روبات گپ اضافه میکنید که از مدل Gemini برای پاسخ دادن به سؤالات کاربر استفاده میکند. Remote Config ورودیهای Gemini API را (ازجمله پیاموارهای که به ابتدای پُرسمانهای ورودی کاربر اضافه میکنید) مدیریت خواهد کرد و میتوانید این ورودیها را درصورت نیاز از کنسول Firebase بهروز کنید. همچنین از Firebase Local Emulator Suite برای آزمایش و اشکالزدایی تابع استفاده خواهید کرد، و سپس، پساز درستیسنجی عملکرد آن، آن را در Google Cloud مستقر و آزمایش خواهید کرد.
هستید یا نه.پیشنیازها
این راهنما فرض میکند که با استفاده از جاوا اسکریپت برای توسعه برنامهها آشنا هستید.
راهاندازی پروژه Firebase
اگر ازقبل پروژه Firebase ندارید:
به سیستم کنسول Firebase وارد شوید.
روی ایجاد پروژه کلیک کنید، و سپس از یکی از گزینههای زیر استفاده کنید:
- گزینه ۱: با وارد کردن نام پروژه جدید در اولین مرحله گردش کار «ایجاد پروژه»، پروژه Firebase جدیدی (و پروژه زیربنایی Google Cloud آن بهطور خودکار) ایجاد کنید.
- گزینه ۲: با انتخاب نام پروژه Google Cloud از منو کرکرهای در اولین مرحله گردش کار «ایجاد پروژه»، «Firebase را به پروژه Google Cloud موجود اضافه کنید».
وقتی از شما خواسته شد، برای استفاده از این راهکار، نیازی به راهاندازی Google Analytics ندارید.
برای ایجاد پروژه، دستورالعملهای روی صفحه را دنبال کنید.
اگر ازقبل پروژه Firebase دارید:
به پیکربندی محیط توسعه بروید.
پیکربندی محیط توسعه
برای نوشتن توابع، به محیط Node.js نیاز دارید، و برای استقرار توابع در زمان اجرای Cloud Functions، به Firebase CLI نیاز دارید.
-
برای نصب Node.js و npm، توصیه میکنیم از مدیر نسخه Node استفاده کنید.
بااستفاده از روش ترجیحیتان، Firebase CLI را نصب کنید. برای مثال، برای نصب CLI بااستفاده از npm، این فرمان را اجرا کنید:
npm install -g firebase-tools@latestاین فرمان، فرمان
firebaseرا که بهصورت جهانی دردسترس است نصب میکند. اگر این فرمان ناموفق بود، ممکن است لازم باشد اجازههای npm را تغییر دهید.برای بهروزرسانی به جدیدترین نسخه
firebase-tools، همان فرمان را دوباره اجرا کنید.
firebase-functionsوfirebase-adminرا نصب کنید و از--saveبرای ذخیره کردن آنها درpackage.jsonاستفاده کنید:npm install firebase-functions@latest firebase-admin@latest --save
اکنون آمادهاید تا به پیادهسازی این راهکار بپردازید.
پیادهسازی
برای ایجاد، آزمایش، و استقرار نسل دوم Cloud Functions با Remote Config و Agent Platform، این مراحل را دنبال کنید:
- Agent Platform میانای برنامهسازی کاربردی توصیهشده را در کنسول Google Cloud فعال کنید.
- پروژهتان را مقداردهی اولیه کنید و وابستگیهای Node را نصب کنید.
- اجازههای IAM را برای حساب خدماتی Admin SDK خود پیکربندی کنید و کلیدتان را ذخیره کنید.
- تابع را ایجاد کنید.
- الگوی Remote Config مختص سرور ایجاد کنید.
- تابع خود را پیادهسازی کنید و آن را در Firebase Local Emulator Suite آزمایش کنید.
- تابع خود را در Google Cloud پیاده کنید.
مرحله ۱: فعال کردن Agent Platform میانای برنامهسازی کاربردی توصیهشده در کنسول Google Cloud
- کنسول Google Cloud را باز کنید، و وقتی درخواست شد، پروژهتان را انتخاب کنید.
- در فیلد جستجو در بالای کنسول، Agent Platform را وارد کنید و منتظر بمانید تا Agent Platform بهعنوان نتیجه ظاهر شود.
- Agent Platform را انتخاب کنید. داشبورد Agent Platform نشان داده میشود.
روی فعال کردن همه میاناهای برنامهسازی کاربردی توصیهشده کلیک کنید.
ممکن است چند لحظه طول بکشد تا فعالسازی API تکمیل شود. صفحه را فعال و باز نگه دارید تا فعالسازی تمام شود.
اگر صورتحساب فعال نباشد، از شما خواسته میشود که Cloud Billing حسابی را اضافه یا پیوند دهید. پساز فعال کردن حساب صورتحساب، به داشبورد Agent Platform برگردید و تأیید کنید که همه میاناهای برنامهسازی کاربردی توصیهشده فعال هستند.
مرحله ۲: مقداردهی اولیه پروژه و نصب وابستگیهای Node
- پایانهای را در رایانهتان باز کنید و به دایرکتوری که میخواهید تابع را در آن ایجاد کنید بروید.
وارد سیستم Firebase شوید:
firebase loginبرای مقداردهی اولیه Cloud Functions for Firebase، فرمان زیر را اجرا کنید:
firebase init functionsاستفاده از پروژه موجود را انتخاب کنید و شناسه پروژهتان را مشخص کنید.
وقتی از شما خواسته شد زبان موردنظر را برای استفاده انتخاب کنید، جاوا اسکریپت را انتخاب کنید و کلید Enter را فشار دهید.
برای همه گزینههای دیگر، پیشفرضها را انتخاب کنید.
فهرست راهنمای
functionsدر فهرست راهنمای کنونی ایجاد میشود. درون آن، فایلindex.jsرا پیدا خواهید کرد که از آن برای ساختن تابع خود استفاده میکنید، دایرکتوریnode_modulesکه حاوی وابستگیهای تابع شما است، و فایلpackage.jsonکه حاوی وابستگیهای بسته است.با اجرای فرمانهای زیر، بستههای Admin SDK و Agent Platform را اضافه کنید و از
--saveاستفاده کنید تا مطمئن شوید که در فایلpackage.jsonذخیره میشود:cd functions npm install firebase-admin@latest @google-cloud/vertexai --save
فایل functions/package.json شما اکنون باید شبیه به فایل زیر باشد، با این تفاوت که
جدیدترین نسخهها مشخص شده است:
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"serve": "firebase emulators:start --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "20"
},
"main": "index.js",
"dependencies": {
"@google-cloud/vertexai": "^1.1.0",
"firebase-admin": "^12.1.0",
"firebase-functions": "^5.0.0"
},
"devDependencies": {
"firebase-functions-test": "^3.1.0"
},
"private": true
}
توجه داشته باشید که اگر از ESLint استفاده میکنید، یک بند شامل آن را خواهید دید. علاوهبراین، مطمئن شوید که نسخه موتور گره با نسخه نصبشده Node.js و نسخهای که درنهایت در Google Cloud اجرا میکنید مطابقت داشته باشد. برای مثال، اگر
بخش engines در package.json شما بهعنوان «نسخه ۱۸ Node» پیکربندی شده است و
از Node.js 20 استفاده میکنید، فایل را بهروز کنید تا از نسخه ۲۰ استفاده کند:
"engines": {
"node": "20"
},
مرحله ۳: پیکربندی اجازههای IAM برای حساب سرویس Admin SDK و ذخیره کردن کلید
در این راهکار، از حساب سرویس Firebase Admin SDK برای اجرای تابع خود استفاده خواهید کرد.
- در کنسول Google Cloud، صفحه
IAM و سرپرست را باز کنید
و حساب سرویس Admin SDK (با نام
firebase-adminsdk) را پیدا کنید. - حساب را انتخاب کنید و روی ویرایش اصلی کلیک کنید. صفحه «ویرایش دسترسی» نمایان میشود.
- روی افزودن نقش دیگر کلیک کنید، Remote Config بیننده را انتخاب کنید.
- روی افزودن نقش دیگر کلیک کنید، توسعهدهنده پلاتفرم هوش مصنوعی را انتخاب کنید.
- روی افزودن نقش دیگر کلیک کنید، Agent Platform کاربر را انتخاب کنید.
- روی افزودن نقش دیگر کلیک کنید، فراخواننده Cloud Run را انتخاب کنید.
- روی ذخیره کردن کلیک کنید.
سپس، اطلاعات اعتباری حساب سرویس Admin SDK را صادر کنید و آنها را در متغیر محیط GOOGLE_APPLICATION_CREDENTIALS ذخیره کنید.
- در کنسول Google Cloud، صفحه اطلاعات اعتباری را باز کنید.
- روی حساب سرویس Admin SDK کلیک کنید تا صفحه جزئیات باز شود.
- روی کلیدها کلیک کنید.
- روی افزودن کلید > ایجاد کلید جدید کلیک کنید.
- مطمئن شوید که JSON بهعنوان نوع کلید انتخاب شده باشد، سپس روی ایجاد کلیک کنید.
- کلید را در مکان امنی در رایانه بارگیری کنید.
از پایانه خود، کلید را بهعنوان متغیر محیط صادر کنید:
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-key.json"
مرحله ۴: ایجاد تابع
در این مرحله، تابعی میسازید که ورودی کاربر را مدیریت میکند و پاسخهای تولیدشده با هوش مصنوعی را تولید میکند. چند تکهکد را با هم ترکیب میکنید تا تابعی جامع بسازید که Admin SDK و Agent Platform Gemini API (formerly Vertex AI) را مقداردهی اولیه کند، پارامترهای پیشفرض را بااستفاده از Remote Config پیکربندی کند، جدیدترین پارامترهای Remote Config را واکشی کند، ورودی کاربر را پردازش کند، و پاسخ را به کاربر جاریسازی کند.
- در پایگاه کد،
functions/index.jsرا در ویرایشگر نوشتار یا IDE باز کنید. محتوای موجود را حذف کنید و سپس Admin SDK، Remote Config، و کیت توسعه نرمافزار Agent Platform را اضافه کنید و برنامه را با جایگذاری کد زیر در فایل مقداردهی اولیه کنید:
const { onRequest } = require("firebase-functions/https"); const { requiresRole, requiresAPI } = require("firebase-functions"); const logger = require("firebase-functions/logger"); const { initializeApp } = require("firebase-admin/app"); const { VertexAI } = require('@google-cloud/vertexai'); const { getRemoteConfig } = require("firebase-admin/remote-config"); requiresRole("roles/aiplatform.user"); requiresRole("roles/cloudconfig.viewer"); requiresAPI("aiplatform.googleapis.com", "Needed to query Vertex AI Gemini models"); requiresAPI("firebaseremoteconfig.googleapis.com", "Needed to fetch server-side Remote Config templates"); // Set and check environment variables. const project = process.env.GCLOUD_PROJECT; // Initialize Firebase. const app = initializeApp();مقادیر پیشفرضی را که تابع شما درصورت عدم امکان اتصال به سرور Remote Config استفاده خواهد کرد پیکربندی کنید. این راهکار
textModel،generationConfig،safetySettings،textPrompt، وlocationرا بهعنوان پارامترهای Remote Config پیکربندی میکند که با پارامترهای Remote Config مطابقت دارند و در ادامه این راهنما آنها را بیشتر پیکربندی خواهید کرد. برای اطلاعات بیشتر درباره این پارامترها، کارخواه Vertex AI Node.js را ببینید.درصورت تمایل، میتوانید پارامتری را نیز پیکربندی کنید تا کنترل کنید آیا به Agent Platform Gemini API (formerly Vertex AI) دسترسی دارید یا نه (در این مثال، پارامتری بهنام
vertex_enabled). این راهاندازی میتواند هنگام آزمایش کردن تابع مفید باشد. در تکهکدهای زیر، این مقدار رویfalseتنظیم شده است که باعث میشود از Agent Platform هنگام آزمایش کردن استقرار تابع پایه استفاده نشود. تنظیم آن رویtrueباعث فراخوانی Agent Platform Gemini API (formerly Vertex AI) میشود.// Define default (fallback) parameter values for Remote Config. const defaultConfig = { // Default values for Vertex AI. model_name: "gemini-1.5-flash-002", generation_config: [{ "stopSequences": [], "temperature": 0.7, "maxOutputTokens": 64, "topP": 0.1, "topK": 20 }], prompt: "I'm a developer who wants to learn about Firebase and you are a \ helpful assistant who knows everything there is to know about Firebase!", safety_settings: [{ "category": "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE" }], location: 'us-central1', // Disable Vertex AI Gemini API access for testing. vertex_enabled: false };تابع را ایجاد کنید و Remote Config سمت سرور را راهاندازی کنید:
// Export the function. exports.generateWithVertex = onRequest(async (request, response) => { try { // Set up Remote Config. const rc = getRemoteConfig(app); // Get the Remote Config template and assign default values. const template = await rc.getServerTemplate({ defaultConfig: defaultConfig }); // Add the template evaluation to a constant. const config = template.evaluate(); // Obtain values from Remote Config. const textModel = config.getString("model_name") || defaultConfig.model_name; const textPrompt = config.getString("prompt") || defaultConfig.prompt; const generationConfig = config.getString("generation_config") || defaultConfig.generation_config; const safetySettings = config.getString("safety_settings") || defaultConfig.safety_settings; const location = config.getString("location") || defaultConfig.location; const vertexEnabled = config.getBoolean("is_vertex_enabled") || defaultConfig.vertex_enabled;Agent Platform را راهاندازی کنید و منطق گپ و پاسخ را اضافه کنید:
// Allow user input. const userInput = request.query.prompt || ''; // Instantiate Vertex AI. const vertex_ai = new VertexAI({ project: project, location: location }); const generativeModel = vertex_ai.getGenerativeModel({ model: textModel, safety_settings: safetySettings, generation_config: generationConfig, }); // Combine prompt from Remote Config with optional user input. const chatInput = textPrompt + " " + userInput; if (!chatInput) { return res.status(400).send('Missing text prompt'); } // If vertexEnabled isn't true, do not send queries to Vertex AI. if (vertexEnabled !== true) { response.status(200).send({ message: "Vertex AI call skipped. Vertex is not enabled." }); return; } logger.log("\nRunning with model ", textModel, ", prompt: ", textPrompt, ", generationConfig: ", generationConfig, ", safetySettings: ", safetySettings, " in ", location, "\n"); const result = await generativeModel.generateContentStream(chatInput); response.writeHead(200, { 'Content-Type': 'text/plain' }); for await (const item of result.stream) { const chunk = item.candidates[0].content.parts[0].text; logger.log("Received chunk:", chunk); response.write(chunk); } response.end(); } catch (error) { logger.error(error); response.status(500).send('Internal server error'); } });فایل را ذخیره کنید و ببندید.
مرحله ۵: ایجاد الگوی Remote Config مختص سرور
سپس، الگوی Remote Config سمت سرور ایجاد کنید و پارامترها و مقادیر را برای استفاده در تابع خود پیکربندی کنید. برای ایجاد الگوی Remote Config مختص سرور:
در کنسول Firebase، به DevOps و تعامل > پیکربندی از دور بروید.
از انتخابگر کارخواه/کارساز در بالای صفحه، کارساز را انتخاب کنید.
- اگر اولینبار است که از Remote Config یا الگوهای سرور استفاده میکنید، روی ایجاد پیکربندی کلیک کنید. قاب ایجاد اولین پارامتر سمت سرور ظاهر میشود.
- اگر اولینبار نیست که از الگوهای سرور Remote Config استفاده میکنید، روی افزودن پارامتر کلیک کنید.
پارامترهای Remote Config زیر را تعریف کنید:
نام پارامتر شرح نوع مقدار پیشفرض model_nameنام مدل
برای فهرستهای بهروز نام مدل که در کدتان استفاده کنید، نسخههای مدل و چرخههای عمر یا نامهای مدل دسترسیپذیر را ببینید.تار gemini-2.0-flashpromptپیاموارهای که به ابتدای پرسمان کاربر اضافه میشود. تار I'm a developer who wants to learn about Firebase and you are a helpful assistant who knows everything there is to know about Firebase!generation_configپارامترهای ارسال به مدل JSON [{"stopSequences": ["I hope this helps"],"temperature": 0.7,"maxOutputTokens": 512, "topP": 0.1,"topK": 20}]safety_settingsتنظیمات ایمنی برای Agent Platform JSON [{"category": "HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "HarmBlockThreshold.BLOCK_LOW_AND_ABOVE"}]locationمکان اجرای سرویس و مدل Agent Platform تار globalis_vertex_enabledپارامتر اختیاری که کنترل میکند پُرسمانها به Agent Platform ارسال شوند یا نه. بولی trueوقتی افزودن پارامترها را تمام کردید، پارامترهایتان را دوبارهسنجی کنید و مطمئن شوید انواع داده آنها درست است، سپس روی انتشار تغییرات کلیک کنید.
مرحله ۶: تابع خود را مستقر کنید و آن را در Firebase Local Emulator Suite آزمایش کنید
اکنون آمادهاید تا تابع خود را با Firebase Local Emulator Suite بهصورت محلی مستقر و آزمایش کنید.
مطمئن شوید که
GOOGLE_APPLICATION_CREDENTIALSرا بهعنوان متغیر محیطی همانطور که در مرحله ۳: پیکربندی اجازههای IAM برای حساب خدماتی Admin SDK و ذخیره کردن کلید توضیح داده شده است تنظیم کرده باشید. سپس، از دایرکتوری والد دایرکتوریfunctions، تابع خود را در شبیهساز Firebase مستقر کنید:firebase emulators:start --project PROJECT_ID --only functionsصفحه گزارشهای شبیهساز را باز کنید. این باید نشان دهد که تابع شما بارگیری شده است.
با اجرای فرمان زیر به تابع خود دسترسی پیدا کنید، که در آن PROJECT_ID شناسه پروژه شما و LOCATION منطقهای است که تابع را در آن مستقر کردهاید (برای مثال،
us-central1):curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertexمنتظر پاسخ بمانید، سپس به صفحه گزارشهای «شبیهساز Firebase» یا کنسول خود برگردید و خطاها یا هشدارهای احتمالی را بررسی کنید.
چند ورودی کاربر ارسال کنید، توجه داشته باشید که چون
is_vertex_enabledدر الگوی سرور Remote Config پیکربندی شده است، این کار باید ازطریق Agent Platform Gemini API (formerly Vertex AI) به مدل Gemini دسترسی پیدا کند و این کار ممکن است هزینه داشته باشد:curl http://localhost:5001/PROJECT_ID/LOCATION/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20catsدر کنسول Firebase، تغییراتی در الگوی سرور Remote Config ایجاد کنید، سپس برای مشاهده تغییرات، دوباره به عملکردتان دسترسی پیدا کنید.
مرحله ۷: استقرار تابع در Google Cloud
پساز اینکه عملکردتان را آزمایش و درستیسنجی کردید، آماده استقرار در Google Cloud و آزمایش عملکرد زنده هستید.
استقرار تابع
بااستفاده از Firebase CLI، تابع خود را مستقر کنید:
firebase deploy --only functions
دسترسی غیرتأییدشده به تابع را مسدود کنید
وقتی توابع بااستفاده از Firebase مستقر میشوند، فراخوانیهای اصالتسنجینشده بهطور پیشفرض مجاز هستند، مگر اینکه خطمشی سازمانتان آن را محدود کند. درطول آزمایش و قبلاز ایمنسازی با App Check، توصیه میکنیم دسترسی غیرتأییدشده را مسدود کنید.
برای مسدود کردن دسترسی غیرتأییدشده به تابع:
در کنسول Google Cloud، Cloud Run را باز کنید.
روی
generateWithVertexکلیک کنید، سپس روی برگه امنیت کلیک کنید.ملزم کردن به اصالتسنجی را فعال کنید و سپس روی ذخیره کردن کلیک کنید.
حساب کاربریتان را پیکربندی کنید تا از اطلاعات اعتباری حساب خدمات Admin SDK استفاده کند
ازآنجاییکه حساب سرویس Admin SDK همه نقشها و اجازههای لازم را برای اجرای تابع و تعامل با Remote Config و Agent Platform Gemini API (formerly Vertex AI) دارد، بهتر است از آن برای اجرای تابع استفاده کنید. برای انجام این کار، باید بتوانید از حساب کاربریتان برای حساب نشان بسازید.
مراحل زیر نحوه پیکربندی حساب کاربر و تابع را برای اجرا با امتیازات حساب سرویس Admin SDK شرح میدهد.
- در کنسول Google Cloud، IAM Service Account Credentials API را فعال کنید.
- نقش سازنده کد دسترسی حساب سرویس را به حساب کاربری خود اختصاص دهید: از کنسول Google Cloud، IAM و سرپرست > IAM را باز کنید، حساب کاربری خود را انتخاب کنید، و سپس روی ویرایش مدیر > افزودن نقش دیگر کلیک کنید.
سازنده کد حساب سرویس را انتخاب کنید، سپس روی ذخیره کلیک کنید.
برای کسب اطلاعات دقیقتر درباره جعل هویت حساب سرویس، به جعل هویت حساب سرویس در مستندات Google Cloud مراجعه کنید.
صفحه کنسول Google Cloud Cloud Functions را باز کنید و روی تابع generateWithVertex در فهرست توابع کلیک کنید.
راهانداز > ویرایش را انتخاب کنید و تنظیمات زمان اجرا، ساخت، اتصالات، و امنیت را ازهم باز کنید.
از برگه زمان اجرا، حساب سرویس زمان اجرا را به حساب «کیت توسعه نرمافزار سرپرست» تغییر دهید.
روی بعدی کلیک کنید، سپس روی پیادهسازی کلیک کنید.
راهاندازی gcloud CLI
برای اجرای ایمن و آزمایش تابع از خط فرمان، باید با سرویس Cloud Functions اصالتسنجی کنید و یک رمز اصالتسنجی معتبر دریافت کنید.
برای فعال کردن تولید کد، «میانای خط فرمان gcloud» را نصب و پیکربندی کنید:
اگر ازقبل در رایانهتان نصب نشده است، gcloud CLI را همانطور که در نصب gcloud CLI توضیح داده شده است نصب کنید.
اطلاعات اعتباری دسترسی برای حساب Google Cloud خود را دریافت کنید:
gcloud auth loginشناسه پروژهتان را در gcloud تنظیم کنید:
gcloud config set project PROJECT_ID
آزمایش تابع
اکنون آمادهاید تا کارکردتان را در Google Cloud آزمایش کنید. برای آزمایش کردن تابع، فرمان زیر را اجرا کنید:
curl -X POST https://LOCATION-PROJECT_ID.cloudfunctions.net/generateWithVertex \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json"
با دادههای ارائهشده توسط کاربر دوباره امتحان کنید:
curl -X POST https://LOCATION-PROJECT_ID.cloudfunctions.net/generateWithVertex?prompt=Tell%20me%20everything%20you%20know%20about%20dogs \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json"
اکنون میتوانید در الگوی سرور Remote Config تغییراتی ایجاد کنید، آن تغییرات را منتشر کنید، و گزینههای مختلف را آزمایش کنید.
مراحل بعدی
- Firebase استفاده از App Check را برای ایمن کردن Cloud Functions توصیه میکند. برای کسب اطلاعات بیشتر درباره ایمن کردن تابع با App Check، به فعال کردن اجرای App Check برای Cloud Functions مراجعه کنید
- با Remote Config سمت سرور و App Check در با Remote Config با Agent Platform Gemini API (formerly Vertex AI) تماس بگیرید App Check، تابع فراخوان نمونهای را امتحان کنید.
- درباره Cloud Functions برای Firebase بیشتر بدانید.
- درباره استفاده از Remote Config در محیطهای سرور بیشتر بدانید.