|
| 1 | +--- |
| 2 | +title: "GrowthBook 适配器 - 自定义 Feature Flag 服务器接入" |
| 3 | +description: "通过环境变量连接自定义 GrowthBook 服务器,实现远程 feature flag 控制。无配置时自动回退到代码默认值。" |
| 4 | +keywords: ["growthbook", "feature flags", "远程配置", "适配器", "环境变量"] |
| 5 | +--- |
| 6 | + |
| 7 | +## 概述 |
| 8 | + |
| 9 | +Claude Code 的 GrowthBook 系统支持通过环境变量连接自定义 GrowthBook 服务器,实现远程 feature flag 控制。 |
| 10 | + |
| 11 | +- **有配置时**:连接你的 GrowthBook 实例,拉取并缓存 feature 值 |
| 12 | +- **无配置时**:所有 feature 读取直接返回代码中的默认值,零网络请求 |
| 13 | + |
| 14 | +## 环境变量 |
| 15 | + |
| 16 | +| 变量 | 必填 | 说明 | |
| 17 | +|---|---|---| |
| 18 | +| `CLAUDE_GB_ADAPTER_URL` | 是 | GrowthBook API 地址,如 `https://gb.example.com/` | |
| 19 | +| `CLAUDE_GB_ADAPTER_KEY` | 是 | GrowthBook SDK Client Key,如 `sdk-xxxxx` | |
| 20 | + |
| 21 | +两个变量都设置时启用适配器模式,否则完全跳过 GrowthBook。 |
| 22 | + |
| 23 | +## 使用方式 |
| 24 | + |
| 25 | +### 基本用法 |
| 26 | + |
| 27 | +```bash |
| 28 | +CLAUDE_GB_ADAPTER_URL=https://gb.example.com/ \ |
| 29 | +CLAUDE_GB_ADAPTER_KEY=sdk-abc123 \ |
| 30 | +bun run dev |
| 31 | +``` |
| 32 | + |
| 33 | +### 不使用 GrowthBook(默认行为) |
| 34 | + |
| 35 | +```bash |
| 36 | +bun run dev |
| 37 | +# 所有 getFeatureValue_CACHED_MAY_BE_STALE("xxx", defaultValue) 直接返回 defaultValue |
| 38 | +``` |
| 39 | + |
| 40 | +## GrowthBook 服务端配置 |
| 41 | + |
| 42 | +### 步骤 |
| 43 | + |
| 44 | +1. **部署 GrowthBook 服务端**(Docker 自托管或 Cloud 版) |
| 45 | +2. **创建 Environment**(如 `production`) |
| 46 | +3. **创建 SDK Connection**,获得 SDK Key(即 `CLAUDE_GB_ADAPTER_KEY`) |
| 47 | +4. **按需添加 Feature**,key 和类型见下方列表 |
| 48 | + |
| 49 | +### 核心原则 |
| 50 | + |
| 51 | +- **不配置任何 feature 也能正常运行**——代码中每个调用都提供了默认值 |
| 52 | +- 只创建你想远程控制的 feature,其余走代码默认 |
| 53 | +- GrowthBook 上配了某个 feature 后,其值会覆盖代码中的默认值 |
| 54 | + |
| 55 | +## Feature Key 列表 |
| 56 | + |
| 57 | +### 高频使用 |
| 58 | + |
| 59 | +| Feature Key | 类型 | 代码默认值 | 用途 | |
| 60 | +|---|---|---|---| |
| 61 | +| `tengu_hive_evidence` | boolean | `false` | 任务证据系统 | |
| 62 | +| `tengu_quartz_lantern` | boolean | `false` | 文件写入/编辑保护 | |
| 63 | +| `tengu_auto_background_agents` | boolean | `false` | 自动后台 Agent | |
| 64 | +| `tengu_agent_list_attach` | boolean | `false` | Agent 列表附件 | |
| 65 | +| `tengu_amber_stoat` | boolean | `true` | 内置 Agents | |
| 66 | +| `tengu_slim_subagent_claudemd` | boolean | `true` | 子 Agent CLAUDE.md | |
| 67 | +| `tengu_attribution_header` | boolean | `true` | API 归因 Header | |
| 68 | +| `tengu_cobalt_harbor` | boolean | `false` | Bridge 模式 | |
| 69 | +| `tengu_ccr_bridge` | boolean | `false` | CCR Bridge | |
| 70 | +| `tengu_cicada_nap_ms` | number | `0` | 后台刷新节流(毫秒) | |
| 71 | +| `tengu_miraculo_the_bard` | boolean | `false` | 启动欢迎信息 | |
| 72 | + |
| 73 | +### Agent / 工具控制 |
| 74 | + |
| 75 | +| Feature Key | 类型 | 代码默认值 | 用途 | |
| 76 | +|---|---|---|---| |
| 77 | +| `tengu_surreal_dali` | boolean | `false` | 远程触发工具 | |
| 78 | +| `tengu_glacier_2xr` | boolean | `false` | 工具搜索增强 | |
| 79 | +| `tengu_plum_vx3` | boolean | `false` | Web Search 使用 Haiku | |
| 80 | +| `tengu_destructive_command_warning` | boolean | `false` | 危险命令警告 | |
| 81 | +| `tengu_birch_trellis` | boolean | `true` | Bash 权限控制 | |
| 82 | +| `tengu_harbor_permissions` | boolean | `false` | Harbor 权限模式 | |
| 83 | + |
| 84 | +### Bridge / 远程连接 |
| 85 | + |
| 86 | +| Feature Key | 类型 | 代码默认值 | 用途 | |
| 87 | +|---|---|---|---| |
| 88 | +| `tengu_bridge_repl_v2` | boolean | `false` | Bridge REPL v2 | |
| 89 | +| `tengu_copper_bridge` | boolean | `false` | Copper Bridge | |
| 90 | +| `tengu_ccr_mirror` | boolean | `false` | CCR Mirror | |
| 91 | + |
| 92 | +### 内存 / 上下文 |
| 93 | + |
| 94 | +| Feature Key | 类型 | 代码默认值 | 用途 | |
| 95 | +|---|---|---|---| |
| 96 | +| `tengu_coral_fern` | boolean | `false` | 内存目录功能 | |
| 97 | +| `tengu_passport_quail` | boolean | `false` | 内存路径配置 | |
| 98 | +| `tengu_slate_thimble` | boolean | `false` | Slate Thimble | |
| 99 | +| `tengu_herring_clock` | boolean | `false` | 跳过索引 | |
| 100 | +| `tengu_session_memory` | boolean | `false` | 会话内存 | |
| 101 | +| `tengu_pebble_leaf_prune` | boolean | `false` | 内存修剪 | |
| 102 | + |
| 103 | +### UI / 体验 |
| 104 | + |
| 105 | +| Feature Key | 类型 | 代码默认值 | 用途 | |
| 106 | +|---|---|---|---| |
| 107 | +| `tengu_terminal_sidebar` | boolean | `false` | 终端侧边栏 | |
| 108 | +| `tengu_terminal_panel` | boolean | `false` | 终端面板 | |
| 109 | +| `tengu_willow_mode` | boolean | `false` | Willow 模式 | |
| 110 | +| `tengu_collage_kaleidoscope` | boolean | `false` | UI 效果 | |
| 111 | +| `tengu_chrome_auto_enable` | boolean | `false` | Chrome 自动启用 | |
| 112 | +| `tengu_immediate_model_command` | boolean | `false` | 即时模型切换 | |
| 113 | +| `tengu_remote_backend` | boolean | `false` | 远程后端 | |
| 114 | + |
| 115 | +### 配置对象(动态配置) |
| 116 | + |
| 117 | +| Feature Key | 类型 | 代码默认值 | 用途 | |
| 118 | +|---|---|---|---| |
| 119 | +| `tengu_file_read_limits` | object | `null` | 文件读取限制配置 | |
| 120 | +| `tengu_cobalt_raccoon` | object | `null` | Cobalt 配置 | |
| 121 | +| `tengu_cobalt_lantern` | object | `null` | Lantern 配置 | |
| 122 | +| `tengu_desktop_upsell` | object | `null` | 桌面版引导 | |
| 123 | +| `tengu_marble_sandcastle` | object | `null` | Marble 配置 | |
| 124 | +| `tengu_marble_fox` | object | `null` | Marble Fox 配置 | |
| 125 | +| `tengu_ultraplan_model` | string | `null` | Ultraplan 模型名 | |
| 126 | + |
| 127 | +### Gate(布尔门控) |
| 128 | + |
| 129 | +| Gate Key | 代码默认值 | 用途 | |
| 130 | +|---|---|---| |
| 131 | +| `tengu_chair_sermon` | `false` | 功能门控 | |
| 132 | +| `tengu_scratch` | `false` | Scratch 功能 | |
| 133 | +| `tengu_thinkback` | `false` | Thinkback 功能 | |
| 134 | +| `tengu_tool_pear` | `false` | Tool Pear 功能 | |
| 135 | + |
| 136 | +## 读取优先级链 |
| 137 | + |
| 138 | +每个 feature 的值按以下顺序解析,第一个命中即返回: |
| 139 | + |
| 140 | +``` |
| 141 | +1. CLAUDE_INTERNAL_FC_OVERRIDES 环境变量(JSON 对象覆盖) |
| 142 | + ↓ 未命中 |
| 143 | +2. growthBookOverrides 配置(~/.claude.json,仅 ant 构建) |
| 144 | + ↓ 未命中 |
| 145 | +3. 内存缓存(remoteEvalFeatureValues,本次进程从服务器拉取) |
| 146 | + ↓ 未命中 |
| 147 | +4. 磁盘缓存(~/.claude.json 的 cachedGrowthBookFeatures) |
| 148 | + ↓ 未命中 |
| 149 | +5. 代码中的 defaultValue 参数 |
| 150 | +``` |
| 151 | + |
| 152 | +## 缓存与刷新机制 |
| 153 | + |
| 154 | +| 机制 | 说明 | |
| 155 | +|---|---| |
| 156 | +| **磁盘缓存** | `~/.claude.json` 的 `cachedGrowthBookFeatures` 字段,跨进程持久化 | |
| 157 | +| **周期刷新** | 每 6 小时自动从服务器拉取最新值(`setInterval` + `unref`) | |
| 158 | +| **初始化超时** | 首次连接超时 5 秒,超时后使用磁盘缓存或默认值 | |
| 159 | +| **Auth 变更** | 登录/登出时自动销毁并重建客户端 | |
| 160 | + |
| 161 | +## 实现细节 |
| 162 | + |
| 163 | +修改了 2 个文件共 3 处: |
| 164 | + |
| 165 | +1. **`src/constants/keys.ts`** — `getGrowthBookClientKey()` 优先读取 `CLAUDE_GB_ADAPTER_KEY` |
| 166 | +2. **`src/services/analytics/growthbook.ts`** — `isGrowthBookEnabled()` 适配器模式下直接启用 |
| 167 | +3. **`src/services/analytics/growthbook.ts`** — base URL 优先使用 `CLAUDE_GB_ADAPTER_URL` |
| 168 | + |
| 169 | +所有 130+ 个调用方文件无需修改。 |
0 commit comments