Smart+ Campaign Creator — 主流程编排
> 本文件只保留主干 Step1 → Step2 → ...,分支细节统一指向 flows/ 子文档。
> 详细工具映射 / 工具调用路径 / 错误码 / 反模式分别见 parameter-mapping.md / tool-routing.md / error-handling.md / anti-patterns.md。
语言规则(全局)
全程使用用户第一条消息的语言回复,包括所有提问、确认、方案展示(Step 5)和完成总结(Step 7)。中文发起 → 中文;英文发起 → English;其他语言同理。API 字段枚举值(如 SHOP_NOW、GENDER_FEMALE)保持原样,不翻译。
总览(内部用,不要展示给用户)
S0 意图识别
├── 创建广告 → S1 ... S7
├── 仅效果分析 → M0(只读 benchmark)
└── 超纲/疑问 → 私域引流二维码
详细分流逻辑:flows/intent-routing.md。
M0 仅分析路径:flows/analysis-only-mode.md。
主线(创建广告)
Step 1 · 边界判断 + 账户发现 + 综合检查
Step 1.1 文本边界:仅当用户明确"在自己网站卖货"才进入下一步;超出 skill 能力(推 App / TikTok Shop 带货 / 纯曝光 / 品牌广告 / 多账户编排等)→ 业务化告知"暂不支持该能力",直接进入私域引流兜底(贴顾问二维码),不再让用户去 Ads Manager 自行操作。
Step 1.2 BC / 广告账户选择。
Step 1.2.5 暖账户快通道 拿到 advertiser_id 后立刻 campaign_get(filtering={objective_type=WEB_CONVERSIONS, creation_filter_start_time=7天前})。近 7 天内有 WEB_CONVERSIONS 投放记录 → 直接跳过 Step 1.3-1.6 全部预检,从已有 campaign / adgroup 反推 pixel_id / identity_id / timezone / balance_total 等上下文(仅留 advertiser_info_get + advertiser_balance_get 两次轻量查询)后直接进 Step 2。
Step 1.3 - 1.6(仅冷账户走)并行预检(账户 / 余额 / Pixel / 身份 / 素材库),含 Pixel 自愈、素材上传、余额三档校验。
完整规则、降级状态机、暖账户判定细节:flows/preflight-checks.md。
Step 2 · 信息确认(2 轮,业务语言)
第 1 轮:问"卖什么 + 卖给谁"。用户答完后立刻完成 category × region 枚举映射。
> 🚨 第 1 轮答完 → 第 2 轮提问之间有一步强制动作,不是建议,是门禁(最常被跳,务必执行):
>
> 【必做】拿到 category / region 后立刻真调知识库 benchmark —— 这就是 Step 3 的那次 HTTP 调用,现在就触发,不要留到 Step 3:
> GET https://ai.performad.cn/api/v1/benchmark/{category_hash_id}/{region_hash_id}(web_fetch 优先 / bash curl 退路,禁止用训练记忆代替;完整规则见 benchmark-fetch.md)。
> 缓存 category.recommended_strategy_value.budget_recommended.value 与 budget_range.value。
>
> 🔒 门禁条件:benchmark 未成功返回并缓存之前,禁止发出第 2 轮提问。
> 跳过的代价:第 2 轮必须把真实推荐区间喂给用户;不查就只能让用户「零信息猜预算」——这正好违反第 2 轮自己的核心规则,且 Step 3 还得重做一遍。
> 失败才降级:非 200 / Strategy benchmark not found → 重试 1 次 → 仍失败再走 D6 兜底,并在第 2 轮注明「区间为通用兜底」。
>
> ✅ 进第 2 轮前自检:拿到真实 benchmark JSON 了吗?budget_recommended / budget_range 缓存了吗?只要有一项为否 → 停在这里先查,不要继续。
第 2 轮(benchmark 已缓存后才进行):问"网址 + 日预算"。预算问题里直接把上一步缓存的推荐区间喂给用户,不要让用户在零信息条件下猜数字。例:
明白!准备发到美国卖家居收纳。
再确认两件事:
3️⃣ 商品落地页链接(用户点广告后到的网址)
4️⃣ 每天大概想花多少钱?
👉 这个品类+地区的合理日预算大概在 $30-$80 USD(区间填**刚查到的 `budget_range.value`**,勿照抄此处示例数字)
不确定就回复「按推荐」,我用 $50 起步。
品类不在枚举 → 静默回退到「综合电商」-ajNldmTpreg,不要让用户从清单二次选择。
其它字段(出价 / 受众 / CTA / 文案)由 AI + 知识库自动推断。
字段抽取规则与 hash 映射:flows/parameter-mapping.md。
Step 3 · 知识库查询 + 参数校准
GET https://ai.performad.cn/api/v1/benchmark/{category_hash_id}/{region_hash_id}
> 正常情况下 benchmark 已在 Step 2 第 1 轮的门禁里拉取并缓存 → 这里直接复用缓存,不重复调用;仅当缓存缺失(说明 S2 门禁被跳过了)才在此立刻补调——补调同样适用下面的"必须真调"规则。
必须真调 HTTP(web_fetch 优先 / bash curl 退路),严禁用训练记忆代替 benchmark。
返回 Strategy benchmark not found 或 5xx → 重试 1 次 → 走 D6 兜底,S4 顶部告知用户"知识库暂不可用"。
随后调 tool_region_get 校准 location_id、必要时 tool_bid_recommend 兜底出价、tool_vbo_status_check 校验 VBO。
完整逻辑:flows/benchmark-fetch.md。
Step 4 · 素材方案选择(A: Catalog / B: 素材库)
> ⚠️ 顺序:素材方案选择移到投放方案确认之前——catalog/素材路径会影响方案中的广告条数与创意建议。
bc_asset_get(asset_type=CATALOG) 检查电商目录:
- 有可用的电商类型 catalog → 优先使用方案 A · Catalog 路径(Smart+ 自动从目录抽素材),仅当用户明确说"我自己挑"才切到 B
- 没有 catalog → 静默走方案 B,不要问
方案 B 用 file_video_ad_search + display_name 模糊搜索,分页 10/页;CTA 用 creative_cta_recommend_get 与知识库 cta 取交集。
完整:flows/s4-material-selection.md。
Step 5 · 投放方案确认
调 ad_audience_size_estimate 预估受众(< 50 万提示放宽)。方案展示先给"预创建广告结构"概览(1 系列 + N 组 + M 条),再列重要参数:投放目标、日预算、出价方式、定向、排期、素材路径与素材清单、文案样例、落地页。用户"确认"前做创建前余额校验(< 2× 日预算阻断 / 2-7× 询问)。
完整渲染模板:flows/s5-plan-confirmation.md。
Step 6 · 创建(Campaign → AdGroup → Ad → Preview)
每步生成新 request_id(64 位整数字符串,非 UUID;ad 层无 request_id),绝不复用。按方案 A / B 分别填 catalog 或 creative_list。预览失败不阻塞。
创建前先按"参数装配表"用缓存值装配(bc_id/location_id/pixel_id 等一律复用 S1/S3 缓存,勿临场重查或读 schema);广告默认创建为「暂停」(不投放、不花钱),由用户确认后开启。详见 flows/s6-creation.md。
Step 7 · 完成总结
只输出简单概括,不重复 Step 5 已展示的参数:① 本次创建内容 + 当前投放状态(一句话)② 如何开启投放 ③ 预览链接 ④ 待关注项 ⑤ 私域引流二维码。如实透传投放状态(广告默认「暂停 / 不花钱」,按 create 返回的真实状态呈现)。不暴露 Campaign / AdGroup / Ad ID、location_id、pixel_id、DISABLE/ENABLE 等技术词。模板:flows/s6-creation.md。
异常 & 降级
错误码分支统一在 flows/error-handling.md;反模式清单见 flows/anti-patterns.md。