Install
openclaw skills install @polandeme/avavox-call通过 大模型语音数字员工-avavox的外呼机器人的技能, 用于在 小龙虾(OpenClaw)等 Agent平台中实现大模型语音外呼机器人。适用于批量外呼、客户回访、满意度调查、简历筛查约面试,以及定时提醒、任务安排等场景。
openclaw skills install @polandeme/avavox-call当前版本:0.6.2
按 avavox 开放接口工作,不依赖前端页面 session、企业后台 token 或内部接口。
https://dashboard.avavox.com/login 完成平台登录。手机号 页签:手机号 + 短信验证码;页面文案明确写了“未注册的手机号将自动注册”账号 页签:账号/手机号/邮箱 + 密码https://dashboard.avavox.com/agent/api-paas。空间管理 -> 接口回调,包含两个页签:
回调设置:配置通话结束后的回调端点、Header、启用/禁用状态与连通性测试App Key 管理:创建、复制、启用、禁用、删除 App KeyApp Key 管理 中创建并复制 App Key,再填写 config.json 中的 appKey;baseUrl 通常保持官方默认值 https://dashboard.avavox.com。脚本使用 Python 3 标准库实现,不依赖第三方包。对外发布时,优先使用 python3;在 Windows 上可用 py -3。
按 OpenClaw 官方 skills 配置约定,这个 skill 优先支持两种配置来源:
skills.entries."avavox-call".apiKey 对应注入环境变量 AVAVOX_APP_KEYskills.entries."avavox-call".env 可选注入:
AVAVOX_BASE_URL(仅兼容 https://dashboard.avavox.com,对外发布时不要改成其他域名)AVAVOX_DEFAULT_TASK_IDAVAVOX_DEFAULT_LINE_IDAVAVOX_DEFAULT_CONCURRENCYAVAVOX_DEFAULT_BACKGROUND_AUDIOAVAVOX_DEFAULT_CALL_TIME_TYPE如果没有使用 OpenClaw 的 env/apiKey 注入,也可以继续使用 {baseDir}/config.json。
创建任务时不要通过默认配置固化 robotId;每次都应先用 robots list 确认当前可用机器人,再把本次确认的 robotId 显式传给 tasks create。
对外发布时,以下线上文档应视为优先参考的权威来源;本 skill 目录下的 references/ 是便于 OpenClaw 使用的精简摘要。
https://avavox.com/avavox-docs/developer/app-key.htmlhttps://avavox.com/avavox-docs/developer/create-task.html如果在 OpenClaw 中直接运行,一般以 skill 根目录作为工作目录。命令示例默认都在 skill 根目录执行:
python3 {baseDir}/scripts/avavox_call.py robots list --config {baseDir}/config.json
python3 {baseDir}/scripts/avavox_call.py lines list --config {baseDir}/config.json
python3 {baseDir}/scripts/avavox_call.py robots list --config {baseDir}/config.json
python3 {baseDir}/scripts/avavox_call.py lines list --config {baseDir}/config.json
创建任务前先执行以下判断:
robots list,把返回的已发布机器人列表展示给用户选择。tasks create。robots list 返回为空,不要继续创建任务,也不要假定某个 robotId 可用。https://dashboard.avavox.com/robot,让用户先创建机器人并完成发布。robots list,再继续后续任务创建流程。机器人选择规则:
用户明确指定机器人时(如"用客服机器人打"、"用回访那个机器人"):
robots list 获取当前可用列表用户没有指定时(如"再打一个电话"、"创建个任务"):
robots list 获取当前可用列表关键原则:
robots list)python3 {baseDir}/scripts/avavox_call.py tasks create \
--config {baseDir}/config.json \
--task-name "三月回访任务" \
--robot-id "robot_xxx" \
--line-id "line_xxx" \
--concurrency 1 \
--call-time-type immediate
复杂配置直接用 JSON 透传:
python3 {baseDir}/scripts/avavox_call.py tasks create \
--config {baseDir}/config.json \
--task-name "工作日白天外呼" \
--robot-id "robot_xxx" \
--call-time-type scheduled \
--runtime-config-json '{"retryConfig":{"retryableStatuses":["busy","timeout"],"maxRetries":1,"retryInterval":1,"enabled":true}}' \
--scheduled-time-json '[{"dayOfWeeks":[1,2,3,4,5],"times":[{"startTime":"09:00","endTime":"12:00"},{"startTime":"14:00","endTime":"18:00"}]}]'
创建任务后,必须导入客户,系统才会开始外呼:
python3 {baseDir}/scripts/avavox_call.py customers import \
--config {baseDir}/config.json \
--task-id "task_xxx" \
--customers-inline '[{"phoneNumber":"13800000001","ext":{"客户姓名":"张三"}}]'
变量参数传递说明:
ext 字段用于传递机器人变量,格式为 {"变量名": "值"},其中变量名必须与机器人绑定的变量名称完全一致。
python3 {baseDir}/scripts/avavox_call.py tasks variables \
--config {baseDir}/config.json \
--task-id "task_xxx"
返回示例:
{
"code": 200,
"success": true,
"data": {
"robotId": "robot_xxx",
"robotName": "回访机器人",
"variables": [
{
"name": "客户姓名",
"key": "customer_name",
"description": "客户姓名",
"defaultValue": "",
"required": true,
"category": "custom"
},
{
"name": "订单号",
"key": "order_id",
"description": "订单编号",
"defaultValue": "",
"required": false,
"category": "custom"
}
]
}
}
data.variables[].name 构造 ext:ext 的键名要取变量对象里的 name,不是 key。例如上面返回里应使用 "客户姓名"、"订单号",不要传 "customer_name"、"order_id"。
# 单变量示例
python3 {baseDir}/scripts/avavox_call.py customers import \
--config {baseDir}/config.json \
--task-id "task_xxx" \
--customers-inline '[{"phoneNumber":"13800000001","ext":{"客户姓名":"张三"}}]'
# 多变量示例
python3 {baseDir}/scripts/avavox_call.py customers import \
--config {baseDir}/config.json \
--task-id "task_xxx" \
--customers-inline '[
{
"phoneNumber": "13800000001",
"ext": {
"客户姓名": "张三",
"手机尾号": "0001",
"订单号": "ORD20240001"
}
},
{
"phoneNumber": "13800000002",
"ext": {
"客户姓名": "李四",
"手机尾号": "0002",
"订单号": "ORD20240002"
}
}
]'
ext 中的键名(如 "客户姓名")必须使用 tasks variables 返回结果里 data.variables[].name 的值,不要使用 keyext 是可选字段,如果机器人没有配置变量,可以省略python3 {baseDir}/scripts/avavox_call.py tasks list --config {baseDir}/config.json
python3 {baseDir}/scripts/avavox_call.py tasks get --config {baseDir}/config.json --task-id "task_xxx"
python3 {baseDir}/scripts/avavox_call.py tasks variables --config {baseDir}/config.json --task-id "task_xxx"
python3 {baseDir}/scripts/avavox_call.py tasks pause --config {baseDir}/config.json --task-id "task_xxx"
python3 {baseDir}/scripts/avavox_call.py tasks resume --config {baseDir}/config.json --task-id "task_xxx"
修改任务:
python3 {baseDir}/scripts/avavox_call.py tasks update \
--config {baseDir}/config.json \
--task-id "task_xxx" \
--line-id "line_xxx" \
--background-audio office_ambient \
--concurrency 5
robots list 或 lines listrobots list 验证机器人可用性
https://dashboard.avavox.com/robot 让用户创建并发布机器人,完成后再确认 taskName、robotId,需要真实外呼时补 lineIdtasks variables 查询 data.variables[],ext 的键名取其中的 namecustomers import,其中 ext 字段的键名必须与 tasks variables 返回结果里的 data.variables[].name 完全一致
[{"phoneNumber":"手机号","ext":{"变量名1":"值1","变量名2":"值2"}}][{"phoneNumber":"13800000001","ext":{"客户姓名":"张三"}}],其中 "客户姓名" 是机器人绑定的变量名称tasks pause、tasks resume、tasks getrequest,且 --path 只能是 /open/api/... 相对路径python3 {baseDir}/scripts/avavox_call.py request \
--config {baseDir}/config.json \
--method PUT \
--path /open/api/task/task_xxx \
--body-json '{"concurrency":3}'
安全边界:
--path 只能是当前 avavox 开放接口下的相对路径,例如 /open/api/task/task_xxx--path--query-jsonApp Key 是空间级凭据,不同空间不能混用。https://dashboard.avavox.com/agent/api-paas 需要先完成平台登录;未登录访问时会被重定向到登录页。robots list 验证机器人当前是否仍然可用,不能直接使用未经验证的 robotId。robotId,不要依赖默认配置或环境变量去隐式继承机器人。robots list 中消失,必须告知用户并重新选择。https://dashboard.avavox.com/robot 让用户创建并发布机器人,再继续创建任务。customers import。tasks variables,再按 data.variables[].name 构造 ext。接口回调 -> 回调设置 中配置回调 URL 与 Header。request 只是开放接口的受限回退入口,目标必须保持在 https://dashboard.avavox.com/open/api/...。appKey。https://avavox.com/avavox-docs/developer/app-key.htmlhttps://avavox.com/avavox-docs/developer/create-task.htmlreferences/auth-and-context.mdreferences/entity-and-endpoint-map.mdreferences/payload-examples.mdreferences/callback-schema.mdscripts/avavox_call.py