Antigravity 子代理人實戰:雲端資料庫同步憑什麼卡住你的開發節奏?
☰ 目錄 table-of-contents.md
用 Antigravity 子代理人打造「後景無感」的雲端資料庫同步
為什麼一個資料庫同步,就能讓整個開發節奏停擺?因為它霸佔了你唯一的主線程——AI 代理人在等 I/O 回應,你也只能跟著等。Antigravity 的子代理人(Subagent)架構,把這類耗時工作交給獨立 Context、獨立執行緒的背景代理人,讓等待從你的工作流裡消失。
本文要解決的核心問題是:當 AI 代理人在等資料庫回應時,你的主工作流為什麼會卡住,以及如何用 Antigravity 的子代理人架構把這段等待「藏」起來。作法分三步——定義一個 isolation_level: background 的子代理人、餵給它固定的同步腳本(而非每次都用 LLM 重新推理)、再用事件機制只在「真的出事」時才打斷你。下面是完整的實作與原理拆解。
時間來到 2026 年,如果你還在盯著終端機的進度條發呆,看著資料庫遷移(Migration)或同步(Sync)跑完才能繼續寫下一行 Code,那你真的該更新一下開發軍火庫了。自從 Google Antigravity 成為日常開發的 Agentic IDE 主力後,「單一代理人」(Single Agent)的線性工作模式已經無法滿足資深工程師的需求。誰想要等 AI 寫完 SQL 才能繼續修前端的 Bug?
為什麼單一代理人會「卡住」你?
在 2024 年代,我們習慣用 VS Code 配合 Copilot,那時候我們是「駕駛」,AI 是「副駕駛」。但在 2026 年的 Antigravity 環境下,我們更像是「指揮官」。然而很多開發者犯了同一個錯誤:把所有任務都塞進同一個 Agent context。
這個錯誤之所以致命,是因為它同時踩中代理人架構的兩個瓶頸:
- Context Window 被稀釋。你叫 Agent 重構 WooCommerce 結帳邏輯,同時又要它同步大量訂單資料到測試區。兩件事的上下文互相干擾,模型的注意力被攤薄,推理品質與速度都下滑。
- 同步等待造成線程阻塞。資料庫 I/O 本質上是慢且不可預測的(網路延遲、鎖等待、大批次寫入)。當這個等待發生在你的主對話線程上,整個互動就被「凍結」,你連下一道指令都打不出去。
換句話說,問題不在 AI 不夠強,而在你把「需要你即時參與的思考工作」和「不需要你盯著的等待工作」綁在了同一條線程上。
Subagent 到底是什麼?
Subagents(子代理人)就是為了拆開這兩件事而存在的。它們是輕量級、任務導向的執行單元,擁有獨立的 Context Window 和執行緒。一個合理的職責劃分如下:
- Main Agent(指揮官):負責與你對話,處理核心商業邏輯與程式碼架構。
- Sync Subagent(苦力):專門負責資料庫 I/O,監聽地端變更並默默推送到雲端;出錯了自己重試,不用回報給指揮官(除非徹底失敗)。
關鍵心法:主代理人的 Context 是稀缺資源,要留給「需要推理的決策」;凡是可重複、可預期、會卡時間的雜務,都該下放給子代理人在背景吞掉。
實作場景:地端到雲端的無感同步
我們要實作的場景是:當你在本地開發環境(Localhost)對 WordPress 資料庫進行操作(例如匯入新的產品資料或修改了 Schema)時,一個背景運作的 Subagent 會自動偵測,並把這些變更同步到開發用的雲端資料庫(可能是 Neon Serverless 或 Supabase 2.0 這類服務),讓遠端協作的隊友也能即時看到變更。整個過程你完全感覺不到它在跑。
步驟一:定義 Subagent 的權限範圍(Manifest)
在 Antigravity 專案根目錄的 .gravity/agents.yaml 中,定義一個專門處理資料庫的子代理人。這裡的關鍵是 isolation_level,設為 background 讓 Agent 以「無頭」方式在背景運行;以及 trigger,決定它在什麼事件下被喚醒。
# .gravity/agents.yaml
agents:
- id: "main_architect"
role: "primary"
capabilities: ["code_edit", "file_system", "terminal"]
- id: "db_sync_worker"
role: "subagent"
isolation_level: "background" # 關鍵:背景執行,不佔用主對話視窗
parent: "main_architect"
trigger:
- event: "file_change"
pattern: "**/*.sql"
- event: "database_mutation"
connection: "local_mysql"
capabilities: ["database_connect", "api_request"]
memory_limit: "2GB" # 限制記憶體,避免吃掉開發機資源
這段設定告訴 Antigravity:只要本地資料庫有變動,或有 SQL 檔案被修改,就喚醒 db_sync_worker 這個子代理人。注意 parent 欄位——它建立了子代理人對主代理人的從屬關係,這是後面錯誤回報能找得到「該通知誰」的基礎。
步驟二:撰寫同步邏輯——讓 Subagent 執行固定腳本,而非每次重想
雖然 Subagent 是 AI,但我們不該讓它每次都「重新思考」怎麼同步——那樣既慢又容易在邊界情況出錯,還白白燒 Token。正確作法是餵給它一段「標準作業程序」(SOP),在 Antigravity 中稱為 Workflow Context,讓它去呼叫一支寫死的、行為可預期的腳本。
我們在 WordPress 外掛目錄中建立一支專用同步腳本。這裡用 PHP,因為它是專案的原生語言:
<?php
// wp-content/plugins/gravity-sync/sync-handler.php
namespace Gravity\Sync;
class CloudSync {
protected $cloud_endpoint;
protected $api_key;
public function __construct() {
// 2026 年我們通常從 Antigravity 的 Secure Vault 讀取憑證
$this->cloud_endpoint = getenv('GRAVITY_CLOUD_DB_URL');
$this->api_key = getenv('GRAVITY_SUBAGENT_TOKEN');
}
public function push_changes($table, $data) {
// 將資料推送到雲端 API
$response = wp_remote_post($this->cloud_endpoint . '/sync/' . $table, [
'headers' => [
'Authorization' => 'Bearer ' . $this->api_key,
'Content-Type' => 'application/json',
'X-Agent-ID' => 'db_sync_worker' // 標記是由子代理人執行的
],
'body' => json_encode($data),
'blocking' => true, // 對 Subagent 來說是阻塞,對使用者來說無感
'timeout' => 30
]);
if (is_wp_error($response)) {
// 這裡不僅是紀錄 Log,還要觸發 Antigravity 的 Alert Event
do_action('gravity_agent_alert', 'Sync failed: ' . $response->get_error_message());
return false;
}
return true;
}
}
這段程式碼看起來很普通?重點不在程式碼本身,而在誰去執行它、在哪條線程上執行。請特別看 'blocking' => true 這一行:HTTP 請求對發起它的行程而言是阻塞的(要等對方回應才往下走),這沒問題——因為發起它的是 db_sync_worker 這個背景行程,被阻塞的是它,不是你。
對照傳統作法:如果把這段掛在 WordPress 的 save_post hook 上,那麼每次你按「更新文章」,請求就會卡在你眼前的瀏覽器轉圈圈。把同樣的阻塞操作搬到獨立背景行程後,阻塞依然存在,但它對你「不可見」了——這就是「後景無感」的本質:不是消除等待,而是把等待移出你的視線。
步驟三:通訊協定——只在「真的出事」時才打斷你
最關鍵的設計來了:如果同步失敗了怎麼辦?我們不希望 Subagent 直接在 Terminal 噴錯,那會打斷寫 Code 的心流(Flow)。Antigravity 提供了 Agent RPC(Remote Procedure Call)機制來處理子代理人與主代理人之間的訊號傳遞。
原則是分級處理:
- 可自行處理的暫時性錯誤(網路抖動、逾時):Subagent 自己重試,你完全不會知道。
- 無法自行解決的衝突(雲端資料庫被鎖定、Schema 嚴重不合):才向 Main Agent 發送訊號,由它在 IDE 側邊欄優雅地彈出通知,把決策權交還給你。
// .gravity/workflows/error-handling.js
// 當子代理人發出 'sync_critical_error' 時觸發
antigravity.onEvent('sync_critical_error', async (payload) => {
const decision = await antigravity.ui.askUser({
title: "雲端同步衝突",
message: `子代理人回報資料表 ${payload.table} 同步失敗。`,
options: ["忽略", "強制覆蓋雲端", "查看 Diff"]
});
if (decision === "查看 Diff") {
// 喚醒主代理人進行深度分析
await antigravity.agents.get('main_architect').executeTask('analyze_db_diff', payload);
} else if (decision === "強制覆蓋雲端") {
// 指揮子代理人重試
await antigravity.agents.get('db_sync_worker').executeTask('force_push', payload);
}
});
這就是「主動性」與「干擾控制」的平衡:背景靜默到底、但出大事一定找得到你。注意這裡 force_push(強制覆蓋)是個破壞性決策,因此它被刻意設計成「需要人類明確點選」才會執行,而不是讓 Subagent 自作主張——這條界線在自動化系統裡非常重要。
進階技巧:用 Subagent 做資料「預熱」
除了同步,還有一個很實用的延伸用法:資料預熱(Data Warming)。當你在本地開發一個複雜的 WooCommerce 報表頁面時,可以先請 Subagent:「去幫我生成一批測試訂單,要符合常態分佈,每筆訂單間隔 5 分鐘。」
以前這需要寫 Seeders 然後跑半天。現在 Subagent 在背景默默產生 SQL Insert,而你可以繼續寫前端的 Vue.js 元件。等前端寫好、切到瀏覽器一看,測試資料已經在那裡等你了。這種「零等待」的開發體驗,習慣了就回不去。
它的本質和前面的同步是同一招:把「會佔時間但不需要你參與」的工作整批丟到背景,讓你的主線程永遠保持在做需要動腦的事。
資深工程師的三個忠告
引入 Subagents 雖然強大,但有幾個坑要小心:
- 資源控管:雖然是背景執行,但 Subagent 開太多,你的開發機還是會發燙。記得在 YAML 檔中設定
concurrency_limit與memory_limit,替背景工作設一個資源天花板。 - 資料競爭(Race Conditions):確保同步邏輯有處理樂觀鎖(Optimistic Locking)。否則當背景 Agent 與你的手動操作同時修改同一筆資料時,後寫入的會無聲覆蓋先寫入的,造成資料遺失。樂觀鎖的作法是讓每筆資料帶一個版本號,寫入前先比對版本,版本不符就拒絕並重讀。
- Token 成本:Subagent 也會消耗 API Token。重複性的簡單邏輯盡量寫成固定的 Shell Script 或 PHP 讓 Agent 呼叫,而不是讓 Agent 每次都用 LLM 現場生成邏輯——這既省錢,也讓行為更可預測、更容易除錯。
Antigravity 的強大不只在於它是一個 IDE,而在於它是一個數位團隊的指揮中心。善用 Subagent,你就不再是一個人在戰鬥,而是一個帶著一群專業工兵的架構師。
延伸閱讀
常見問題
什麼是子代理人(Subagent)?它和主代理人有什麼分工?
為什麼把所有任務都塞進同一個 Agent context 會出問題?
把資料庫同步交給子代理人後,阻塞的等待就消失了嗎?
子代理人同步失敗時會打斷開發心流嗎?
訂閱免費電子報
把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。