Merespons insiden dengan Google Chat, Vertex AI, dan Apps Script

Tutorial ini menggunakan cakupan otorisasi yang dimulai dengan https://www.googleapis.com/auth/chat.app.*, yang tersedia sebagai bagian dari Pratinjau Developer, aplikasi Chat Anda harus mendapatkan persetujuan administrator satu kali.

Tutorial ini menunjukkan cara membuat aplikasi Google Chat yang merespons insiden secara real time. Saat merespons insiden, aplikasi akan membuat dan mengisi ruang Chat, memfasilitasi penyelesaian insiden dengan pesan, perintah garis miring, dan dialog, serta menggunakan AI untuk meringkas respons insiden dalam dokumen Google Dokumen.

Insiden adalah peristiwa yang memerlukan perhatian segera dari tim orang untuk menyelesaikannya. Contoh insiden meliputi:

  • Kasus yang mendesak dibuat di platform Pengelolaan Hubungan Pelanggan (CRM), yang mengharuskan tim layanan berkolaborasi untuk menyelesaikannya.
  • Sistem offline, yang akan memberi tahu sekelompok engineer keandalan situs (SRE) sehingga mereka dapat bekerja sama untuk mengaktifkannya kembali.
  • Gempa bumi berkekuatan tinggi terjadi, dan petugas darurat perlu melakukan koordinasi respons.

Untuk tujuan tutorial ini, pemberitahuan insiden dimulai saat seseorang melaporkan insiden dengan mengklik tombol dari halaman web. Halaman web menyimulasikan insiden dengan meminta pengguna memasukkan informasi insiden dasar: judul, deskripsi, dan alamat email responden.

Lihat cara kerja aplikasi Chat pengelolaan insiden:

  • Situs yang memulai insiden.
    Gambar 1. Situs tempat seseorang dapat melaporkan insiden.
  • Notifikasi bahwa ruang Chat insiden telah dibuat.
    Gambar 2. Notifikasi bahwa ruang Chat insiden telah dibuat.
  • Ruang Chat respons insiden.
    Gambar 3. Ruang Chat respons insiden.
  • Menyelesaikan insiden dengan perintah garis miring.
    Gambar 4. Menyelesaikan insiden dengan perintah garis miring.
  • Dialog penyelesaian insiden.
    Gambar 5. Dialog penyelesaian insiden.
  • Dokumen Google Dokumen penyelesaian insiden yang dibagikan di ruang.
    Gambar 6. Dokumen Google Dokumen penyelesaian insiden yang dibagikan di ruang.
  • Dokumen Google penyelesaian insiden ringkasan AI.
    Gambar 7. Dokumen Google Dokumen penyelesaian insiden ringkasan AI.

Prasyarat

Jika Anda perlu mengaktifkan salah satu prasyarat ini untuk organisasi Anda, minta administrator Google Workspace untuk mengaktifkannya:

  • Akun Google Workspace Business atau Enterprise dengan akses ke Google Chat.
  • Agar Direktori (berbagi kontak) diaktifkan untuk Google Workspace. Aplikasi insiden menggunakan direktori untuk mencari info kontak responden insiden, seperti nama dan alamat email. Responsi insiden harus berupa pengguna dengan akun Google Chat di organisasi Google Workspace Anda.

Tujuan

  • Buat aplikasi Chat yang merespons insiden.
  • Bantu pengguna merespons insiden dengan melakukan hal berikut:
    • Membuat ruang respons insiden.
    • Memposting pesan yang merangkum insiden dan respons.
    • Mendukung kolaborasi dengan fitur aplikasi Chat interaktif.
  • Merangkum percakapan dan resolusi dengan Vertex AI.

Arsitektur

Diagram berikut menunjukkan arsitektur resource Google Workspace dan Google Cloud yang digunakan oleh aplikasi Google Chat respons insiden.

Arsitektur aplikasi Google Chat respons insiden

Arsitektur ini menunjukkan cara aplikasi Google Chat respons insiden memproses insiden dan penyelesaian.

  1. Pengguna memulai insiden dari situs eksternal yang dihosting di Apps Script.

  2. Situs mengirimkan permintaan HTTP asinkron ke aplikasi Google Chat, yang juga dihosting di Apps Script.

  3. Aplikasi Google Chat respons insiden memproses permintaan:

    1. Layanan Admin SDK Apps Script mendapatkan informasi anggota tim, seperti ID pengguna dan alamat email.

    2. Dengan serangkaian permintaan HTTP ke Chat API menggunakan layanan Chat Lanjutan Apps Script, aplikasi Google Chat respons insiden akan membuat ruang Chat insiden, mengisinya dengan anggota tim, dan mengirim pesan ke ruang tersebut.

  4. Anggota tim membahas insiden tersebut di ruang Chat.

  5. Anggota tim memanggil perintah garis miring untuk menandakan penyelesaian insiden.

    1. Panggilan HTTP ke Chat API menggunakan layanan Chat Lanjutan Apps Script mencantumkan semua pesan ruang Chat.

    2. Vertex AI menerima pesan yang tercantum dan membuat ringkasan.

    3. Layanan DocumentApp Apps Script membuat dokumen Dokumen dan menambahkan ringkasan Vertex AI ke dokumen.

    4. Aplikasi Google Chat respons insiden memanggil Chat API untuk mengirim pesan yang membagikan link ke dokumen Dokumen ringkasan.

Menyiapkan lingkungan

Bagian ini menunjukkan cara membuat dan mengonfigurasi project Google Cloud untuk aplikasi Chat.

Membuat project Google Cloud

Konsol Google Cloud

  1. Di konsol Google Cloud, buka Menu > IAM & Admin > Create a Project.

    Buka Membuat Project

  2. Di kolom Project Name, masukkan nama deskriptif untuk project Anda.

    Opsional: Untuk mengedit Project ID, klik Edit. Project ID tidak dapat diubah setelah project dibuat, jadi pilih ID yang sesuai dengan kebutuhan Anda sepanjang waktu project tersebut.

  3. Di kolom Location, klik Browse untuk menampilkan lokasi potensial untuk project Anda. Kemudian, klik Select.
  4. Klik Create. Konsol Google Cloud akan membuka halaman Dasbor dan project Anda akan dibuat dalam beberapa menit.

gcloud CLI

Di salah satu lingkungan pengembangan berikut, akses Google Cloud CLI (gcloud):

  • Cloud Shell: Untuk menggunakan terminal online dengan gcloud CLI yang sudah disiapkan, aktifkan Cloud Shell.
    Aktifkan Cloud Shell
  • Shell Lokal: Untuk menggunakan lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI.
    Untuk membuat project Cloud, gunakan perintah gcloud projects create:
    gcloud projects create PROJECT_ID
    Ganti PROJECT_ID dengan menetapkan ID untuk project yang ingin Anda buat.

Mengaktifkan penagihan untuk project Cloud

Konsol Google Cloud

  1. Di konsol Google Cloud, buka Penagihan. Klik Menu > Penagihan > Project Saya.

    Buka Penagihan untuk Project Saya

  2. Di Pilih organisasi, pilih organisasi yang terkait dengan project Google Cloud Anda.
  3. Di baris project, buka menu Actions (), klik Change billing, lalu pilih akun Penagihan Cloud.
  4. Klik Tetapkan akun.

gcloud CLI

  1. Untuk mencantumkan akun penagihan yang tersedia, jalankan:
    gcloud billing accounts list
  2. Menautkan akun penagihan dengan project Google Cloud:
    gcloud billing projects link PROJECT_ID --billing-account=BILLING_ACCOUNT_ID

    Ganti kode berikut:

    • PROJECT_ID adalah Project ID untuk project Cloud yang penagihannya ingin Anda aktifkan.
    • BILLING_ACCOUNT_ID adalah ID akun penagihan yang akan ditautkan dengan project Google Cloud.

Mengaktifkan API

Konsol Google Cloud

  1. Di konsol Google Cloud, aktifkan Google Chat API, Google Dokumen API, Admin SDK API, Google Workspace Marketplace SDK, dan Vertex AI API.

    Aktifkan API

  2. Pastikan Anda mengaktifkan API di project Cloud yang benar, lalu klik Berikutnya.

  3. Pastikan Anda mengaktifkan API yang benar, lalu klik Enable.

gcloud CLI

  1. Jika perlu, tetapkan project Cloud saat ini ke project yang Anda buat dengan perintah gcloud config set project:

    gcloud config set project PROJECT_ID

    Ganti PROJECT_ID dengan Project ID dari project Cloud yang Anda buat.

  2. Aktifkan Google Chat API, Google Dokumen API, Admin SDK API, Google Workspace Marketplace SDK, dan Vertex AI API dengan perintah gcloud services enable:

    gcloud services enable chat.googleapis.com docs.googleapis.com admin.googleapis.com aiplatform.googleapis.com appsmarket-component.googleapis.com

Menyiapkan autentikasi dan otorisasi

Aplikasi Chat mengakses Google Chat API menggunakan kredensial aplikasi Chat. Aplikasi mengakses Admin SDK API dan Google Dokumen API dengan kredensial pengguna.

Menyiapkan autentikasi dan otorisasi pengguna

Autentikasi dan otorisasi memungkinkan aplikasi Chat mengakses resource di Google Workspace dan Google Cloud untuk memproses respons insiden. Secara khusus, autentikasi pengguna digunakan untuk memanggil Google Docs API dan Admin SDK API.

Dalam tutorial ini, Anda memublikasikan aplikasi secara internal ke domain Workspace, sehingga Anda dapat menggunakan informasi placeholder. Sebelum memublikasikan aplikasi secara eksternal, ganti informasi placeholder dengan informasi sebenarnya di layar izin.

  1. Di konsol Google Cloud, buka Menu > > Branding.

    Buka Branding

  2. Jika telah mengonfigurasi , Anda dapat mengonfigurasi setelan Layar Izin OAuth berikut di Branding, Audiens, dan Akses Data. Jika Anda melihat pesan yang bertuliskan not configured yet, klik Get Started:

    1. Di bagian Informasi Aplikasi, di Nama aplikasi, ketik Incident Management.
    2. Di User support email, pilih alamat email Anda atau grup Google yang sesuai.
    3. Klik Berikutnya.
    4. Di bagian Audiens, pilih Internal. Jika Anda tidak dapat memilih Internal, pilih Eksternal.
    5. Klik Berikutnya.
    6. Di bagian Informasi Kontak, masukkan Alamat email tempat Anda dapat diberi tahu tentang perubahan apa pun pada project Anda.
    7. Klik Berikutnya.
    8. Di bagian Selesai, tinjau Kebijakan Data Pengguna Layanan Google API dan jika Anda setuju, pilih Saya setuju dengan Layanan Google API: Kebijakan Data Pengguna.
    9. Klik Lanjutkan.
    10. Klik Create.
    11. Jika Anda memilih Eksternal untuk jenis pengguna, tambahkan pengguna pengujian:
      1. Klik Audiens.
      2. Di bagian Pengguna pengujian, klik Tambahkan pengguna.
      3. Masukkan alamat email Anda dan pengguna pengujian resmi lainnya, lalu klik Simpan.
  3. Klik Akses Data > Tambahkan atau Hapus cakupan. Panel akan muncul dengan daftar cakupan untuk setiap API yang telah Andaaktifkan di project Google Cloud.

    1. Di bagian Tambahkan cakupan secara manual, tempel cakupan berikut:

      • 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. Klik Tambahkan ke Tabel.

    3. Klik Perbarui.

    4. Setelah memilih cakupan yang diperlukan oleh aplikasi Anda, di halaman Akses Data, klik Simpan.

Menyiapkan autentikasi dan otorisasi aplikasi

Autentikasi Aplikasi digunakan untuk memanggil Google Chat API.

Membuat akun layanan di konsol Google Cloud

Untuk membuat akun layanan, ikuti langkah-langkah berikut:

Konsol Google Cloud

  1. Di konsol Google Cloud, buka Menu > IAM & Admin > Service Accounts.

    Buka Akun Layanan

  2. Klik Create service account.
  3. Isi detail akun layanan, lalu klik Buat dan lanjutkan.
  4. Opsional: Tetapkan peran ke akun layanan untuk memberikan akses ke resource project Google Cloud Anda. Untuk mengetahui detail selengkapnya, lihat Memberikan, mengubah, dan mencabut akses ke resource.
  5. Klik Lanjutkan.
  6. Opsional: Masukkan pengguna atau grup yang dapat mengelola dan melakukan tindakan dengan akun layanan ini. Untuk mengetahui detail selengkapnya, lihat Mengelola peniruan identitas akun layanan.
  7. Klik Selesai. Catat alamat email untuk akun layanan.

gcloud CLI

  1. Buat akun layanan:
    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name="SERVICE_ACCOUNT_NAME"
  2. Opsional: Tetapkan peran ke akun layanan untuk memberikan akses ke resource project Google Cloud Anda. Untuk mengetahui detail selengkapnya, lihat Memberikan, mengubah, dan mencabut akses ke resource.

Akun layanan akan muncul di halaman akun layanan. Selanjutnya, buat kunci pribadi untuk akun layanan.

Membuat kunci pribadi

Untuk membuat dan mendownload kunci pribadi untuk akun layanan, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud, buka Menu > IAM & Admin > Service Accounts.

    Buka Akun Layanan

  2. Pilih akun layanan Anda.
  3. Klik Keys > Add key > Create new key.
  4. Pilih JSON, lalu klik Create.

    Pasangan kunci umum/pribadi baru Anda dibuat dan didownload ke komputer sebagai file baru. Simpan file JSON yang didownload sebagai credentials.json di direktori kerja Anda. File ini adalah satu-satunya salinan kunci ini. Untuk informasi tentang cara menyimpan kunci dengan aman, lihat Mengelola kunci akun layanan.

  5. Klik Tutup.

Untuk mengetahui informasi selengkapnya tentang akun layanan, lihat akun layanan dalam dokumentasi IAM Google Cloud.

Membuat klien OAuth yang kompatibel dengan Google Workspace Marketplace

Untuk membuat klien OAuth yang kompatibel dengan Google Workspace Marketplace, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud, buka Menu > IAM & Admin > Service Accounts.

    Buka Akun Layanan

  2. Klik akun layanan yang Anda buat untuk aplikasi Chat.

  3. Klik Setelan lanjutan.

  4. Klik Buat klien OAuth yang kompatibel dengan Google Workspace Marketplace.

  5. Klik Lanjutkan.

Pesan konfirmasi akan muncul yang menyatakan bahwa klien OAuth yang kompatibel dengan Google Workspace Marketplace telah dibuat.

Membuat dan men-deploy aplikasi Chat

Di bagian berikut, Anda akan menyalin dan memperbarui seluruh project Apps Script yang berisi semua kode aplikasi yang diperlukan untuk aplikasi Chat, sehingga Anda tidak perlu menyalin dan menempelkan setiap file.

Beberapa fungsi menyertakan garis bawah di akhir namanya, seperti processSlashCommand_() dari ChatApp.gs. Tanda garis bawah menyembunyikan fungsi dari halaman web inisialisasi insiden saat dibuka di browser. Untuk mengetahui informasi selengkapnya, lihat Fungsi pribadi.

Apps Script mendukung dua jenis file, skrip .gs dan file .html. Untuk mematuhi dukungan ini, JavaScript sisi klien aplikasi disertakan di dalam tag <script /> dan CSS-nya disertakan di dalam tag <style /> di dalam file HTML.

Secara opsional, Anda dapat melihat seluruh project di GitHub.

Lihat di GitHub

Berikut ringkasan setiap file:

Consts.gs

Menentukan konstanta yang dirujuk oleh file kode lain, termasuk project ID Cloud, ID lokasi Vertex AI, kredensial aplikasi untuk akun layanan, dan ID perintah garis miring untuk menutup insiden.

Lihat kode Consts.gs

apps-script/incident-response-app-auth/Consts.gs
const PROJECT_ID = 'replace-with-your-project-id';
const CLOSE_INCIDENT_COMMAND_ID = 1;
const APP_CREDENTIALS = 'replace-with-your-app-credentials';
const APP_CREDENTIALS_SCOPES = 'https://www.googleapis.com/auth/chat.bot https://www.googleapis.com/auth/chat.app.memberships https://www.googleapis.com/auth/chat.app.spaces.create';
const VERTEX_AI_LOCATION_ID = 'us-central1';
const MODEL_ID = 'gemini-1.5-flash-002';
ChatApp.gs

Menangani peristiwa interaksi Chat, termasuk pesan, klik kartu, perintah garis miring, dan dialog. Merespons perintah garis miring /closeIncident dengan membuka dialog untuk mengumpulkan detail penyelesaian insiden. Membaca pesan di ruang dengan memanggil metode spaces.messages.list di Chat API. Mendapatkan ID pengguna menggunakan layanan Direktori Admin SDK di Apps Script.

Lihat kode ChatApp.gs

apps-script/incident-response-app-auth/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

Menerima data formulir yang dimasukkan pengguna di halaman web inisialisasi insiden, dan menggunakannya untuk menyiapkan ruang Chat dengan membuatnya dan mengisinya, lalu memposting pesan tentang insiden.

Lihat kode ChatSpaceCreator.gs

apps-script/incident-response-app-auth/ChatSpaceCreator.gs
/**
 * Handles an incident by creating a chat space, adding members, and posting a message.
 * All the actions are done using application credentials.
 *
 * @param {Object} formData - The data submitted by the user. It should contain the fields:
 *                           - title: The display name of the chat space.
 *                           - description: The description of the incident.
 *                           - users: A comma-separated string of user emails to be added to the space.
 * @return {string} The resource name of the new space.
 */
function handleIncident(formData) {
  const users = formData.users.trim().length > 0 ? formData.users.split(',') : [];
  const service = getService_();
  if (!service.hasAccess()) {
    console.error(service.getLastError());
    return;
   }
  const spaceName = createChatSpace_(formData.title, service);
  createHumanMembership_(spaceName, getUserEmail(), service);
  for (const user of users ){
    createHumanMembership_(spaceName, user, service);
  }
  createMessage_(spaceName, formData.description, service);
  return spaceName;
}
/**
 * Creates a chat space with application credentials.
 *
 * @param {string} displayName - The name of the chat space.
 * @param {object} service - The credentials of the service account.
 * @returns {string} The resource name of the new space.
*/
function createChatSpace_(displayName, service) {
  try {
    // For private apps, the alias can be used
    const my_customer_alias = "customers/my_customer";
    // Specify the space to create.
    const space = {
        displayName: displayName,
        spaceType: 'SPACE',                
        customer: my_customer_alias
    };
    // Call Chat API with a service account to create a message.
    const createdSpace = Chat.Spaces.create(
        space,
        {},
        // Authenticate with the service account token.
        {'Authorization': 'Bearer ' + service.getAccessToken()});
    return createdSpace.name;
  } catch (err) {
    // TODO (developer) - Handle exception.
    console.log('Failed to create space with error %s', err.message);
  }
}
/*
 * Creates a chat message with application credentials.
 *
 * @param {string} spaceName - The resource name of the space.
 * @param {string} message - The text to be posted.
 * @param {object} service - The credentials of the service account.
 * @return {string} the resource name of the new space.
 */
function createMessage_(spaceName, message, service) {
  try {
    // Call Chat API with a service account to create a message.
    const result = Chat.Spaces.Messages.create(
        {'text': message},
        spaceName,
        {},
        // Authenticate with the service account token.
        {'Authorization': 'Bearer ' + service.getAccessToken()});

  } catch (err) {
    // TODO (developer) - Handle exception.
    console.log('Failed to create message with error %s', err.message);
  }
}
/**
 * Creates a human membership in a chat space with application credentials.
 *
 * @param {string} spaceName - The resource name of the space.
 * @param {string} email - The email of the user to be added.
 * @param {object} service - The credentials of the service account.
 */
function createHumanMembership_(spaceName, email, service){
  try{
    const membership = {
      member: {
        name: 'users/'+email,
        // User type for the membership
        type: 'HUMAN'
      }
    };
    const result = Chat.Spaces.Members.create(
      membership,
      spaceName,
      {},
      {'Authorization': 'Bearer ' + service.getAccessToken()}
    );
  } catch (err){
    console.log('Failed to create membership with error %s', err.message)
  }

}

 /*
 * Creates a service for the service account.
 * @return {object}  - The credentials of the service account.
 */
function getService_() {
  return OAuth2.createService(APP_CREDENTIALS.client_email)
      .setTokenUrl('https://oauth2.googleapis.com/token')
      .setPrivateKey(APP_CREDENTIALS.private_key)
      .setIssuer(APP_CREDENTIALS.client_email)
      .setSubject(APP_CREDENTIALS.client_email)
      .setScope(APP_CREDENTIALS_SCOPES)
      .setPropertyStore(PropertiesService.getScriptProperties());
}
DocsApi.gs

Memanggil Google Docs API untuk membuat dokumen Google Dokumen di Google Drive pengguna dan menulis ringkasan informasi insiden, yang dibuat di VertexAiApi.gs, ke dokumen.

Lihat kode DocsApi.gs

apps-script/incident-response-app-auth/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

Merangkum percakapan di ruang Chat menggunakan Vertex AI API. Ringkasan ini diposting dalam dokumen yang dibuat khusus di DocsAPI.gs.

Lihat kode VertexAiApi.gs

apps-script/incident-response-app-auth/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 API_ENDPOINT = `https://${VERTEX_AI_LOCATION_ID}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${VERTEX_AI_LOCATION_ID}/publishers/google/models/${MODEL_ID}:generateContent`;
  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;
  // Get the access token.
  const accessToken = ScriptApp.getOAuthToken();

  const headers = {
    'Authorization': 'Bearer ' + accessToken,
    'Content-Type': 'application/json',
  };
  const payload = {
    'contents': {
      'role': 'user',
      'parts' : [
        {
          'text': prompt
        }
      ]
    }
  }
  const options = {
    'method': 'post',
    'headers': headers,
    'payload': JSON.stringify(payload),
    'muteHttpExceptions': true,
  };
  try {
    const response = UrlFetchApp.fetch(API_ENDPOINT, options);
    const responseCode = response.getResponseCode();
    const responseText = response.getContentText();

    if (responseCode === 200) {
      const jsonResponse = JSON.parse(responseText);
      console.log(jsonResponse)
      if (jsonResponse.candidates && jsonResponse.candidates.length > 0) {
        return jsonResponse.candidates[0].content.parts[0].text; // Access the summarized text
      } else {
        return "No summary found in response.";
      }

    } else {
      console.error("Vertex AI API Error:", responseCode, responseText);
      return `Error: ${responseCode} - ${responseText}`;
    }
  } catch (e) {
    console.error("UrlFetchApp Error:", e);
    return "Error: " + e.toString();
  }
}
WebController.gs

Menayangkan situs inisialisasi insiden.

Lihat kode WebController.gs

apps-script/incident-response-app-auth/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 yang terdiri dari situs inisialisasi insiden.

Lihat kode Index.html

apps-script/incident-response-app-auth/Index.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

Menangani perilaku formulir, termasuk pengiriman, error, dan penghapusan, untuk situs inisialisasi insiden. Fungsi ini disertakan ke dalam Index.html oleh fungsi include kustom di WebController.gs.

Lihat kode JavaScript.html

apps-script/incident-response-app-auth/JavaScript.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)
      .handleIncident(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 untuk situs inisialisasi insiden. Fungsi ini disertakan ke dalam Index.html oleh fungsi include kustom di WebController.gs.

Lihat kode Stylesheet.html

apps-script/incident-response-app-auth/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>

Menemukan nomor dan ID project Cloud Anda

  1. Di konsol Google Cloud, buka project Cloud Anda.

    Buka konsol Google Cloud

  2. Klik Settings and Utilities > Project settings.

  3. Catat nilai di kolom Nomor project dan Project ID. Anda akan menggunakannya di bagian berikut.

Membuat project Apps Script

Untuk membuat project Apps Script dan menghubungkannya dengan project Cloud Anda:

  1. Klik tombol berikut untuk membuka project Apps Script Merespons insiden dengan Google Chat.
    Membuka project
  2. Klik Ringkasan.
  3. Di halaman ringkasan, klik Ikon untuk membuat salinan Buat salinan.
  4. Beri nama salinan project Apps Script Anda:

    1. Klik Salinan Merespons insiden dengan Google Chat.

    2. Di Project title, ketik Incident Management Chat app.

    3. Klik Ganti nama.

  5. Di salinan project Apps Script, buka file Consts.gs dan ganti YOUR_PROJECT_ID dengan ID project Cloud Anda.

Menetapkan project Cloud project Apps Script

  1. Di project Apps Script, klik Ikon untuk setelan project Project Settings.
  2. Pada Google Cloud Platform (GCP) Project, klik Change project.
  3. Di GCP project number, tempel nomor project project Cloud Anda.
  4. Klik Set project. Project Cloud dan project Apps Script kini terhubung.

Membuat deployment Apps Script

Setelah semua kode diterapkan, deploy project Apps Script. Anda menggunakan ID deployment saat mengonfigurasi aplikasi Chat di Google Cloud.

  1. Di Apps Script, buka project aplikasi respons insiden.

    Buka Apps Script

  2. Klik Deploy > New deployment.

  3. Jika Add-on dan Web app belum dipilih, di samping Select type, klik jenis deployment Ikon untuk setelan project, lalu pilih Add-on dan Web app.

  4. Di Description, masukkan deskripsi untuk versi ini, seperti Complete version of incident management app.

  5. Di Execute as, pilih User accessing the web app

  6. Di bagian Siapa yang memiliki akses, pilih Siapa saja di organisasi Workspace Anda, dengan "organisasi Workspace Anda" adalah nama organisasi Google Workspace Anda.

  7. Klik Deploy. Apps Script melaporkan deployment yang berhasil dan memberikan ID deployment serta URL untuk halaman web inisialisasi insiden.

  8. Catat URL Aplikasi web yang akan dikunjungi nanti saat Anda memulai insiden. Salin ID Deployment. Anda menggunakan ID ini saat mengonfigurasi aplikasi Chat di konsol Google Cloud.

  9. Klik Selesai.

Mengonfigurasi aplikasi Chat di konsol Google Cloud

Bagian ini menunjukkan cara mengonfigurasi Google Chat API di Konsol Google Cloud dengan informasi tentang aplikasi Chat Anda, termasuk ID deployment yang baru saja Anda buat dari project Apps Script.

  1. Di konsol Google Cloud, klik Menu > Produk lainnya > Google Workspace > Product Library > Google Chat API > Manage > Configuration.

    Buka konfigurasi Chat API

  2. Di App name, ketik Incident Management.

  3. Di Avatar URL, ketik https://developers.google.com/chat/images/quickstart-app-avatar.png.

  4. Di Deskripsi, ketik Responds to incidents..

  5. Klik tombol Aktifkan Fitur interaktif ke posisi aktif.

  6. Di bagian Functionality, pilih Receive 1:1 messages, Join spaces and group conversations.

  7. Di bagian Connection settings, pilih Apps Script.

  8. Di Deployment ID, tempelkan ID Deployment Apps Script yang Anda salin sebelumnya dari deployment project Apps Script.

  9. Daftarkan perintah garis miring yang digunakan aplikasi Chat yang diimplementasikan sepenuhnya:

    1. Di bagian Commands, klik Add a command.

    2. Di Command ID, ketik 1.

    3. Di Deskripsi, ketik Closes the incident being discussed in the space.

    4. Di bagian Command type, pilih Slash command.

    5. Di Slash command name, ketik /closeIncident.

    6. Pilih Opens a dialog.

    7. Klik Selesai. Perintah garis miring terdaftar dan tercantum.

  10. Di bagian Visibilitas, pilih Buat aplikasi Chat ini tersedia untuk orang dan grup tertentu di Domain Workspace Anda, lalu masukkan alamat email Anda.

  11. Di bagian Logs, pilih Log errors to Logging.

  12. Klik Simpan. Pesan konfigurasi tersimpan akan muncul, yang berarti aplikasi sudah siap diuji.

Menerima persetujuan administrator

Untuk menerima persetujuan administrator, Anda harus mengonfigurasi aplikasi Chat di Google Workspace Marketplace SDK.

Mengonfigurasi aplikasi Chat di Google Workspace Marketplace SDK

Untuk mengonfigurasi aplikasi Chat di Google Workspace Marketplace SDK, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud, buka Menu > APIs & Services > Enabled APIs & services > Google Workspace Marketplace SDK > App Configuration.

    Buka Konfigurasi Aplikasi

  2. Selesaikan halaman Konfigurasi Aplikasi. Cara Anda mengonfigurasi aplikasi Chat bergantung pada siapa audiens yang Anda tuju dan faktor lainnya. Untuk mendapatkan bantuan dalam menyelesaikan halaman konfigurasi aplikasi, lihat Mengonfigurasi aplikasi Anda di Google Workspace Marketplace SDK. Untuk tujuan panduan ini, masukkan informasi berikut:

    1. Di bagian Visibilitas aplikasi, pilih Pribadi.
    2. Di bagian Setelan penginstalan, pilih Instal admin.
    3. Di bagian Integrasi aplikasi, pilih Aplikasi Chat.
    4. Di bagian Cakupan OAuth, masukkan cakupan berikut:
      • https://www.googleapis.com/auth/chat.app.spaces
      • https://www.googleapis.com/auth/chat.app.memberships
    5. Di bagian Informasi developer, masukkan Nama developer, URL situs developer, dan Email developer.
    6. Klik Simpan draf.

Setelah mengonfigurasi aplikasi, perbarui listingan Play Store:

  1. Di konsol Google Cloud, buka Menu > APIs & Services > Enabled APIs & services > Google Workspace Marketplace SDK > Store Listing.
  2. Di App details, pilih Web Development sebagai Kategori.
  3. Di Aset Visual, upload ikon aplikasi dalam format yang diminta.
  4. Di bagian Screenshot, upload screenshot aplikasi.
  5. Di Link Dukungan, isi URL Persyaratan Layanan, URL Privasi, dan URL Dukungan.
  6. Di Distribusi, Pilih region tempat aplikasi ini akan tersedia.
  7. Klik Publikasikan.

Mendapatkan persetujuan administrator

Setelah akun layanan Anda dikonfigurasi untuk menerima persetujuan administrator, dapatkan persetujuan dari administrator Google Workspace yang dapat memberikan persetujuan dengan mengikuti langkah-langkah di Menyiapkan otorisasi untuk aplikasi Chat.

Menguji aplikasi Chat

Untuk menguji aplikasi Chat pengelolaan insiden, mulai insiden dari halaman web dan pastikan aplikasi Chat berfungsi seperti yang diharapkan:

  1. Buka URL aplikasi web deployment Apps Script.

  2. Saat Apps Script meminta izin untuk mengakses data Anda, klik Tinjau izin, login dengan Akun Google yang sesuai di domain Google Workspace Anda, lalu klik Izinkan.

  3. Halaman web inisialisasi insiden akan terbuka. Masukkan informasi pengujian:

    1. Di Incident title, ketik The First Incident.
    2. Secara opsional, di Incident responders, masukkan alamat email rekan responder insiden Anda. Mereka harus merupakan pengguna dengan akun Google Chat di organisasi Google Workspace Anda atau pembuatan ruang akan gagal. Jangan masukkan alamat email Anda sendiri karena alamat tersebut disertakan secara otomatis.
    3. Di Initial message, ketik Testing the incident management Chat app.
  4. Klik Buat Ruang Chat. Pesan creating space akan muncul.

  5. Setelah ruang dibuat, pesan Space created! akan muncul. Klik Buka ruang, yang akan membuka ruang di Chat di tab baru.

  6. Secara opsional, Anda dan responden insiden lainnya dapat mengirim pesan di ruang. Aplikasi meringkas pesan ini menggunakan Vertex AI dan membagikan dokumen retrospektif.

  7. Untuk mengakhiri respons insiden dan memulai proses penyelesaian, di ruang Chat, ketik /closeIncident. Dialog pengelolaan insiden akan terbuka.

  8. Di Close incident, masukkan deskripsi untuk penyelesaian insiden, seperti Test complete.

  9. Klik Close Incident.

Aplikasi Pengelolaan Insiden mencantumkan pesan di ruang, meringkasnya dengan Vertex AI, menempelkan ringkasan dalam dokumen Google Dokumen, dan membagikan dokumen di ruang.

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, sebaiknya hapus project Cloud.

  1. Di Konsol Google Cloud, buka halaman Manage resources. Klik Menu > IAM & Admin > Kelola Resource.

    Buka Resource Manager

  2. Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Hapus .
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.