gamealgo-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +144 -0
- package/cli/README.md +375 -0
- package/dist/gamealgo.js +1574 -0
- package/package.json +32 -0
package/README.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# GameAlgo Client
|
|
2
|
+
|
|
3
|
+
GameAlgo Client 是面向游戏接入方的公开客户端仓库,包含 iOS SDK、Android SDK、REST helper、TapTap Maker / Lua SDK、CLI 和接入文档。
|
|
4
|
+
|
|
5
|
+
## 如果你是 AI Agent,请从这里开始
|
|
6
|
+
|
|
7
|
+
你的目标不是把 README 转发给开发者,而是直接帮助当前游戏完成 GameAlgo 接入、验证和后续报表/实验配置。
|
|
8
|
+
|
|
9
|
+
默认目标是 Activated 接入,而不是只把 SDK 代码接进工程。
|
|
10
|
+
|
|
11
|
+
| 状态 | 含义 | 能否声称接入完成 |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| Activated | 已使用真实 `ga_live_*`,能拉配置,并能通过事件统计看到测试事件 | 可以 |
|
|
14
|
+
| Scaffolded | SDK 代码已接入,但没有真实 `ga_live_*`,运行时仍是占位或 no-op | 不可以 |
|
|
15
|
+
|
|
16
|
+
如果当前仓库没有真实 `ga_live_*`,不要留下 `ga_live_xxx`、`TODO_GAME_KEY`、`no-op key` 之类占位后声称完成。你必须把获取真实 Client Game Key 当作阻塞步骤。
|
|
17
|
+
|
|
18
|
+
开发者通常只需要提供游戏维度的 Game Admin Key,格式为 `ga_admin_*`。拿到 Admin Key 后,你必须用 GameAlgo CLI 自动创建或读取 Client Game Key,并把真实 `ga_live_*` 写入合适的位置。
|
|
19
|
+
|
|
20
|
+
先向开发者询问这几项:
|
|
21
|
+
|
|
22
|
+
- 使用国内环境还是海外环境
|
|
23
|
+
- Game Admin Key,格式 `ga_admin_*`。如果用户已经提供真实 `ga_live_*`,可以跳过创建 key,但仍要验证
|
|
24
|
+
- 游戏运行环境:iOS / Android / Web / Backend / TapTap Maker / TapTap 小游戏
|
|
25
|
+
- 本次目标:只接基础事件,还是同时接实验、配置、报表和自动化实验
|
|
26
|
+
|
|
27
|
+
然后按下面流程执行:
|
|
28
|
+
|
|
29
|
+
| 环境 | Admin host |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| 国内 | `https://game-algo-admin.dictapis.cn` |
|
|
32
|
+
| 海外 | `https://dirichlet.ai/algo_admin` |
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install -g gamealgo-cli@latest
|
|
36
|
+
gamealgo docs agent-onboarding --host <admin-host>
|
|
37
|
+
gamealgo login --host <admin-host> --admin-key <ga_admin_xxx>
|
|
38
|
+
gamealgo key list --json
|
|
39
|
+
gamealgo key create --name <runtime-name> --json
|
|
40
|
+
gamealgo key reveal --name <runtime-name> --json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
安装和更新 CLI 都使用 `npm install -g gamealgo-cli@latest`,不需要拉取 GameAlgo Client 仓库。`gamealgo docs` 从当前 Admin Host 获取最新 AI 文档;登录前显式传 `--host`,登录后 CLI 会使用已保存的 Host。需要网页阅读时使用 `gamealgo docs --open`。
|
|
44
|
+
|
|
45
|
+
如果已有可用 Client Game Key,就复用或 reveal;如果没有,就创建。Client Game Key 格式为 `ga_live_*`,用于游戏运行时拉配置、拉配置文件、上报事件。
|
|
46
|
+
|
|
47
|
+
如果用户暂时不能提供 `ga_admin_*`,你可以继续完成 Scaffolded 状态的代码接入,但最终回复必须明确写出:
|
|
48
|
+
|
|
49
|
+
- 当前未激活,因为缺少真实 `ga_live_*`
|
|
50
|
+
- 不能验证配置拉取和事件上报
|
|
51
|
+
- 下一步需要用户提供 `ga_admin_*` 或真实 `ga_live_*`
|
|
52
|
+
|
|
53
|
+
继续阅读并执行:
|
|
54
|
+
|
|
55
|
+
1. [AI 接入流程](./docs/agent-onboarding.md)
|
|
56
|
+
2. [客户端接入指南](./docs/integration-guide.md)
|
|
57
|
+
3. [实验接入版本与最低版本](./docs/experiment-integration-versions.md)
|
|
58
|
+
4. [AI Agent 埋点接入手册](./docs/ai-tracking-manual.md)
|
|
59
|
+
5. [不同类型游戏埋点建议](./docs/tracking-recommendations.md)
|
|
60
|
+
6. [Report Pack 配置](./docs/report-packs.md)
|
|
61
|
+
7. [Agent CLI 命令参考](./docs/agent-cli.md)
|
|
62
|
+
8. [AI LTV 优化 Playbook](./docs/ai-ltv-optimization-playbook.md)
|
|
63
|
+
|
|
64
|
+
### 不要这样做
|
|
65
|
+
|
|
66
|
+
- 不要向开发者索要 `ga_live_*`,除非开发者明确说要手工维护运行时 key。
|
|
67
|
+
- 不要把 `ga_live_xxx` 示例值、占位 key 或 no-op key 提交到游戏工程后声称接入完成。
|
|
68
|
+
- 不要把 `ga_admin_*` 写进游戏客户端、小游戏客户端脚本、公开配置或日志。
|
|
69
|
+
- 不要把 README 原样甩给开发者后停止接入。
|
|
70
|
+
- 不要让 GameAlgo 网络请求阻塞游戏主流程。
|
|
71
|
+
- TapTap Maker / TapTap 小游戏使用 Lua SDK 客户端直连,必须配置真实 `ga_live_*`,但不能写入 `ga_admin_*`。
|
|
72
|
+
- 不要默认使用 `USD`;国内游戏、TapTap Maker / TapTap 小游戏的广告和付费事件默认使用 `CNY`。
|
|
73
|
+
|
|
74
|
+
## 如果你是开发者
|
|
75
|
+
|
|
76
|
+
你需要做的事很少:
|
|
77
|
+
|
|
78
|
+
1. 登录 GameAlgo Admin 控制台。
|
|
79
|
+
2. 创建或选择你的游戏。
|
|
80
|
+
3. 在游戏的 Keys 页面创建 Game Admin Key。
|
|
81
|
+
4. 把使用环境和 Game Admin Key 提供给 AI Agent。
|
|
82
|
+
5. 审核 AI Agent 对游戏工程、实验配置和 Report Pack 的改动。
|
|
83
|
+
|
|
84
|
+
开发者详细说明见 [开发者快速开始](./docs/developer-quickstart.md)。
|
|
85
|
+
|
|
86
|
+
## 两类 key
|
|
87
|
+
|
|
88
|
+
| Key | 示例 | 用途 | 放在哪里 |
|
|
89
|
+
| --- | --- | --- | --- |
|
|
90
|
+
| Game Admin Key | `ga_admin_*` | CLI / AI Agent / CI 管理实验、脚本、配置、Report Pack,拉取报表和事件统计 | 开发机器、CI Secret、Agent Secret |
|
|
91
|
+
| Client Game Key | `ga_live_*` | 游戏运行时拉取配置、拉取配置文件、上报事件 | 游戏客户端 SDK 配置 |
|
|
92
|
+
|
|
93
|
+
常规流程是:开发者只手工创建 Game Admin Key;AI Agent 用 CLI 创建、读取和维护 Client Game Key。
|
|
94
|
+
|
|
95
|
+
## 目录结构
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
ios/ iOS Swift Package SDK
|
|
99
|
+
android/ Android Java SDK core
|
|
100
|
+
rest-api/ REST API helper 和示例
|
|
101
|
+
lua/ TapTap Maker / TapTap 小游戏 Lua SDK 和客户端 HTTP 传输
|
|
102
|
+
cli/ 游戏开发 Agent 使用的自动化 CLI
|
|
103
|
+
examples/ 可运行接入示例
|
|
104
|
+
docs/ 接入、埋点、报表和优化文档
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 平台地址
|
|
108
|
+
|
|
109
|
+
环境地址:
|
|
110
|
+
|
|
111
|
+
| 环境 | SDK / REST API | Admin / CLI |
|
|
112
|
+
| --- | --- | --- |
|
|
113
|
+
| 国内 | `https://game-algo-sdk.dictapis.cn` | `https://game-algo-admin.dictapis.cn` |
|
|
114
|
+
| 海外 | `https://gamealgo-server-v2.gamealgo-sdk-1ea5b9.workers.dev` | `https://dirichlet.ai/algo_admin` |
|
|
115
|
+
|
|
116
|
+
客户端 SDK 只配置 SDK / REST API 地址。Admin / CLI 地址只给开发者、AI Agent 和 CI 使用。
|
|
117
|
+
|
|
118
|
+
## SDK 接入入口
|
|
119
|
+
|
|
120
|
+
- iOS:见 [iOS SDK](./ios/README.md),也可以通过 SwiftPM 引入本仓库。
|
|
121
|
+
- Android:见 [Android SDK](./android/README.md)。
|
|
122
|
+
- REST / Web / Backend:见 [REST helper](./rest-api/README.md) 和 [REST API 文档](./docs/rest-api-v1.md)。
|
|
123
|
+
- TapTap Maker / TapTap 小游戏:见 [Lua SDK](./lua/README.md)。
|
|
124
|
+
|
|
125
|
+
所有运行时请求都通过 `X-GameAlgo-Key: ga_live_xxx` 识别游戏,不需要游戏自己传可信 `gameId`。
|
|
126
|
+
|
|
127
|
+
核心原则:SDK 后台拉取配置并写入本地快照;配置未就绪、网络失败或脚本执行失败时,游戏必须走本地默认逻辑。
|
|
128
|
+
|
|
129
|
+
## 接入后的验收
|
|
130
|
+
|
|
131
|
+
AI Agent 接入后应该至少完成这些验证:
|
|
132
|
+
|
|
133
|
+
- 客户端配置里使用真实 `ga_live_*`,不是占位值。
|
|
134
|
+
- `ga_admin_*` 没有出现在客户端代码、Info.plist、资源文件、脚本包、日志或 git diff 中。
|
|
135
|
+
- `/v1/config` 能成功返回当前游戏配置,或 SDK 日志显示 config fetched / config ready。
|
|
136
|
+
- `session_end` 和核心玩法事件能上传成功。
|
|
137
|
+
- 如果游戏使用 Adjust 等归因 SDK,归因 callback 后能回传归因;如果需要投放 ROI 报表,Adjust API Token / App Token 已在 CLI/Admin 配置并完成同步验证。
|
|
138
|
+
- `gamealgo events count` 能查到测试事件。
|
|
139
|
+
- 配置未就绪时,游戏仍然能走本地默认逻辑。
|
|
140
|
+
- Report Pack 可以 `validate` 和 `preview`。
|
|
141
|
+
|
|
142
|
+
如果以上验证没有完成,交付说明里必须标记为 Scaffolded 或部分完成,不能写“已完成接入”。
|
|
143
|
+
|
|
144
|
+
完整验收和排查流程见 [AI 接入流程](./docs/agent-onboarding.md)。
|
package/cli/README.md
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# GameAlgo CLI
|
|
2
|
+
|
|
3
|
+
GameAlgo CLI 是给游戏开发 Agent 使用的自动化工具。它不运行在游戏客户端里,而是在开发环境、CI 或 AI Agent 工作目录里调用 GameAlgo Admin API。
|
|
4
|
+
|
|
5
|
+
CLI 使用游戏维度的 Game Admin Key 鉴权。这个 key 只绑定一个游戏,所以命令不需要 `--game`。
|
|
6
|
+
|
|
7
|
+
注意区分两类 key:
|
|
8
|
+
|
|
9
|
+
- `ga_live_*` 是 Client Game Key,只给游戏客户端 SDK 或 REST API 使用,用来拉配置和上报事件。
|
|
10
|
+
- `ga_admin_*` 是 Game Admin Key,只给 CLI、开发者 Agent 或 CI 使用,用来管理实验、脚本、配置、Report Pack,并读取报表和事件统计。
|
|
11
|
+
|
|
12
|
+
不要把 `ga_admin_*` 放进客户端包,也不要用 `ga_live_*` 执行 CLI 命令。
|
|
13
|
+
|
|
14
|
+
## 安装与运行
|
|
15
|
+
|
|
16
|
+
推荐安装后直接使用 `gamealgo` 命令:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install -g gamealgo-cli@latest
|
|
20
|
+
gamealgo help
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
更新 CLI 使用同一条命令:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install -g gamealgo-cli@latest
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
安装和更新不需要拉取 GameAlgo Client 仓库。Node.js 版本需要为 24 或更高。
|
|
30
|
+
|
|
31
|
+
只有开发 CLI 本身时才需要源码仓库。源码内调试可以用 npm script,但涉及 `--json` 的命令必须加 `--silent`,避免 npm 自己的日志污染 JSON stdout:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install
|
|
35
|
+
npm --silent run cli -- help
|
|
36
|
+
npm --silent run cli -- report manifest --json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 登录
|
|
40
|
+
|
|
41
|
+
平台管理员会给每个游戏生成一个 Game Admin Key。
|
|
42
|
+
|
|
43
|
+
Admin host 按环境选择:
|
|
44
|
+
|
|
45
|
+
| 环境 | Admin host |
|
|
46
|
+
| --- | --- |
|
|
47
|
+
| 国内 | `https://game-algo-admin.dictapis.cn` |
|
|
48
|
+
| 海外 | `https://dirichlet.ai/algo_admin` |
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
gamealgo login \
|
|
52
|
+
--host <admin-host> \
|
|
53
|
+
--admin-key ga_admin_xxx
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
登录信息会写入本机 `~/.gamealgo/cli.json`,CLI 会把文件权限设置为 `600`。也可以通过环境变量临时传入:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
GAMEALGO_ADMIN_HOST=<admin-host>
|
|
60
|
+
GAMEALGO_GAME_ADMIN_KEY=ga_admin_xxx
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
检查当前身份:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
gamealgo whoami
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## 最新文档
|
|
70
|
+
|
|
71
|
+
AI Agent 可以通过 CLI 从 Admin Host 获取最新文档,不需要拉取本仓库:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
gamealgo docs --host <admin-host>
|
|
75
|
+
gamealgo docs agent-onboarding --host <admin-host>
|
|
76
|
+
gamealgo docs report-packs --json
|
|
77
|
+
gamealgo docs --open
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
登录后可以省略 `--host`。CLI 会把已读取的文档缓存到 `~/.gamealgo/docs/`,网络不可用时自动回退到缓存。
|
|
81
|
+
|
|
82
|
+
## Client Game Key
|
|
83
|
+
|
|
84
|
+
Agent 可以用 Game Admin Key 管理当前游戏的 Client Game Key。`key list` 只返回名称、前缀和状态,不返回明文:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
gamealgo key list --json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
创建给 SDK 或 TapTap Maker 服务端 Proxy 使用的 key:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
gamealgo key create --name tapmaker-proxy --json
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
如果同名 active key 已存在,`create` 会复用已有 key 并返回它的明文;如果需要单独查看明文,用:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
gamealgo key reveal --name tapmaker-proxy --json
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
吊销 key 必须显式确认:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
gamealgo key revoke --name tapmaker-proxy --yes
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## 实验闭环
|
|
109
|
+
|
|
110
|
+
新实验系统围绕 `Strategy` 和 `Run` 两层设计:
|
|
111
|
+
|
|
112
|
+
- `Strategy` 是游戏代码读取的稳定策略 key,包含默认参数和可选脚本版本。
|
|
113
|
+
- `Run` 是一次实验闭环,绑定某个 Strategy,包含实验组、流量、平台、目标和实验报表。
|
|
114
|
+
|
|
115
|
+
先为当前客户端支持的实验能力创建一个游戏级版本。版本号由服务端自增,写入客户端初始化代码,并由 Strategy 的 `requiredIntegrationVersion` 引用:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
gamealgo experiment integration-version latest --json
|
|
119
|
+
gamealgo experiment integration-version create \
|
|
120
|
+
--title "广告频率参数" \
|
|
121
|
+
--message "客户端已支持 firstAdLevel 和 interval" \
|
|
122
|
+
--json
|
|
123
|
+
gamealgo experiment integration-version get --version 3 --json
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
`title` 创建后不可修改;`message` 可以用 `integration-version update --version 3 --message "..."` 补充,服务端会保留修订记录。不要在运行时查询 latest 后上报,必须把创建后返回的 `version` 固定到对应 App 构建中。新增客户端能力时创建新版本,不要扩充已经被线上客户端观测到的旧版本语义。
|
|
127
|
+
|
|
128
|
+
如果实验依赖脚本,先发布不可变脚本版本,记录返回的 `scriptVersion.versionId`:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
gamealgo script publish scripts/ad-frequency.lua \
|
|
132
|
+
--message "广告频率实验脚本" \
|
|
133
|
+
--json
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
创建或更新 Strategy:
|
|
137
|
+
|
|
138
|
+
```yaml
|
|
139
|
+
# strategy.yaml
|
|
140
|
+
strategyKey: ad_frequency
|
|
141
|
+
displayName: 广告频率
|
|
142
|
+
requiredIntegrationVersion: 3
|
|
143
|
+
defaultConfig:
|
|
144
|
+
firstAdLevel: 4
|
|
145
|
+
interval: 30
|
|
146
|
+
script:
|
|
147
|
+
versionId: sv_xxxxxxxxxxxxxxxx
|
|
148
|
+
message: 初始化广告频率策略
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
gamealgo experiment strategy publish strategy.yaml --yes
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
每次发布 Strategy 都必须显式填写 `requiredIntegrationVersion`。填写 `0` 表示该 Strategy 不依赖任何客户端实验能力版本;填写大于 `0` 的值时,必须引用已经通过 `integration-version create` 创建、且客户端确实已经实现的版本。Run 会继承 Strategy 的最低版本,不需要重复配置。
|
|
156
|
+
|
|
157
|
+
版本升级判断、旧客户端行为和托管实验覆盖率门槛的完整说明见 [实验接入版本](../docs/experiment-integration-versions.md)。
|
|
158
|
+
|
|
159
|
+
创建手动实验 Run:
|
|
160
|
+
|
|
161
|
+
```yaml
|
|
162
|
+
# run.yaml
|
|
163
|
+
displayName: 广告频率第一轮
|
|
164
|
+
type: manual
|
|
165
|
+
platform: ios
|
|
166
|
+
objective: ltv_proxy
|
|
167
|
+
variants:
|
|
168
|
+
- variantId: control
|
|
169
|
+
weight: 1
|
|
170
|
+
config:
|
|
171
|
+
firstAdLevel: 4
|
|
172
|
+
interval: 30
|
|
173
|
+
- variantId: slower_ads
|
|
174
|
+
weight: 1
|
|
175
|
+
config:
|
|
176
|
+
firstAdLevel: 5
|
|
177
|
+
interval: 45
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
gamealgo experiment run create ad_frequency run.yaml --yes
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
如果要把当前默认参数也放进实验,需要显式配置 `variantId: default`;否则默认参数不参与流量。所有有流量的实验组数量必须至少为 2。
|
|
185
|
+
|
|
186
|
+
查看、评估和完成实验闭环:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
gamealgo experiment strategies
|
|
190
|
+
gamealgo experiment strategy show ad_frequency
|
|
191
|
+
gamealgo experiment run show xrun_xxxxxxxxxxxxxxxx
|
|
192
|
+
gamealgo experiment run evaluate xrun_xxxxxxxxxxxxxxxx --from 2026-07-01 --to 2026-07-07 --yes
|
|
193
|
+
gamealgo experiment run report xrun_xxxxxxxxxxxxxxxx
|
|
194
|
+
gamealgo experiment run promote xrun_xxxxxxxxxxxxxxxx --variant slower_ads --yes
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
`promote` 会把胜出的 variant 写回 Strategy 默认参数,并结束当前 Run。取消实验用:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
gamealgo experiment run cancel xrun_xxxxxxxxxxxxxxxx --yes
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
调试指定用户/设备强制进某个实验组:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
gamealgo experiment override set xrun_xxxxxxxxxxxxxxxx --user user-1 --variant slower_ads --yes
|
|
207
|
+
gamealgo experiment override list xrun_xxxxxxxxxxxxxxxx
|
|
208
|
+
gamealgo experiment override delete xrun_xxxxxxxxxxxxxxxx --user user-1 --yes
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
托管实验也是创建 `type: managed` 的 Run,平台会按轮次自动调整流量并最终推全胜出组:
|
|
212
|
+
|
|
213
|
+
```yaml
|
|
214
|
+
displayName: 广告频率托管实验
|
|
215
|
+
type: managed
|
|
216
|
+
platform: ios
|
|
217
|
+
objective: ltv_proxy
|
|
218
|
+
cycleDays: 7
|
|
219
|
+
maxVariantsPerRound: 3
|
|
220
|
+
# 可选:仅托管实验支持。最近 24 小时同时满足两个门槛后才开始首轮。
|
|
221
|
+
startCondition:
|
|
222
|
+
minCoverage: 0.8
|
|
223
|
+
minUsers: 100
|
|
224
|
+
variants:
|
|
225
|
+
- variantId: alpha
|
|
226
|
+
config: { firstAdLevel: 4, interval: 30 }
|
|
227
|
+
- variantId: bravo
|
|
228
|
+
config: { firstAdLevel: 5, interval: 30 }
|
|
229
|
+
- variantId: charlie
|
|
230
|
+
config: { firstAdLevel: 4, interval: 45 }
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
`minCoverage` 表示指定平台最近 24 小时内,实验接入版本达到 Strategy `requiredIntegrationVersion` 的去重用户占比;`minUsers` 表示同一窗口内的非 Debug 去重用户数。两项可单独配置,同时配置时必须同时满足。等待期间 Strategy 继续下发默认参数,满足门槛后平台才生成首轮时间窗并开始分流。手动实验不支持 `startCondition`,托管实验不配置时仍会立即启动。`experiment run show` 返回 `startConditionSnapshot`,可查看当前用户数、覆盖率和最近检查时间。
|
|
234
|
+
|
|
235
|
+
所有会修改线上状态的实验命令都必须显式传 `--yes`。
|
|
236
|
+
|
|
237
|
+
## 脚本和配置
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
gamealgo script list
|
|
241
|
+
gamealgo script versions level-generator.js
|
|
242
|
+
gamealgo script pull --all --out scripts/
|
|
243
|
+
gamealgo script publish scripts/level-generator.js
|
|
244
|
+
|
|
245
|
+
gamealgo config list
|
|
246
|
+
gamealgo config pull gameplay.json --out configs/
|
|
247
|
+
gamealgo config publish configs/gameplay.json
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
`script publish` 会创建不可变脚本版本并返回 `scriptVersion.versionId`;v2 实验只能引用 `script.versionId`,不要引用脚本文件名。`script` 会按 `.js` / `.lua` 后缀识别脚本文件,其他文件走 `config`。
|
|
251
|
+
`pull --all` 落盘前会校验服务端返回的文件名,避免路径穿越。`publish --name` 只能和单个文件一起使用;发布 `.json` 配置时 CLI 会先在本地校验 JSON。
|
|
252
|
+
|
|
253
|
+
## Report Pack
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
gamealgo report pull --out gamealgo-report-pack.json
|
|
257
|
+
gamealgo report validate gamealgo-report-pack.json
|
|
258
|
+
gamealgo report publish gamealgo-report-pack.json
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
每个游戏只有一个当前 Report Pack。`publish` 会整体覆盖上一次提交的配置,不需要传版本号;配置历史由游戏项目自己的 Git 管理。
|
|
262
|
+
|
|
263
|
+
`report validate` 和 Admin 控制台保存时使用同一套服务端校验逻辑。
|
|
264
|
+
|
|
265
|
+
## Adjust 投放花费
|
|
266
|
+
|
|
267
|
+
如果游戏接入了 Adjust 归因,并希望在 GameAlgo 里看 ROAS、投放花费和获客用户 LTV,Agent 可以用 Game Admin Key 配置当前游戏的 Adjust App Token 和 API Token:
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
gamealgo marketing adjust configure \
|
|
271
|
+
--api-token "$ADJUST_API_TOKEN" \
|
|
272
|
+
--app-token "$ADJUST_APP_TOKEN" \
|
|
273
|
+
--platform ios \
|
|
274
|
+
--currency USD \
|
|
275
|
+
--json
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
查看配置状态不会返回 API Token 明文,只会返回是否已配置:
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
gamealgo marketing adjust get --json
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
手动同步某个日期区间的花费:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
gamealgo marketing adjust sync \
|
|
288
|
+
--from 2026-06-01 \
|
|
289
|
+
--to 2026-06-07 \
|
|
290
|
+
--timeout 60 \
|
|
291
|
+
--json
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
花费使用 Adjust 报表里的 `network_cost` 字段,并按 campaign / country 粒度写入平台。Report Pack 里引用 `marketing.overview@1` 和 `marketing.roi@1` 即可使用标准投放总览和 ROAS 看板。
|
|
295
|
+
|
|
296
|
+
## 回收报表结果
|
|
297
|
+
|
|
298
|
+
Agent 应先拉 manifest,了解有哪些 tab、group、chart 和 selector:
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
gamealgo report manifest --json
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
拉取某个 group 或 chart 的结构化结果:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
gamealgo report result \
|
|
308
|
+
--from 2026-06-14 \
|
|
309
|
+
--to 2026-06-21 \
|
|
310
|
+
--tab Revenue \
|
|
311
|
+
--group "Daily ARPU" \
|
|
312
|
+
--selector experiment=ad_frequency \
|
|
313
|
+
--selector mode=normal \
|
|
314
|
+
--timeout 60 \
|
|
315
|
+
--out reports/daily-arpu.json
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
本地修改 Report Pack 后,可以先用 `preview` 直接跑查询结果,不需要发布到线上:
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
gamealgo report manifest --json
|
|
322
|
+
|
|
323
|
+
gamealgo report preview \
|
|
324
|
+
--pack gamealgo-report-pack.json \
|
|
325
|
+
--from 2026-06-14 \
|
|
326
|
+
--to 2026-06-21 \
|
|
327
|
+
--tab-id levels \
|
|
328
|
+
--group-id max_levels \
|
|
329
|
+
--chart-id max_levels__max_level_distribution \
|
|
330
|
+
--timeout 60 \
|
|
331
|
+
--out reports/max-level-distribution-preview.json
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
`preview` 会把本地 pack 发到服务端,用和线上查询相同的校验、SQL 生成和执行逻辑跑一次,但不会保存 pack,也不会写入正式报表缓存。
|
|
335
|
+
|
|
336
|
+
注意 chart id 会被服务端 manifest 规范化。Report Pack 原始 JSON 里可以写裸 id,例如 `max_level_distribution`;manifest 返回的查询 id 会带上 group 前缀,例如 `max_levels__max_level_distribution`。`--chart-id` 优先使用 manifest 返回的规范化 id。如果不确定,先跑 `gamealgo report manifest --json`,或者使用 `--chart "Max Level Distribution"` 按标题查询。为了方便本地调试,已经指定 `--group-id max_levels` 时,也可以用裸 chart id:`--chart-id max_level_distribution`。
|
|
337
|
+
|
|
338
|
+
`preview` 使用本地 pack 内容,但 selector、group 和 chart 查找仍然走服务端规范化后的看板结构,不是直接按原始 JSON 查找。
|
|
339
|
+
|
|
340
|
+
常用参数:
|
|
341
|
+
|
|
342
|
+
- `--tab <title>` / `--tab-id <id>`:选择 tab。
|
|
343
|
+
- `--group <title>` / `--group-id <id>`:选择 group。
|
|
344
|
+
- `--chart <title>` / `--chart-id <id>`:选择单个 chart。`--chart-id` 建议使用 manifest 返回的规范化 id。
|
|
345
|
+
- `--selector key=value`:传入 group selector,可重复。
|
|
346
|
+
- `--refresh`:绕过服务端缓存,重新计算并刷新缓存。
|
|
347
|
+
- `--timeout <seconds>` / `--timeout-ms <ms>`:限制 HTTP 查询最长等待时间。
|
|
348
|
+
- `--out <file>`:把 JSON 结果写入文件。
|
|
349
|
+
- `report preview --pack <file>`:指定本地 Report Pack 文件,适合发布前调试。
|
|
350
|
+
|
|
351
|
+
查询进度和耗时会输出到 stderr,不会污染 `--json` 的 stdout。返回结果包含 `columns`、`rows`、`rowCount`、chart 元信息、date range、selector、缓存信息和 `cli.elapsedMs`,适合 Agent 直接分析。
|
|
352
|
+
|
|
353
|
+
## 事件上报调试
|
|
354
|
+
|
|
355
|
+
接入 SDK 后,Agent 可以用 `events count` 检查某天事件是否已经进入原始事件表:
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
gamealgo events count \
|
|
359
|
+
--from 2026-06-23 \
|
|
360
|
+
--to 2026-06-23 \
|
|
361
|
+
--timeout 60 \
|
|
362
|
+
--json
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
只看某个事件类型:
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
gamealgo events count \
|
|
369
|
+
--from 2026-06-23 \
|
|
370
|
+
--to 2026-06-23 \
|
|
371
|
+
--event-type level_end \
|
|
372
|
+
--json
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
这个命令只按当前 Game Admin Key 绑定的游戏查询固定事件计数 SQL,不接受自定义 SQL,也不依赖 Report Pack 或标准中间表。未传 `--from/--to` 时默认查询当天;只传一边时会把另一边补成同一天。结果里的 `total` 是总事件数,`eventTypes` 是按事件名聚合的数量。
|