火山引擎短信
先定位本 Skill 目录,再将
python3 <skill目录>/scripts/sms_cli.py 作为唯一命令入口。
脚本可从任意当前目录运行。脚本优先通过 ve volcsms 执行 Action,并继续负责
预检、授权摘要、脱敏与对账;不要绕过脚本直接执行写 Action。不要手写 HTTP 请求
或臆造 Action 名,构造不熟悉的参数前先查看对应命令的 --help。
鉴权边界
- 第一优先级:使用
ve >= 1.1.0的ve volcsms <Action>命令。由官方 CLI 复用ve login、当前 Profile 或VOLCENGINE_PROFILE指定的 Profile,并 负责凭证刷新、签名与请求发送。Skill 不读取 CLI 配置文件。 - 第二优先级:只有 CLI 不存在、不支持
volcsms,或在请求发出前明确无法使用 时,才使用兼容直连路径。该路径先通过官方CLIConfigCredentialProvider复用veProfile;无法解析时再使用完整的VOLCENGINE_ACCESS_KEY与VOLCENGINE_SECRET_KEY。临时凭证同时使用VOLCENGINE_SESSION_TOKEN。 - 第三优先级:如果 CLI 和兼容直连路径都不可用,并且宿主同时注入
ARK_SKILL_API_BASE与ARK_SKILL_API_KEY,则使用 ArkClaw 网关。 按 Action 契约使用 GET 或 POST,请求头携带Authorization: Bearer <token>与ServiceName: volcSMS,不要进行 V4 签名。 - 只有前两个高优先级路径都不可用时,ArkClaw 变量缺失一项才视为配置错误。
不要打印 Token,不要检查
/root/.openclaw/.env,也不要读取 shell 启动文件寻找 Token。 - 如果
ve不存在或低于1.1.0,先通过官方 npm 包@volcengine/cli安装或升级。requirements.txt中的 Python SDK 只用于 兼容直连路径;不要自行读取 CLI 配置文件。 - 不要直接读取或解析 Volcengine CLI 配置、SSO 缓存或控制台登录缓存; 凭证加载与刷新必须交给官方 CLI 或 Provider。
- 不要索要、展示、记录 ArkClaw Token 或 AK/SK,也不要通过命令行参数传递。
- 官方 Provider 返回的 Session Token 属于客户直连 V4 凭证,必须作为已签名的
X-Security-Token发送。 - 调用身份由最终选中的鉴权路径确定,不接受账号 ID 覆盖。
选择工作流
- 查询 Action 名、参数、版本、响应字段和重试分类时,读取 references/actions.md。
- 申请签名或模板、发送短信、管理群发任务前,读取 references/workflows.md。
- 执行任何写操作或处理客户数据前,读取 references/rules.md。
命令导航
- 资源查询:
list-message-groups、message-group-detail、list-qualifications、list-signatures、list-templates。 - 申请:先执行
signature-preview,再执行signature-submit; 先执行template-preview,再执行template-submit。 - 单条发送:使用完整客户短信内容、签名、消息组和短信类型调用
match-template,查找内容完全一致且已审核通过的模板。随后用明确选定的模板 ID 执行send-preview,取得当前会话中的明确授权后执行send-submit; 使用send-status查询回执。 - 群发:
batch-template-demo、batch-precheck、batch-create、batch-detail、batch-list、batch-launch-preview、batch-launch-submit、batch-cancel。 - 客户数据分析:使用
analytics。聚合统计是提交级数据;只有显式传入--include-logs才查询消息级证据。分析账号全量发送日志时,先枚举客户可见的 消息组,再逐个查询。--channel-type只限定聚合统计;--mobile只作为发送日志请求过滤条件,必须与--include-logs同时使用, 不得返回,也不会限定同一报告中的聚合趋势。
强制安全门禁
- 不支持资质申请,只查询已审核资质。如果客户没有可用资质,停止签名申请流程, 明确引导客户登录火山引擎控制台,在“国内短信 > 资质管理”完成资质申请;待资质 审核通过后再继续。不要代替客户提交资质申请。
- 签名和模板申请必须先生成预览;只有执行摘要仍与预览一致时才能提交。
- 签名申请必须遵循客户明确指定的消息组子集。客户不确定或未指定时,绑定当前 可见的全部消息组。默认全选时,提交前立即重新查询;可见集合变化后必须重新 生成预览。
- 签名来源
source必须为整数:1 = 公司、2 = App、3 = 商标。消息组行业不是签名申请门禁;只有客户主动询问时才使用message-group-detail。 - 单条发送必须针对当前脱敏发送摘要取得明确授权。只有取得授权后,才能把预览 摘要作为授权摘要传入;泛化的“继续”或“是”不构成授权。
- 单条发送前,根据完整短信内容判断短信类型,再匹配模板。只检查本次发送需要的
消息组、签名、模板及变量关系;不要查询资质或消息组行业。签名缺少
usable、资质 ID 或短信类型字段不视为失败,但明确usable=false必须拒绝。 - 创建群发任务不等于授权发送。展示最新任务摘要并在当前会话收到
确认启动任务 <taskId>后,才能启动。 - 保留群发创建交接信息:
taskId、subAccount、文件 SHA-256 和号码统计。 任务详情缺少这些值时,在启动预览中补入交接信息。 - 发送或启动前立即重新查询可变资源;任何摘要变化都会使原授权失效。
- 群发任务禁止使用验证码模板。
- 保留公开短信错误码,只能通过
actions.md中的官方文档链接解释; 不要硬编码、推断或输出非公开实现原因。 - 除非
actions.md明确声明服务端幂等字段与对账方式,否则不要自动重试写 Action。 - CLI 写调用只有在能够确认子进程未发出请求时才允许进入兼容路径。CLI 超时、
响应丢失或无法判断是否已发送时,必须返回
outcome_unknown,不得换后端重放。 - 如果写请求可能已到达服务端但响应丢失,返回
outcome_unknown,并使用查询 Action 对账;不要盲目重复提交。
输出边界
返回 CLI JSON 信封,但不要暴露完整手机号、可能含敏感信息的短信内容、凭证、 Authorization 请求头、签名 URL 查询参数,以及任何非客户可见字段。 保留公开 Request ID 与公开错误码,供客户支持排查。