~/blog/antigravity-subagents-cloud-database-sync-2026.md
AI 自動化與智慧應用 · 2026 / 03 / 07

Antigravity 子代理人實戰:雲端資料庫同步憑什麼卡住你的開發節奏?

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
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 雖然強大,但有幾個坑要小心:

  1. 資源控管:雖然是背景執行,但 Subagent 開太多,你的開發機還是會發燙。記得在 YAML 檔中設定 concurrency_limitmemory_limit,替背景工作設一個資源天花板。
  2. 資料競爭(Race Conditions):確保同步邏輯有處理樂觀鎖(Optimistic Locking)。否則當背景 Agent 與你的手動操作同時修改同一筆資料時,後寫入的會無聲覆蓋先寫入的,造成資料遺失。樂觀鎖的作法是讓每筆資料帶一個版本號,寫入前先比對版本,版本不符就拒絕並重讀。
  3. Token 成本:Subagent 也會消耗 API Token。重複性的簡單邏輯盡量寫成固定的 Shell Script 或 PHP 讓 Agent 呼叫,而不是讓 Agent 每次都用 LLM 現場生成邏輯——這既省錢,也讓行為更可預測、更容易除錯。

Antigravity 的強大不只在於它是一個 IDE,而在於它是一個數位團隊的指揮中心。善用 Subagent,你就不再是一個人在戰鬥,而是一個帶著一群專業工兵的架構師。

延伸閱讀

// FAQ

常見問題

什麼是子代理人(Subagent)?它和主代理人有什麼分工?
子代理人是輕量級、任務導向的執行單元,擁有獨立的 Context Window 與執行緒。合理分工是讓主代理人負責對話、核心商業邏輯與程式碼架構等需要推理的決策,子代理人則專責資料庫 I/O、同步等可重複、可預期且耗時的雜務,並在背景默默處理。
為什麼把所有任務都塞進同一個 Agent context 會出問題?
會同時踩中兩個瓶頸。其一是 Context Window 被稀釋,多件事的上下文互相干擾,模型注意力被攤薄、推理品質下滑;其二是同步等待造成線程阻塞,資料庫 I/O 本質上慢且不可預測,當等待發生在主對話線程上,整個互動會被凍結到連下一道指令都打不出來。
把資料庫同步交給子代理人後,阻塞的等待就消失了嗎?
並沒有消除等待,而是把等待移出視線。HTTP 請求(如設定 blocking 為 true)對發起它的行程依然是阻塞的,但因為發起者是背景執行的子代理人,被阻塞的是它而非開發者本人。這就是「後景無感」的本質:等待仍在,只是對你不可見。
子代理人同步失敗時會打斷開發心流嗎?
採分級處理就不會。網路抖動、逾時等可自行處理的暫時性錯誤,子代理人會自己重試,開發者完全不會知道;只有無法自行解決的衝突(如雲端資料庫被鎖、Schema 嚴重不合)才透過 Agent RPC 向主代理人發訊號,由它在 IDE 側邊欄優雅彈出通知,把決策權交還給人。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?