@thinkingai/ae-cli 6.0.37 → 6.0.39
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 +25 -3
- package/README.zh.md +25 -3
- package/dist/{auth-56Z45UVR.js → auth-GDV3H5I4.js} +18 -8
- package/dist/{auth-ENM3FE6L.js → auth-NN55553T.js} +3 -3
- package/dist/{capability-2H6PAOA3.js → capability-TPORIKRQ.js} +19 -15
- package/dist/{capability-YPOQX6PL.js → capability-VQNC5CF7.js} +19 -15
- package/dist/chunk-4NN5IWVN.js +26 -0
- package/dist/{chunk-DB4Q3ANU.js → chunk-6A2FUCIS.js} +3 -3
- package/dist/{chunk-PVBYJWC2.js → chunk-7KQWSBSL.js} +4 -4
- package/dist/{chunk-24BAVOX3.js → chunk-AXDXJTPC.js} +3 -1
- package/dist/{chunk-CPVTECJ3.js → chunk-DT6Y3TD7.js} +5 -5
- package/dist/{chunk-EGEIXA2Z.js → chunk-DWO43OIB.js} +0 -248
- package/dist/{chunk-V6FR6WTW.js → chunk-GJJA4CQZ.js} +34 -2
- package/dist/{chunk-RGXCNC4N.js → chunk-GS2P7LFD.js} +50 -17
- package/dist/{chunk-LYVNONC4.js → chunk-JHENBQ5B.js} +35 -0
- package/dist/{chunk-3P3562ZX.js → chunk-MVDZ7DBQ.js} +5 -5
- package/dist/{chunk-LCXU3AAT.js → chunk-NBPKWKRA.js} +2 -2
- package/dist/{chunk-HQ2A7ITL.js → chunk-RBNKI5ZW.js} +50 -17
- package/dist/{chunk-LHVM35J4.js → chunk-TS6BUGUY.js} +4 -4
- package/dist/chunk-TUKQZTMI.js +250 -0
- package/dist/{chunk-J7MZHDHQ.js → chunk-VKD5WQKN.js} +5 -5
- package/dist/{chunk-3KI3RRXX.js → chunk-VTXHDCBW.js} +3 -3
- package/dist/{chunk-KTYR3U6D.js → chunk-YTG6Q75E.js} +10 -6
- package/dist/{chunk-IR4ZLVPW.js → chunk-YV52FB5G.js} +25 -3
- package/dist/{chunk-E7UXXHO3.js → chunk-Z3OXWCIA.js} +3 -3
- package/dist/{cli-token-4SBMXAUK.js → cli-token-GL5MS5FK.js} +4 -4
- package/dist/{client-PP5FETMW.js → client-DAIPF7XN.js} +4 -4
- package/dist/{community-report-client-KK2QBANO.js → community-report-client-M2RW4MXD.js} +2 -2
- package/dist/config-4VZNLBKF.js +489 -0
- package/dist/index.js +96 -37
- package/dist/memory-RWJW4XFO.js +892 -0
- package/dist/memory-VO2ZJCRT.js +892 -0
- package/dist/{metadata-JIQ77HFY.js → metadata-YGTHR2XJ.js} +8 -8
- package/dist/{metadata-AN3YFZEV.js → metadata-ZRN2GHPN.js} +8 -8
- package/dist/{model-JASQVOFD.js → model-CLUIK3K5.js} +7 -5
- package/dist/{raw-XJCAT3HX.js → raw-52B4UKO4.js} +8 -7
- package/dist/sync-3REDHGY6.js +10259 -0
- package/dist/{te-agent-JHUG6DVV.js → te-agent-XNPELAKX.js} +580 -84
- package/dist/{te-analysis-IWQZO423.js → te-analysis-GJI5FZUL.js} +1611 -25
- package/dist/{te-analysis-X222IRYR.js → te-analysis-N2BRDJZ5.js} +1611 -25
- package/dist/{te-community-QOYIYEJI.js → te-community-SQXKE5OO.js} +7 -7
- package/dist/{te-community-UFKI6ONP.js → te-community-TYSNU3NQ.js} +7 -7
- package/dist/{te-dataops-PZQ5NQLY.js → te-dataops-5TM7WZDI.js} +370 -189
- package/dist/{te-dataops-XTWVTJCA.js → te-dataops-OWIADNSM.js} +370 -189
- package/dist/{te-engage-NLZUPSBK.js → te-engage-F7V55KVW.js} +333 -105
- package/dist/{te-engage-E7F4HTXU.js → te-engage-FMYAYCNV.js} +333 -105
- package/dist/{te-kb-E7NSCBRB.js → te-kb-VRMEY3D4.js} +6 -6
- package/dist/{te-meta-GBDTMPEL.js → te-meta-53BVXPFI.js} +7 -7
- package/dist/{te-meta-ZTLTSHXC.js → te-meta-TOCBPBXI.js} +7 -7
- package/dist/{te-system-AH7DMCAQ.js → te-system-XGS5EQIQ.js} +4 -4
- package/dist/{te-team-BQ3SKSZV.js → te-team-BZRDV2CM.js} +7 -7
- package/dist/{update-DKG6UXEM.js → update-HEDXGOJH.js} +8 -6
- package/package.json +5 -2
- package/skills/ae-agent/SKILL.md +178 -16
- package/skills/ae-agent/references/add-skill.md +22 -10
- package/skills/ae-agent/references/edit-skill.md +24 -14
- package/skills/ae-agent/references/find-archived-conversations.md +82 -0
- package/skills/ae-agent/references/restore-conversation.md +54 -0
- package/skills/ae-agent/references/upload-skill.md +24 -14
- package/skills/ae-analysis/SKILL.md +1 -1
- package/skills/ae-analysis/references/command_index.md +109 -42
- package/skills/ae-analysis/references/debug_data_list.md +28 -0
- package/skills/ae-analysis/references/debug_device_add.md +23 -0
- package/skills/ae-analysis/references/debug_device_list.md +19 -0
- package/skills/ae-analysis/references/debug_device_select.md +22 -0
- package/skills/ae-analysis/references/entity_id_import_options.md +1 -1
- package/skills/ae-analysis/references/plan_sync_display_names.md +28 -0
- package/skills/ae-analysis/references/project_access_detail_get.md +3 -3
- package/skills/ae-analysis/references/project_data_power_delete.md +3 -3
- package/skills/ae-analysis/references/project_data_power_get.md +3 -3
- package/skills/ae-analysis/references/project_data_power_list.md +3 -3
- package/skills/ae-analysis/references/project_data_power_upsert.md +3 -3
- package/skills/ae-analysis/references/project_entity_create.md +3 -3
- package/skills/ae-analysis/references/project_entity_delete.md +3 -3
- package/skills/ae-analysis/references/project_entity_event_list.md +3 -3
- package/skills/ae-analysis/references/project_entity_get.md +3 -3
- package/skills/ae-analysis/references/project_entity_list.md +3 -3
- package/skills/ae-analysis/references/project_entity_update.md +3 -3
- package/skills/ae-analysis/references/project_function_list.md +3 -3
- package/skills/ae-analysis/references/project_info_create.md +25 -0
- package/skills/ae-analysis/references/project_info_delete.md +24 -0
- package/skills/ae-analysis/references/project_info_get.md +3 -3
- package/skills/ae-analysis/references/project_info_list.md +3 -3
- package/skills/ae-analysis/references/project_info_update.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_create.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_delete.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_list.md +3 -3
- package/skills/ae-analysis/references/project_mark_time_update.md +3 -3
- package/skills/ae-analysis/references/project_member_add.md +3 -3
- package/skills/ae-analysis/references/project_member_batch_update.md +3 -3
- package/skills/ae-analysis/references/project_member_candidate_list.md +3 -3
- package/skills/ae-analysis/references/project_member_handover_export.md +3 -3
- package/skills/ae-analysis/references/project_member_handover_run.md +3 -3
- package/skills/ae-analysis/references/project_member_import.md +3 -3
- package/skills/ae-analysis/references/project_member_list.md +3 -3
- package/skills/ae-analysis/references/project_member_receiver_list.md +3 -3
- package/skills/ae-analysis/references/project_member_remove.md +3 -3
- package/skills/ae-analysis/references/project_member_update.md +3 -3
- package/skills/ae-analysis/references/project_owner_update.md +3 -3
- package/skills/ae-analysis/references/project_permission_binding_list.md +3 -3
- package/skills/ae-analysis/references/project_receive_status_update.md +3 -3
- package/skills/ae-analysis/references/project_role_delete.md +3 -3
- package/skills/ae-analysis/references/project_role_function_list.md +3 -3
- package/skills/ae-analysis/references/project_role_get.md +3 -3
- package/skills/ae-analysis/references/project_role_list.md +3 -3
- package/skills/ae-analysis/references/project_role_upsert.md +3 -3
- package/skills/ae-analysis/references/project_role_user_list.md +3 -3
- package/skills/ae-analysis/references/project_space_list.md +1 -1
- package/skills/ae-analysis/references/project_timezone_get.md +3 -3
- package/skills/ae-analysis/references/project_timezone_overview.md +3 -3
- package/skills/ae-analysis/references/project_timezone_update.md +3 -3
- package/skills/ae-analysis/references/project_user_id_items_update.md +3 -3
- package/skills/ae-analysis/references/system_admin_function_list.md +22 -0
- package/skills/ae-analysis/references/system_admin_function_update.md +26 -0
- package/skills/ae-analysis/references/system_admin_list.md +21 -0
- package/skills/ae-analysis/references/system_admin_remove.md +25 -0
- package/skills/ae-analysis/references/system_admin_upsert.md +25 -0
- package/skills/ae-analysis/references/system_function_list.md +21 -0
- package/skills/ae-analysis/references/system_member_add.md +25 -0
- package/skills/ae-analysis/references/system_member_candidate_list.md +22 -0
- package/skills/ae-analysis/references/system_member_delete.md +25 -0
- package/skills/ae-analysis/references/system_member_list.md +24 -0
- package/skills/ae-analysis/references/system_member_mfa_unbind.md +25 -0
- package/skills/ae-analysis/references/system_member_password_reset.md +32 -0
- package/skills/ae-analysis/references/system_member_project_batch_update.md +27 -0
- package/skills/ae-analysis/references/system_member_status_update.md +26 -0
- package/skills/ae-analysis/references/system_member_update.md +23 -0
- package/skills/ae-analysis/references/system_mfa_get.md +21 -0
- package/skills/ae-analysis/references/system_mfa_update.md +25 -0
- package/skills/ae-analysis/references/system_node_monitor_list.md +24 -0
- package/skills/ae-analysis/references/system_oauth2_update.md +22 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_delete.md +25 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_list.md +23 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_test.md +29 -0
- package/skills/ae-analysis/references/system_ops_alert_contact_upsert.md +39 -0
- package/skills/ae-analysis/references/system_preference_get.md +21 -0
- package/skills/ae-analysis/references/system_preference_update.md +22 -0
- package/skills/ae-analysis/references/system_project_usage_list.md +28 -0
- package/skills/ae-analysis/references/system_query_alert_rule_list.md +21 -0
- package/skills/ae-analysis/references/system_query_alert_rule_update.md +26 -0
- package/skills/ae-analysis/references/system_query_monitor_overview.md +26 -0
- package/skills/ae-analysis/references/system_query_task_cancel.md +25 -0
- package/skills/ae-analysis/references/system_query_task_export.md +49 -0
- package/skills/ae-analysis/references/system_query_task_get.md +23 -0
- package/skills/ae-analysis/references/system_query_task_list.md +35 -0
- package/skills/ae-analysis/references/system_query_task_options.md +27 -0
- package/skills/ae-analysis/references/system_receiver_address_delete.md +26 -0
- package/skills/ae-analysis/references/system_receiver_address_overview.md +21 -0
- package/skills/ae-analysis/references/system_receiver_address_project_list.md +21 -0
- package/skills/ae-analysis/references/system_receiver_address_promote.md +24 -0
- package/skills/ae-analysis/references/system_receiver_address_upsert.md +27 -0
- package/skills/ae-analysis/references/system_receiver_detection_get.md +22 -0
- package/skills/ae-analysis/references/system_receiver_detection_run.md +22 -0
- package/skills/ae-analysis/references/system_receiver_detection_update.md +25 -0
- package/skills/ae-analysis/references/system_role_delete.md +26 -0
- package/skills/ae-analysis/references/system_role_function_list.md +22 -0
- package/skills/ae-analysis/references/system_role_get.md +22 -0
- package/skills/ae-analysis/references/system_role_list.md +24 -0
- package/skills/ae-analysis/references/system_role_upsert.md +27 -0
- package/skills/ae-analysis/references/system_role_user_list.md +22 -0
- package/skills/ae-analysis/references/system_seat_list.md +25 -0
- package/skills/ae-analysis/references/system_seat_update.md +26 -0
- package/skills/ae-analysis/references/system_smtp_delete.md +24 -0
- package/skills/ae-analysis/references/system_smtp_get.md +21 -0
- package/skills/ae-analysis/references/system_smtp_test.md +22 -0
- package/skills/ae-analysis/references/system_smtp_upsert.md +31 -0
- package/skills/ae-analysis/references/system_third_party_login_disable.md +25 -0
- package/skills/ae-analysis/references/system_third_party_login_list.md +21 -0
- package/skills/ae-analysis/references/system_third_party_login_upsert.md +33 -0
- package/skills/ae-analysis/references/system_usage_overview.md +21 -0
- package/skills/ae-analysis/references/system_usage_trend_export.md +44 -0
- package/skills/ae-analysis/references/system_usage_trend_query.md +28 -0
- package/skills/ae-dataops/SKILL.md +1 -1
- package/skills/ae-dataops/references/dataops-flow-create.md +51 -16
- package/skills/ae-engage/SKILL.md +56 -26
- package/skills/ae-engage/references/activity-activity.md +3 -0
- package/skills/ae-engage/references/activity-approval.md +12 -4
- package/skills/ae-engage/references/activity-task.md +21 -6
- package/skills/ae-engage/references/activity-topic.md +31 -13
- package/skills/ae-engage/references/add-channel.md +170 -41
- package/skills/ae-engage/references/build-task-save-guide.md +40 -27
- package/skills/ae-engage/references/channel-update-config.md +3 -2
- package/skills/ae-engage/references/common-metric.md +48 -120
- package/skills/ae-engage/references/flow-detail.md +13 -0
- package/skills/ae-engage/references/preset-event.md +12 -32
- package/skills/ae-engage/references/save-flow.md +127 -64
- package/skills/ae-engage/references/save-task.md +197 -59
- package/skills/ae-engage/references/scene-config-metric.md +3 -0
- package/skills/ae-engage/references/scene-preset-metric.md +8 -37
- package/skills/ae-engage/references/scene-strategy-audience.md +51 -643
- package/skills/ae-engage/references/scene-strategy.md +6 -6
- package/skills/ae-engage/references/task-detail.md +10 -0
- package/skills/ae-engage/references/task-submit-approval.md +45 -0
- package/skills/ae-engage/references/validate-flow-node-config.md +1 -1
- package/skills/ae-generate-tracking-code/SKILL.md +24 -8
- package/skills/ae-generate-tracking-code/references/debug-script.md +46 -37
- package/skills/ae-generate-tracking-plan/SKILL.md +26 -1
- package/skills/ae-metadata/SKILL.md +1 -1
- package/dist/config-BSSALXEN.js +0 -128
- package/dist/sync-QFP4XFN3.js +0 -485
|
@@ -1,680 +1,88 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Scene strategy semantic audience
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
> Strategy payload: [`scene-strategy.md`](scene-strategy.md).
|
|
5
|
-
> Audience **logic** uses the same semantic model as ae-analysis [`user_cluster_models.md`](../../ae-analysis/references/user_cluster_models.md) + [`audience_models.md`](../../ae-analysis/references/audience_models.md).
|
|
3
|
+
Scene strategy capabilities expose Analysis-compatible semantic audience definitions. Do not construct or submit internal QP fields, calculation codes, metadata display fields, or numeric relation values.
|
|
6
4
|
|
|
7
|
-
|
|
5
|
+
## Public contract
|
|
8
6
|
|
|
9
|
-
|
|
|
10
|
-
|---|---|---|
|
|
11
|
-
| 全部用户 | `targetClusterType: 0` | `targetClusterQp: null` |
|
|
12
|
-
| 自定义人群 | `targetClusterType: 1` | `targetClusterQp`: **JSON string** (mix QP) |
|
|
13
|
-
| 目标环境 (Webhook) | `envConfig` | Mutually exclusive with user audience on Webhook |
|
|
14
|
-
|
|
15
|
-
## Default workflow (Agent) — direct strategy, no new cluster
|
|
16
|
-
|
|
17
|
-
**Unless the user explicitly asks to use an existing / named user cluster**, do **not** call `analysis user-cluster create`. Create the strategy directly:
|
|
18
|
-
|
|
19
|
-
1. **Preflight** — verify every user/event property and enum value exists (see [Preflight](#preflight--mandatory-stop)).
|
|
20
|
-
2. **Design** — express audience in natural language: **用户满足** block + optional **用户行为** block + relation between them.
|
|
21
|
-
3. **Assemble** — build mix QP (`totalCFilter`, optional `totalOutCFilter`) per [QP shape](#mix-qp-shape-ui--backend) below; `JSON.stringify` into `targetClusterQp`.
|
|
22
|
-
4. **Create / update** — `engage-scene strategy create|update`.
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
# Preflight
|
|
26
|
-
ae-cli analysis-meta property list --project-id <pid> --table-type user
|
|
27
|
-
ae-cli analysis-meta property get --project-id <pid> --table-type user --prop-name <prop>
|
|
28
|
-
ae-cli analysis-meta event list --project-id <pid>
|
|
29
|
-
ae-cli analysis-meta event get --project-id <pid> --event-name <event>
|
|
30
|
-
ae-cli analysis +load_filters --project_id <pid> --table_type user --quot <prop>
|
|
31
|
-
|
|
32
|
-
# Create / update
|
|
33
|
-
ae-cli engage-scene strategy create --project-id <pid> --payload '{
|
|
34
|
-
"configId":"<config_id>",
|
|
35
|
-
"templateId":"<enabled_template_id>",
|
|
36
|
-
"strategyName":"<name>",
|
|
37
|
-
"tzOffset":8.0,
|
|
38
|
-
"targetClusterType":1,
|
|
39
|
-
"targetClusterQp":"<stringified mix QP>",
|
|
40
|
-
"envConfig":null,
|
|
41
|
-
"templateParamConfig":"[...]",
|
|
42
|
-
"content":"{...}",
|
|
43
|
-
"triggerType":0,
|
|
44
|
-
"onlineTime":"1",
|
|
45
|
-
"offlineTime":"1"
|
|
46
|
-
}'
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Align `tzOffset` with the strategy timezone.
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## Mix QP shape (UI ↔ backend)
|
|
54
|
-
|
|
55
|
-
Config-strategy custom audience uses **mix QP** (same as Hermes `formatTriggerConditionForBack` / `formatTriggerConditionFromQp`, mix version `4.3`).
|
|
56
|
-
|
|
57
|
-
### Top-level object
|
|
58
|
-
|
|
59
|
-
```json
|
|
60
|
-
{
|
|
61
|
-
"totalCFilter": { "relation": "<userEventRelation>", "filts": [ /* block 0 */, /* block 1 */ ] },
|
|
62
|
-
"totalOutCFilter": { "relation": "0", "filts": [] }
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
| Field | UI label | Meaning |
|
|
67
|
-
|---|---|---|
|
|
68
|
-
| `totalCFilter.relation` | 用户满足 **与/或** 用户行为 | `"1"` = 且, `"0"` = 或 (`userEventRelation`) |
|
|
69
|
-
| `totalCFilter.filts[0]` | **用户满足** | User/tag/cluster conditions only |
|
|
70
|
-
| `totalCFilter.filts[1]` | **用户行为** | Event / behavior-sequence conditions only (omit block if no events) |
|
|
71
|
-
| `totalOutCFilter` | **排除用户** | Optional exclude block; empty `filts` when unused |
|
|
72
|
-
|
|
73
|
-
### Hard structural rules
|
|
74
|
-
|
|
75
|
-
1. **Two-block layout** — when both user attrs and events exist, `totalCFilter.filts` has **exactly two** group objects:
|
|
76
|
-
- `[0]` = 用户满足 (`filts[].conditionType` is `user` / `tag` / `cluster`, or nested `filterType:"COMPOUND"`)
|
|
77
|
-
- `[1]` = 用户行为 (`filts[].conditionType` is `event` / `behaviorSeq`)
|
|
78
|
-
2. **Never nest `event` inside 用户满足** — do not put `conditionType:"event"` under user-side `filterType:"COMPOUND"`. The UI cannot parse that shape.
|
|
79
|
-
3. **Group vs leaf** — compound groups use `{ "relation": 0|1, "filts": [...] }` or `{ "filterType": "COMPOUND", "relation": 0|1, "filts": [...] }` inside 用户满足. Event block uses `{ "relation": 0|1, "filts": [ event leaves ] }` without `filterType`.
|
|
80
|
-
4. **`relation` values** — `"1"` = 且, `"0"` = 或 (string at group level is accepted; backend may normalize to number).
|
|
81
|
-
|
|
82
|
-
### ASCII layout (typical case: 用户满足 且 用户行为)
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
totalCFilter
|
|
86
|
-
├── relation: "1" ← userEventRelation (且)
|
|
87
|
-
├── filts[0] 用户满足
|
|
88
|
-
│ ├── relation: "0"|"1" ← OR/AND among user conditions
|
|
89
|
-
│ └── filts[]
|
|
90
|
-
│ ├── filterType:"COMPOUND" … ← nested AND/OR groups
|
|
91
|
-
│ └── conditionType:"user" … ← leaf
|
|
92
|
-
└── filts[1] 用户行为
|
|
93
|
-
├── relation: "0"|"1" ← OR/AND among events
|
|
94
|
-
└── filts[]
|
|
95
|
-
└── conditionType:"event" …
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## 用户满足 — QP definition
|
|
101
|
-
|
|
102
|
-
**UI:** 目标受众 → 自定义人群 → **用户满足**
|
|
103
|
-
**JSON:** `totalCFilter.filts[0]`
|
|
104
|
-
|
|
105
|
-
### Group
|
|
106
|
-
|
|
107
|
-
```json
|
|
108
|
-
{
|
|
109
|
-
"relation": "0",
|
|
110
|
-
"filts": [ /* leaves and COMPOUND groups */ ]
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
- `relation: "0"` — 或 (any branch matches)
|
|
115
|
-
- `relation: "1"` — 且 (all branches match)
|
|
116
|
-
|
|
117
|
-
### Nested AND/OR (COMPOUND)
|
|
118
|
-
|
|
119
|
-
Use inside `filts[0].filts` when one OR branch is itself an AND (or deeper nesting):
|
|
120
|
-
|
|
121
|
-
```json
|
|
122
|
-
{
|
|
123
|
-
"filterType": "COMPOUND",
|
|
124
|
-
"relation": 1,
|
|
125
|
-
"filts": [
|
|
126
|
-
{ "conditionType": "user", "userCondition": { /* leaf A */ } },
|
|
127
|
-
{ "conditionType": "user", "userCondition": { /* leaf B */ } }
|
|
128
|
-
]
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### User property leaf (`userCondition`)
|
|
133
|
-
|
|
134
|
-
Every leaf must use fields from **`analysis-meta property get`** — never guess names or enum values.
|
|
135
|
-
|
|
136
|
-
| Semantic operator | `calcuSymbol` |
|
|
7
|
+
| Operation | Audience field |
|
|
137
8
|
|---|---|
|
|
138
|
-
|
|
|
139
|
-
|
|
|
140
|
-
|
|
|
141
|
-
| greater than / ≥ | `C03` / `C030` |
|
|
142
|
-
| contains / not contains | `C07` / `C08` |
|
|
143
|
-
| regex / not regex | `C11` / `C12` |
|
|
9
|
+
| `strategy create`, `update`, `save-submit` | `payload.definitionRequest` (native camelCase payload) |
|
|
10
|
+
| `strategy get` | `data.item.definition_request` |
|
|
11
|
+
| `strategy predict` | `--definition-request` |
|
|
144
12
|
|
|
145
|
-
|
|
13
|
+
For a custom audience, set `targetClusterType` to `1` and supply `definitionRequest`. For all users, set `targetClusterType` to `0` and omit `definitionRequest`.
|
|
146
14
|
|
|
147
|
-
|
|
148
|
-
{
|
|
149
|
-
"conditionType": "user",
|
|
150
|
-
"userCondition": {
|
|
151
|
-
"calcuSymbol": "C00",
|
|
152
|
-
"columnName": "device_brand",
|
|
153
|
-
"columnDesc": "device_brand",
|
|
154
|
-
"columnType": "string",
|
|
155
|
-
"selectType": "string",
|
|
156
|
-
"tableType": "1",
|
|
157
|
-
"ftv": ["苹果"],
|
|
158
|
-
"timeRelative": "",
|
|
159
|
-
"timeUnit": ""
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
Datetime leaf (e.g. birth date after a year — confirm `columnType`/`selectType` from property get):
|
|
165
|
-
|
|
166
|
-
```json
|
|
167
|
-
{
|
|
168
|
-
"conditionType": "user",
|
|
169
|
-
"userCondition": {
|
|
170
|
-
"calcuSymbol": "C030",
|
|
171
|
-
"columnName": "birthdate",
|
|
172
|
-
"columnDesc": "birthdate",
|
|
173
|
-
"columnType": "timestamp",
|
|
174
|
-
"selectType": "datetime",
|
|
175
|
-
"tableType": "1",
|
|
176
|
-
"ftv": ["2001-01-01 00:00:00"],
|
|
177
|
-
"timeRelative": "",
|
|
178
|
-
"timeUnit": ""
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### 用户满足-only audience
|
|
184
|
-
|
|
185
|
-
When there is **no** 用户行为, `totalCFilter.filts` has **one** block (用户满足 only). Set `totalCFilter.relation` to `"1"` (default 且 with empty event side is not used — simply omit `filts[1]`).
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## 用户行为 — QP definition
|
|
190
|
-
|
|
191
|
-
**UI:** 目标受众 → 自定义人群 → **用户行为**
|
|
192
|
-
**JSON:** `totalCFilter.filts[1]`
|
|
193
|
-
|
|
194
|
-
### Group
|
|
195
|
-
|
|
196
|
-
```json
|
|
197
|
-
{
|
|
198
|
-
"relation": "1",
|
|
199
|
-
"filts": [
|
|
200
|
-
{ "conditionType": "event", "eventCondition": { /* … */ } }
|
|
201
|
-
]
|
|
202
|
-
}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
- Multiple events: `relation: "1"` = 且 (all), `"0"` = 或 (any).
|
|
206
|
-
|
|
207
|
-
### Event count leaf (`eventCondition`)
|
|
208
|
-
|
|
209
|
-
Preset **总次数** (empty `taPropQuota.quota`) rules — see [`save-flow.md`](save-flow.md) §9.2:
|
|
210
|
-
|
|
211
|
-
| Meaning | `uceCalcuSymbol` | `num` (string) |
|
|
212
|
-
|---|---|---|
|
|
213
|
-
| at least once (≥ 1) | `C030` | `"1"` |
|
|
214
|
-
| at least N times (≥ N) | `C030` | `"N"` |
|
|
215
|
-
| greater than N (> N) | `C03` | `"N"` |
|
|
216
|
-
|
|
217
|
-
Always include full `taPropQuota`:
|
|
218
|
-
|
|
219
|
-
```json
|
|
220
|
-
"taPropQuota": {
|
|
221
|
-
"analysis": "A200",
|
|
222
|
-
"analysisDesc": "Count",
|
|
223
|
-
"quota": "",
|
|
224
|
-
"quotaDesc": "",
|
|
225
|
-
"analysisParams": ""
|
|
226
|
-
}
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
### Time window (`recentDay`)
|
|
15
|
+
Do not pass `targetClusterQp` or `qp`. Hermes compiles the semantic definition before invoking the existing strategy service and converts stored definitions back on get.
|
|
230
16
|
|
|
231
|
-
|
|
232
|
-
|---|---|
|
|
233
|
-
| 最近 N 天(含今天) | `"0-N"` |
|
|
234
|
-
| 过去 N 天(不含今天) | `"1-N"` |
|
|
235
|
-
|
|
236
|
-
Confirm against project convention if validation fails.
|
|
17
|
+
## Semantic definition
|
|
237
18
|
|
|
238
|
-
|
|
19
|
+
Use the same condition definition accepted by Analysis user-cluster commands:
|
|
239
20
|
|
|
240
21
|
```json
|
|
241
22
|
{
|
|
242
|
-
"
|
|
243
|
-
"
|
|
244
|
-
"
|
|
245
|
-
"
|
|
246
|
-
"eventType": "event",
|
|
247
|
-
"uceCalcuSymbol": "C030",
|
|
248
|
-
"num": "2",
|
|
249
|
-
"recentDay": "0-3",
|
|
250
|
-
"startTime": "",
|
|
251
|
-
"endTime": "",
|
|
252
|
-
"taPropQuota": {
|
|
253
|
-
"analysis": "A200",
|
|
254
|
-
"analysisDesc": "Count",
|
|
255
|
-
"quota": "",
|
|
256
|
-
"quotaDesc": "",
|
|
257
|
-
"analysisParams": ""
|
|
258
|
-
},
|
|
259
|
-
"filts": [],
|
|
260
|
-
"relation": 1
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
### Event property filters
|
|
266
|
-
|
|
267
|
-
Put filters on the event inside `eventCondition.filts[]` (`tableType: "0"`). Preflight with `analysis-meta event get` + event-scoped property list. Example: `os_version` regex on `login` — see worked example B below.
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
## Preflight — mandatory stop
|
|
272
|
-
|
|
273
|
-
### 用户满足 (user-table properties)
|
|
274
|
-
|
|
275
|
-
1. **`analysis-meta property get`** for each `columnName` — exact match required.
|
|
276
|
-
2. **Never invent** — do not map natural language to property names without confirmation (e.g. “在中国” → `country`, not `nation`, until verified).
|
|
277
|
-
3. **Never silently drop** — missing property → stop; do not create/update strategy.
|
|
278
|
-
4. **Report** — name missing fields; run **`analysis-meta property list --table-type user`** and present available properties (`prop_name`, `prop_desc`, `select_type`); ask user to choose.
|
|
279
|
-
|
|
280
|
-
```bash
|
|
281
|
-
ae-cli analysis-meta property get --project-id <pid> --table-type user --prop-name <prop_name>
|
|
282
|
-
ae-cli analysis-meta property list --project-id <pid> --table-type user
|
|
283
|
-
ae-cli analysis +load_filters --project_id <pid> --table_type user --quot <prop_name>
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
Enum/`ftv` values must come from `+load_filters` or property metadata — never invent labels.
|
|
287
|
-
|
|
288
|
-
### 用户行为 (events)
|
|
289
|
-
|
|
290
|
-
```bash
|
|
291
|
-
ae-cli analysis-meta event list --project-id <pid>
|
|
292
|
-
ae-cli analysis-meta event get --project-id <pid> --event-name <event_name>
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
Same stop/report rules if event name or event property is missing.
|
|
296
|
-
|
|
297
|
-
---
|
|
298
|
-
|
|
299
|
-
## Worked example A — 用户满足 + 用户行为 (full strategy)
|
|
300
|
-
|
|
301
|
-
**Natural language:**
|
|
302
|
-
|
|
303
|
-
- **用户满足:** (苹果用户 且 在中国) **或** (出生日期在 2000 年之后)
|
|
304
|
-
- **用户行为:** 最近 3 天登录 ≥ 2 次 **且** 最近 1 天购买 > 1 次
|
|
305
|
-
- **Relation:** 用户满足 **且** 用户行为
|
|
306
|
-
|
|
307
|
-
**Preflight (example project):** `device_brand`/`country`/`birthdate` exist; `device_brand` enum has `"苹果"`; `country` enum has `"中国"`; events `login`, `purchase` exist.
|
|
308
|
-
|
|
309
|
-
**UI mapping:**
|
|
310
|
-
|
|
311
|
-
```
|
|
312
|
-
用户满足 OR [ AND(苹果, 中国), birthdate≥2001-01-01 ]
|
|
313
|
-
且
|
|
314
|
-
用户行为 AND [ login≥2 / 最近3天, purchase>1 / 最近1天 ]
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
**`targetClusterQp`** (stringify for payload):
|
|
318
|
-
|
|
319
|
-
```json
|
|
320
|
-
{
|
|
321
|
-
"totalCFilter": {
|
|
322
|
-
"relation": "1",
|
|
323
|
-
"filts": [
|
|
23
|
+
"type": "condition",
|
|
24
|
+
"conditions": {
|
|
25
|
+
"relation": "and",
|
|
26
|
+
"items": [
|
|
324
27
|
{
|
|
325
|
-
"
|
|
326
|
-
"
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
"relation": 1,
|
|
330
|
-
"filts": [
|
|
331
|
-
{
|
|
332
|
-
"conditionType": "user",
|
|
333
|
-
"userCondition": {
|
|
334
|
-
"calcuSymbol": "C00",
|
|
335
|
-
"columnName": "device_brand",
|
|
336
|
-
"columnDesc": "device_brand",
|
|
337
|
-
"columnType": "string",
|
|
338
|
-
"selectType": "string",
|
|
339
|
-
"tableType": "1",
|
|
340
|
-
"ftv": ["苹果"],
|
|
341
|
-
"timeRelative": "",
|
|
342
|
-
"timeUnit": ""
|
|
343
|
-
}
|
|
344
|
-
},
|
|
345
|
-
{
|
|
346
|
-
"conditionType": "user",
|
|
347
|
-
"userCondition": {
|
|
348
|
-
"calcuSymbol": "C00",
|
|
349
|
-
"columnName": "country",
|
|
350
|
-
"columnDesc": "country",
|
|
351
|
-
"columnType": "string",
|
|
352
|
-
"selectType": "string",
|
|
353
|
-
"tableType": "1",
|
|
354
|
-
"ftv": ["中国"],
|
|
355
|
-
"timeRelative": "",
|
|
356
|
-
"timeUnit": ""
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
]
|
|
360
|
-
},
|
|
361
|
-
{
|
|
362
|
-
"conditionType": "user",
|
|
363
|
-
"userCondition": {
|
|
364
|
-
"calcuSymbol": "C030",
|
|
365
|
-
"columnName": "birthdate",
|
|
366
|
-
"columnDesc": "birthdate",
|
|
367
|
-
"columnType": "timestamp",
|
|
368
|
-
"selectType": "datetime",
|
|
369
|
-
"tableType": "1",
|
|
370
|
-
"ftv": ["2001-01-01 00:00:00"],
|
|
371
|
-
"timeRelative": "",
|
|
372
|
-
"timeUnit": ""
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
]
|
|
28
|
+
"type": "user_property",
|
|
29
|
+
"property": "vip_level",
|
|
30
|
+
"operator": "eq",
|
|
31
|
+
"value": "gold"
|
|
376
32
|
},
|
|
377
33
|
{
|
|
378
|
-
"
|
|
379
|
-
"
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
"recentDay": "0-3",
|
|
389
|
-
"startTime": "",
|
|
390
|
-
"endTime": "",
|
|
391
|
-
"taPropQuota": {
|
|
392
|
-
"analysis": "A200",
|
|
393
|
-
"analysisDesc": "Count",
|
|
394
|
-
"quota": "",
|
|
395
|
-
"quotaDesc": "",
|
|
396
|
-
"analysisParams": ""
|
|
397
|
-
},
|
|
398
|
-
"filts": [],
|
|
399
|
-
"relation": 1
|
|
400
|
-
}
|
|
401
|
-
},
|
|
402
|
-
{
|
|
403
|
-
"conditionType": "event",
|
|
404
|
-
"eventCondition": {
|
|
405
|
-
"eventName": "purchase",
|
|
406
|
-
"eventDesc": "purchase",
|
|
407
|
-
"eventType": "event",
|
|
408
|
-
"uceCalcuSymbol": "C03",
|
|
409
|
-
"num": "1",
|
|
410
|
-
"recentDay": "0-1",
|
|
411
|
-
"startTime": "",
|
|
412
|
-
"endTime": "",
|
|
413
|
-
"taPropQuota": {
|
|
414
|
-
"analysis": "A200",
|
|
415
|
-
"analysisDesc": "Count",
|
|
416
|
-
"quota": "",
|
|
417
|
-
"quotaDesc": "",
|
|
418
|
-
"analysisParams": ""
|
|
419
|
-
},
|
|
420
|
-
"filts": [],
|
|
421
|
-
"relation": 1
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
]
|
|
34
|
+
"type": "event_behavior",
|
|
35
|
+
"event": "purchase",
|
|
36
|
+
"aggregation": "count",
|
|
37
|
+
"operator": "gte",
|
|
38
|
+
"value": 2,
|
|
39
|
+
"time": {
|
|
40
|
+
"type": "relative",
|
|
41
|
+
"unit": "day",
|
|
42
|
+
"value": 7
|
|
43
|
+
}
|
|
425
44
|
}
|
|
426
45
|
]
|
|
427
|
-
},
|
|
428
|
-
"totalOutCFilter": {
|
|
429
|
-
"relation": "0",
|
|
430
|
-
"filts": []
|
|
431
46
|
}
|
|
432
47
|
}
|
|
433
48
|
```
|
|
434
49
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
- `"2000年之后"` interpreted as `birthdate >= 2001-01-01`; confirm with user if they mean inclusive of year 2000.
|
|
438
|
-
- `purchase > 1` → `C03` + `num: "1"`; `login ≥ 2` → `C030` + `num: "2"`.
|
|
439
|
-
|
|
440
|
-
---
|
|
50
|
+
Before writing, resolve real event and property names through Analysis metadata commands. Never invent names or copy internal calculation codes from historical output.
|
|
441
51
|
|
|
442
|
-
|
|
52
|
+
Nested `and`/`or`, user properties, event behavior, include/exclude existing clusters, relative time, and custom time use the Analysis semantic shape documented by `ae-analysis`.
|
|
443
53
|
|
|
444
|
-
|
|
54
|
+
## Create or update
|
|
445
55
|
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
用户满足 OR [ AND(苹果), 非苹果 ]
|
|
450
|
-
且
|
|
451
|
-
用户行为 login (os_version 匹配 iOS 主版本 > 26)
|
|
56
|
+
```bash
|
|
57
|
+
ae-cli engage-scene strategy create --project-id <project_id> \
|
|
58
|
+
--payload '{"configId":"cfg-1","templateId":"tpl-1","strategyName":"s1","targetClusterType":1,"definitionRequest":{"type":"condition","conditions":{...}}}'
|
|
452
59
|
```
|
|
453
60
|
|
|
454
|
-
|
|
61
|
+
Use `strategy get` as the source for an update. When `definition_status` is `UNAVAILABLE`, do not guess a replacement definition; ask the user to redefine the audience.
|
|
455
62
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
"filts": [
|
|
464
|
-
{
|
|
465
|
-
"filterType": "COMPOUND",
|
|
466
|
-
"relation": 1,
|
|
467
|
-
"filts": [
|
|
468
|
-
{
|
|
469
|
-
"conditionType": "user",
|
|
470
|
-
"userCondition": {
|
|
471
|
-
"calcuSymbol": "C00",
|
|
472
|
-
"columnName": "device_brand",
|
|
473
|
-
"columnDesc": "device_brand",
|
|
474
|
-
"columnType": "string",
|
|
475
|
-
"selectType": "string",
|
|
476
|
-
"tableType": "1",
|
|
477
|
-
"ftv": ["苹果"]
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
]
|
|
481
|
-
},
|
|
482
|
-
{
|
|
483
|
-
"conditionType": "user",
|
|
484
|
-
"userCondition": {
|
|
485
|
-
"calcuSymbol": "C01",
|
|
486
|
-
"columnName": "device_brand",
|
|
487
|
-
"columnDesc": "device_brand",
|
|
488
|
-
"columnType": "string",
|
|
489
|
-
"selectType": "string",
|
|
490
|
-
"tableType": "1",
|
|
491
|
-
"ftv": ["苹果"]
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
]
|
|
495
|
-
},
|
|
496
|
-
{
|
|
497
|
-
"relation": "1",
|
|
498
|
-
"filts": [
|
|
499
|
-
{
|
|
500
|
-
"conditionType": "event",
|
|
501
|
-
"eventCondition": {
|
|
502
|
-
"eventName": "login",
|
|
503
|
-
"eventDesc": "login",
|
|
504
|
-
"eventType": "event",
|
|
505
|
-
"uceCalcuSymbol": "C030",
|
|
506
|
-
"num": "1",
|
|
507
|
-
"recentDay": "0-3650",
|
|
508
|
-
"taPropQuota": {
|
|
509
|
-
"analysis": "A200",
|
|
510
|
-
"analysisDesc": "Count",
|
|
511
|
-
"quota": "",
|
|
512
|
-
"quotaDesc": "",
|
|
513
|
-
"analysisParams": ""
|
|
514
|
-
},
|
|
515
|
-
"filts": [
|
|
516
|
-
{
|
|
517
|
-
"calcuSymbol": "C11",
|
|
518
|
-
"columnName": "os_version",
|
|
519
|
-
"columnDesc": "os_version",
|
|
520
|
-
"columnType": "string",
|
|
521
|
-
"selectType": "string",
|
|
522
|
-
"tableType": "0",
|
|
523
|
-
"ftv": ["^(iOS )?(2[7-9]|[3-9][0-9])(\\.[0-9]+)*$"]
|
|
524
|
-
}
|
|
525
|
-
],
|
|
526
|
-
"relation": 1
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
]
|
|
530
|
-
}
|
|
531
|
-
]
|
|
532
|
-
},
|
|
533
|
-
"totalOutCFilter": { "relation": "0", "filts": [] }
|
|
534
|
-
}
|
|
63
|
+
## Audience size estimate
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
ae-cli engage-scene strategy predict --project-id <project_id> \
|
|
67
|
+
--definition-request '{"type":"condition","conditions":{...}}' \
|
|
68
|
+
--zone-offset 8 \
|
|
69
|
+
[--strategy-uuid <uuid>]
|
|
535
70
|
```
|
|
536
71
|
|
|
537
|
-
|
|
72
|
+
Prediction and save use the same semantic compiler. Reuse the exact semantic definition between them.
|
|
538
73
|
|
|
539
|
-
##
|
|
74
|
+
## Read behavior
|
|
540
75
|
|
|
541
|
-
|
|
76
|
+
`strategy get` hides the stored execution QP and returns:
|
|
542
77
|
|
|
543
78
|
```json
|
|
544
79
|
{
|
|
545
|
-
"
|
|
546
|
-
"
|
|
547
|
-
"
|
|
548
|
-
{
|
|
549
|
-
"relation": "1",
|
|
550
|
-
"filts": [
|
|
551
|
-
{
|
|
552
|
-
"conditionType": "user",
|
|
553
|
-
"userCondition": {
|
|
554
|
-
"calcuSymbol": "C00",
|
|
555
|
-
"columnName": "country",
|
|
556
|
-
"columnDesc": "country",
|
|
557
|
-
"columnType": "string",
|
|
558
|
-
"selectType": "string",
|
|
559
|
-
"tableType": "1",
|
|
560
|
-
"ftv": ["中国"]
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
]
|
|
564
|
-
}
|
|
565
|
-
]
|
|
80
|
+
"definition_request": {
|
|
81
|
+
"type": "condition",
|
|
82
|
+
"conditions": {}
|
|
566
83
|
},
|
|
567
|
-
"
|
|
84
|
+
"definition_status": "AVAILABLE"
|
|
568
85
|
}
|
|
569
86
|
```
|
|
570
87
|
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
## Common pitfalls
|
|
574
|
-
|
|
575
|
-
| Mistake | Why it fails |
|
|
576
|
-
|---|---|
|
|
577
|
-
| Put `conditionType:"event"` inside 用户满足 `COMPOUND` | UI/backend expect events only in `filts[1]`; structure breaks in editor |
|
|
578
|
-
| Only one top-level `filts` block when both user + event exist | `formatTriggerConditionFromQp` mis-parses user vs event |
|
|
579
|
-
| Guess `columnName` from Chinese description | Property may not exist; must preflight and list available props |
|
|
580
|
-
| Drop missing condition and continue | Violates mandatory stop; audience silently wrong |
|
|
581
|
-
| `A200` empty quota with `uceCalcuSymbol` other than `C030`/`C03` rules | Backend `invalid_preset_count_expression` |
|
|
582
|
-
| Invent enum values (`"Apple"` vs `"苹果"`) | Filter never matches real data |
|
|
583
|
-
|
|
584
|
-
---
|
|
585
|
-
|
|
586
|
-
## Existing cluster reference (exception path)
|
|
587
|
-
|
|
588
|
-
When the user supplies an existing `cluster_name`:
|
|
589
|
-
|
|
590
|
-
```json
|
|
591
|
-
"targetClusterQp": "{\"totalCFilter\":{\"relation\":\"1\",\"filts\":[{\"relation\":\"1\",\"filts\":[{\"conditionType\":\"cluster\",\"clusterCondition\":{\"calcuSymbol\":\"C20\",\"columnName\":\"<existing_cluster_name>\",\"columnDesc\":\"<existing_cluster_name>\",\"columnType\":\"boolean\",\"selectType\":\"bool-s\",\"tableType\":\"2\",\"subTableType\":\"cluster_by_result\",\"specifiedClusterDate\":\"<YYYY-MM-DD>\",\"ftv\":[]}}]}]}}"
|
|
592
|
-
```
|
|
593
|
-
|
|
594
|
-
Discover names: `ae-cli analysis user-cluster list --project-id <pid>`.
|
|
595
|
-
|
|
596
|
-
---
|
|
597
|
-
|
|
598
|
-
## Webhook constraints
|
|
599
|
-
|
|
600
|
-
- **Cannot** set both `envConfig` and `targetClusterType` on Webhook channels.
|
|
601
|
-
- Must set one of: user audience (`targetClusterType`) or environment audience (`envConfig`).
|
|
602
|
-
- Client channel may combine `envConfig` + user audience.
|
|
603
|
-
|
|
604
|
-
---
|
|
605
|
-
|
|
606
|
-
## Related surfaces (different rules)
|
|
607
|
-
|
|
608
|
-
| Surface | Default audience path |
|
|
609
|
-
|---|---|
|
|
610
|
-
| **Config strategy** (this doc) | Direct `targetClusterQp`; **no** new `user-cluster create` unless user asks for existing cluster |
|
|
611
|
-
| Task `save` | [`save-task.md`](save-task.md) |
|
|
612
|
-
| Flow `save` | [`save-flow.md`](save-flow.md) |
|
|
613
|
-
| Activity topic | [`activity-topic.md`](activity-topic.md) |
|
|
614
|
-
|
|
615
|
-
For reusable Analysis clusters, use ae-analysis [`user_cluster_create.md`](../../ae-analysis/references/user_cluster_create.md).
|
|
616
|
-
|
|
617
|
-
---
|
|
618
|
-
|
|
619
|
-
## Audience size estimate (预估人数)
|
|
620
|
-
|
|
621
|
-
**UI:** 策略编辑 → 目标受众 → **重新预估**
|
|
622
|
-
**Backend:** `POST /v1/hermes/config/strategy/predictEntityCount?projectId=<pid>`
|
|
623
|
-
|
|
624
|
-
Request body (`ConfigClusterPredictEntityReqDTO`):
|
|
625
|
-
|
|
626
|
-
| Field | Required | Notes |
|
|
627
|
-
|---|---|---|
|
|
628
|
-
| `requestId` | Yes | Client-generated UUID (UI uses `getUuid()`) |
|
|
629
|
-
| `zoneOffset` | Yes | Strategy timezone, e.g. `8.0` |
|
|
630
|
-
| `qp` | Yes | **`targetClusterQp` string** (mix QP JSON string, same as saved on strategy) |
|
|
631
|
-
| `strategyUuid` | No | Pass when refreshing an existing strategy; server persists `clusterUserNum` on strategy |
|
|
632
|
-
|
|
633
|
-
Response (`ConfigClusterPredictEntityResDTO`):
|
|
634
|
-
|
|
635
|
-
- `predictNumList[0].entityNum` — estimated user count
|
|
636
|
-
- `predictNumList[0].realAvailable` — whether count is within realtime/scheduled limits
|
|
637
|
-
- `refreshTime` — estimate timestamp
|
|
638
|
-
|
|
639
|
-
The UI formats the saved QP with `formatTriggerConditionForBack` before sending; when calling the API directly, pass the **same mix QP string** already stored in `targetClusterQp` (the backend shape in examples A/B/C above).
|
|
640
|
-
|
|
641
|
-
### CLI
|
|
642
|
-
|
|
643
|
-
```bash
|
|
644
|
-
ae-cli engage-scene strategy predict \
|
|
645
|
-
--project-id <pid> \
|
|
646
|
-
--qp '<targetClusterQp mix QP string>' \
|
|
647
|
-
--zone-offset 8 \
|
|
648
|
-
--strategy-uuid <optional_strategy_uuid>
|
|
649
|
-
```
|
|
650
|
-
|
|
651
|
-
- `--qp`: same mix QP JSON string stored in `targetClusterQp` (see examples A/B/C above).
|
|
652
|
-
- `--zone-offset`: strategy timezone (match `tzOffset` on the strategy).
|
|
653
|
-
- `--strategy-uuid`: optional; when set, server persists `clusterUserNum` on the strategy (same as UI re-estimate on a saved draft).
|
|
654
|
-
- `--request-id`: optional; auto-generated when omitted.
|
|
655
|
-
|
|
656
|
-
Response: `data.entity_num` (count), `data.real_available`, `data.predict_num_list`, `data.refresh_time`.
|
|
657
|
-
|
|
658
|
-
Example using an existing strategy's saved QP:
|
|
659
|
-
|
|
660
|
-
```bash
|
|
661
|
-
QP=$(ae-cli engage-scene strategy get --project-id 1 --config-id yx_0723_01 \
|
|
662
|
-
--strategy-uuid 4028f0716dfe0b3e5f992f82e19c3e74 \
|
|
663
|
-
--jq '.data.item.target_cluster_qp')
|
|
664
|
-
|
|
665
|
-
ae-cli engage-scene strategy predict \
|
|
666
|
-
--project-id 1 \
|
|
667
|
-
--qp "$QP" \
|
|
668
|
-
--zone-offset 8 \
|
|
669
|
-
--strategy-uuid 4028f0716dfe0b3e5f992f82e19c3e74
|
|
670
|
-
```
|
|
671
|
-
|
|
672
|
-
Capability id: `engage-scene.strategy.predict` (gateway → `HermesConfigStrategyService.predictEntity`).
|
|
673
|
-
|
|
674
|
-
### UI alternative
|
|
675
|
-
|
|
676
|
-
**UI:** 策略编辑 → 目标受众 → **重新预估** (same backend endpoint).
|
|
677
|
-
|
|
678
|
-
After UI or CLI predict with `--strategy-uuid`, `strategy get` returns `cluster_user_num` / `cluster_user_refresh_time`.
|
|
679
|
-
|
|
680
|
-
Do **not** guess counts from QP semantics alone — always run predict or read a prior `cluster_user_num`.
|
|
88
|
+
For unsupported historical data, `definition_request` is absent, `definition_status` is `UNAVAILABLE`, and `definition_unavailable_reason` contains a stable reason. Raw legacy QP is not returned.
|