Install
openclaw skills install xiaomi-outbound-call触发阿里云晓蜜外呼机器人任务,自动批量拨打电话。适用于批量外呼、客户回访、满意度调查、简历筛查约面试等场景。可从前置工具或节点获取外呼名单。
openclaw skills install xiaomi-outbound-call自动化外呼机器人技能,用于批量电话外呼。
创建 taskInput.json 文件:
{
"phoneNumbers": ["13800138000", "13900139000"],
"scenarioDescription": "春季新品推广,了解客户购买意向",
"taskName": "春季促销活动"
}
执行:
node scripts/bundle.js taskInput.json
ARGUMENTS='{"phoneNumbers":["13800138000"],"scenarioDescription":"测试外呼"}' \
node scripts/bundle.js
当用户提供外呼需求时,不要只提取电话号码和简单描述,而应该:
agentProfile,包含所有 11 个字段workflow 中体现具体的沟通步骤❌ 不好的做法(信息丢失):
{
"phoneNumbers": ["15611207961"],
"scenarioDescription": "建议反馈",
"taskName": "建议外呼"
}
问题:丢失了"面试邀约"、"后天晚上八点"、"备选时间"等关键信息
✅ 好的做法(充分利用信息):
{
"phoneNumbers": ["15611207961"],
"scenarioDescription": "Java 开发岗位面试邀约 - 优秀候选人",
"taskName": "面试邀约",
"agentProfile": {
"role": "招聘专员",
"background": "Java 开发岗位招聘,候选人简历优秀",
"goals": "确认后天晚上八点面试时间,不方便则协商大后天",
"workflow": "自我介绍 -> 说明来意 -> 确认后天晚上八点 -> 备选时间 -> 记录反馈",
"openingPrompt": "您好,我是XX公司招聘专员,看到您的简历非常优秀"
}
}
当用户提到以下场景时使用此技能:
⚠️ 重要提示:使用此技能时,请务必:
需要在环境变量中配置阿里云 AK/SK:
export ALIYUN_OUTBOUND_BOT_ACCESS_KEY_ID="your-access-key-id"
export ALIYUN_OUTBOUND_BOT_ACCESS_KEY_SECRET="your-access-key-secret"
详细配置说明请参考 references/config.md
必须在阿里云晓蜜控制台申请并绑定外呼号码,否则无法进行外呼。
技能会在执行外呼前自动检查:
❌ 租户下无绑定号码,无法进行外呼。
请先在阿里云晓蜜控制台申请并绑定外呼号码。
只需要 Node.js 环境(版本 >= 18)即可运行。
当你(Agent)需要帮助用户执行外呼任务时,请遵循以下步骤:
场景 A: 从前置节点获取(如简历筛查、客户查询等)
如果用户的请求是多步骤任务的一部分(例如:"给昨天收集到的蓝领简历进行筛查并约面试"),你应该:
场景 B: 用户直接提供
如果用户直接提供电话号码或明确的外呼需求,收集以下信息:
如果信息不完整,使用 ask questions 工具向用户询问。
在执行外呼任务前,必须向用户展示并确认以下信息:
准备执行外呼任务,请确认以下信息:
📋 任务信息
- 任务名称: 面试邀约
- 外呼场景: Java 开发岗位面试邀约 - 优秀候选人
- 智能体角色: 招聘专员
- 外呼目标: 确认后天晚上八点面试时间,不方便则协商大后天
📞 外呼名单(共 1 人)
1. 15611207961
是否确认执行外呼?
重要提示:
主要方式:创建 taskInput.json 文件 ⭐
将收集到的信息格式化为 JSON 文件。重要:请仔细分析用户场景,提取尽可能多的信息来构建智能体配置。
当用户提供外呼场景时,你应该:
分析场景类型 - 识别是招聘、销售、客服、调查等哪种场景
提取关键信息 - 从用户描述中提取:
构建 agentProfile - 根据场景自动生成:
role: 根据场景推断(如"招聘专员"、"销售顾问")background: 提取业务背景(如"Java 开发岗位面试邀约")goals: 明确外呼目标(如"确认候选人后天晚上八点是否方便参加面试")workflow: 设计对话流程(如"问候 -> 说明来意 -> 确认时间 -> 备选方案 -> 记录反馈")openingPrompt: 生成得体的开场白(如"您好,我是XX公司的招聘专员")用户场景:
给 15611207961 这个优秀的人邀约面试,后天晚上八点是否方便参加面试,如不方便则询问大后天任意时间
应该生成的完整 JSON:
{
"phoneNumbers": ["15611207961"],
"scenarioDescription": "Java 开发岗位面试邀约 - 优秀候选人",
"taskName": "面试邀约",
"agentProfile": {
"name": "李敏",
"gender": "女",
"age": 28,
"role": "招聘专员",
"communicationStyle": ["专业", "友好", "高效"],
"background": "Java 开发岗位招聘,候选人简历优秀,需要邀约面试",
"goals": "确认候选人后天(X月X日)晚上八点是否方便参加面试,如不方便则协商大后天的时间",
"skills": "面试邀约、时间协调、候选人沟通",
"workflow": "自我介绍 -> 说明来意(面试邀约)-> 确认后天晚上八点 -> 如不方便询问大后天时间 -> 记录反馈 -> 发送面试详情",
"constraint": "保持专业、尊重候选人时间、提供灵活的时间选择",
"openingPrompt": "您好,我是XX公司的招聘专员李敏,看到您的简历非常优秀"
}
}
❌ 不够好的示例(信息提取不充分):
{
"phoneNumbers": ["15611207961"],
"scenarioDescription": "建议反馈",
"taskName": "建议外呼",
"type": "service"
}
技能支持多种输入格式,会自动识别并解析:
格式 1: 标准格式(推荐):
{
"phoneNumbers": ["13800138000", "13900139000"],
"scenarioDescription": "春季新品推广,了解客户购买意向",
"taskName": "春季促销活动",
"agentProfile": {
"name": "小美",
"gender": "女",
"age": 25,
"role": "销售顾问",
"communicationStyle": ["热情", "专业", "亲切"],
"background": "春季新品推广活动",
"goals": "了解客户购买意向,促成交易",
"skills": "产品介绍、需求挖掘、促成交易",
"workflow": "问候 -> 了解需求 -> 介绍产品 -> 处理异议 -> 促成合作",
"constraint": "保持礼貌、尊重对方意愿、不强制推销",
"openingPrompt": "您好,我是小美,春季新品推广活动的销售顾问"
}
}
注意: agentProfile 中的所有字段都是可选的。如果不提供,系统会根据 scenarioDescription 智能推断合适的配置。
格式 2: 简化格式:
{
"phones": "13800138000,13900139000",
"scenario": "产品推广",
"name": "春季促销"
}
格式 3: 候选人/简历筛查格式(前置节点):
{
"candidates": [
{ "name": "张三", "phone": "13800138000", "score": 85 },
{ "name": "李四", "phone": "13900139000", "score": 90 }
],
"scenarioDescription": "面试邀约 - 蓝领岗位简历筛查通过",
"taskName": "蓝领简历筛查后约面试",
"previousStep": "简历筛查"
}
格式 4: CRM/外部工具格式:
{
"data": {
"contacts": [
{ "phone": "13800138000", "name": "张三" },
{ "phone": "13900139000", "name": "李四" }
],
"purpose": "客户回访",
"campaignName": "满意度调查"
},
"toolName": "CRM-System"
}
格式 5: 通用列表格式:
[
{ "phone": "13800138000", "name": "张三" },
{ "phone": "13900139000", "name": "李四" }
]
注意:使用此格式时,scenarioDescription 会默认为"批量外呼"
虽然 agentProfile 是可选的,但强烈建议 Agent 根据用户场景主动构建完整的智能体配置。
提供完整的 agentProfile 可以:
技能支持自定义外呼智能体的人设和行为。可以通过 agentProfile 字段配置:
| 字段 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
name | string | 否 | 智能体名称 | "小美"、"小智" |
gender | string | 否 | 性别 | "男"、"女" |
age | number | 否 | 年龄 | 25 |
role | string | 否 | 身份角色 | "销售顾问"、"招聘专员"、"客服专员" |
communicationStyle | string[] | 否 | 沟通风格 | ["热情", "专业", "亲切"] |
background | string | 否 | 业务背景 | "春季新品推广活动" |
goals | string | 否 | 业务目标 | "了解客户购买意向,促成交易" |
skills | string | 否 | 业务技能 | "产品介绍、需求挖掘、促成交易" |
workflow | string | 否 | 工作流程 | "问候 -> 了解需求 -> 介绍产品 -> 促成合作" |
constraint | string | 否 | 约束条件 | "保持礼貌、尊重对方意愿、不强制推销" |
openingPrompt | string | 否 | 开场白 | "您好,我是小美" |
如果不提供 agentProfile 或部分字段,系统会根据 scenarioDescription 智能推断:
招聘场景:
{
"phoneNumbers": ["13800138000"],
"scenarioDescription": "面试邀约 - Java 开发工程师",
"agentProfile": {
"name": "李敏",
"role": "招聘专员",
"openingPrompt": "您好,我是李敏,XX公司的招聘专员"
}
}
保险场景:
{
"phoneNumbers": ["13800138000"],
"scenarioDescription": "重疾险产品推荐",
"agentProfile": {
"name": "王顾问",
"role": "保险顾问",
"communicationStyle": ["专业", "耐心", "诚恳"]
}
}
这是推荐的主要输入方式。创建一个 JSON 文件(通常命名为 taskInput.json),包含外呼任务的所有参数。
{
"phoneNumbers": ["13800138000", "13900139000"],
"scenarioDescription": "春季新品推广,了解客户购买意向",
"taskName": "春季促销活动",
"agentProfile": {
"name": "小美",
"gender": "女",
"age": 25,
"role": "销售顾问",
"communicationStyle": ["热情", "专业", "亲切"],
"background": "春季新品推广活动",
"goals": "了解客户购买意向,促成交易",
"skills": "产品介绍、需求挖掘、促成交易",
"workflow": "问候 -> 了解需求 -> 介绍产品 -> 处理异议 -> 促成合作",
"constraint": "保持礼貌、尊重对方意愿、不强制推销",
"openingPrompt": "您好,我是小美,春季新品推广活动的销售顾问"
},
"metadata": {
"source": "manual",
"campaign": "spring-2024"
}
}
{
"phoneNumbers": ["13800138000"],
"scenarioDescription": "测试外呼"
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
phoneNumbers | string[] | ✅ 是 | 电话号码列表,中国大陆手机号(11位,1开头) |
scenarioDescription | string | ✅ 是 | 外呼场景描述,用于生成话术和智能体配置 |
taskName | string | 否 | 任务名称,便于识别 |
agentProfile | object | 否 | 智能体配置,不提供则自动推断 |
metadata | object | 否 | 额外元数据,可存储任何自定义信息 |
# 使用 JSON 文件
node scripts/bundle.js taskInput.json
# 或使用其他文件名
node scripts/bundle.js my-task.json
适用于 Cursor Agent 或需要通过环境变量传递参数的场景:
ARGUMENTS='{"phoneNumbers":["13800138000"],"scenarioDescription":"测试"}' \
node scripts/bundle.js
如果不提供任何参数,技能会进入交互式模式,逐步询问:
node scripts/bundle.js
# 会提示输入:
# - 电话号码列表
# - 场景描述
# - 任务名称
技能会按以下顺序查找输入:
在用户确认后,执行外呼任务:
方式 A: 使用 JSON 文件(推荐)
node scripts/bundle.js taskInput.json
方式 B: 使用 $ARGUMENTS 环境变量
ARGUMENTS='{"phoneNumbers":["13800138000"],"scenarioDescription":"测试"}' \
node scripts/bundle.js
输入优先级:
$ARGUMENTS 环境变量用户: "给昨天收集到的蓝领简历进行筛查并约面试"
Agent 操作流程:
执行前置步骤 - 调用简历筛查工具
[简历筛查工具返回]
{
"candidates": [
{ "name": "张三", "phone": "13800138000", "score": 85 },
{ "name": "李四", "phone": "13900139000", "score": 90 }
]
}
提取电话号码 - 从筛查结果中提取
phoneNumbers = ["13800138000", "13900139000"];
生成场景描述 - 根据用户意图自动生成
scenarioDescription = "面试邀约 - 蓝领岗位简历筛查通过";
taskName = "蓝领简历筛查后约面试";
创建 taskInput.json 文件
{
"phoneNumbers": ["13800138000", "13900139000"],
"scenarioDescription": "面试邀约 - 蓝领岗位简历筛查通过",
"taskName": "蓝领简历筛查后约面试",
"agentProfile": {
"role": "招聘专员",
"openingPrompt": "您好,我是XX公司的招聘专员"
},
"metadata": {
"source": "resume-screening",
"previousStep": "简历筛查",
"candidates": [
{ "name": "张三", "phone": "13800138000", "score": 85 },
{ "name": "李四", "phone": "13900139000", "score": 90 }
]
}
}
执行外呼技能
node scripts/bundle.js taskInput.json
关键点:
用户: "帮我给 13800138000 和 13900139000 打电话,做春季促销推广"
Agent 操作:
["13800138000", "13900139000"]"春季促销推广"taskInput.json:{
"phoneNumbers": ["13800138000", "13900139000"],
"scenarioDescription": "春季促销推广",
"taskName": "春季促销"
}
node scripts/bundle.js taskInput.json用户: "我有个客户名单,帮我做满意度回访"
Agent 操作:
ask questions 工具询问号码列表taskInput.json:{
"phoneNumbers": ["13800138000", "13900139000", "..."],
"scenarioDescription": "客户满意度回访",
"taskName": "满意度调查"
}
node scripts/bundle.js taskInput.json用户: "用 customers.json 里的号码做产品推广"
Agent 操作:
customers.json 文件内容taskInput.json:{
"phoneNumbers": ["提取的号码列表"],
"scenarioDescription": "产品推广",
"taskName": "产品推广活动"
}
node scripts/bundle.js taskInput.json技能执行时会自动完成以下步骤:
1. 验证输入 - 检查电话号码格式和必需参数
↓
2. 创建实例 - 获取或创建阿里云晓蜜外呼实例
↓
3. 确认绑定号码 - 检查租户是否有绑定号码 ⚠️ 关键步骤
├─ 如果没有绑定号码 → 终止流程,提示用户配置
└─ 如果有绑定号码 → 自动绑定到实例,继续执行
↓
4. 创建话术 - 根据场景描述生成外呼话术
↓
5. 创建任务组 - 在阿里云晓蜜平台创建外呼任务组
↓
6. 启动外呼 - 开始批量拨打电话
↓
7. 返回结果 - 输出任务组 ID 和执行状态
这是主要的输入方式。创建 taskInput.json 文件:
{
"phoneNumbers": ["13800138000", "13900139000"],
"scenarioDescription": "了解客户满意度",
"taskName": "客户回访",
"agentProfile": {
"role": "客服专员",
"openingPrompt": "您好,我是XX公司的客服专员"
}
}
执行:
node scripts/bundle.js taskInput.json
适用于 Cursor Agent 或脚本调用:
ARGUMENTS='{"phoneNumbers":["13800138000"],"scenarioDescription":"测试"}' \
node scripts/bundle.js
# 指定 JSON 文件
node scripts/bundle.js taskInput.json
# 指定实例 ID 和脚本 ID(复用已有资源)
node scripts/bundle.js taskInput.json --instance-id xxx --script-id yyy
技能执行完成后会输出:
{
taskInput: {
phoneNumbers: string[];
scenarioDescription: string;
taskName?: string;
metadata?: Record<string, any>;
},
jobGroupId: string; // 任务组 ID
instanceId: string; // 外呼实例 ID
scriptId: string; // 话术脚本 ID
totalPhones: number; // 拨打的电话数量
}
错误:
❌ 租户下无绑定号码,无法进行外呼。
请先在阿里云晓蜜控制台申请并绑定外呼号码。
原因: 租户未在阿里云晓蜜控制台申请和绑定外呼号码
解决:
注意:
错误: "请配置阿里云 AK/SK 环境变量"
解决:
export ALIYUN_OUTBOUND_BOT_ACCESS_KEY_ID="your-key"
export ALIYUN_OUTBOUND_BOT_ACCESS_KEY_SECRET="your-secret"
错误: "电话号码格式不正确"
解决: 确保号码是中国大陆手机号(1开头的11位数字)
错误: "创建任务组失败"
可能原因:
解决: 检查阿里云晓蜜控制台的实例和脚本状态
node scripts/bundle.js [options]
Options:
--json <file> 从 JSON 文件读取任务配置
--no-interactive 禁用交互式输入
--instance-id <id> 指定外呼实例 ID
--script-id <id> 指定话术脚本 ID
本技能专注于外呼任务的创建和启动,包括:
本技能不包括:
如需查看外呼结果,请在阿里云晓蜜控制台查看。