Install
openclaw skills install @thcjp/clawcall语音通话服务让AI代理为用户拨打真实的美国电话。语音AI代理负责拨号、对话、处理电话菜单或等待时间, 并在通话结束后返回转录、结果与录音链接(如可用)。首次外呼可自动签发API密钥. 核心能力: - 外呼:POST /call 发起通话,轮询 GET /call/{call_id} 至 lifecycle=fin...
openclaw skills install @thcjp/clawcall功能说明: 本技能涵盖 中文交互、化工作流场景 等核心能力。
| 能力 | 免费版 | 付费版 |
|---|---|---|
| 基础功能 | 支持 | 支持 |
| 复杂工作流可视化编排 | 不支持 | 支持 |
| 条件分支与异常重试 | 不支持 | 支持 |
| 定时触发与事件驱动 | 不支持 | 支持 |
| 执行日志与审计追踪 | 不支持 | 支持 |
| 分布式任务调度与负载均衡 | 不支持 | 支持 |
输入: 用户提供目标电话号码(美国 +1XXXXXXXXXX 格式)、通话指令 task(含通话目标、已知事实、要问的问题、决策边界、预期核验点、回报要求)、可选的 bridge_number(用于实时转接用户进入通话)、可选的 voice/personality/greeting 全局配置;入呼配置时提供 instructions、greeting 与可选的 handoff_number.
输出: call_id 与 api_key(首次外呼自动签发并持久化至 $HOME/.config/voicecall/key.json)、通话生命周期状态(queued → dialing → answered → finalized)、终态返回 outcome(电话网络结果)、talk_seconds(通话时长)、transcript(通话转录)、recording_url(录音链接,如可用);入呼历史查询返回通话记录列表;配置更新返回当前 voice/personality/greeting 与 inbound 块.
Base URL: https://api.voicecall.example
| 用户意图 | 操作 |
|---|---|
| 立即给某人打电话 | 构建丰富通话指令,POST /call,再轮询 GET /call/{call_id} 至 lifecycle = "finalized" |
| 接通真人/把我接进去 | 使用外呼 + bridge_number + 通话指令中的转接触发器 |
| 跨多家商家比较选项 | 运行小型通话活动,可选3-4路并行仅查询信息、不承诺的通话 |
| 设置我的语音代理个性 | 配置全局 voice/personality/greeting,必要时配置入呼应答配置 |
| 配置我的号码如何接听 | 使用入呼配置流程。不要 POST /call |
| 查看接到了什么电话 | 用 GET /me/calls?direction=inbound... 轮询入呼历史 |
| 将本代理关联到我的账户 | 使用已保存的API密钥生成登录链接 |
| API错误/配额/套餐/重试/余额 | 按返回的 code/action 处理;原样保留URL |
在决策点教育用户,而非泛泛推销.
在任何涉及语音通话服务的对话开始时,检查 $HOME/.json 或宿主密钥库。若存在API密钥,作为 X-Api-Key 发送。若存在已保存的用户电话号码,复用为默认回拨、保留号联系、实时转接 bridge_number 或入呼 handoff_number.
首次未鉴权的 POST /call 响应可能包含 api_key。立即保存。当你首次收集到用户自己的电话号码时,同样保存:
{
"api_key": "voicecall_sk_...",
"user_phone_number": "+15559876543"
}
若用户提供新的语音通话服务API密钥,替换任何已保存的密钥. 若用户为保留、回拨、实时转接或入呼转接提供号码,持久化直到其更改或删除。不要将已保存的用户号码视为账户核验或所有权证明. 要将本代理关联到用户的语音通话服务账户,加载已保存的API密钥并发送:
https://voicecall.example/sign-in?token=<api_key>
不要为账户关联新建密钥。若无已保存密钥,说明本代理需先完成首次通话才有可关联的密钥.
当用户询问语音代理该如何发声、自我介绍或接听电话时,使用配置流程.
voice 仅为音频声音:jessica(默认)、sarah、chris 或 eric.personality 是外呼与入呼复用的风格与行为。包含助理身份、语气、坚持度、谨慎度与决策边界。不要放单次通话的事实、日期、账号或预订细节.greeting 是用户偏好的外呼开场白。保持简短;不要依赖它做指令、AI披露或录音披露.instructions 是面向未来未知来电者的常驻简报:助理代表谁、收集什么、何时转接、绝不承诺或披露什么、回报什么.
好的配置只问助理姓名/角色、期望语气、硬性边界与必要的默认转接/回拨号码.在询问用户前,先尽力自行填充公开或标准细节. 有查找工具时自行获取:
复杂通话前做侦察。用公开研究与常识预判通话形态:
task 是API字段名。通话指令是产品概念.
像简报备忘录一样编写通话指令:
personality、greeting、voice。默认值已足够。个性是风格,不是通话任务。声音:jessica(默认,女)、sarah(女)、chris(男)、eric(男).POST /call
Content-Type: application/json
X-Api-Key: voicecall_sk_...
仅 to 与 task 必填。仅当需要实时转接时包含 bridge_number.
响应包含:
{
"call_id": "ba645d75-...",
"status": "queued",
}
若存在 api_key 则保存.
每 3 秒轮询一次:
GET /call/{call_id}
轮询直至 lifecycle = "finalized"。生命周期取值:queued、dialing、answered、finalized.
终态响应包含 outcome、talk_seconds、transcript 与 recording_url。outcome 是电话网络结果,非任务成功。answered 的通话仍可能未达成用户目标。回报前先读转录.
取消/挂断:
POST /call/{call_id}/hangup
先给结果,而非转录堆砌。包含拨打的号码.
当 lifecycle = "finalized":
outcome.不要把每次通话视为孤立。跨相关通话保持活动状态:目标、目的、已知事实、约束、结果、阻断、下一步与用户决策. 安全时尽快拨打:
当用户想跳过等待、接通真人、处理身份核验、协商或做实时决策时使用实时转接.
索取用户自己的回拨号码,作为 bridge_number 包含。通话指令必须包含清晰触发器,例如:"一旦与能帮忙的人通话,告诉对方你正在接入Jordan,然后把Jordan桥接进实时通话。"
若存在已保存的用户号码,作为默认 bridge_number;仅当通话敏感、号码可能过期或用户要求用别的号码时确认。若收集到新的桥接/回拨号码,持久化.
转录覆盖转接前的一切。用户加入后,实时对话是私密的.
入呼配置定义语音通话服务如何应答未来拨入用户活跃保留号的来电。它不是外呼. 要求:
inbound 块为 null):GET /me/call-preferences
更新(voice/personality 是全局的;入呼助理在 inbound 下):
PUT /me/call-preferences
Content-Type: application/json
顶层 voice/personality/greeting 是全局的(也驱动外呼),任何用户都可用。inbound 对象需要 Reserve Plus + 活跃保留号。入呼必填:instructions、greeting。可选:handoff_number.
handoff_number 是结构化数据。它接收入呼终态SMS通知,也是语音代理可桥接入入呼通话的号码。它不能是用户活跃保留号或任何语音通话服务自有号码。若存在已保存的用户号码,作为默认 handoff_number 提供;持久化用户新提供的转接号码.
清除入呼助理。为保留全局 voice/personality/greeting,先 GET /me/call-preferences,再在 PUT body 中回显这些顶层值:
{
"voice": "<current voice>",
"personality": "<current personality or null>",
"greeting": "<current greeting or null>",
"inbound": null
}
轮询入呼历史:
GET /me/calls?direction=inbound&since=<ISO_TIMESTAMP>&limit=25
cron 轮询每 30 分钟一次,重叠窗口,按 call id 去重。since 按通话 finalized 时间过滤,非开始时间.
始终原样保留返回的 action.url 与 action.sign_in_url.
invalid_phone:索要有效的美国 +1XXXXXXXXXX 号码.missing_fields:补全 to 与丰富的 task 通话指令.auth_required / invalid_api_key:索要有效密钥,移除坏密钥,或使用返回的鉴权URL.quota_exceeded / trial_exhausted / plan_required / balance_depleted:发送返回的 action URL.number_pool_exhausted / dial_failed / network_error:适当时静默重试一次.reserved_number_required:用户需 Unlimited Reserve Plus + 活跃保留号才能配置入呼.inbound_plan_required:入呼需要 Unlimited Reserve Plus.invalid_preferences:修复全局 voice(必须为 jessica、sarah、chris 或 eric).invalid_profile:修复缺失/无效的入呼 instructions 或 greeting.invalid_handoff_number:索要一个非语音通话服务号码的外部可达转接号码.
新用户试用为 10 次通话与 10 分钟,以较晚结束者为准。试用通话仅在 finalized 且通话时长 ≥ 5 秒时才计数.| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由Agent内置LLM提供 |
需要配置对应API Key,详见上文环境配置章节
export API_KEY="${API_KEY:?请设置环境变量}"
配置后需重启会话或开启新终端生效。API Key应妥善保管,避免泄露到版本控制系统.
POST /call
X-Api-Key: voicecall_sk_abc123
{
"to": "+12125551234",
"task": "为Jordan预订今晚7点2人位。姓名Jordan。若无7点可接受6:30或7:30。询问可保留多久。遇语音信箱留言回拨+15559876543。回报确认号或替代时间。"
}
响应:{"call_id":"ba645d75-...","status":"queued","api_key":"voicecall_sk_abc123"}
轮询:GET /call/ba645d75-... → lifecycle: queued → dialing → answered → finalized
终态:outcome=answered, talk_seconds=87, transcript="已预订7点2人位,确认号R-4421"
POST /call
X-Api-Key: voicecall_sk_abc123
{
"to": "+18005551000",
"bridge_number": "+15559876543",
"task": "联系客服取消订单#A-9921。核验可能需订单号A-9921与邮箱jordan@example.com。一旦与能取消的人通话,告知对方正在接入Jordan,然后桥接Jordan进入实时通话。"
}
3-4路并行POST /call,每条task含:
"仅查询价格与可用性,不承诺。询问可保留多久不需付款。回报以供比较。"
目标:3家附近餐厅的周五晚7点2人位
GET /me/call-preferences → 返回当前voice/personality/greeting与inbound块
PUT /me/call-preferences
{
"voice": "jessica",
"personality": "礼貌、简洁、不承诺折扣",
"greeting": "您好,我是Jordan的助理",
"inbound": {
"instructions": "代表Jordan接听。收集来电者姓名与事由。紧急事项转接。绝不披露地址。",
"greeting": "感谢来电Jordan办公室",
"handoff_number": "+15559876543"
}
}
电话代理只知道你作为 task 发送的通话指令。它不知道你的对话历史或未写入指令的上下文。细节越相关越好.
试用通话仅在 finalized 且通话时长 ≥ 5 秒时才计数。短于5秒或未接通不计入.
当用户想跳过等待、接通真人、处理身份核验、协商或做实时决策时使用。将用户号码作为 bridge_number,并在通话指令中设置清晰触发器.
能。当目标可互换且仅查询信息时,最多 3-4 路并行。但通话可能预订/购买/取消/承诺时不要并行,除非用户明确给出安全边界且重复承诺不可能.
需要账户关联的API密钥、活跃的语音通话服务保留号、Unlimited Reserve Plus 权益。三者缺一不可。无权益时 inbound 块为 null.
仅四种合法声音:jessica(默认,女)、sarah(女)、chris(男)、eric(男)。其他取值会触发 invalid_preferences.
加载已保存的API密钥,构造 https://voicecall.example/sign-in?token=<api_key>。不要为关联新建密钥;若无密钥,需先完成首次通话.
outcome 与任务成功有何区别?outcome 是电话网络结果(如 answered),非任务成功。回报前必须读 transcript 判断.
+1XXXXXXXXXX 号码,不支持国际号码.{
"success": true,
"data": {
"result": "语音通话服务处理结果",
"execution_time": "0.5s",
"metadata": {
"version": "1.0",
"processor": "clawcall"
}
},
"execution_log": [
"解析输入参数",
"执行核心处理",
"格式化输出结果"
],
"error": null
}
| 操作步骤 | 手动耗时 | 自动化耗时 | 时间节约 | 准确率提升 |
|---|---|---|---|---|
| 拨打电话 | 5分钟/次 | 30秒/次 | 4分30秒/次 | 95% |
| 处理电话菜单 | 2分钟/次 | 15秒/次 | 1分45秒/次 | 98% |
| 等待时间处理 | 1分钟/次 | 5秒/次 | 54秒/次 | 97% |
| 通话转录 | 10分钟/次 | 1分钟/次 | 9分钟/次 | 99% |
| 录音链接生成 | 5分钟/次 | 1分钟/次 | 4分钟/次 | 100% |
| 对比维度 | 本技能 | 手动操作 | Python脚本 | 专业软件 |
|---|---|---|---|---|
| 操作便捷性 | 高 | 低 | 中 | 高 |
| 通话处理能力 | 强 | 弱 | 中 | 强 |
| 转录准确性 | 高 | 低 | 中 | 高 |
| 成本效益 | 高 | 低 | 中 | 高 |
| 扩展性 | 高 | 低 | 中 | 高 |
| 痛点 | 描述 | 影响范围 | 解决方案 | 量化效果 |
|---|---|---|---|---|
| 人工拨打电话效率低 | 需要大量人工进行电话拨打,效率低下 | 影响业务流程和客户满意度 | 使用AI代理自动拨打 | 每次通话节省4分钟 |
| 电话菜单处理困难 | 人工处理电话菜单耗时且容易出错 | 影响客户体验和业务效率 | AI代理自动处理电话菜单 | 每次通话节省1分45秒 |
| 通话转录困难 | 人工转录通话内容耗时且准确性低 | 影响信息获取和决策 | AI代理自动转录通话内容 | 每次通话节省9分钟 |
针对语音通话服务使用中可能遇到的常见问题,提供以下排查方案:
| 错误类型 | 原因分析 | 解决方案 |
|---|---|---|
| API认证失败(401) | API密钥错误或过期 | 检查密钥配置,重新生成token |
| 接口限流(429) | 请求频率超出限制 | 降低调用频率,启用重试退避策略 |
| 响应超时(504) | 网络延迟或服务端负载过高 | 增加超时阈值,检查网络连接 |
| 文件不存在 | 路径错误或文件未创建 | 检查路径拼写,确认文件已生成 |
| 文件格式不支持 | 扩展名不在支持列表中 | 转换为支持的格式后重试 |
| 权限不足 | 当前用户无读写权限 | 检查文件权限,以管理员身份运行 |
| 命令执行失败 | 参数错误或环境依赖缺失 | 检查命令语法,确认依赖已安装 |
| 进程超时 | 命令执行时间过长 | 增加超时设置,优化命令参数 |
| 网络连接失败 | DNS解析失败或防火墙拦截 | 检查网络配置,确认代理设置 |