name: tencentads-delivery-standard-create description: "專用於建立常規(標準)展示營銷單元(原廣告組)的 SDK 化技能。當用戶意圖涉及常規投放、標準營銷單元建立、CPC/CPM/oCPM/oCPC出價營銷單元的建立場景時,使用本技能。當用戶未明確提到智投關鍵詞或者使用者指定了手動版位的,應優先使用本技能。覆蓋場景:電商推廣、APP下載註冊、品牌曝光、銷售線索收集、內容變現等常規展示營銷單元。本技能通過專用指令碼(而非全域性 CLI 工具)呼叫 API,指令碼已處理複雜分支、欄位過濾和資料轉換。注意:如果當用戶明確提到智投、專案、AIM+、艾米等關鍵詞,應使用 tencentads-delivery-smart-create 技能" 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 解析失敗。
以下差異直接影響步驟 6 請求體的構建,執行時需注意。
| 維度 | 常規投放 | 智投(AIM+) |
|---|---|---|
| 標識 | 不傳 smart_delivery_platform |
必傳特定的 smart_delivery_platform |
| 出價方式 | 支援 CPC / CPM / oCPM / oCPC | 僅 oCPM |
| 轉化配置 | conversion_id + bid_mode + bid_amount |
conversion_id(頂層)+ bid_amount(頂層) |
| 版位 | 手動選擇或自動版位 | 統一自動版位 |
| 定向 | 完整能力(地域/年齡/性別/興趣/行為/人群包等) | 受限 |
⛔ 執行順序(不可跳步):
步驟1 → 步驟1A(可選) → 步驟2 → 步驟3 → 步驟4 → 步驟5 → 步驟6
獲取 資產反推 確定 確定 獲取 配置 組裝請求體
四元組 四元組 推廣產品 版位 轉化目標 定向+時間 → create-adgroup.mjs
(有資產線索時) +載體 +出價
若本節與下文"繼續執行""不要重複查詢"等表述衝突,以本節為準。
步驟 1、2、5、6 無論什麼出價方式都必須執行。以下規則隻影響步驟 3~4:
automatic_site_enabled: true,跳過 get-site-set.mjs;手動版位 → 仍需查詢bid_mode + bid_amount步驟 3~4 全部執行(步驟 4 的 get-conversions.mjs 依賴步驟 3 返回的 site_set)
⛔ 步驟 1 → 2 是絕對必須執行的前兩步,不可跳過。 即使使用者 input 中看起來已包含四元組、商品資訊,仍必須呼叫 get-rules.mjs 確認四元組、呼叫 get-assets.mjs 獲取推廣資產 ID。原因:不同賬號的可選組合不同,自然語言描述無法直接轉為精確的列舉值和 ID。例外:步驟 1A 成功確定資產後,步驟 2 可跳過 get-assets.mjs 呼叫(但仍需從 1A 的資料構造欄位)。步驟 3-5 中的查詢子動作在滿足"顯式證據白名單"或"出價方式跳過規則"時可跳過,但步驟 1 不可。
conversion_id 的依據。tencent-ads api)嘗試繞過。寧可在最終請求中缺少某個欄位,也不要耗盡所有輪次。marketing_goal、marketing_sub_goal、marketing_target_type、marketing_carrier_type 這 4 個列舉值全部;或當前 session 已從 get-rules.mjs 返回中得到。get-assets.mjs 返回中得到;或步驟 1A 的 get-assets-by-rules.mjs 已成功匹配到資產。conversion_id;或當前 session 已從 get-conversions.mjs 返回中得到。get-targeting-lookup.mjs。前置:
account_id+ 使用者營銷需求 輸出: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>"}'
示例:
node scripts/get-rules.mjs '{"account_id":"123456789"}'
指令碼已處理:內部呼叫 get_rules_by_advertiser(不傳 delivery_scene,獲取常規廣告可用組合),解析 rules_json 巢狀 JSON 字串,按 marketing_goal 分組輸出緊湊格式。
返回格式說明:
| 返回欄位 | 含義 |
|---|---|
goals |
所有可用的 marketing_goal 列表 |
total |
組合總數 |
default_sub_goal |
大多數條目的 marketing_sub_goal 值(條目中無 s 時取此值) |
by_goal |
按 goal 分組,每條含 t=marketing_target_type、c=marketing_carrier_type、pt=product_type;s=marketing_sub_goal(僅當與 default_sub_goal 不同時出現) |
所有列舉值均為完整 key(如
MARKETING_TARGET_TYPE_APP_ANDROID),可直接使用。
返回示例:
{
"goals": ["MARKETING_GOAL_PRODUCT_SALES", "MARKETING_GOAL_USER_GROWTH"],
"total": 5,
"default_sub_goal": "MARKETING_SUB_GOAL_UNKNOWN",
"by_goal": {
"MARKETING_GOAL_PRODUCT_SALES": [
{"t": "MARKETING_TARGET_TYPE_CONSUMER_PRODUCT", "c": "MARKETING_CARRIER_TYPE_JUMP_PAGE", "pt": 30}
],
"MARKETING_GOAL_USER_GROWTH": [
{"s": "MARKETING_SUB_GOAL_APP_ACQUISITION", "t": "MARKETING_TARGET_TYPE_APP_ANDROID", "c": "MARKETING_CARRIER_TYPE_APP_ANDROID", "pt": 43}
]
}
}
Agent 需要做的決策:當返回多個組合時,根據使用者意圖選擇正確的一組。
選擇規則(按優先順序逐層過濾):
marketing_goal 應含 PRODUCT_SALESmarketing_goal 應含 USER_GROWTHmarketing_goal 應含 BRAND_PROMOTIONmarketing_goal 應含 LEAD_RETENTIONmarketing_goal 應含 INCREASE_FANS_INTERACTIONmarketing_target_type 應含 MINI_PROGRAM_WECHATmarketing_target_type 應含 APP_ANDROID 或 APP_IOS。marketing_target_type 應含 WECHAT_MINI_GAMEmarketing_target_type 應含 WECHAT_CHANNELS_LIVEmarketing_carrier_type 應含 WECHAT_CHANNELS_LIVE(⛔ 不要據此設定 marketing_target_type)marketing_carrier_type 應含 JUMP_PAGEmarketing_sub_goal 應含 NEW_GAME_LAUNCHmarketing_sub_goal 應含 NEW_GAME_TESTmarketing_sub_goal 應含 NEW_GAME_RESERVEmarketing_sub_goal 應含 PLATEAU_PHASE_LAUNCHmarketing_sub_goal 應含 MINI_GAME_NEW_CUSTOMER_GROWTH使用者提到了"小遊戲迴流"/"小遊戲促活"/"迴流促活" → marketing_sub_goal 應含 MINI_GAME_RETURN_CUSTOMER_ENGAGEMENT
按 marketing_goal 匹配使用者的營銷目標
按 marketing_target_type 匹配使用者的推廣物件型別
⛔⛔⛔ 前置強制檢查(最高優先順序):使用者是否同時給了「推廣產品 ID 或名稱」? - 是 → 禁止在步驟 1 確定
marketing_target_type,必須直接跳到步驟 1A,把該marketing_goal下的全部 combinations 傳入,由指令碼自動匹配。即使使用者同時說了"營銷載體: iOS應用",也絕對不能據此把 combinations 縮窄為只含APP_IOS的那一個。 - 否 → 繼續按下面的規則選擇。⚠️
marketing_target_type反映的是"產品/店鋪/內容"的型別,不要與最佳化目標、出價方式混淆。無法直接確定時,按marketing_goal過濾後從剩餘項中選擇。⛔ "營銷載體"只能確定
marketing_carrier_type,禁止用來推斷或縮窄marketing_target_type。⚠️ 商品庫類
marketing_target_type選擇規則(僅當PRODUCT_SALES且 combinations 同時含CONSUMER_PRODUCT、WECHAT_STORE_PRODUCT、WECHAT_STORE中多個時): 1. 使用者明確說了"商品庫" → 選CONSUMER_PRODUCT2. 使用者明確說了"微信小店"/"影片號小店" → 選WECHAT_STORE_PRODUCT(推廣單個商品)或WECHAT_STORE(推廣整個店鋪),根據使用者意圖區分 3. 使用者給了推廣產品名稱或 ID → ⛔ 禁止暫定,必須直接進入步驟 1A 通過資產反推確定。傳給 1A 的 combinations 按 1A-① 規則過濾(只按marketing_goal過濾,其餘維度全量)。 4. 使用者未明確且未給任何資產線索 → 暫定CONSUMER_PRODUCT,步驟 2 會根據資產查詢結果自動回退(見步驟 2B「商品庫類空資產回退」)
⛔ 窮盡以上規則後仍無法唯一確定 marketing_target_type 時(強制檢查點):
先回答:使用者是否給了推廣產品的名稱或 ID? - 是 → 立即進入步驟 1A,通過資產反推確定四元組。禁止猜測
marketing_target_type。傳給 1A 的 combinations 按 1A-① 規則過濾(只按marketing_goal過濾,其餘維度全量)。 - 否 → 向用戶列出剩餘 combinations 中的marketing_target_type選項確認,附中文含義幫助選擇。
若過濾後 marketing_carrier_type 仍有多個可選值(即同一 marketing_goal + marketing_target_type 對應多種 carrier_type),必須向用戶確認營銷載體型別,不能自行猜測。此時應將 combinations 中實際剩餘的所有 marketing_carrier_type 選項列出給使用者,讓使用者選擇。例如:"根據您的推廣目標,當前支援以下營銷載體:1) XXX 2) YYY 3) ZZZ,請問您要使用哪種?"(其中 XXX/YYY/ZZZ 替換為 combinations 中實際返回的 carrier_type 值)
marketing_sub_goal 只能複用 get-rules.mjs 返回值,禁止語義改寫:例如使用者說"註冊"、"新客"、"拉新"時,也不要自造 MARKETING_SUB_GOAL_USER_REGISTER;如果步驟 1 返回的是 MARKETING_SUB_GOAL_MINI_GAME_NEW_CUSTOMER_GROWTH 或 MARKETING_SUB_GOAL_APP_ACQUISITION,後續所有指令碼都必須原樣複用步驟 1 完成後你應該有:四元組 4 個值 + product_type(從 combinations 陣列的匹配項取)。product_type 需透傳給步驟 3 和步驟 4 的指令碼。
⛔ 前置門禁:步驟 1 過濾後只剩 1 個 combination → 四元組已確定,直接跳到步驟 2,禁止進入 1A。 即使使用者給了推廣產品 ID/名稱也不需要 1A——資產查詢在步驟 2 完成。
觸發條件(僅當通過前置門禁後):使用者提到了推廣產品/資產的 ID 或名稱,且步驟 1 過濾後仍有 2 個及以上 combinations 無法唯一確定四元組。
不觸發的情況:① 步驟 1 已經唯一確定了四元組(只剩 1 個 combination)② 使用者沒有給出任何資產 ID 或名稱線索
目的:通過查詢賬號下所有可能組合的真實資產列表,用使用者給的資產 ID 或名稱進行匹配,精確鎖定四元組,避免向用戶確認。
⛔ 規則不變:只按 marketing_goal 過濾,marketing_target_type 和 marketing_carrier_type 維度不做任何縮窄。
指令碼內部自動呼叫 get_rules_by_advertiser API 獲取全量 combinations,並按傳入的 marketing_goal 過濾。Agent 不需要透傳 combinations 陣列。 指令碼還支援傳入 marketing_target_type 進行優先查詢(非縮窄):優先查該型別的資產並嘗試匹配,命中則跳過其餘型別的 API 呼叫以加速返回,未命中則自動 fallback 全量查詢。指令碼還會在資產匹配成功且載體型別需要時自動查詢載體列表,結果通過 carrier_result 返回(詳見 1A-③+)。
node scripts/get-assets-by-rules.mjs '{"account_id":"<ACCOUNT_ID>","marketing_goal":"<使用者確定的MARKETING_GOAL或不傳>","marketing_target_type":"<使用者明確的TARGET_TYPE或不傳>","match_hint":{"asset_id":"<使用者給的ID或null>","asset_name":"<使用者給的名稱或null>"},"carrier_hint":{"carrier_id":"<使用者給的載體ID或null>","carrier_name":"<使用者給的載體名稱或null>"}}'
引數說明:
- account_id:必填
- marketing_goal:可選。傳入後腳本只查該 goal 下的 combinations(等價於原來 Agent 手動按 goal 過濾)。使用者明確了 goal 就傳,未明確就不傳(指令碼查全量)
- marketing_target_type:可選。使用者明確了推廣產品型別時傳入(如使用者說"小程式"就傳 MARKETING_TARGET_TYPE_MINI_PROGRAM_WECHAT)。指令碼會優先查該型別下的資產,匹配成功則跳過其餘型別查詢以加速返回;未傳或優先查未命中時自動 fallback 全量查詢。注意:這裡傳 marketing_target_type 僅影響查詢順序(優先查 → fallback 全量),不等同於步驟 1 中"縮窄 combinations"——即使傳了,指令碼仍保證不漏查其他型別
- match_hint:使用者給了資產 ID 就傳 asset_id,給了名稱就傳 asset_name,兩個都給了就都傳(ID 優先匹配)
- carrier_hint:可選,使用者給了載體 ID 傳 carrier_id,給了載體名稱傳 carrier_name
返回示例(unique_match):
{
"asset_dict": {
"MARKETING_GOAL_PRODUCT_SALES|MARKETING_SUB_GOAL_UNKNOWN|MARKETING_TARGET_TYPE_PRODUCT_AGGREGATION_PAGE|MARKETING_CARRIER_TYPE_JUMP_PAGE": {
"combination": {
"marketing_goal": "MARKETING_GOAL_PRODUCT_SALES",
"marketing_sub_goal": "MARKETING_SUB_GOAL_UNKNOWN",
"marketing_target_type": "MARKETING_TARGET_TYPE_PRODUCT_AGGREGATION_PAGE",
"marketing_carrier_type": "MARKETING_CARRIER_TYPE_JUMP_PAGE",
"product_type": 30
},
"asset_type": "INDUSTRY",
"assets": [
{ "marketing_asset_id": "578879856", "name": "某資產名" }
]
},
"其他組合...": { "combination": {...}, "asset_type": "...", "assets": "[3 items, omitted]" }
},
"match_result": {
"status": "unique_match",
"match_type": "id_exact",
"matched_items": [
{
"combination_key": "MARKETING_GOAL_PRODUCT_SALES|...|MARKETING_CARRIER_TYPE_JUMP_PAGE",
"combination": { "marketing_goal": "...", "marketing_sub_goal": "...", "marketing_target_type": "...", "marketing_carrier_type": "...", "product_type": 30 },
"asset_type": "INDUSTRY",
"asset": { "marketing_asset_id": "578879856", "name": "某資產名" }
}
]
},
"carrier_result": {
"status": "found",
"carriers": [
{ "carrier_id": "417200582", "carrier_name": "唯品會" }
],
"matched_carrier": { "carrier_id": "417200582", "carrier_name": "唯品會" }
}
}
注意:
unique_match時指令碼會自動裁剪非命中 combination 的assets(顯示為"[N items, omitted]"),減少上下文開銷。
指令碼返回的 match_result 已按優先順序完成匹配,直接根據 status 處理:
match_result.status |
含義 | 處理方式 |
|---|---|---|
unique_match |
恰好 1 個 combination 下命中 1 條資產 | ✅ 直接使用 matched_items[0].combination 作為四元組,matched_items[0].asset 作為資產資訊。驗證一致性:如果使用者同時給了營銷目標線索(如"線索收集"),檢查命中的 marketing_goal 是否一致。一致 → 直接使用;不一致 → 向用戶提示矛盾並給出選項 |
multiple_match |
同一資產存在於多個 combination 下 | 列出 matched_items 中各 combination 的中文說明供使用者選擇 |
name_multiple_match |
名稱匹配到多個不同資產 | 列出 matched_items 中各資產的 ID、名稱、所屬 combination 供使用者確認 |
no_match |
所有 combination 下都沒找到匹配 | 去掉預過濾,用全部 combinations 重新查一次(不傳 match_hint 之外的過濾條件)。仍然 no_match → 列出 asset_dict 中有資產的 combination 供使用者參考,並給出可能原因(ID 輸錯、資產不在該賬戶下等) |
carrier_result)當資產匹配成功(unique_match / multiple_match)且載體型別不是 JUMP_PAGE 時,指令碼自動查詢載體列表並返回 carrier_result。
carrier_result.status |
含義 | 處理方式 |
|---|---|---|
found + matched_carrier 不為 null |
載體查詢成功且匹配到載體 | ✅ 已反映在 flat_params.carrier_id 中,直接透傳 |
found + matched_carrier 為 null |
載體查詢成功但未匹配到(多個載體且無 hint) | 列出 carriers 供使用者選擇 |
not_needed |
ONEID/影片號類資產已包含 carrier_id,或載體型別為 JUMP_PAGE | 已反映在 flat_params.carrier_id 中(ONEID 類),或不需要 carrier_id(JUMP_PAGE) |
no_carriers |
查詢成功但該賬號下無載體 | 向用戶確認載體資訊 |
skipped |
資產匹配未成功,未觸發載體查詢 | 正常流程,後續步驟 2 處理 |
match_failed |
載體查詢介面呼叫失敗 | 從使用者輸入獲取載體 ID,或向用戶確認 |
載體查詢的介面路由(指令碼內部自動判斷,Agent 無需關心): - 統一通過
bff_promoted_objects/get介面查詢,指令碼根據marketing_carrier_type自動對映到對應的promoted_object_type
| 1A 結果 | 對後續步驟的影響 |
|---|---|
成功確定四元組 + 資產 + 載體(unique_match + carrier_result.matched_carrier) |
✅ 四元組已確定,指令碼已輸出 flat_params → 步驟 2 可跳過,直接將 flat_params 中的欄位透傳給步驟 6 的 create-adgroup.mjs |
成功確定四元組 + 資產(unique_match,但載體未匹配) |
✅ 四元組已確定,flat_params 已輸出(可能缺少 carrier_id)→ 步驟 2 可跳過 get-assets.mjs 呼叫,載體 ID 待後續步驟獲取 |
未能確定(multiple_match / name_multiple_match / no_match) |
已向用戶確認 → 得到答案後確定四元組,進入步驟 2 正常執行 |
前置:步驟 1 的
marketing_target_type、marketing_carrier_type、marketing_goal輸出:asset_id、carrier_id等扁平 ID(步驟 6 傳給create-adgroup.mjs,由指令碼自動組裝為 API 所需的巢狀結構)⚡ 快速路徑:如果步驟 1A 的
match_result.status為unique_match,可跳過get-assets.mjs呼叫,直接使用指令碼返回的flat_params中的扁平 ID。⚡ ONEID 類自動短路:當用戶給了明確的資產 ID 時,通過
asset_hint.asset_id傳給get-assets.mjs,指令碼內部會自動短路(不調 API,直接返回shortcut: true),返回的flat_params可直接透傳。使用者給的是名稱時傳asset_hint.asset_name,指令碼不會短路,走正常查詢。
呼叫方式(步驟 1A 未執行或未成功時):
node scripts/get-assets.mjs '{"account_id":"<ACCOUNT_ID>","marketing_target_type":"<...>","marketing_carrier_type":"<...>","marketing_goal":"<...>","product_type":<number>,"carrier_hint":{"carrier_id":"...","carrier_name":"..."},"asset_hint":{"asset_id":"...","asset_name":"..."}}'
引數說明:
- account_id、marketing_target_type:必填
- marketing_carrier_type、marketing_goal:可選
- product_type:可選,來自步驟 1 的 combination.product_type,載體查詢時使用
- carrier_hint:可選,用於載體匹配。使用者給了載體 ID 就傳 carrier_id,給了載體名稱就傳 carrier_name
- asset_hint:可選,使用者給了明確的資產 ID 就傳 asset_id,給了資產名稱就傳 asset_name。ONEID 類傳 asset_id 時指令碼自動短路
⚡ 載體查詢已內建:當傳入
marketing_carrier_type+product_type(或carrier_hint)時,指令碼會自動查詢並匹配載體,返回carrier_result欄位。無需額外呼叫get-assets-by-rules.mjs來獲取載體 ID。
指令碼已處理:自動根據 marketing_target_type 判斷分類(ONEID / 商品庫 / 行業產品庫),路由到正確的 API,返回統一格式的資產列表。同時自動查詢載體(如需要)。
返回示例(ONEID 類):
{
"asset_type": "ONEID",
"assets": [
{
"marketing_asset_outer_id": "wx1234567890",
"marketing_carrier_id": "wx1234567890",
"name": "我的小程式",
"type": "MINI_PROGRAM_WECHAT"
}
],
"carrier_result": {
"status": "not_needed",
"reason": "ONEID/影片號類資產已包含 marketing_carrier_id"
}
}
Agent 需要做的決策——資產選擇規則(⛔ 禁止預設選第一個):
assets 中選 asset_name(或 name)與使用者意圖最相關的項flat_params 給步驟 6(⛔ 不要手動構造巢狀結構)核心原則:Agent 只負責將指令碼返回的扁平 ID 透傳給步驟 6 的
create-adgroup.mjs。巢狀結構(marketing_asset_outer_spec、marketing_asset_id、marketing_carrier_detail)全部由create-adgroup.mjs根據marketing_target_type/marketing_carrier_type自動組裝,Agent 不要手動構造。
get-assets-by-rules.mjs 的 flat_params:
指令碼會為每條 matched_items 都計算並掛載 flat_params(與 create-adgroup.mjs 入參直接對齊):
- unique_match → 頂層也輸出 flat_params(= matched_items[0].flat_params),Agent 直接透傳即可
- multiple_match / name_multiple_match → 使用者選完後,取對應項的 matched_items[n].flat_params 即可,無需手動提取欄位
{
"flat_params": {
"asset_id": "342574", // INDUSTRY → marketing_asset_id; ONEID → marketing_asset_outer_id; CATALOG → catalog_id
"carrier_id": "417200582", // 優先 carrier_result.matched_carrier,其次 ONEID 資產的 marketing_carrier_id
"catalog_id": "123456", // 僅商品庫類
"asset_sub_id": "...", // 商品庫子 ID / ONEID 子包 / 直播預約 notice_id 等(可選)
"sub_carrier_id": "..." // 通常與 asset_sub_id 同值(可選)
}
}
get-assets.mjs 的 flat_params:
get-assets.mjs 也會為每條 assets 都掛載 flat_params,格式與上面一致。Agent 選完後直接取 assets[n].flat_params 透傳即可。assets 恰好 1 條時頂層也輸出 flat_params(= assets[0].flat_params)。
總結:無論走哪個指令碼、匹配到幾條,每條結果都帶
flat_params。Agent 選定後直接透傳,永遠不需要手動判斷"該取哪個欄位"。
asset_sub_id / sub_carrier_id 補充說明(flat_params 已自動處理,以下僅供瞭解):
- APP_ANDROID:子包標識(如 "0;00011609313139363030393334"),asset_sub_id 和 sub_carrier_id 填同一值
- PC_GAME:區服標識(如 "hwbz"),asset_sub_id 和 sub_carrier_id 填同一值
- WECHAT_CHANNELS_LIVE_RESERVATION:直播預約 notice_id(如 "finderlivenotice-..."),asset_sub_id 和 sub_carrier_id 填同一值
- 商品庫類(CONSUMER_PRODUCT / WECHAT_STORE_PRODUCT / COMMODITY_SET / WECHAT_STORE_PRODUCT_SET):asset_sub_id = product_outer_id / wechat_store_id / commodity_set_id
- 無子級時不傳這兩個欄位即可
carrier_id 的來源(按優先順序):
1. flat_params.carrier_id(兩個指令碼每條結果都帶,最簡單直接)
2. 使用者明確給出的載體 ID。⛔ 使用者給的"推廣產品 ID"不是載體 ID,兩者不可互換。
3. 以上都沒有時,需向用戶確認
影片號直播預約場景補充:get-assets.mjs 返回含 live_notices,Agent 必須選取 notice_id(格式 finderlivenotice-xxx),同時傳給 asset_sub_id 和 sub_carrier_id。多場次選擇:① 使用者指定 → 匹配 ② 未指定 → start_time 最晚且在投放日期內 ③ 都不在範圍 → start_time 最晚。(get-assets-by-rules.mjs 的 flat_params 中已自動選取最晚場次,如需使用者指定可覆蓋)
指令碼會根據
marketing_target_type自動判斷三分類(ONEID / 商品庫 / 行業產品庫),組裝正確的marketing_asset_outer_spec或marketing_asset_id。根據marketing_carrier_type自動判斷是否需要marketing_carrier_detail。不需要手動構造這些巢狀結構。
catalog_id、product_outer_id、marketing_asset_id 等),則可直接作為對應的扁平 ID 使用並跳過查詢。ONEID 類使用者給了資產 ID 時通過 asset_hint.asset_id 傳給 get-assets.mjs,指令碼會自動短路處理。get-assets.mjs 內部已實現自動回退——當 CONSUMER_PRODUCT 查詢返回空資產時,指令碼會自動嘗試 WECHAT_STORE_PRODUCT,反之亦然。Agent 無需手動重試或切換型別。actual_marketing_target_type(實際生效的型別)和 fallback_applied: trueactual_marketing_target_type 欄位:如果與傳入的型別不同,說明發生了回退,後續步驟 3~7 都必須使用 actual_marketing_target_type 的值(而非原始傳入值)發現更多技能外掛,請訪問7w4.net。
assets: [] 且無 fallback_applied,說明兩種型別都沒有資產,按正常的空結果處理(保留缺失狀態)MARKETING_CARRIER_TYPE_JUMP_PAGE):不需要傳 carrier_id,但推廣資產仍需正常查詢步驟 2 完成後你應該有:flat_params(包含 asset_id、carrier_id 等扁平 ID),或已從指令碼返回中選定了一條帶 flat_params 的資產。這些值不能是空字串。
前置:步驟 1 的
marketing_target_type、marketing_carrier_type輸出:site_set(陣列)或確認使用自動版位⚡ 快速路徑:僅 CPC/CPM + 自動版位 → 直接設
automatic_site_enabled: true,跳過本步查詢,進入步驟 4。⛔ oCPM/oCPC 時必須呼叫
get-site-set.mjs,即使使用者已明確指定了版位名稱。原因:步驟 4 的get-conversions.mjs依賴此步返回的available_site_set來構造site_set引數,使用者給的版位名稱不能直接替代。
版位決定了廣告的投放位置。常規廣告支援手動選擇版位和自動版位兩種模式。
版位確定規則:
get-site-set.mjs,再從指令碼返回的真實 available_site_set 中選擇(如"投朋友圈" → ["SITE_SET_MOMENTS"];如"投騰訊平臺與內容媒體/PCAD" → 按 3B 一級分類展開為 ["SITE_SET_KANDIAN", "SITE_SET_QQ_MUSIC_GAME", "SITE_SET_TENCENT_NEWS", "SITE_SET_TENCENT_VIDEO"] 再與 available_site_set 取交集)。確定最終的使用者版位列表供步驟 4B 和步驟 6 使用automatic_site_enabled: true,仍需查詢可用版位列表,後續 get-conversions.mjs 傳入 auto_site_set 中的版位get-site-set.mjs 獲取版位列表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>"}'
示例:
node scripts/get-site-set.mjs '{"account_id":"123456789","marketing_goal":"MARKETING_GOAL_USER_GROWTH","marketing_sub_goal":"MARKETING_SUB_GOAL_UNKNOWN","marketing_target_type":"MARKETING_TARGET_TYPE_APP_ANDROID","marketing_carrier_type":"MARKETING_CARRIER_TYPE_APP_ANDROID"}'
指令碼已處理:內部自動設定 bid_mode、buying_type、campaign_type 等 API 必傳引數,呼叫方只需傳四元組列舉 key。
返回:
{
"available_site_set": ["SITE_SET_MOMENTS", "SITE_SET_WECHAT", "SITE_SET_MOBILE_UNION", "SITE_SET_QQ_MUSIC_GAME", "SITE_SET_TENCENT_VIDEO", "SITE_SET_CHANNELS", "SITE_SET_MOBILE_YYB"],
"auto_site_set": ["SITE_SET_MOMENTS", "SITE_SET_WECHAT", "SITE_SET_MOBILE_UNION"],
"non_multi_site_set": ["SITE_SET_MOBILE_YYB"]
}
⚠️ 此表為 API 真實列舉 key 與中文名稱的對照表,以 API 文件為準。Agent 在從使用者自然語言對映版位時,必須參考此表,嚴禁憑猜測使用表中不存在的 key。
| 列舉值 | 說明 | 使用者常見說法 | 備註 |
|---|---|---|---|
SITE_SET_MOMENTS |
微信朋友圈 | "朋友圈" | |
SITE_SET_WECHAT |
微信公眾號與小程式 | "公眾號"、"小程式" | |
SITE_SET_MOBILE_UNION |
騰訊廣告聯盟 | "優量匯"、"聯盟"、"廣告聯盟" | |
SITE_SET_TENCENT_NEWS |
騰訊新聞 | "騰訊新聞" | |
SITE_SET_TENCENT_VIDEO |
騰訊影片 | "騰訊影片" | |
SITE_SET_MOBILE_YYB |
應用寶 | "應用寶" | |
SITE_SET_PCQQ |
騰訊廣告電腦端(PC) | "QQ"、"PC QQ"、"電腦端" | |
SITE_SET_KANDIAN |
QQ瀏覽器(原騰訊看點) | "QQ瀏覽器"、"看點" | |
SITE_SET_QQ_MUSIC_GAME |
QQ、騰訊音樂及遊戲 | "QQ音樂"、"騰訊音樂"、"QQ遊戲" | |
SITE_SET_CHANNELS |
微信影片號 | "影片號" | |
SITE_SET_WECHAT_PLUGIN |
微信新聞外掛 | "微信外掛"、"微信新聞外掛" | |
SITE_SET_SEARCH_SCENE |
搜尋場景 | "搜尋"、"搜尋場景" | |
SITE_SET_WECHAT_SEARCH |
微信搜一搜 | "微信搜尋"、"搜一搜" | ⚠️ 僅支援搜尋廣告 |
SITE_SET_QBSEARCH |
QQ瀏覽器等搜尋 | "QQ瀏覽器搜尋" | ⚠️ 僅支援搜尋廣告 |
SITE_SET_SEARCH_MOBILE_UNION |
騰訊廣告聯盟搜尋 | "聯盟搜尋" |
⛔
site_set列舉值只允許使用上表第一列的 key,禁止自行從中文翻譯構造列舉名。 指令碼返回什麼就用什麼。⚠️ 標註"僅支援搜尋廣告"的版位(
SITE_SET_WECHAT_SEARCH、SITE_SET_QBSEARCH)在非搜尋場景下不可使用,不要將其加入普通展示廣告的site_set。
| 一級分類名稱 | 包含的版位列舉值 | 常見說法 |
|---|---|---|
| 微信影片號 | SITE_SET_CHANNELS |
"影片號" |
| 微信朋友圈 | SITE_SET_MOMENTS |
"朋友圈" |
| 微信公眾號與小程式 | SITE_SET_WECHAT、SITE_SET_WECHAT_PLUGIN |
"公眾號"、"小程式"、"公眾號與小程式" |
| 騰訊平臺與內容媒體(PCAD) | SITE_SET_KANDIAN、SITE_SET_QQ_MUSIC_GAME、SITE_SET_TENCENT_NEWS、SITE_SET_TENCENT_VIDEO |
"騰訊平臺"、"內容媒體"、"騰訊平臺與內容媒體"、"PCAD" |
| 騰訊廣告聯盟 | SITE_SET_MOBILE_UNION |
"優量匯"、"聯盟"、"廣告聯盟" |
| 應用寶 | SITE_SET_MOBILE_YYB |
"應用寶" |
| 騰訊廣告電腦端(PC) | SITE_SET_PCQQ |
"QQ"、"PC QQ"、"電腦端" |
| 微信搜一搜 | SITE_SET_WECHAT_SEARCH |
"微信搜尋"、"搜一搜"(⚠️ 僅搜尋廣告) |
| QQ瀏覽器等 | SITE_SET_QBSEARCH |
"QQ瀏覽器搜尋"(⚠️ 僅搜尋廣告) |
| 騰訊廣告聯盟搜尋 | SITE_SET_SEARCH_MOBILE_UNION |
"聯盟搜尋" |
| 搜尋場景 | SITE_SET_SEARCH_SCENE |
"搜尋場景" |
automatic_site_enabled: false + site_set 陣列(來自指令碼返回的 available_site_set 或使用者指定,按上表對映)automatic_site_enabled: true,site_set 不傳get-conversions.mjs 的 site_set 引數規則(僅 oCPM/oCPC 需關注,CPC/CPM 跳過)⛔
site_set只能包含available_site_set中存在的版位。 必須傳入使用者最終選擇的版位列表(即手動版位場景下用於adgroups/add的site_set,自動版位場景下傳auto_site_set),要根據使用者實際選擇的版位傳入,不要盲目傳完整的available_site_set**。
| 場景 | get-conversions.mjs 的 site_set |
|---|---|
| 自動版位 | 傳 auto_site_set 完整陣列原樣傳入,不要只傳使用者提到的"優先版位" |
| 手動版位 | 傳 使用者指定版位 ∩ available_site_set(取交集) |
⚠️ 使用者說的"優先版位"(如"優先影片號")≠
site_set引數。"優先版位"影響的是priority_site_set,而get-conversions.mjs的site_set是查詢範圍,自動版位時必須傳auto_site_set全量。
❌ 典型錯誤:自動版位時只傳了 ["SITE_SET_CHANNELS"](使用者的優先版位)→ 應傳 auto_site_set 全量。
步驟 3 完成後你應該有:版位模式(自動/手動)+ 供步驟 4 使用的 site_set(oCPM/oCPC 時:自動版位 = auto_site_set 全量,手動版位 = 使用者指定 ∩ available_site_set;CPC/CPM + 自動版位時無需 site_set)。
scene_spec,可選)
scene_spec是請求體根層級欄位(與targeting並列),用於對已選版位內的流量做精細篩選。 預設"不限"(不傳),僅在使用者明確提到定投/遮蔽特定流量場景時才構造。
場景定向完整欄位(以下欄位均放在 scene_spec: { ... } 物件內):
| 場景維度 | scene_spec 內的欄位 |
型別 | 說明 | 獲取方式 |
|---|---|---|---|---|
| 聯盟場景定向 | mobile_union |
enum[] | 騰訊廣告聯盟流量場景定向(如資訊流原生、開屏等) | ✅ get-enum-options.mjs '{"fields":["scene_spec_mobile_union"]}' |
| 聯盟場景遮蔽 | exclude_mobile_union |
enum[] | 聯盟流量場景遮蔽 | ✅ get-enum-options.mjs '{"fields":["scene_spec_exclude_mobile_union"]}' |
| 聯盟自定義定投 | union_position_package |
integer[] | 定投聯盟流量包 ID 列表 | 使用者提供流量包 ID |
| 聯盟自定義遮蔽 | exclude_union_position_package |
integer[] | 遮蔽聯盟流量包 ID 列表 | 使用者提供流量包 ID |
| 聯盟媒體型別 | mobile_union_category |
integer[] | 聯盟媒體型別場景定向 ID | 使用者提供 |
| 騰訊新聞場景 | tencent_news |
enum[] | 騰訊新聞流量場景 | ✅ get-enum-options.mjs '{"fields":["scene_spec_tencent_news"]}' |
| 廣告展示場景 | display_scene |
enum[] | 廣告展示場景 | ✅ get-enum-options.mjs '{"fields":["scene_spec_display_scene"]}' |
| QQ瀏覽器場景 | qbsearch_scene |
enum[] | QQ瀏覽器、應用寶流量場景 | ✅ get-enum-options.mjs '{"fields":["scene_spec_qbsearch_scene"]}' |
| PC端定投 | pc_scene |
enum[] | PC端定投場景 | ✅ get-enum-options.mjs '{"fields":["scene_spec_pc_scene"]}' |
| 搜一搜場景 | wechat_search_scene |
enum[] | 搜一搜流量場景 | ✅ get-enum-options.mjs '{"fields":["scene_spec_wechat_search_scene"]}' |
| 微信公眾號小程式定投 | wechat_position |
integer[] | 定投指定公眾號/小程式的 ID 列表 | 使用者提供 |
| 影片號定投 | wechat_channels_scene |
integer[] | 定投指定影片號的 ID 列表 | 使用者提供 |
| 微信場景定向 | wechat_scene |
struct | 微信流量細分場景,子欄位見下方 | 使用者提供 |
wechat_scene 子欄位:
| 子欄位 | 型別 | 說明 |
|---|---|---|
official_account_media_category |
integer[] | 公眾號媒體型別 ID |
mini_program_and_mini_game |
integer[] | 小程式/小遊戲流量型別 ID |
pay_scene |
integer[] | 訂單詳情頁消費場景 ID |
構造示例:
定投聯盟流量包 + 遮蔽指定流量包:
"scene_spec": {
"union_position_package": [6001403],
"exclude_union_position_package": [91019]
}
定投指定公眾號 + 聯盟資訊流場景:
"scene_spec": {
"mobile_union": ["MOBILE_UNION_SCENE_IN_FEEDS_NATIVE"],
"wechat_position": [123456, 789012]
}
⚠️ 列舉類欄位(
mobile_union、exclude_mobile_union、tencent_news、display_scene、qbsearch_scene、pc_scene、wechat_search_scene)必須通過get-enum-options.mjs查詢確認列舉值,禁止猜測。 ⚠️ ID 列表類欄位(union_position_package、exclude_union_position_package、wechat_position、mobile_union_category、wechat_channels_scene、wechat_scene子欄位)直接傳使用者給出的 ID。 ⚠️ 使用者未提到任何版位定投場景需求時,不傳scene_spec(等同於 UI 上全部選"不限")。
前置:步驟 1 的四元組 + 步驟 2 的資產 ID + 步驟 3 的 site_set 輸出:
conversion_id(可選)、bid_mode、smart_bid_type、bid_amount(手動出價時)或daily_budget(自動出價時)⚡ 快速路徑:CPC/CPM → 跳過 4B 轉化查詢,只需確定
bid_mode+bid_amount,然後進入步驟 5。
根據使用者意圖確定出價方式:
| 列舉值 | 說明 | 需要 conversion_id |
|---|---|---|
BID_MODE_CPC |
按點選付費 | 否 |
BID_MODE_CPM |
按千次展示付費 | 否 |
BID_MODE_OCPM |
最佳化千次展示出價(推薦) | 是 |
BID_MODE_OCPC |
最佳化點擊出價 | 是 |
核心規則:
1. CPC/CPM:只需 bid_mode + bid_amount,不需要查詢轉化目標,跳過步驟 4B
2. oCPM/oCPC:需 bid_mode + conversion_id,手動出價(CUSTOM)還需 bid_amount
3. 使用者未指定出價方式時,預設使用 BID_MODE_OCPM
smart_bid_type)| 出價方案 | 使用者意圖 | 傳參 |
|---|---|---|
手動出價 CUSTOM(預設) |
給了具體出價金額 / "穩定投放" / 未提及 | smart_bid_type: SMART_BID_TYPE_CUSTOM,bid_amount 必填且 > 0 |
最大轉化量 SYSTEMATIC |
"最大轉化" / "自動出價" / "系統出價" / "優先跑量" | smart_bid_type: SMART_BID_TYPE_SYSTEMATIC,daily_budget 必填且 > 0,不傳 bid_amount |
CPC/CPM 固定走手動出價。oCPM/oCPC 根據使用者意圖選擇,預設手動出價。
SYSTEMATIC(最大轉化量)約束:
1. daily_budget 必填且 > 0,使用者未給時必須向用戶確認
2. bid_amount 不傳
3. 必須是 oCPM/oCPC
4. ⛔ 不能同時開啟:auto_acquisition_enabled、live_recommend_strategy_enabled、aoi_optimization_strategy
控制成本(僅 SYSTEMATIC 可用):
根據是否配置了 ROI 深度最佳化,選擇對應欄位(二選一,互斥):
| 廣告型別 | 判斷條件 | 使用欄位 | 範圍 |
|---|---|---|---|
| 非 ROI | 未配 deep_conversion_type 為 WORTH/WORTH_ADVANCED |
custom_cost_cap(分) |
0 < 值 ≤ 2,000,000 |
| ROI | 配了 deep_conversion_type 為 WORTH 或 WORTH_ADVANCED |
custom_cost_roi_cap(float) |
> 0 |
都需同時傳
cost_constraint_scene: COST_CONSTRAINT_SCENE_OPEN
node scripts/get-conversions.mjs '{"account_id":"<ACCOUNT_ID>","site_set":["<使用者表達的版位>"],"available_site_set":["<步驟3返回的全量可用版位>"],"non_multi_site_set":["<步驟3返回的non_multi_site_set>"],"marketing_carrier_id":"<步驟2返回的載體ID>","asset_id":"<步驟2返回的行業資產ID>","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的列舉值,使用者未提及來源時不傳此引數>"}'
注意:常規廣告不需要傳
delivery_scene。四元組欄位統一傳字串列舉 key,指令碼內部自動轉為數值。bid_mode來自步驟 4A 的出價方式(如BID_MODE_OCPM),用於按出價方式過濾轉化目標。
create_source_type:如果使用者指定了轉化來源,則根據使用者意圖傳入——PLATFORM平臺轉化或SELF_CREATED自建轉化等。使用者未提及來源時不傳此引數。⛔
site_set引數來源:必須嚴格按步驟 3C 的規則傳入——自動版位時傳步驟 3 返回的auto_site_set完整陣列(不是使用者提到的"優先版位"子集),手動版位時傳使用者指定版位與available_site_set的交集。⛔
available_site_set引數:必須同時傳入步驟 3 返回的available_site_set完整陣列(即get-site-set.mjs返回的全量可用版位列表)。指令碼內部會用site_set∩available_site_set取交集,作為防禦性校驗,確保只傳入合法版位。即使你認為site_set已經是正確的子集,也必須傳available_site_set。⛔
non_multi_site_set引數:必須同時傳入步驟 3 返回的non_multi_site_set陣列(不支援多版位組合的版位列表,即site_set_multi=0的版位)。指令碼內部會自動過濾掉這些版位(除非使用者只選了一個版位),避免查詢轉化目標時傳入不支援多版位組合的版位。⛔ 行業產品庫類(步驟 2 返回
asset_type: "INDUSTRY") 傳asset_id!
marketing_carrier_id和asset_id是兩個獨立引數,由指令碼按兩個維度分別決定是否傳給 API: -marketing_carrier_id(→ API 的product_id):傳入flat_params.carrier_id。指令碼根據marketing_carrier_type判斷是否傳:除頁面跳轉 (JUMP_PAGE) 外的載體型別都傳。 -asset_id(→ API 的marketing_asset_id):僅行業產品庫類需要傳(asset_type: "INDUSTRY"時),傳入flat_params.asset_id。ONEID 類和商品庫類不需要傳此欄位。 - 兩者可以都傳、只傳一個、或都不傳,互不排斥。⛔ 特別注意:當
asset_type: "INDUSTRY"時,必須將flat_params.asset_id作為asset_id傳入本指令碼,否則轉化目標查詢可能會失敗!
指令碼已處理:通過 access_status 過濾僅返回已完成接入的轉化目標,標註深度轉化型別,裁剪無關欄位。
返回示例:
{
"goals": [
{
"conversion_id": 12345,
"name": "APP啟用",
"optimization_goal": "OPTIMIZATIONGOAL_APP_ACTIVATE",
"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_1DAY_PURCHASE_ROAS",
"create_source_type": "SELF_CREATED"
}
]
}
Agent 需要做的決策——conversion 選擇規則:
permission=1 的項(指令碼已過濾,但仍需意識到約束)deep_conversion_worth_rate)deep_conversion_type(如 deep_conversion_worth_rate → DEEP_CONVERSION_WORTH)has_deep_conversion=true 且 deep_conversion_type 與 Step B 結果一致的轉化ID。不同 deep_conversion_type 的 conversion_id 不可互換name 欄位匹配SELF_CREATED,"平臺預置"/"平臺轉化"/"平臺上報"/"系統預置"/"預置轉化"→ PLATFORM)→ 在呼叫 get-conversions.mjs 時傳入 create_source_type 過濾;使用者未提及來源時不傳此引數| 欄位 | 型別 | 必填 | 說明 | 如何獲取 |
|---|---|---|---|---|
bid_mode |
enum | 否 | 出價方式 | 使用者提供,預設 BID_MODE_OCPM |
bid_amount |
integer | 手動出價必填 | 出價(單位:分)。CUSTOM 時必填且 > 0;SYSTEMATIC 時不傳 |
"出價5元" → 500 |
conversion_id |
integer | oCPM/oCPC 必填 | 轉化ID | 4B 獲取 |
deep_conversion_spec |
struct | 否 | 深度轉化最佳化配置 | 見下方 |
deep_conversion_behavior_bid |
integer | 否 | 深度OG出價(分)(對應 DEEP_CONVERSION_BEHAVIOR) |
使用者說"深度出價X元"/"深度行為出價"/"深度OG出價" |
deep_conversion_behavior_advanced_bid |
integer | 否 | 深度輔助OG出價(分)(對應 DEEP_CONVERSION_BEHAVIOR_ADVANCED) |
使用者說"深度輔助出價X元"/"深度輔助OG出價" |
deep_conversion_worth_rate |
float | 否 | 深度ROI出價 / 深度轉化價值率(對應 DEEP_CONVERSION_WORTH) |
使用者說"深度ROI X"/"深度轉化價值率X",支援3位小數 |
deep_conversion_worth_advanced_rate |
float | 否 | 深度輔助ROI(對應 DEEP_CONVERSION_WORTH_ADVANCED) |
使用者說"深度輔助ROI X",支援3位小數 |
smart_bid_type |
enum | 是 | SMART_BID_TYPE_CUSTOM(手動出價,預設)或 SMART_BID_TYPE_SYSTEMATIC(最大轉化量)。見 4A-2 決策表 |
根據使用者意圖選擇 |
daily_budget |
integer | 是 | 日預算(分,5000~400000000)。CUSTOM:使用者未提及傳 0(不限);SYSTEMATIC:必填且 > 0,使用者未給時向用戶確認 |
"日預算1000元" → 100000 |
total_budget |
integer | 否 | 總消耗限額(分,0 或 5000~20000000000)。用於限制廣告整個生命週期的總花費上限。0 表示不限制;如需限制則須 > 5000 且 < 20000000000。使用者未提及 → 不傳;使用者提及"總預算X元"/"總消耗限額X元" → 傳 X*100 |
"總預算5000元" → 500000 |
cost_constraint_scene |
enum | 否 | 僅 SYSTEMATIC 可用。傳 COST_CONSTRAINT_SCENE_OPEN 開啟。與下兩欄位聯動(按 ROI/非 ROI 二選一) |
使用者說"成本上限"/"控制成本" |
custom_cost_cap |
integer | 否 | 非 ROI 廣告的成本上限(分,0 < 值 ≤ 2,000,000)。需先開啟 cost_constraint_scene。⛔ ROI 廣告不能傳此欄位 |
"成本上限50元" → 5000 |
custom_cost_roi_cap |
float | 否 | ROI 廣告的期望 ROI(> 0)。需先開啟 cost_constraint_scene。⛔ 非 ROI 廣告不能傳此欄位 |
"成本ROI 1.5" → 1.5 |
user_action_sets |
array | 否 | 使用者行為資料來源 | user_action_sets/get |
oCPM/oCPC 可選配置,前置條件:步驟 4B 的 get-conversions.mjs 返回中,選中的轉化目標 has_deep_conversion=true。
| deep_conversion_type | 說明 |
|---|---|
通過 get-enum-options.mjs '{"fields":["deep_conversion_type"]}' 查詢 |
包含深度行為最佳化、深度價值最佳化等 |
⚠️ 二選一規則:深度/深度輔助出價一級扁平欄位與 deep_conversion_spec 巢狀結構互斥,不能同時傳:
常規廣告使用 conversion_id,因此直接傳一級扁平欄位即可。
一級扁平欄位示例(使用者說"深度ROI 1.5"):
{
"conversion_id": 12345,
"deep_conversion_worth_rate": 1.5
}
deep_conversion_type取自get-conversions.mjs返回,根據型別選用對應的一級出價欄位: -DEEP_CONVERSION_WORTH→deep_conversion_worth_rate(深度ROI出價 / 深度轉化價值率) -DEEP_CONVERSION_WORTH_ADVANCED→deep_conversion_worth_advanced_rate(深度輔助ROI) -DEEP_CONVERSION_BEHAVIOR→deep_conversion_behavior_bid(深度OG出價) -DEEP_CONVERSION_BEHAVIOR_ADVANCED→deep_conversion_behavior_advanced_bid(深度輔助OG出價)⛔ 不同
deep_conversion_type的 conversion_id 不可互換。例如DEEP_CONVERSION_WORTH對應的 conversion_id 和DEEP_CONVERSION_WORTH_ADVANCED對應的是不同的 conversion_id,必須根據指令碼返回的deep_conversion_type精確選擇。
強約束:
- conversion_id 只能來自:使用者明確給出的 ID,或 get-conversions.mjs 返回
- 白名單例外:使用者在原始需求中已明確給出完整的 conversion_id 數值 ID,則直接使用
- CPC/CPM 出價不需要 conversion_id
- optimization_goal 不需要傳,API 會根據 conversion_id 自動推導
步驟 4 完成後你應該有:bid_mode、smart_bid_type、conversion_id(oCPM/oCPC時);CUSTOM 還有 bid_amount,SYSTEMATIC 還有 daily_budget。
前置:使用者意圖中的定向需求 輸出:
targeting、begin_date、end_date、delivery_time_ranges
常規廣告擁有完整定向能力,支援地域、年齡、性別、興趣、行為、人群包等多維度定向。
定向查詢觸發規則(命中任一項就必須先呼叫 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 等。年齡和性別不需要編碼查詢,直接用結構化值。
只有在以下情況才可跳過定向查詢:使用者完全沒有給任何地域或裝置定向約束。
⚠️ 通投(不限定向)時仍需傳
targeting: {}(空物件),不要省略該欄位。
地域編碼查詢:
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 |
✅ get-targeting-lookup.mjs type:geo + 列舉查詢 location_types |
| 地域優選 | geo_location.geo_location_auto_audience |
是否使用地域優選(boolean)。true=開啟,系統自動擴充套件相似地域;使用者未提及不傳 |
❌ 直接傳 boolean |
| 商圈 | 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 時可用) | ❌ 查列舉後直接構造 |
| 遊戲消費能力 | game_consumption_level |
列舉查詢 | ❌ 查列舉後直接構造 |
| 自定義人群 | 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"}' # 定向相關
node scripts/get-enum-options.mjs '{"category":"scene_spec"}' # 場景定向
node scripts/get-enum-options.mjs '{"category":"bid"}' # 出價相關
node scripts/get-enum-options.mjs '{"category":"conversion"}' # 轉化相關
node scripts/get-enum-options.mjs '{"category":"strategy"}' # 探索策略
node scripts/get-enum-options.mjs '{"category":"switch"}' # 開關類
可查詢的列舉欄位包括但不限於: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、bid_mode、smart_bid_type、deep_conversion_type、deep_conversion_goal、exploration_strategy、search_expand_targeting_switch、search_expansion_switch、cost_constraint_scene、configured_status、ecom_pkam_switch、smart_coupon_mode、live_recommend_strategy_enabled、dynamic_ad_type、short_play_pay_type、smart_targeting_mode、adx_realtime_type、game_consumption_level、conversion_behavior_list 等。
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 是必填欄位:即使使用者沒有明確表達任何定向需求,也必須傳 targeting: {}(空物件),不能省略該欄位
- targeting 及其子結構只傳上方表格中列出的欄位和子欄位,不要自行推測或類推新增文件中未出現的欄位
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"]
}
}
}
無定向需求(通投)時傳空物件:"targeting": {}
| 欄位 | 型別 | 必填 | 說明 |
|---|---|---|---|
begin_date |
string | 是 | 開始日期,格式 YYYY-MM-DD |
end_date |
string | 是 | 結束日期,格式 YYYY-MM-DD;未指定傳 ""(長期投放) |
first_day_begin_time |
string | 否 | 首日開始投放時間,格式 HH:ii:ss(如 "10:00:00") |
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
- "排除週三下午" → 列出除週三下午外的所有時段,這時候agent需要列出其他有效的時段
步驟 5 完成後你應該有:targeting(如需)、begin_date、end_date、delivery_time_ranges。
前置:步驟 1-5 的所有輸出 動作:按檢查清單組裝完整請求體,呼叫
create-adgroup.mjs
| 模式 | 欄位設定 |
|---|---|
| 自動版位(推薦) | automatic_site_enabled: true,不傳 site_set |
| 手動版位 | automatic_site_enabled: false + site_set: [...] |
| 自動版位 + 優先版位 | automatic_site_enabled: true + priority_site_set: [...],不傳 site_set |
⚠️
priority_site_set(優先版位集合):當automatic_site_enabled: true且使用者同時指定了"優先投放某些版位"時使用。填入使用者指定的版位列舉陣列(參考步驟 3B 列舉表),系統會在自動版位的基礎上優先在這些版位投放。
smart_delivery_platform — 這是常規廣告,不是智投optimization_goal — API 會根據 conversion_id 自動推導,無需傳此欄位exploration_strategy — 版位探索策略,列舉值通過 get-enum-options.mjs '{"fields":["exploration_strategy"]}' 查詢創意通過 dynamic_creatives/add 介面單獨建立,adgroup 級別可傳以下控制欄位:
| 欄位 | 型別 | 說明 |
|---|---|---|
auto_derived_creative_enabled |
boolean | 創意增強 MAX 開關,推薦 true |
auto_derived_creative_preference |
struct | 創意增強 MAX 偏好設定,auto_derived_creative_enabled 為 true 時可傳,子欄位 auto_derived_creative_method_type_list 為 AutoDerivedCreativeMethodType 列舉陣列,指令碼自動匹配 |
auto_derived_landing_page_switch |
boolean | 是否開啟自動衍生落地頁開關 |
在組裝完請求體後、真正呼叫建立介面前,逐項核對以下內容: - 使用者需求一致性:使用者明確給出的每個條件(定向、出價、預算、三元組、商品等)是否都被原樣保留在請求體中,未被丟棄、修改或替換 - 欄位來源可追溯:四元組、轉化目標、營銷載體等關鍵欄位是否來自實際指令碼查詢結果(而非猜測或編造) - 編碼已確認:定向條件中的地域編碼、裝置 ID 等是否經過查詢指令碼確認 - 金額單位正確:所有金額欄位是否已轉換為分
如有任何欄位與使用者原始需求不一致,必須停止並說明差異原因,等待使用者確認後才能繼續。
欄位檢查清單:
| # | 檢查項 | 要點 |
|---|---|---|
| 1 | account_id |
廣告主賬號ID |
| 2 | adgroup_name |
使用者提供的原文名稱,不要編造 |
| 3 | 四元組 | marketing_goal、marketing_sub_goal、marketing_target_type、marketing_carrier_type — 統一使用字串列舉 key,create-adgroup.mjs 指令碼內部自動轉換。預設全部從步驟 1 的指令碼返回中選出 |
| 4 | 資產+載體(⚠️ 直接透傳 flat_params,指令碼自動組裝) |
將 flat_params 中的欄位(asset_id、carrier_id、catalog_id、asset_sub_id、sub_carrier_id 等)直接傳入即可。指令碼根據 marketing_target_type 自動組裝 marketing_asset_outer_spec 或 marketing_asset_id,根據 marketing_carrier_type 自動組裝 marketing_carrier_detail。 ⛔ carrier_id ≠ asset_id,兩者來源不同,指令碼會校驗並拒絕相同值。⛔ 無 flat_params(步驟 2 / 1A 均未成功)→ 必須回步驟 2 補跑 get-assets.mjs,禁止直接呼叫本指令碼。 |
| 5 | 資產+載體(舊方式,仍相容) | 也可直接傳 marketing_asset_outer_spec / marketing_asset_id / marketing_carrier_detail,指令碼原樣透傳。但推薦使用上方扁平 ID 方式以避免組裝錯誤 |
| 6 | bid_mode |
CPC / CPM / oCPM / oCPC |
| 7 | bid_amount |
CUSTOM:必填且 > 0,單位分;SYSTEMATIC(最大轉化):不傳 |
| 8 | optimization_goal |
不需要傳,API 根據 conversion_id 自動推導 |
| 9 | conversion_id |
僅當步驟 4 返回真實值或使用者明確給出時才傳;不要填 0 |
| 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 | automatic_site_enabled / site_set |
自動版位 = true 不傳 site_set;手動 = false + site_set 陣列,列舉值只用步驟 3B 表格中的 key,不要自行構造。搜尋場景必須用 SITE_SET_SEARCH_SCENE,嚴停用 SITE_SET_SEARCH |
| 13 | targeting 來源 |
只要使用者給了任何定向約束,就必須來自步驟 5 查詢或明確特例;不要用粗粒度佔位值代替 |
| 14 | scene_spec |
版位定投場景(步驟 3D),使用者提到定投/遮蔽特定流量場景時按 3D 表格構造;使用者未提及 → 不傳。列舉類子欄位必須通過 get-enum-options.mjs 查詢,ID 類子欄位直接傳使用者給的 ID |
| 15 | auto_acquisition_enabled / auto_acquisition_budget |
使用者說"開啟一鍵起量"時傳 true + 預算(單位分);未提及不傳。⛔ SYSTEMATIC(最大轉化/自動出價)時不可使用 |
| 16 | search_expansion_switch |
搜尋擴量開關(⚠️ 不是搜尋定向拓展),列舉通過 get-enum-options.mjs '{"fields":["search_expansion_switch"]}' 查詢;未提及不傳 |
| 17 | search_expand_targeting_switch |
搜尋定向拓展開關(⚠️ 不是搜尋擴量),前置條件:僅當 search_expansion_switch = SEARCH_EXPANSION_SWITCH_OPEN(即搜尋擴量已開啟)時才可開啟;列舉通過 get-enum-options.mjs '{"fields":["search_expand_targeting_switch"]}' 查詢;未提及不傳 |
| 18 | daily_budget |
CUSTOM:使用者未提及傳 0(不限);SYSTEMATIC:必填且 > 0;不要省略此欄位 |
| 19 | wechat_ad_behavior |
使用者提到微信廣告行為排除時,通過 get-enum-options.mjs 查詢列舉後構造;使用者未提及 → 不傳 |
| 20 | 定向列舉值 | education、network_type、device_price、excluded_dimension、excluded_day 等定向列舉必須通過 get-enum-options.mjs 查詢確認,禁止憑記憶猜測 |
| 21 | priority_site_set |
若傳了 exploration_strategy: STEADY_EXPLORATION,則 priority_site_set 為必填陣列 |
| 22 | feedback_id |
監測連結組 ID(integer,非必填)。在 DataNexus 中維護,使用者給了就直接傳數字 ID;使用者未提及 → 不傳。⚠️ ADX 程式化廣告不可填寫 |
| 23 | cost_constraint_scene 等 |
僅 SYSTEMATIC(最大轉化)可用。非 ROI 廣告用 custom_cost_cap(分),ROI 廣告用 custom_cost_roi_cap(float),兩者互斥不能同時傳。使用者未提及不傳 |
| 24 | configured_status |
廣告初始狀態,指令碼預設 AD_STATUS_SUSPEND(暫停)。使用者明確要求上線/啟用時傳 AD_STATUS_NORMAL。列舉通過 get-enum-options.mjs '{"fields":["configured_status"]}' 查詢 |
| 25 | ecom_pkam_switch |
一方人群跑量加強開關(電商場景),列舉通過 get-enum-options.mjs '{"fields":["ecom_pkam_switch"]}' 查詢。ECOM_PKAM_SWITCH_OPEN=開啟,ECOM_PKAM_SWITCH_CLOSE=關閉。使用者未提及不傳 |
| 26 | smart_coupon_mode |
小店智券開關(微信小店電商場景),列舉通過 get-enum-options.mjs '{"fields":["smart_coupon_mode"]}' 查詢。SWITCH_STATUS_ON=開啟,SWITCH_STATUS_OFF=關閉。使用者未提及不傳 |
| 27 | smart_targeting_mode |
智慧定向模式。SMART_TARGETING_MANUAL(手動定向)=不使用/關閉智慧定向,SMART_TARGETING_AUTO(智慧定向)=開啟/使用智慧定向。列舉通過 get-enum-options.mjs '{"fields":["smart_targeting_mode"]}' 查詢。使用者未提及不傳 |
| 28 | dynamic_ad_type |
動態廣告型別(DPA/DCA 場景),列舉通過 get-enum-options.mjs '{"fields":["dynamic_ad_type"]}' 查詢。如 DYNAMIC_AD_TYPE_DYNAMIC_PRODUCT=動態商品廣告,DYNAMIC_AD_TYPE_DYNAMIC_CONTENT=動態內容廣告。使用者未提及不傳 |
| 29 | short_play_pay_type |
短劇付費型別(短劇推廣場景),列舉通過 get-enum-options.mjs '{"fields":["short_play_pay_type"]}' 查詢。SHORT_PLAY_PAY_TYPE_FREE_PLAY=免費劇,SHORT_PLAY_PAY_TYPE_CHARGE_PLAY=收費劇。使用者未提及不傳 |
| 30 | rta_id / rta_target_id |
RTA 投放:rta_id=RTA 客戶 ID(integer),rta_target_id=RTA 策略 ID(string)。使用者給了就直接傳;未提及不傳 |
| 31 | dsp_id |
ADX 程式化廣告 DSP ID(integer)。使用者給了就直接傳;未提及不傳 |
| 32 | adx_realtime_type |
ADX 素材即時回覆型別,列舉通過 get-enum-options.mjs '{"fields":["adx_realtime_type"]}' 查詢。如 ADX_REALTIME_TYPE_NO_AUDIT=免審廣告。僅 ADX 場景使用;使用者未提及不傳 |
| 33 | sell_strategy_id |
售賣策略 ID(integer)。使用者給了就直接傳;未提及不傳 |
| 34 | live_recommend_strategy_enabled |
直播種草人群探索開關(直播電商場景),列舉通過 get-enum-options.mjs '{"fields":["live_recommend_strategy_enabled"]}' 查詢。使用者未提及不傳 |
| 35 | poi_list |
門店 ID 列表(string[],本地生活場景)。使用者給了就直接傳;未提及不傳 |
| 36 | enable_steady_exploration |
是否穩步探索更多版位(boolean)。使用者提到"穩步探索"時傳 true;未提及不傳 |
| 37 | mpa_spec |
動態商品廣告屬性(DPA),當 dynamic_ad_type = DYNAMIC_AD_TYPE_DYNAMIC_PRODUCT 時必填。ADX 不可用。結構:{"recommend_method_ids": [<推薦方式ID>], "product_catalog_id": "<商品庫ID>", "product_series_id": "<商品集合ID>"}。其中 recommend_method_ids(integer[],1~16個)必填,product_catalog_id(string)和 product_series_id(string)選填。使用者未提及 DPA 不傳 |
| 38 | dca_spec |
動態內容廣告屬性(DCA),當 dynamic_ad_type = DYNAMIC_AD_TYPE_DYNAMIC_CONTENT 時可設定。結構:{"recommend_method_ids": [95], "set_id": "<素材集合ID>"}。recommend_method_ids(integer[],目前僅支援 RTA優選=95,需申請許可權),set_id(string,素材集合 ID)。使用者未提及 DCA 不傳 |
| 39 | aoi_optimization_strategy |
高價值範圍探索(灰度功能,需聯絡客戶運營開通)。ADX 不可用。結構:{"aoi_optimization_strategy_enabled": true, "aoi_id_list": [<AOI區域ID>]}。aoi_optimization_strategy_enabled(boolean)必填,aoi_id_list(integer[],最多1000個)選填。使用者未提及不傳 |
| 40 | additional_product_spec |
附加商品屬性(電商多商品場景)。ADX 不可用。結構:{"product_catalog_id": "<商品庫ID>", "product_outer_id": "<商品ID>"}。兩個欄位均為 string 且必填。使用者未提及不傳 |
| 41 | total_budget |
總消耗限額(分,0=不限,限制時須 > 5000 且 < 20000000000),使用者未提及 → 不傳 |
| 42 | material_package_id(素材標籤) |
使用者提及素材標籤/素材包時按 references/material-labels.md 取值;未提及 → 不傳。ADX 不可填寫 |
> ⚠️ 定向欄位禁止自行新增: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向用戶說明原因。
| 使用者輸入 | 對應欄位 | 轉換規則 |
|---|---|---|
| 營銷目的相關 | marketing_goal |
從步驟 1 指令碼返回中選取,禁止猜測 |
| "CPC出價"/"按點選" | bid_mode |
→ BID_MODE_CPC(不需要步驟 4B/5) |
| "CPM"/"千次展示" | bid_mode |
→ BID_MODE_CPM(不需要步驟 4B/5) |
| "oCPM"/"最佳化千展" | bid_mode |
→ BID_MODE_OCPM(需要步驟 4B/5) |
| "oCPC"/"最佳化點選" | bid_mode |
→ BID_MODE_OCPC(需要步驟 4B/5) |
| "出價5元" | bid_amount |
→ 500(×100,分) |
| "日預算1000元" | daily_budget |
→ 100000(×100,分) |
| 未提及日預算 | daily_budget |
→ 0(不限日預算,必須傳) |
| "總預算5000元"/"總消耗限額5000元" | total_budget |
→ 500000(×100,分);0=不限,限制時須 > 5000 且 < 20000000000 |
| "深度ROI 1.5"/"深度轉化價值率X" | deep_conversion_worth_rate |
→ 1.5,選 deep_conversion_type=DEEP_CONVERSION_WORTH 的轉化ID(⚠️ 不是"深度輔助最佳化"那個) |
| "深度輔助ROI X" | deep_conversion_worth_advanced_rate |
→ 選 deep_conversion_type=DEEP_CONVERSION_WORTH_ADVANCED 的轉化ID(名稱含"深度輔助最佳化") |
| "深度出價X元"/"深度行為出價"/"深度OG出價" | deep_conversion_behavior_bid |
→ 金額×100 轉分,選 deep_conversion_type=DEEP_CONVERSION_BEHAVIOR 的轉化ID |
| "深度輔助出價X元"/"深度輔助OG出價" | deep_conversion_behavior_advanced_bid |
→ 金額×100 轉分,選 deep_conversion_type=DEEP_CONVERSION_BEHAVIOR_ADVANCED 的轉化ID |
| "投朋友圈" | site_set |
→ ["SITE_SET_MOMENTS"],手動版位 |
| "PCAD"/"騰訊平臺與內容媒體" | site_set |
→ ["SITE_SET_KANDIAN", "SITE_SET_QQ_MUSIC_GAME", "SITE_SET_TENCENT_NEWS", "SITE_SET_TENCENT_VIDEO"](按步驟 3B 一級分類展開) |
| "自動版位" | automatic_site_enabled |
→ true |
| "全國投放"/"不限地域" | targeting.geo_location |
不傳 geo_location |
| "排除X省"/"不投X省"/"除X外全國" | targeting.geo_location |
→ 先調 get-geo-exclude.mjs 獲取剩餘省份 keyword,再調 get-targeting-lookup.mjs 查編碼,組成 regions 陣列 |
| 指定省市 | 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 |
→ 按定向規則填寫 |
| 廣告名稱 | adgroup_name |
按使用者原文 |
| "開啟一鍵起量" | auto_acquisition_enabled |
→ true;同時需要起量預算 |
| "起量預算200元" | auto_acquisition_budget |
→ 20000(×100,分) |
| "搜尋場景" | site_set |
→ 包含 SITE_SET_SEARCH_SCENE |
| "開啟/關閉搜尋定向拓展" | search_expand_targeting_switch |
→ SEARCH_EXPAND_TARGETING_SWITCH_OPEN / CLOSE(⚠️ 不是搜尋擴量) |
| "開啟/關閉搜尋擴量" | search_expansion_switch |
→ SEARCH_EXPANSION_SWITCH_OPEN / CLOSE(⚠️ 不是搜尋定向拓展) |
| "關閉自動版位" | automatic_site_enabled |
→ false + 手動指定 site_set 陣列 |
| "開啟自動版位,優先投X/Y/Z" | automatic_site_enabled + priority_site_set |
→ automatic_site_enabled: true + priority_site_set: ["SITE_SET_X", ...];不傳 site_set |
| 排除小遊戲註冊使用者(N天未活躍) | targeting.wechat_ad_behavior |
→ {"excluded_actions": ["MINI_GAME_WECHAT_REGISTERED"], "mini_game_wechat_registered_activity": "THIRTY_DAYS_NO_ACTIVE"} |
| "搜尋關鍵詞:遊戲下載" | search_bidwords |
→ 構造 search_bidword 陣列,詳見 7F 說明 |
| "穩步探索版位" | exploration_strategy |
→ STEADY_EXPLORATION,⚠️ 必須同時傳 priority_site_set,否則建立失敗 |
| "優先投朋友圈和影片號" | priority_site_set |
→ ["SITE_SET_WECHAT_MOMENTS", "SITE_SET_CHANNELS"](僅 STEADY_EXPLORATION 時);若使用者未指定具體優先版位,用 site_set 全量值 |
| "監測連結組ID 12345"/"feedback_id 12345" | feedback_id |
→ 12345(直接使用使用者給出的數字 ID,integer 型別) |
| "成本上限X元" | cost_constraint_scene + custom_cost_cap |
→ 僅 SYSTEMATIC。COST_CONSTRAINT_SCENE_OPEN + custom_cost_cap: X*100(分)。⛔ ROI 廣告改用 custom_cost_roi_cap |
| "成本ROI上限 X" | cost_constraint_scene + custom_cost_roi_cap |
→ 僅 SYSTEMATIC + ROI 廣告。COST_CONSTRAINT_SCENE_OPEN + custom_cost_roi_cap: X |
| "穩定投放"/"均勻投放" | smart_bid_type |
→ SMART_BID_TYPE_CUSTOM(手動出價) |
| "最大轉化"/"優先跑量"/"自動出價"/"系統出價" | smart_bid_type |
→ SMART_BID_TYPE_SYSTEMATIC(最大轉化),daily_budget 必填且 > 0,不傳 bid_amount |
| "開啟/關閉一方人群跑量加強"/"開啟/關閉PKAM" | ecom_pkam_switch |
→ ECOM_PKAM_SWITCH_OPEN / ECOM_PKAM_SWITCH_CLOSE,列舉通過 get-enum-options.mjs '{"fields":["ecom_pkam_switch"]}' 查詢 |
| "開啟/關閉小店智券"/"開啟/關閉智慧優惠券" | smart_coupon_mode |
→ SWITCH_STATUS_ON / SWITCH_STATUS_OFF,列舉通過 get-enum-options.mjs '{"fields":["smart_coupon_mode"]}' 查詢 |
| "手動定向"/"不使用智慧定向"/"不開啟智慧定向"/"關閉智慧定向" | 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"]}' 查詢 |
| "動態商品廣告"/"DPA" | dynamic_ad_type |
→ DYNAMIC_AD_TYPE_DYNAMIC_PRODUCT,列舉通過 get-enum-options.mjs '{"fields":["dynamic_ad_type"]}' 查詢 |
| "動態內容廣告"/"DCA" | dynamic_ad_type |
→ DYNAMIC_AD_TYPE_DYNAMIC_CONTENT |
| "短劇免費"/"免費劇" | short_play_pay_type |
→ SHORT_PLAY_PAY_TYPE_FREE_PLAY,列舉通過 get-enum-options.mjs '{"fields":["short_play_pay_type"]}' 查詢 |
| "短劇收費"/"收費劇"/"付費劇" | short_play_pay_type |
→ SHORT_PLAY_PAY_TYPE_CHARGE_PLAY |
| "RTA客戶ID 12345"/"rta_id 12345" | rta_id |
→ 12345(直接傳 integer) |
| "RTA策略ID abc"/"rta_target_id abc" | rta_target_id |
→ "abc"(直接傳 string) |
| "DSP ID 12345"/"dsp_id 12345" | dsp_id |
→ 12345(ADX 程式化廣告場景,直接傳 integer) |
| "ADX免審"/"免審廣告" | adx_realtime_type |
→ ADX_REALTIME_TYPE_NO_AUDIT,列舉通過 get-enum-options.mjs '{"fields":["adx_realtime_type"]}' 查詢 |
| "售賣策略ID 12345" | sell_strategy_id |
→ 12345(直接傳 integer) |
| "開啟直播種草"/"直播種草人群探索" | live_recommend_strategy_enabled |
→ true(boolean),列舉通過 get-enum-options.mjs '{"fields":["live_recommend_strategy_enabled"]}' 查詢參考 |
| "門店ID xxx"/"poi_list" | poi_list |
→ ["xxx"](string 陣列,本地生活場景直接傳使用者給出的門店 ID 列表) |
| "廣告暫停建立"/"建立後暫停" | configured_status |
→ AD_STATUS_SUSPEND(當前已為預設值,無需額外傳入) |
| "廣告上線建立"/"建立後啟用"/"建立後上線" | configured_status |
→ AD_STATUS_NORMAL,覆蓋預設暫停行為 |
| "轉化來源/自建轉化/平臺預置" | create_source_type |
→ CreateSourceType,列舉通過 get-enum-options.mjs '{"fields":["create_source_type"]}' 查詢 |
| "素材包/素材標籤 ID 1234" | material_package_id |
按 references/material-labels.md 取值;未提及不傳。⛔ ADX 不可填寫 |
| --- |
四元組的全部10個欄位(營銷內容:
marketing_goal、marketing_sub_goal、marketing_carrier_type、marketing_target_type;轉化/最佳化目標:optimization_goal、deep_behavior_optimization_goal、deep_behavior_advanced_goal、deep_worth_optimization_goal、deep_worth_advanced_goal、forward_link_assist)必須從get-rules.mjs返回的combinations中選取,禁止自行編造或語義改寫。 例如MARKETING_CARRIER_TYPE_MINI_GAME、MARKETING_GOAL_APP_MONETIZATION、MARKETING_CARRIER_TYPE_APP這類"看起來合理但 API 不存在"的值,會直接導致報錯。marketing_sub_goal只能原樣複用get-rules.mjs返回的 key,不能因為使用者說了"註冊"/"下載"就改寫成自造列舉。
|---------------|----------|
| 使用者增長(APP下載/拉新/註冊/啟用/付費/遊戲推廣 A| MARKETING_GOAL_USER_GROWTH |
| 商品銷售 電商/賣貨/成交/GMV/ROI | MARKETING_GOAL_PRODUCT_SALES |
| 線索留資 表單/留資/線索收集 | MARKETING_GOAL_LEAD_RETENTION |
| 品牌推廣 品牌/曝光 | MARKETING_GOAL_BRAND_PROMOTION |
| 漲粉互動 漲粉/加關注 | MARKETING_GOAL_INCREASE_FANS_INTERACTION |
完整值域以
get-rules.mjs返回為準,下表僅幫助區分易混淆項。
| 列舉 key | 含義 | ⚠️ 易混淆提示 |
|---|---|---|
MARKETING_TARGET_TYPE_WECHAT_WORK |
企業微信 | 僅"推廣企微"時選;"掃碼加微信"不是企微 |
MARKETING_TARGET_TYPE_STORE |
平臺店鋪 | ≠ 個人店鋪,≠ 本地門店,≠ 微信小店 |
MARKETING_TARGET_TYPE_LOCAL_STORE |
本地門店 | ≠ 平臺店鋪 |
MARKETING_TARGET_TYPE_CONSUMER_PRODUCT |
商品(商品庫) | 使用者說"商品庫"時選此項,≠ 微信小店商品,≠ PRODUCT |
MARKETING_TARGET_TYPE_WECHAT_STORE_PRODUCT |
微信小店商品 | 推廣單個商品;≠ WECHAT_STORE(店鋪級) |
MARKETING_TARGET_TYPE_WECHAT_STORE |
微信小店店鋪 | 推廣整個店鋪;≠ WECHAT_STORE_PRODUCT,≠ STORE |
MARKETING_TARGET_TYPE_PRODUCT |
教育產品 | ⚠️ 不是通用"商品",通用商品用 CONSUMER_PRODUCT |
MARKETING_TARGET_TYPE_TRAFFIC |
汽車商品 | ⚠️ 不是"流量" |
| --- |
0 不是預設值:它們通常表示"你沒有拿到真實結果",不要拿來偽裝步驟已完成"MARKETING_GOAL_USER_GROWTH"),指令碼內部負責轉為 API 所需數值trace_id這個 Skill 功能很全面,能處理騰訊廣告常規投放的各種場景,文件寫得很詳細,指令碼工具也比較實用。但文件太長太複雜,步驟多、規則多,新手不容易上手。部分說明存在重複,理解起來有門檻。整體質量不錯,適合有一定經驗的投放人員使用。