با Google Chat، Vertex AI و Apps Script به حوادث پاسخ دهید

این آموزش نحوه ساخت یک برنامه Google Chat را نشان می‌دهد که به صورت بلادرنگ به حوادث پاسخ می‌دهد. هنگام پاسخ به یک حادثه، برنامه یک فضای چت ایجاد و پر می‌کند، حل حادثه را با پیام‌ها، دستورات اسلش و دیالوگ‌ها تسهیل می‌کند و از هوش مصنوعی برای خلاصه کردن پاسخ حادثه در یک سند Google Docs استفاده می‌کند.

یک حادثه ، رویدادی است که برای حل آن نیاز به توجه فوری یک تیم از افراد است. نمونه‌هایی از حوادث عبارتند از:

  • یک پرونده حساس به زمان در یک پلتفرم مدیریت ارتباط با مشتری (CRM) ایجاد می‌شود که مستلزم همکاری یک تیم خدماتی برای حل و فصل آن است.
  • یک سیستم آفلاین می‌شود و به گروهی از مهندسان قابلیت اطمینان سایت (SRE) هشدار می‌دهد تا بتوانند با همکاری یکدیگر آن را دوباره آنلاین کنند.
  • زلزله‌ای با بزرگی بالا رخ می‌دهد و نیروهای امدادی باید واکنش خود را هماهنگ کنند.

برای اهداف این آموزش، هشدار حادثه زمانی شروع می‌شود که شخصی با کلیک روی دکمه‌ای از یک صفحه وب، حادثه را گزارش می‌دهد. صفحه وب با درخواست از کاربران برای وارد کردن اطلاعات اولیه حادثه: عنوان، توضیحات و آدرس‌های ایمیل پاسخ‌دهندگان، یک حادثه را شبیه‌سازی می‌کند.

برنامه چت مدیریت حادثه را در عمل ببینید:

  • وب‌سایتی که حادثه‌ای را آغاز می‌کند.
    شکل ۱. وب‌سایتی که در آن می‌توان حادثه‌ای را گزارش کرد.
  • اعلانی مبنی بر ایجاد فضای چت مربوط به حادثه.
    شکل ۲. اعلانی مبنی بر ایجاد فضای چت مربوط به حادثه.
  • فضای چت پاسخ به حادثه.
    شکل ۳. فضای چت پاسخ به حادثه.
  • حل مشکل با دستور اسلش.
    شکل ۴. حل مشکل با دستور اسلش.
  • گفتگوی حل حادثه.
    شکل ۵. پنجره‌ی حل حادثه.
  • سند Google Docs که در فضا به اشتراک گذاشته شده است، راهکار حل حادثه را ارائه می‌دهد.
    شکل ۶. سند Google Docs که در فضا به اشتراک گذاشته شده و به حل حادثه می‌پردازد.
  • خلاصه حل حادثه توسط هوش مصنوعی در گوگل داک.
    شکل ۷. خلاصه‌ای از حل حادثه توسط هوش مصنوعی در سند Google Docs.

پیش‌نیازها

اگر لازم است هر یک از این پیش‌نیازها برای سازمانتان فعال باشد، از سرپرست Google Workspace خود بخواهید آنها را فعال کند:

  • یک حساب کاربری تجاری یا سازمانی Google Workspace با دسترسی به Google Chat .
  • برای فعال کردن «راهنمایی» (اشتراک‌گذاری مخاطب) برای Google Workspace. برنامه‌ی رخداد از این فهرست برای جستجوی اطلاعات تماس پاسخ‌دهندگان به رخداد، مانند نام و آدرس ایمیل، استفاده می‌کند. پاسخ‌دهندگان به رخداد باید کاربرانی با حساب Google Chat در سازمان Google Workspace شما باشند.

اهداف

  • یک برنامه چت بسازید که به حوادث پاسخ دهد.
  • با انجام موارد زیر به کاربران در واکنش به حوادث کمک کنید:
    • ایجاد فضاهای واکنش به حادثه
    • ارسال پیام‌هایی که خلاصه‌ای از حوادث و پاسخ‌ها را ارائه می‌دهند.
    • پشتیبانی از همکاری با ویژگی‌های برنامه چت تعاملی.
  • مکالمات و راه‌حل‌ها را با Vertex AI خلاصه کنید.

معماری

نمودار زیر معماری منابع Google Workspace و Google Cloud مورد استفاده توسط برنامه پاسخ به حادثه Google Chat را نشان می‌دهد.

معماری برنامه پاسخ به حادثه گوگل چت

این معماری نشان می‌دهد که چگونه برنامه پاسخ به حادثه گوگل چت، یک حادثه را پردازش و حل می‌کند.

  1. یک کاربر، حادثه‌ای را از یک وب‌سایت خارجی که روی Apps Script میزبانی می‌شود، آغاز می‌کند.

  2. این وب‌سایت یک درخواست HTTP ناهمزمان به برنامه Google Chat ارسال می‌کند که آن هم در Apps Script میزبانی می‌شود.

  3. برنامه پاسخ به حادثه گوگل چت، درخواست را پردازش می‌کند:

    1. سرویس Apps Script Admin SDK اطلاعات اعضای تیم، مانند شناسه کاربری و آدرس ایمیل را دریافت می‌کند.

    2. با مجموعه‌ای از درخواست‌های HTTP به Chat API با استفاده از سرویس Apps Script Advanced Chat، برنامه پاسخ به حادثه Google Chat یک فضای چت حادثه ایجاد می‌کند، آن را با اعضای تیم پر می‌کند و پیامی را به آن فضا ارسال می‌کند.

  4. اعضای تیم در فضای چت درباره حادثه بحث می‌کنند.

  5. یکی از اعضای تیم برای اعلام حل و فصل این حادثه، دستور اسلش را فراخوانی می‌کند.

    1. یک فراخوانی HTTP به Chat API با استفاده از سرویس Apps Script Advanced Chat، تمام پیام‌های فضای چت را فهرست می‌کند.

    2. هوش مصنوعی ورتکس پیام‌های فهرست‌شده را دریافت کرده و خلاصه‌ای از آن‌ها تولید می‌کند.

    3. سرویس Apps Script DocumentApp یک سند Docs ایجاد می‌کند و خلاصه Vertex AI را به سند اضافه می‌کند.

    4. برنامه‌ی پاسخ به حادثه‌ی گوگل چت، API چت را فراخوانی می‌کند تا پیامی ارسال کند که لینکی به سند خلاصه‌ی اسناد را به اشتراک می‌گذارد.

محیط را آماده کنید

این بخش نحوه ایجاد و پیکربندی یک پروژه Google Cloud برای برنامه Chat را نشان می‌دهد.

ایجاد یک پروژه گوگل کلود

کنسول گوگل کلود

  1. در کنسول گوگل کلود، به Menu > IAM & Admin > Create a Project بروید.

    به ایجاد پروژه بروید

  2. در قسمت نام پروژه ، یک نام توصیفی برای پروژه خود وارد کنید.

    اختیاری: برای ویرایش شناسه پروژه ، روی ویرایش کلیک کنید. شناسه پروژه پس از ایجاد پروژه قابل تغییر نیست، بنابراین شناسه‌ای را انتخاب کنید که نیازهای شما را در طول عمر پروژه برآورده کند.

  3. در فیلد «مکان» ، روی «مرور» کلیک کنید تا مکان‌های بالقوه برای پروژه شما نمایش داده شود. سپس، روی «انتخاب» کلیک کنید.
  4. روی ایجاد کلیک کنید. کنسول Google Cloud به صفحه داشبورد هدایت می‌شود و پروژه شما ظرف چند دقیقه ایجاد می‌شود.

رابط خط فرمان جی‌کلاود

در یکی از محیط‌های توسعه زیر، به رابط خط فرمان گوگل کلود ( gcloud ) دسترسی پیدا کنید:

  • Cloud Shell : برای استفاده از یک ترمینال آنلاین با رابط خط فرمان gcloud که از قبل تنظیم شده است، Cloud Shell را فعال کنید.
    فعال کردن پوسته ابری
  • پوسته محلی : برای استفاده از یک محیط توسعه محلی، رابط خط فرمان gcloud را نصب و راه‌اندازی کنید .
    برای ایجاد یک پروژه ابری، از دستور gcloud projects create استفاده کنید:
    gcloud projects create PROJECT_ID
    به جای PROJECT_ID ، شناسه پروژه‌ای که می‌خواهید ایجاد کنید را وارد کنید.

فعال کردن پرداخت برای پروژه ابری

کنسول گوگل کلود

  1. در کنسول گوگل کلود، به بخش صورتحساب (Billing) بروید. ) > صورتحساب (Billing) > پروژه‌های من (My Projects) کلیک کنید.

    به بخش پرداخت هزینه‌های پروژه‌های من بروید

  2. در بخش «انتخاب سازمان» ، سازمانی را که با پروژه Google Cloud شما مرتبط است، انتخاب کنید.
  3. در ردیف پروژه، منوی اقدامات ( ) را باز کنید، روی تغییر صورتحساب کلیک کنید و حساب صورتحساب ابری را انتخاب کنید.
  4. روی تنظیم حساب کلیک کنید.

رابط خط فرمان جی‌کلاود

  1. برای فهرست کردن حساب‌های صورتحساب موجود، دستور زیر را اجرا کنید:
    gcloud billing accounts list
  2. یک حساب صورتحساب را با یک پروژه Google Cloud مرتبط کنید:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    موارد زیر را جایگزین کنید:

    • PROJECT_ID شناسه پروژه برای پروژه ابری است که می‌خواهید صورتحساب را برای آن فعال کنید.
    • BILLING_ACCOUNT_ID شناسه حساب پرداخت برای پیوند با پروژه Google Cloud است.

فعال کردن APIها

کنسول گوگل کلود

  1. در کنسول گوگل کلود، APIهای Google Chat، Google Docs، Admin SDK و Vertex AI را فعال کنید.

    فعال کردن APIها

  2. تأیید کنید که APIها را در پروژه Cloud صحیح فعال می‌کنید، سپس روی Next کلیک کنید.

  3. تأیید کنید که API های صحیح را فعال می‌کنید، سپس روی فعال کردن کلیک کنید.

رابط خط فرمان جی‌کلاود

  1. در صورت لزوم، پروژه Cloud فعلی را با دستور gcloud config set project روی پروژه‌ای که ایجاد کرده‌اید تنظیم کنید:

    gcloud config set project PROJECT_ID

    به جای PROJECT_ID شناسه پروژه ابری که ایجاد کرده‌اید را قرار دهید.

  2. با استفاده از دستور gcloud services enable رابط برنامه‌نویسی کاربردی (API) گوگل چت، رابط برنامه‌نویسی کاربردی گوگل داکز، رابط برنامه‌نویسی کاربردی ادمین SDK و رابط برنامه‌نویسی کاربردی ورتکس هوش مصنوعی را فعال کنید:

    gcloud services enable chat.googleapis.com docs.googleapis.com admin.googleapis.com aiplatform.googleapis.com

تنظیم احراز هویت و مجوز

احراز هویت و مجوز به برنامه چت اجازه می‌دهد تا به منابع موجود در Google Workspace و Google Cloud برای پردازش پاسخ به حادثه دسترسی داشته باشد.

در این آموزش، شما برنامه را به صورت داخلی منتشر می‌کنید، بنابراین استفاده از اطلاعات placeholder اشکالی ندارد. قبل از انتشار خارجی برنامه، اطلاعات placeholder را با اطلاعات واقعی برای صفحه رضایت‌نامه جایگزین کنید.

  1. در کنسول گوگل کلود، به Menu > برویدGoogle Auth platform > برندسازی .

    به بخش برندسازی بروید

  2. اگر قبلاً تنظیمات را انجام داده‌ایدGoogle Auth platformمی‌توانید تنظیمات صفحه رضایت OAuth زیر را در Branding ، Audience و Data Access پیکربندی کنید. اگر پیامی با این مضمون مشاهده کردید Google Auth platform هنوز پیکربندی نشده است ، روی شروع کار کلیک کنید:

    1. در قسمت اطلاعات برنامه ، در قسمت نام برنامه ، عبارت Incident Management را تایپ کنید.
    2. در ایمیل پشتیبانی کاربر ، آدرس ایمیل خود یا یک گروه گوگل مناسب را انتخاب کنید.
    3. روی بعدی کلیک کنید.
    4. در قسمت مخاطبان ، گزینه داخلی (Internal) را انتخاب کنید. اگر نمی‌توانید داخلی (Internal) را انتخاب کنید، خارجی (External) را انتخاب کنید.
    5. روی بعدی کلیک کنید.
    6. در قسمت اطلاعات تماس ، یک آدرس ایمیل وارد کنید که از طریق آن بتوانید از هرگونه تغییر در پروژه خود مطلع شوید.
    7. روی بعدی کلیک کنید.
    8. در قسمت Finish ، سیاست داده‌های کاربر سرویس‌های API گوگل را مرور کنید و در صورت موافقت، گزینه «من با سیاست‌های داده‌های کاربر سرویس‌های API گوگل موافقم» را انتخاب کنید.
    9. روی ادامه کلیک کنید.
    10. روی ایجاد کلیک کنید.
    11. اگر نوع کاربر را External انتخاب کرده‌اید، کاربران آزمایشی را اضافه کنید:
      1. روی مخاطب کلیک کنید.
      2. در قسمت کاربران آزمایشی ، روی افزودن کاربران کلیک کنید.
      3. آدرس ایمیل خود و سایر کاربران آزمایشی مجاز را وارد کنید، سپس روی ذخیره کلیک کنید.
  3. روی دسترسی به داده‌ها > افزودن یا حذف محدوده‌ها کلیک کنید. یک پنل با لیستی از محدوده‌ها برای هر API که در پروژه Google Cloud خود فعال کرده‌اید، ظاهر می‌شود.

    1. در قسمت «افزودن دستی محدوده‌ها» ، محدوده‌های زیر را وارد کنید:

      • https://www.googleapis.com/auth/chat.spaces.create
      • https://www.googleapis.com/auth/chat.memberships
      • https://www.googleapis.com/auth/chat.memberships.app
      • https://www.googleapis.com/auth/chat.messages
      • https://www.googleapis.com/auth/documents
      • https://www.googleapis.com/auth/admin.directory.user.readonly
      • https://www.googleapis.com/auth/script.external_request
      • https://www.googleapis.com/auth/userinfo.email
      • https://www.googleapis.com/auth/cloud-platform
    2. روی افزودن به جدول کلیک کنید.

    3. روی به‌روزرسانی کلیک کنید.

    4. پس از انتخاب محدوده‌های مورد نیاز برنامه، در صفحه دسترسی به داده‌ها ، روی ذخیره کلیک کنید.

ایجاد و استقرار برنامه چت

در بخش بعدی، کل پروژه Apps Script را که شامل تمام کدهای برنامه مورد نیاز برای برنامه چت شما است، کپی و به‌روزرسانی می‌کنید، بنابراین نیازی به کپی و پیست کردن تک تک فایل‌ها نیست.

بعضی از توابع در انتهای نام خود از زیرخط (_) استفاده می‌کنند، مانند processSlashCommand_() از ChatApp.gs . زیرخط، تابع را از صفحه وب مقداردهی اولیه رویداد، هنگامی که در مرورگر باز است، پنهان می‌کند. برای اطلاعات بیشتر، به توابع خصوصی (Private functions) مراجعه کنید.

اسکریپت برنامه‌ها از دو نوع فایل پشتیبانی می‌کند، اسکریپت‌های .gs و فایل‌های .html . برای رعایت این پشتیبانی، جاوا اسکریپت سمت کلاینت برنامه درون تگ‌های <script /> و CSS آن درون تگ‌های <style /> درون یک فایل HTML قرار می‌گیرد.

در صورت تمایل، می‌توانید کل پروژه را در گیت‌هاب مشاهده کنید.

مشاهده در گیت‌هاب

در اینجا خلاصه‌ای از هر فایل را مشاهده می‌کنید:

Consts.gs

ثابت‌هایی را تعریف می‌کند که توسط سایر فایل‌های کد، از جمله شناسه پروژه Cloud شما، شناسه مکان Vertex AI و شناسه دستور اسلش برای بستن یک حادثه، ارجاع داده می‌شوند.

مشاهده کد Consts.gs

اسکریپت برنامه‌ها/پاسخ به حادثه/Consts.gs
const PROJECT_ID = 'replace-with-your-project-id';
const VERTEX_AI_LOCATION_ID = 'us-central1';
const CLOSE_INCIDENT_COMMAND_ID = 1;
ChatApp.gs

رویدادهای تعاملی چت، شامل پیام‌ها، کلیک‌های کارت، دستورات اسلش و دیالوگ‌ها را مدیریت می‌کند. با باز کردن یک دیالوگ برای جمع‌آوری جزئیات حل حادثه، به دستور اسلش /closeIncident پاسخ می‌دهد. پیام‌های موجود در فضای خالی را با فراخوانی متد spaces.messages.list در API چت می‌خواند. شناسه‌های کاربر را با استفاده از سرویس Admin SDK Directory در Apps Script دریافت می‌کند.

مشاهده کد ChatApp.gs

اسکریپت برنامه‌ها/پاسخ به حادثه/ChatApp.gs
/**
 * Responds to a MESSAGE event in Google Chat.
 *
 * This app only responds to a slash command with the ID 1 ("/closeIncident").
 * It will respond to any other message with a simple "Hello" text message.
 *
 * @param {Object} event the event object from Google Chat
 */
function onMessage(event) {
  if (event.message.slashCommand) {
    return processSlashCommand_(event);
  }
  return { "text": "Hello from Incident Response app!" };
}

/**
 * Responds to a CARD_CLICKED event in Google Chat.
 *
 * This app only responds to one kind of dialog (Close Incident).
 *
 * @param {Object} event the event object from Google Chat
 */
function onCardClick(event) {
  if (event.isDialogEvent) {
    if (event.dialogEventType == 'SUBMIT_DIALOG') {
      return processSubmitDialog_(event);
    }
    return {
      actionResponse: {
        type: "DIALOG",
        dialogAction: {
          actionStatus: "OK"
        }
      }
    };
  }
}

/**
 * Responds to a MESSAGE event with a Slash command in Google Chat.
 *
 * This app only responds to a slash command with the ID 1 ("/closeIncident")
 * by returning a Dialog.
 *
 * @param {Object} event the event object from Google Chat
 */
function processSlashCommand_(event) {
  if (event.message.slashCommand.commandId != CLOSE_INCIDENT_COMMAND_ID) {
    return {
      "text": "Command not recognized. Use the command `/closeIncident` to close the incident managed by this space."
    };
  }
  const sections = [
    {
      header: "Close Incident",
      widgets: [
        {
          textInput: {
            label: "Please describe the incident resolution",
            type: "MULTIPLE_LINE",
            name: "description"
          }
        },
        {
          buttonList: {
            buttons: [
              {
                text: "Close Incident",
                onClick: {
                  action: {
                    function: "closeIncident"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  ];
  return {
    actionResponse: {
      type: "DIALOG",
      dialogAction: {
        dialog: {
          body: {
            sections,
          }
        }
      }
    }
  };
}

/**
 * Responds to a CARD_CLICKED event with a Dialog submission in Google Chat.
 *
 * This app only responds to one kind of dialog (Close Incident).
 * It creates a Doc with a summary of the incident information and posts a message
 * to the space with a link to the Doc.
 *
 * @param {Object} event the event object from Google Chat
 */
function processSubmitDialog_(event) {
  const resolution = event.common.formInputs.description[""].stringInputs.value[0];
  const chatHistory = concatenateAllSpaceMessages_(event.space.name);
  const chatSummary = summarizeChatHistory_(chatHistory);
  const docUrl = createDoc_(event.space.displayName, resolution, chatHistory, chatSummary);
  return {
    actionResponse: {
      type: "NEW_MESSAGE",
    },
    text: `Incident closed with the following resolution: ${resolution}\n\nHere is the automatically generated post-mortem:\n${docUrl}`
  };
}

/**
 * Lists all the messages in the Chat space, then concatenate all of them into
 * a single text containing the full Chat history.
 *
 * For simplicity for this demo, it only fetches the first 100 messages.
 *
 * Messages with slash commands are filtered out, so the returned history will
 * contain only the conversations between users and not app command invocations.
 *
 * @return {string} a text containing all the messages in the space in the format:
 *          Sender's name: Message
 */
function concatenateAllSpaceMessages_(spaceName) {
  // Call Chat API method spaces.messages.list
  const response = Chat.Spaces.Messages.list(spaceName, { 'pageSize': 100 });
  const messages = response.messages;
  // Fetch the display names of the message senders and returns a text
  // concatenating all the messages.
  let userMap = new Map();
  return messages
    .filter(message => message.slashCommand === undefined)
    .map(message => `${getUserDisplayName_(userMap, message.sender.name)}: ${message.text}`)
    .join('\n');
}

/**
 * Obtains the display name of a user by using the Admin Directory API.
 *
 * The fetched display name is cached in the provided map, so we only call the API
 * once per user.
 *
 * If the user does not have a display name, then the full name is used.
 *
 * @param {Map} userMap a map containing the display names previously fetched
 * @param {string} userName the resource name of the user
 * @return {string} the user's display name
 */
function getUserDisplayName_(userMap, userName) {
  if (userMap.has(userName)) {
    return userMap.get(userName);
  }
  let displayName = 'Unknown User';
  try {
    const user = AdminDirectory.Users.get(
      userName.replace("users/", ""),
      { projection: 'BASIC', viewType: 'domain_public' });
    displayName = user.name.displayName ? user.name.displayName : user.name.fullName;
  } catch (e) {
    // Ignore error if the API call fails (for example, because it's an
    // out-of-domain user or Chat app)) and just use 'Unknown User'.
  }
  userMap.set(userName, displayName);
  return displayName;
}
ChatSpaceCreator.gs

داده‌های فرمی که کاربران در صفحه وب مقداردهی اولیه حادثه وارد می‌کنند را دریافت می‌کند و با ایجاد و پر کردن آن، از آن برای راه‌اندازی یک فضای چت استفاده می‌کند و سپس پیامی در مورد حادثه ارسال می‌کند.

مشاهده کد ChatSpaceCreator.gs

اسکریپت برنامه‌ها/پاسخ به حادثه/ChatSpaceCreator.gs
/**
 * Creates a space in Google Chat with the provided title and members, and posts an
 * initial message to it.
 *
 * @param {Object} formData the data submitted by the user. It should contain the fields
 *                          title, description, and users.
 * @return {string} the resource name of the new space.
 */
function createChatSpace(formData) {
  const users = formData.users.trim().length > 0 ? formData.users.split(',') : [];
  const spaceName = setUpSpace_(formData.title, users);
  addAppToSpace_(spaceName);
  createMessage_(spaceName, formData.description);
  return spaceName;
}

/**
 * Creates a space in Google Chat with the provided display name and members.
 *
 * @return {string} the resource name of the new space.
 */
function setUpSpace_(displayName, users) {
  const memberships = users.map(email => ({
    member: {
      name: `users/${email}`,
      type: "HUMAN"
    }
  }));
  const request = {
    space: {
      displayName: displayName,
      spaceType: "SPACE",
      externalUserAllowed: true
    },
    memberships: memberships
  };
  // Call Chat API method spaces.setup
  const space = Chat.Spaces.setup(request);
  return space.name;
}

/**
 * Adds this Chat app to the space.
 *
 * @return {string} the resource name of the new membership.
 */
function addAppToSpace_(spaceName) {
  const request = {
    member: {
      name: "users/app",
      type: "BOT"
    }
  };
  // Call Chat API method spaces.members.create
  const membership = Chat.Spaces.Members.create(request, spaceName);
  return membership.name;
}

/**
 * Posts a text message to the space on behalf of the user.
 *
 * @return {string} the resource name of the new message.
 */
function createMessage_(spaceName, text) {
  const request = {
    text: text
  };
  // Call Chat API method spaces.messages.create
  const message = Chat.Spaces.Messages.create(request, spaceName);
  return message.name;
}
DocsApi.gs

API مربوط به Google Docs را فراخوانی می‌کند تا یک سند Google Docs در Google Drive کاربر ایجاد کند و خلاصه‌ای از اطلاعات حادثه که در VertexAiApi.gs ایجاد شده است را در سند می‌نویسد.

مشاهده کد DocsApi.gs

اسکریپت برنامه‌ها/پاسخ به حادثه/DocsApi.gs
/**
 * Creates a Doc in the user's Google Drive and writes a summary of the incident information to it.
 *
 * @param {string} title The title of the incident
 * @param {string} resolution Incident resolution described by the user
 * @param {string} chatHistory The whole Chat history be included in the document
 * @param {string} chatSummary A summary of the Chat conversation to be included in the document
 * @return {string} the URL of the created Doc
 */
function createDoc_(title, resolution, chatHistory, chatSummary) {
  let doc = DocumentApp.create(title);
  let body = doc.getBody();
  body.appendParagraph(`Post-Mortem: ${title}`).setHeading(DocumentApp.ParagraphHeading.TITLE);
  body.appendParagraph("Resolution").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(resolution);
  body.appendParagraph("Summary of the conversation").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(chatSummary);
  body.appendParagraph("Full Chat history").setHeading(DocumentApp.ParagraphHeading.HEADING1);
  body.appendParagraph(chatHistory);
  return doc.getUrl();
}
VertexAiApi.gs

مکالمه را در فضای چت با استفاده از Vertex AI خلاصه می‌کند. این خلاصه در یک سند ویژه ایجاد شده در DocsAPI.gs منتشر می‌شود.

مشاهده کد VertexAiApi.gs

اسکریپت برنامه‌ها/پاسخ به حادثه/VertexAiApi.gs
/**
 * Summarizes a Chat conversation using the Vertex AI text prediction API.
 *
 * @param {string} chatHistory The Chat history that will be summarized.
 * @return {string} The content from the text prediction response.
 */
function summarizeChatHistory_(chatHistory) {
  const prompt =
    "Summarize the following conversation between Engineers resolving an incident"
      + " in a few sentences. Use only the information from the conversation.\n\n"
      + chatHistory;
  const request = {
    instances: [
      { prompt: prompt }
    ],
    parameters: {
      temperature: 0.2,
      maxOutputTokens: 256,
      topK: 40,
      topP: 0.95
    }
  }
  const fetchOptions = {
    method: 'POST',
    headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
    contentType: 'application/json',
    payload: JSON.stringify(request)
  }
  const response = UrlFetchApp.fetch(
    `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1`
      + `/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}`
      + "/publishers/google/models/text-bison:predict",
    fetchOptions);
  const payload = JSON.parse(response.getContentText());
  return payload.predictions[0].content;
}
WebController.gs

وب‌سایت مقداردهی اولیه حادثه را ارائه می‌دهد.

مشاهده کد WebController.gs

apps-script/incident-response/WebController.gs
/**
 * Serves the web page from Index.html.
 */
function doGet() {
  return HtmlService
    .createTemplateFromFile('Index')
    .evaluate();
}

/**
 * Serves the web content from the specified filename.
 */
function include(filename) {
  return HtmlService
    .createHtmlOutputFromFile(filename)
    .getContent();
}

/**
 * Returns the email address of the user running the script.
 */
function getUserEmail() {
  return Session.getActiveUser().getEmail();
}
Index.html

HTML شامل وب‌سایت مقداردهی اولیه حادثه.

مشاهده کد Index.html

اسکریپت برنامه‌ها/پاسخ به حادثه/ایندکس.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link href='https://fonts.googleapis.com/css?family=Roboto' rel='stylesheet'>
    <?!= include('Stylesheet'); ?>
  </head>
  <body>
    <div class="container">
      <div class="content">
        <h1>Incident Manager</h1>
        <form id="incident-form" onsubmit="handleFormSubmit(this)">
          <div id="form">
            <p>
              <label for="title">Incident title</label><br/>
              <input type="text" name="title" id="title" />
            </p>
            <p>
              <label for="users">Incident responders</label><br/>
              <small>
                Please enter a comma-separated list of email addresses of the users
                that should be added to the space.
                Do not include <?= getUserEmail() ?> as it will be added automatically.
              </small><br/>
              <input type="text" name="users" id="users" />
            </p>
            <p>
              <label for="description">Initial message</label></br>
              <small>This message will be posted after the space is created.</small><br/>
              <textarea name="description" id="description"></textarea>
            </p>
            <p class="text-center">
              <input type="submit" value="CREATE CHAT SPACE" />
            </p>
          </div>
          <div id="output" class="hidden"></div>
          <div id="clear" class="hidden">
            <input type="reset" value="CREATE ANOTHER INCIDENT" onclick="onReset()" />
          </div>
        </form>
      </div>
    </div>
    <?!= include('JavaScript'); ?>
  </body>
</html>
JavaScript.html

رفتارهای فرم شامل ارسال‌ها، خطاها و پاک کردن‌ها را برای وب‌سایت مقداردهی اولیه حادثه مدیریت می‌کند. این مورد توسط تابع include سفارشی در WebController.gs در Index.html گنجانده شده است.

مشاهده کد JavaScript.html

اسکریپت برنامه‌ها/پاسخ به حادثه/جاوااسکریپت.html
<script>
  var formDiv = document.getElementById('form');
  var outputDiv = document.getElementById('output');
  var clearDiv = document.getElementById('clear');

  function handleFormSubmit(formObject) {
    event.preventDefault();
    outputDiv.innerHTML = 'Please wait while we create the space...';
    hide(formDiv);
    show(outputDiv);
    google.script.run
      .withSuccessHandler(updateOutput)
      .withFailureHandler(onFailure)
      .createChatSpace(formObject);
  }

  function updateOutput(response) {
    var spaceId = response.replace('spaces/', '');
    outputDiv.innerHTML =
      '<p>Space created!</p><p><a href="https://mail.google.com/chat/#chat/space/'
        + spaceId
        + '" target="_blank">Open space</a></p>';
    show(outputDiv);
    show(clearDiv);
  }

  function onFailure(error) {
    outputDiv.innerHTML = 'ERROR: ' + error.message;
    outputDiv.classList.add('error');
    show(outputDiv);
    show(clearDiv);
  }

  function onReset() {
    outputDiv.innerHTML = '';
    outputDiv.classList.remove('error');
    show(formDiv);
    hide(outputDiv);
    hide(clearDiv);
  }

  function hide(element) {
    element.classList.add('hidden');
  }

  function show(element) {
    element.classList.remove('hidden');
  }
</script>
Stylesheet.html

CSS مربوط به وب‌سایت مقداردهی اولیه‌ی رویداد. این فایل توسط تابع include سفارشی در WebController.gs در Index.html گنجانده شده است.

مشاهده کد Stylesheet.html

اسکریپت برنامه‌ها/پاسخ به حادثه/Stylesheet.html
<style>
  * {
    box-sizing: border-box;
  }
  body {
    font-family: Roboto, Arial, Helvetica, sans-serif;
  }
  div.container {
    display: flex;
    justify-content: center;
    align-items: center;
    position: absolute;
    top: 0; bottom: 0; left: 0; right: 0;
  }
  div.content {
    width: 80%;
    max-width: 1000px;
    padding: 1rem;
    border: 1px solid #999;
    border-radius: 0.25rem;
    box-shadow: 0 2px 2px 0 rgba(66, 66, 66, 0.08), 0 2px 4px 2px rgba(66, 66, 66, 0.16);
  }
  h1 {
    text-align: center;
    padding-bottom: 1rem;
    margin: 0 -1rem 1rem -1rem;
    border-bottom: 1px solid #999;
  }
 #output {
    text-align: center;
    min-height: 250px;
  }
  div#clear {
    text-align: center;
    padding-top: 1rem;
    margin: 1rem -1rem 0 -1rem;
    border-top: 1px solid #999;
  }
  input[type=text], textarea {
    width: 100%;
    padding: 1rem 0.5rem;
    margin: 0.5rem 0;
    border: 0;
    border-bottom: 1px solid #999;
    background-color: #f0f0f0;
  }
  textarea {
    height: 5rem;
  }
  small {
    color: #999;
  }
  input[type=submit], input[type=reset] {
    padding: 1rem;
    border: none;
    background-color: #6200ee;
    color: #fff;
    border-radius: 0.25rem;
    width: 25%;
  }
  .hidden {
    display: none;
  }
  .text-center {
    text-align: center;
  }
  .error {
    color: red;
  }
</style>

شماره و شناسه پروژه ابری خود را پیدا کنید

  1. در کنسول گوگل کلود، به پروژه کلود خود بروید.

    به کنسول گوگل کلود بروید

  2. روی تنظیمات و ابزارها کلیک کنید > تنظیمات پروژه .

  3. به مقادیر فیلدهای شماره پروژه و شناسه پروژه توجه کنید. می‌توانید از آنها در بخش‌های بعدی استفاده کنید.

پروژه Apps Script را ایجاد کنید

برای ایجاد یک پروژه Apps Script و اتصال آن به پروژه Cloud خود:

  1. برای باز کردن پروژه Respond to events with Google Chat Apps Script، روی دکمه زیر کلیک کنید.
    پروژه را باز کنید
  2. روی نمای کلی کلیک کنید.
  3. در صفحه مرور کلی، کلیک کنید آیکون مربوط به کپی کردن یک کپی تهیه کنید .
  4. نام نسخه خود از پروژه Apps Script را بنویسید:

    1. روی کپی از پاسخ به رویدادها با Google Chat کلیک کنید.

    2. در عنوان پروژه ، عبارت Incident Management Chat app تایپ کنید.

    3. روی تغییر نام کلیک کنید.

  5. در کپی پروژه Apps Script خود، به فایل Consts.gs بروید و YOUR_PROJECT_ID با شناسه پروژه Cloud خود جایگزین کنید.

پروژه Cloud مربوط به پروژه Apps Script را تنظیم کنید.

  1. در پروژه Apps Script خود، کلیک کنید آیکون مربوط به تنظیمات پروژه تنظیمات پروژه .
  2. در زیر پروژه پلتفرم ابری گوگل (GCP) ، روی تغییر پروژه کلیک کنید.
  3. در قسمت شماره پروژه GCP ، شماره پروژه ابری خود را وارد کنید.
  4. روی تنظیم پروژه کلیک کنید. پروژه Cloud و پروژه Apps Script اکنون به هم متصل شده‌اند.

ایجاد یک استقرار اسکریپت برنامه‌ها

حالا که همه کدها سر جای خودشان هستند، پروژه Apps Script را مستقر کنید. هنگام پیکربندی برنامه چت در Google Cloud از شناسه استقرار استفاده می‌کنید.

  1. در Apps Script، پروژه برنامه واکنش به حادثه را باز کنید.

    به اسکریپت برنامه‌ها بروید

  2. روی استقرار > استقرار جدید کلیک کنید.

  3. اگر افزونه و برنامه وب از قبل انتخاب نشده‌اند، در کنار انتخاب نوع ، روی انواع استقرار کلیک کنید. آیکون مربوط به تنظیمات پروژه و افزونه و برنامه وب را انتخاب کنید.

  4. در قسمت توضیحات ، توضیحی برای این نسخه وارد کنید، مانند Complete version of incident management app .

  5. در قسمت Execute as ، گزینه User accessing the web app را انتخاب کنید.

  6. در بخش «چه کسی دسترسی دارد »، گزینه «هر کسی که در سازمان فضای کاری شما باشد » را انتخاب کنید، که در آن «سازمان فضای کاری شما» نام سازمان Google Workspace شما است.

  7. روی Deploy کلیک کنید. Apps Script استقرار موفقیت‌آمیز را گزارش می‌دهد و یک شناسه استقرار و یک URL برای صفحه وب مقداردهی اولیه حادثه ارائه می‌دهد.

  8. آدرس اینترنتی برنامه وب را یادداشت کنید تا بعداً هنگام شروع یک رویداد به آن مراجعه کنید. شناسه استقرار را کپی کنید. شما از این شناسه هنگام پیکربندی برنامه چت در کنسول Google Cloud استفاده می‌کنید.

  9. روی انجام شد کلیک کنید.

پیکربندی برنامه چت در کنسول گوگل کلود

این بخش نحوه پیکربندی Google Chat API در کنسول Google Cloud را با اطلاعات مربوط به برنامه چت شما، از جمله شناسه استقراری که از پروژه Apps Script خود ایجاد کرده‌اید، نشان می‌دهد.

  1. در کنسول گوگل کلود، > محصولات بیشتر > فضای کاری گوگل > کتابخانه محصولات > رابط برنامه‌نویسی کاربردی گوگل چت > مدیریت > پیکربندی کلیک کنید.

    به پیکربندی API چت بروید

  2. پاک کردن «این برنامه گپ را به عنوان یک افزونه Google Workspace بسازید» . یک کادر محاوره‌ای باز می‌شود که از شما می‌خواهد تأیید کنید. در کادر محاوره‌ای، روی غیرفعال کردن کلیک کنید.

  3. در قسمت نام برنامه ، عبارت Incident Management تایپ کنید.

  4. در قسمت آدرس اینترنتی آواتار ، https://developers.google.com/chat/images/quickstart-app-avatar.png را تایپ کنید.

  5. در قسمت توضیحات ، عبارت Responds to incidents.

  6. روی گزینه‌ی «فعال کردن ویژگی‌های تعاملی» کلیک کنید تا فعال شود.

  7. در بخش عملکرد ، گزینه «پیوستن به فضاها و مکالمات گروهی» را انتخاب کنید.

  8. در بخش تنظیمات اتصال ، گزینه Apps Script را انتخاب کنید.

  9. در بخش Deployment ID ، شناسه‌ی Apps Script Deployment را که قبلاً از فایل پیاده‌سازی پروژه‌ی Apps Script کپی کرده بودید، جای‌گذاری کنید.

  10. یک دستور اسلش ثبت کنید که برنامه چت کاملاً پیاده‌سازی شده از آن استفاده کند:

    1. در زیر دستورات اسلش ، روی افزودن یک دستور اسلش کلیک کنید.

    2. در قسمت نام ، عبارت Close incident تایپ کنید.

    3. در قسمت شناسه فرمان ، 1 را تایپ کنید.

    4. در قسمت توضیحات ، نوع Closes the incident being discussed in the space.

    5. در قسمت نوع فرمان ، دستور Slash را انتخاب کنید.

    6. در نام دستور Slash ، عبارت /closeIncident را تایپ کنید.

    7. انتخاب کنید. یک کادر محاوره‌ای باز می‌شود .

    8. روی «انجام شد» کلیک کنید. دستور اسلش ثبت و فهرست شده است.

  11. در قسمت «قابلیت مشاهده» ، گزینه «این برنامه چت را برای افراد و گروه‌های خاص در دامنه فضای کاری خود در دسترس قرار دهید» را انتخاب کنید و آدرس ایمیل خود را وارد کنید.

  12. در قسمت گزارش‌ها ، گزینه ثبت خطاها را برای ثبت گزارش‌ها انتخاب کنید.

  13. روی ذخیره کلیک کنید. یک پیام ذخیره پیکربندی ظاهر می‌شود، به این معنی که برنامه آماده آزمایش است.

برنامه چت را آزمایش کنید

برای آزمایش برنامه چت مدیریت حادثه، یک حادثه را از صفحه وب آغاز کنید و تأیید کنید که برنامه چت طبق انتظار کار می‌کند:

  1. به آدرس اینترنتی برنامه وب استقرار اسکریپت برنامه‌ها بروید.

  2. وقتی Apps Script از شما اجازه دسترسی به داده‌هایتان را می‌خواهد، روی «بررسی مجوزها» کلیک کنید، با یک حساب Google مناسب در دامنه Google Workspace خود وارد شوید و روی «مجاز» کلیک کنید.

  3. صفحه وب مقداردهی اولیه حادثه باز می‌شود. اطلاعات آزمایشی را وارد کنید:

    1. در قسمت عنوان حادثه ، The First Incident تایپ کنید.
    2. در صورت تمایل، در بخش پاسخگویان حادثه ، آدرس ایمیل سایر پاسخگویان حادثه خود را وارد کنید. آنها باید کاربرانی با حساب کاربری گوگل چت در سازمان Google Workspace شما باشند، در غیر این صورت ایجاد فضا با شکست مواجه می‌شود. آدرس ایمیل خود را وارد نکنید زیرا به طور خودکار اضافه می‌شود.
    3. در پیام اولیه ، عبارت Testing the incident management Chat app.
  4. روی ایجاد فضای گفتگو کلیک کنید. یک پیام creating space ظاهر می‌شود.

  5. پس از ایجاد فضا، پیام Space created! » ظاهر می‌شود. روی «باز کردن فضا » کلیک کنید تا فضا در چت در یک برگه جدید باز شود.

  6. در صورت تمایل، شما و دیگر پاسخ‌دهندگان به حادثه می‌توانید در این فضا پیام ارسال کنید. این برنامه با استفاده از هوش مصنوعی Vertex این پیام‌ها را خلاصه کرده و یک سند گذشته‌نگر به اشتراک می‌گذارد.

  7. برای پایان دادن به پاسخ به حادثه و شروع فرآیند حل و فصل، در فضای چت، عبارت /closeIncident را تایپ کنید. یک کادر محاوره‌ای مدیریت حادثه باز می‌شود.

  8. در بخش «بستن حادثه» ، توضیحی برای رفع حادثه وارد کنید، مانند Test complete ».

  9. روی بستن حادثه کلیک کنید.

برنامه مدیریت حادثه پیام‌های موجود در فضا را فهرست می‌کند، آنها را با Vertex AI خلاصه می‌کند، خلاصه را در یک سند Google Docs قرار می‌دهد و سند را در فضا به اشتراک می‌گذارد.

تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این آموزش، توصیه می‌کنیم پروژه Cloud را حذف کنید.

  1. در کنسول گوگل کلود، به صفحه مدیریت منابع بروید. روی منو > مدیریت و دسترسی به منابع (IAM & Admin) > مدیریت منابع (Manage Resources) کلیک کنید.

    به مدیریت منابع بروید

  2. در لیست پروژه‌ها، پروژه‌ای را که می‌خواهید حذف کنید انتخاب کنید و سپس روی «حذف کلیک کنید.
  3. در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن (Shut down) کلیک کنید.