avavox 智能外呼

v0.6.2

通过 大模型语音数字员工-avavox的外呼机器人的技能, 用于在 小龙虾(OpenClaw)等 Agent平台中实现大模型语音外呼机器人。适用于批量外呼、客户回访、满意度调查、简历筛查约面试,以及定时提醒、任务安排等场景。

2· 193·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for polandeme/avavox-call.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "avavox  智能外呼" (polandeme/avavox-call) from ClawHub.
Skill page: https://clawhub.ai/polandeme/avavox-call
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install avavox-call

ClawHub CLI

Package manager switcher

npx clawhub@latest install avavox-call
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
技能名称与描述明确为“avavox 外呼机器人”。所需二进制(python3)与主凭据(AVAVOX_APP_KEY)都与调用 avavox REST API 的用途一致。未请求与外呼功能无关的云凭据或大量额外权限。
Instruction Scope
SKILL.md 指令限定在:获取 App Key(需在 dashboard 登录)、配置 config.json 或通过环境变量注入、列出机器人/线路、创建任务、导入客户等。脚本/说明没有指示读取系统范围的凭据、浏览器会话、SSH keys、或上传任意主机以外的数据。唯一会传出的数据是向 avavox 控制台域名下的 /open/api 请求(如导入客户会上传电话号码和 ext 字段),这与外呼场景的需求一致。
Install Mechanism
这是 instruction+脚本型技能:没有安装脚本或从不可信 URL 下载代码。包含的 Python 脚本由本地运行(无需自动下载或执行远端二进制)。因此安装风险低。
Credentials
只声明了主凭据 AVAVOX_APP_KEY(并列出若干可选的环境变量用于默认配置)。没有请求与技能无关的 SECRET/TOKEN(例如 AWS、GitHub、Slack 等)。将 App Key 写入 config.json 或环境变量是调用该 API 合理且必要的最小要求。
Persistence & Privilege
技能没有设置 always: true,也不会改变其他技能或全局 agent 配置。它仅读取自己的 config.json 和环境变量,并在需要时通过脚本发起 API 请求,权限边界清晰。
Assessment
该技能看起来与其描述一致,但请在安装前注意: - 你必须向技能或环境提供 Avavox 的 App Key,技能会使用该凭据将电话号与变量数据上传到 avavox 的 https://dashboard.avavox.com/open/api 接口;确保你信任 avavox 平台并且有权上传这些电话号码(注意隐私/合规要求)。 - config.json 中可以包含 appKey 作为回退,但更安全的做法是通过环境变量注入 AVAVOX_APP_KEY 并避免在仓库或共享目录中保存明文密钥。 - 脚本内有显式检查,强制只对 avavox 指定的域名和 /open/api 前缀发起请求;这降低了被滥用为通用数据外泄工具的风险。 - 如果你需要进一步审查:可打开 scripts/avavox_call.py 完整查看网络请求逻辑、回调/导入行为以及是否在日志中输出敏感信息(SKILL.md 已建议不要把完整 App Key 输出到日志)。 总体来看,此技能内部一致且功能与其声明相符,但安装前应确认隐私与合规(外呼电话号码与通话记录会发送到第三方服务)。

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

Any binpython3, python, py
Primary envAVAVOX_APP_KEY
latestvk9725gddyx50bbxv0xdtkz1evn84hmjr
193downloads
2stars
3versions
Updated 2w ago
v0.6.2
MIT-0

avavox 外呼技能

当前版本:0.6.2

按 avavox 开放接口工作,不依赖前端页面 session、企业后台 token 或内部接口。

准备

  1. 先访问 https://dashboard.avavox.com/login 完成平台登录。
  2. 登录页支持两种方式:
    • 手机号 页签:手机号 + 短信验证码;页面文案明确写了“未注册的手机号将自动注册”
    • 账号 页签:账号/手机号/邮箱 + 密码
  3. 登录成功后进入 https://dashboard.avavox.com/agent/api-paas
  4. 该页面对应控制台菜单 空间管理 -> 接口回调,包含两个页签:
    • 回调设置:配置通话结束后的回调端点、Header、启用/禁用状态与连通性测试
    • App Key 管理:创建、复制、启用、禁用、删除 App Key
  5. App Key 管理 中创建并复制 App Key,再填写 config.json 中的 appKeybaseUrl 通常保持官方默认值 https://dashboard.avavox.com
  6. 创建任务前,先查询当前空间是否存在可用的已发布机器人,再查询线路。

脚本使用 Python 3 标准库实现,不依赖第三方包。对外发布时,优先使用 python3;在 Windows 上可用 py -3

OpenClaw 配置建议

按 OpenClaw 官方 skills 配置约定,这个 skill 优先支持两种配置来源:

  • skills.entries."avavox-call".apiKey 对应注入环境变量 AVAVOX_APP_KEY
  • skills.entries."avavox-call".env 可选注入:
    • AVAVOX_BASE_URL(仅兼容 https://dashboard.avavox.com,对外发布时不要改成其他域名)
    • AVAVOX_DEFAULT_TASK_ID
    • AVAVOX_DEFAULT_LINE_ID
    • AVAVOX_DEFAULT_CONCURRENCY
    • AVAVOX_DEFAULT_BACKGROUND_AUDIO
    • AVAVOX_DEFAULT_CALL_TIME_TYPE

如果没有使用 OpenClaw 的 env/apiKey 注入,也可以继续使用 {baseDir}/config.json。 创建任务时不要通过默认配置固化 robotId;每次都应先用 robots list 确认当前可用机器人,再把本次确认的 robotId 显式传给 tasks create

官方文档

对外发布时,以下线上文档应视为优先参考的权威来源;本 skill 目录下的 references/ 是便于 OpenClaw 使用的精简摘要。

  • App Key 创建与管理: https://avavox.com/avavox-docs/developer/app-key.html
  • 创建任务: https://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

核心工作流

1. 查询可用资源

python3 {baseDir}/scripts/avavox_call.py robots list --config {baseDir}/config.json
python3 {baseDir}/scripts/avavox_call.py lines list --config {baseDir}/config.json

创建任务前先执行以下判断:

  1. 先运行 robots list,把返回的已发布机器人列表展示给用户选择。
  2. 只有在返回结果非空,且用户已经从结果中明确选择了一个机器人后,才继续 tasks create
  3. 如果 robots list 返回为空,不要继续创建任务,也不要假定某个 robotId 可用。
  4. 此时应打开浏览器访问 https://dashboard.avavox.com/robot,让用户先创建机器人并完成发布。
  5. 用户发布成功后,重新执行一次 robots list,再继续后续任务创建流程。

2. 创建任务

机器人选择规则

  1. 用户明确指定机器人时(如"用客服机器人打"、"用回访那个机器人"):

    • 先运行 robots list 获取当前可用列表
    • 从列表中定位用户指定的机器人并确认其状态
    • 如果存在且已发布,使用用户指定的;如果不存在或未发布,告知用户并让其从当前列表中选择
    • 不要忽略用户的明确指定而使用历史记忆中的 robotId
  2. 用户没有指定时(如"再打一个电话"、"创建个任务"):

    • 运行 robots list 获取当前可用列表
    • 展示给用户选择,或者询问是否使用上次的机器人(如果上次使用的仍在可用列表中)
    • 不能自动假设使用历史 robotId,至少要确认一下
  3. 关键原则

    • 用户的明确指令优先于历史记忆
    • ✅ 每次都要验证机器人当前是否仍然可用(通过 robots list
    • ✅ 如果历史机器人已从列表中消失,必须告知用户并重新选择
    • ❌ 不要忽略用户的新指定而默默使用旧 robotId
    • ❌ 不要在未验证的情况下假设历史机器人仍然可用
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"}]}]'

3. 导入客户

创建任务后,必须导入客户,系统才会开始外呼:

python3 {baseDir}/scripts/avavox_call.py customers import \
  --config {baseDir}/config.json \
  --task-id "task_xxx" \
  --customers-inline '[{"phoneNumber":"13800000001","ext":{"客户姓名":"张三"}}]'

变量参数传递说明

ext 字段用于传递机器人变量,格式为 {"变量名": "值"},其中变量名必须与机器人绑定的变量名称完全一致

  1. 先查询任务支持的变量
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"
      }
    ]
  }
}
  1. 根据 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"
      }
    }
  ]'
  1. 关键点
    • ext 中的键名(如 "客户姓名")必须使用 tasks variables 返回结果里 data.variables[].name 的值,不要使用 key
    • ext 是可选字段,如果机器人没有配置变量,可以省略
    • 变量值会在通话记录回调时原样回传,用于关联客户信息
    • 每次最多导入 2000 条客户

4. 查询与维护任务

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 listlines list
  • "创建一个外呼任务" / "再打一个电话" / "用 avavox 打个电话": 先运行 robots list 验证机器人可用性
    • 如果用户明确指定了机器人,从列表中定位并使用用户指定的
    • 如果用户没有指定,展示列表让用户选择,或询问是否使用上次的(需确认仍然可用)
    • 不要忽略用户的明确指定而使用历史记忆
    • 如果没有可选机器人,打开浏览器到 https://dashboard.avavox.com/robot 让用户创建并发布机器人,完成后再确认 taskNamerobotId,需要真实外呼时补 lineId
  • "看看这个任务有哪些机器人变量,ext 该怎么传": 用 tasks variables 查询 data.variables[]ext 的键名取其中的 name
  • "把客户名单导入这个任务": 用 customers import,其中 ext 字段的键名必须与 tasks variables 返回结果里的 data.variables[].name 完全一致
    • 标准格式: [{"phoneNumber":"手机号","ext":{"变量名1":"值1","变量名2":"值2"}}]
    • 示例: [{"phoneNumber":"13800000001","ext":{"客户姓名":"张三"}}],其中 "客户姓名" 是机器人绑定的变量名称
  • "暂停 / 恢复 / 查看任务详情": 用 tasks pausetasks resumetasks get
  • "文档里有接口,但脚本还没单独封装": 用受限的 request,且 --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
  • 不支持绝对 URL、协议相对 URL、外部域名,也不支持把 query string 直接拼进 --path
  • 如果需要 query 参数,使用 --query-json

约束

  • 只调用开放接口文档里明确存在的能力,不伪造前端内部 API。
  • App 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
  • "通话记录"文档当前定义的是回调数据结构,不是查询接口。
  • 如果要接收通话结束回调,不要只创建 App Key,还应在 接口回调 -> 回调设置 中配置回调 URL 与 Header。
  • request 只是开放接口的受限回退入口,目标必须保持在 https://dashboard.avavox.com/open/api/...
  • 不要在对用户可见的输出里回显完整 appKey

参考文件

  • 官方线上文档:
    • https://avavox.com/avavox-docs/developer/app-key.html
    • https://avavox.com/avavox-docs/developer/create-task.html
  • references/auth-and-context.md
  • references/entity-and-endpoint-map.md
  • references/payload-examples.md
  • references/callback-schema.md
  • scripts/avavox_call.py

Comments

Loading comments...