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。
一般 feature flag SDK 假設有一個長期運行的 process 可以快取 flag 規則。但 serverless edge 沒有這個前提——你需要一個已經在邊緣的資料分發 primitive,而不是自己管快取。
Flagship 的架構
Flagship 完全建立在 Cloudflare 自己的基礎設施上,評估路徑裡沒有任何外部服務或中心化 origin server。
結果是 sub-millisecond 的 flag 評估,不管用戶在全球哪個角落。
Workers Binding 用法
在 Workers 環境下,Flagship 提供 binding 方式,評估完全在 Workers runtime 內完成,不需要任何 HTTP round-trip。
{
"flagship": [
{
"binding": "FLAGS",
"app_id": "<APP_ID>"
}
]
}
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 時只改一行設定。
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"
Flagship 最有意思的地方不是技術本身,而是它明確為「agent 自主部署」這個場景設計。這是 2025 年之前幾乎沒有 feature flag 服務會在文件裡提的 use case,現在卻成了 Cloudflare 的主打訴求。AI agent 正在成為軟體系統的一等公民。
Flagship 目前處於 Private Beta,可前往 Cloudflare Dashboard 申請存取。定價尚未公布,預計在 GA 前揭露。