AI Agent 自主部署,需要安全網

AI agent 寫程式的速度正在爆炸性成長。OpenCode、Claude Code 這類 agentic coding 工具已經可以在幾分鐘內實作完整功能。更進一步,未來的 agent 不只會寫程式,還會自己 review、merge、deploy。

問題是:你要怎麼讓 agent 自主推進,同時不把所有安全網拆掉?

核心概念

Feature flag 是答案。Agent 寫好新功能,把它藏在一個 flag 後面部署——flag 關著,用戶看不到任何變化。Agent 再對自己或小批用戶開啟 flag,觀察結果,沒問題才放大。出事了立刻關掉,不需要 rollback 整個部署。

這是 feature flag 一直在朝向的目標:不只是把部署和發布分離,而是把人工介入和每個發布步驟分離。Agent 可以快速移動,因為 flag 讓「快速移動」變得安全。

現有方案在 Workers 上的問題

在 Cloudflare Workers 上實作 feature flags,現有方案都有各自的致命傷。

硬編碼 boolean:把 flag 直接寫在程式碼裡,改一次要重新部署。一個 flag 沒問題,五十個 flag 由不同團隊管理、沒有 audit trail,出事了只能翻 git blame。

呼叫外部 flag 服務:每個 request 都要打一次外部 API。Workers 已經在離用戶最近的邊緣節點執行,但 flag 評估卻要繞回某個中心化服務——這完全抵銷了邊緣運算的低延遲優勢。

本地評估 SDK:把所有 flag 規則下載到 memory 本地評估,不用打外部 API。但這在 Workers 上行不通——Workers isolate 沒有持久性 process,每個 request 可能在不同 isolate 執行,每次都要重新初始化 SDK。

Workers 的特殊性

一般 feature flag SDK 假設有一個長期運行的 process 可以快取 flag 規則。但 serverless edge 沒有這個前提——你需要一個已經在邊緣的資料分發 primitive,而不是自己管快取。

Flagship 的架構

Flagship 完全建立在 Cloudflare 自己的基礎設施上,評估路徑裡沒有任何外部服務或中心化 origin server。

01
Flag 儲存:Durable Object 新增或更新 flag 時,控制面寫入一個 SQLite 驅動的 Durable Object,這是整個 app flag 設定的唯一真實來源(source of truth),同時記錄完整的 changelog。
02
全球分發:Workers KV Durable Object 的變更在幾秒內同步到 Workers KV,KV 會自動複製到 Cloudflare 全球 300+ 個節點。
03
評估:在邊緣 isolate 本地執行 Request 來時,Flagship 直接從同一個邊緣節點的 KV 讀取 flag 設定,在 isolate 內執行 targeting rule 匹配和 rollout 百分比計算。資料和邏輯都在邊緣,零外部呼叫。

結果是 sub-millisecond 的 flag 評估,不管用戶在全球哪個角落。

Workers Binding 用法

在 Workers 環境下,Flagship 提供 binding 方式,評估完全在 Workers runtime 內完成,不需要任何 HTTP round-trip。

wrangler.jsonc — 加入 binding
{
  "flagship": [
    {
      "binding": "FLAGS",
      "app_id": "<APP_ID>"
    }
  ]
}
Worker 內直接使用
export default {
  async fetch(request: Request, env: Env) {
    // Boolean flag
    const showNewUI = await env.FLAGS.getBooleanValue(
      'new-ui', false,
      { userId: 'user-42', plan: 'enterprise' }
    );

    // 取得評估細節
    const details = await env.FLAGS.getStringDetails(
      'checkout-flow', 'v1',
      { userId: 'user-42' }
    );
    // details.value = "v2"
    // details.variant = "new"
    // details.reason = "TARGETING_MATCH"
  },
};

Binding 支援 getBooleanValue()getStringValue()getNumberValue()getObjectValue() 以及對應的 *Details() 版本。評估出錯時回傳預設值,型別不符則拋出 exception(這是程式 bug,不是暫時性錯誤)。

OpenFeature:不被綁死的標準

大多數 feature flag SDK 都有自己的介面,深度嵌入你的程式碼後,換 provider 等於整個重寫。Flagship 採用 OpenFeature——CNCF 的 feature flag 評估開放標準,跟 OpenTelemetry 對 observability 的定位一樣。

你的評估程式碼只需寫一次,換 provider 時只改一行設定。

非 Workers 環境(Node.js / Bun / Deno)
import { OpenFeature } from '@openfeature/server-sdk';
import { FlagshipServerProvider } from '@cloudflare/flagship/server';

await OpenFeature.setProviderAndWait(
  new FlagshipServerProvider({
    appId: 'your-app-id',
    accountId: 'your-account-id',
    authToken: 'your-cloudflare-api-token',
  })
);

const client = OpenFeature.getClient();
const showNewCheckout = await client.getBooleanValue(
  'new-checkout-flow', false,
  { targetingKey: 'user-42', plan: 'enterprise' }
);

在 Workers 環境下,binding 可以直接傳給 OpenFeature provider,不需要額外配置 auth——account context 已透過 binding 隱式帶入。

Targeting Rules 與漸進式 Rollout

每個 flag 可以有多條 rule,按優先順序評估,第一條符合的 rule 勝出。Rule 由三部分組成:

元素說明
Conditions 決定這條 rule 是否適用於當前 context,支援 AND/OR 巢狀邏輯,最多五層
Variation 條件符合時要回傳的 flag 值(boolean / string / number / JSON object)
Rollout % 符合條件的用戶中,只對指定百分比的人啟用

Rollout 使用 consistent hashing——同一個 userId 永遠落在同一個 bucket,不會在不同 request 之間跳變。從 5% 慢慢放大到 100%,已在 rollout 中的用戶不受影響。

複雜條件範例
(plan == "enterprise" AND region == "us")
  OR (user.email.endsWith("@cloudflare.com"))
→ serve "premium"
OAO Studio 觀點

Flagship 最有意思的地方不是技術本身,而是它明確為「agent 自主部署」這個場景設計。這是 2025 年之前幾乎沒有 feature flag 服務會在文件裡提的 use case,現在卻成了 Cloudflare 的主打訴求。AI agent 正在成為軟體系統的一等公民。

Flagship 目前處於 Private Beta,可前往 Cloudflare Dashboard 申請存取。定價尚未公布,預計在 GA 前揭露。

← 返回 AI 知識庫