xiaomi-outbound-call触发阿里云晓蜜外呼机器人任务,自动批量拨打电话。适用于批量外呼、客户回访、满意度调查、简历筛查约面试等场景。可从前置工具或节点获取外呼名单。
Install via ClawdBot CLI:
clawdbot install Raven-XIA/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 文件。重要:请仔细分析用户场景,提取尽可能多的信息来构建智能体配置。
当用户提供外呼场景时,你应该:
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 = "蓝领简历筛查后约面试";
{
"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
本技能专注于外呼任务的创建和启动,包括:
本技能不包括:
如需查看外呼结果,请在阿里云晓蜜控制台查看。
Generated Mar 1, 2026
Automates outbound calls to screen candidates and schedule interviews based on resume screening results. Extracts phone numbers from candidate data, generates detailed agent profiles for recruitment roles, and confirms interview times with candidates.
Conducts automated phone surveys to gather feedback from customers post-purchase or service. Uses agent profiles tailored for customer service roles to ensure polite and efficient data collection, with workflows designed to handle common responses.
Executes outbound marketing calls for product launches or seasonal promotions. Builds agent profiles with sales-focused roles, communication styles, and workflows to introduce products, address objections, and drive conversions.
Automates follow-up calls to existing clients for renewal reminders, updates, or loyalty programs. Designs agent profiles with background on client history and goals to maintain relationships and reduce churn.
Offers tiered subscription plans for businesses based on call volume and advanced features like detailed analytics and custom agent profiles. Revenue is generated through monthly or annual fees, with upsells for premium support.
Charges customers per outbound call made, with pricing varying by call duration and complexity (e.g., survey vs. sales calls). Suitable for businesses with fluctuating call needs, with additional fees for setup and integration.
Provides customized solutions for large organizations, including integration with existing CRM systems, dedicated support, and bulk discounts. Revenue comes from one-time licensing fees and ongoing maintenance contracts.
💬 Integration Tip
Ensure Node.js environment is set up and configure Alibaba Cloud credentials via environment variables before use.
Transcribe audio via OpenAI Audio Transcriptions API (Whisper).
Local speech-to-text with the Whisper CLI (no API key).
ElevenLabs text-to-speech with mac-style say UX.
Text-to-speech conversion using node-edge-tts npm package for generating audio from text. Supports multiple voices, languages, speed adjustment, pitch control, and subtitle generation. Use when: (1) User requests audio/voice output with the "tts" trigger or keyword. (2) Content needs to be spoken rather than read (multitasking, accessibility, driving, cooking). (3) User wants a specific voice, speed, pitch, or format for TTS output.
End-to-end encrypted agent-to-agent private messaging via Moltbook dead drops. Use when agents need to communicate privately, exchange secrets, or coordinate without human visibility.
Text-to-speech via OpenAI Audio Speech API.