1. 總覽
歡迎來到「第二天」。建構應用程式並按下「發布」按鈕的過程很神奇,但實際流量會帶來實際的失敗。您不必再花費大量時間處理 YAML 或搜尋記錄,而是可以建構大量專業代理,代為管理作業基礎架構。本程式碼實驗室會說明 Google Cloud 的整合式堆疊 (Eventarc、Cloud Run、Firestore、Cloud Build、BigQuery) 如何讓代理程式輕鬆安全地擷取密鑰、串流記錄檔,以及立即修正問題。

在本程式碼實驗室中,您將從頭開始建構 DinoQuest (以 Gemini 為基礎的恐龍冒險遊戲),並將其連結至全代理式 CI/CD 管道。完成本課程後,您將:
- 在 Cloud Run 上執行的 DinoQuest 網頁應用程式 (服務名稱:
dinoquest) - 記錄檔分析管道:將 Cloud Run 記錄檔串流至 BigQuery,並產生互動式遊戲洞察資訊主控台
- 修復代理 (
remediation-agent):ADK 修復代理,可監控 Cloud Run 錯誤並自動修正,以 Eventarc 觸發的專屬 Cloud Run 服務形式部署 - CI 代理程式 (
ci-agent):讀取 PR 差異比較、智慧地設定測試範圍、透過 Cloud Build 建構 Docker 映像檔,並將提交狀態發布回 GitHub - CD 代理程式:評估部署風險、分配流量、監控指標,並自動升級或回溯
課程內容
- 如何將全端 Vite + FastAPI 應用程式以單一容器的形式部署至 Cloud Run
- 如何為 React 應用程式設定 Firebase 驗證和 Firestore
- 如何建構及部署 ADK 代理,透過 Eventarc 對 Pub/Sub 事件做出反應
- 如何將 Cloud Run 記錄檔傳送至 BigQuery,並查詢遊戲分析資料
- 如何為 CI 和初期測試部署編寫代理功能技能
軟硬體需求
- 已啟用計費功能的 Google Cloud 雲端專案
- Firebase 專案 (可與 GCP 專案相同)
- GitHub 帳戶和 DinoQuest 存放區的分支版本
- 透過 Gemini (Google 的代理程式執行器) 存取 Antigravity
gcloud已安裝 CLI 並完成驗證 - 請參閱下方的安裝說明node≥ 18 且npmpython3≥ 3.11git和gh(GitHub CLI)
安裝 gcloud CLI
macOS
brew install --cask google-cloud-sdk
或者從 cloud.google.com/sdk/docs/install 下載安裝程式。
Windows
winget install Google.CloudSDK
或者,從 cloud.google.com/sdk/docs/install 下載 Windows 安裝程式 (.exe) 並執行。
安裝完成後,請初始化並驗證:
gcloud init
gcloud auth login
gcloud auth application-default login
2. 設定 Firebase
每個代理程式都需要資料才能進行推理。DinoQuest 使用 Firestore 和 Firebase Auth 提供可供正式環境使用的資料層,我們的代理程式稍後會使用自然語言探索及更新這個資料層。
由於這個應用程式是透過 AI Studio 生成,因此與 Firebase 深度整合。使用 Firebase 有許多優點,其中最重要的是預先保護的架構和開箱即用的受管理資料存取權,可確保遊戲狀態從第一天起就受到保護。
A. 建立 Firebase 專案
- 前往 console.firebase.google.com
- 按一下「新增專案」 (隱藏在「建立新專案」選項中) → 選取現有的 GCP 專案 (或建立新專案)
- 如果系統提示停用 Google Analytics,請停用 → 建立專案 (或直接使用預設設定)
B. 啟用 Google 驗證
- 在 Firebase 控制台中,依序前往「安全性」→「驗證」(開始使用) →「登入方法」
- 依序點按「Google」→ 切換「啟用」→ 儲存支援電子郵件地址 →「儲存」
C. 將 localhost 新增為授權網域
- 在「驗證」頁面中,按一下「設定」分頁標籤
- 在「授權網域」下方,確認
localhost是否已列出 (預設應會列出)
D. 建立 Firestore 資料庫
- 依序前往「Database & Storage」→「Firestore Database」→「Create database」
- 選擇「Standard 版」→「下一步」
- 選取區域
us-central1(或與 Cloud Run 區域相符) - 選擇「以正式版模式啟動」→「建立」
建立完成後,請記下您的 資料庫 ID,除非您已命名,否則 ID 會顯示為 (default)。
E. 設定 Firebase 安全性規則
在「Firestore Database」→「Rules」中,將預設規則替換為:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// ===============================================================
// Helper Functions
// ===============================================================
function isAuthenticated() {
return request.auth != null;
}
function isOwner(userId) {
return isAuthenticated() && request.auth.uid == userId;
}
function isValidUser(data) {
return data.keys().hasAll(['uid', 'email']) &&
data.uid is string && data.uid.size() > 0 &&
(data.email == null || (data.email is string && data.email.matches("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")));
}
function isValidDinosaur(data) {
return data.keys().hasAll(['userId', 'name', 'type']) &&
data.userId == request.auth.uid &&
data.name is string && data.name.size() > 0 && data.name.size() < 50 &&
data.type in ['Speedy', 'Tank', 'Balanced', 'Agile'];
}
function isValidGame(data) {
return data.keys().hasAll(['userId', 'score']) &&
data.userId == request.auth.uid &&
data.score is number && data.score >= 0;
}
match /users/{userId} {
allow read: if isOwner(userId);
allow create: if isOwner(userId) && isValidUser(request.resource.data);
allow update: if isOwner(userId) && isValidUser(request.resource.data);
match /dinosaurs/{dinoId} {
allow read: if isOwner(userId);
allow create: if isOwner(userId) && isValidDinosaur(request.resource.data);
allow update: if isOwner(userId) && isValidDinosaur(request.resource.data);
}
match /games/{gameId} {
allow read: if isOwner(userId);
allow create: if isOwner(userId) && isValidGame(request.resource.data);
}
match /seenAnnouncements/{announcementId} {
allow read, create: if isOwner(userId);
}
}
match /announcements/{announcementId} {
allow read: if isAuthenticated();
}
// Default deny
match /{document=**} {
allow read, write: if false;
}
match /scores/{scoreId} {
allow read: if true;
allow create: if isAuthenticated();
allow update: if false;
}
}
}
按一下「發布」。
F. 新增網頁應用程式並取得設定
- 依序前往「專案設定」 (齒輪圖示) →「一般」分頁
- 捲動至「您的應用程式」→ 點選「新增應用程式」→ 選擇「網站」圖示 (
) - 將其命名為
dinoquest→ 註冊應用程式 - 複製顯示的
firebaseConfig物件,稍後會用到
3. 執行遊戲
代理程式角色:環境。我們需要先為代理程式提供管理的世界,才能讓代理程式開始工作。在這個步驟中,我們會部署 DinoQuest 的「第一天」版本。這會建立直播服務、記錄和狀態,供我們的叢集稍後探索及管理。

請選擇下列其中一個選項。兩者都會產生 GEMINI_API_KEY,您可以在後續步驟中以相同方式使用,不需進行其他變更。
A. 設定 Gemini API 金鑰
做法 A:Vertex AI Gemini API 金鑰 (如果您有 GCP 專案,建議使用這個方法)
Vertex AI 可讓您使用專案的預設服務帳戶,直接建立與 GCP 專案繫結的 Gemini API 金鑰,並透過該專案計費,不必另外建立 AI Studio 帳戶。
- 匯出 GCP 專案 ID:
export PROJECT_ID=<YOUR_PROJECT_ID> - 啟用必要 API,並將必要權限授予 Compute Engine 預設服務帳戶:
gcloud auth application-default set-quota-project $PROJECT_ID gcloud config set project $PROJECT_ID # Enable Vertex AI, Compute Engine, and Generative Language APIs gcloud services enable aiplatform.googleapis.com \ compute.googleapis.com \ generativelanguage.googleapis.com # Grant Vertex AI User role to the default compute service account PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)") gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \ --role="roles/aiplatform.user" \ --condition=None - 在 Cloud 控制台中開啟 Vertex AI API 金鑰頁面
- 按一下「建立憑證」→ 選取「API 金鑰」
- 在建立對話方塊中:
- 將金鑰命名為
Dino_Key - 勾選「透過服務帳戶驗證 API 呼叫」方塊
- 在「服務帳戶」下方,選取預設的 Compute 服務帳戶 (
PROJECT_NUMBER-compute@developer.gserviceaccount.com)。 - 返回「選取 API 限制」,勾選「GEMINI API」
- 按一下「Create」(建立)
- 將金鑰命名為
- 複製產生的金鑰。
做法 B:AI Studio (本機開發最快)
- 開啟 aistudio.google.com
- 按一下左側邊欄中的「取得 API 金鑰」
- 按一下「建立 API 金鑰」→ 選擇 GCP 專案 → 複製金鑰
後續步驟會將任一鍵設為 GEMINI_API_KEY,後端會以相同方式處理這兩個鍵。
複製存放區
課程存放區位於 https://github.com/gca-americas/dinoquest。請先建立分支,並新增至您的 GitHub 帳戶。我們會請專員處理您的存放區。
完成分叉後,請複製分叉 DinoQuest 存放區的 main 分支,然後輸入專案目錄:
git clone https://github.com/YOUR_GITHUB_USERNAME/dinoquest.git
cd dinoquest
B. 設定環境變數
在本程式碼研究室中,每次開啟新的 Bash 終端機時,請務必設定這些重要環境變數。將預留位置值替換為實際專案詳細資料:
首先,匯出 GitHub 存放區網址:
export GITHUB_REPO_URL=https://github.com/YOUR_GITHUB_USERNAME/dinoquest
然後匯出其餘環境變數:
export PROJECT_ID=your-project-id
export GOOGLE_CLOUD_PROJECT=$PROJECT_ID
export CLOUD_RUN_REGION=us-central1
export GOOGLE_GENAI_USE_VERTEXAI=True
export HARNESS_EVENTS_TOPIC=projects/$PROJECT_ID/topics/harness-events
export CLOUD_BUILD_REPO=<YOUR_GITHUB_USERNAME>-dinoquest
確認結構正確無誤:
dinoquest/
├── backend/ # FastAPI backend (serves frontend + Gemini API calls)
├── frontend/ # React/Vite frontend
├── skills/ # Agentic CI/CD skill files
├── Dockerfile # Multi-stage build (React → Python)
├── start.sh # Local dev launcher
└── README.md
B. 建立後端環境檔案
首先,請匯出 Gemini API 金鑰:
export GEMINI_API_KEY=YOUR_GEMINI_API_KEY_FROM_STEP_2
然後建立 .env 檔案:
cat > backend/.env <<EOF
GEMINI_API_KEY=$GEMINI_API_KEY
GOOGLE_GENAI_USE_VERTEXAI=False
GOOGLE_CLOUD_PROJECT=$PROJECT_ID
EOF
C. 啟用 Firebase App Check / 服務帳戶 (適用於 Cloud Run)
在 Cloud Run 上執行時,後端會使用應用程式預設憑證與 Firebase 通訊,不需要服務帳戶金鑰檔案。firebase_admin.initialize_app()通話會在 backend/main.py 自動接聽。
在本機開發時,請驗證一次:
gcloud auth application-default login
D. 建立 Firebase 應用程式設定檔
在 frontend/ 目錄中,使用上一個步驟的設定建立 firebase-applet-config.json:
{
"apiKey": "YOUR_API_KEY",
"authDomain": "YOUR_PROJECT_ID.firebaseapp.com",
"projectId": "YOUR_PROJECT_ID",
"storageBucket": "YOUR_PROJECT_ID.appspot.com",
"messagingSenderId": "YOUR_SENDER_ID",
"appId": "YOUR_APP_ID",
"firestoreDatabaseId": "(default)"
}
注意: firestoreDatabaseId 應與您在上一步驟中建立的資料庫 ID 相符。如果您使用預設值,請保留 "(default)"。
將變更修訂回存放區:
git add frontend/firebase-applet-config.json
git commit -m "chore: add firebase config"
git push origin main
C. 在本機執行 DinoQuest
1. 啟用必要的 API
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
secretmanager.googleapis.com \
firestore.googleapis.com \
logging.googleapis.com \
pubsub.googleapis.com \
eventarc.googleapis.com \
aiplatform.googleapis.com \
bigquery.googleapis.com \
aiplatform.googleapis.com
2. 開始 DinoQuest
start.sh 指令碼會建構 React 前端,並將終端機交給 FastAPI 後端,後者會提供已編譯的靜態檔案:
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt -q
cd ..
# Force-remove the Vertex AI flag from the current terminal session to avoid conflicts
unset GOOGLE_GENAI_USE_VERTEXAI
./start.sh
在瀏覽器中開啟 http://localhost:8000。您應該會看到 DinoQuest 標題畫面。使用 Google 帳戶登入,產生第一隻恐龍,並確認恐龍已儲存至 Firestore。
疑難排解:如果看到空白頁面或 Firebase 驗證錯誤,請再次確認 frontend/firebase-applet-config.json 的值是否正確,以及 localhost 是否在授權網域清單中。
E. 將 DinoQuest 部署至 Cloud Run
1. 設定專案
export PROJECT_ID=$(gcloud config get-value project)
3. 建立 Artifact Registry 存放區
gcloud artifacts repositories create dinoquest \
--repository-format=docker \
--location=$CLOUD_RUN_REGION \
--description="DinoQuest container images"
4. 將 Gemini API 金鑰儲存在 Secret Manager
echo -n $GEMINI_API_KEY | \
gcloud secrets create gemini-api-key --data-file=-
# Grant the default compute service account access to the secret
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
gcloud secrets add-iam-policy-binding gemini-api-key \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
5. 使用 Cloud Build 建構容器映像檔
gcloud builds submit \
--tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/app:latest .
這會執行多級式 Dockerfile:先建構 React 應用程式,然後將輸出內容封裝到 FastAPI 映像檔中。大約需要 3 到 5 分鐘。
6. 部署至 Cloud Run
首先,請匯出管理員電子郵件地址:
export ADMIN_EMAIL=<YOUR_TEST_ACCOUNT_EMAIL>
然後部署服務:
gcloud run deploy dinoquest \
--image=$CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/app:latest \
--region=$CLOUD_RUN_REGION \
--platform=managed \
--allow-unauthenticated \
--memory=128Mi \
--set-secrets="GEMINI_API_KEY=gemini-api-key:latest" \
--set-env-vars="ADMIN_EMAILS=$ADMIN_EMAIL" \
--set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=False" \
--set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID"
指令完成後,Cloud Run 會列印「服務網址」。複製這個網址,您需要這個網址才能在 Firebase 中授權網域。
7. 在 Firebase 中授權 Cloud Run 網域
如要允許使用者從已部署的應用程式登入,請將 Cloud Run 網址新增至 Firebase 的授權網域:
- 返回 Firebase 控制台 → 依序點選「驗證」→「設定」→「已授權網域」
- 按一下「新增網域」。
- 貼上 Cloud Run 服務網址 (例如
dinoquest-xxxxx.us-central1.run.app) - 移除https://前置字元 - 按一下「儲存」。
8. 填充排行榜資料
如要為遊戲注入一些初始「生命力」,並確保代理程式有資料可用,您可以為排行榜提供一些起始分數。
- 確認您位於
dinoquest根目錄:cd ~/dinoquest - 建立並啟動虛擬環境:
python3 -m venv venv source venv/bin/activate - 安裝必要的 Firestore 依附元件:
pip install google-cloud-firestore - 執行播種指令碼:
python3 prep/seed_scores.py - 停用虛擬環境:
deactivate
現在您可以在瀏覽器中開啟服務網址,DinoQuest 已經完全上線!
4. 設定 Dino Theater
服務專員角色:視覺化工具。如何監控自主代理程式團隊?Dino Theater 可即時顯示代理程式群組的運作情形。您不必盯著終端機記錄,而是可以在即時視覺化資訊主頁中,觀看代理程式的推理過程、彼此呼叫,以及在雲端執行工作。

A. 將 Dino Theater 部署至 Cloud Run
首先,請返回主目錄並複製 Dino Theater 程式碼:
cd ~
git clone https://github.com/gca-americas/dinoquest-theater.git
cd dinoquest-theater
- 建構及推送容器:
gcloud builds submit --tag $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest . - 設定服務帳戶和權限:
# Create the service account gcloud iam service-accounts create dino-theater # Create the Pub/Sub topic (if you haven't yet) gcloud pubsub topics create harness-events # Create the subscription gcloud pubsub subscriptions create harness-events-theater \ --topic=harness-events # Grant subscriber role gcloud pubsub subscriptions add-iam-policy-binding harness-events-theater \ --member="serviceAccount:dino-theater@${PROJECT_ID}.iam.gserviceaccount.com" \ --role="roles/pubsub.subscriber" - 部署應用程式:
注意:建議使用gcloud run deploy dino-theater \ --image $CLOUD_RUN_REGION-docker.pkg.dev/$PROJECT_ID/dinoquest/dino-theater:latest \ --region=$CLOUD_RUN_REGION \ --service-account=dino-theater@${PROJECT_ID}.iam.gserviceaccount.com \ --set-env-vars="GOOGLE_CLOUD_PROJECT=$PROJECT_ID" \ --allow-unauthenticated \ --min-instances=1--min-instances=1,在事件之間保持 SSE 連線有效。 - 確認運作正常:在瀏覽器中開啟已部署的服務網址 (例如
https://dino-theater-xxx-uc.a.run.app/demo)。
5. IDE 中的代理式 DevOps
代理程式角色:原生反重力。為縮短 IDE 與雲端之間的差距,我們將 Antigravity 連線至 Google Cloud 的受管理 MCP 伺服器。這樣一來,原生代理程式就能「看見」專案,進而剖析記錄、檢查指標及推斷基礎架構,您不必再費心處理 API 金鑰或切換到控制台。
執行任何技能前,請先設定 Antigravity 的 Google Cloud 存取權,並載入 DinoQuest 技能劇本。
A. 安裝 Google 代管的 MCP 服務
Google 的代管 MCP 服務提供單一託管端點,可存取所有 Google Cloud API。
使用應用程式預設憑證進行驗證:
gcloud auth application-default login
B. 設定 mcp_config.json
在 Antigravity 設定目錄 (通常為 ~/.gemini/antigravity/mcp_config.json) 中,或透過控制台建立或更新 mcp_config.json。這可讓 Antigravity 存取技能所需的 Google Cloud 和 GitHub 工具:
{
"mcpServers": {
"google-developer-knowledge": {
"serverUrl": "https://developerknowledge.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-bigquery": {
"serverUrl": "https://bigquery.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-cloud-logging": {
"serverUrl": "https://logging.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-cloud-monitoring": {
"serverUrl": "https://monitoring.googleapis.com/mcp",
"authProviderType": "google_credentials",
"disabledTools": [
"get_dashboard",
"list_dashboards"
]
},
"google-cloud-run": {
"serverUrl": "https://run.googleapis.com/mcp",
"authProviderType": "google_credentials",
"disabledTools": [
"deploy_service_from_image",
"deploy_service_from_archive",
"deploy_service_from_file_contents"
]
},
"google-cloud-sql": {
"serverUrl": "https://sqladmin.googleapis.com/mcp",
"authProviderType": "google_credentials",
"disabled": true
},
"google-cloud-trace": {
"serverUrl": "https://cloudtrace.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-error-reporting": {
"serverUrl": "https://clouderrorreporting.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-firestore": {
"serverUrl": "https://firestore.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"google-resource-manager": {
"serverUrl": "https://cloudresourcemanager.googleapis.com/mcp",
"authProviderType": "google_credentials"
},
"gemini-cloud-assist": {
"serverUrl": "https://geminicloudassist.googleapis.com/mcp",
"authProviderType": "google_credentials"
}
}
}
C. 將技能載入 Antigravity (選用)
Antigravity 會在特定標準目錄中探索技能。將複製的存放區中的 DinoQuest 技能複製到全域 Antigravity 技能資料夾:
# Create the standard skills directory if it doesn't exist
mkdir -p ~/.gemini/antigravity/skills
# Copy all DinoQuest skills into the global skills folder
cp -r skills/* ~/.gemini/antigravity/skills/
D. 重新啟動 Antigravity(選用)
如要套用 mcp_config.json 變更並載入新複製的技能,請重新啟動 Antigravity 應用程式。
重新啟動後:
- 確認「設定」中的 google 和 github MCP 伺服器顯示綠色的「已連線」狀態。
- 確認 DinoQuest 技能顯示在技能清單中。
注意:每項技能的 SKILL.md 頂端都有 ## Configuration 表格。複製後,請更新 ~/.gemini/antigravity/skills/ 中的值,使其與專案相符。
E. 在本機 IDE 中修正雲端服務
- 觸發錯誤:在瀏覽器中開啟您部署的 DinoQuest 網址 (上一個步驟)。
- 前往排行榜:按一下「排行榜」按鈕。目前的排行榜實作方式刻意降低效率,會嘗試將大量資料載入記憶體,觸發記憶體不足 (OOM) 錯誤。
- 在 Antigravity Agent Manager (Agent HUB) 中,要求協助復原錯誤,並盡可能修正根本原因。
- 提示 1:找出 dinoquest 的問題。
- 提示 2:請查看 Dinoquest 遊戲的程式碼,並修正導致記憶體不足錯誤的原因。
6. 將記錄串流至 BigQuery 並產生分析資料
代理程式角色:資料代理程式。將原始記錄轉換為可執行的產品策略,不應耗費數小時的手動資料管道作業。我們使用 Data Agent Kit 和 BigQuery MCP 建立「零 ETL」管道,將記錄直接串流至 BigQuery,讓代理程式在兩分鐘內產生進階數據分析資訊主頁。
log-router-bq-report 技能會設定 Cloud Logging 接收器,持續將 DinoQuest 的 Cloud Run 記錄檔串流至 BigQuery,然後查詢資料以產生流量報表和遊戲分析洞察資料。

A. 設定技能變數
開啟 DinoQuest 存放區中的 skills/log-router-bq-report/SKILL.md,然後更新頂端的「Configuration」部分:
| Variable | Your Value |
|---------------|--------------------|
| SERVICE_NAME | dinoquest |
| BQ_DATASET | dinoquest_logs |
| LOG_SINK_NAME | dinoquest-bq-sink |
B. 在 Antigravity 中執行技能
以 DinoQuest repo 做為背景資訊開啟 Antigravity,然後告訴 Gemini:
Run the log-router-bq-report skill
這項技能將:
- 自動解決 GCP 專案問題
- 檢查 BigQuery 接收器是否已存在,如果沒有,系統會建立資料集和接收器。
- 授予 IAM 權限:這會將資料集的「BigQuery 資料編輯者」角色授予接收器的
writerIdentity。
注意:與 Eventarc 接收器一樣,您可能會在此程序中看到 gcloud 發出的警告:「請記得在資料集上授予 serviceAccount:service-... BigQuery 資料編輯者角色。」這項作業會由技能自動處理。
C. 使用 Antigravity 生成報表
只要要求 Antigravity「設定 BigQuery 記錄檔接收器並產生數據分析報表」,服務專員會:
- 設定基礎架構:建立 BigQuery 資料集和 Cloud Logging 接收器。
- 管理權限:自動將必要的 IAM 角色授予接收器的寫入者身分。
- 生成深入分析:分析記錄並製作進階互動式 HTML 資訊主頁,其中包含遊戲遙測資料和勝率分析。
7. 自我修復修復代理程式
代理程式角色:SRE 代理程式。如果生產服務在凌晨 2 點發生故障,您不應該需要起床。這個代理程式會擔任第一線服務人員,透過 Eventarc 觸發 Cloud Run 錯誤記錄後,系統會自動分析當機情形、提出修正建議,並啟動修復管道,完全不需要登入控制台。
DinoAgent 是 ADK 代理程式,可透過 Eventarc 監聽 Cloud Run 錯誤記錄、診斷根本原因,並自動修正問題,方法包括增加記憶體、回溯流量,或在 GitHub 上提交程式碼修正 PR。

A. 複製 Remediation Agent 存放區
cd ~
git clone https://github.com/gca-americas/dinoquest-reme-agent.git
cd dinoquest-reme-agent
專案結構:
dinoquest-reme-agent/
├── main.py # Service entrypoint — receives Eventarc HTTP POST, runs agent
├── runner.py # ADK Runner + session service
├── agent.py # LlmAgent definition, loads skill from file
├── tools.py # Cloud Run v2 API tools (list/get/rollback/update)
├── skills/
│ └── remediation/
│ ├── SKILL.md # Agent playbook — edit this to change behavior
│ └── scripts/ # Shell scripts for the code-fix track
│ ├── clone_repo.sh
│ ├── read_file.sh
│ ├── apply_fix.sh
│ ├── commit_branch.sh
│ ├── open_pr.sh
│ └── rollback_fix.sh
├── requirements.txt
└── Dockerfile
B. 設定 GitHub 存取權 (程式碼修正軌)
程式碼修正軌會複製 DinoQuest 存放區、讀取來源檔案、套用修補程式,並開啟 PR。這需要具有 repo 範圍的 GitHub 個人存取權杖。
- 前往 github.com/settings/tokens → Generate new token (classic)
- 為權杖命名,選取
repo範圍 →「產生權杖」→ 複製權杖
將其儲存在 Secret Manager 中:
首先,匯出 GitHub 權杖:
export GH_TOKEN=ghp_YOUR_TOKEN_HERE
接著建立密鑰:
echo -n $GH_TOKEN | \
gcloud secrets create github-token --data-file=-
C. 設定 Slack 通知 (選用)
補救措施完成後,DinoAgent 會在 Slack 頻道發布摘要。
- 前往 api.slack.com/apps → 依序點選「Create New App」(建立新應用程式) →「From scratch」(從頭開始)
- 將其命名為
DinoAgent,選取工作區 → 點選「建立應用程式」 - 依序點選「功能」→「連入的 Webhook」→ 開啟切換按鈕
- 依序按一下「Add New Webhook to Workspace」(將 Webhook 新增至工作區) → 選擇頻道 →「Allow」(允許)
- 複製 Webhook 網址 (
https://hooks.slack.com/services/...)
將其儲存在 Secret Manager 中:
export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
gcloud secrets create slack-webhook --data-file=-
D. 建立 DinoAgent 服務帳戶
gcloud iam service-accounts create remediation-agent \
--display-name="Cloud Run Remediation Agent"
export SA="remediation-agent@${PROJECT_ID}.iam.gserviceaccount.com"
for ROLE in \
roles/run.admin \
roles/iam.serviceAccountUser \
roles/eventarc.eventReceiver \
roles/aiplatform.user \
roles/artifactregistry.reader \
roles/secretmanager.secretAccessor \
roles/pubsub.publisher \
roles/logging.viewer; do
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${SA}" --role="$ROLE" \
--condition=None
done
授予存取密鑰的權限:
for SECRET in github-token slack-webhook; do
gcloud secrets add-iam-policy-binding $SECRET \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
done
E. 在 Cloud Run 建構及部署 DinoAgent
# Get Project Number for the CIAgent URL
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export CIAGENT_URL=https://ci-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export SA="remediation-agent@${PROJECT_ID}.iam.gserviceaccount.com"
export GITHUB_REPO_URL=https://github.com/YOUR_REPO
HARNESS_EVENTS_TOPIC=projects/$PROJECT_ID/topics/harness-events
AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/remediation-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .
gcloud run deploy remediation-agent \
--image=$AGENT_IMAGE \
--region=$CLOUD_RUN_REGION \
--service-account=$SA \
--memory=2Gi \
--set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID},GOOGLE_GENAI_USE_VERTEXAI=True" \
--set-env-vars="GITHUB_REPO_URL=${GITHUB_REPO_URL}" \
--set-secrets="SLACK_WEBHOOK_URL=slack-webhook:latest" \
--set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
--set-env-vars="CIAGENT_URL=${CIAGENT_URL}" \
--set-secrets="GITHUB_TOKEN=github-token:latest" \
--no-allow-unauthenticated \
--min-instances=1 \
--no-cpu-throttling \
--timeout=300
F. 連結 Eventarc 觸發條件
建立 Pub/Sub 主題,接收 Cloud Run 錯誤記錄:
gcloud pubsub topics create cloud-run-errors
建立 Cloud Logging 接收器,篩選 dinoquest 服務的錯誤記錄,並將其轉送至主題:
export SERVICE_NAME=dinoquest
FILTER="resource.type=\"cloud_run_revision\" resource.labels.service_name=\"$SERVICE_NAME\" severity=ERROR NOT logName=~\"cloudaudit\" NOT httpRequest.requestUrl=~\"/_ah/health\""
gcloud logging sinks create cloud-run-errors-sink \
pubsub.googleapis.com/projects/${PROJECT_ID}/topics/cloud-run-errors \
--log-filter="$FILTER"
注意:執行上述指令時,gcloud 會顯示「Info」訊息,內容為「Please remember to grant serviceAccount:service-... the Pub/Sub Publisher role on the topic.」(請記得在主題上授予服務帳戶:service-... Pub/Sub 發布者角色)。下一個步驟會處理這項作業。
請授予接收器的寫入者身分 (警告中提及的服務帳戶) 發布權限:
SINK_SA=$(gcloud logging sinks describe cloud-run-errors-sink \
--format='value(writerIdentity)')
gcloud pubsub topics add-iam-policy-binding cloud-run-errors \
--member="${SINK_SA}" --role="roles/pubsub.publisher"
確認是否已啟用:
gcloud eventarc triggers describe remediation-trigger --location=$CLOUD_RUN_REGION
授予 Eventarc 權限,以叫用補救代理程式:
gcloud run services add-iam-policy-binding remediation-agent \
--region=$CLOUD_RUN_REGION \
--member="serviceAccount:${SA}" \
--role="roles/run.invoker"
建立 Eventarc 觸發條件:
gcloud eventarc triggers create remediation-trigger \
--location=$CLOUD_RUN_REGION \
--destination-run-service=remediation-agent \
--destination-run-region=$CLOUD_RUN_REGION \
--event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
--transport-topic=projects/${PROJECT_ID}/topics/cloud-run-errors \
--service-account=${SA}
現在系統會自動修正問題。除了擴充基礎架構,DinoAgent 還會對應用程式程式碼執行深入的根本原因分析、套用語意修補程式,並使用代理間 (A2A) 通訊,將修正內容交給 CI 代理進行驗證和部署。如要瞭解實作詳細資料,請參閱 reme-agent 程式碼集。
8. 設定 CI 代理程式
代理程式角色:CI 管道。不必再為複雜的 YAML 檔案和手動建構指令碼而煩惱。這個代理程式會管理 PR 的運作管道。這個指令會讀取程式碼變更、瞭解內容、設定必要測試的範圍,並透過 Cloud Build 建構 Docker 映像檔,確保每個修訂版本在送達主要分支版本前,都已「獲得代理程式核准」。
ci-agent 是以 Cloud Run 服務形式部署的自主 CI 管道代理程式。這個工具會將 Docker 建構作業提交至 Cloud Build、輪詢完成狀態、驗證 Artifact Registry 中的映像檔,並向 GitHub 回報。

為什麼要為 CI 管道使用代理程式?與傳統靜態指令碼不同,代理式 CI 管道提供:
- 認知範圍分類:根據程式碼變更的語意影響,智慧判斷所需的測試深度,在型別檢查、單元測試或完整整合套件之間切換。
- 自主 PR 管理:代理程式可自動建立 PR、發布詳細的變更摘要,甚至管理機密掃描和安全稽核,無須人為介入。
- 即時診斷失敗原因:建構失敗時,代理程式不只會顯示記錄,還會分析堆疊追蹤記錄、找出可能原因,並直接在 PR 中發布易於解讀的診斷結果。
A. 複製 CIAgent 存放區
cd ~
git clone https://github.com/gca-americas/dinoquest-ci-agent.git
cd dinoquest-ci-agent
B. 建立 CIAgent 服務帳戶
gcloud iam service-accounts create ci-agent \
--display-name="CIAgent CI Pipeline"
export SA="ci-agent@${PROJECT_ID}.iam.gserviceaccount.com"
# Grant necessary roles to the service account
for ROLE in \
roles/cloudbuild.builds.editor \
roles/cloudbuild.builds.builder \
roles/artifactregistry.reader \
roles/artifactregistry.writer \
roles/aiplatform.user \
roles/secretmanager.secretAccessor \
roles/pubsub.publisher \
roles/developerconnect.admin; do
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${SA}" --role="$ROLE" \
--condition=None
done
# ci-agent needs to act as itself when running build steps
gcloud iam service-accounts add-iam-policy-binding $SA \
--member="serviceAccount:${SA}" \
--role="roles/iam.serviceAccountUser"
C. 將 GitHub 存放區連結至 Cloud Build
CIAgent 會透過 repoSource 提交建構作業,因此 GitHub 存放區必須連線至 Cloud Build Developer Connect。
- 前往 GCP 主控台 → Cloud Build → 存放區
- 按一下「連結存放區」
- 選取「GitHub (Cloud Build GitHub 應用程式)」
- 授權並選取
YOUR_GITHUB_USERNAME/dinoquest存放區 - 系統提示建立觸發條件時,請按一下「連線」和「略過」。
- 記下連線名稱 (預設通常是 GitHub 使用者名稱或類似名稱)。
D. 授予 CIAgent 密鑰存取權
我們會重複使用先前為 DinoAgent 建立的密鑰:
gcloud secrets add-iam-policy-binding github-token \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
gcloud secrets add-iam-policy-binding slack-webhook-ci \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
E. 建構 CIAgent 並部署至 Cloud Run
# Set up required variables for orchestration
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export CDAGENT_URL=https://cd-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export CI_AGENT_URL=ci-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export GITHUB_OWNER="YOUR_GITHUB_USERNAME"
export CLOUD_BUILD_CONNECTION="YOUR_CONNECTION_NAME" # Update this if your connection name is different
export CLOUD_BUILD_REPO="YOUR_GITHUB_USERNAME-dinoquest" # Update this if your connection name is different
export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
gcloud secrets create slack-webhook-ci --data-file=-
export SA="ci-agent@${PROJECT_ID}.iam.gserviceaccount.com"
AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/ci-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .
gcloud run deploy ci-agent \
--image=$AGENT_IMAGE \
--region=$CLOUD_RUN_REGION \
--service-account=$SA \
--memory=1Gi \
--timeout=600 \
--allow-unauthenticated \
--min-instances=1 \
--set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID},GOOGLE_GENAI_USE_VERTEXAI=True" \
--set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
--set-env-vars="HOST=${CI_AGENT_URL},PROTOCOL=https" \
--set-secrets="SLACK_WEBHOOK_URL=slack-webhook-ci:latest" \
--set-env-vars="GITHUB_OWNER=${GITHUB_OWNER},GITHUB_REPO=dinoquest" \
--set-env-vars="CLOUD_BUILD_CONNECTION=${CLOUD_BUILD_CONNECTION},CLOUD_BUILD_REPO=${CLOUD_BUILD_REPO},CLOUD_BUILD_REGION=${CLOUD_RUN_REGION}" \
--set-env-vars="CDAGENT_URL=${CDAGENT_URL}" \
--set-secrets="GITHUB_TOKEN=github-token:latest" \
--min-instances=1
F. 設定 Slack 斜線指令
- 前往 api.slack.com/apps → 點選「Create New App」→ 點選「From scratch」
- 將其命名為
CIAgent,然後選取工作區 → 點選「建立應用程式」 - 依序點選「Features」(功能)「Slash Commands」(斜線指令)「Create New Command」(建立新指令)。
- 指令:
/runci - 要求網址:上述 CIAgent Cloud Run 網址,並附加
/slack(例如https://ci-agent-xxx-.us-central1.run.app/slack) - 簡短說明:
Trigger CI - 儲存
- 依序點選「設定」→「安裝應用程式」,然後按一下「安裝到 Workspace」並選取「允許」。
CI 代理程式是「大腦」,位於 Cloud Build 和 Artifact Registry 等強大的 Google Cloud 服務之上。建構作業通過驗證後,系統會透過 A2A 呼叫 CD 代理程式,觸發最終部署階段,確保建構和發布週期之間順利交接。
9. 設定部署作業
代理人角色:CD 代理人。部署不應是碰運氣。這個代理人會為您管理風險。這項功能會評估部署安全性、管理 Canary 流量分配,以及監控即時指標,以決定是否要發布或回溯版本。這是自主代理程式群組中的最後一道關卡。
cd-agent 是以 Cloud Run 服務形式部署的自主初期測試部署代理程式。這項服務會接收 ci-agent 的 A2A 部署要求、計算風險分數、設定經過風險校準的初期測試版本百分比、監控指標,以及自動升級或復原。也會從過去使用 Firestore 的部署作業中學習。

直接連結代理程式會建立「認知管道」,每次交接時都會豐富地轉移意圖和情境。與傳統 Webhook 不同,A2A 通訊可進行下列操作:
- 智慧型情境分享:代理會傳遞整個工作階段的記憶體、PR 差異和風險分數,確保下一個代理在開始工作前,充分瞭解「原因」。
- 認知握手:代理程式可以協商閘道。舉例來說,在 Canary 推出期間,CD 代理程式可以向 CI 代理程式要求進行特定煙霧測試,即時驗證修正。
- 協作式修復:如果部署失敗,CD 代理程式可以主動通知修復代理程式失敗的指標,在人員收到通知前,啟動自主根本原因分析。
- 資源協商:代理商可以協商基礎架構需求。舉例來說,如果 CI 代理程式偵測到大規模重構,可以要求修復代理程式提供更多建構容量;CD 代理程式則可以在重大版本發布前,建議擴充正式環境叢集。
- 多代理共識:對於高風險變更,多個代理程式 (例如安全代理程式和 CD 代理程式) 可透過 A2A 執行「聯合簽核」,確保程式碼不僅能建構及部署,還符合安全政策,然後再發布至正式環境。
A. 複製 CDAgent 存放區
cd ~
git clone https://github.com/gca-americas/dinoquest-cd-agent.git
cd dinoquest-cd-agent
B. 建立 Firestore 資料庫
CDAgent 會將部署記憶體模式儲存在 Firestore 中:
gcloud firestore databases create \
--region=$CLOUD_RUN_REGION \
--project=$PROJECT_ID
(如果您已在這個專案中建立資料庫,可以略過這個步驟)。
C. 建立 CDAgent 服務帳戶
gcloud iam service-accounts create cd-agent \
--display-name="CDAgent Canary Deployer"
export SA="cd-agent@${PROJECT_ID}.iam.gserviceaccount.com"
# Grant necessary roles
for ROLE in \
roles/run.developer \
roles/iam.serviceAccountUser \
roles/artifactregistry.reader \
roles/artifactregistry.writer \
roles/monitoring.viewer \
roles/datastore.user \
roles/aiplatform.user \
roles/run.admin \
roles/pubsub.publisher; do
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${SA}" --role="$ROLE" \
--condition=None
done
D. 授予 CDAgent 密鑰存取權
我們將沿用先前的 GitHub 權杖和 Slack Webhook,並授予 Cloud Run Compute 服務帳戶 Gemini API 金鑰的存取權,讓部署的應用程式可以使用該金鑰:
gcloud secrets add-iam-policy-binding github-token \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
gcloud secrets add-iam-policy-binding slack-webhook-cd \
--member="serviceAccount:${SA}" \
--role="roles/secretmanager.secretAccessor"
# Grant the compute service account access to Gemini API key
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
gcloud secrets add-iam-policy-binding gemini-api-key \
--project=$PROJECT_ID \
--member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \
--role="roles/secretmanager.secretAccessor"
E. 建構 CDAgent 並部署至 Cloud Run
export GITHUB_OWNER="YOUR_GITHUB_USERNAME"
export CD_AGENT_URL=cd-agent-${PROJECT_NUMBER}.${CLOUD_RUN_REGION}.run.app
export SLACK_TOKEN=YOUR_SLACK_WEBHOOK
echo -n "https://hooks.slack.com/services/$SLACK_TOKEN" | \
gcloud secrets create slack-webhook-cd --data-file=-
AGENT_IMAGE="$CLOUD_RUN_REGION-docker.pkg.dev/${PROJECT_ID}/dinoquest/cd-agent:latest"
gcloud builds submit --tag $AGENT_IMAGE .
export SA="cd-agent@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud run deploy cd-agent \
--image=$AGENT_IMAGE \
--region=$CLOUD_RUN_REGION \
--service-account=$SA \
--memory=1Gi \
--set-env-vars="GOOGLE_CLOUD_PROJECT=${PROJECT_ID}" \
--set-env-vars="GOOGLE_GENAI_USE_VERTEXAI=True" \
--set-env-vars="HOST=${CD_AGENT_URL},PROTOCOL=https" \
--set-env-vars="CD_TARGET_SERVICE=dinoquest" \
--set-env-vars="HARNESS_EVENTS_TOPIC=${HARNESS_EVENTS_TOPIC}" \
--set-env-vars="GITHUB_OWNER=${GITHUB_OWNER}" \
--set-env-vars="GITHUB_REPO=dinoquest" \
--set-env-vars="DEMO_MODE=true" \
--set-env-vars="LEADERBOARD_ENABLED=true" \
--set-secrets="SLACK_WEBHOOK_URL=slack-webhook-cd:latest" \
--set-secrets="GITHUB_TOKEN=github-token:latest" \
--allow-unauthenticated \
--min-instances=1 \
--no-cpu-throttling \
--timeout=300
注意: --min-instances=1 --no-cpu-throttling 會讓執行個體保持暖機狀態,以便快速回應 Slack 和 A2A 指令。
CD 代理程式是正式環境的最終把關者。這項功能會評估每次部署的風險、執行風險校準的初期測試,並監控即時指標。如果偵測到任何異常情況,系統會自動啟動回溯程序。
10. 擴大規模:運用 Agent Swarm 解鎖第 2 級
A. 測試完整蜂群
- 觸發錯誤:在瀏覽器中開啟您部署的 DinoQuest 網址 (上一個步驟)。
- 前往排行榜:按一下「排行榜」按鈕。目前的排行榜實作方式刻意降低效率,會嘗試將大量資料載入記憶體,觸發記憶體不足 (OOM) 錯誤。
- 等待代理程式:大約 60 秒內,
remediation-agent會透過 Eventarc 接收錯誤事件,並開始診斷。 - 檢查 Slack:Slack 管道中應該會顯示類似以下的通知:DinoAgent Remediation Summary
- 服務:dinoquest
- 失敗的修訂版本:dinoquest-xxxx-xxxx
- 證據:「Memory limit of 128 MiB exceeded with 13x MiB used.」(記憶體用量超過 128 MiB 上限,達到 13x MiB)。
- 這個修訂版本有何問題:
/api/leaderboard端點的 xxxxx 效率不彰,導致 OOM 錯誤。 - 採取行動:將服務
dinoquest的記憶體從 xMi 增加至 yGi。已建立新修訂版本。 - 根本原因 PR:https://github.com/YOUR_USERNAME/DinoQuest/pull/x
- 驗證修正結果:
- GitHub:檢查存放區是否有新分支和提取要求。代理程式已修補應用程式程式碼,修正基礎記憶體流失問題。
- Cloud Run:在 GCP 主控台中,您會看到
dinoquest服務的新修訂版本,其中包含更新後的記憶體配置。 - 排行榜:再次嘗試排行榜,現在應該可以順利載入,因為記憶體已增加,程式碼也已修正。
B. 演進:實作第 2 級遊戲邏輯
您將新增一項重要功能:第 2 級 (小行星摧毀者)。高分恐龍可進入新的遊戲模式。
- 返回 dinoquest 存放區:
cd ~/dinoquest - 建立並切換至新分支:
git checkout -b level_2 - 套用第 2 級修補程式:執行提供的指令碼,使用第 2 級素材、元件和遊戲邏輯修補本機程式碼集:
bash level_2_backup/levelup.sh - 修訂並推送變更:
git add . git commit -m "feat: add Level 2" git push origin level_2
我們將使用先前設定的 Slack Slash 指令,而不是使用 curl 手動觸發代理程式。這是在實際情境中與自主 CI 管道互動的方式。
- 開啟 Slack,然後前往已安裝
CIAgent應用程式的任何頻道。 - 輸入下列指令,觸發 CI 建構作業:
/runci run ci on branch level_2 - 監控進度:
- Slack:代理程式會確認您的指令,並在建構作業進行期間發布更新。
- Dino Theater:觀看「想法泡泡」,瞭解代理程式如何分類變更、提交 Cloud Build 工作,以及與 CD 代理程式通訊。
- GitHub:檢查
level_2PR,您會看到代理程式發布提交狀態和完整的 CI 報告註解。
- 觀看流程:
- 查看 Dino Theater,瞭解 CI 代理程式如何思考、分類變更及執行管道。
- 檢查 GitHub PR,查看 CI 代理程式發布的提交狀態和最終報告。
11. 結語
您已在 Google Cloud 上建構完整的代理式 DevOps 堆疊:
元件 | 用途 |
DinoQuest (Cloud Run | 採用 Gemini 的遊戲 - React 前端 + FastAPI 後端 |
Firebase 驗證 + Firestore | 使用者驗證和恐龍設定檔儲存空間 |
補救代理程式 (Cloud Run + Eventarc) | SRE 代理程式,可自動修正 OOM 錯誤和程式碼錯誤 |
log-router-bq-report | 資料代理程式,可將記錄串流至 BigQuery 並產生洞察資料 |
CIAgent (Cloud Run) | CI 代理程式,透過 A2A 範圍測試、建構映像檔及呼叫 CD |
CDAgent (Cloud Run) | CD 代理程式,可執行風險評分初期測試部署作業,並自動復原 |
所有 Agent 行為都位於 skills/ 目錄中,以 Markdown 劇本的形式呈現。如要變更行為,請編輯技能,而非程式碼。技能會在 Antigravity with Gemini 上執行,只要告知代理要執行的技能,即可叫用技能。