1. Sebelum memulai
Apa itu Gemini Enterprise?
Gemini Enterprise adalah platform agen canggih yang menghadirkan AI Google terbaik untuk setiap karyawan, di setiap alur kerja. Gemini Enterprise memungkinkan semua tim untuk menemukan, membuat, membagikan, dan menjalankan agen AI dalam satu lingkungan yang aman.
- Akses model lanjutan: Pengguna mendapatkan akses langsung ke AI multimodal tercanggih Google, termasuk Gemini, untuk mengatasi tantangan bisnis yang kompleks.
- Manfaatkan agen khusus: Rangkaian ini mencakup agen Google siap pakai untuk riset, coding, dan pencatatan untuk memberikan nilai langsung.
- Memberdayakan setiap karyawan: Opsi tanpa coding dan pro-code memungkinkan staf di semua departemen membuat dan mengelola agen kustom mereka sendiri untuk otomatisasi alur kerja.
- Merujuk agen pada data: Agen dapat terhubung secara aman ke data perusahaan internal dan aplikasi pihak ketiga untuk memastikan responsnya akurat secara kontekstual.
- Tata kelola terpusat: Administrator dapat memvisualisasikan dan mengaudit semua aktivitas agen untuk memastikan organisasi memenuhi standar keamanan dan kepatuhan yang ketat.
- Perluas dengan ekosistem: Platform ini terintegrasi dengan jaringan luas aplikasi partner dan penyedia layanan untuk memperluas otomatisasi di berbagai sistem.
Apa itu Google Workspace?
Google Workspace adalah kumpulan solusi produktivitas dan kolaborasi berbasis cloud yang didesain untuk individu, sekolah, dan bisnis:
- Komunikasi: Layanan email profesional (Gmail), konferensi video (Meet), dan pesan tim (Chat).
- Pembuatan Konten: Alat untuk menulis dokumen (Dokumen), membuat spreadsheet (Spreadsheet), dan mendesain presentasi (Slide).
- Organisasi: Kalender bersama (Kalender) dan pencatatan digital (Keep).
- Penyimpanan: Ruang cloud terpusat untuk menyimpan dan membagikan file dengan aman (Drive).
- Pengelolaan: Kontrol administratif untuk mengelola pengguna dan setelan keamanan (Konsol Admin Workspace).
Jenis integrasi kustom apa?
Google Workspace dan Gemini Enterprise menciptakan siklus proses yang efektif, di mana Workspace menyediakan data real-time dan konteks kolaborasi, sementara Gemini Enterprise menawarkan model, penalaran agentik, dan orkestrasi yang diperlukan untuk mengotomatiskan alur kerja cerdas.
- Konektivitas pintar: Penyimpanan data, API, dan server MCP (yang dikelola Google dan kustom) yang dikelola Google memungkinkan agen mengakses data Workspace secara aman dan lancar serta melakukan tindakan atas nama pengguna.
- Agen kustom: Dengan menggunakan desainer tanpa kode atau framework pro-code, tim dapat membangun agen khusus yang didasarkan pada data dan tindakan Workspace yang diatur oleh admin.
- Integrasi native: Add-on Workspace menjembatani kesenjangan antara sistem dan aplikasi AI seperti Chat dan Gmail, baik melalui komponen UI khusus maupun proses latar belakang. Hal ini memungkinkan agen bertemu dengan pengguna tepat di tempat mereka berada untuk mendapatkan bantuan instan yang sesuai dengan konteks.
Dengan menggabungkan ekosistem produktivitas yang andal dari Google Workspace dengan kemampuan berbasis agen canggih dari Gemini Enterprise, organisasi dapat mentransformasi operasi mereka melalui agen AI kustom berbasis data yang mengotomatiskan alur kerja yang kompleks langsung dalam alat yang sudah digunakan tim mereka setiap hari.
Prasyarat
Jika ingin mengikuti semua langkah di lingkungan Anda sendiri, Anda memerlukan:
- Pengetahuan dasar tentang Google Cloud dan Python.
- Project Google Cloud yang Anda miliki dengan penagihan. Untuk memeriksa apakah penagihan diaktifkan pada project yang ada, lihat Memverifikasi status penagihan project Anda. Untuk membuat project dan menyiapkan penagihan, lihat Membuat project Google Cloud. Untuk mengubah kepemilikan project, lihat Mengelola anggota project atau mengubah kepemilikan project.
- Edisi Gemini Enterprise Standard / Plus diaktifkan. Untuk membandingkan edisi Gemini Enterprise, lihat Membandingkan edisi Gemini Enterprise. Jika tidak memiliki lisensi untuk Gemini Enterprise, Anda akan memiliki opsi untuk membuat lisensi uji coba di langkah berikutnya.
- Akun Google Workspace Business atau Enterprise dengan akses ke Google Chat dan fitur smart diaktifkan.
- Google Cloud CLI diinstal dan diinisialisasi untuk project Google Cloud Anda.
- Python 3.11+ diinstal, lihat petunjuk di situs Python resmi.
Yang akan Anda bangun
Dalam codelab ini, kita akan membangun tiga solusi dengan agen AI Gemini Enterprise yang terintegrasi erat dengan Google Workspace. Mereka akan mendemonstrasikan pola arsitektur yang dapat digunakan untuk berinteraksi dengan data, tindakan, dan UI.
Agen kustom tanpa coding
Agen ini memungkinkan pengguna menelusuri data dan mengambil tindakan untuk Workspace dalam bahasa alami mereka. Mengandalkan elemen berikut:
- Model: Gemini.
- Data & tindakan: Penyimpanan data Gemini Enterprise untuk Google Workspace (Kalender, Gmail, Drive, NotebookLM), Google Penelusuran.
- Alat pembuatan agen: Agent Designer Gemini Enterprise.
- Host agen: Gemini Enterprise.
- UI: Aplikasi web Gemini Enterprise.


Agen kustom kode pro
Agen ini memungkinkan pengguna menelusuri data dan melakukan tindakan untuk Workspace dalam bahasa alami mereka menggunakan alat dan aturan kustom. Mengandalkan elemen berikut:
- Model: Gemini.
- Data & tindakan: Penyimpanan data Gemini Enterprise untuk Google Workspace (Kalender, Gmail, Drive, NotebookLM), Google Penelusuran, server Model Context Protocol (MCP) Vertex AI yang dikelola Google, fungsi alat kustom untuk mengirim pesan Google Chat (melalui Google Chat API).
- Alat pembuatan agen: Agent Development Kit (ADK).
- Host agen: Vertex AI Agent Engine.
- UI: Aplikasi web Gemini Enterprise.


Agen default sebagai add-on Google Workspace
Agen ini memungkinkan pengguna menelusuri data untuk Workspace dalam bahasa alami mereka dalam konteks UI aplikasi Workspace. Mengandalkan elemen berikut:
- Model: Gemini.
- Data: Penyimpanan data Gemini Enterprise untuk Google Workspace (Kalender, Gmail, Drive, NotebookLM), Google Penelusuran.
- Host agen: Gemini Enterprise.
- UI: Add-on Google Workspace untuk Chat dan Gmail (dapat diperluas dengan mudah ke Kalender, Drive, Dokumen, Spreadsheet, dan Slide).
- Add-on Google Workspace: Apps Script, Gemini Enterprise & Vertex AI API, kontekstual (metadata pengguna, pesan Gmail yang dipilih).


Yang akan Anda pelajari
- Titik integrasi antara Gemini Enterprise dan Google Workspace yang memungkinkan data dan tindakan.
- Opsi tanpa coding dan pro-code untuk membangun agen kustom yang dihosting di Gemini Enterprise.
- Cara pengguna dapat mengakses agen dari aplikasi web Gemini Enterprise dan aplikasi Google Workspace.
2. Memulai persiapan
Tinjau konsep
Aplikasi Gemini Enterprise
Aplikasi Gemini Enterprise memberikan hasil penelusuran, tindakan, dan agen kepada pengguna akhir Anda. Istilah aplikasi dapat digunakan secara bergantian dengan istilah mesin dalam konteks API. Aplikasi harus terhubung ke penyimpanan data agar dapat menggunakan data dari penyimpanan data tersebut untuk menayangkan hasil penelusuran, jawaban, atau tindakan.
Aplikasi web Gemini Enterprise
Aplikasi web Gemini Enterprise dikaitkan dengan aplikasi Gemini Enterprise. Aplikasi ini berfungsi sebagai pusat AI terpusat tempat karyawan menggunakan satu antarmuka chat untuk menelusuri data perusahaan yang terpisah, menjalankan agen AI khusus untuk alur kerja yang kompleks, dan membuat konten berkualitas profesional dengan privasi tingkat perusahaan.
Lakukan inisialisasi dan akses resource
Di bagian ini, Anda akan mengakses dan mengonfigurasi resource berikut dari browser web pilihan Anda.
Aplikasi Gemini Enterprise
Buka konsol Google Cloud di tab baru, lalu ikuti langkah-langkah berikut:
- Pilih project Anda.
- Di kolom penelusuran Google Cloud, telusuri dan pilih Gemini Enterprise, lalu klik + Create app. Jika Anda tidak memiliki lisensi untuk Gemini Enterprise, Anda akan diminta untuk mengaktifkan lisensi uji coba gratis selama 30 hari.
- Tetapkan Nama aplikasi ke
codelab. - ID dibuat berdasarkan nama dan ditampilkan di bawah kolom, salin ID tersebut.
- Tetapkan Multi-region ke
global (Global). - Klik Buat.

- Aplikasi dibuat dan Anda otomatis dialihkan ke Gemini Enterprise > Overview.
- Di bagian Dapatkan akses Penuh, klik Siapkan identitas.
- Di layar baru, pilih Use Google Identity, lalu klik Confirm Workforce Identity.

- Konfigurasi disimpan dan Anda akan otomatis diarahkan ke Gemini Enterprise > Ringkasan.
- Buka Konfigurasi.
- Di tab Feature Management, aktifkan Enable agent designer, lalu klik Save.

Aplikasi web Gemini Enterprise
Buka Gemini Enterprise dari konsol Cloud di tab baru, lalu ikuti langkah-langkah berikut:
- Klik aplikasi bernama
codelab. - Salin URL yang muncul karena kita akan menggunakannya untuk membuka aplikasi web Gemini Enterprise di langkah berikutnya.

3. Agen kustom tanpa kode
Agen ini memungkinkan pengguna menelusuri data dan mengambil tindakan untuk Workspace dalam bahasa alami mereka. Mengandalkan elemen berikut:
- Model: Gemini.
- Data & tindakan: Penyimpanan data Gemini Enterprise untuk Google Workspace (Kalender, Gmail, Drive, NotebookLM), Google Penelusuran.
- Alat pembuatan agen: Agent Designer Gemini Enterprise.
- Host agen: Gemini Enterprise.
- UI: Aplikasi web Gemini Enterprise.
Tinjau konsep
Gemini
Gemini adalah LLM multimodal dari Google. Teknologi ini membantu orang menemukan potensi diri sendiri sehingga mereka dapat memperkaya imajinasi, memperluas pengetahuan, dan meningkatkan produktivitas.
Penyimpanan data Gemini Enterprise
Penyimpanan data Gemini Enterprise adalah entitas yang berisi data yang diserap dari sumber data pihak pertama seperti Google Workspace atau aplikasi pihak ketiga seperti Jira atau Salesforce. Penyimpanan data yang berisi data dari aplikasi pihak ketiga juga disebut konektor data.
Agent Designer Gemini Enterprise
Agent Designer Gemini Enterprise adalah platform interaktif tanpa coding dan low-code untuk membuat, mengelola, dan meluncurkan agen satu langkah dan multi-langkah di Gemini Enterprise.
Tinjau arsitektur solusi

Aktifkan API
Penyimpanan data Workspace Gemini Enterprise memerlukan pengaktifan API:
- Di Konsol Google Cloud, aktifkan Calendar, Gmail, dan People API:

- Klik Menu ☰ > APIs & Services > Enabled APIs & Services, lalu konfirmasi bahwa Google Calendar API, Gmail API, dan People API ada dalam daftar.
Mengonfigurasi layar izin OAuth
Tindakan Gemini Enterprise Workspace Calendar dan Gmail memerlukan konfigurasi layar izin:
- Di konsol Google Cloud, klik Menu ☰ > Google Auth platform > Branding.
- Klik Mulai.
- Di bagian App Information, tetapkan App name ke
Codelab. - Di bagian Email dukungan pengguna, pilih alamat email dukungan yang dapat dihubungi pengguna jika mereka memiliki pertanyaan tentang izin mereka.
- Klik Berikutnya.
- Di bagian Audiens, pilih Internal.
- Klik Berikutnya.
- Di bagian Informasi Kontak, masukkan Alamat email tempat Anda dapat menerima notifikasi tentang perubahan apa pun pada project Anda.
- Klik Berikutnya.
- Di bagian Selesai, tinjau Kebijakan Data Pengguna Layanan Google API dan jika Anda setuju, pilih Saya menyetujui Layanan Google API: Kebijakan Data Pengguna.
- Klik Lanjutkan, lalu Buat.

- Konfigurasi disimpan dan Anda akan otomatis dialihkan ke Google Auth Platform > Overview.
- Buka Akses Data.
- Klik Tambahkan atau hapus cakupan.
- Salin cakupan berikut dan tempelkan ke kolom Tambahkan cakupan secara manual.
https://www.googleapis.com/auth/calendar.readonly
https://www.googleapis.com/auth/calendar.events
https://www.googleapis.com/auth/calendar.calendars
https://www.googleapis.com/auth/gmail.send
https://www.googleapis.com/auth/gmail.readonly
- Klik Tambahkan ke tabel, lalu Perbarui, lalu Simpan.

Untuk mempelajari lebih lanjut, lihat panduan lengkap Mengonfigurasi izin OAuth.
Buat kredensial klien OAuth
Buat klien OAuth baru untuk Gemini Enterprise guna mengautentikasi pengguna:
- Di konsol Google Cloud, klik Menu ☰ > Google Auth platform > Clients.
- Klik + Buat klien.
- Untuk Application type, pilih Web application.
- Tetapkan Name ke
codelab. - Lewati Authorized JavaScript origins.
- Di bagian URI pengalihan yang diberi otorisasi, klik Tambahkan URI dan masukkan
https://vertexaisearch.cloud.google.com/oauth-redirect. - Klik Buat.
- Dialog akan muncul dengan rahasia klien dan client ID OAuth yang baru dibuat. Simpan informasi ini di tempat yang aman.

Membuat penyimpanan data
Buka Gemini Enterprise dari konsol Cloud di tab baru, lalu ikuti langkah-langkah berikut:
- Klik aplikasi bernama
codelab. - Di menu navigasi, klik Connected data stores.
- Klik + New data store.
- Di Sumber, telusuri Google Kalender, lalu klik Pilih.
- Di bagian Actions, masukkan Client ID dan Client Secret yang disimpan dari langkah sebelumnya, lalu klik Verify Auth dan ikuti langkah-langkah untuk mengautentikasi dan mengizinkan klien OAuth.
- Aktifkan tindakan Buat acara kalender dan Perbarui acara kalender.
- Klik Lanjutkan.

- Di bagian Konfigurasi, tetapkan Nama konektor data ke
calendar. - Klik Buat.
- Anda akan otomatis dialihkan ke Connected data stores tempat Anda dapat melihat penyimpanan data yang baru ditambahkan.
Buat penyimpanan data Google Gmail:
- Klik + New data store.
- Di Sumber, telusuri Google Gmail, lalu klik Pilih.
- Di bagian Tindakan, masukkan Client ID dan Client Secret yang disimpan dari langkah sebelumnya, lalu klik Verify Auth.
- Aktifkan tindakan Kirim email.
- Klik Lanjutkan.
- Di bagian Konfigurasi, tetapkan Nama konektor data ke
gmail. - Klik Buat.
- Anda akan otomatis dialihkan ke Connected data stores tempat Anda dapat melihat penyimpanan data yang baru ditambahkan.
Buat penyimpanan data Google Drive:
- Klik + New data store.
- Di bagian Sumber, telusuri Google Drive, lalu klik Pilih.
- Di bagian Data, pilih Semua, lalu klik Lanjutkan.
- Di bagian Konfigurasi, tetapkan Nama konektor data ke
drive. - Klik Buat.
- Anda akan otomatis dialihkan ke Connected data stores tempat Anda dapat melihat penyimpanan data yang baru ditambahkan.
Buat penyimpanan data NotebookLM:
- Klik + New data store.
- Di Sumber, telusuri NotebookLM, lalu klik Pilih.
- Di bagian Konfigurasi, tetapkan Nama konektor data ke
notebooklm. - Klik Buat.
- Anda akan otomatis dialihkan ke Connected data stores tempat Anda dapat melihat penyimpanan data yang baru ditambahkan.
Setelah beberapa menit, status semua penyimpanan data yang terhubung (kecuali NotebookLM) akan menjadi Aktif. Jika melihat error, Anda dapat mengklik sumber data untuk melihat detail error.

Menguji penyimpanan data
Buka URL aplikasi web Gemini Enterprise yang kita salin sebelumnya:
- Klik Menu ☰ > Chat baru.
- Di footer kolom pesan chat baru, klik ikon Konektor dan aktifkan semua konektor.
- Sekarang Anda dapat bereksperimen dengan perintah yang terkait dengan konektor. Misalnya, di chat, ketik
Do I have any meetings today?dan tekanenter. - Selanjutnya, coba ketik
How many emails did I receive today?, lalu tekanenter. - Terakhir, ketik
Give me the title of the last Drive file I created, lalu tekanenter.

Membuat agen kustom
Di aplikasi web Gemini Enterprise, buat agen baru menggunakan Agent Designer:
- Klik Menu ☰ > + New agent.
- Dalam percakapan, ketik
An agent that always sends pirate-themed emails but use normal English otherwise, lalu tekanenter.

- Agent Designer akan membuat draf agen berdasarkan perintah dan membukanya di editor.
- Klik Buat
Mencoba agen kustom
- Di aplikasi web Gemini Enterprise, mulai percakapan dengan agen yang baru dibuat:
- Klik Menu ☰ > Agen.
- Pilih agen di bagian Agen Anda.
- Di footer kolom pesan chat baru, klik ikon Konektor, lalu klik Aktifkan tindakan untuk Email dan ikuti petunjuk untuk memberi otorisasi pada agen
- Dalam percakapan, ketik
Send an email to someone@example.com saying I'll see them at Cloud Next, generate some subject and body yourself, lalu tekanenter. Anda dapat mengganti contoh email dengan alamat email Anda. - Klik ✔️ untuk mengirim email.


4. Agen kustom kode profesional
Agen ini memungkinkan pengguna menelusuri data dan melakukan tindakan untuk Workspace dalam bahasa alami mereka menggunakan alat dan aturan kustom. Mengandalkan elemen berikut:
- Model: Gemini.
- Data & tindakan: Penyimpanan data Gemini Enterprise untuk Google Workspace (Kalender, Gmail, Drive, NotebookLM), Google Penelusuran, server Model Context Protocol (MCP) Vertex AI yang dikelola Google, fungsi alat kustom untuk mengirim pesan Google Chat (melalui Google Chat API).
- Alat pembuatan agen: Agent Development Kit (ADK).
- Host agen: Vertex AI Agent Engine.
- UI: Aplikasi web Gemini Enterprise.
Fitur ini akan diintegrasikan di Gemini Enterprise menggunakan fitur bawa sendiri, jadi kita perlu melakukan langkah-langkah deployment, pendaftaran, dan konfigurasi.
Tinjau konsep
Vertex AI
Vertex AI menawarkan semua yang Anda perlukan untuk membangun dan menggunakan AI generatif, termasuk solusi AI, penelusuran dan percakapan, lebih dari 130 model dasar, serta platform AI terpadu.

Agent Development Kit (ADK)
Agent Development Kit (ADK) adalah rangkaian alat dan framework khusus yang dirancang untuk menyederhanakan pembuatan agen AI otonom dengan menyediakan modul siap pakai untuk penalaran, pengelolaan memori, dan integrasi alat.
Model Context Protocol (MCP)
Model Context Protocol (MCP) adalah standar terbuka yang dirancang untuk memungkinkan integrasi yang lancar dan aman antara aplikasi AI dan berbagai sumber data atau alat melalui antarmuka "plug-and-play" universal.
Alat Fungsi
Alat fungsi adalah rutin yang dapat dieksekusi yang telah ditentukan sebelumnya yang dapat dipicu oleh model AI untuk melakukan tindakan tertentu atau mengambil data real-time dari sistem eksternal, sehingga memperluas kemampuannya di luar pembuatan teks sederhana.
Tinjau arsitektur solusi

Tinjau kode sumber
agent.py
...
MODEL = "gemini-2.5-flash"
# Gemini Enterprise authentication injects a bearer token into the ToolContext state.
# The key pattern is "GE_AUTH_NAME_<random_digits>".
# We dynamically parse this token to authenticate our MCP and API calls.
GE_AUTH_NAME = "enterprise-ai"
VERTEXAI_SEARCH_TIMEOUT = 15.0
def get_project_id():
"""Fetches the consumer project ID from the environment natively."""
_, project = google.auth.default()
if project:
return project
raise Exception(f"Failed to resolve GCP Project ID from environment.")
def find_serving_config_path():
"""Dynamically finds the default serving config in the engine."""
project_id = get_project_id()
engines = discoveryengine_v1.EngineServiceClient().list_engines(
parent=f"projects/{project_id}/locations/global/collections/default_collection"
)
for engine in engines:
# engine.name natively contains the numeric Project Number
return f"{engine.name}/servingConfigs/default_serving_config"
raise Exception(f"No Discovery Engines found in project {project_id}")
def _get_access_token_from_context(tool_context: ToolContext) -> str:
"""Helper method to dynamically parse the intercepted bearer token from the context state."""
escaped_name = re.escape(GE_AUTH_NAME)
pattern = re.compile(fr"^{escaped_name}_\d+$")
# Handle ADK varying state object types (Raw Dict vs ADK State)
state_dict = tool_context.state.to_dict() if hasattr(tool_context.state, 'to_dict') else tool_context.state
matching_keys = [k for k in state_dict.keys() if pattern.match(k)]
if matching_keys:
return state_dict.get(matching_keys[0])
raise Exception(f"No bearer token found in ToolContext state matching pattern {pattern.pattern}")
def auth_header_provider(tool_context: ToolContext) -> dict[str, str]:
token = _get_access_token_from_context(tool_context)
return {"Authorization": f"Bearer {token}"}
def send_direct_message(email: str, message: str, tool_context: ToolContext) -> dict:
"""Sends a Google Chat Direct Message (DM) to a specific user by email address."""
chat_client = chat_v1.ChatServiceClient(
credentials=Credentials(token=_get_access_token_from_context(tool_context))
)
# 1. Setup the DM space or find existing one
person = chat_v1.User(
name=f"users/{email}",
type_=chat_v1.User.Type.HUMAN
)
membership = chat_v1.Membership(member=person)
space_req = chat_v1.Space(space_type=chat_v1.Space.SpaceType.DIRECT_MESSAGE)
setup_request = chat_v1.SetUpSpaceRequest(
space=space_req,
memberships=[membership]
)
space_response = chat_client.set_up_space(request=setup_request)
space_name = space_response.name
# 2. Send the message
msg = chat_v1.Message(text=message)
message_request = chat_v1.CreateMessageRequest(
parent=space_name,
message=msg
)
message_response = chat_client.create_message(request=message_request)
return {"status": "success", "message_id": message_response.name, "space": space_name}
vertexai_mcp = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://discoveryengine.googleapis.com/mcp",
timeout=VERTEXAI_SEARCH_TIMEOUT,
sse_read_timeout=VERTEXAI_SEARCH_TIMEOUT
),
tool_filter=['search'],
# The auth_header_provider dynamically injects the bearer token from the ToolContext
# into the MCP call for authentication.
header_provider=auth_header_provider
)
# Answer nicely the following user queries:
# - Please find my meetings for today, I need their titles and links
# - What is the latest Drive file I created?
# - What is the latest Gmail message I received?
# - Please send the following message to someone@example.com: Hello, this is a test message.
root_agent = LlmAgent(
model=MODEL,
name='enterprise_ai',
instruction=f"""
You are a helpful assistant that always uses the Vertex AI MCP search tool to answer the user's message, unless the user asks you to send a message to someone.
If the user asks you to send a message to someone, use the send_direct_message tool to send the message.
You MUST unconditionally use the Vertex AI MCP search tool to find answer, even if you believe you already know the answer or believe the Vertex AI MCP search tool does not contain the data.
The Vertex AI MCP search tool accesses the user's data through datastores including Google Drive, Google Calendar, and Gmail.
Only use the Vertex AI MCP search tool with servingConfig and query parameters, do not use any other parameters.
Always use the servingConfig {find_serving_config_path()} while using the Vertex AI MCP search tool.
""",
tools=[vertexai_mcp, FunctionTool(send_direct_message)]
)
Aktifkan API
Solusi ini memerlukan pengaktifan API tambahan:
- Di konsol Google Cloud, aktifkan Vertex AI, Cloud Resource Manager, dan Google Chat API:

- Klik Menu ☰ > APIs & Services > Enabled APIs & Services, lalu konfirmasi bahwa Vertex AI API, Cloud Resource Manager API, dan Google Chat API ada dalam daftar.
Memperbarui layar izin OAuth
Solusi ini memerlukan akses data tambahan:
- Di konsol Google Cloud, klik Menu ☰ > Google Auth platform > Data Access.
- Klik Tambahkan atau hapus cakupan.
- Salin cakupan berikut dan tempelkan ke kolom Tambahkan cakupan secara manual.
- Klik Tambahkan ke tabel, lalu Perbarui, lalu Simpan.
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/chat.messages.create
https://www.googleapis.com/auth/chat.spaces.create
- Klik Tambahkan ke tabel, lalu Perbarui, lalu Simpan.

Memperbarui kredensial klien OAuth
Solusi ini memerlukan URI pengalihan yang memiliki otorisasi tambahan:
- Di konsol Google Cloud, klik Menu ☰ > Google Auth platform > Clients.
- Klik nama klien
codelab. - Di bagian URI pengalihan yang diberi otorisasi, klik Tambahkan URI dan masukkan
https://vertexaisearch.cloud.google.com/static/oauth/oauth.html. - Klik Simpan.

Mengaktifkan MCP Vertex AI Search
- Di terminal, jalankan:
gcloud beta services mcp enable discoveryengine.googleapis.com \
--project=$(gcloud config get-value project)
Mengonfigurasi aplikasi Chat
- Di Konsol Google Cloud, telusuri
Google Chat APIdi kolom penelusuran Google Cloud, klik Google Chat API, klik Manage, lalu klik Configuration.
- Tetapkan Nama aplikasi dan Deskripsi ke
Gemini Enterprise. - Tetapkan Avatar URL ke
https://developers.google.com/workspace/add-ons/images/quickstart-app-avatar.png. - Batalkan pilihan Aktifkan fitur Interaktif, lalu klik Nonaktifkan di dialog modal yang muncul.
- Pilih Log errors to Logging.
- Klik Simpan.

Men-deploy agen di Vertex AI Agent Engine
- Download repositori GitHub ini.
- Di terminal, buka direktori
solutions/enterprise-ai-agent, lalu jalankan:
# 1. Create and activate a new virtual environment python3 -m venv .venv source .venv/bin/activate # 2. Install poetry and project dependencies pip install poetry poetry install # 3. Deploy the agent adk deploy agent_engine \ --project=$(gcloud config get-value project) \ --region=us-central1 \ --display_name="Enterprise AI" \ enterprise_ai

- Saat Anda melihat baris Deploying to agent engine... di log, buka terminal baru dan jalankan perintah berikut untuk menambahkan izin yang diperlukan ke Vertex AI Reasoning Engine Service Agent:
# 1. Get the current Project ID
PROJECT_ID=$(gcloud config get-value project)
# 2. Extract the Project Number for that ID
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
# 3. Construct the Service Account name
SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-aiplatform-re.iam.gserviceaccount.com"
# 4. Apply the IAM policy binding
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT" \
--role="roles/discoveryengine.viewer"
- Tunggu hingga perintah adk deploy selesai, lalu salin nama resource agen yang baru di-deploy dari output perintah berwarna hijau.

Mendaftarkan agen di Gemini Enterprise
Buka Gemini Enterprise dari konsol Cloud di tab baru, lalu ikuti langkah-langkah berikut:
- Klik aplikasi bernama
codelab. - Di menu navigasi, klik Agen.
- Klik + Tambahkan agen.
- Klik Tambahkan untuk Agen kustom melalui Agent Engine. Bagian Authorizations akan ditampilkan.
- Klik Add authorization.
- Tetapkan Authorization name ke
enterprise-ai. ID dibuat berdasarkan nama dan ditampilkan di bawah kolom, salin ID tersebut. - Tetapkan Client ID ke nilai yang sama dengan klien OAuth yang dibuat dan diperbarui pada langkah-langkah sebelumnya.
- Tetapkan Client secret ke nilai yang sama dengan klien OAuth yang dibuat dan diperbarui pada langkah-langkah sebelumnya.
- Tetapkan Token URI ke
https://oauth2.googleapis.com/token. - Tetapkan Authorization URI ke nilai berikut setelah mengganti <CLIENT_ID> dengan ID klien OAuth yang dibuat dan diperbarui di langkah sebelumnya.
https://accounts.google.com/o/oauth2/v2/auth?client_id=<CLIENT_ID>&redirect_uri=https%3A%2F%2Fvertexaisearch.cloud.google.com%2Fstatic%2Foauth%2Foauth.html&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.calendars%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.events%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.send%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fchat.messages.create%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fchat.spaces.create&include_granted_scopes=true&response_type=code&access_type=offline&prompt=consent
- Klik Selesai, lalu Berikutnya. Bagian Konfigurasi akan ditampilkan.
- Tetapkan Agent name dan Agent description ke
Enterprise AI. - Tetapkan Agent Engine reasoning engine ke nama resource mesin penalaran yang disalin di langkah sebelumnya. Formatnya adalah sebagai berikut:
projects/<PROJECT_ID>/locations/<LOCATION>/reasoningEngines/<REASONING_ENGINE_ID>
- Klik Buat. Agen yang baru ditambahkan kini tercantum di bagian Agen.
Coba agen
- Di aplikasi web Gemini Enterprise, mulai percakapan dengan agen yang baru didaftarkan:
- Klik Menu ☰ > Agen.
- Pilih agen di bagian Dari organisasi Anda.
- Dalam percakapan, ketik
Please find my meetings for today, I need their titles and links, lalu tekanenter. - Klik Authorize, lalu ikuti alur otorisasi.

- Agen akan menjawab dengan daftar acara Kalender (bergantung pada akun pengguna).
- Dalam percakapan, ketik
Please send a Chat message to someone@example.com with the following text: Hello!, lalu tekanenter. - Agen akan menjawab dengan pesan konfirmasi.


5. Agen default sebagai add-on Google Workspace
Agen ini memungkinkan pengguna menelusuri data untuk Workspace dalam bahasa alami mereka dalam konteks UI aplikasi Workspace. Mengandalkan elemen berikut:
- Model: Gemini.
- Data: Penyimpanan data Gemini Enterprise untuk Google Workspace (Kalender, Gmail, Drive, NotebookLM), Google Penelusuran.
- Host agen: Gemini Enterprise.
- UI: Add-on Google Workspace untuk Chat dan Gmail (dapat diperluas dengan mudah ke Kalender, Drive, Dokumen, Spreadsheet, dan Slide).
- Add-on Google Workspace: Apps Script, Gemini Enterprise & Vertex AI API, kontekstual (metadata pengguna, pesan Gmail yang dipilih).
Add-on Google Workspace akan terhubung ke Gemini Enterprise menggunakan StreamAssist API.
Tinjau konsep
Add-on Google Workspace
Add-on Google Workspace adalah aplikasi yang disesuaikan yang memperluas satu atau beberapa aplikasi Google Workspace (Gmail, Chat, Kalender, Dokumen, Drive, Meet, Spreadsheet, dan Slide).
Apps Script
Apps Script adalah platform JavaScript berbasis cloud yang didukung oleh Google Drive yang memungkinkan Anda berintegrasi dengan dan mengotomatiskan tugas di seluruh produk Google.
Framework Kartu Google Workspace
Framework kartu di Google Workspace memungkinkan developer membuat antarmuka pengguna yang interaktif dan kaya. Dengan library ini, Anda dapat membuat kartu yang teratur dan menarik secara visual yang dapat menyertakan teks, gambar, tombol, dan widget lainnya. Kartu ini meningkatkan pengalaman pengguna dengan memberikan informasi terstruktur dan memungkinkan tindakan cepat langsung dalam aplikasi Workspace.
Meninjau arsitektur solusi

Tinjau kode sumber
appsscript.json
...
"addOns": {
"common": {
"name": "Enterprise AI",
"logoUrl": "https://developers.google.com/workspace/add-ons/images/quickstart-app-avatar.png"
},
"chat": {},
"gmail": {
"contextualTriggers": [
{
"unconditional": {},
"onTriggerFunction": "onAddonEvent"
}
]
}
},
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/discoveryengine.assist.readwrite",
"https://www.googleapis.com/auth/gmail.addons.execute",
"https://www.googleapis.com/auth/gmail.addons.current.message.readonly"
]
...
Chat.gs
...
// Service that handles Google Chat operations.
// Handle incoming Google Chat message events, actions will be taken via Google Chat API calls
function onMessage(event) {
if (isInDebugMode()) {
console.log(`MESSAGE event received (Chat): ${JSON.stringify(event)}`);
}
// Extract data from the event.
const chatEvent = event.chat;
setChatConfig(chatEvent.messagePayload.space.name);
// Request AI agent to answer the message
requestAgent(chatEvent.messagePayload.message);
// Respond with an empty response to the Google Chat platform to acknowledge execution
return null;
}
// --- Utility functions ---
// The Chat direct message (DM) space associated with the user
const SPACE_NAME_PROPERTY = "DM_SPACE_NAME"
// Sets the Chat DM space name for subsequent operations.
function setChatConfig(spaceName) {
const userProperties = PropertiesService.getUserProperties();
userProperties.setProperty(SPACE_NAME_PROPERTY, spaceName);
console.log(`Space is set to ${spaceName}`);
}
// Retrieved the Chat DM space name to sent messages to.
function getConfiguredChat() {
const userProperties = PropertiesService.getUserProperties();
return userProperties.getProperty(SPACE_NAME_PROPERTY);
}
// Finds the Chat DM space name between the Chat app and the given user.
function findChatAppDm(userName) {
return Chat.Spaces.findDirectMessage(
{ 'name': userName },
{'Authorization': `Bearer ${getAddonCredentials().getAccessToken()}`}
).name;
}
// Creates a Chat message in the configured space.
function createMessage(message) {
const spaceName = getConfiguredChat();
console.log(`Creating message in space ${spaceName}...`);
return Chat.Spaces.Messages.create(
message,
spaceName,
{},
{'Authorization': `Bearer ${getAddonCredentials().getAccessToken()}`}
).name;
}
Sidebar.gs
...
// Service that handles Gmail operations.
// Triggered when the user opens the Gmail Add-on or selects an email.
function onAddonEvent(event) {
// If this was triggered by a button click, handle it
if (event.parameters && event.parameters.action === 'send') {
return handleSendMessage(event);
}
// Otherwise, just render the default initial sidebar
return createSidebarCard();
}
// Creates the standard Gmail sidebar card consisting of a text input and send button.
// Optionally includes an answer section if a response was generated.
function createSidebarCard(optionalAnswerSection) {
const card = CardService.newCardBuilder();
const actionSection = CardService.newCardSection();
// Create text input for the user's message
const messageInput = CardService.newTextInput()
.setFieldName("message")
.setTitle("Message")
.setMultiline(true);
// Create action for sending the message
const sendAction = CardService.newAction()
.setFunctionName('onAddonEvent')
.setParameters({ 'action': 'send' });
const sendButton = CardService.newTextButton()
.setText("Send message")
.setTextButtonStyle(CardService.TextButtonStyle.FILLED)
.setOnClickAction(sendAction);
actionSection.addWidget(messageInput);
actionSection.addWidget(CardService.newButtonSet().addButton(sendButton));
card.addSection(actionSection);
// Attach the response at the bottom if we have one
if (optionalAnswerSection) {
card.addSection(optionalAnswerSection);
}
return card.build();
}
// Handles clicks from the Send message button.
function handleSendMessage(event) {
const commonEventObject = event.commonEventObject || {};
const formInputs = commonEventObject.formInputs || {};
const messageInput = formInputs.message;
let userMessage = "";
if (messageInput && messageInput.stringInputs && messageInput.stringInputs.value.length > 0) {
userMessage = messageInput.stringInputs.value[0];
}
if (!userMessage || userMessage.trim().length === 0) {
return CardService.newActionResponseBuilder()
.setNotification(CardService.newNotification().setText("Please enter a message."))
.build();
}
let finalQueryText = `USER MESSAGE TO ANSWER: ${userMessage}`;
// If we have an email selected in Gmail, append its content as context
if (event.gmail && event.gmail.messageId) {
try {
GmailApp.setCurrentMessageAccessToken(event.gmail.accessToken);
const message = GmailApp.getMessageById(event.gmail.messageId);
const subject = message.getSubject();
const bodyText = message.getPlainBody() || message.getBody();
finalQueryText += `\n\nEMAIL THE USER HAS OPENED ON SCREEN:\nSubject: ${subject}\nBody:\n---\n${bodyText}\n---`;
} catch (e) {
console.error("Could not fetch Gmail context: " + e);
// Invalidate the token explicitly so the next prompt requests the missing scopes
ScriptApp.invalidateAuth();
CardService.newAuthorizationException()
.setResourceDisplayName("Enterprise AI")
.setAuthorizationUrl(ScriptApp.getAuthorizationUrl())
.throwException();
}
}
try {
const responseText = queryAgent({ text: finalQueryText, forceNewSession: true });
// We leverage the 'showdown' library to parse the LLM's Markdown output into HTML
// We also substitute markdown listings with arrows and adjust newlines for clearer rendering in the sidebar
let displayedText = substituteListingsFromMarkdown(responseText);
displayedText = new showdown.Converter().makeHtml(displayedText).replace(/\n/g, '\n\n');
const textParagraph = CardService.newTextParagraph();
textParagraph.setText(displayedText);
const answerSection = CardService.newCardSection()
.addWidget(textParagraph);
const updatedCard = createSidebarCard(answerSection);
return CardService.newActionResponseBuilder()
.setNavigation(CardService.newNavigation().updateCard(updatedCard))
.build();
} catch (err) {
return CardService.newActionResponseBuilder()
.setNotification(CardService.newNotification().setText("Error fetching response: " + err.message))
.build();
}
}
...
AgentHandler.gs
...
// Service that handles Gemini Enterprise AI Agent operations.
// Submits a query to the AI agent and returns the response string synchronously
function queryAgent(input) {
const isNewSession = input.forceNewSession || !PropertiesService.getUserProperties().getProperty(AGENT_SESSION_NAME);
const sessionName = input.forceNewSession ? createAgentSession() : getOrCreateAgentSession();
let systemPrompt = "SYSTEM PROMPT START Do not respond with tables but use bullet points instead.";
if (input.forceNewSession) {
systemPrompt += " Do not ask the user follow-up questions or converse with them as history is not kept in this interface.";
}
systemPrompt += " SYSTEM PROMPT END\n\n";
const queryText = isNewSession ? systemPrompt + input.text : input.text;
const requestPayload = {
"session": sessionName,
"userMetadata": { "timeZone": Session.getScriptTimeZone() },
"query": { "text": queryText },
"toolsSpec": { "vertexAiSearchSpec": { "dataStoreSpecs": getAgentDataStores().map(ds => { dataStore: ds }) } },
"agentsSpec": { "agentSpecs": [{ "agentId": getAgentId() }] }
};
const responseContentText = UrlFetchApp.fetch(
`https://${getLocation()}-discoveryengine.googleapis.com/v1alpha/${getReasoningEngine()}/assistants/default_assistant:streamAssist?alt=sse`,
{
method: 'post',
headers: { 'Authorization': `Bearer ${ScriptApp.getOAuthToken()}` },
contentType: 'application/json',
payload: JSON.stringify(requestPayload),
muteHttpExceptions: true
}
).getContentText();
if (isInDebugMode()) {
console.log(`Response: ${responseContentText}`);
}
const events = responseContentText.split('\n').map(s => s.replace(/^data:\s*/, '')).filter(s => s.trim().length > 0);
console.log(`Received ${events.length} agent events.`);
let answerText = "";
for (const eventJson of events) {
if (isInDebugMode()) {
console.log("Event: " + eventJson);
}
const event = JSON.parse(eventJson);
// Ignore internal events
if (!event.answer) {
console.log(`Ignored: internal event`);
continue;
}
// Handle text replies
const replies = event.answer.replies || [];
for (const reply of replies) {
const content = reply.groundedContent.content;
if (content) {
if (isInDebugMode()) {
console.log(`Processing content: ${JSON.stringify(content)}`);
}
if (content.thought) {
console.log(`Ignored: thought event`);
continue;
}
answerText += content.text;
}
}
if (event.answer.state === "SUCCEEDED") {
console.log(`Answer text: ${answerText}`);
return answerText;
} else if (event.answer.state !== "IN_PROGRESS") {
throw new Error("Something went wrong, check the Apps Script logs for more info.");
}
}
return answerText;
}
// Gets the list of data stores configured for the agent to include in the request.
function getAgentDataStores() {
const responseContentText = UrlFetchApp.fetch(
`https://${getLocation()}-discoveryengine.googleapis.com/v1/${getReasoningEngine().split('/').slice(0, 6).join('/')}/dataStores`,
{
method: 'get',
// Use the add on service account credentials for data store listing access
headers: { 'Authorization': `Bearer ${getAddonCredentials().getAccessToken()}` },
contentType: 'application/json',
muteHttpExceptions: true
}
).getContentText();
if (isInDebugMode()) {
console.log(`Response: ${responseContentText}`);
}
const dataStores = JSON.parse(responseContentText).dataStores.map(ds => ds.name);
if (isInDebugMode()) {
console.log(`Data stores: ${dataStores}`);
}
return dataStores;
}
...
Mulai akun layanan
Di konsol Google Cloud, ikuti langkah-langkah berikut:
- Klik Menu ☰ > IAM & Admin > Service Accounts > + Create service account.
- Tetapkan Service account name ke
ge-add-on.

- Klik Buat dan lanjutkan.
- Tambahkan peran Discovery Engine Viewer di izin.

- Klik Lanjutkan, lalu Selesai. Anda akan dialihkan ke halaman Service accounts dan dapat melihat akun layanan yang dibuat.

- Pilih akun layanan yang baru dibuat, lalu tab Kunci.
- Klik Tambahkan kunci, lalu Buat kunci baru.
- Pilih JSON, lalu klik Buat.

- Dialog akan ditutup dan pasangan kunci publik/pribadi yang baru dibuat akan otomatis didownload ke lingkungan lokal Anda sebagai file JSON.
Membuat dan Mengonfigurasi Project Apps Script
- Klik tombol berikut untuk membuka project Apps Script add-on AI Enterprise:
- Klik Ringkasan > Buat salinan.
- Di project Apps Script Anda, klik Setelan Project > Edit properti skrip > Tambahkan properti skrip untuk menambahkan properti skrip.
- Tetapkan REASONING_ENGINE_RESOURCE_NAME ke nama resource aplikasi Gemini Enterprise. Formatnya adalah sebagai berikut:
# 1. Replace PROJECT_ID with the Google Cloud project ID. # 2. Replace GE_APP_ID with the codelab app ID found in Google Cloud console > Gemini Enterprise > Apps. projects/<PROJECT_ID>/locations/global/collections/default_collection/engines/<GE_APP_ID>
- Tetapkan APP_SERVICE_ACCOUNT_KEY ke kunci JSON dari file akun layanan yang didownload pada langkah sebelumnya.
- Klik Simpan properti skrip
Men-deploy ke Gmail dan Chat
Di project Apps Script Anda, ikuti langkah-langkah berikut:
- Klik Deploy > Test deployments, lalu Install. Sekarang tersedia di Gmail.
- Klik Copy di bagian Head Deployment ID.

Di konsol Google Cloud, ikuti langkah-langkah berikut:
- Telusuri
Google Chat APIdi kolom penelusuran Google Cloud, klik Google Chat API, klik Manage, lalu klik Configuration.
- Pilih Aktifkan fitur Interaktif.
- Batalkan pilihan Join spaces and group conversations.
- Di bagian Connection settings, pilih Apps Script.
- Tetapkan Deployment ID ke Head Deployment ID yang disalin di langkah sebelumnya.
- Di bagian Visibilitas, pilih Jadikan aplikasi Chat ini tersedia untuk orang dan grup tertentu di Domain Workspace Anda, lalu masukkan alamat email Anda.
- Klik Simpan.

Coba Add-On
Buka Google Chat di tab baru, lalu ikuti langkah-langkah berikut:
- Buka ruang pesan langsung dengan aplikasi Chat Gemini Enterprise.

- Klik Konfigurasi dan ikuti alur autentikasi.
- Ketik
What are my meetings for today?, lalu tekanenter. Aplikasi Chat Gemini Enterprise akan membalas dengan hasilnya.

Buka Gmail di tab baru, lalu ikuti langkah-langkah berikut:
- Kirim email ke diri Anda sendiri dengan Subjek yang disetel ke
We need to talkdan Isi yang disetel keAre you available today between 8 and 9 AM? - Buka pesan email yang baru diterima.
- Buka sidebar add-on Enterprise AI.
- Tetapkan Message ke
Am I? - Klik Kirim pesan.
- Jawaban ditampilkan setelah tombol.

6. Pembersihan
Hapus project Google Cloud
Agar tidak menimbulkan biaya pada Akun Google Cloud Anda untuk resource yang digunakan dalam codelab ini, sebaiknya hapus project Google Cloud tersebut.
Di konsol Google Cloud, ikuti langkah-langkah berikut:
- Klik Menu ☰ > IAM & Admin > Settings.
- Klik Shut down.
- Masukkan project ID.
- Klik Shut down anyway.

7. Selamat
Selamat! Anda telah membangun solusi yang memanfaatkan kecanggihan Gemini Enterprise dan Google Workspace untuk mempermudah pekerjaan karyawan.
Apa langkah selanjutnya?
Kami hanya menunjukkan kasus penggunaan yang paling umum dalam codelab ini, tetapi ada banyak area ekspansi yang mungkin ingin Anda pertimbangkan dalam solusi Anda, seperti berikut:
- Gunakan alat developer yang didukung AI seperti Gemini CLI dan Antigravity.
- Terintegrasi dengan framework dan alat agen lainnya seperti MCP kustom, panggilan fungsi kustom, dan UI generatif.
- Mengintegrasikan dengan model AI lain, termasuk model kustom, yang dihosting di platform khusus seperti Vertex AI.
- Mengintegrasikan dengan agen lain, yang dihosting di platform khusus seperti Dialogflow atau oleh pihak ketiga melalui Cloud Marketplace.
- Publikasikan agen di Cloud Marketplace untuk mendukung tim, organisasi, atau pengguna publik.
Pelajari lebih lanjut
Ada banyak referensi yang tersedia untuk developer seperti video YouTube, situs dokumentasi, contoh kode, dan tutorial:
- Pusat Developer Google Cloud
- Produk yang didukung | Server MCP Google Cloud
- A2UI
- Model Garden di Vertex AI | Google Cloud
- Ringkasan agen | Gemini Enterprise | Dokumentasi Google Cloud
- Menskalakan agen AI dengan Google Cloud Marketplace dan Gemini Enterprise
- Menawarkan agen AI melalui Google Cloud Marketplace
- Channel YouTube Developer Google Workspace - Selamat datang, Developer!
- Situs Developer Google Workspace
- Repositori GitHub untuk semua contoh add-on Google Workspace

