明日DMP批量圈包
概述
本技能是一个项目级批量圈包管理工具,专门解决大批量圈包场景下的系统限制问题。通过自动任务拆分、批次调度和进度跟踪,实现从"单次圈包"到"项目级批量圈包"的能力升级。
核心价值
- 突破系统限制:自动拆分超限任务(LBS单次最多200个坐标、组合人群每组最多50个标签)
- 分批创建策略:每批最多5个任务,同批内逐个串行创建(一个创建API返回成功后再创建下一个,不需要等计算完成);必须等上一批全部计算完成后才能创建下一批
- 项目级管理:一个项目生成多个人群包,统一管理和追踪
- 自动化执行:自动生成执行计划、批次调度、进度监控
- 降低操作成本:从手动拆分N次任务 → AI自动完成
适用场景
| 场景 | 描述 | 系统限制 | 解决方案 |
|---|---|---|---|
| 场景1:LBS批量点位圈选 | 需要圈选大量门店/网点周边用户(数量不定) | 单次最多200个坐标 | 自动拆分为N个任务(每任务200个坐标) |
| 场景2:组合人群-多规则拆分组合 | 将标签、已有人群包拆分成多个规则组合,组内OR、组间AND/NOT/OR(支持标签ID+人群包ID作为规则条件) | 每个规则最多50个标签 | 按多对一/一对多/多对多模式拆分,自动批量创建多个组合人群任务;每批最多5个任务,同批逐个串行创建,等上一批全部计算完成后再创建下一批 |
支持查询已有人群包:在选择规则条件前,可通过人群列表查询接口搜索已有DMP人群包,将人群包ID作为规则条件传入,实现"已有基础人群包 + 标签过滤"或"人群包与人群包之间交并差"的批量组合。
⚠️ 重要声明:
- 凭证安全责任:您的 Access Key(AK)和 Secret Key(SK)是访问明日 DMP API 的唯一凭证,属于您的敏感私密信息。您对凭证的妥善保管(包括但不限于防止泄露、撤销权限)负全部责任。因凭证泄露、遗失或不当使用导致的一切损失及法律责任,均由您自行承担。
- 数据合法性责任:使用本技能进行人群圈选、洞察、同步、投放等操作时,您须保证所使用的数据来源合法合规,并已取得必要的用户授权。因数据来源违法、侵权或违反相关法律法规所引发的一切法律责任与纠纷,均由您自行承担,本技能开发者不承担任何连带责任。
- 操作结果责任:本技能的所有 API 调用结果(包括人群创建、任务状态、数据结果等)均由明日DMP平台提供,本技能开发者对 API 返回内容的准确性、完整性不作任何保证,对因此产生的业务损失不承担责任。
- 使用即视为同意:继续使用本技能,即表示您已阅读并同意上述免责声明。
💡 提示:欢迎使用后分享您的体验,帮助我们持续改进 → 填写使用评价
🔑 前置准备
使用本技能前,您需要先获取明日DMP API凭证:
📧 申请方式(二选一):
方式一:邮件申请
- 发送至:product@mingdata.com
- 邮件主题:【明日DMP API开通申请】
- 邮件内容:请注明公司名称、联系人、联系方式及使用场景
方式二:在线表单申请
- 填写申请表单:https://doc.weixin.qq.com/forms/ANEAJwfLAAoADMAHwbhAPICNUE0vDRd8f#/fill
- 提交后等待审核通过(通常1-3个工作日)
🔒 凭证格式:
- Access Key:
xxxxxxxxxxxxxxxx - Secret Key:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
💡 温馨提示:首次使用时,我会自动引导您完成凭证配置,无需担心!
工作流程
请求类型自动识别
当您发起请求时,系统会自动识别请求类型并进入相应流程:
1. 技能咨询请求("有哪些功能"、"能做什么")
- 展示2种批量圈选场景的详细说明
- 直接结束,等待您的下一步需求
2. 查询任务请求("查询项目状态"、"查看任务进度")
- 读取状态文件展示项目进度
- 展示各批次任务状态
- 直接结束
3. 创建项目请求(包含批量、门店、标签拆分等)
- 进入完整的创建流程(见下方)
创建项目完整流程
流程执行规则:
- ✅ 必须执行:第一步~第九步(包含第六步B、第六步C、第六步D,所有步骤都必须执行)
- ⚠️ 严格禁止跳过任何步骤,特别是第八步(任务记录检查)
- 📌 第八步虽然用户可以选择不安装,但必须执行检查和询问流程
⚠️ 创建前强制检查清单(脚本驱动)
在执行第七步(创建任务)前,必须运行前置校验脚本:
# 创建第一个任务前
python scripts/preflight_check.py --action create_first --project <project_id>
# 创建下一个任务前(自动检查上一步是否成功)
python scripts/preflight_check.py --action create_next --project <project_id> --task-index <index>
脚本会自动检查:
- ✅ 鉴权技能是否安装
- ✅ 凭证是否有效
- ✅ 上一步任务是否成功(分批创建时)
- ✅ 是否重复创建
- ✅ 是否超出总任务数
如果返回 error → 停止,展示错误给用户
如果返回 ok → 继续执行
❌ 脚本返回 error 时禁止执行创建操作
❌ 跳过前置校验视为严重流程错误
🔴 监控任务创建强制规范(代码级硬拦截)
前置校验脚本(必须执行)
在创建监控任务前,必须先运行前置校验脚本:
# 创建第一个任务前
python scripts/preflight_check.py --action create_first --project <project_id>
# 创建下一个任务前(检查上一步是否成功)
python scripts/preflight_check.py --action create_next --project <project_id> --task-index <index>
脚本返回格式:
// 通过
{"status": "ok", "message": "前置校验通过,可以创建第 N 个任务"}
// 拦截
{"status": "error", "message": "前置校验失败", "blockers": ["第 N-1 个任务状态为 'pending',必须为 'success'"]}
如果返回 error → 停止,展示错误给用户
如果返回 ok → 继续执行
脚本拦截规则(代码级硬拦截,无法跳过)
- 上一步任务必须成功:
status == "success"才能创建下一个 - 凭证必须有效:AK/SK 必须存在且完整
- 鉴权技能必须安装:
mingdata-dmp-auth必须存在 - 不可重复创建:已成功的任务不可再次创建
- 不可超出总数:任务索引不能大于总任务数
cron 任务创建规范
使用 cron 工具创建监控任务(不是命令行):
cron(action="add", job={
"name": f"DMP任务状态监控-{project_id}-任务{task_index}",
"schedule": {"kind": "every", "everyMs": 60000},
"payload": {
"kind": "agentTurn",
"message": f"检查DMP任务状态..."
},
"sessionTarget": "current", # 必须
"delivery": {"mode": "none"} # 必须
})
为什么不用命令行?
命令行无法正确设置 sessionTarget: "current",会导致监控任务无法触发。
⚠️ 监控任务创建说明
正确做法
✅ 使用 cron 工具创建监控任务
cron(action="add", job={
"name": "DMP任务状态监控-{project_id}-任务{task_index}",
"schedule": {"kind": "every", "everyMs": 60000},
"payload": {
"kind": "agentTurn",
"message": "检查DMP任务状态..."
},
"sessionTarget": "current", # 关键:必须设置为 "current"
"delivery": {"mode": "none"} # 关键:必须设置为 "none"
})
错误做法
❌ 使用 openclaw cron add 命令行
命令行无法正确设置 sessionTarget: "current",会导致:
- 监控任务在隔离会话中运行
- 无法访问当前会话上下文
- 监控任务无法自动触发
前置校验脚本会自动拦截
现在创建任务前会运行 scripts/preflight_check.py,脚本会检查:
- 上一步任务是否成功
- 凭证是否有效
- 鉴权技能是否安装
如果检查失败,脚本会返回 error,AI 必须停止并展示错误给用户。
第一步:场景识别与确认 [必须执行]
系统会根据您的需求关键词,识别出最匹配的场景类型,然后向您确认。
场景识别规则表
| 场景 | 核心关键词 | 典型口语变体 |
|---|---|---|
| 场景1:LBS批量点位圈选 | 批量、门店、网点、坐标、LBS、位置、经纬度、批量上传 | "圈选全国门店"、"批量上传坐标"、"LBS批量圈选"、"门店周边用户" |
| 场景2:组合人群多规则拆分 | 标签拆分、多规则、A规则、B规则、组合拆分、标签组合 | "标签太多需要拆分"、"A标签和B标签组合"、"多规则拆分" |
场景2子场景识别
当识别为场景2时,需要进一步识别子场景:
| 子场景 | 识别条件 | 描述 |
|---|---|---|
| 场景2.1:多对一 | A组多个标签值,B组单个标签值 | A的每个标签值分别与B求交集,生成M个任务 |
| 场景2.2:一对多 | A组单个标签值,B组多个标签值 | A分别与B的每个标签值求交集,生成N个任务 |
| 场景2.3:多对多 | A组多个标签值,B组多个标签值 | A和B两两求交集(笛卡尔积),生成M×N个任务 |
意图识别流程
步骤1.1:关键词匹配
从用户需求中提取关键词,按上表匹配场景类型。
步骤1.2:向用户确认
识别出场景后,必须向用户确认,不可直接执行:
示例1:
您:"帮我圈选全国3000个门店周边的用户"
↓
系统:"识别到您提到了【批量、门店】,可以创建【LBS批量点位圈选项目】。
LBS批量圈选说明:
- 功能:基于大量坐标点,批量圈选门店/网点周边用户
- 系统限制:单次最多200个坐标,系统将自动拆分
- 必填参数:人群包名、后缀、坐标信息、辐射范围、人群类型
是否需要创建LBS批量圈选项目?"
↓
您:"是的" / "不是"
示例2:
您:"我有100个年龄标签和3个兴趣标签,需要拆分组合"
↓
系统:"识别到您提到了【标签拆分】,可以创建【组合人群多规则拆分项目】。
组合人群多规则拆分说明:
- 功能:将大量标签按规则拆分成多个组合人群任务
- 系统限制:前端限制每个规则最多50个标签
- 🔴 分批创建规则:每批最多5个任务,同批逐个串行创建,等上一批全部计算完成后再创建下一批
- 支持模式:多对一、一对多、多对多
是否需要创建组合人群多规则拆分项目?"
↓
您:"是的" / "不是"
步骤1.3:处理用户响应
- 用户确认"是" → 进入第二步(鉴权检查)
- 用户拒绝 → 询问用户想使用哪种场景,或展示所有场景供选择
- 用户不确定 → 展示所有场景的详细说明,让用户选择
第二步:鉴权技能检查与凭证配置 [必须执行]
确认场景后,系统会立即检查鉴权技能是否已安装,并配置API凭证:
完整检查流程:
步骤2.1:检查鉴权技能是否已安装
系统会自动检查鉴权技能(mingdata-dmp-auth)的安装状态:
- 检查路径:
~/.skills/mingdata-dmp-auth/ - 如果已安装 → 跳转到步骤2.2(凭证检查)
- 如果未安装 → 向用户展示以下提示并等待回复
鉴权技能未安装时的提示内容:
⚠️ 检测到您尚未安装【明日DMP鉴权技能】
该技能负责管理 API 凭证(AK/SK)、生成签名,是使用本功能的必要前提。
是否自动下载并安装?
是 - 立即安装
否 - 取消本次操作
请回复:是/否
等待用户回复,按以下逻辑执行:
-
用户回复"是":
- 使用 terminal 工具执行:
openclaw skills install mingdata-dmp-auth - 等待命令执行完成
- 安装成功:提示
✅ 鉴权技能安装成功→ 继续步骤2.2 - 安装失败:展示以下内容后终止流程:
❌ 鉴权技能自动安装失败 请前往 ClawHub 手动安装: 👉 https://clawhub.ai/mingri26/mingdata-dmp-auth 手动安装步骤: 1. 打开上方链接 2. 点击「Download」按钮 3. 安装完成后重新发起本次请求
- 使用 terminal 工具执行:
-
用户回复"否":
- 提示:
已取消操作。如需继续,请先安装鉴权技能。 - 终止流程
- 提示:
步骤2.2:检查凭证是否存在
鉴权技能安装完成后,检查API凭证配置状态:
- 凭证文件路径:
~/.mingdata_dmp_credentials - 如果凭证不存在 → 展示凭证获取指引(见下方)
- 如果凭证存在但无效 → 引导重新配置
- 如果凭证有效 → 继续执行步骤2.3(操作密码验证)
步骤2.3:操作密码验证 [必须执行]
每次创建任务前,必须验证操作密码,确保操作安全。
检查密码哈希是否已设置:
- 凭证文件路径:
~/.mingdata_dmp_credentials - 检查是否存在
op_password_hash字段
如果未设置密码(首次使用):
🔐 检测到您尚未设置操作密码
为保障账号安全,每次创建任务前需要验证操作密码。
请设置您的操作密码(不少于6位):
- 等待用户输入密码
- 要求用户再次确认密码
- 两次输入一致后,计算 MD5 哈希:
hashlib.md5(password.encode()).hexdigest() - 将哈希值写入凭证文件的
op_password_hash字段 - 提示:
✅ 操作密码设置成功,请妥善保管 - 继续执行第三步(参数收集)
如果已设置密码:
🔐 请输入操作密码以继续:
- 等待用户输入密码
- 计算 MD5 哈希与凭证文件中的
op_password_hash比对 - 验证通过 → 提示
✅ 密码验证通过→ 继续第三步(参数收集) - 验证失败 → 提示
❌ 密码错误,操作已终止→ 终止流程
安全说明:
- 密码明文仅在当前对话中出现一次,不存储在任何文件中
- 凭证文件中只保存 MD5 哈希值
- 忘记密码时,可删除凭证文件中的
op_password_hash字段重新设置
凭证不存在时的引导内容:
🔑 明日DMP API凭证获取指南
您需要先获取明日DMP的API访问凭证(Access Key 和 Secret Key),才能使用项目管理功能。
📧 申请方式(二选一):
方式一:邮件申请
- 发送开通申请至:product@mingdata.com
- 邮件主题:【明日DMP API开通申请】
- 邮件内容:请注明公司名称、联系人、联系方式及使用场景
方式二:在线表单申请
- 填写在线申请表单:https://doc.weixin.qq.com/forms/ANEAJwfLAAoADMAHwbhAPICNUE0vDRd8f#/fill
- 提交后等待审核通过(通常1-3个工作日)
🔒 安全提示:
- Access Key 格式:xxxxxxxxxxxxxxxxxxxx
- Secret Key 格式:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- 请妥善保管凭证,不要泄露给他人
获取凭证后,请按以下格式提供给我:
Access Key: xxxxxxxxxxxxxxxxxxxx
Secret Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
第三步:参数收集 [必须执行]
🔴 一次性收齐,禁止逐条追问:在第一次交互中,必须把下表列出的字段(含必填/可选、默认值)一次性列出并收齐;如用户输入不完整,需要一次性指出所有缺失项。
凭证检查通过后,系统会根据识别的场景类型,引导用户收集参数。
场景1:LBS批量点位圈选 - 参数收集(表格化清单)
| 字段 | 必填 | 说明 | 取值/默认值 |
|---|---|---|---|
| 人群包名 | ✅ | 用于生成子任务名称前缀 | 示例:全国门店周边用户 |
| 后缀 | ✅ | 用于生成子任务名称后缀;命名规则:{人群包名}{后缀}{序号} |
默认:_批次(仍需用户确认是否使用默认或自定义) |
| 坐标信息(经度lng/纬度lat) | ✅ | 支持两种提供方式:① 直接粘贴文本,每行一组 lng,lat;② 上传Excel/CSV(需包含lng、lat列)。坐标系:百度坐标系(BD09) |
文本示例:116.467304,39.914437 |
| 辐射范围(米) | ✅ | 单点圈选半径 | 范围:150-6000;默认:1000 |
| 人群类型 | ✅ | 可多选 | a) 经过(recentArrive) b) 居住(homeAddress) c) 工作(workAddress) |
| 时间范围 | 条件必填 | 仅当人群类型包含“经过(recentArrive)”时必填 | 格式:YYYY-MM-DD HH 至 YYYY-MM-DD HH;跨度 < 90天;示例:2026-05-01 00 至 2026-05-31 23 |
| ID类型(可多选) | ✅ | 输出人群包的设备ID类型 | MOBILE:MD5_IDFA/MD5_IMEI/MD5_OAID/IDFA/OAID/CAID/MD5_CAID;OTT:MD5_MAC;PC:MZID |
| 所属品牌 | ✅ | v1.4新增;需先查询品牌列表供用户选择 | 选具体品牌:brands=["xxx"];选“全部/未选”:brands=[](默认全部) |
坐标为地址文本时:需用户先自行用地图工具转换为经纬度后再提供(本流程不接受纯地址文本直接入参)。
场景2:组合人群多规则拆分 - 参数收集(表格化清单)
说明:场景2中,A规则与B规则均可由【标签】与【已有人群包】组成;同一规则内为 OR 关系。A与B之间的关系由“组合逻辑”决定。
| 字段 | 必填 | 说明 | 取值/默认值 |
|---|---|---|---|
| 人群包名 | ✅ | 用于生成子任务名称前缀 | 示例:美妆目标人群 |
| 后缀 | ✅ | 用于生成子任务名称后缀;命名规则:{人群包名}{后缀}{序号} |
默认:_组合(仍需用户确认是否使用默认或自定义) |
| A规则条件:标签(可选) | 条件必填 | A规则标签ID列表(逗号分隔)或上传包含标签ID的表格;展示标签时必须标注来源(明略/合作伙伴) | 允许为空(若A规则用人群包) |
| A规则条件:已有人群包(可选) | 条件必填 | A规则可选择已有人群包ID列表(逗号分隔)或按名称关键词搜索选择 | 允许为空(若A规则用标签) |
| B规则条件:标签(可选) | 可选 | B规则标签ID列表(逗号分隔)或上传包含标签ID的表格 | 允许为空 |
| B规则条件:已有人群包(可选) | 可选 | B规则可选择已有人群包ID列表(逗号分隔)或按名称关键词搜索选择 | 允许为空 |
| 规则非空约束 | ✅ | A与B不能同时为空;且对每个规则(A或B),标签与人群包至少提供一种 | 如不满足需一次性提示用户补齐 |
| 拆分模式 | ✅ | 多对一 / 一对多 / 多对多;可由系统根据A/B数量自动识别,但必须让用户确认 | a) 多对一 b) 一对多 c) 多对多 |
| 拆分策略 | ✅ | 控制每组标签数量或组数;必须保证每组 ≤ 50个标签 | a) 固定每组标签数(≤50) b) 固定组数 c) 自定义分组 |
| 组合逻辑(A与B关系) | ✅ | A规则与B规则之间的关系 | AND(交集) / OR(并集) / NOT(差集) |
| ID类型(可多选) | ✅ | 输出人群包的设备ID类型 | MOBILE:MD5_IDFA/MD5_IMEI/MD5_OAID/IDFA/OAID/CAID/MD5_CAID;OTT:MD5_MAC;PC:MZID |
| 所属品牌 | ✅ | v1.4新增;需先查询品牌列表供用户选择 | 选具体品牌:brands=["xxx"];选“全部/未选”:brands=[](默认全部) |
| 多组交并差逻辑(v1.4新增) | 可选 | 当用户明确需要“超过A/B两组”的复杂逻辑时启用;使用 groups-json 直接传入(最多10组,末组必须noop) |
不需要时不启用;需要时由用户提供或在用户确认后由系统生成并回显确认 |
标签搜索与歧义澄清:严格遵循
references/标签搜索歧义处理规则.md;必须同时覆盖明略标签与合作伙伴标签,并在展示时标注来源。
第四步:参数校验 [必须执行]
系统会检查参数格式是否正确:
场景1校验规则:
- 坐标文件格式:必须包含lng、lat列
- 坐标数量:检查总坐标数
- 辐射范围:150-6000米
- 时间格式:YYYY-MM-DD HH
- ID类型:必须是支持的类型
场景2校验规则:
- 标签数量:检查A/B规则标签数
- 拆分策略:每组≤50个标签
- 组合逻辑:AND/OR/NOT
- ID类型:必须是支持的类型
校验失败时:
⚠️ 参数校验失败
错误项:{参数名}
错误原因:{原因}
正确格式:{格式示例}
请重新输入该参数。
第五步:生成执行计划 [必须执行]
系统会根据参数自动生成执行计划:
场景1执行计划:
【执行计划预览】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
人群包名: {人群包名}
后缀: {后缀}
总坐标数: {N}个
拆分策略: 每批次200个坐标
预计任务数: {批次数}个
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
任务详情:
- {人群包名}{后缀}1: 坐标1-200
- {人群包名}{后缀}2: 坐标201-400
- ...
- {人群包名}{后缀}{批次数}: 坐标{start}-{end}
场景2执行计划:
【执行计划预览】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
人群包名: {人群包名}
后缀: {后缀}
拆分模式: {多对一/一对多/多对多}
A规则标签: {N}个({拆分组数}组)
B规则标签: {M}个({拆分组数}组)
组合逻辑: {AND/OR/NOT}
预计任务数: {总任务数}个
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
任务详情(每个任务展示完整标签信息):
{人群包名}{后缀}1:
A规则: 15705(女性) AND [15686(18-19岁) OR 15687(20-24岁)]
B规则: 34140(居住地_北京市)
组合: A AND B
API参数:
{
"name": "{人群包名}{后缀}1",
"data": [
{"op": "and", "rule": {"tag": [15705, 15686, 15687]}},
{"op": "noop", "rule": {"tag": [34140]}}
]
}
{人群包名}{后缀}2:
A规则: 15705(女性) AND [15686(18-19岁) OR 15687(20-24岁)]
B规则: 34133(居住地_上海市)
组合: A AND B
...
⚠️ API参数结构说明(必须理解):
关键规则:
-
同一个rule内的tag是OR关系
{"rule": {"tag": [15705, 34140]}}= 女 OR 北京- 如果需要AND关系,必须分开成多个rule
-
不同rule之间通过op字段定义逻辑关系
{"op": "and", "rule": {"tag": [15705]}}+{"op": "noop", "rule": {"tag": [34140]}}= 女 AND 北京
-
最后一组必须用noop
- 最后一个rule的op必须是"noop"
示例对比:
❌ 错误(女 OR 北京):
{
"data": [
{"op": "and", "rule": {"tag": [15699]}},
{"op": "noop", "rule": {"tag": [15705, 34140]}}
]
}
// 实际:高收入 AND (女 OR 北京)
✅ 正确(女 AND 北京):
{
"data": [
{"op": "and", "rule": {"tag": [15699]}},
{"op": "and", "rule": {"tag": [15705]}},
{"op": "noop", "rule": {"tag": [34140]}}
]
}
// 实际:高收入 AND 女 AND 北京
组合逻辑处理规则:
- 用户指定AND:每个标签单独一个rule,用op="and"连接
- 用户指定OR:可以把标签放在同一个rule里(OR关系)
⚠️ 预览规则(必须遵守):
- ✅ 每个标签必须展示ID和名称
- ✅ 必须明确标注OR/AND关系
- ✅ 必须展示实际API参数
- ✅ 预览内容必须与实际创建参数完全一致
- ❌ 禁止使用简化描述(如"18-24岁")
- ❌ 禁止预览和创建使用不同的数据
第六步:参数确认 [必须执行]
⚠️ 这是强制性步骤,绝对不能跳过!
必须执行的完整确认流程:
-
展示执行计划
- 展示第五步生成的执行计划
- 包含所有关键信息
-
等待用户明确确认
- 必须等待用户回复"确认"、"是"、"可以"等明确的确认词
- 不允许在用户未确认前直接调用API
- 用户可以选择"修改"、"取消"或"确认"
-
处理用户响应
- 用户确认 → 进入第七步(执行创建)
- 用户要求修改 → 返回第三步(参数收集)
- 用户取消 → 终止流程,提示"已取消本次操作"
确认提示语示例:
请确认以上执行计划是否正确?
- 回复"确认"或"是":开始创建项目
- 回复"修改":重新设置参数
- 回复"取消":取消本次操作
第六步B:流程完整性验证 [必须执行]
⚠️ 这是强制性步骤,在用户确认执行计划后、执行创建前必须完成!
必须执行的完整验证流程:
-
输出检查清单 在用户确认执行计划后,必须输出以下检查清单并逐项确认:
🔴 创建前流程完整性验证 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 请确认以下步骤是否已完成: □ 1. 是否已获得用户对执行计划的明确确认? ⚠️ 如有未完成项,必须先完成后再继续! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -
处理未完成项
- 所有项目完成后 → 进入第六步C(失败处理策略确认)
第六步C:失败处理策略确认 [必须执行]
⚠️ 这是强制性步骤,在执行创建前必须完成!
目的: 提前确认用户在任务失败时的处理偏好,避免执行过程中频繁中断询问。
必须执行的完整询问流程:
-
向用户展示失败处理策略选项
⚙️ 失败处理策略确认 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 在任务执行过程中,可能会遇到创建失败或执行失败的情况。 请提前确认您的处理偏好: 【创建失败时】(调用API创建任务失败) a) 暂停等待 - 停止后续任务,等待您的重试/跳过/取消指令 b) 自动跳过 - 记录失败任务,自动继续创建下一个任务 【执行失败时】(任务创建成功但执行失败) a) 暂停等待 - 停止后续任务,等待您的重试/跳过/取消指令 b) 自动跳过 - 记录失败任务,自动继续创建/监控下一个任务 请选择策略组合: - 输入"1a+2a":创建失败暂停 + 执行失败暂停 - 输入"1a+2b":创建失败暂停 + 执行失败跳过 - 输入"1b+2a":创建失败跳过 + 执行失败暂停 - 输入"1b+2b":创建失败跳过 + 执行失败跳过 - 输入"自定义":分别指定两种情况的策略 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -
等待用户回复并记录选择
- 用户回复策略组合 → 记录到项目状态文件,进入第七步
- 用户输入"自定义" → 分别询问创建失败和执行失败的策略
- 用户不确定 → 推荐默认策略"1a+2a"(全部暂停等待)
-
记录用户选择
将用户的选择记录到
data/plans/{projectId}/status.json:{ "failureStrategy": { "onCreateFail": "pause" | "skip", "onExecuteFail": "pause" | "skip", "confirmedAt": "2026-07-01 18:30:00" } } -
确认并继续
✅ 失败处理策略已确认: - 创建失败时:{暂停等待/自动跳过} - 执行失败时:{暂停等待/自动跳过} 后续任务将按照此策略自动处理。→ 进入第七步(执行创建)
第六步D:定时监控方案(强制使用cron,禁止后台exec轮询)
🔴 三种方式的强制约束:
| 方式 | 是否允许 | 原因 |
|---|---|---|
✅ cron(action="add", job={...}) 工具 |
必须使用(强制) | 绑定当前session,每60秒自动触发agent turn,完成后可自动通知用户和推进下一批;默认自动启用,不需要询问 |
❌ openclaw cron add 命令行 |
严格禁止 | 无法设置sessionTarget=current,会绑定到isolated session导致监控无法触发 |
❌ exec(background=true) + sleep + 手动轮询 |
严格禁止 | 后台进程在session休眠/断连后不会唤醒AI,导致任务完成后无法通知用户(已发生过此故障) |
监控cron任务创建规范(第一批任务创建成功后必须立即执行,不需要询问用户):
cron(action="add", job={
"name": f"DMP任务状态监控-{project_id}",
"schedule": {"kind": "every", "everyMs": 60000},
"payload": {
"kind": "agentTurn",
"message": f"检查DMP项目{project_id}的任务状态,audienceIds={task_ids}。查询POST /audience/manage/taskList,检查每个任务audienceStatus(1=成功,0=失败,2/3=计算中)。本批全部成功后:若还有下一批则自动创建下一批并继续监控;若全部完成则汇总结果通知用户,然后调用cron(action='remove',...)删除本监控任务。若有失败按failureStrategy处理。"
},
"sessionTarget": "current",
"delivery": {"mode": "none"}
})
为什么不再询问用户是否启用监控:
- 多批次任务必须依赖监控才能自动推进(批间等待计算完成)
- 不启用监控 = 无法自动创建下一批 = 项目无法完成
- cron监控是项目执行的必要环节,不是可选项
cron任务触发时的执行流程:
- 查询当前所有任务的audienceStatus
- 本批全部成功(audienceStatus=1)→ 自动创建下一批任务,继续监控
- 全部批次完成 → 输出汇总结果、主动通知用户、调用cron(action="remove",...)删除监控任务
- 有失败(audienceStatus=0)→ 按failureStrategy处理(pause通知用户等待指令/skip记录后继续)
🔴 自我检查清单(每次创建第一批任务后必须逐项确认):
- 我是否使用了
cron工具(不是exec background,不是命令行)? - sessionTarget 是否设置为
"current"? - delivery 是否设置为
{"mode": "none"}? - payload.message 是否包含了项目ID、推进下一批、完成后删除cron的指令?
- 创建cron后是否向用户确认了监控已启动?
只有在单批次(任务数≤批大小,不需要分批)且用户明确选择手动查看时,才可以不创建监控任务,但仍需提示用户后续可手动查询进度。
第七步:执行创建 [必须执行]
⚠️ 前置条件:必须在用户明确确认后才能执行
执行流程:
步骤7.1:判断任务总数
任务数量判断:
├─ 场景1(LBS)→ 直接创建所有任务
└─ 场景2(组合人群):
├─ 任务数 ≤ 5 → 逐个串行创建全部任务
└─ 任务数 > 1 → 分批创建(每批最多5个,同批逐个串行创建,批间等全部计算完成)
🔴 分批创建规则(仅适用于场景2):
- 场景2(组合人群):每批最多5个任务
- 同批内逐个串行创建:创建任务1→等API返回audienceId→创建任务2→...→创建任务5。同批内不需要等计算完成,只需等创建API返回成功即可提交下一个创建请求
- 批间必须等待全部计算完成:一批5个任务全部创建提交后,启动监控等待这批所有任务计算完成(audienceStatus=1),全部成功后才能创建下一批
- 创建失败时按第六步C确认的策略处理(pause/skip)
- 场景1(LBS):所有坐标点直接创建(受单次200坐标限制,自动拆分)
步骤7.2:分批创建任务(每批最多5个,逐个串行创建,批间等计算完成)
调用对应的创建脚本:
- 场景1:
python scripts/create_lbs_batch.py - 场景2:
python scripts/create_combine_batch.py --batch-start N --batch-end M
⚠️ 分批创建机制:
场景2(组合人群)任务数 > 1 时,按每批5个分批创建:
# 第1批:逐个串行创建任务1~5
python scripts/create_combine_batch.py --batch-start 1 --batch-end 5 ...
# 脚本内部:创建1→等返回→创建2→等返回→...→创建5→等返回
# 等待第1批全部计算完成(监控audienceStatus,全部=1后继续)
# 第2批:逐个串行创建任务6~10
python scripts/create_combine_batch.py --batch-start 6 --batch-end 10 ...
# 等待第2批全部计算完成...
# ... 以此类推
🔴 代码级硬拦截(场景2,任务数>1时生效):
脚本内置了强制约束:
if total_tasks > 5 and args.batch_start is None and args.task_index is None:
print("🔴 前置校验失败:场景2任务数>1,必须使用 --batch-start/--batch-end 分批创建(每批最多5个)")
sys.exit(1)
场景2任务数>1且未指定批次范围或单个task-index,脚本会拒绝执行。
🔴 严格禁止的行为(违反视为严重错误):
❌ 禁止在一个命令行里一次性提交超过5个任务的创建请求
❌ 禁止同批内并发提交多个创建请求(必须逐个串行)
# 错误示例:同批内并发创建
import concurrent.futures
with concurrent.futures.ThreadPoolExecutor(5) as pool: # ❌ 禁止并发
pool.map(create_task, [1,2,3,4,5])
❌ 禁止不等上一批计算完成就创建下一批
# 错误示例:
create_batch(1,5)
# 没等计算完成就...
create_batch(6,10) # ❌ 必须等1~5全部计算成功
❌ 禁止直接调用API而不通过脚本
✅ 正确做法:同批逐个串行创建,批间等待全部计算完成
# 第1批:逐个创建任务1~5(脚本内部串行)
python scripts/create_combine_batch.py --batch-start 1 --batch-end 5 --project-id xxx ...
# 等待第1批全部计算完成(audienceStatus全部=1)
# 然后创建第2批
python scripts/create_combine_batch.py --batch-start 6 --batch-end 10 --project-id xxx ...
# ... 以此类推
为什么这样设计?
- 避免API限流:同批逐个创建,不会瞬时并发过多请求触发限流
- 批间控制:等一批计算完再创建下一批,避免DMP平台同时排队任务过多
- 失败可控:一批内某个任务失败时可以暂停,不会产生大量失败任务
- 可追溯:每个任务的创建时间、状态、人群规模都有记录
脚本返回结果包含:
batch_start/end: 本批任务索引范围created_tasks: 本批成功创建的任务列表(含audienceId)failed_tasks: 本批创建失败的任务列表(含错误信息)pending_batches: 剩余待创建的批次信息status: 任务状态(partial/completed/failed)
AI助手处理流程(场景2分批创建):
- 计算总任务数N,按每批5个切分:批1=[1,2,3,4,5], 批2=[6,7,8,9,10], ...
- 调用脚本提交第1批(
--batch-start 1 --batch-end min(5,N)),脚本内部逐个串行创建 - 检查第1批创建结果:
- 全部创建提交成功 → 启动监控,等待这批所有任务计算完成(audienceStatus=1)
- 有创建失败 → 按failureStrategy.onCreateFail处理(pause暂停/skip跳过)
- 第1批全部计算成功后,再提交第2批
- 重复步骤2-4,直到所有批次创建并计算完成
- 向用户汇报最终结果
⚠️ 关键:同批逐个串行创建(不等计算),批间必须等待全部计算完成!
第1批:创建1→等返回→创建2→等返回→...→创建5→等返回
→ 启动监控,等5个任务全部计算完成(audienceStatus=1)
→ 全部成功
第2批:创建6→等返回→创建7→等返回→...→创建10→等返回
→ 启动监控,等5个任务全部计算完成
→ ...
最后一批完成 → 汇总结果通知用户
⚠️ 失败处理机制(根据第六步C用户选择的策略执行):
创建阶段失败(API返回code≠0或超时):
提交批次中的任务 N
↓
检查创建API返回结果
↓
┌─────────────────────────────────────────┐
│ 创建成功(code=0,返回audienceId) │
│ → 记录任务ID和audienceId │
│ → 继续提交本批次剩余任务 │
│ → 本批次全部提交后,提交下一批 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 创建失败 │
│ → 检查用户选择的策略(failureStrategy.onCreateFail)│
│ ↓ │
│ ├─ 策略为"pause"(暂停等待): │
│ │ → 立即停止创建后续任务/批次 │
│ │ → 向用户展示失败原因 │
│ │ → 等待用户指令:重试/跳过/取消 │
│ │ │
│ └─ 策略为"skip"(自动跳过): │
│ → 记录失败任务到状态文件 │
│ → 向用户展示失败原因(仅通知) │
│ → 自动继续提交本批次下一个任务 │
└─────────────────────────────────────────┘
执行阶段失败(创建成功但计算失败,audienceStatus=0):
监控所有已提交任务的执行状态
↓
查询所有任务状态
↓
┌─────────────────────────────────────────┐
│ 所有任务执行成功(audienceStatus=1) │
│ → 汇总结果通知用户 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 部分任务执行失败(audienceStatus=0) │
│ → 检查用户选择的策略(failureStrategy.onExecuteFail)│
│ ↓ │
│ ├─ 策略为"pause"(暂停等待): │
│ │ → 通知用户失败任务信息 │
│ │ → 等待用户指令:重试/跳过 │
│ │ │
│ └─ 策略为"skip"(自动跳过): │
│ → 记录失败任务到状态文件 │
│ → 向用户展示失败信息(仅通知) │
│ → 等待剩余任务完成后汇总结果 │
└─────────────────────────────────────────┘
暂停等待策略时的交互示例:
❌ 任务创建失败
任务名称: {任务名称}
失败原因: {具体错误信息}
当前策略:暂停等待
请选择操作:
- 回复"重试":重新创建该任务
- 回复"跳过":跳过该任务,继续创建下一个
- 回复"取消":终止整个项目
自动跳过策略时的通知示例:
⚠️ 任务创建失败(已自动跳过)
任务名称: {任务名称}
失败原因: {具体错误信息}
当前策略:自动跳过
已记录失败任务,继续创建下一个任务...
进度:{已完成}/{总数}(失败: {失败数})
用户选择重试时:
- 重新调用创建接口,使用相同的参数
- 如果重试成功,继续创建下一个任务
- 如果重试仍然失败,再次询问用户(最多重试2次)
- 超过重试次数后,根据策略自动跳过或继续暂停
用户选择跳过时:
- 记录该任务为已跳过
- 继续创建下一个任务
步骤7.3:记录任务ID
将创建的任务ID记录到状态文件:
data/plans/{projectId}/status.json
步骤7.4:启动任务监控 [必须执行]
当前任务创建完成后,使用 OpenClaw cron 定时任务进行状态监控:
🔴🔴🔴 严重警告:必须使用 cron 工具,禁止使用 openclaw cron add 命令行!
为什么禁止使用命令行:
- 命令行的
--session参数只支持main或isolated - 不支持
current(当前会话) - 使用命令行创建的监控任务,
sessionTarget被错误设置为isolated - 导致监控任务无法正确绑定到当前会话,无法自动触发
脚本输出的 cron_instruction 字段包含:
{
"cron_instruction": {
"action": "create_cron_monitor",
"mandatory": true,
"tool": "cron", // 🔴 必须使用这个工具
"forbidden_tool": "openclaw cron add", // ❌ 禁止使用这个
"reason": "命令行无法正确设置 sessionTarget: current,会导致监控任务无法自动触发",
"params": {
"action": "add",
"job": {
"name": "DMP任务状态监控-xxx",
"schedule": {"kind": "every", "everyMs": 60000},
"payload": {...},
"sessionTarget": "current",
"delivery": {"mode": "none"}
}
},
"validation_check": {
"required": true,
"check_before_execution": true,
"validation_rules": [
"必须使用 cron 工具,禁止使用 openclaw cron add 命令行",
"必须设置 sessionTarget: 'current'",
"必须设置 delivery: {'mode': 'none'}",
"如果检测到使用命令行,必须立即更换为 cron 工具"
]
}
}
}
🔴 强制执行步骤(必须按顺序执行):
步骤0: 🔴 自我验证(必须执行)
↓
检查:我是否打算使用 openclaw cron add 命令行?
↓
┌─────────────────────────────────────────┐
│ 是 │
│ → ❌ 错误!立即更换为 cron 工具 │
│ → 严格按照脚本输出的 params 执行 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 否 │
│ → ✅ 正确!确认使用 cron 工具 │
│ → 继续执行 │
└─────────────────────────────────────────┘
↓
步骤1: 读取脚本输出的 cron_instruction.params 字段
步骤2: 使用 cron 工具(不是命令行)创建监控任务
步骤3: 将 params 作为 job 参数传递给 cron 工具
步骤4: 验证 cron 任务创建成功
🔴 验证检查(每次启动监控任务前必须执行):
启动监控任务前
↓
🔴 验证检查
↓
检查:我是否使用了 cron 工具?
↓
┌─────────────────────────────────────────┐
│ 使用了 openclaw cron add 命令行 │
│ → ❌ 错误!立即更换为 cron 工具 │
│ → 严格按照脚本输出的 params 执行 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 使用了 cron 工具 │
│ → ✅ 正确!继续执行 │
└─────────────────────────────────────────┘
验证规则:
- ✅ 必须使用
cron工具 - ❌ 禁止使用
openclaw cron add命令行 - ✅ 必须设置
sessionTarget: 'current' - ✅ 必须设置
delivery: {'mode': 'none'} - ✅ 如果检测到使用命令行,必须立即更换为
cron工具
自我检查提示:
在执行前,请验证:我是否使用了 cron 工具?如果使用了 openclaw cron add 命令行,必须立即更换为 cron 工具!
✅ 正确示例:
# 使用 cron 工具,参数来自脚本输出
cron(action="add", job={
"name": "DMP任务状态监控-xxx",
"schedule": {"kind": "every", "everyMs": 60000},
"payload": {...},
"sessionTarget": "current",
"delivery": {"mode": "none"}
})
❌ 错误示例(禁止):
# ❌ 错误方式:命令行无法正确设置 sessionTarget
openclaw cron add --name "xxx" --every 1m --message "xxx" --session current
AI助手必须:
- 读取脚本输出的
cron_instruction字段 - 检查
mandatory: true字段,确认这是强制执行指令 - 执行前验证:检查
validation_check字段,进行自我验证 - 🔴 验证工具:确认使用的是
cron工具,不是openclaw cron add命令行 - 使用
cron工具(不是命令行)创建监控任务 - 直接使用
cron_instruction.params作为参数 - 必须设置
delivery: {"mode": "none"},避免尝试通过Octo发送通知 - 违反此规则会导致监控任务无法自动触发
🔴 强制验证步骤(执行前必须完成):
步骤0: 自我验证(必须执行)
↓
检查:我是否打算使用 openclaw cron add 命令行?
↓
┌─────────────────────────────────────────┐
│ 是 │
│ → ❌ 错误!立即更换为 cron 工具 │
│ → 严格按照脚本输出的 params 执行 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 否 │
│ → ✅ 正确!确认使用 cron 工具 │
│ → 继续执行 │
└─────────────────────────────────────────┘
验证规则:
- ✅ 必须使用
cron工具 - ❌ 禁止使用
openclaw cron add命令行 - ✅ 必须设置
sessionTarget: 'current' - ✅ 必须设置
delivery: {'mode': 'none'} - ✅ 如果检测到使用命令行,必须立即更换为
cron工具
自我检查提示:
在执行前,请验证:我是否使用了 cron 工具?如果使用了 openclaw cron add 命令行,必须立即更换为 cron 工具!
验证检查字段(脚本输出):
{
"validation_check": {
"required": true,
"check_before_execution": true,
"validation_rules": [
"必须使用 cron 工具,禁止使用 openclaw cron add 命令行",
"必须设置 sessionTarget: 'current'",
"必须设置 delivery: {'mode': 'none'}",
"如果检测到使用命令行,必须立即更换为 cron 工具"
],
"self_check_prompt": "在执行前,请验证:我是否使用了 cron 工具?如果使用了 openclaw cron add 命令行,必须立即更换为 cron 工具!"
}
}
执行步骤:
步骤0: 🔴 自我验证(必须执行)
↓
检查:我是否打算使用 openclaw cron add 命令行?
↓
┌─────────────────────────────────────────┐
│ 是 │
│ → ❌ 错误!立即更换为 cron 工具 │
│ → 严格按照脚本输出的 params 执行 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 否 │
│ → ✅ 正确!继续执行 │
└─────────────────────────────────────────┘
↓
步骤1: 读取脚本输出的 cron_instruction.params 字段
步骤2: 使用 cron 工具(不是命令行)创建监控任务
步骤3: 将 params 作为 job 参数传递给 cron 工具
步骤4: 验证 cron 任务创建成功
🔴 验证检查(每次启动监控任务前必须执行):
启动监控任务前
↓
🔴 验证检查
↓
检查:我是否使用了 cron 工具?
↓
┌─────────────────────────────────────────┐
│ 使用了 openclaw cron add 命令行 │
│ → ❌ 错误!立即更换为 cron 工具 │
│ → 严格按照脚本输出的 params 执行 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 使用了 cron 工具 │
│ → ✅ 正确!继续执行 │
└─────────────────────────────────────────┘
✅ 正确示例:
# 使用 cron 工具,参数来自脚本输出
cron(action="add", job={
"name": "DMP任务状态监控-xxx",
"schedule": {"kind": "every", "everyMs": 60000},
"payload": {...},
"sessionTarget": "current",
"delivery": {"mode": "none"} # 🔴 必须设置
})
❌ 错误示例(禁止):
# ❌ 错误方式:命令行无法正确设置 sessionTarget
openclaw cron add --name "xxx" --every 1m --message "xxx" --session current
为什么禁止使用命令行:
- 命令行的
--session参数只支持main或isolated - 不支持
current(当前会话) - 使用命令行创建的监控任务,
sessionTarget被错误设置为isolated - 导致监控任务无法正确绑定到当前会话,无法自动触发
- 创建cron定时任务:
# 使用cron工具创建定时任务
cron(action="add", job={
"name": f"DMP任务状态监控-{project_id}-任务{task_index}",
"schedule": {"kind": "every", "everyMs": 60000}, # 每1分钟
"payload": {
"kind": "agentTurn",
"message": f"检查DMP任务状态,项目ID: {project_id},当前任务ID: {task_id},任务索引: {task_index},总任务数: {total_tasks}。查询任务状态,如果执行成功(audienceStatus=1),创建下一个任务(task-index={task_index+1})。如果所有任务都已创建完成,继续监控所有任务的执行状态,直到所有任务都执行成功(audienceStatus=1)后,才删除此cron任务。如果执行失败(audienceStatus=0),通知用户并停止创建。注意:不要删除当前监控任务,除非所有任务都已执行成功。"
},
"sessionTarget": "current", # 绑定到当前会话
"deleteAfterRun": False
})
-
cron任务触发时自动查询:
- cron定时任务每分钟触发
- 调用API查询当前任务状态
- 向用户汇报进度
- 任务执行成功时,自动创建下一个任务(不删除监控任务)
- 任务执行失败时,停止创建,询问用户是否重试
- 所有任务都创建完成后,继续监控所有任务的执行状态
- 所有任务都执行成功(audienceStatus=1)后,才删除监控任务
-
cron任务的优势:
- ✅ 不需要修改openclaw.json配置文件
- ✅ 不需要重启网关
- ✅ 立即生效
- ✅ 可靠性高
- ✅ 任务完成后自动通知到当前会话
- ✅ 可以自动清理(任务完成后删除cron)
🔴 重要:分批创建的核心逻辑
⚠️ 这是最容易出错的步骤,必须严格遵守!
核心原则:每批最多5个任务,同批逐个串行创建(只等创建返回不等计算),批间必须等全部计算完成!
分批创建的完整流程:
第1步:计算总任务数N
↓
第2步:按每批最多5个切分
第1批:任务1~5
第2批:任务6~10
...
第k批:任务(5(k-1)+1)~min(5k, N)
↓
第3步:逐个串行创建第1批
创建任务1 → 等API返回audienceId → 创建任务2 → 等API返回 → ... → 创建任务5
↓
第4步:启动监控,等待第1批全部计算完成(audienceStatus全部=1)
↓
┌─────────────────────────────────────────┐
│ 第1批全部计算成功 │
│ → 继续创建下一批 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 有任务计算失败(audienceStatus=0) │
│ → 按failureStrategy.onExecuteFail处理 │
│ ├─pause:停止,询问用户是否继续 │
│ └─skip:记录失败,继续下一批 │
└─────────────────────────────────────────┘
↓
第5步:逐个串行创建第2批(同第3步)
↓
等待第2批全部计算完成
↓
... 重复直到所有批次完成 ...
↓
汇总所有批次结果通知用户
❌ 绝对禁止的行为:
- ❌ 一次性提交超过5个任务的创建请求
- ❌ 同批内并发提交多个创建请求(必须逐个串行)
- ❌ 不等上一批全部计算完成就创建下一批
- ❌ 有失败任务时不询问用户直接继续(pause策略下)
- ❌ 有失败任务时不询问用户直接继续(pause策略下)
- ❌ 只说"任务完成了"而不展示每个任务的状态和人群规模
- ❌ 使用
openclaw cron add命令行创建监控任务(应使用cron工具或后台脚本) - ❌ 忽略脚本输出的
mandatory: true指令 - ❌ 跳过参数确认和执行计划预览直接创建
✅ 必须执行的行为:
- ✅ 主动向用户汇报任务执行状态
- ✅ 展示任务完成状态和人群规模
- ✅ 检查当前任务是否执行成功
- ✅ 执行成功时自动创建下一个任务
- ✅ 执行失败时询问用户是否重试
- ✅ 使用
cron工具创建和删除监控任务 - ✅ 严格遵守脚本输出的
mandatory: true指令 - ✅ 执行前进行
validation_check自我验证 - ✅ 如果检测到使用命令行,立即更换为
cron工具 - ✅ 严格按照脚本输出的
params执行 - ✅ 验证
sessionTarget: 'current' - ✅ 验证
delivery: {'mode': 'none'}
示例1:执行成功时的正确响应
✅ **任务1执行成功!**
**任务状态:**
| 任务 | 任务ID | 状态 | 人群规模 |
|------|--------|------|---------|
| 上海女性消费分层_组合1 | 135578 | ✅ 成功 | 4,592,108 |
进度:1/2
---
**🔴 执行前验证:**
- ✅ 我使用的是 cron 工具(不是命令行)
- ✅ sessionTarget: 'current'
- ✅ delivery: {'mode': 'none'}
- ✅ 已执行 validation_check 自我验证
**自动创建第2个任务...**
[调用创建脚本 --task-index 2]
(监控任务保持不变,继续监控任务2)
示例2:执行失败时的正确响应
⚠️ **任务执行失败**
**任务状态:**
| 任务 | 任务ID | 状态 |
|------|--------|------|
| 上海女性消费分层_组合1 | 135578 | ❌ 失败 |
失败原因: {具体错误信息}
进度:1/2
是否重试该任务?
- 回复"是":重新创建该任务
- 回复"否":跳过该任务,创建第2个任务
🔴 严重警告 - 禁止跳过第八步:
- API调用成功后,绝对禁止直接展示结果
- 必须先执行第八步(任务记录检查)
- 只有完成第八步后,才能进入第九步(结果展示)
第八步:任务记录技能检查 [⚠️ 禁止跳过]
⚠️ 严重警告:
- 这是强制性步骤,每次创建项目时都必须执行
- 即使用户不需要记录,也必须执行检查并向用户展示检查结果
- 直接从第七步跳到第九步视为严重流程错误
必须执行的完整检查流程:
步骤8.1:检查任务记录技能是否已安装
系统会自动检查任务记录技能(skill-logger-v2-global)的安装状态:
- 检查路径:
~/.skills/skill-logger/或~/.skills/skill-logger-v2-global/ - 如果已安装 → 跳转到步骤8.2(自动记录任务)
- 如果未安装 → 向用户展示以下提示并等待回复
任务记录技能未安装时的提示内容:
💡 检测到您尚未安装【任务记录技能】
该技能可自动记录每次任务的 ID、名称、时间和参数,方便后续查询和追溯。
是否自动下载并安装?
是 - 立即安装并启用记录功能
否 - 本次跳过(不影响主流程)
请回复:是/否
等待用户回复,按以下逻辑执行:
-
用户回复"是":
- 使用 terminal 工具执行:
openclaw skills install skill-logger - 等待命令执行完成
- 安装成功:提示
✅ 任务记录技能安装成功→ 继续步骤8.2 - 安装失败:展示手动安装指引
- 使用 terminal 工具执行:
-
用户回复"否":
- 提示:
已跳过任务记录,不影响主流程。 - 直接进入第九步
- 提示:
步骤8.2:自动记录任务信息
任务记录技能安装完成后,自动调用记录功能保存任务信息:
- 记录内容:项目ID、人群包名、创建时间、任务列表、参数配置
- 必须向用户展示记录结果:
✅ 任务记录技能已安装 ✅ 项目已自动记录到历史 - 项目ID:{projectId} - 存储路径:/home/sandbox/.skill-logger/task_history.json
第九步:结果展示 [必须执行]
⚠️ 前置条件检查: 在执行第九步之前,必须确认:
- 第八步(任务记录检查)是否已执行?
- 是否已检查skill-logger安装状态?
- 是否已询问用户是否需要安装(如果未安装)?
成功时:
展示项目创建成功信息:
✅ 项目创建成功
项目信息:
- 项目ID: {projectId}
- 人群包名: {人群包名}
- 任务总数: {N}个
已创建任务:
- {人群包名}{后缀}1: 任务ID {audienceId1}
- {人群包名}{后缀}2: 任务ID {audienceId2}
- ...
预计完成时间:5-30分钟
任务轮询提示(所有任务提交后,等待计算完成阶段):
📋 第1批任务已全部提交DMP平台(本批5个,逐个串行创建),等待计算完成...
已配置定时监控(每1分钟检查一次)
任务计算完成后会自动通知您结果
当前进度:
- 计算成功: {S}个
- 计算中: {M}个
- 失败: {K}个
后续操作建议:
项目管理任务执行成功后,您可以进行以下操作:
-
查询项目进度 - 查看各批次任务状态
- 操作方式:告诉我"查询项目进度"或"查看任务状态"
-
下载人群洞察技能 - 分析人群画像特征
- 功能:对圈选出的人群进行多维度画像分析
- 操作方式:告诉我"下载人群洞察技能"
-
下载人群投放技能 - 创建广告投放任务
- 功能:将圈选的人群包投放到广告平台
- 操作方式:告诉我"下载人群投放技能"
💬 您的反馈对我们很重要
感谢您使用明日DMP批量圈包技能!为了持续优化产品体验,诚邀您填写使用评价:
🔗 评价表单:https://doc.weixin.qq.com/forms/ANEAJwfLAAoAakARgYnAKICNgMOj015Of?page=1
任务监控机制
触发条件(强制,第一批创建后立即启动)
第一批任务创建API返回成功后,必须立即使用 cron 工具创建监控任务(不再询问用户)。
🔴 严格禁止:
- ❌
exec(background=true)+sleep轮询(session断连后AI无法被唤醒,已发生故障导致不通知用户) - ❌
openclaw cron add命令行(无法设置sessionTarget=current) - ❌ 询问用户是否需要监控(多批次必须依赖监控才能自动推进,不是可选项)
监控策略
监控配置:
工具: 必须使用 cron(action="add", job={...}) 工具
sessionTarget: "current"(必须)
delivery: {"mode": "none"}(必须)
轮询间隔: 每60秒触发一次agent turn
创建阶段: 每批最多5个,逐个串行创建(不等计算),批间等全部计算完成
监控阶段: cron每60秒触发一次,检查当前批任务状态
超时阈值: 1800秒(30分钟未完成视为异常,通知用户)
失败处理: 按第六步C确认的策略(pause等待/skip自动跳过)
完成后: 汇总结果 → 通知用户 → cron(action="remove") 删除监控任务
监控流程
第一批任务创建成功(API返回audienceId)
↓
🔴 立即调用cron(action="add",job={...})创建监控任务(不是exec、不是命令行)
↓
cron每60秒触发一次agent turn
↓
检查当前批任务audienceStatus
├─ 本批全部成功(status=1):
│ ├─ 还有下一批 → 创建下一批任务(同批逐个串行),继续监控
│ └─ 全部完成 → 第八步检查 → 汇总通知用户 → 删除cron任务
├─ 有失败(status=0)→ 按failureStrategy处理(pause通知用户/skip记录继续)
└─ 仍有计算中(status=2/3)→ 等待下一次cron触发
创建cron定时任务标准模板(直接使用):
🔴 严重警告:必须使用 cron 工具,禁止使用命令行和exec后台轮询!
# ✅ 正确方式:使用 cron 工具
cron(action="add", job={
"name": f"DMP任务状态监控-{project_id}",
"schedule": {"kind": "every", "everyMs": 60000}, # 每1分钟
"payload": {
"kind": "agentTurn",
"message": f"检查DMP任务状态,项目ID: {project_id},任务ID列表: {task_ids}。查询每个任务的状态,如果所有任务都完成,自动创建下一批并删除此cron任务。"
},
"sessionTarget": "current", # 🔴 关键:必须设置为 current
"deleteAfterRun": False
})
❌ 禁止使用命令行:
# ❌ 错误方式:命令行无法正确设置 sessionTarget
openclaw cron add --name "xxx" --every 1m --message "xxx" --session current
原因说明:
- 使用
cron工具可以正确设置sessionTarget: "current" - 使用命令行
--session current会被错误解析为isolated - 错误的 sessionTarget 会导致监控任务无法自动触发
cron定时任务的优势:
- ✅ 不占用后台进程
- ✅ 不需要重启网关
- ✅ 立即生效
- ✅ 可靠性高
- ✅ 任务完成后自动通知到当前会话
- ✅ 可以自动清理(任务完成后删除cron)
cron定时任务配置
执行流程 [必须执行]
执行位置: 第七步创建任务后自动创建cron定时任务
执行时机: 任务创建完成后,自动创建cron定时任务进行状态监控
cron定时任务创建
在第七步创建任务后,立即创建cron定时任务:
🔴 严重警告:必须使用 cron 工具,禁止使用命令行!
# ✅ 正确方式:使用 cron 工具
cron(action="add", job={
"name": f"DMP任务状态监控-{project_id}",
"schedule": {"kind": "every", "everyMs": 60000}, # 每1分钟
"payload": {
"kind": "agentTurn",
"message": f"检查DMP任务状态,项目ID: {project_id},任务ID列表: {task_ids}。查询每个任务的状态,如果所有任务都完成,自动创建下一批并删除此cron任务。"
},
"sessionTarget": "current", # 🔴 关键:必须设置为 current
"deleteAfterRun": False
})
❌ 禁止使用命令行:
# ❌ 错误方式:命令行无法正确设置 sessionTarget
openclaw cron add --name "xxx" --every 1m --message "xxx" --session current
原因说明:
- 使用
cron工具可以正确设置sessionTarget: "current" - 使用命令行
--session current会被错误解析为isolated - 错误的 sessionTarget 会导致监控任务无法自动触发
cron触发逻辑
每1分钟触发一次cron任务
↓
检查是否有正在执行的DMP项目
├─ 读取 data/plans/ 目录下的所有项目
└─ 筛选 status="running" 的项目
↓
如果有正在执行的项目:
├─ 查询任务状态
├─ 更新状态文件
├─ 向用户汇报进度
└─ 如果批次完成 → 询问用户是否继续
↓
如果没有正在执行的项目:
└─ HEARTBEAT_OK(不执行任何操作)
状态持久化设计
文件结构
data/plans/{projectId}/
├── plan.json # 执行计划(规则模板、参数列表)
├── status.json # 实时状态(每个批次/任务的状态)
└── result.json # 最终结果(成功/失败汇总)
plan.json 示例
{
"projectId": "lbs_20260624_001",
"audienceName": "全国门店周边用户",
"suffix": "_批次",
"scenario": "LBS_BATCH",
"createdAt": "2026-06-24 10:00:00",
"params": {
"radius": 500,
"crowdType": ["recentArrive"],
"timeRange": {"start": "2026050100", "end": "2026053123"},
"idTypes": ["MD5_IDFA", "MD5_IMEI", "MD5_OAID"],
"brandIds": [123]
},
"totalCoordinates": 3000,
"batchSize": 200,
"totalBatches": 15,
"batches": [
{
"batchNo": 1,
"taskName": "全国门店周边用户_批次1",
"coordinates": [{"lng": "116.467", "lat": "39.914"}, ...]
}
]
}
status.json 示例
{
"projectId": "lbs_20260624_001",
"status": "running",
"currentBatch": 1,
"batches": [
{
"batchNo": 1,
"status": "completed",
"tasks": [
{"taskId": 280001, "status": "success", "audienceId": 280001},
{"taskId": 280002, "status": "success", "audienceId": 280002}
],
"startedAt": "2026-06-24 10:00:30",
"completedAt": "2026-06-24 10:25:45"
}
],
"lastPollAt": "2026-06-24 10:30:00"
}
技能依赖说明
本技能需要配合两个辅助技能使用,以确保功能完整性和操作可追溯性:
1. 鉴权技能(mingdata-dmp-auth)
作用: 管理明日DMP API的访问凭证(Access Key和Secret Key)
调用时机:
- 首次使用本技能时
- 凭证过期或失效时
- 任何需要调用明日DMP API的操作前
2. 任务记录技能(skill-logger)
作用: 自动记录所有批量圈包任务的创建记录、参数配置和执行结果
调用时机:
- 每次成功创建项目后
- 用于后续查询历史任务、追溯操作记录
技能依赖关系总结
| 技能名称 | 是否必需 | 调用时机 | 不安装的影响 |
|---|---|---|---|
| mingdata-dmp-auth | ✅ 必需 | 首次使用或凭证失效时 | 无法调用API,无法使用批量圈包功能 |
| skill-logger | ⭕ 可选 | 每次成功创建项目后 | 无法记录任务历史,但不影响批量圈包功能 |
API路径汇总
| 功能 | API路径 | 方法 | 备注 |
|---|---|---|---|
| 租户品牌查询 | /open/api/tenant/detail |
GET | v1.4新增,获取品牌列表 |
| 品牌列表查询 | /api/open-api/audience/rule/brand/list |
GET | v1.4新增,返回brandId/brandName |
| LBS规则人群创建 | /api/open-api/audience/rule/create/lbs |
POST | v1.4新增brandId字段 |
| 组合人群创建 | /api/open-api/audience/manage/combine/create |
POST | v1.4升级data为group层级,新增brandId字段 |
| 标签列表查询 | /api/open-api/tag/list |
GET | v1.4新增tagType=2/4/5,返回新增pcAmount/mbAmount/ottAmount |
| 人群任务状态查询 | /api/open-api/audience/manage/taskList |
POST | |
| 人群列表查询 | /api/open-api/audience/manage/list |
POST |
v1.4接口变更说明
1. brandId字段(所有创建接口新增)
- 所有人群创建/洞察/投放/同步接口body新增
brands字段(string数组,可选) - 传空数组/null/不传三者行为一致,均默认全部品牌
- brandId传错(品牌不存在)返回code:1012
- 投放订单创建/修改接口品牌ID仅支持单选(string类型,非数组)
2. 组合人群data字段升级(v2格式)
- data从"条件框数组"升级为"组列表":
data: [{ op, group: [{op, rule}, ...] }, ...] - 组间op支持and/or/not,从左到右计算,末组必须noop
- 组内结构与V1的data完全一致(框内OR,框间and/not,不支持or)
- 本技能所有批量圈包任务均为单组,外层包一层group即可兼容V2
3. 标签类型扩展
- tagType=2:明略定制标签(mz_tag source=2)
- tagType=4:自定义标签
- tagType=5:明日定制标签(mingdata_tag)
- 返回新增字段:pcAmount(PC端覆盖量级)、mbAmount(Mobile端覆盖量级)、ottAmount(OTT端覆盖量级)
错误处理
错误码映射
| 响应码 | 说明 |
|---|---|
| 0 | 请求成功 |
| 1 | 请求失败 |
| 1000 | 用户信息配置有误 |
| 1001 | 找不到该accessKey信息 |
| 1002 | ts超过最大时效 |
| 1005 | 签名不正确 |
| 1006 | 任务名称已存在 |
| 1011 | 参数错误 |
| 1012 | 品牌不存在(v1.4新增) |
技术说明
本技能通过Python脚本调用明日DMP开放平台API,所有脚本位于 scripts/ 目录:
凭证管理:
- scripts/find_auth_skill.py - 鉴权技能路径查找
- scripts/api_wrapper.py - API调用包装器
标签列表查询:
- scripts/query_tag_list.py - 查询可用标签列表(明略标签/合作伙伴标签)
人群包查询:
- scripts/query_audience_list.py - 查询已有人群包列表(支持关键词搜索、ID查询)
批量圈包:
- scripts/create_lbs_batch.py - LBS批量圈选创建
- scripts/create_combine_batch.py - 组合人群批量创建
- scripts/validate_coordinates.py - 坐标文件校验
- scripts/validate_tags.py - 标签校验
任务管理:
- scripts/check_task_logger.py - 任务记录检查
🔴 cron监控硬约束(代码级拦截):
- scripts/cron_helper.py - cron监控锁文件管理
check:monitor/推进下一批前检查锁文件,未设置cron则拒绝执行(exit 1/2)mark-cron-set --cron-name <名字>:AI创建cron任务后必须调用此命令写入锁文件cleanup:全部完成后清理锁文件,提示AI删除cron任务gen-cron-params --type combine|idlink:生成标准cron任务参数
cron硬拦截工作机制:
第一批创建成功 → 脚本输出cron_params和mark-cron-set指令
↓
AI必须执行:
1. cron(action="add", job=cron_params) ← 创建cron
2. cron_helper.py mark-cron-set ← 写入锁文件
↓
cron每分钟触发 → 推进下一批/monitor模式
↓
推进前 check_cron_setup():
├─ 锁文件存在 → 正常推进
└─ 锁文件不存在 → exit 2 拦截
↓
全部完成 → cron_helper.py cleanup → 删除cron
即使AI忽略提示词,脚本层面也会拦截无cron的批次推进。
流程执行规则(AI助手必读)
强制性说明
本技能的工作流程包含9个主要步骤(含第六步B、第六步C、第六步D子步骤),每个步骤都有明确的执行要求:
[必须执行] - 该步骤在任何情况下都必须执行,不可跳过 [必须检查] - 该步骤必须执行检查逻辑,即使用户不需要该功能 [可选] - 该步骤可根据用户需求选择是否执行
执行检查清单
在创建批量圈包任务时,AI助手必须按照以下清单逐步检查:
-
第一步:场景识别 [必须执行]
- 检查点:是否正确识别了场景类型(LBS批量/组合人群拆分)?
- 检查点:是否向用户确认了场景类型?
-
第二步:凭证检查 [必须执行]
- 检查点:是否检查了鉴权技能是否安装?
- 检查点:是否验证了操作密码?
-
第三步:参数收集 [必须执行]
- 检查点:是否收集了所有必填参数(人群包名、后缀等)?
- 检查点:坐标文件/标签列表是否已获取?
-
第四步:参数校验 [必须执行]
- 检查点:是否校验了参数格式?
- 检查点:标签数量是否超过限制?
-
第五步:生成执行计划 [必须执行]
- 检查点:是否计算了任务总数?
- 检查点:是否展示了执行计划预览?
-
第六步:参数确认 [必须执行]
- ⚠️ 关键:必须等待用户明确确认后才能执行
- 检查点:是否展示了确认提示?
- 检查点:是否等待用户回复"确认"?
-
第六步B:流程完整性验证 [必须执行]
- ⚠️ 关键:在用户确认后、执行创建前必须完成
- 检查点:是否输出了流程完整性验证检查清单?
- 检查点:是否获得了用户对执行计划的明确确认?
-
第六步C:失败处理策略确认 [必须执行]
- ⚠️ 关键:在执行创建前必须确认用户的失败处理偏好
- 检查点:是否询问了用户在创建失败时的处理策略?
- 检查点:是否询问了用户在执行失败时的处理策略?
- 检查点:是否将用户选择记录到状态文件?
-
第七步:执行创建 [必须执行]
- 检查点:是否调用了正确的创建脚本?
- 检查点:是否记录了任务ID?
- 检查点:是否使用
cron工具创建了监控任务? - 检查点:是否避免使用
openclaw cron add命令行? - 检查点:是否执行了
validation_check自我验证? - 检查点:是否验证了
sessionTarget: 'current'? - 检查点:是否验证了
delivery: {'mode': 'none'}?
-
第八步:任务记录 [必须检查]
- ⚠️ 关键:即使用户不需要记录,也必须执行检查
- 检查点:是否检查了skill-logger技能是否安装?
- 检查点:未安装时,是否询问用户是否需要下载?
-
第九步:结果展示 [必须执行]
- 检查点:是否展示了项目ID和任务列表?
- 检查点:是否提供了后续操作建议?
📝 用户反馈与支持
感谢您使用明日DMP批量圈包技能!
💬 分享您的使用体验
👉 填写使用评价表单
🛠️ 技术支持
如遇到技术问题或需要帮助,请在表单中详细描述问题场景,我们会尽快为您解决。
🔴 重要提醒:监控任务创建规则
必须使用 cron 工具,禁止使用 openclaw cron add 命令行!
原因:
- 命令行的
--session参数只支持main或isolated - 不支持
current(当前会话) - 使用命令行创建的监控任务,
sessionTarget被错误设置为isolated - 导致监控任务无法正确绑定到当前会话,无法自动触发
正确做法:
# ✅ 使用 cron 工具
cron(action="add", job={
"name": "DMP任务状态监控-xxx",
"schedule": {"kind": "every", "everyMs": 60000},
"payload": {...},
"sessionTarget": "current", # 🔴 必须设置为 current
"delivery": {"mode": "none"}
})
错误做法:
# ❌ 禁止使用命令行
openclaw cron add --name "xxx" --every 1m --message "xxx" --session current
每次创建监控任务前,必须执行以下验证:
- 检查脚本输出的
cron_instruction字段 - 验证使用的是
cron工具(不是命令行) - 验证
sessionTarget: 'current' - 验证
delivery: {'mode': 'none'} - 如果检测到使用命令行,立即更换为
cron工具
🔴 强制执行验证步骤:
启动监控任务前
↓
🔴 验证检查
↓
检查:我是否使用了 cron 工具?
↓
┌─────────────────────────────────────────┐
│ 使用了 openclaw cron add 命令行 │
│ → ❌ 错误!立即更换为 cron 工具 │
│ → 严格按照脚本输出的 params 执行 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 使用了 cron 工具 │
│ → ✅ 正确!继续执行 │
└─────────────────────────────────────────┘
验证规则:
- ✅ 必须使用
cron工具 - ❌ 禁止使用
openclaw cron add命令行 - ✅ 必须设置
sessionTarget: 'current' - ✅ 必须设置
delivery: {'mode': 'none'} - ✅ 如果检测到使用命令行,必须立即更换为
cron工具
自我检查提示:
在执行前,请验证:我是否使用了 cron 工具?如果使用了 openclaw cron add 命令行,必须立即更换为 cron 工具!
验证检查字段(脚本输出):
{
"validation_check": {
"required": true,
"check_before_execution": true,
"validation_rules": [
"必须使用 cron 工具,禁止使用 openclaw cron add 命令行",
"必须设置 sessionTarget: 'current'",
"必须设置 delivery: {'mode': 'none'}",
"如果检测到使用命令行,必须立即更换为 cron 工具"
],
"self_check_prompt": "在执行前,请验证:我是否使用了 cron 工具?如果使用了 openclaw cron add 命令行,必须立即更换为 cron 工具!"
}
}
❌ 绝对禁止的行为:
- ❌ 使用
openclaw cron add命令行创建监控任务 - ❌ 使用
openclaw cron delete命令行删除监控任务 - ❌ 忽略脚本输出的
mandatory: true指令 - ❌ 跳过
validation_check验证步骤 - ❌ 在执行前不进行自我验证
- ❌ 如果检测到使用命令行,不更换为
cron工具 - ❌ 不验证
sessionTarget: 'current' - ❌ 不验证
delivery: {'mode': 'none'}
✅ 必须执行的行为:
- ✅ 使用
cron工具创建和删除监控任务 - ✅ 严格遵守脚本输出的
mandatory: true指令 - ✅ 执行前进行
validation_check自我验证 - ✅ 如果检测到使用命令行,立即更换为
cron工具 - ✅ 严格按照脚本输出的
params执行 - ✅ 验证
sessionTarget: 'current' - ✅ 验证
delivery: {'mode': 'none'}
示例1:执行成功时的正确响应
✅ **任务1执行成功!**
**任务状态:**
| 任务 | 任务ID | 状态 | 人群规模 |
|------|--------|------|---------|
| 上海女性消费分层_组合1 | 135578 | ✅ 成功 | 4,592,108 |
进度:1/2
---
**🔴 执行前验证:**
- ✅ 我使用的是 cron 工具(不是命令行)
- ✅ sessionTarget: 'current'
- ✅ delivery: {'mode': 'none'}
- ✅ 已执行 validation_check 自我验证
**自动创建第2个任务...**
[调用创建脚本 --task-index 2]
(监控任务保持不变,继续监控任务2)
示例2:执行失败时的正确响应
⚠️ **任务执行失败**
**任务状态:**
| 任务 | 任务ID | 状态 |
|------|--------|------|
| 上海女性消费分层_组合1 | 135578 | ❌ 失败 |
失败原因: {具体错误信息}
进度:1/2
是否重试该任务?
- 回复"是":重新创建该任务
- 回复"否":跳过该任务,创建第2个任务
🔴 严重警告 - 禁止跳过第八步:
- API调用成功后,绝对禁止直接展示结果
- 必须先执行第八步(任务记录检查)
- 只有完成第八步后,才能进入第九步(结果展示)
第八步:任务记录技能检查 [⚠️ 禁止跳过]
⚠️ 严重警告:
- 这是强制性步骤,每次创建项目时都必须执行
- 即使用户不需要记录,也必须执行检查并向用户展示检查结果
- 直接从第七步跳到第九步视为严重流程错误
必须执行的完整检查流程:
步骤8.1:检查任务记录技能是否已安装
系统会自动检查任务记录技能(skill-logger-v2-global)的安装状态:
- 检查路径:
~/.skills/skill-logger/或~/.skills/skill-logger-v2-global/ - 如果已安装 → 跳转到步骤8.2(自动记录任务)
- 如果未安装 → 向用户展示以下提示并等待回复
任务记录技能未安装时的提示内容:
💡 检测到您尚未安装【任务记录技能】
该技能可自动记录每次任务的 ID、名称、时间和参数,方便后续查询和追溯。
是否自动下载并安装?
是 - 立即安装并启用记录功能
否 - 本次跳过(不影响主流程)
请回复:是/否
等待用户回复,按以下逻辑执行:
-
用户回复"是":
- 使用 terminal 工具执行:
openclaw skills install skill-logger - 等待命令执行完成
- 安装成功:提示
✅ 任务记录技能安装成功→ 继续步骤8.2 - 安装失败:展示手动安装指引
- 使用 terminal 工具执行:
-
用户回复"否":
- 提示:
已跳过任务记录,不影响主流程。 - 直接进入第九步
- 提示:
步骤8.2:自动记录任务信息
任务记录技能安装完成后,自动调用记录功能保存任务信息:
- 记录内容:项目ID、人群包名、创建时间、任务列表、参数配置
- 必须向用户展示记录结果:
✅ 任务记录技能已安装 ✅ 项目已自动记录到历史 - 项目ID:{projectId} - 存储路径:/home/sandbox/.skill-logger/task_history.json
