Yanxi AI Call - 智能外呼服务
用户有打电话意图 → 意图提取 → 信息收集 → 确认 → 调用外呼 → 检查结果 → 补充信息(如需)
⚠️ 隐私声明与用户确认
重要:在调用外呼接口前,必须向用户展示确认卡片并获得明确同意。
数据收集与传输
本 skill 会收集以下信息并发送到 Yanxi AI 外呼服务:
| 数据类型 | 用途 | 是否传输 | 是否本地存储 |
|---|---|---|---|
| 电话号码 | 外呼目标号码 | ✓ | ✓ |
| 对话上下文 | AI 理解通话目的 | ✓ | ✓ |
| 通话记录 | 状态和日志 | - | ✓ |
第三方服务
- API 提供方:Yanxi AI Call(京东言犀智能外呼平台)
- API 端点:
https://yanxi-ai-api.jd.com - 隐私政策:https://yanxi-aicall.jd.com/privacy
- API Key 申请:https://yanxi-aigc-uat.jd.com/jimi/mine/api-center
本地数据保留
- 请求记录:
memory/yanxi-calls/requests.jsonl - 通话日志:
memory/yanxi-calls/costs.jsonl - 这两个文件包含 PII(电话号码、对话内容),用户可随时删除
用户确认流程
在信息收集完毕后,必须展示确认卡片:
📞 外呼确认
对象:{Who}
电话:{Phone}
目的:{What}
⚠️ 以下信息将发送到 Yanxi AI 外呼服务(京东言犀平台):
• 电话号码:{Phone}
• 对话内容:{对话摘要}
确认拨打?(回复"确认"或"取消")
仅在用户明确确认后才执行外呼。
🎯 触发条件
当用户表达以下意图时触发:
- "帮我给xxx打个电话预约个位子"
- "给老客户打电话推销活动"
- "打电话提醒用户还款"
- "帮我问下我父亲最近身体怎么样"
- "给客户打电话确认预约时间"
关键词:打电话、致电、外呼、电话通知、电话确认
📋 步骤 1:意图提取
从用户输入中提取核心信息:
| 要素 | 说明 | 示例 |
|---|---|---|
| Who | 打给谁(名称/关系/机构) | 蜀九香、我爸、老客户 |
| Phone | 电话号码 | 18033009923 |
| What | 外呼目的 | 预约位子、推销活动、问身体状况 |
📝 步骤 2:信息收集
目标:一次收集尽可能多的信息,减少后续追问次数。
信息收集清单
根据外呼目的,智能判断需要收集哪些信息:
基础信息(必问)
| 信息项 | 说明 | 追问方式 |
|---|---|---|
| Who | 被叫方名称/关系 | "请问打给谁?" |
| Phone | 电话号码 | "请问对方电话是多少?" |
| What | 外呼目的 | "请问打电话主要想说什么?" |
时间信息(涉及时间时追问)
| 信息项 | 适用场景 | 追问方式 |
|---|---|---|
| When | 预约、提醒、限时活动 | "请问是什么时间?" |
| Deadline | 限时事项 | "有截止时间吗?" |
地点信息(涉及地点时追问)
| 信息项 | 适用场景 | 追问方式 |
|---|---|---|
| Where | 预约、上门服务 | "请问地址是哪里?" |
业务信息(根据目的追问)
| 信息项 | 适用场景 | 追问方式 |
|---|---|---|
| Details | 具体事项描述 | "能具体说说是什么事吗?" |
| KeyPoints | 推销、活动、通知 | "有什么需要特别强调的点吗?" |
| SpecialNeeds | 预约、服务 | "有什么特殊要求或注意事项吗?" |
| PeopleCount | 预约用餐、活动 | "请问几个人?" |
| Duration | 咨询、调查 | "大概需要多长时间?" |
备用信息(可选)
| 信息项 | 说明 | 追问方式 |
|---|---|---|
| ContactName | 被叫方称呼 | "请问对方怎么称呼?" |
| AltPhone | 备用电话 | "有备用联系电话吗?" |
| Notes | 其他备注 | "还有其他需要注意的吗?" |
信息收集策略
按场景智能追问
预约类(预约位子、预约安装、预约服务)
已了解:{Who},{What}
追问:
1. 请问预约什么时间?
2. 请问预约在哪个地点?(如不明确)
3. 请问几个人/需要什么服务?
4. 有什么特殊要求吗?
推销/活动类(推销产品、活动通知、促销推广)
已了解:{Who},{What}
追问:
1. 请问是什么产品/活动?
2. 有什么核心卖点或优惠吗?
3. 活动时间是多久?
4. 希望客户怎么参与?(下单/到店/链接)
咨询类(解答问题、确认信息、回访)
已了解:{Who},{What}
追问:
1. 请问具体想咨询/确认什么?
2. 有什么参考资料吗?(如需要)
3. 大概需要聊多久?
提醒类(还款提醒、预约提醒、到期提醒)
已了解:{Who},{What}
追问:
1. 请问提醒的具体事项是什么?
2. 关键时间节点是?
3. 如果对方没接电话怎么处理?(短信/再打)
关怀类(问候家人、客户回访)
已了解:{Who},{What}
追问:
1. 请问对方怎么称呼?
2. 有什么特别想聊的话题吗?
3. 需要了解什么信息吗?
健康关怀类(问候身体状况)
已了解:{Who},{What}
追问(后端可能要求):
1. 基础病史:对方有什么基础疾病吗?
2. 用药情况:最近在吃什么药吗?
3. 家属联系方式:有其他家属联系方式吗?
一次追问多个问题
为减少对话轮次,采用批量追问策略:
用户:帮我给蜀九香打个电话预约位子
助手:好的,我帮您预约蜀九香。请补充以下信息:
1. 预约什么时间?(比如:今天晚上7点)
2. 几位用餐?
3. 有什么特殊要求吗?(包间、靠窗等)
已知信息复用
如果对话上下文中已包含信息,不要重复追问:
用户:帮我给我爸打电话问下身体怎么样,电话是138xxxx
助手:好的,帮您给父亲打电话问候身体。
请问有什么特别想问的吗?比如最近的睡眠、饮食?
✅ 步骤 3:信息确认(必须)
⚠️ 重要:在调用外呼接口前,必须向用户展示确认卡片并获得明确同意。
收集完毕后,展示确认卡片:
📞 外呼确认
对象:{Who}({ContactName})
电话:{Phone}
目的:{What}
详细信息:
• 时间:{When}
• 地点:{Where}
• 具体事项:{Details}
• 特殊要求:{SpecialNeeds}
⚠️ 以下信息将发送到 Yanxi AI 外呼服务(京东言犀平台):
• 电话号码:{Phone}
• 对话内容:{对话摘要}
确认拨打?(回复"确认"或"取消")
用户确认后才可进入下一步。如果用户取消,则终止流程。
🚀 步骤 4:调用外呼接口
构建请求参数
{
"phone": "18033009923",
"messages": [
"用户: 帮我给蜀九香打个电话预约位子",
"助手: 好的,请补充以下信息:\n1. 预约什么时间?\n2. 几位用餐?\n3. 有什么特殊要求吗?",
"用户: 今天晚上7点,4个人,要个包间"
]
}
messages 说明:
- 包含用户与助手之间的完整对话上下文
- 后端根据上下文生成 prompt
- 格式为字符串数组:
"角色: 内容"
执行调用
cd ~/.openclaw/skills/yanxi-aicall
./scripts/make-call.sh --phone "{电话}" --messages '["用户: ...", "助手: ...", "用户: ..."]'
🔄 步骤 5:处理返回结果
返回格式
成功响应:
{
"code": "10000",
"result": "成功",
"data": "12331@e561a4397b2a402488f2-638cd593f315"
}
失败响应:
{
"code": "190001",
"result": "风控校验不通过不能外呼,风控拦截信息:1001涉政"
}
code 说明
| code | 说明 | 处理方式 |
|---|---|---|
| 10000 | 成功 | 告知用户,返回 data 中的 request_id |
| 190001 | 风控拦截 | 不再重试,告知用户风控原因 |
| 其他 | 失败 | 根据 result 提示用户 |
风控拦截处理
当 code 为 190001 时,表示被风控系统拦截:
{
"code": "190001",
"result": "风控校验不通过不能外呼,风控拦截信息:1001涉政"
}
此时告知用户:
外呼被风控拦截:{result}
请更换通话内容或联系管理员。
注意:风控拦截后不要重试,直接结束流程。
其他失败处理
当 code 为其他值时,根据 result 或 message 字段判断原因:
缺少必填参数(code: "430004"):
{
"code": "430004",
"message": "外呼缺少场景必填参数: [\"基础病史\",\"用药情况\",\"家属联系方式\"]"
}
此时追问用户缺失的参数:
还需要补充以下信息:
1. 基础病史:对方有什么基础疾病吗?
2. 用药情况:最近在吃什么药吗?
3. 家属联系方式:有其他家属联系方式吗?
用户补充后,更新 messages 并重新调用。
系统异常(code: "130003"):
{
"code": "130003",
"message": "调用业务系统异常"
}
此时提示用户稍后重试。
📊 步骤 6:查询通话结果
外呼发起后,可查询通话结果:
./scripts/query-call.sh --request-id "{request_id}"
话单位置:memory/yanxi-calls/costs.jsonl
📁 文件结构
yanxi-aicall/
├── SKILL.md # 本文件(工作流)
├── scripts/
│ ├── make-call.sh # 执行外呼
│ └── query-call.sh # 查询结果
├── references/
│ └── api-reference.md # API 文档
└── memory/
└── yanxi-calls/
🔄 泛化能力
本 skill 不预设场景类型,通过以下方式实现泛化:
- 通用信息框架:Who/What/Phone 为核心,时间/地点/详情为扩展
- 智能追问:根据外呼目的判断需要收集的信息
- 批量收集:一次追问多个问题,减少对话轮次
- 对话传递:完整 messages 传给后端,由后端理解场景
- 动态补充:根据后端返回的
result动态追问缺失信息
适用场景包括但不限于:
- 预约场景(预约位子、预约安装)
- 推销场景(活动推广、产品营销)
- 咨询场景(解答问题、确认信息)
- 提醒场景(还款提醒、预约提醒)
- 关怀场景(问候家人、客户回访)
- 其他任意外呼需求
⚙️ 配置
前置要求
本 skill 需要以下工具:
curl- HTTP 客户端(用于 API 请求)jq- JSON 处理器(用于解析响应)
环境变量(必需)
| 变量名 | 必需 | 说明 | 默认值 |
|---|---|---|---|
YANXI_API_KEY |
✓ | API 密钥(申请地址见下方) | - |
YANXI_BASE_URL |
- | API 地址 | https://yanxi-ai-api.jd.com |
配置方式
推荐:环境变量(更安全)
# 添加到 ~/.zshrc 或 ~/.bashrc
export YANXI_API_KEY="your-api-key"
# 可选:自定义 API 地址
export YANXI_BASE_URL="https://yanxi-ai-api.jd.com"
备选:配置文件
# 创建配置目录
mkdir -p ~/.openclaw/secrets
# 创建配置文件(注意设置权限)
cat > ~/.openclaw/secrets/yanxi.json << 'EOF'
{
"api_key": "your-api-key",
"base_url": "https://yanxi-ai-api.jd.com"
}
EOF
# 必须设置权限,防止其他用户读取
chmod 600 ~/.openclaw/secrets/yanxi.json
API Key 申请
- 访问:https://yanxi-aigc-uat.jd.com/jimi/mine/api-center
- 登录京东账号
- 创建 API Key
内部测试环境
如果是京东内部用户,可使用测试环境:
export YANXI_BASE_URL="http://pre-yanxi-ai-api.jd.local"
注意:测试环境仅供内部开发测试使用,生产环境请使用默认地址。
🔒 数据安全建议
凭据安全
- 优先使用环境变量:避免将 API Key 存储在文件中
- 文件权限:如果使用配置文件,务必设置
chmod 600 - 不要提交到代码仓库:将
yanxi.json添加到.gitignore
隐私保护
- 定期清理日志:删除
memory/yanxi-calls/目录下的文件 - 最小权限原则:只收集必要的外呼信息
- 敏感信息:避免在对话中传递健康、金融等敏感信息,除非用户明确同意
本地日志
以下文件包含 PII(电话号码、对话内容):
memory/yanxi-calls/requests.jsonl- 外呼请求记录memory/yanxi-calls/costs.jsonl- 通话日志
用户可随时删除这些文件以清除历史记录。
📚 更多参考
- API 详细文档:
references/api-reference.md
