4.7 KiB
add-audience 技能 · 安装与调用说明
把「添加受众目标」的完整接口链路封装给大模型调用:模型写好受众 JSON → 脚本登录任务系统 → 自动执行查重、删除同名(含关系表)、创建受众与账号关联 → 把每个接口的入参与调用结果如实回报给用户。
一、安装
方式 A(推荐):在技能管理界面上传 add-audience.skill(本质是 zip,内含 add-audience/ 目录:SKILL.md + config + scripts)。
方式 B(手工):把 add-audience/ 目录解压到 DeerFlow 后端的 skills/custom/ 下,然后调用一次 POST /skills/reconcile-custom 收编注册。
安装后技能名:add-audience。若安装到 public,文档中的 /mnt/skills/custom/... 路径对应换成 /mnt/skills/public/...。
二、配置(config/audience_api.json)
| 配置项 | 默认值 | 说明 |
|---|---|---|
base_url |
http://127.0.0.1:4913 |
任务系统地址(到端口,不带 /api);按实际环境修改,如 http://192.168.1.11:3912 |
username / password |
admin / ch@user |
登录账号,取自前端登录页写死的默认值,可自行修改 |
auth.* |
/api/auth/login + Authorization: Bearer {token} |
登录路径、token 字段与请求头拼装规则,一般不用动 |
endpoints.* |
/api/task/task-action-design 等 |
完整链路涉及的全部接口路径 |
request.verify_ssl |
false |
已关闭 HTTPS 证书校验,适配自签证书内网;公网环境建议改 true |
request.timeout_seconds |
30 |
单请求超时 |
环境变量覆盖:AUDIENCE_API_BASE_URL、AUDIENCE_API_USERNAME、AUDIENCE_API_PASSWORD、AUDIENCE_API_VERIFY_SSL。
三、鉴权与请求头
- 脚本先
POST {base_url}/api/auth/login,请求体{"username": "...", "password": "..."}; - 从响应取
access_token; - 后续所有业务请求附加请求头
Authorization: Bearer {access_token}(即auth.header_name+auth.header_template)。
证书校验通过 Python ssl 上下文关闭(verify_ssl=false 时),HTTPS 自签名证书可直接访问。
四、完整调用链
对载荷中的每个受众组依次执行:
| 步骤 | 接口 | 说明 |
|---|---|---|
| 1 | POST /api/auth/login |
登录换 token |
| 2 | GET /api/task/task-action-design?filter=taskId&filter=actionId |
查当前行动下已有受众(查重) |
| 3a | GET /api/task/task-action-design-pathway-relation?filter=actionId |
查关系表,找同名受众的 pathwayId |
| 3b | DELETE /api/task/task-action-pathway-account/{pathwayId} |
逐条删除关系表记录(同名时) |
| 3c | DELETE /api/task/task-action-design/deleteDesignVulns?designId={id} |
删除受众关联脆弱点(同名时) |
| 3d | DELETE /api/task/task-action-design/{id} |
删除同名旧受众本身 |
| 4 | POST /api/task/task-action-design |
创建受众目标,parentTargetAudience 固定 大模型生成,recReason 自动清洗 <n> 引用标记 |
| 5 | POST /api/task/task-action-design-account(每账号一次) |
字段映射:accountId←user.id、accountName←user.name、accountPlat←user.platformType、accountSource←user.dataSource(缺失回退 user.score)、frofileInfo←整个user对象JSON、designId←步骤4返回id |
五、载荷格式
{
"taskId": 101,
"actionId": 201,
"audienceList": [
{
"targetAudience": "18-30岁智能穿戴尝鲜用户",
"recReason": "对新形态设备接受度高……",
"userList": [ { "id": "...", "name": "...", "platformType": 1, "dataSource": "target", "...": "完整user对象" } ]
}
]
}
targetAudience 也可写作 groupName(对齐前端对话链路字段名)。
六、输出与验证
脚本 stdout 输出单段 JSON:
入参摘要:taskId/actionId 与各受众组(名称、清洗后理由、账号数)calls:每个接口的 method/url/请求体(密码、token 脱敏)/HTTP 状态/响应groups:每组结果(designId、新增账号数、删除的旧受众及关系表记录数)summary/人读摘要:统计与人读结论
验证是否真正入库:GET {base_url}/api/task/task-action-design?filter=taskId||$eq||{taskId} 与 .../task-action-design-account?... 应能看到新建记录。
七、注意事项
- 密码明文存于 config,部署环境请控制文件访问权限,或改用环境变量注入。
- 同名受众默认「先删后建」(与前端对话链路一致);需要跳过语义时应先改造脚本再加策略参数。
- 业务失败(如创建受众返回非 201)时脚本继续处理其余受众组,整体
success=false,退出码 2;登录失败立即退出,退出码 1。