إنشاء تطبيقات لاستخدامها في Google Chat باستخدام Gemini

1. قبل البدء

ما هي تطبيقات Google Chat التي تتضمّن Gemini؟

تتيح تطبيقات Google Chat التي تتضمّن Gemini إجراء ما يلي:

  • يمكنك دمج خدماتك ومواردك في Google Chat، ما يتيح للمستخدمين الحصول على المعلومات واتّخاذ الإجراءات بدون مغادرة المحادثة.
  • التكامل مع نموذج الذكاء الاصطناعي التوليدي Gemini، ما يتيح إنشاء البيانات أو البحث عنها، مثل النصوص أو الصور، في أوقات محدّدة لتبسيط سير العمل

لماذا يجب دمج تطبيقات Google Chat مع Gemini؟

تندرج حالات الاستخدام النموذجية لنماذج الذكاء الاصطناعي التوليدي، مثل Gemini، ضمن الفئات التالية:

  • إنشاء المحتوى وتحسينه: إنشاء نصوص تسويقية أو منشورات على وسائل التواصل الاجتماعي أو صور واقعية أو تأليف موسيقى أو المساعدة في إنشاء محتوى فيديو
  • البحث عن البيانات استخراج إحصاءات رئيسية من قاعدة معارف غير منظَّمة، أو تلخيص النصوص الطويلة، أو تصنيف المحتوى، أو ترجمة اللغات بدقة وسرعة محسّنتَين
  • المحادثة المشاركة في محادثات طبيعية وغنية بالمعلومات ومبتكرة

إنّ إمكانية دمج هذه الميزات مباشرةً في واجهة Google Chat المألوفة هي فرصة كبيرة لأي شخص يريد تحسين تجربة المستخدمين وإنتاجيتهم.

المتطلبات الأساسية

ما يمكنك إنشاؤه

في هذا الدرس العملي، ستنشئ ثلاثة تطبيقات Google Chat باستخدام Gemini لتغطية حالات الاستخدام الثلاث التي تم تقديمها في القسم السابق.

تطبيق إدارة المشاكل (إنشاء المحتوى وتحسينه)

ينفّذ هذا التطبيق ما يلي:

  • إدارة المشاكل من إنشائها إلى إغلاقها من خلال التفاعلات الأساسية وصفحة التطبيق الرئيسية والمصادقة على التطبيق
  • يراقب الرسائل ويقدّم المساعدة في ما يتعلّق بالشمولية من خلال أحداث وأدوات ملحقات.

يمكنك استخدام Gemini لإجراء ما يلي:

  • إنشاء تقارير المشاكل استنادًا إلى سجلّ الرسائل وتفاصيل المشكلة
  • تصنيف الكلمات غير الشاملة في الرسائل التي تتضمّن طلبات مشروطة

تشمل التقنيات الرئيسية المستخدَمة Vertex AI وGemini وApps Script وواجهات برمجة التطبيقات في Google Workspace (المشرف وChat و"مستندات Google" و"أحداث Google").

22efdecff4601417.png

2d127c63518673b2.png

9aea694937f2f3ed.png

يعتمد هذا التطبيق على Gemini لفهم الأسئلة والإجابة عنها باللغة الطبيعية وعرض مراجع المصادر من البيانات غير المنظَّمة.

تشمل التقنيات الرئيسية المستخدَمة وكيل متجر بيانات Dialogflow CX وربط Dialogflow CX بخدمة خارجية وGoogle Cloud Functions وGemini.

9468866bfe848bb8.png

تطبيق الملاحظات (محادثة)

يعتمد هذا التطبيق على Gemini في جمع المراجعات وتخزينها مع المحادثات باللغة الطبيعية.

تشمل التقنيات الرئيسية المستخدَمة وكيل Dialogflow CX وأداة Dialogflow CX وOpenAPI وGoogle Cloud Functions وGemini.

99a7a0295f122f31.png

ما ستتعرّف عليه

  • كيفية دمج تطبيقات Google Chat مع Gemini من خلال Vertex AI
  • كيفية دمج تطبيقات Google Chat مع وكلاء Dialogflow CX
  • كيفية استخدام أحدث ميزات Google Chat: الصفحة الرئيسية للتطبيق و"أحداث Google Chat" و"أدوات الملحقات"

المتطلبات

2. طريقة الإعداد

تهيئة الموارد

في هذا القسم، يمكنك الوصول إلى الموارد التالية وضبطها من متصفّح الويب المفضّل لديك.

مشروع "برمجة تطبيقات Google"

في وحدة تحكّم برمجة تطبيقات، اتّبِع الخطوات التالية:

  1. انقر على الإعدادات ثم فعِّل Google Apps Script API.

ea06c593b347b9d1.png

  1. اختَر مشروعك.
  2. انقر على إعدادات المشروع.
  3. ضَع علامة في مربّع الاختيار عرض ملف البيان "appsscript.json" في المحرّر.
  4. أعِد تسمية المشروع إلى Chat Apps Gemini.

12c1485bd248b766.png

مشروع على السحابة الإلكترونية من Google Cloud

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. اختَر مشروعك.
  2. انقر على القائمة ☰ > واجهات برمجة التطبيقات والخدمات > شاشة طلب الموافقة المتعلّقة ببروتوكول OAuth > تعديل التطبيق، ثم اضبط اسم التطبيق على Chat Apps Gemini.

.

  1. انتقِل إلى إعدادات Google Chat API، ثم اضبط اسم التطبيق والوصف على Chat Apps Gemini.

a71f040755da3b8b.png

Google Chat

في Google Chat، اتّبِع الخطوات التالية:

  1. إذا لزم الأمر، ابدأ محادثة باستخدام تطبيق Google Chat.
  2. أرسِل رسالة، مثل Hello، للتأكّد من أنّها تعمل.

9625418251528ae9.png

تنزيل رمز المصدر والموارد على الجهاز

  1. نزِّل مستودع GitHub هذا.

  1. في بيئة التطوير المفضّلة لديك، افتح الدليل apps-script، ثم انتقِل إلى الدليل نفسه في الوحدة الطرفية.

da9478df97c99194.png

تثبيت clasp وإعداده

نستخدم clasp لتعديل نُسخ رمز المصدر ونقلها بسهولة من البيئة المحلية إلى مشروع "برمجة تطبيقات Google".

  1. في بيئتك المحلية، ثبِّت أحدث إصدارات node وnpm وclasp.
npm install -g @google/clasp
  1. سجِّل الدخول باستخدام حسابك:
clasp login

8bc2434e6dc6f22a.png

في حال نجاح العملية، ستظهر لك شاشة تأكيد أساسية في متصفّح الويب وسيتم تعديل ملف .clasprc.json الذي يتضمّن بيانات اعتماد العميل. يمكنك العثور على مكانه في الجهاز.

e1d833eb4d5b3a8f.png

3- التطبيق 1: الإنشاء

مراجعة المفاهيم

Vertex AI

توفّر منصة Vertex AI كل ما تحتاج إليه لإنشاء الذكاء الاصطناعي التوليدي واستخدامه، بما في ذلك حلول الذكاء الاصطناعي وأداة إنشاء الوكلاء وأكثر من 130 نموذجًا أساسيًا ومنصة موحّدة للذكاء الاصطناعي.

c9e9c7a1945b22ac.png

Gemini

‫Gemini هو نموذج لغوي كبير متعدد الوسائط من Google يمكن الوصول إليه من خلال Vertex AI. فهو يساعد الأشخاص على الاستفادة من إمكاناتهم إلى أقصى حد، ما يتيح لهم توسيع آفاق مخيلتهم وإثارة فضولهم وتعزيز إنتاجيتهم.

خدمة Chat المتقدّمة

تتيح لك خدمة Advanced Chat استخدام واجهة برمجة تطبيقات Google Chat في "برمجة تطبيقات Google". يتيح ذلك للبرامج النصية العثور على مساحات Chat وإنشائها وتعديلها، وإضافة أعضاء إلى المساحات أو إزالتهم منها، وقراءة الرسائل أو نشرها مع النصوص والبطاقات والمرفقات والتفاعلات.

بنية المراجعات

8c9c7b7328a69ea6.png

تم إنشاء تطبيق Google Chat هذا باستخدام "برمجة تطبيقات Google". تعمل هذه الميزة على النحو التالي:

  1. يرسل المستخدم رسالة إلى التطبيق، إما في رسالة مباشرة أو في مساحة.
  2. يعالج التطبيق الرسالة، وهو تطبيق تم تنفيذه في مشروع "برمجة تطبيقات Google" ومرتبط بمشروع على السحابة الإلكترونية من Google.
  3. يتكامل التطبيق مع واجهات برمجة التطبيقات في "مستندات Google" وGoogle Chat.
  4. يستخدم التطبيق خدمة المواقع لتخزين البيانات في مواقع النص البرمجي.
  5. يرسل التطبيق ردًا متزامنًا، إما في رسالة مباشرة أو في المساحة الأصلية.

مراجعة خطوات المستخدم

إنشاء مشكلة

7ca0e8ba3c8255bb.png

تحديد المشكلة وحلّها من المساحة المخصّصة

51b47714c378a24b.png

إغلاق المشكلة من المساحة المخصّصة

89e50228deeab0f9.png

مراجعة رمز المصدر

يحتوي مشروع "برمجة تطبيقات Google" على البرامج النصية التالية:

  • Configuration: ثوابت يمكن تعديلها استنادًا إلى البيئة.
  • ChatApp: تعالج أحداث التفاعل في Google Chat، بما في ذلك الرسائل والنقرات على البطاقات وأوامر الشرطة المائلة ومربّعات الحوار.
  • Storage: دوال مساعدة تعتمد على "خدمات الخصائص".
  • ChatAppAuth: دوال خدمية تعتمد على مصادقة تطبيق محادثات Google.
  • Docs: دوال مساعدة تعتمد على "مستندات Google".
  • VertexAi: دوال مساعدة تعتمد على Vertex AI.

في ما يلي الأجزاء التي يتم استخدامها بشكل نشط عند إنشاء مستندات التقارير باستخدام Gemini وسجلّات مساحات الدردشة:

appsscript.json

// Enables the Admin SDK Directory and Chat services, which you need to retrieve
// messages and usernames.

"enabledAdvancedServices": [
  ...
  {
    "userSymbol": "AdminDirectory",
    "version": "directory_v1",
    "serviceId": "admin"
  },
  {
    "userSymbol": "Chat",
    "version": "v1",
    "serviceId": "chat"
  }
  ...
]
// Includes the OAuth scopes to request the Admin SDK Directory, Google Chat,
// Google Docs, and Vertex AI APIs.

"oauthScopes": [
  ...
  "https://www.googleapis.com/auth/admin.directory.user.readonly",
  "https://www.googleapis.com/auth/chat.messages.readonly",
  "https://www.googleapis.com/auth/documents",
  "https://www.googleapis.com/auth/cloud-platform",
  ...
]

Configuration.js

// Relies on two constants: the first one is the Google Cloud project ID and the
// second one is the Vertex AI location to be used.

...
const PROJECT_ID = 'replace-with-gcp-project-id';
const VERTEX_AI_LOCATION_ID = 'us-central1';
...

ChatApp.js

// The slash command process function retrieves history, generates content, and passes
// it to the report generator.

function processSlashCommand(event) {
  ...
  if (event.message.slashCommand.commandId == CLOSE_COMMAND_ID
    && event.message.space.type !== "DM") {
    ...
    const history = exportSpaceHistory(spaceId);
    const summary = summarizeSpace(history);
    const docUrl = createReport(
      issue.title, issue.description, resolution, history, summary
    );
    ...
  }
  ...
}
/**
 * Fetches and concatenates the 100 first space messages by using the Google Chat API.
 *
 * Messages with slash commands are filtered (app command invocations).
 *
 * @return {string} concatenate space messages in the format "Sender's name: Message"
 */
function exportSpaceHistory(spaceName) {
  const messages = Chat.Spaces.Messages.list(spaceName, { 'pageSize': 100 }).messages;
  // Returns results after fetching message sender display names.
  let users = new Map();
  return messages
    .filter(message => message.slashCommand === undefined)
    .map(message =>
      `${getUserDisplayName(users, message.sender.name)}: ${message.text}`
    ).join('\n');
}
/**
 * Fetches a user's display name by using the Admin Directory API.
 *
 * A cache is used to only call the API once per user.
 *
 * @param {Map} cache the map containing users previously fetched
 * @param {string} userId the user ID to fetch
 * @return {string} the user's display name
 */
function getUserDisplayName(cache, userId) {
  if (cache.has(userId)) {
    return cache.get(userId);
  }
  let displayName = 'Unknown User';
  try {
    const user = AdminDirectory.Users.get(
      userId.replace("users/", ""),
      { projection: 'BASIC', viewType: 'domain_public' });
    displayName = user.name.displayName ? user.name.displayName : user.name.fullName;
  } catch (e) {
    // Ignores errors, uses 'Unknown User' by default.
  }
  cache.set(userId, displayName);
  return displayName;
}

VertexAi.js

/**
 * Summarizes a Google Chat space history with the Gemini Pro model using
 * Vertex AI API.
 *
 * @param {string} history the history
 * @return {string} the summary
 */
function summarizeSpace(history) {
  const url = `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1`
    + `/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}`
    + "/publishers/google/models/gemini-1.0-pro:generateContent";
  const options = {
    method: "POST",
    headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
    contentType: "application/json",
    payload: JSON.stringify({
      contents: {
        role: "user",
        parts: {
          text: "Summarize the following conversation between engineers resolving"
              + " an issue in a few sentences.\n\n" + history
        }
      },
      safetySettings: {
        category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        threshold: "BLOCK_LOW_AND_ABOVE"
      },
      generationConfig: {
        temperature: 0.2,
        topP: 0.8,
        topK: 40
      }
    })
  };

  return JSON.parse(UrlFetchApp.fetch(url, options).getContentText())
    .candidates[0].content.parts[0].text;
}

Docs.js

// The report generator function adds two sections: the first one is for the summary and the second one is for history.
function createReport(..., history, summary) {
  ...
  body.appendParagraph("Summary").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(summary);
  body.appendParagraph("History").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(history);
  ...
}

تعديل مشروع على السحابة الإلكترونية من Google Cloud

تفعيل واجهات برمجة التطبيقات

  1. في وحدة تحكّم Google Cloud، فعِّل واجهات برمجة التطبيقات مستندات Google وGoogle Admin SDK وVertex AI:

  1. انقر على القائمة ☰ > واجهات برمجة التطبيقات والخدمات > واجهات برمجة التطبيقات والخدمات المفعَّلة، ثم تأكَّد من تفعيل واجهات برمجة التطبيقات.

.

بدء حساب الخدمة

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > إدارة الهوية وإمكانية الوصول والمشرف > حسابات الخدمة > + إنشاء حساب خدمة.

74cf57426419f39.png

  1. اضبط اسم حساب الخدمة على chat-app.
  2. اضبط وصف حساب الخدمة على Chat app auth.
  3. انقر على إنشاء ومتابعة.
  4. انقر على تم. ستتم إعادة توجيهك إلى صفحة حسابات الخدمة ويمكنك الاطّلاع على حساب الخدمة الذي أنشأته.

ca0468f1f93990f9.png

  1. اختَر حساب الخدمة الذي تم إنشاؤه حديثًا.
  2. انقر على علامة التبويب المفاتيح.
  3. انقر على إضافة مفتاح.
  4. انقر على إنشاء مفتاح جديد.
  5. اختَر JSON.
  6. انقر على إنشاء.

9f7e6ea020978ab0.png

يتم إغلاق مربّع الحوار ويتم تلقائيًا تنزيل زوج المفتاح العام/الخاص الذي تم إنشاؤه حديثًا إلى بيئتك المحلية كملف JSON. يمكنك استخدام محتواه لاحقًا عند تعديل رمز المصدر لمشروعك في "برمجة التطبيقات".

تعديل إعدادات Google Chat API

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. إضافة أمر يبدأ بشرطة مائلة
  2. اضبط الاسم على /create.
  3. اضبط معرّف الأمر على 1.
  4. اضبط الوصف على Create a new issue.
  5. ضَع علامة في مربّع الاختيار يفتح مربّع حوار.
  6. أضِف أمرًا آخر يبدأ بشرطة مائلة.
  7. اضبط الاسم على /close.
  8. اضبط معرّف الأمر على 2.
  9. اضبط الوصف على Close an issue.
  10. انقر على حفظ.

bee2e7b63659ab33.png

تعديل مشروع "برمجة تطبيقات Google"

  • غيِّر الدليل الحالي في وحدة التحكّم المحلية إلى issue-management/1-baseline. يحتوي على رمز المصدر. قبل إرسال رمز المصدر إلى مشروعك في "برمجة التطبيقات"، عليك ضبط بعض الإعدادات.

إعداد رمز المصدر

  1. اضبط قيمة ثابتة JSON باسم CHAT_CREDENTIALS في الملف Configuration.js على محتوى ملف المفتاح الخاص الذي نزّلته سابقًا.

d721f6bff73c5304.png

  1. في Google Cloud Console، انقر على القائمة ☰ > المشرف وإدارة الهوية وإمكانية الوصول > الإعدادات.

  1. انسخ رقم تعريف المشروع.

82592fa0bd113469.png

  1. اضبط السلسلة الثابتة المسماة PROJECT_ID في الملف Configuration.js على رقم تعريف المشروع.

383cee561130ceba.png

ضبط clasp الإعدادات

لإعداد clasp لدفع رمز المصدر إلى مشروع "برمجة تطبيقات Google" الصحيح، اتّبِع الخطوات التالية:

  1. في وحدة تحكّم "برمجة تطبيقات Google"، اختَر مشروعك.
  2. اختَر إعدادات المشروع (Project Settings).
  3. ضمن معرّفات، انقر على نسخ.

20ea033b6de882c6.png

  1. في الدليل الحالي، أنشِئ ملف .clasp.json.
  2. استبدِل <your-script-id> بالمعرّف الذي تم نسخه.
  3. انسخ النتيجة إلى الملف .clasp.json.
  4. احفظ ملف .clasp.json.
{
  "scriptId": "<your-script-id>"
}

إرسال رمز المصدر

  • نفِّذ الأمر التالي:
$clasp push
? Manifest file has been updated. Do you want to push and overwrite? Yes
└─ appsscript.json
└─ ChatApp.js
└─ ChatAppAuth.js
└─ Configuration.js
└─ Docs.js
└─ Storage.js
└─ VertexAi.js
Pushed 7 files.

جرِّب هذه الميزة

  1. في Google Chat، أرسِل Hello! في رسالة مباشرة إلى التطبيق. لن يردّ التطبيق، ولكن ستظهر رسالة تطلب منك ضبط الإعدادات.

4c1fc68121dcffed.png

  1. انقر على ضبط.
  2. اختَر حسابك على Google.
  3. نفّذ عملية المصادقة.
  4. راجِع إذن الوصول إلى التطبيق وامنحه.

4a2fd7ac5918bf1a.png

في حال نجاح العملية، ستظهر لك شاشة تأكيد أساسية على صفحة الويب وردّ فعلي من التطبيق على رسالتك الأصلية.

acb9065568fe47d2.png

2d6ef9c62f47e082.png

  1. أرسِل رسالة مباشرة أخرى إلى التطبيق، ولكن باستخدام الأمر الذي يبدأ بشرطة مائلة /create.

be3f3c6eb0f929c1.png

  1. في مربّع الحوار، اضبط العنوان على Issue Title 1.
  2. اضبط الوصف على المشكلة Description 1.
  3. انقر على إنشاء.

22efdecff4601417.png

ينفّذ التطبيق ما يلي:

  1. يُستخدَم لإغلاق مربّع الحوار.
  2. ينشئ مساحة مخصّصة للمشكلة التي تم إنشاؤها حديثًا بالعنوان نفسه.
  3. الانضمام إلى المساحة التي تم إنشاؤها حديثًا
  4. يتم إرسال رسالة تحتوي على وصف للمشكلة في المساحة التي تم إنشاؤها حديثًا.
  5. يرسل إليك رسالة مباشرة تتضمّن رابطًا إلى المساحة التي تم إنشاؤها حديثًا.

3253cec2392e281f.png

  1. في المساحة التي تم إنشاؤها حديثًا، أرسِل رسالة تتضمّن الأمر الذي يبدأ بشرطة مائلة /close والقرار، مثل Not reproducible.

132cc4acfc10b98c.png

ينفّذ التطبيق ما يلي:

  1. ينشئ مستند تقرير في "مستندات Google".
  2. إرسال رسالة إلى المساحة المخصّصة للمشكلة مع رابط إلى مستند التقرير الذي تم إنشاؤه حديثًا

2d127c63518673b2.png

  1. افتح مستند التقرير. ويحتوي على معلومات أساسية وسجلّ وملخّص.

9aea694937f2f3ed.png

4. اختياري: التطبيق 1: إضافة صفحة التطبيق الرئيسية

مراجعة المفاهيم

الصفحة الرئيسية للتطبيق هي رسالة بطاقة قابلة للتخصيص يرسلها تطبيق محادثات إلى المستخدم عندما يصل إلى علامة التبويب الصفحة الرئيسية من رسالة مباشرة مع تطبيق محادثات. ويتم استخدامها عادةً لعرض مستندات التطبيق أو نظرة عامة. من الناحية الفنية، هناك حدث مخصّص للتعامل مع هذه الرسائل، وهو يستند إلى المبادئ الأساسية نفسها التي تستند إليها رسائل البطاقات.

65f56f70f67a32e4.png

مراجعة خطوات المستخدم

إدارة المشاكل

10663f5fc107fb3f.png

مراجعة رمز المصدر

يجب تعديل مشروع "برمجة تطبيقات Google".

ChatApp.js

/**
 * Handles app home requests in Google Chat.
 * 
 * Displays the latest status of all issues.
 */
function onAppHome() {
  // Generates one card section per issue.
  var sections = [];
  for (var issueKey in appProperties.getProperties()) {
    const issue = JSON.parse(appProperties.getProperty(issueKey));
    if (issue.spaceId) {
      sections.push({
        header: `${issue.status} - ${issue.title}`,
        widgets: [{ textParagraph: {
            text: `Description: ${issue.description}`
          }}, { textParagraph: {
            text: `Resolution: ${issue.resolution}`
          }}, { buttonList: { buttons: [{
              text: "Open space",
              onClick: { openLink: {
                url: `https://mail.google.com/mail/u/0/#chat/space/${issue.spaceId}`
              }}
            }, {
              text: "Open report",
              onClick: { openLink: {
                url: issue.reportUrl !== "" ? issue.reportUrl : "docs.new"
              }},
              disabled: issue.reportUrl === ""
          }]}
        }]
      });
    }
  }

  return { action: { navigations: [{ push_card: {
    sections: sections
  }}]}};
}

تعديل مشروع على السحابة الإلكترونية من Google Cloud

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. ضِمن قسم الميزات التفاعلية، ضَع علامة في مربّع الاختيار تفعيل ميزة "تطبيق الشاشة الرئيسية".

97159c1c69ca8303.png

في بيئتك المحلية، اتّبِع الخطوات التالية:

  1. غيِّر الدليل الحالي في نافذة الأوامر إلى issue-management/2-app-home. يحتوي على الرمز المصدر الذي عليك استخدامه.
  2. انسخ ملف issue-management/1-baseline/.clasp.json إلى الدليل الحالي.
  3. انسخ ملف issue-management/1-baseline/Configuration.js إلى الدليل الحالي ليحلّ محل الملف الحالي.
  4. نفِّذ الأمر التالي:
clasp push

جرِّبه

في Google Chat، اتّبِع الخطوات التالية:

  1. أرسِل رسالة مباشرة تتضمّن الأمر الذي يبدأ بشرطة مائلة /create إلى التطبيق. سيفتح التطبيق مربّع حوار.
  2. اضبط العنوان على Issue Title 2.
  3. اضبط الوصف على المشكلة Description 2.
  4. انقر على إنشاء.

3b2a8690e758f965.png

  1. انقر على علامة التبويب الصفحة الرئيسية من مساحتك باستخدام تطبيق Google Chat. يمكنك الاطّلاع على تفاصيل المشاكل التي أنشأتها.

ed8e32da0e6f2ac6.png

5- اختياري: التطبيق 1: إضافة ميزة مراقبة المساحة

مراجعة المفاهيم

Pub/Sub

Pub/Sub هي خدمة مراسلة غير متزامنة وقابلة للتوسيع تفصل الخدمات التي تنتج الرسائل عن الخدمات التي تعالجها. تتيح لك خدمة Pub/Sub إنشاء أنظمة تضم منتجي ومستهلكي الأحداث، يُسمى ذلك بالناشرين ومشتركين. يتواصل الناشرون مع المشتركين بشكل غير متزامن عن طريق بث الأحداث، بدلاً من إجراء مكالمات الإجراءات عن بُعد المتزامنة (RPC).

يرسل الناشرون الأحداث إلى خدمة Pub/Sub بدون الاهتمام بكيفية معالجة هذه الأحداث أو وقت معالجتها. وبعد ذلك، توفّر خدمة Pub/Sub الأحداث إلى جميع الخدمات التي تتفاعل معها. في الأنظمة التي تتواصل من خلال استدعاء الإجراءات عن بُعد، يجب أن ينتظر الناشرون المشتركين لتلقّي البيانات. ومع ذلك، فإنّ الدمج غير المتزامن في Pub/Sub يزيد من مرونة النظام العام وقوته.

الموضوع: مورد مسمّى يمثّل خلاصة للرسائل. يجب إنشاء موضوع قبل أن تتمكّن من نشره أو الاشتراك فيه.

الاشتراك: لتلقّي الرسائل المنشورة في موضوع معيّن، يجب إنشاء اشتراك في هذا الموضوع. يتلقّى تطبيق المشترك الرسائل المنشورة في الموضوع ويعالجها. يمكن أن يتضمّن الموضوع اشتراكات متعددة، ولكن ينتمي الاشتراك المحدّد إلى موضوع واحد.

أحداث Google Workspace

تمثّل أحداث Google Workspace التغييرات التي تطرأ على مراجع Google Workspace، مثل إنشاء المراجع أو تعديلها أو حذفها. يمكن للتطبيقات الاشتراك في مراجع Google Workspace لتلقّي الأحداث ذات الصلة ومعالجتها بشكل غير متزامن.

7816e477b112bfb6.png

في ما يلي كيفية إرسال "واجهة برمجة تطبيقات أحداث Google Workspace" للأحداث إلى تطبيق من خلال اشتراك:

  1. يشترك التطبيق في مورد في أحد تطبيقات Google Workspace، مثل مساحة.
  2. تتغيّر الموارد التي اشترك فيها التطبيق.
  3. يرسل تطبيق Google Workspace حدثًا إلى موضوع في Pub/Sub، والذي يعمل كنقطة نهاية للإشعارات الخاصة باشتراك Google Workspace للتطبيق. يحتوي الحدث على بيانات حول التغييرات التي تم إجراؤها على المورد.
  4. يعالج التطبيق رسالة Pub/Sub التي تحتوي على الحدث، ويتخذ الإجراء اللازم إذا لزم الأمر.

مراجعة خطوات المستخدم

إنشاء مشكلة (تعديل)

6d7a9d7a68666a80.png

تحديد المشكلة وحلّها من المساحة المخصّصة (تعديل)

17e60f052f222456.png

إغلاق المشكلة من المساحة المخصّصة (تعديل)

742d490ea0b6fe3a.png

معالجة الاشتراكات

de3017100dec6401.png

مراجعة رمز المصدر

يجب تعديل مشروع "برمجة تطبيقات Google".

appsscript.json

// Enables the Workspace Events service.

"enabledAdvancedServices": [
  ...
  {
    "userSymbol": "WorkspaceEvents",
    "version": "v1",
    "serviceId": "workspaceevents"
  }
  ...
]

Configuration.js

// Adds two constants: the first one is the Pub/Sub topic ID and the second one
// is the Pub/Sub subscription ID to be used to retrieve Google Workspace events.

...
const GWS_PUBSUB_TOPIC_ID = `projects/${PROJECT_ID}/topics/workspace-events`;
const GWS_PUBSUB_SUBSCRIPTION_ID =
  `projects/${PROJECT_ID}/subscriptions/workspace-events-sub`;
...

ChatApp.js

// Edits the function to delete the subscription at issue closure.

function processSlashCommand(event) {
  ...
  if (event.message.slashCommand.commandId == CLOSE_COMMAND_ID
    && event.message.space.type !== "DM") {
    ...
    deleteSubscription(issue.subscriptionId);
    ...
  }
  ...
}
// Edits the function to create the subscription.

function createIssue(event) {
  ...
  const subscriptionId = createSpaceSubscription(spaceUrl);
  const createdIssue = saveCreatedIssue(..., subscriptionId);
  ...
}
// Edits the function to delete the subscription.

function onRemoveFromSpace(event) {
  ...
  deleteSubscription(issue.subscriptionId);
  ...
}

Storage.js

// Edits the function to keep track of the subscription ID.

function saveCreatedIssue(..., spaceId, subscriptionId) {
  ...
  appProperties.setProperty(spaceId, JSON.stringify({
    ...
    subscriptionId: subscriptionId,
    ...
  }));
  ...
}

WorkspaceEvent.js

/**
 * Creates a new subscription to Google Workspace Events associated to a
 * Google Chat space.
 * 
 * The subscription scope includes message creation events and resources.
 * 
 * @param {string} spaceId the space ID to create a subscription for
 * @return the ID of the newly created subscription
 */
function createSpaceSubscription(spaceId) {
  const operation = WorkspaceEvents.Subscriptions.create({
    targetResource: `//chat.googleapis.com/${spaceId}`,
    eventTypes: ["google.workspace.chat.message.v1.created"],
    notificationEndpoint: { pubsubTopic: GWS_PUBSUB_TOPIC_ID },
    payloadOptions: { includeResource: true },
  });

  return operation.response.name;
}
/**
 * Processes events from subscription by using the Google Cloud PubSub API.
 * 
 * It pulls and acknowledges each event.
 */
function processSubscription() {
  const response = UrlFetchApp.fetch(
    `https://pubsub.googleapis.com/v1/${GWS_PUBSUB_SUBSCRIPTION_ID}:pull`,
    {
      method: "POST",
      contentType: "application/json",
      headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
      payload: JSON.stringify({ maxMessages: 10 })
    }
  );

  const messages = JSON.parse(response.getContentText()).receivedMessages;
  for (var messageIndex in messages) {
    const message = messages[messageIndex];
    const ceType = message.message.attributes["ce-type"];
    const dataStr = Utilities.newBlob(Utilities.base64Decode(message.message.data))
      .getDataAsString();
    if (ceType === "google.workspace.events.subscription.v1.expirationReminder") {
      // Renews subscription.
      renewSubscription(JSON.parse(dataStr).subscription.name);
    } else if (ceType === "google.workspace.chat.message.v1.created") {
      // Processes the message text when it's sent in a space.
      const chatMessage = JSON.parse(dataStr).message;
      if (chatMessage.sender.type !== "BOT") {
        console.log("Message was processed.");
      }
    }
    // Acknowledges successful processing to avoid getting it again next time.
    ackSubscription(message.ackId);
  }
}
/**
 * Acknowledges a subscription event by using the Google Cloud PubSub API.
 * 
 * @param {string} ackId the ID of the event acknowledgment to send
 */
function ackSubscription(ackId) {
  UrlFetchApp.fetch(
    `https://pubsub.googleapis.com/v1/${GWS_PUBSUB_SUBSCRIPTION_ID}:acknowledge`,
    {
      method: "POST",
      contentType: "application/json",
      headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
      payload: JSON.stringify({
        ackIds: [ackId]
      })
    }
  );
}
/**
 * Renews a subscription to Google Workspace Events.
 * 
 * The default time to live option is used.
 * 
 * @param {string} subscriptionId the ID of the subscription to renew
 */
function renewSubscription(subscriptionId) {
  WorkspaceEvents.Subscriptions.patch({ttl: '0s'}, subscriptionId);
}
/**
 * Deletes a subscription to Google Workspace Events.
 * 
 * @param {string} subscriptionId the ID of the subscription to delete
 */
function deleteSubscription(subscriptionId) {
  WorkspaceEvents.Subscriptions.remove(subscriptionId);
}

تعديل مشروع على السحابة الإلكترونية من Google Cloud

تفعيل واجهات برمجة التطبيقات

  1. في Google Cloud Console، فعِّل "أحداث Google Workspace" وPubSub.

  1. انقر على القائمة ☰ > واجهات برمجة التطبيقات والخدمات > واجهات برمجة التطبيقات والخدمات المفعَّلة، ثم تأكَّد من تفعيل كليهما.

.

بدء الاشتراك

عليك إنشاء موضوع Pub/Sub والاشتراك فيه ليتم نشر جميع أحداث مساحة العمل.

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انتقِل إلى القائمة ☰ > Pub/Sub > المواضيع.

  1. انقر على إنشاء موضوع.
  2. اضبط رقم تعريف الموضوع على workspace-events.
  3. ضَع علامة في مربّع الاختيار إضافة اشتراك تلقائي.
  4. انقر على إنشاء.

b39f9a0aec7c9939.png

لمنح الإذن بنشر رسائل Pub/Sub إلى الموضوع الذي أنشأته حديثًا من Google Chat، اتّبِع الخطوات التالية:

  1. اختَر الموضوع من القائمة.
  2. انقر على علامة التبويب الأذونات.
  3. أضِف chat-api-push@system.gserviceaccount.com إلى الجهات الرئيسية الجديدة.
  4. اختَر ناشر Pub/Sub في الدور.
  5. انقر على حفظ.

8d4016c37532503.png

تعديل مشروع "برمجة تطبيقات Google"

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انتقِل إلى القائمة ☰ > إدارة الهوية وإمكانية الوصول (IAM) & المشرف > الإعدادات.

  1. انسخ رقم تعريف المشروع.

82592fa0bd113469.png

في بيئتك المحلية، اتّبِع الخطوات التالية:

  1. غيِّر الدليل الحالي في نافذة الأوامر إلى issue-management/3-message-monitoring. يحتوي على رمز المصدر الذي تحتاج إليه.
  2. اضبط السلسلة الثابتة المسماة PROJECT_ID في الملف Configuration.js على رقم تعريف المشروع الذي تم نسخه.
  3. اضبط الثابت JSON المسمّى CHAT_CREDENTIALS في الملف Configuration.js على محتوى ملف المفتاح الخاص الذي نزّلته سابقًا.
  4. انسخ ملف issue-management/2-app-home/.clasp.json إلى الدليل الحالي.
  5. نفِّذ الأمر التالي:
clasp push

جرِّبه

في Google Chat، اتّبِع الخطوات التالية:

  1. أرسِل رسالة مباشرة تتضمّن الأمر الذي يبدأ بشرطة مائلة /create إلى التطبيق. سيفتح التطبيق مربّع حوار.
  2. اضبط العنوان على Issue Title 3.
  3. اضبط الوصف على المشكلة Description 3.
  4. انقر على إنشاء.
  5. في المساحة التي تم إنشاؤها حديثًا، أرسِل بضع رسائل تناقش المشكلة.
  6. أرسِل رسالة باستخدام أمر يبدأ بشرطة مائلة /close والدقة المطلوبة، مثل Fixed.

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انتقِل إلى القائمة ☰ > Pub/Sub > الاشتراكات.

  1. اختَر اشتراك workspace-events-sub.
  2. انقر على علامة التبويب الرسائل.
  3. انقر على سحب. يعرض الجدول الرسائل ذات الصلة بالمحتوى الذي أرسلته إلى المساحة التي تم إنشاؤها حديثًا.

82631c9792d83889.png

في وحدة تحكّم برمجة تطبيقات، اتّبِع الخطوات التالية:

  1. اختَر مشروعك.
  2. انقر على أداة التعديل.
  3. اختَر ملف WorkspaceEvent.gs.
  4. انقر على processSubscription في قسم التشغيل.
  5. انقر على Run.يمكنك الاطّلاع من سجلّ التنفيذ على أنّه تمت معالجة الرسائل.

c612e8fa2bd0a163.png

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انتقِل إلى القائمة ☰ > Pub/Sub > الاشتراكات.

  1. اختَر اشتراك workspace-events-sub.
  2. انقر على علامة التبويب الرسائل.
  3. انقر على سحب. لم يعُد الجدول يعرض الرسائل ذات الصلة بما أرسلته إلى المساحة التي تم إنشاؤها حديثًا.

e185454cac862a7b.png

  • في Google Chat، في المساحة المخصّصة للمشكلة الثالثة التي أنشأتها باستخدام أمر يبدأ بشرطة مائلة /create، أرسِل بضع رسائل أخرى تناقش المشكلة.

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انتقِل إلى القائمة ☰ > Pub/Sub > الاشتراكات.

  1. اختَر اشتراك workspace-events-sub.
  2. انقر على علامة التبويب الرسائل.
  3. انقر على سحب. لا يعرض الجدول الرسائل ذات الصلة بما أرسلته إلى المساحة التي تم إنشاؤها حديثًا.

6. اختياري: التطبيق 1: إضافة مساعدة بشأن الشمولية

مراجعة المفاهيم

تلقين الذكاء الاصطناعي التوليدي هو فنّ تصميم التعليمات أو الأسئلة لتوجيه نموذج الذكاء الاصطناعي التوليدي نحو نوع محدّد من النتائج المطلوبة. من الممارسات الشائعة حصر الإجابات من خلال إضافة قواعد وشروط في الطلبات. يمكن أن يساعد ذلك في جعل الناتج آمنًا وملائمًا ومتسقًا ومتوافقًا مع التوقعات.

مراجعة خطوات المستخدم

معالجة الاشتراكات (تعديل)

780d0802f77dd180.png

مراجعة رمز المصدر

يجب تعديل مشروع "برمجة تطبيقات Google".

WorkspaceEvent.js

// Edits the function to replace logging by an actual card message.

function processSubscription() {
  ...
  for (var messageIndex in messages) {
    ...
    } else if (ceType === "google.workspace.chat.message.v1.created") {
      ...
      const inclusivityCheck = getInclusivityFeedback(chatMessage.text);
      if (inclusivityCheck !== "It's inclusive!") {
        createAppMessageUsingChatService({
          cardsV2: [{ cardId: "1", card: { header: {
              title: "Inclusivity",
              subtitle: `The following words are not inclusive: ${inclusivityCheck}`
          }}}]
        },
        chatMessage.space.name);
      }
      ...
    }
    ...
  }
  ...
}

VertexAi.js

/**
 * Gets feedback on inclusivity for a text with the Gemini Pro model using
 * Vertex AI API.
 * 
 * Returns "It's inclusive!" when it is otherwise a list of word(s) that might not
 * be optimal.
 *
 * @param {string} text the text
 * @return {string} the feedback
 */
function getInclusivityFeedback(text) {
  const url = `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1`
    + `/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}`
    + "/publishers/google/models/gemini-1.0-pro:generateContent";
  const options =  {
    method: "POST",
    headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
    contentType: "application/json",
    payload: JSON.stringify({
      contents: {
        role: "user",
        parts: {
          text: "Are there any words that obviously go against inclusivity "
            + "in this text:"
            + `\n\n----------\n${text}\n----------\n\n`
            + "If there are not, answer \"It's inclusive!\" "
            + "otherwise answer by listing them separated by commas. "
            + "Do not answer with any explanation."
        }
      },
      safetySettings: {
        category: "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        threshold: "BLOCK_LOW_AND_ABOVE"
      },
      generationConfig: {
        temperature: 0.2,
        topP: 0.8,
        topK: 40
      }
    })
  };

  return JSON.parse(UrlFetchApp.fetch(url, options).getContentText())
    .candidates[0].content.parts[0].text;
}

تعديل مشروع "برمجة تطبيقات Google"

في بيئتك المحلية، اتّبِع الخطوات التالية:

  1. غيِّر الدليل الحالي في نافذة الأوامر إلى issue-management/4-inclusivity-help. يحتوي على رمز المصدر الذي تحتاجه.
  2. انسخ ملف issue-management/3-message-monitoring/.clasp.json إلى الدليل الحالي.
  3. انسخ ملف issue-management/3-message-monitoring/Configuration.js إلى الدليل الحالي ليحلّ محل الملف الحالي.
  4. نفِّذ الأمر التالي:
clasp push

جرِّبه

في Google Chat، اتّبِع الخطوات التالية:

  1. أرسِل رسالة مباشرة تتضمّن الأمر الذي يبدأ بشرطة مائلة /create إلى التطبيق. سيفتح التطبيق مربّع حوار.
  2. اضبط العنوان على Issue Title 4.
  3. اضبط الوصف على المشكلة Description 4.
  4. انقر على إنشاء.
  5. في المساحة التي تم إنشاؤها حديثًا، أرسِل It happened to me last week as well.

في وحدة تحكّم برمجة تطبيقات، اتّبِع الخطوات التالية:

  1. اختَر مشروعك.
  2. انقر على أداة التعديل.
  3. اختَر ملف WorkspaceEvent.gs.
  4. انقر على processSubscription في قسم التشغيل.
  5. انقر على تشغيل. يمكنك الاطّلاع من سجلّ التنفيذ على أنّه تمت معالجة الرسائل.

في Google Chat، اتّبِع الخطوات التالية:

  1. لاحظ أنّ التطبيق لم يرسل أي مساعدة بشأن الشمولية في المساحة التي تم إنشاؤها حديثًا.
  2. في المساحة التي تم إنشاؤها حديثًا، أرسِل الرسالة I had to add myself from the master to fix it.

في وحدة تحكّم برمجة تطبيقات، اتّبِع الخطوات التالية:

  1. اختَر مشروعك.
  2. انقر على أداة التعديل.
  3. اختَر ملف WorkspaceEvent.gs.
  4. انقر على processSubscription في قسم التشغيل.
  5. انقر على تشغيل. يمكنك الاطّلاع من سجلّ التنفيذ على أنّه تمت معالجة الرسائل. في Google Chat، أرسل التطبيق رسالة مساعدة بشأن التضمين في المساحة التي تم إنشاؤها حديثًا.

7936342847acbe2d.png

7. اختياري: التطبيق 1: إضافة الإعدادات المفضّلة

.

مراجعة المفاهيم

التطبيق المصغّر الخاص بالملحقات هو تطبيق مصغّر بدون حدود مُرفق بأسفل الرسالة التي يرسلها التطبيق. ويُستخدم عادةً للسماح للمستخدم بالتفاعل بسرعة مع الرسائل في سياقها المحدّد. من الناحية الفنية، تستند إلى المبادئ الأساسية نفسها التي تستند إليها أزرار البطاقات.

eebe88238f6b13f.png

مراجعة خطوات المستخدم

إيقاف ميزة "المساعدة في تعزيز الشمولية"

1bb7a8592ee6221e.png

مراجعة رمز المصدر

يجب تعديل مشروع "برمجة تطبيقات Google".

ChatApp.js

// Edits the function to handle the inclusivity help disablement action for a
// given space.

function onCardClick(event) {
  ...
  if (event.action.actionMethodName === "disableInclusivityHelp") {
    disableInclusivityHelp(event.common.parameters.spaceId);
  }
}

Storage.js

// Edits the function to keep track of the inclusivity help setting.

function saveCreatedIssue(title, description, spaceId, subscriptionId) {
  appProperties.setProperty(spaceId, JSON.stringify({
    ...
    inclusivityHelp: true,
    ...
  }));
  ...
}
/**
 * Disables inclusivity help in a space.
 * 
 * @param {string} spaceId the ID of dedicated space of the issue
 */
function disableInclusivityHelp(spaceId) {
  var issue = JSON.parse(appProperties.getProperty(spaceId));
  issue.inclusivityHelp = false;
  appProperties.setProperty(spaceId, JSON.stringify(issue));
}
/**
 * Checks whether the app should help with inclusivity in a given space.
 * 
 * @param {string} spaceId the ID of dedicated space of the issue
 * @return whether the app should help with inclusivity
 */
function shouldHelpWithInclusivity(spaceId) {
  return JSON.parse(appProperties.getProperty(spaceId)).inclusivityHelp;
}

WorkspaceEvent.js

// Edits the function to display the accessory widget to the existing card message.

function processSubscription() {
  ...
  for (var messageIndex in messages) {
    ...
    } else if (ceType === "google.workspace.chat.message.v1.created") {
      ...
      if (... && shouldHelpWithInclusivity(chatMessage.space.name)) {
        createAppMessageUsingChatService({
          ...
          accessoryWidgets: [{ buttonList: { buttons: [{
            altText: "Disable inclusivity help",
            icon: {
              iconUrl: "https://upload.wikimedia.org/.../Stop_hand_rugen.png"
            },
            onClick: { action: {
              function: "disableInclusivityHelp",
              parameters: [{
                key: "spaceId",
                value: chatMessage.space.name
              }]
            }}
          }]}}]
        }, ...);
        ...
      }
      ...
    }
    ...
  }
  ...
}

تعديل مشروع "برمجة تطبيقات Google"

في بيئتك المحلية، اتّبِع الخطوات التالية:

  1. غيِّر الدليل الحالي في نافذة الأوامر إلى issue-management/5-disable-help. يحتوي على رمز المصدر الذي تحتاج إليه.
  2. انسخ ملف issue-management/4-inclusivity-help/.clasp.json إلى الدليل الحالي.
  3. انسخ ملف issue-management/4-inclusivity-help/Configuration.js إلى الدليل الحالي ليحلّ محل الملف الحالي.
  4. نفِّذ الأمر التالي:
clasp push

جرِّبه

إيقاف المساعدة

  • في Google Chat، في المساحة المخصّصة للمشكلة الرابعة التي أنشأتها باستخدام أمر يبدأ بشرطة مائلة /create، أرسِل الرسالة I had to add myself from the master to fix.

في وحدة تحكّم برمجة تطبيقات، اتّبِع الخطوات التالية:

  1. اختَر مشروعك.
  2. انقر على أداة التعديل.
  3. اختَر ملف WorkspaceEvent.gs.
  4. انقر على processSubscription في قسم التشغيل.
  5. انقر على تشغيل. يمكنك الاطّلاع من سجلّ التنفيذ على أنّه تمت معالجة الرسائل.

في Google Chat، اتّبِع الخطوات التالية:

  1. لاحظ أنّ التطبيق أرسل رسالة تتضمّن مساعدة بشأن التضمين إلى المساحة المخصّصة للمشكلة في تطبيق مصغّر خاص بالملحقات.
  2. انقر على أداة الملحق لإيقاف ميزة "المساعدة في التضمين".

de722cff1928dec9.png

إيقاف الشيك

  • في Google Chat، في المساحة المخصّصة للمشكلة الرابعة التي أنشأتها باستخدام أمر يبدأ بشرطة مائلة /create، أرسِل الرسالة I had to add myself from the master to fix.

في وحدة تحكّم برمجة تطبيقات، اتّبِع الخطوات التالية:

  1. اختَر مشروعك.
  2. انقر على أداة التعديل.
  3. اختَر ملف WorkspaceEvent.gs.
  4. انقر على processSubscription في قسم التشغيل.
  5. انقر على تشغيل. يمكنك الاطّلاع من سجلّ التنفيذ على أنّه تمت معالجة الرسائل. في Google Chat، لم يرسل التطبيق رسالة تتضمّن مساعدة بشأن الشمولية إلى المساحة المخصّصة للمشكلة لأنّها كانت غير مفعّلة.

347d659db53b73e9.png

8. التطبيق 2: الإنشاء

مراجعة المفاهيم

تحديد مصدر الذكاء الاصطناعي التوليدي

تهدف هذه العملية إلى جعل نماذج الذكاء الاصطناعي أكثر دقة وموثوقية من خلال ربطها بمصادر معرفة يمكن التحقّق منها. تساعد هذه التقنية في منع الذكاء الاصطناعي من اختراع المعلومات ويمكن أن تساعد في جعل الردود ذات صلة بالسياق وأقل تحيزًا.

اللغة الطبيعية

أي لغة يتحدث بها البشر أو يكتبونها للتواصل اليومي، على عكس اللغات الاصطناعية أو المستندة إلى الكمبيوتر

Cloud Storage

تتيح خدمة Cloud Storage تخزين أي كمية من البيانات في جميع أنحاء العالم واستردادها في أي وقت. يمكن استخدامها في مجموعة من السيناريوهات، بما في ذلك تقديم محتوى المواقع الإلكترونية، أو تخزين البيانات لأغراض الأرشفة واسترداد البيانات في حالات الكوارث، أو توزيع عناصر البيانات الكبيرة على المستخدمين من خلال التنزيل المباشر.

مخزن بيانات Dialogflow CX

تتكامل Dialogflow CX مع مخازن البيانات التي هي مجموعات من المواقع الإلكترونية والمستندات التي تستخدمها وكلاء مخازن البيانات للعثور على إجابات عن أسئلة المستخدمين النهائيين من بيانات محدّدة. بالنسبة إلى سؤال معيّن، يبحث وكيل مستودع البيانات عن إجابة من محتوى المصدر المحدّد ويلخّص النتائج في ردّ متماسك. ويوفّر أيضًا روابط داعمة لمصادر الردّ ليتمكّن المستخدم النهائي من الاطّلاع على مزيد من المعلومات.

بنية المراجعات

9d3342d12f3b4dda.png

تم إنشاء تطبيق محادثات Google Chat هذا باستخدام Dialogflow CX ويعمل على النحو التالي:

  1. يرسل المستخدم رسالة إلى التطبيق، إما في رسالة مباشرة أو في مساحة.
  2. يعالج التطبيق، وهو وكيل Dialogflow CX ومرتبط بمشروع على السحابة الإلكترونية من Google، الرسالة.
  3. يتكامل التطبيق مع مخزن بيانات يقع في Cloud Storage.
  4. يرسل التطبيق ردًا متزامنًا، إما في رسالة مباشرة أو في المساحة الأصلية.

مراجعة مسارات المستخدمين

الإجابة عن السؤال

aad9fb5a7ca48956.png

مراجعة رمز المصدر

المصدر الوحيد الذي تحتاج إليه ليس الرمز البرمجي، بل البيانات التي تستخدمها لتحديد المصدر.

google-chat-overview.pdf

يحتوي على المعلومات غير المنظَّمة لتطبيقات Google Chat، وهي نسخة مطبوعة من صفحة من الموقع الإلكتروني الخاص بمطوّري Google Workspace.

e9b91c4587b1a3a0.png

تعديل مشروع على السحابة الإلكترونية في Google Cloud

في Google Cloud Console، اتّبِع الخطوات التالية:

  1. فعِّل واجهتَي برمجة التطبيقات Dialogflow API وCloud Storage API.

  1. فعِّل واجهة برمجة التطبيقات Vertex AI Agent Builder API.

  1. انقر على القائمة ☰ > واجهات برمجة التطبيقات والخدمات > واجهات برمجة التطبيقات والخدمات المفعَّلة، ثم تأكَّد من تفعيل جميع واجهات برمجة التطبيقات.

.

.

إنشاء وكيل مستودع بيانات في Dialogflow CX

بدء بيانات المعرفة

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > Cloud Storage > الحِزم.

.

4f15978ae9f1b687.png

  1. انقر على إنشاء.
  2. اضبط قيمة الاسم على gchat-knowledge.
  3. انقر على إنشاء.

6b38c6d4d2c41bba.png

  1. اختَر حزمة gchat-knowledge.
  2. انقر على تحميل ملفات.
  3. نزِّل الملف google-chat-overview.pdf واختَره من بيئة التشغيل المحلية.

df89acb22e1762af.png

إنشاء تطبيق

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > أداة إنشاء الوكيل > التطبيقات.

  1. انقر على تطبيق جديد.
  2. اختَر نوع محادثة Chat.

44276003074bcf14.png

  1. اضبط Company name على اسم شركتك.
  2. ضبط السمة Agent name على knowledge
  3. انقر على متابعة.

c4fedfd7556f723b.png

  1. انقر على إنشاء مستودع بيانات جديد.
  2. اختَر "التخزين في السحابة الإلكترونية" كمصدر البيانات.

6e2440ecf0f8f9bd.png

  1. انقر على ملف.
  2. انقروا على تصفّح.
  3. اختَر ملف google-chat-overview.pdf.
  4. انقر على متابعة.
  5. اضبط اسم مستودع البيانات على gchat-knowledge-ds.
  6. انقر على إنشاء.

a675df7490b83900.png

  1. اختَر مخزن البيانات gchat-knowledge-ds في الجدول.
  2. انقر على إنشاء.

f121d580771ed96.png

  1. بعد بضع دقائق، انقر على القائمة ☰ > أداة إنشاء الوكيل > التطبيقات ولاحظ أنّه يمكنك رؤية التطبيق.

d929a7431dd84968.png

  1. انقر على القائمة ☰ > أداة إنشاء العملاء الافتراضيين > مخازن البيانات.

  1. انقر على مستودع البيانات gchat-knowledge-ds. عدد المستندات هو 1، ما يشير إلى أنّها جاهزة.

558319790a0accf2.png

إكمال التطبيق واختباره

في وحدة تحكّم Dialogflow CX، اتّبِع الخطوات التالية:

  1. اختَر مشروعك على Google Cloud.
  2. اختَر وكيل قاعدة المعرفة.

ca9b2fb4be92e8e4.png

  1. انقر على إعدادات الوكيل > الذكاء الاصطناعي التوليدي > الوكيل التوليدي.
  2. بدِّل النموذج من Text Bison إلى Gemini Pro.
  3. انقر على حفظ.

68cc4713ec9b25a0.png

  1. انقر على اختبار الوكيل.
  2. أرسِل What is Google Chat?. يردّ الوكيل بشيء ذي صلة.

8e3a2cb02469041a.png

دمج تطبيق محادثات Google Chat

في وحدة تحكّم Dialogflow CX، اتّبِع الخطوات التالية:

  1. اختَر مشروعك على Google Cloud.
  2. في صفّ وكيل المعلومات، انقر على 1e7ede7abae4aa3c.png > نسخ الاسم.

e19f61185158110d.png

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انتقِل إلى إعدادات Google Chat API.

  1. ضمن إعدادات الاتصال، اختَر Dialogflow.
  2. ضمن إعدادات Dialogflow، اختَر Dialogflow CX.
  3. اضبط اسم مورد الوكيل أو البيئة على اسم الوكيل الذي نسخته.
  4. أزِل الأمرَين اللذين يبدآن بشرطة مائلة.

505ff39a50880904.png

  1. في Google Chat، أرسِل What is Google Chat? في رسالة مباشرة إلى تطبيق Google Chat. سيردّ الوكيل برسالة مفيدة.

abda9e43b81fb0ea.png

9- اختياري: التطبيق 2: إضافة مصادر

مراجعة المفاهيم

الويب هوك في Dialogflow CX

خدمة تستضيف منطق النشاط التجاري أو تستدعي خدمات أخرى أثناء جلسة Dialogflow CX، يمكن أن تعتمد خطافات الويب على البيانات التي تم استخراجها من خلال معالجة اللغة الطبيعية لإنشاء ردود ديناميكية أو التحقّق من صحة البيانات التي تم جمعها أو تشغيل إجراءات في الخلفية.

Cloud Functions

تُعدّ Cloud Functions رائعة لإنشاء أنظمة خلفية بدون خادم، ومعالجة البيانات في الوقت الفعلي، وإنشاء تطبيقات ذكية. لا توجد خوادم يجب توفيرها أو إدارتها أو تصحيحها أو تعديلها. وهي تتكيّف تلقائيًا حسب الحاجة، وتتوفّر بشكل كبير، وتتجاوز الأخطاء.

مراجعة مسارات المستخدمين

الإجابة عن السؤال (تعديل)

92767c07c7b252aa.png

مراجعة رمز المصدر

رمز المصدر الوحيد الذي تحتاج إليه هو الدالة التي تعمل على تكييف ردود الوكيل مع رسائل Google Chat. يتم استخدامه كخطاف ويب.

package.json

// The function relies on the Cloud Functions framework to run.

{
  "name": "agent-response-adapter",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  },
  ...
}

index.js

/** 
 * Handles all incoming requests.
 *
 * It takes a Dialogflow CX agent response as input and returns a
 * valid Google Chat card message with both the text and source links
 */
functions.http('agent-response-adapter', (request, response) => {
  // Creates Google Chat buttons based on the data store agent response
  // grounding details.
  var linkTitles = [];
  var linkButtons = [];
  const grounding = request.body.messages[1].payload.richContent[0][0];
  if (grounding.type === "match_citations") {
    // Supports citation match type.
    grounding.citations.forEach((citation) => {
      // Avoid duplications.
      if (linkTitles.indexOf(citation.title) < 0) {
        linkButtons.push({
          text: citation.title,
          onClick: { openLink: {
            url: citation.actionLink
          }}
        });
        linkTitles.push(citation.title);
      }
    });
  } else if (grounding.type === "info") {
    // Supports info type.
    if (linkTitles.indexOf(grounding.title) < 0) {
      linkButtons.push({
        text: grounding.title,
        onClick: { openLink: {
          url: grounding.actionLink
        }}
      });
      linkTitles.push(grounding.title);
    }
  }

  // Sends the Dialogflow CX fulfillment response to replace the agent response
  // with the Chat message with text and source buttons.
  response.send({ fulfillment_response: {
    merge_behavior: "REPLACE",
    messages: [{ payload: {
      // Reuses the original data store agent response text.
      text: request.body.messages[0].text.text[0],
      cardsV2: [{
        cardId: "sourcesCard",
        card: { sections: [{
          header: "Sources",
          widgets: [{ buttonList: {
            buttons: linkButtons
          }}]
        }]}
      }]
    }}]
  }});
});

تعديل مشروع على السحابة الإلكترونية من Google Cloud

في Google Cloud Console، اتّبِع الخطوات التالية:

  1. فعِّل واجهات برمجة التطبيقات Cloud Build وCloud Functions وCloud Logging وArtifact Registry وCloud Run.

  1. انقر على القائمة ☰ > واجهات برمجة التطبيقات والخدمات > واجهات برمجة التطبيقات والخدمات المفعَّلة، ثم تأكَّد من تفعيل واجهات برمجة التطبيقات.

.

تعديل وكيل مستودع البيانات في Dialogflow CX

عليك نشر Cloud Function وتعديل خطاف الويب في Dialogflow CX لتشغيله باستخدام مصادر متعددة عند الإمكان.

عرض مصادر متعددة

بشكلٍ تلقائي، لا يعرض وكيل متجر البيانات الجديد سوى مصدر واحد كحدّ أقصى، ولكن يمكنك تغيير ذلك لعرض المزيد.

في وحدة تحكّم Dialogflow CX، اتّبِع الخطوات التالية:

  1. اختَر مشروعك على Google Cloud.
  2. اختَر وكيل قاعدة المعرفة.
  3. انقر على صفحة البدء.
  4. انقر على تعديل مستودعات البيانات.
  5. ضمن قسم ردود الوكيل، اضبط خيارات الردود من مخزن البيانات على 5.
  6. انقر على حفظ.

f5932d03057df645.png

بدء Cloud Function

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > Cloud Functions.

  1. انقر على إنشاء دالة.
  2. ضمن الأساسيات، اضبط الاسم على function-1.
  3. ضمن المصادقة، انقر على زر الاختيار "السماح بعمليات الاستدعاء غير المصادَق عليها".
  4. ضمن إعدادات وقت التشغيل والإنشاء والاتصالات والأمان، اضبط الحد الأقصى لعدد الآلات الافتراضية على 3.
  5. انقر على التالي.

bd3790a9285f9c07.png

  1. اضبط نقطة الدخول على agent-response-adapter.
  2. استبدِل المحتوى التلقائي بالملفَين package.json وindex.js.
  3. انقر على نشر.

b379bb8ca0fc1079.png

  1. انسخ عنوان URL أثناء انتظارك لبضع دقائق حتى يتم تفعيل الدالة.

eaae08cf048b9b1c.png

بدء عملية الويب هوك

عليك ضبط وكيل Dialogflow CX لاستخدام خطاف ويب يؤدي إلى تشغيل الدالة التي تم نشرها حديثًا.

في وحدة تحكّم Dialogflow CX، اتّبِع الخطوات التالية:

  1. اختَر مشروعك على Google Cloud.
  2. اختَر وكيل قاعدة المعرفة.
  3. انقر على إدارة > خطافات الويب > إنشاء.
  4. اضبط الاسم المعروض على Google Chat Response Adapter.
  5. اضبط رابط ويب هوك على عنوان URL الذي نسخته سابقًا.
  6. انقر على حفظ.

5f3c6804d52b87c1.png

  1. انقر على إنشاء.
  2. انقر على صفحة البدء.
  3. انقر على تعديل مستودعات البيانات.
  4. ضمن إعدادات الويب هوك، انقر على زر التبديل تفعيل الويب هوك.
  5. اختَر محوّل استجابة Google Chat لخدمة الويب هوك.
  6. اضبط tag على arbitrary_tag.
  7. انقر على حفظ.

442fcaaec9b8f2e3.png

تطبيق الاختبار

  • في Google Chat، أرسِل What is Google Chat? في رسالة مباشرة إلى تطبيق محادثات Google Chat. سيردّ عليك الوكيل برسالة مفيدة وبطاقة تتضمّن المصادر، إن وُجدت.

9468866bfe848bb8.png

10. التطبيق 3: الإنشاء

مراجعة المفاهيم

التفاعلات الحوارية

وهي عبارة عن تبادل المعلومات أو الأفكار بين شخصين أو أكثر من خلال اللغة الطبيعية. ويختلف ذلك عن الواجهات الفنية التي تعتمد غالبًا على عمليات تبادل غير مرتبطة بحالة، ومنظَّمة للغاية، وغير متسامحة.

مواصفات OpenAPI

وهي توفّر وسيلة متّسقة لنقل المعلومات خلال كل مرحلة من مراحل دورة حياة واجهة برمجة التطبيقات. وهي لغة مواصفات لواجهات برمجة التطبيقات المستندة إلى HTTP تحدّد البنية والصيغة بطريقة لا ترتبط بلغة البرمجة التي تم إنشاء واجهة برمجة التطبيقات بها. تتم كتابة مواصفات واجهة برمجة التطبيقات عادةً بلغة YAML أو JSON، ما يتيح سهولة مشاركة المواصفات واستخدامها.

وكيل Dialogflow CX

الوحدة الأساسية لتطبيقات الوكلاء يحتوي تطبيق الوكيل عادةً على العديد من الوكلاء، حيث يتم تحديد كل وكيل للتعامل مع مهام معيّنة. يتم تزويد النموذج اللغوي الكبير ببيانات الوكيل، ما يتيح له الحصول على المعلومات التي يحتاجها للإجابة عن الأسئلة وتنفيذ المهام. يمكن لكل وكيل تقديم معلومات أو إرسال طلبات بحث إلى خدمات خارجية أو تأجيل معالجة المحادثة إلى مسار Dialogflow CX أو وكيل آخر لمعالجة المهام الفرعية.

أداة Dialogflow CX

تُستخدَم الأدوات لربط تطبيقات الوكيل بالأنظمة الخارجية. يمكن لهذه الأنظمة تعزيز معرفة تطبيقات الوكلاء وتمكينها من تنفيذ المهام المعقّدة بكفاءة.

بنية المراجعات

9d3342d12f3b4dda.png

تم إنشاء تطبيق محادثات Google Chat هذا باستخدام Dialogflow CX ويعمل على النحو التالي:

  1. يرسل المستخدم رسالة إلى التطبيق، إما في رسالة مباشرة أو في مساحة.
  2. يعالج التطبيق، وهو وكيل Dialogflow CX ومرتبط بمشروع على السحابة الإلكترونية من Google، الرسالة.
  3. يتكامل التطبيق مع وكيل.
  4. يرسل التطبيق ردًا متزامنًا، إما في رسالة مباشرة أو في المساحة الأصلية.

مراجعة مسارات المستخدمين

جمع المراجعات

a67a5b8b513bfc2c.png

مراجعة رمز المصدر

رمز المصدر الوحيد الذي تحتاج إليه هو الدالة لمحاكاة خدمة الخلفية التي يستخدمها الوكيل كأداة.

package.json

// The function relies on the Cloud Functions framework to run.

{
  "name": "feedback-app-backend",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/functions-framework": "^3.0.0"
  },
  ...
}

index.js

/** 
 * Handles all incoming requests.
 * 
 * It always returns OK in plain text.
 */
functions.http('feedback-app-backend', (request, response) => {
    response.send('OK');
});

service-openapi.yaml

// Defines the backend service structure and how to request it.

openapi: 3.1.0
info:
  title: Review Store
  license:
    name: Apache 2.0
    identifier: Apache-2.0
  version: 0.0.1
servers:
  - url: https://us-central1-project-0.cloudfunctions.net
paths:
  /store-review:
    post:
      operationId: storeReview
      summary: Store a new review
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                stars:
                  type: integer
                  format: int64
      responses:
        '200':
          description: success
          content:
            application/json:
              schema:
                type: string

بدء محاكاة خدمة الخلفية

يمكنك نشر إحدى دوال Cloud Functions لمحاكاة خدمة خلفية يحتاج تطبيق وكيل Dialogflow CX إلى دمجها واستدعائها كأداة.

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > Cloud Functions.

  1. انقر على إنشاء دالة.
  2. ضمن الأساسيات، اضبط الاسم على function-2.
  3. ضمن المصادقة، انقر على زر الاختيار السماح بعمليات الاستدعاء غير المصادَق عليها.
  4. ضمن إعدادات وقت التشغيل والإنشاء والاتصالات والأمان، اضبط الحد الأقصى لعدد الآلات الافتراضية على 3.
  5. انقر على التالي.

e8cf0ee7441bf634.png

  1. اضبط نقطة الدخول على feedback-app-backend.
  2. استبدِل المحتوى التلقائي بالملفَين package.json وindex.js.
  3. انقر على نشر.

bdb5cf9f503aa7f6.png

  1. انسخ عنوان URL أثناء انتظارك لبضع دقائق حتى يتم تفعيل الدالة.

إنشاء تطبيق وكيل Dialogflow CX

إنشاء تطبيق

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > أداة إنشاء الوكيل > التطبيقات.

  1. انقر على تطبيق جديد.
  2. انقر على الوكيل.
  3. اضبط الاسم المعروض على Feedback App.
  4. انقر على إنشاء.

7ef3dbacee96c5aa.png

بدء الأداة

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > أداة إنشاء الوكيل > التطبيقات.

  1. اختَر وكيل تطبيق الملاحظات.
  2. انقر على الأدوات > + إنشاء.
  3. اضبط الاسم على review.
  4. اختَر OpenAPI.
  5. اضبط الوصف على القيمة التالية:
The tool takes the number of stars as a parameter of the store review method and saves it in a database for later use.
  1. نزِّل $URL واستبدِله في الملف service-openapi.yaml بعنوان URL الذي نسخته سابقًا.
  2. اضبط YAML Schema على المحتوى المعدَّل لملف service-openapi.yaml.
  3. انقر على حفظ.

58085d6d56b603f7.png

بدء الوكيل

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > أداة إنشاء الوكيل > التطبيقات.

  1. اختَر وكيل تطبيق الملاحظات.
  2. انقر على الوكلاء > الوكيل التوليدي التلقائي.
  3. اضبط اسم الوكيل على Feedback collector.
  4. اضبط goal على القيمة التالية:
You are an agent that collects reviews from Google Chat app developers.
A review may be between 0 and 5 stars. The more stars, the more positive the review.
  1. اضبط التعليمات على القيمة التالية:
If the developer didn't provide the number of stars, ask for the number of stars.
After the developer provides the number of stars of the review, confirm the number with the developer and use ${TOOL: review} to store the review with the number of stars.
If ${TOOL: review} fails, apologize and ask to try again later. Otherwise, thank the developer for the review.
  1. انقر على حفظ.

ebee7fdfa826b487.png

تطبيق تجريبي

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > أداة إنشاء الوكيل > التطبيقات.

  1. اختَر وكيل تطبيق الملاحظات.
  2. انتقِل إلى معاينة الوكيل.
  3. ضمن الوكيل، اختَر أداة جمع الملاحظات.
  4. ضمن اختيار نموذج إنشاء، اختَر gemini-pro.
  5. أرسِل الرسالة Hello! للبدء.

90ca8cb7b2c1cb4b.png

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > Cloud Functions.

  1. اختَر function-2 > السجلات. تعرض بعض السجلات Google-Dialogflow كمتّصل.

48bfdf1788004d18.png

دمج تطبيق محادثات Google Chat

في وحدة تحكّم Dialogflow CX، اتّبِع الخطوات التالية:

  1. اختَر مشروعك على Google Cloud.
  2. انقر على قائمة الإجراءات الخاصة بعميل Feedback App.
  3. انقر على نسخ الاسم.

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انتقِل إلى إعدادات Google Chat API.

  1. اضبط اسم مورد الوكيل أو البيئة على اسم الوكيل الذي نسخته سابقًا.

df16619a1cb85cf8.png

  • في Google Chat، أرسِل Hello! في رسالة مباشرة إلى تطبيق محادثات Google Chat للبدء. يستجيب الوكيل بشكل مشابه لاختبارك من وحدة تحكّم Dialogflow CX.

99a7a0295f122f31.png

11. تَنظيم

حذف مشروع على السحابة الإلكترونية من Google Cloud

لتجنُّب تحمّل رسوم على حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا الدرس العملي، ننصحك بحذف مشروع على السحابة الإلكترونية.

في وحدة تحكّم Google Cloud، اتّبِع الخطوات التالية:

  1. انقر على القائمة ☰ > إدارة الهوية وإمكانية الوصول والمشرف > الإعدادات.

  1. انقر على إيقاف.
  2. أدخِل رقم تعريف المشروع.
  3. انقر على إيقاف الاستضافة على البنية الأساسية القديمة.

407699a4e03afea6.png

حذف مشروع "برمجة تطبيقات Google"

ننصحك أيضًا بحذف مشروع "برمجة تطبيقات Google".

في وحدة تحكّم برمجة تطبيقات، اتّبِع الخطوات التالية:

  1. اختَر مشروعك.
  2. انقر على قائمة الإجراءات.
  3. انقر على إزالة.

fa3a42d7d2201eb9.png

12. تهانينا

تهانينا! لقد أنشأت تطبيقات Google Chat باستخدام Gemini.

ما هي الخطوات التالية؟

لقد عرضنا في هذا الدرس التطبيقي حول الترميز حالات استخدام بسيطة فقط، ولكن هناك العديد من مجالات التوسّع التي قد تحتاج إلى أخذها في الاعتبار في تطبيقات Google Chat، مثل ما يلي:

  • التكامل مع نماذج الذكاء الاصطناعي التوليدي الأخرى، بما في ذلك النماذج المخصّصة
  • أن تتوافق مع أنواع أخرى من الوسائط، مثل الصوت والصور والفيديوهات
  • استخدام تعدُّد الوسائط.
  • الاعتماد على قدرات استيعاب أكبر وحلقات الملاحظات
  • نشر تطبيقات Google Chat جاهزة للاستخدام في السوق تتوفّر الكثير من المراجع للمطوّرين، مثل فيديوهات YouTube ومواقع المستندات وعيّنات التعليمات البرمجية والأدلة التعليمية.
  • فعِّل Google Chat لمؤسستك. تسهّل عليك ميزة "وضع الاستيراد" البدء.

مزيد من المعلومات