name: tencentads-delivery-smart-create description: "專用於建立智投(AIM+)營銷單元(原廣告組)的 SDK 化技能。當用戶意圖涉及智投、AIM+、艾米、智慧投放、自動投放、小店智投、smart delivery 的建立場景時,使用本技能。覆蓋場景:小店艾米、商品艾米、線索艾米、內容艾米、APP艾米(遊戲/閱讀/AI應用)、小遊戲跑量、爆劇跑量、小說智投、全域通、影片號直播智投等。本技能通過專用指令碼(而非全域性 CLI 工具)呼叫 API,指令碼已處理複雜分支、欄位過濾和資料轉換。" license: MIT. See LICENSE for full terms. compatibility: any metadata: author: Tencent Ads Delivery Team version: "0.5.7" icon: megaphone category: tencent-ads
前置依賴:執行指令碼前需安裝 CLI —
npm install tencentads-cli@1.0.0(需要 Node.js ≥ 20)
本技能是智投廣告的執行指南——按 7 個步驟順序完成一條智投廣告的建立。嚴格按步驟順序執行,後面的步驟依賴前面的輸出,不可跳步。
所有 API 呼叫均通過本技能的專用指令碼執行,指令碼負責:API 分支路由、返回資料裁剪、格式轉換(rules_json 解析、geo 編碼查詢等)。Agent 專注於:從指令碼返回結果中做出業務決策(選哪個組合、選哪個轉化目標)。
指令碼呼叫格式統一:
node scripts/<指令碼名>.mjs '<JSON 引數>'執行指令碼時先進入本 skill 根目錄,再按相對scripts/路徑呼叫。
指令碼呼叫格式為 node scripts/<指令碼名>.mjs '<JSON引數>',但 JSON 引數的引號包裹方式因作業系統/終端而異,傳遞不當會導致 JSON.parse 報錯(如 Expected property name or '}' in JSON at position 1)。
| 終端環境 | 正確寫法 | 說明 |
|---|---|---|
| Linux / macOS (Bash/Zsh) | node scripts/xxx.mjs '{"key":"value"}' |
✅ 單引號包裹,內部雙引號原樣保留 |
| Windows Git Bash | node scripts/xxx.mjs '{"key":"value"}' |
✅ 同 Bash |
| Windows CMD | node scripts/xxx.mjs "{\"key\":\"value\"}" |
✅ 雙引號包裹 + 反斜槓轉義 |
| Windows CMD (備選) | node scripts/xxx.mjs "{""key"":""value""}" |
✅ 雙引號包裹 + 雙雙引號轉義 |
| Windows PowerShell 5.x | node --% scripts/xxx.mjs "{\"key\":\"value\"}" |
✅ 必須加 --% 停止解析符 |
| Windows PowerShell 5.x (備選) | node scripts/xxx.mjs "{\`"key\`":\`"value\`"}" |
✅ 反斜槓 + 反引號組合轉義 |
⛔ PowerShell 5.x 是重災區:單引號
'...'、反引號`"、反斜槓\"三種常見寫法全部失敗(雙引號會被吞掉)。必須使用--%停止解析符或\`"組合轉義。 ⛔ Windows CMD 不支援單引號包裹字串,單引號會被當作普通字元傳入指令碼,導致 JSON 解析失敗。
⛔ 執行順序(不可跳步):
步驟1 → 步驟2 → 步驟3 → 步驟4 → 步驟5 → 步驟6 → 步驟7
確定 獲取 獲取 確定 獲取 配置 組裝請求體
智投場景 四元組 推廣產品 版位 轉化目標 定向+時段 → create-adgroup.mjs
+載體 +出價
若本節與下文"繼續執行""不要重複查詢"等表述衝突,以本節為準。
get-rules.mjs 確認四元組、呼叫 get-assets.mjs 獲取推廣資產 ID。原因:不同賬號的可選組合不同,自然語言描述無法直接轉為精確的列舉值和 ID。步驟 4-6 中的查詢子動作在滿足"顯式證據白名單"時可跳過,但步驟 1-3 不可。conversion_id 的依據。tencent-ads api)嘗試繞過。寧可在最終請求中缺少某個欄位,也不要耗盡所有輪次。marketing_goal、marketing_sub_goal、marketing_target_type、marketing_carrier_type 這 4 個列舉值全部;或當前 session 已從 get-rules.mjs 返回中得到。get-assets.mjs 返回中得到。conversion_id;或當前 session 已從 get-conversions.mjs 返回中得到。get-targeting-lookup.mjs 查詢,其他列舉通過 get-enum-options.mjs 查詢。前置:使用者意圖 輸出:
smart_delivery_platform、delivery_scene(數值)
根據使用者意圖從下表匹配 smart_delivery_platform 列舉值。列舉統一字首 SMART_DELIVERY_PLATFORM_EDITION_(表中用 ... 省略)。
⚠️ 小店列舉名與中文業務名嚴重不一致:
SINGLE_PRODUCT= 短直雙開(不是"單品"),PRODUCT_OR_LIVE= 小店單鏈路(不是"品商直播合開")。
| 分類 | 場景名稱 | 列舉 key | value | 識別關鍵詞 |
|---|---|---|---|---|
| 小店(3000) | 短直雙開 | ..._WECHAT_STORE_SINGLE_PRODUCT |
3001 |
短直雙開、短影片+直播、雙鏈路 |
| 小店(3000) | 小店單鏈路智投 | ..._WECHAT_STORE_PRODUCT_OR_LIVE |
3002 |
單鏈路、小店單鏈路 |
| 小店(3000) | 全店託管智投 | ..._WECHAT_STORE_MANAGEMENT |
3003 |
全店託管、託管 |
| 小店(3000) | 推直播間 | ..._WECHAT_STORE_LIVE |
3004 |
推直播間、直播間引流 |
| 小店(3000) | 推商品 | ..._WECHAT_STORE_PRODUCT |
3005 |
推商品(僅指小店的"推商品"入口,不帶"智投"二字) |
| 生態(1000) | 爆劇跑量 | ..._ECOLOGY_PLAYLET |
1001 |
爆劇、短劇、微短劇 |
| 生態(1000) | 線索跑量 | ..._ECOLOGY_LEADS |
1002 |
線索艾米、線索跑量、表單 |
| 生態(1000) | 小遊戲跑量 | ..._MINI_GAME_PROMOTION |
1003 |
小遊戲 |
| 生態(1000) | 商品智投 | ..._DRUG_PRODUCT |
1018 |
商品艾米、商品智投、推商品智投、醫藥智投(注意:帶"智投"二字的"推商品智投"屬於此場景,不是小店的"推商品") |
| 生態(1000) | 小說智投 | ..._FICTION |
1019 |
小說、網文 |
| 全域通(4000) | 全域通-直播 | ..._QYT_LIVE |
4001 |
全域通+直播 |
| 全域通(4000) | 全域通-直購 | ..._QYT_WECHAT_STORE |
4002 |
全域通+直購/小店 |
| APP(6000) | 遊戲應用智投 | ..._GAME_APP |
6001 |
遊戲APP、遊戲應用 |
| APP(6000) | 閱讀應用智投 | ..._READING_APP |
6002 |
閱讀APP、閱讀應用 |
| APP(6000) | AI應用智投 | ..._AI_APP |
6003 |
AI應用、AI APP |
步驟 1 完成後你應該有:smart_delivery_platform 列舉值,以及同場景的數值 delivery_scene(即上表 value 列)。
欄位含義拆開記: -
smart_delivery_platform:字串列舉,如SMART_DELIVERY_PLATFORM_EDITION_MINI_GAME_PROMOTION-delivery_scene:數值 value,如1003- 調get-rules.mjs時,delivery_scene傳smart_delivery_platform字串列舉,不是數值1003- 調get-conversions.mjs等投放端內部介面時,再傳數值delivery_scene
前置:
account_id+ 步驟 1 的smart_delivery_platform輸出:marketing_goal、marketing_sub_goal、marketing_target_type、marketing_carrier_type
四元組是騰訊廣告的產品術語,指營銷內容 + 轉化/最佳化目標的完整匹配集合,共10個欄位:
- 營銷內容(4個):marketing_goal、marketing_sub_goal、marketing_carrier_type、marketing_target_type
- 轉化/最佳化目標(6個):optimization_goal、deep_behavior_optimization_goal、deep_behavior_advanced_goal、deep_worth_optimization_goal、deep_worth_advanced_goal、forward_link_assist
這10個欄位作為一個整體定義廣告的投放語義,必須從指令碼返回的可選範圍中選取,禁止通過推理猜測。
為什麼不能猜?
- 不同賬號准入的組合不同,猜錯會導致 adgroups/add 報錯
- 看似相同的場景(如"小遊戲推廣"),在不同賬號上對應的 marketing_goal 可能完全不同
- 四元組錯誤會級聯導致後續推廣產品、轉化目標等全部錯誤
呼叫方式:
node scripts/get-rules.mjs '{"account_id":"<ACCOUNT_ID>","delivery_scene":"<smart_delivery_platform列舉值>"}'
示例:
node scripts/get-rules.mjs '{"account_id":"123456789","delivery_scene":"SMART_DELIVERY_PLATFORM_EDITION_MINI_GAME_PROMOTION"}'
指令碼已處理:內部解析 rules_json 巢狀 JSON 字串,展開四層巢狀樹為扁平組合列表。
返回示例:
{
"combinations": [
{
"marketing_goal": "MARKETING_GOAL_APP_PROMOTED",
"marketing_sub_goal": "MARKETING_SUB_GOAL_APP_INSTALL",
"marketing_target_type": "MARKETING_TARGET_TYPE_WECHAT_MINI_GAME",
"marketing_carrier_type": "MARKETING_CARRIER_TYPE_MINI_PROGRAM"
}
]
}
Agent 需要做的決策:從 combinations 中確定唯一的一組四元組。
combinations 只有 1 條時,四元組已唯一確定,不需要任何選擇邏輯,直接取該條進入步驟 3。
combinations 有多條時,按以下優先順序從高到低逐層過濾,直到縮小為唯一一組。切忌亂猜四元組,一旦選錯後續推廣產品、轉化目標等全部級聯錯誤。
選擇規則(按優先順序):
觸發條件:使用者在 input 中明確給出了
推廣產品ID、產品ID、推廣資產ID、資產ID、應用ID、遊戲ID、APP ID、marketing_asset_id、product_id、marketing_asset_outer_id等資產標識。
資產 ID 能直接關聯到某個 marketing_target_type,因此可反推縮小四元組範圍。呼叫 get-assets-by-rules.mjs:
bash
node scripts/get-assets-by-rules.mjs '{"account_id":"<ACCOUNT_ID>","combinations":<get-rules返回的combinations陣列>}'
指令碼內部自動對 marketing_target_type 去重,每種只調一次 API,返回 asset_map(以 marketing_target_type 為 key)。返回結構與 get-assets.mjs 完全一致(含 flat_params、type 等欄位),可直接複用於步驟 3 的資產選擇:
json
{
"asset_map": {
"MARKETING_TARGET_TYPE_REAL_ESTATE": {
"asset_type": "INDUSTRY",
"assets": [
{
"marketing_asset_id": "342574",
"name": "京投發展森與天成",
"type": "REAL_ESTATE",
"flat_params": {
"asset_id": "342574"
}
}
]
},
"MARKETING_TARGET_TYPE_WECHAT_MINI_GAME": {
"asset_type": "ONEID",
"assets": [
{
"marketing_asset_outer_id": "wx123",
"marketing_carrier_id": "wx123",
"name": "某小遊戲",
"type": "WECHAT_MINI_GAME",
"flat_params": {
"asset_id": "wx123",
"carrier_id": "wx123",
"asset_name": "某小遊戲",
"carrier_name": "某小遊戲"
}
}
]
}
}
}
反推流程:
- 遍歷 asset_map 各 target_type 下的 assets,用 flat_params.asset_id 統一匹配使用者給出的資產 ID(無需區分 marketing_asset_id / marketing_asset_outer_id / product_outer_id,flat_params.asset_id 已歸一化)
- 找到 → 確定了該資產所屬的 marketing_target_type,在 combinations 中篩選含該 target_type 的組合。若縮小到唯一一組,四元組確定;若仍有多組(同一 target_type 對應多個 goal/carrier),繼續走後續規則。同時直接儲存該資產的 flat_params,步驟 3 選資產時無需再查
- 找不到 → 資產 ID 反推失敗,不代表使用者給的 ID 是錯的(例如小遊戲 ID 可能不在 API 返回的列表中),跳過此規則,繼續按後續規則選擇
marketing_carrier_type 應含 WECHAT_CHANNELS_LIVEmarketing_target_type 應含 WECHAT_MINI_GAMEmarketing_target_type 應含 MINI_PROGRAM_WECHATmarketing_target_type 應含 WECHAT_STORE_PRODUCTmarketing_carrier_type 應含 JUMP_PAGE使用者提到了"APP"/"應用" → marketing_carrier_type 應含 APP_ANDROID 或 APP_IOS
按 marketing_goal 匹配使用者的營銷目標:
MARKETING_GOAL_PRODUCT_SALESMARKETING_GOAL_USER_GROWTHMARKETING_GOAL_BRAND_PROMOTIONMARKETING_GOAL_INCREASE_FANS_INTERACTION使用者提到"留資"/"表單"/"線索" → MARKETING_GOAL_LEAD_RETENTION
短直雙開場景特殊規則:短直雙開(WECHAT_STORE_SINGLE_PRODUCT)有兩條鏈路(直播+短影片),只需建立一條廣告組。按照直播鏈路選擇四元組——即 marketing_carrier_type = MARKETING_CARRIER_TYPE_WECHAT_CHANNELS_LIVE、marketing_target_type = MARKETING_TARGET_TYPE_WECHAT_CHANNELS_LIVE。
若過濾後仍有多個組合 → 必須向用戶確認,禁止猜測。將剩餘的所有組合選項列出給使用者選擇。
marketing_sub_goal 只能複用 get-rules.mjs 返回值,禁止語義改寫:例如使用者說"註冊"、"新客"時,不要自造 MARKETING_SUB_GOAL_USER_REGISTER;必須原樣使用返回的列舉值。
智投強約束:
delivery_scene引數傳的是smart_delivery_platform字串列舉,不是數值。
步驟 2 完成後你應該有:四元組 4 個值(從 combinations 陣列的匹配項取)。
前置:步驟 2 的
marketing_target_type輸出:選定 asset 的flat_params(ONEID 類和影片號直播類已包含carrier_id;行業/商品庫類不含carrier_id,若carrier_type需要載體則需從使用者處獲取)
呼叫方式:
node scripts/get-assets.mjs '{"account_id":"<ACCOUNT_ID>","marketing_target_type":"<...>"}'
指令碼已處理:自動根據 marketing_target_type 判斷分類(ONEID / 商品庫 / 行業產品庫),路由到正確的 API,返回統一格式的資產列表。
返回示例:
{
"asset_type": "ONEID",
"assets": [
{
"marketing_asset_outer_id": "wx1234567890",
"marketing_carrier_id": "wx1234567890",
"name": "以閃亮之名",
"type": "WECHAT_MINI_GAME",
"flat_params": {
"asset_id": "wx1234567890",
"carrier_id": "wx1234567890",
"asset_name": "以閃亮之名",
"carrier_name": "以閃亮之名"
}
}
]
}
重要:如果步驟 2 中已通過
get-assets-by-rules.mjs獲取了asset_map,且當前marketing_target_type在 map 中已有結果,可複用該結果,無需再調get-assets.mjs。
Agent 需要做的決策:從返回的資產列表中確定使用者要使用的資產。
資產選擇規則(按優先順序):
marketing_asset_id、product_id、marketing_asset_outer_id 等):選定資產後,直接使用該 asset 的 flat_params 物件,在呼叫 create-adgroup.mjs 時將 flat_params 裡的 key-value 展開到請求體頂層即可。create-adgroup.mjs 會根據 marketing_target_type 自動組裝 API 所需的巢狀結構(marketing_asset_outer_spec / marketing_asset_id / marketing_carrier_detail)。
flat_params 各欄位含義(與 create-adgroup.mjs 方式一入參完全對齊,共 7 個):
| flat_params key | 含義 | 來源 |
|---|---|---|
asset_id |
推廣產品 ID | ONEID→outer_id / 行業→asset_id / 商品庫→catalog_id |
carrier_id |
載體 ID | ONEID 類和影片號直播類→自動填入(= outer_id,和 asset_id 同值);⚠️ 行業/商品庫類不含此欄位,若 carrier_type 需要載體則需從使用者處獲取後補入 |
catalog_id |
商品目錄 ID | 僅商品庫類 |
asset_sub_id |
子標識 | 商品庫→product_outer_id;直播預約→notice_id(需 Agent 從 live_notices 中選擇後補入) |
asset_name |
資產名稱 | ONEID 類自動填入 asset 的 name;create-adgroup.mjs 寫入 marketing_asset_outer_name(僅 APP_QUICK_APP / PC_GAME 生效) |
carrier_name |
載體名稱 | ONEID 類自動填入 asset 的 name;create-adgroup.mjs 寫入 marketing_carrier_name(僅 QUICK_APP / PC_GAME 載體型別生效,其他型別自動忽略) |
sub_carrier_id |
載體子標識 | 直播預約→notice_id(需 Agent 從 live_notices 中選擇後補入);create-adgroup.mjs 寫入 marketing_sub_carrier_id |
多傳無害:
asset_name、carrier_name在非 QUICK_APP / PC_GAME 型別時,create-adgroup.mjs內部會自動過濾掉,不會傳給 API。
示例——Agent 選定 asset 後傳給 create-adgroup.mjs 的引數:
{
"account_id": "123456789",
"adgroup_name": "...",
"marketing_target_type": "MARKETING_TARGET_TYPE_WECHAT_MINI_GAME",
"asset_id": "wx1234567890",
"carrier_id": "wx1234567890",
"asset_name": "以閃亮之名",
"carrier_name": "以閃亮之名",
"...其他欄位..."
}
上面的
asset_id、carrier_id、asset_name、carrier_name都是從assets[n].flat_params裡展開的。
不再需要手動組裝以下巢狀結構(create-adgroup.mjs 自動處理):
- ❌ 不需要手動構造 marketing_asset_outer_spec
- ❌ 不需要手動構造 marketing_carrier_detail
- ❌ 不需要手動設定 marketing_asset_id(行業類)
- ✅ 只需把 flat_params 展開透傳
product_id、marketing_asset_outer_id、catalog_id、product_outer_id、marketing_asset_id、marketing_carrier_id),則可直接使用並跳過查詢。marketing_asset_outer_spec 裡使用 marketing_asset_outer_id / marketing_asset_outer_sub_id,不要寫 outer_id / outer_sub_id。步驟 3 完成後你應該有:選定 asset 的 flat_params(包含 asset_id、carrier_id 等,將在步驟 7 展開透傳給 create-adgroup.mjs)。
前置:步驟 1 的
smart_delivery_platform+ 步驟 2 的四元組 輸出:site_set(陣列),僅供後續get-conversions.mjs使用
智投場景下版位固定為智慧版位(系統將智慧進行版位擇優投放),使用者不可選擇或修改。如果使用者提到了版位相關需求,應告知使用者:「智投場景下版位為系統智慧擇優投放,無需手動選擇」。
本步驟的唯一目的是獲取當前場景的 site_set 列表,供步驟 5 查詢轉化目標時使用。
node scripts/get-site-set.mjs '{"account_id":"<ACCOUNT_ID>","marketing_goal":"<MARKETING_GOAL_列舉key>","marketing_sub_goal":"<MARKETING_SUB_GOAL_列舉key>","marketing_target_type":"<MARKETING_TARGET_TYPE_列舉key>","marketing_carrier_type":"<MARKETING_CARRIER_TYPE_列舉key>"}'
返回:
{
"auto_site_set": ["SITE_SET_WECHAT", "SITE_SET_MOBILE_UNION"]
}
site_set 列表是動態的,不要手寫示例陣列get-conversions.mjs 必須使用此處返回的真實 site_set步驟 4 完成後你應該有:site_set 陣列(來自指令碼返回)。
前置:步驟 1 的
delivery_scene(數值)+ 步驟 2 的四元組 + 步驟 4 的site_set輸出:conversion_id、bid_amount、出價相關欄位
node scripts/get-conversions.mjs '{"account_id":"<ACCOUNT_ID>","delivery_scene":<數值>,"site_set":["..."],"marketing_goal":"<MARKETING_GOAL_列舉key>","marketing_sub_goal":"<MARKETING_SUB_GOAL_列舉key>","marketing_carrier_type":"<MARKETING_CARRIER_TYPE_列舉key>","marketing_target_type":"<MARKETING_TARGET_TYPE_列舉key>","create_source_type":"<CreateSourceType的列舉值,使用者未提及來源時不傳此引數>"}'
注意:
get-conversions.mjs的入參中,四元組欄位統一傳字串列舉 key(如"MARKETING_GOAL_USER_GROWTH"),指令碼內部自動轉為數值。不需要傳product_type、live_video_mode、live_video_sub_mode,指令碼會根據marketing_carrier_type+delivery_scene自動推導。delivery_scene傳步驟 1 的數值。特別注意
marketing_sub_goal:這裡傳的必須是步驟 2 選中的原始 key,不能因為使用者說了"註冊"、"下載"、"安裝",或轉化名稱裡帶這些詞,就改寫成MARKETING_SUB_GOAL_USER_REGISTER、MARKETING_SUB_GOAL_MINI_GAME_APP_INSTALL之類的自造列舉。
create_source_type:如果使用者指定了轉化來源,則根據使用者意圖傳入——PLATFORM平臺轉化或SELF_CREATED自建轉化等。使用者未提及來源時不傳此引數。
指令碼已處理:通過 access_status 過濾僅返回已完成接入的轉化目標,標註深度轉化型別,裁剪無關欄位。
返回示例:
{
"goals": [
{
"conversion_id": 12345,
"name": "小遊戲註冊",
"optimization_goal": "OPTIMIZATIONGOAL_APP_REGISTER",
"bid_mode": "BID_MODE_OCPM",
"has_deep_conversion": false,
"create_source_type": "PLATFORM"
},
{
"conversion_id": 12346,
"name": "註冊-七日變現ROI",
"optimization_goal": "OPTIMIZATIONGOAL_APP_REGISTER",
"bid_mode": "BID_MODE_OCPM",
"has_deep_conversion": true,
"deep_conversion_type": "DEEP_CONVERSION_WORTH",
"deep_conversion_worth_goal": "OPTIMIZATIONGOAL_MONETIZATION_ROAS_7DAY",
"create_source_type": "SELF_CREATED"
}
]
}
Agent 需要做的決策——conversion_id 選擇規則:
has_deep_conversion=true 的轉化IDSELF_CREATED,"平臺預置"/"平臺轉化"/"平臺上報"/"系統預置"/"預置轉化"→ PLATFORM)→ 在呼叫 get-conversions.mjs 時傳入 create_source_type 過濾;使用者未提及來源時不傳此引數強約束:
- conversion_id 只能來自:使用者明確給出的 ID,或 get-conversions.mjs 返回
- 白名單例外:使用者在原始需求中已明確給出 conversion_id 數值 ID,則直接使用
- conversion_id: 0 視為錯誤佔位,不可提交
- 若使用者未明確給出且也沒有成功查詢到,不要編造 0、空字串或佔位值
| 欄位 | 型別 | 必填 | 說明 | 如何獲取 |
|---|---|---|---|---|
conversion_id |
integer | 是 | 轉化ID(放在請求體頂層) | 5A 獲取 |
bid_amount |
integer | 是 | 出價(單位:分,頂層) | 使用者提供,"出價42元" → 4200 |
bid_mode |
enum | 否 | 出價方式 | 智投預設 BID_MODE_OCPM |
smart_bid_type |
enum | 否 | 出價型別 | SMART_BID_TYPE_CUSTOM(手動)或 SMART_BID_TYPE_SYSTEMATIC(自動) |
smart_cost_cap |
integer | 否 | 自動出價成本上限(分) | 使用者提供 |
daily_budget |
integer | 否 | 日預算(分,5000~400000000) | 使用者提供,"日預算1000元" → 100000 |
deep_conversion_worth_rate |
float | 否 | 深度ROI(對應 DEEP_CONVERSION_WORTH) |
使用者說"深度ROI 1.5" → 1.5 |
deep_conversion_worth_advanced_rate |
float | 否 | 深度輔助ROI(對應 DEEP_CONVERSION_WORTH_ADVANCED) |
使用者說"深度輔助ROI 1.812" → 1.812 |
deep_conversion_behavior_bid |
integer | 否 | 深度最佳化行為出價(分) | 使用者提供 |
bid_scene |
enum | 場景依賴 | 出價場景 | 小遊戲跑量傳 BID_SCENE_NORMAL_AVERAGE;其他不傳 |
智投出價核心規則:
1. conversion_id 和 bid_amount 放在請求體頂層
2. 不需要傳 optimization_goal — 智投的最佳化目標隱含在 conversion_id 中
3. 金額單位是分(10000分 = 100元)
4. deep_conversion_worth_rate 和 deep_conversion_worth_advanced_rate 是兩個不同欄位,支援3位小數
步驟 5 完成後你應該有:conversion_id(頂層,非 0,非空)、bid_amount、出價相關可選欄位。
前置:使用者意圖中的定向需求 輸出:
targeting、begin_date、end_date、delivery_time_ranges
targeting 傳空物件 {},跳過以下所有定向步驟,直接進入 6Btargeting⚠️
smart_targeting_mode是請求體頂層欄位(不在targeting物件內),控制定向方式——AI 自動探索還是人工圈選。與targeting內的定向內容欄位(地域/年齡/性別等)是不同層級的概念。
"smart_targeting_mode": "SMART_TARGETING_MANUAL""smart_targeting_mode": "SMART_TARGETING_AUTO"不同智投場景支援的定向維度不同。如果傳入了當前場景不支援的定向欄位,建立時會報錯並列出不支援的欄位。收到此報錯後,告知使用者輸入合適的定向。
智投廣告支援完整定向能力,包括地域、年齡、性別、作業系統、學歷、裝置價格、微信廣告行為等多維度定向。
定向查詢觸發規則(命中任一項就必須先呼叫 get-targeting-lookup.mjs):
- 使用者給了地域、省市區、常駐地 → type: "geo"
- 使用者給了裝置品牌 / 型號 → type: "device"
不需要呼叫 get-targeting-lookup.mjs 的定向維度(指令碼自動匹配列舉):
- 性別:直接用 ["MALE"] / ["FEMALE"] / 不傳
- 年齡:直接用 [{"min":25,"max":29}, {"min":30,"max":39}] 格式的陣列。min 和 max 均為閉區間(包含邊界值),即使用者說"25~29歲"→ {"min":25,"max":29},不是 {"min":25,"max":30}。每個區間對應使用者給出的一段年齡範圍,如果使用者說了多個不同年齡段區間,就按照多個區間構造,不要合併連續段
- 排除已轉化:通過 get-enum-options.mjs '{"fields":["excluded_dimension","excluded_day"]}' 查詢列舉後構造
- 作業系統(user_os):通過 get-enum-options.mjs '{"fields":["user_os"]}' 查詢列舉值後構造(支援系統+版本號, 傳 ["IOS"] / ["ANDROID"](全版本),或用簡化格式如 ["ANDROID_10+"] 表示 Android 10 及以上
- 排除作業系統(excluded_os):通過 get-enum-options.mjs '{"fields":["excluded_os"]}' 查詢列舉後構造,同 user_os 的簡化格式,也支援 WINDOWS、HARMONY 等直接列舉
- 聯網方式(network_type):通過 get-enum-options.mjs '{"fields":["network_type"]}' 查詢列舉後構造,傳使用者提到的聯網方式即可,如 ["WIFI"]、["4G"]、["5G"],指令碼自動匹配為 API 列舉(如 4G → NET_4G)
- 學歷(education):通過 get-enum-options.mjs '{"fields":["education"]}' 查詢列舉後構造,傳中文即可,如 ["本科", "碩士"],指令碼自動匹配為 API 列舉(如 本科 → BACHELOR)
- 裝置價格(device_price):通過 get-enum-options.mjs '{"fields":["device_price"]}' 查詢列舉後構造,傳簡化描述即可,如 ["2500以上"]、["1500-3500"],指令碼自動展開為對應的價格區間列舉
- 微信廣告行為(wechat_ad_behavior):通過 get-enum-options.mjs '{"fields":["wechat_ad_behavior_actions"]}' 查詢列舉後構造,傳中文即可,如 {"actions": ["註冊過小遊戲"], "mini_game_wechat_registered_activity": "30天未活躍"},指令碼自動匹配為 API 列舉
- 微信廣告行為排除:通過 get-enum-options.mjs '{"fields":["wechat_ad_behavior_excluded_actions"]}' 查詢列舉後構造
- 其他列舉定向(婚戀狀態/遊戲消費能力/應用安裝狀態等):均通過 get-enum-options.mjs 查詢
⚠️
get-targeting-lookup.mjs只支援type: "geo"和type: "device"兩種查詢,不支援 age、gender 等。年齡和性別不需要編碼查詢,直接用結構化值。
只有在以下情況才可跳過定向查詢:使用者完全沒有給任何地域或裝置定向約束。
小蔥技能7w4.net有完整的技能分類。
地域編碼查詢:
node scripts/get-targeting-lookup.mjs '{"type":"geo","keyword":"廣東"}'
# 支援批次:keyword 用空格分隔
node scripts/get-targeting-lookup.mjs '{"type":"geo","keyword":"北京 上海 廣東"}'
⚠️ 地域查詢效率規則(P0 級,違反會導致輪次耗盡被終止): 1. 一次查完所有地域:指令碼是本地檔案查詢,無數量限制。把使用者給的所有城市名用空格拼接到一個 keyword 裡一次呼叫即可,不要分批,不要逐個查詢。即使 100+ 個城市也只需 1 次呼叫。 2. 省級優先原則:如果使用者說"北京"、"廣東"等省級地域,直接用省名查詢,會返回省級編碼(如 110000)。不要拆解為區級編碼,除非使用者明確列舉了具體的區/市。 3. 不加行政區字首:直接用城市名(如
"南寧 成都 杭州"),不要加"廣西南寧"、"四川成都"等字首。 4. 重名消歧:如果查詢結果中有重名地域(如"朝陽區"同時返回北京和長春的),根據使用者上下文和parent欄位篩選正確的。
地域排除(使用者表達"排除某省/不投某省/除 X 外全國投放"):
調 get-geo-exclude.mjs,直接返回排除後剩餘省份的編碼,取 id 組成 regions 陣列:
node scripts/get-geo-exclude.mjs '{"exclude":"河北"}'
# → {"results":[{"id":110000,"name":"北京市","level":"province"},{"id":120000,"name":"天津市","level":"province"},...]}
裝置品牌型號 ID 查詢:
node scripts/get-targeting-lookup.mjs '{"type":"device","keyword":"華為"}'
地域輸出示例:
{
"results": [
{"id": 440000, "name": "廣東省", "level": "province", "city_level": 4}
]
}
裝置輸出示例:
{
"results": [
{"id": 10001, "name": "華為 Mate 60"},
{"id": 10002, "name": "華為 P60"}
]
}
智投支援的完整定向維度(以下欄位均放在 targeting: { ... } 物件內,不要放到請求體頂層):
| 定向維度 | targeting 內的欄位 |
說明 | 獲取方式 |
|---|---|---|---|
| 地域 | geo_location.regions + geo_location.location_types |
regions 是純整數陣列(如 [440000]),取地域查詢返回的 id 值;location_types 常用 LIVE_IN。geo_location 只傳本表列出的子欄位,不要自行推測新增欄位 |
✅ get-targeting-lookup.mjs type:geo + 列舉查詢 location_types |
| 商圈 | geo_location.business_districts |
商圈 ID 陣列(integer[]) | 使用者提供商圈 ID |
| 自定義位置 | geo_location.custom_locations |
經緯度+半徑定向,格式: [{"longitude":113.26,"latitude":23.13,"radius":3000}],radius 單位米 |
使用者提供 |
| 性別 | gender |
列舉查詢 | ❌ 查列舉後直接構造 |
| 年齡 | age |
陣列格式: [{"min":25,"max":29}, {"min":30,"max":39}](min/max 均為閉區間,按使用者原始區間構造,不要合併連續段) |
❌ 直接構造(無列舉) |
| 作業系統 | user_os |
支援系統+版本號(如 IOS_VERSION_18),列舉查詢 |
❌ 查列舉後直接構造 |
| 排除作業系統 | excluded_os |
列舉查詢 | ❌ 查列舉後直接構造 |
| 學歷 | education |
列舉查詢,傳中文(如 ["本科", "碩士"])或列舉 key 均可,指令碼自動匹配 |
❌ 查列舉後直接構造 |
| 婚戀狀態 | marital_status |
列舉查詢 | ❌ 查列舉後直接構造 |
| 聯網方式 | network_type |
列舉查詢 | ❌ 查列舉後直接構造 |
| 裝置價格 | device_price |
列舉查詢,傳簡化描述(如 ["2500以上"]、["1500-3500"])或列舉 key 均可,指令碼自動展開 |
❌ 查列舉後直接構造 |
| 裝置品牌型號 | device_brand_model |
巢狀結構:{"included_list":[5,9]} 定向 / {"excluded_list":[1]} 排除,數字 ID |
✅ get-targeting-lookup.mjs type:device |
| 應用安裝狀態 | app_install_status |
列舉查詢(僅推廣 APP 時可用) | ❌ 查列舉後直接構造 |
| 自定義人群 | custom_audience |
人群包 ID 列表 | 使用者提供 |
| 排除人群 | excluded_custom_audience |
排除的人群包 ID | 使用者提供 |
| 排除已轉化 | excluded_converted_audience |
見下方格式說明 | ❌ 查列舉後直接構造 |
| 微信廣告行為 | wechat_ad_behavior |
見下方格式說明 | ❌ 查列舉後直接構造 |
⛔ 所有列舉值禁止憑記憶猜測,必須通過 get-enum-options.mjs 查詢確認:
# 查詢單個/多個欄位的列舉
node scripts/get-enum-options.mjs '{"fields":["education","device_price","excluded_dimension"]}'
# 查詢定向相關的所有列舉
node scripts/get-enum-options.mjs '{"category":"targeting"}'
可查詢的定向列舉欄位包括:gender、education、user_os、excluded_os、network_type、device_price、marital_status、app_install_status、location_types、excluded_dimension、excluded_day、wechat_ad_behavior_actions、wechat_ad_behavior_excluded_actions、smart_targeting_mode。
⚠️ 智投場景下,出價方式(
bid_mode)固定為BID_MODE_OCPM,轉化目標從get-conversions.mjs返回獲取,版位策略固定為自動版位 —— 這些欄位不需要通過get-enum-options.mjs查詢。get-enum-options.mjs在智投中僅用於定向列舉查詢。
excluded_converted_audience 格式(僅在使用者明確提到"排除已轉化"時才新增,禁止自行新增):
{
"excluded_dimension": "<通過 get-enum-options.mjs 查 excluded_dimension>",
"excluded_day": "<通過 get-enum-options.mjs 查 excluded_day>"
}
wechat_ad_behavior 格式(僅在使用者明確提到微信廣告行為排除時才新增,禁止自行新增):
使用者說"排除已關注公眾號的使用者"、"排除已註冊小遊戲的使用者"等時,構造此欄位。excluded_actions 的列舉通過 get-enum-options.mjs '{"fields":["wechat_ad_behavior_excluded_actions"]}' 查詢。
"wechat_ad_behavior": {
"excluded_actions": ["GDT_WECHAT_OFFICIAL_ACCOUNT_FOLLOWED"],
"wechat_official_account_id": ["wx18c408376c727a19"]
}
wechat_official_account_id(使用者給的公眾號 ID)corp_id強約束:
- 命中觸發規則後,必須先呼叫 get-targeting-lookup.mjs 獲取編碼,再構造 targeting
- 不要把自然語言直接翻成粗粒度佔位值
- targeting 及其子結構只傳上方表格中列出的欄位和子欄位,不要自行推測或類推新增文件中未出現的欄位
- ⛔ 所有列舉值禁止憑記憶猜測,必須通過 get-enum-options.mjs 查詢確認
targeting 構造示例:
{
"bid_amount": 5000,
"targeting": {
"age": [{"min": 25, "max": 29}, {"min": 30, "max": 39}],
"gender": ["MALE"],
"geo_location": {
"regions": [440000, 310000],
"location_types": ["LIVE_IN"]
}
}
}
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
begin_date |
string | 是 | 開始日期,格式 YYYY-MM-DD |
end_date |
string | 是 | 結束日期,格式 YYYY-MM-DD;未指定傳 ""(長期投放) |
first_day_begin_time |
string | 否 | 首日開始時間,格式 HH:ii:ss |
delivery_time_ranges |
string[] | 是 | 投放時段陣列,半小時精度。 |
configured_status |
enum | 否 | 廣告狀態,預設暫停(AD_STATUS_SUSPEND);使用者明確要求上線時傳 AD_STATUS_NORMAL |
delivery_time_ranges 格式說明:
陣列中每條格式為:全時段/全天投放/未設定:"all";指定時段: "<Weekday> <HH:MM>~<HH:MM>",時間精度為半小時(只支援 :00 或 :30);
示例:["all"]=全時段;["Monday 09:00~18:00",...,"Sunday 09:00~18:00"]=每天9點到18點(支援 Monday-Sunday )
// 全時段(使用者未指定投放時段)
"delivery_time_ranges": ["all"]
// 週二全天
"delivery_time_ranges": ["Tuesday 00:00~24:00"]
// 週一上午9點到12點,週二下午14點到18點
"delivery_time_ranges": ["Monday 09:00~12:00","Tuesday 14:00~18:00"]
// 週二全天
"delivery_time_ranges": ["Tuesday 00:00~24:00"]
時間精度規則:
- 時間只能是整點 :00 或半點 :30
- ⚠️ 如果使用者說的時間不是整半小時(如 "10:00~10:15"),需要向用戶確認:精度只支援半小時,可以選擇 "10:00~10:30"(多了 15 分鐘),請使用者確認或調整
- ⚠️ end 邊界規則:當用戶說 "23:59"、"24:00"、"午夜" 或"投到當天結束"時,一律用 24:00 作為結束時間
- 星期名支援全稱(Monday-Sunday)
Agent 需要做的:從使用者自然語言中理解投放時段意圖,轉為 delivery_time_ranges 陣列。常見自然語言對映:
- "全天投放" / 未指定 → ["all"]
- "工作日" → Monday 到 Friday
- "週末" → Saturday + Sunday
- "每天 X 到 Y" → 7 天都寫上相同時段
- "某天" → 如果使用者沒有表達時間段預設 00:00~24:00,例如某天是星期二:Tuesday 00:00~24:00
- "排除週三下午" → 列出除週三下午外的所有時段
步驟 6 完成後你應該有:targeting(如需)、begin_date、end_date、delivery_time_ranges。
前置:步驟 1-6 的所有輸出 動作:按檢查清單組裝完整請求體,呼叫
create-adgroup.mjs
| 欄位 | 值 | 說明 |
|---|---|---|
automatic_site_enabled |
true |
指令碼自動設定,無需傳入 |
site_set |
不傳 | 智慧版位,系統自動擇優 |
exploration_strategy |
推薦 AUTOMATIC_EXPLORATION |
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
smart_delivery_platform |
enum | 是 | 步驟 1 確定的智投場景標識 |
smart_delivery_aigc_creative |
struct | 推薦必傳 | AIGC自動創意,使用者未提及預設關閉 |
smart_delivery_history_comp_reused_creative |
struct | 推薦必傳 | 元件全庫智選,使用者未提及預設關閉 |
auto_derived_creative_enabled |
boolean | 推薦傳 | 自動衍生影片創意,推薦 true |
smart_delivery_period_switch |
enum | 否 | 週期達成開關,PERIOD_SWITCH_ON / PERIOD_SWITCH_OFF。僅使用者明確要求"週期達成"/"週期穩投"時傳入 |
smart_delivery_period_days |
enum | 週期達成時必填 | 週期天數,支援 PERIOD_DAYS_THREE(3天) / PERIOD_DAYS_SEVEN(7天) |
smart_delivery_period_budget |
integer | 週期達成時必填 | 週期總預算(單位:分),約束:≥ 3 × 出價 × 週期天數 |
smart_delivery_period_continue |
enum | 週期達成時必填 | 續投開關,PERIOD_CONTINUE_SWITCH_ON(長期自動續投)/ PERIOD_CONTINUE_SWITCH_OFF(單週期結束即停) |
short_play_pay_type |
enum | 爆劇跑量場景可選 | 短劇售賣方式型別,詳見 references/short-play-pay-type.md |
sell_strategy_id |
integer | 條件必填 | 售賣策略 ID,short_play_pay_type 為收費劇時必填 |
smart_delivery_aigc_creative(AIGC自動創意):
// 關閉
{"is_open": false, "supply_strategy_type": ["SUPPLY_STRATEGY_TYPE_AIGC"]}
// 開啟
{"is_open": true, "supply_strategy_type": ["SUPPLY_STRATEGY_TYPE_AIGC"]}
smart_delivery_history_comp_reused_creative(全庫智選):
// 關閉
{"is_open": false, "supply_strategy_type": ["SUPPLY_STRATEGY_TYPE_HISTORY_COMP_REUSE"]}
// 開啟
{"is_open": true, "supply_strategy_type": ["SUPPLY_STRATEGY_TYPE_HISTORY_COMP_REUSE"]}
⚠️ 廢棄欄位:不要使用
smart_delivery_scene_spec、smart_delivery_auto_creative、aigc_creative_switch。
當 smart_delivery_platform = SMART_DELIVERY_PLATFORM_EDITION_ECOLOGY_PLAYLET(爆劇跑量)時,支援設定短劇售賣方式和場景規格。指令碼自動校驗:收費劇必須提供售賣策略 ID。
short_play_pay_type:SHORT_PLAY_PAY_TYPE_FREE_PLAY(免費劇)/ SHORT_PLAY_PAY_TYPE_CHARGE_PLAY(收費劇)sell_strategy_id:收費劇時必填,免費劇不需要列舉值、校驗規則、請求體示例詳見 references/short-play-pay-type.md
週期達成(Period Completion):
完整欄位定義、約束規則和 JSON 示例見 references/smart-delivery-period.md(可通過 load_skill_reference 載入)。以下是關鍵要點:
smart_delivery_period_switch=PERIOD_SWITCH_ON + smart_delivery_period_days + smart_delivery_period_budget + smart_delivery_period_continuesmart_delivery_period_budget ≥ 3 × bid_amount × 週期天數daily_budget、total_budget;end_date 由指令碼統一設為 "",後端根據 begin_date + 週期天數自動計算實際結束日期smart_bid_type 不能為 SMART_BID_TYPE_SYSTEMATIC)SMART_DELIVERY_PLATFORM_EDITION_ECOLOGY_LEADS)以下兩條規則由 create-adgroup.mjs 自動校驗,不滿足時會報錯攔截。Agent 必須在組裝請求體時主動滿足這些規則,避免被指令碼攔截。
規則 A:影片號直播場景必填 sku_id + catalog_id
| 觸發條件 | 說明 |
|---|---|
smart_delivery_platform = 3002(小店單鏈路)或 3004(推直播間) |
投放場景 |
marketing_target_type = MARKETING_TARGET_TYPE_WECHAT_CHANNELS_LIVE |
推廣產品型別為影片號直播 |
marketing_carrier_type = MARKETING_CARRIER_TYPE_WECHAT_CHANNELS_LIVE |
載體為影片號直播 |
三個條件同時滿足時,smart_delivery_aigc_creative為開啟狀態時,必須額外包含:
- sku_id(string)— 商品 SKU ID
- catalog_id(integer)— 商品目錄 ID
這兩個值需要從使用者處獲取。如果使用者未提供,必須向用戶詢問,不可省略。
// 影片號直播場景 AIGC 創意(開啟 + sku_id + catalog_id)
{
"smart_delivery_aigc_creative": {
"is_open": true,
"supply_strategy_type": ["SUPPLY_STRATEGY_TYPE_AIGC"],
"sku_id": "10000299440478",
"catalog_id": 1023958
}
}
規則 B:非影片號直播場景必填品牌形象
| 觸發條件 | 說明 |
|---|---|
smart_delivery_platform = 3002(小店單鏈路)或 3003(全店託管)或 3005(推商品) |
投放場景 |
marketing_target_type ≠ MARKETING_TARGET_TYPE_WECHAT_CHANNELS_LIVE |
推廣產品型別不是影片號直播 |
marketing_carrier_type ≠ MARKETING_CARRIER_TYPE_WECHAT_CHANNELS_LIVE |
載體不是影片號直播 |
三個條件同時滿足時,smart_delivery_aigc_creative 或 smart_delivery_history_comp_reused_creative處於開啟狀態時,必須滿足:
1. 在 creative_components.brand 陣列中填寫至少一個 component_id(品牌形象元件 ID)
2. 在 supply_strategy_type 陣列中包含 SUPPLY_STRATEGY_TYPE_CUSTOMER_MANUAL_CREATION(與原有策略型別並存)
3. 注意:SUPPLY_STRATEGY_TYPE_CUSTOMER_MANUAL_CREATION 必須和原有的策略型別並存,不能單獨使用。
結構示例:
// 非影片號直播場景 AIGC 創意(開啟 + 品牌形象)
{
"smart_delivery_aigc_creative": {
"is_open": true,
"supply_strategy_type": [
"SUPPLY_STRATEGY_TYPE_AIGC",
"SUPPLY_STRATEGY_TYPE_CUSTOMER_MANUAL_CREATION"
],
"creative_components": {
"brand": [{"component_id": 1917953657934}]
}
}
}
// 非影片號直播場景 元件全庫智選(開啟 + 品牌形象)
{
"smart_delivery_history_comp_reused_creative": {
"is_open": true,
"supply_strategy_type": [
"SUPPLY_STRATEGY_TYPE_HISTORY_COMP_REUSE",
"SUPPLY_STRATEGY_TYPE_CUSTOMER_MANUAL_CREATION"
],
"creative_components": {
"brand": [{"component_id": 1917953657934}]
}
}
}
⚠️ 注意:
SUPPLY_STRATEGY_TYPE_CUSTOMER_MANUAL_CREATION和creative_components.brand必須同時存在,缺一不可。只傳 brand 不加策略型別、或只加策略型別不傳 brand,都會導致建立失敗。
適用場景:smart_delivery_platform = SMART_DELIVERY_PLATFORM_EDITION_WECHAT_STORE_MANAGEMENT(全店託管)且使用者指定了多個商品時,或任何需要傳入多個商品營銷表示式的場景。
規則:
- 當用戶指定多個商品(如"含2個商品"、"商品A和商品B")時,每個商品對應一條 project_ability_list 項
- project_ability_list 替代頂層的 marketing_asset_outer_spec:各商品的 asset 資訊放入每個 item 的 marketing_expression.marketing_asset_outer_spec 內
- 四元組(marketing_goal、marketing_sub_goal、marketing_carrier_type)在每個 item 內重複
結構示例(2個微信小店商品,營銷載體為跳轉頁面):
{
"project_ability_list": [
{
"project_ability_type": "ABILITY_TYPE_MARKETING_EXPRESSION",
"ability_content": {
"marketing_expression": {
"marketing_goal": "MARKETING_GOAL_PRODUCT_SALES",
"marketing_sub_goal": "MARKETING_SUB_GOAL_UNKNOWN",
"marketing_carrier_type": "MARKETING_CARRIER_TYPE_JUMP_PAGE",
"marketing_asset_outer_spec": {
"marketing_target_type": "MARKETING_TARGET_TYPE_WECHAT_STORE_PRODUCT",
"marketing_asset_outer_id": "<catalog_id>",
"marketing_asset_outer_sub_id": "<product_outer_id_1>"
}
}
}
},
{
"project_ability_type": "ABILITY_TYPE_MARKETING_EXPRESSION",
"ability_content": {
"marketing_expression": {
"marketing_goal": "MARKETING_GOAL_PRODUCT_SALES",
"marketing_sub_goal": "MARKETING_SUB_GOAL_UNKNOWN",
"marketing_carrier_type": "MARKETING_CARRIER_TYPE_JUMP_PAGE",
"marketing_asset_outer_spec": {
"marketing_target_type": "MARKETING_TARGET_TYPE_WECHAT_STORE_PRODUCT",
"marketing_asset_outer_id": "<catalog_id>",
"marketing_asset_outer_sub_id": "<product_outer_id_2>"
}
}
}
}
]
}
欄位來源:
- catalog_id(即 marketing_asset_outer_id)和 product_outer_id(即 marketing_asset_outer_sub_id)來自步驟 3 get-assets.mjs 返回的 assets[n].catalog_id 和 assets[n].product_outer_id
- 單商品場景仍用頂層 marketing_asset_outer_spec,無需 project_ability_list
在組裝完請求體後、真正呼叫建立介面前,逐項核對以下內容: - 使用者需求一致性:使用者明確給出的每個條件(定向、出價、預算、三元組、商品等)是否都被原樣保留在請求體中,未被丟棄、修改或替換 - 欄位來源可追溯:四元組、轉化目標、營銷載體等關鍵欄位是否來自實際指令碼查詢結果(而非猜測或編造) - 編碼已確認:定向條件中的地域編碼、裝置 ID 等是否經過查詢指令碼確認 - 金額單位正確:所有金額欄位是否已轉換為分
如有任何欄位與使用者原始需求不一致,必須停止並說明差異原因,等待使用者確認後才能繼續。
欄位檢查清單(20項):
| # | 檢查項 | 要點 |
|---|---|---|
| 1 | account_id |
廣告主賬號ID |
| 2 | adgroup_name |
使用者提供的原文名稱,不要編造 |
| 3 | smart_delivery_platform |
步驟 1 確定,與場景匹配 |
| 4 | 四元組 | marketing_goal、marketing_sub_goal、marketing_target_type、marketing_carrier_type — 統一使用字串列舉 key(如 "MARKETING_GOAL_USER_GROWTH"),create-adgroup.mjs 指令碼內部自動轉為數值。預設全部從步驟 2 的指令碼返回中選出;只有使用者明確給出 4 個列舉值全部時才可直接使用 |
| 5 | marketing_target_type 位置 |
傳在請求體頂層即可,create-adgroup.mjs 會自動將其移入 marketing_asset_outer_spec 內部(ONEID類/商品庫類)或用於 marketing_asset_id 組裝(行業產品庫類)。不需要手動放進 spec |
| 6 | 資產/載體扁平欄位 | 步驟 3 選定 asset 的 flat_params 各 key-value 展開到請求體頂層(如 asset_id、carrier_id、catalog_id 等);ONEID 類和影片號直播類已含 carrier_id;行業/商品庫類不含 carrier_id,若 carrier_type 需要載體則需從使用者處獲取後補入;不要手動構造 marketing_carrier_detail |
| 7 | marketing_asset_outer_spec / marketing_asset_id |
不需要手動構造,create-adgroup.mjs 根據 asset_id + marketing_target_type 自動組裝 |
| 8 | conversion_id(頂層) |
步驟 5 獲取。有 ROI 係數時選 has_deep_conversion=true 的;使用者明確給出則直接使用;禁止寫 0、空字串或漏傳 |
| 9 | bid_amount(頂層) |
單位分 |
| 10 | begin_date / end_date |
未指定 end_date 傳 "" |
| 11 | delivery_time_ranges |
投放時段陣列,每條格式 "<Weekday> <HH:MM>~<HH:MM>",如 ["Monday 09:00~18:00", "Tuesday 09:00~18:00"];傳 ["all"] 表示全時段投放。支援 Monday-Sunday |
| 12 | bid_mode |
預設 BID_MODE_OCPM |
| 13 | automatic_site_enabled |
智投必須 true |
| 14 | smart_delivery_aigc_creative |
必傳,使用者未提及時關閉。影片號直播場景(3002/3004+影片號直播target+影片號直播carrier)開啟時必須含 sku_id 和 catalog_id;非影片號直播場景(3002/3003/3005)開啟時必須含 creative_components.brand 和 SUPPLY_STRATEGY_TYPE_CUSTOMER_MANUAL_CREATION。使用者未提供品牌形象時,指令碼會自動查詢品牌形象列表返回供選擇 |
| 15 | smart_delivery_history_comp_reused_creative |
必傳,使用者未提及時關閉。非影片號直播場景(3002/3003/3005)開啟時必須含 creative_components.brand 和 SUPPLY_STRATEGY_TYPE_CUSTOMER_MANUAL_CREATION。使用者未提供品牌形象時,指令碼會自動查詢品牌形象列表返回供選擇 |
| 16 | bid_scene |
小遊戲跑量傳 BID_SCENE_NORMAL_AVERAGE,其他不傳 |
| 17 | targeting 來源 |
只要使用者給了任何定向約束,地域/裝置必須通過 get-targeting-lookup.mjs 查編碼,列舉通過 get-enum-options.mjs 查詢;定向白名單由 create-adgroup.mjs 自動校驗,不支援的欄位會報錯返回 |
| 18 | search_expansion_switch |
使用者要求時傳 SEARCH_EXPANSION_SWITCH_OPEN,未提及不傳 |
| 19 | project_ability_list |
全店託管多商品場景必須用此欄位替代頂層 marketing_asset_outer_spec;單商品不需要 |
| 20 | wechat_ad_behavior |
使用者提到微信廣告行為排除時,通過 get-enum-options.mjs 查詢列舉後構造;使用者未提及 → 不傳 |
| 21 | 定向列舉值 | education、network_type、device_price、excluded_dimension、excluded_day 等定向列舉必須通過 get-enum-options.mjs 查詢確認,禁止憑記憶猜測 |
| 22 | material_package_id(素材標籤) |
使用者提及素材標籤/素材包時按 references/material-labels.md 取值;未提及 → 不傳 |
| 23 | smart_targeting_mode |
智慧定向模式。SMART_TARGETING_MANUAL(手動定向)=不使用/關閉智慧定向,SMART_TARGETING_AUTO(智慧定向)=開啟/使用智慧定向。列舉通過 get-enum-options.mjs '{"fields":["smart_targeting_mode"]}' 查詢。使用者未提及不傳 |
| 24 | short_play_pay_type + sell_strategy_id |
僅爆劇跑量場景。使用者提及短劇售賣方式時設定;收費劇必須提供 sell_strategy_id;未提及 → 不傳 |
| 25 | 週期達成欄位 | 使用者明確要求"週期達成"/"週期穩投"時傳入 smart_delivery_period_switch=PERIOD_SWITCH_ON + smart_delivery_period_days + smart_delivery_period_budget + smart_delivery_period_continue;預算 ≥ 3×出價×天數;禁止同時傳 daily_budget/total_budget/end_date;使用者未提及 → 不傳任何週期達成欄位 |
⚠️ 定向欄位禁止自行新增:
excluded_converted_audience、wechat_ad_behavior等定向欄位,只有使用者明確要求時才加入 targeting。使用者沒提到的定向維度一律不傳。
node scripts/create-adgroup.mjs '<完整引數JSON>'
返回示例(成功):
{
"success": true,
"adgroup_id": <integer>,
"summary_text": "<由指令碼拼裝的單句中文回執,包含建立關鍵資訊>"
}
返回示例(失敗):
{
"success": false,
"error": { "code": <integer>, "message": "...", "message_cn": "..." }
}
⛔ 建立成功後必須將
summary_text原樣輸出給使用者(含其中的換行)。該欄位已由指令碼拼裝好首行標題 + 多行列表的中文回執,不要省略欄位、不要改寫、不要翻譯、不要重新排版(不要改成表格或合併成單段),也不要參考其中具體數值作為後續推理依據。失敗時無summary_text,按error.message_cn與trace_id向用戶說明原因。
| 使用者輸入 | 對應欄位 | 轉換規則 |
|---|---|---|
| 場景關鍵詞 | smart_delivery_platform |
按步驟 1 場景參考表匹配 |
| 四元組相關 | marketing_goal 等 |
從步驟 2 指令碼返回中選取,禁止猜測。統一使用字串列舉 key,指令碼內部轉數值 |
| "出價136.54元" | bid_amount |
→ 13654(×100,分) |
| "日預算1000元" | daily_budget |
→ 100000(×100,分) |
| "深度ROI 1.5" | deep_conversion_worth_rate |
→ 1.5,需選 has_deep_conversion=true 的轉化ID |
| "深度輔助ROI 1.812" | deep_conversion_worth_advanced_rate |
→ 1.812,需選 ROI 類轉化ID |
| "全國投放"/"不限地域" | targeting.geo_location |
不傳 geo_location |
| "排除X省"/"不投X省"/"除X外全國" | targeting.geo_location |
→ 調 get-geo-exclude.mjs,取返回 results 中的 id 組成 regions 陣列,加 location_types: ["LIVE_IN"] |
| 指定省市 | targeting.geo_location |
→ get-targeting-lookup.mjs 查編碼,取返回的 id 組成純整數陣列放入 regions(如 [440000]),location_types: ["LIVE_IN"] |
| 指定性別 | targeting.gender |
→ 通過 get-enum-options.mjs 查 gender 列舉後構造 |
| 指定年齡 | targeting.age |
→ [{"min":25,"max":29}, {"min":30,"max":39}],min/max 均為閉區間(包含邊界值),即"25~29歲"→ {"min":25,"max":29},不是 {"min":25,"max":30}。按使用者給出的區間直接構造,如果使用者說了多個不同年齡段,不要合併 |
| 指定裝置 | targeting.device_brand_model |
→ get-targeting-lookup.mjs 搜數字ID |
| 指定作業系統 | targeting.user_os |
全版本:["ANDROID"] / ["IOS"];指定版本範圍:如"Android 10及以上"→ ["ANDROID_VERSION_10", ..., "ANDROID_VERSION_15"],"iOS 14及以上"→ ["IOS_VERSION_14", ..., "IOS_VERSION_18"] |
| 排除作業系統 | targeting.excluded_os |
排除特定系統版本,如排除鴻蒙純淨版 → ["ANDROID_PURE_MODE"],排除低版本Android → ["ANDROID_VERSION_1", "ANDROID_VERSION_2", ..., "ANDROID_VERSION_4"] |
| 指定聯網方式 | targeting.network_type |
如"僅WiFi"→ ["WIFI"],"4G及以上"→ ["NET_4G", "NET_5G", "WIFI"] |
| 排除已轉化 | targeting.excluded_converted_audience |
→ 按定向規則填寫 |
| 排除小遊戲註冊使用者(N天未活躍) | targeting.wechat_ad_behavior |
→ {"excluded_actions": ["MINI_GAME_WECHAT_REGISTERED"], "mini_game_wechat_registered_activity": "THIRTY_DAYS_NO_ACTIVE"} |
| 定向列舉值 | education、network_type、device_price 等 |
必須通過 get-enum-options.mjs 查詢確認,禁止憑記憶猜測 |
| 專案名稱 | adgroup_name |
按使用者原文 |
| "轉化來源/自建轉化/平臺預置" | create_source_type |
→ CreateSourceType,列舉通過 get-enum-options.mjs '{"fields":["create_source_type"]}' 查詢 |
| "AIGC開啟"/"AIGC創意"/"AIGC" | smart_delivery_aigc_creative |
→ struct:{"is_open": true, "supply_strategy_type": ["SUPPLY_STRATEGY_TYPE_AIGC"]}。 |
| "全庫智選開啟"/"元件全庫智選"/"歷史元件複用" | smart_delivery_history_comp_reused_creative |
→ struct:{"is_open": true, "supply_strategy_type": ["SUPPLY_STRATEGY_TYPE_HISTORY_COMP_REUSE"]}。 |
| "素材包/素材標籤 ID 1234" | material_package_id |
按 references/material-labels.md 取值;未提及不傳 |
| "不使用智慧定向"/"關閉智慧定向"/"手動定向" | smart_targeting_mode |
→ SMART_TARGETING_MANUAL,列舉通過 get-enum-options.mjs '{"fields":["smart_targeting_mode"]}' 查詢 |
| "使用智慧定向"/"開啟智慧定向" | smart_targeting_mode |
→ SMART_TARGETING_AUTO,列舉通過 get-enum-options.mjs '{"fields":["smart_targeting_mode"]}' 查詢 |
| "廣告上線建立"/"建立後啟用"/"建立後上線" | configured_status |
→ AD_STATUS_NORMAL,覆蓋預設暫停行為 |
| "免費劇"/"免費短劇" | short_play_pay_type |
→ SHORT_PLAY_PAY_TYPE_FREE_PLAY(僅爆劇跑量場景) |
| "收費劇"/"付費劇"/"付費短劇" | short_play_pay_type |
→ SHORT_PLAY_PAY_TYPE_CHARGE_PLAY(僅爆劇跑量場景,必須同時提供 sell_strategy_id) |
| "售賣策略 ID xxx"/"短劇策略 ID xxx" | sell_strategy_id |
→ 整數值,收費劇場景必填 |
| "週期達成"/"週期穩投"/"固定週期" | smart_delivery_period_switch |
→ PERIOD_SWITCH_ON,同時必須配合 smart_delivery_period_days、smart_delivery_period_budget、smart_delivery_period_continue。禁止同時傳 daily_budget/total_budget/end_date |
| "3天週期"/"三天" | smart_delivery_period_days |
→ PERIOD_DAYS_THREE |
| "7天週期"/"七天"/"一週" | smart_delivery_period_days |
→ PERIOD_DAYS_SEVEN |
| "週期預算X元" | smart_delivery_period_budget |
→ 金額×100(分),如"2000元" → 200000 |
| "續投"/"自動續投"/"長期投放" | smart_delivery_period_continue |
→ PERIOD_CONTINUE_SWITCH_ON |
| "不續投"/"單週期"/"投完即停" | smart_delivery_period_continue |
→ PERIOD_CONTINUE_SWITCH_OFF |
| --- |
conversion_id、營銷載體 ID、定向列舉0 不是預設值:它們通常表示"你沒有拿到真實結果",不要拿來偽裝步驟已完成"MARKETING_GOAL_USER_GROWTH"),指令碼內部負責轉為 API 所需數值這個 Skill 質量較好,文件非常詳細,操作步驟清晰,指令碼能自動處理複雜的資料轉換,省去了很多手動配置的麻煩。優點是覆蓋場景全、引數校驗完善,跨平臺相容性也考慮得很周到。不足之處是文件內容太多需要花時間消化,操作步驟較繁瑣,對新手不太友好。整體而言,這是一個成熟可用的技能,但需要仔細閱讀文件才能用好。