openclaw secrets apply 强制执行的严格契约。如果目标不符合这些规则,apply 会在修改任何文件之前失败。
计划文件形状
openclaw secrets apply --from <plan.json> 期望一个由计划目标组成的 targets 数组:
openclaw secrets configure 会生成这种形状的计划。你也可以手写或编辑一个计划。
提供商更新插入与删除
计划还可以包含两个可选的顶层字段,用于在执行每个目标写入的同时修改secrets.providers 映射:
providerUpserts— 一个以提供商别名为键的对象。每个值都是一个提供商定义(与openclaw.json中secrets.providers.<alias>下接受的形状相同,例如exec或file提供商)。providerDeletes— 要移除的提供商别名数组。
providerUpserts 会在 targets 之前运行,因此 target.ref.provider 可以引用同一个计划在 providerUpserts 中引入的提供商别名。如果没有这个顺序,引用尚未在 openclaw.json 中配置的别名的计划会失败,并显示 provider "<alias>" is not configured。
providerUpserts 引入的 Exec 提供商仍受 Exec 提供商同意行为中的 exec 同意规则约束:包含 exec 提供商的计划在写入模式下需要 --allow-exec。
支持的目标范围
计划目标仅接受 SecretRef 凭证面中支持的凭证路径。目标类型行为
target.type 必须是可识别的目标类型,并且规范化后的 target.path 必须匹配该类型注册的路径形状。
除规范类型名称外,某些目标类型还接受 target.type 的兼容别名,以支持现有计划:
| 规范类型 | 接受的别名 |
|---|---|
models.providers.apiKey | models.providers.*.apiKey |
skills.entries.apiKey | skills.entries.*.apiKey |
channels.googlechat.serviceAccount | channels.googlechat.accounts.*.serviceAccount |
路径验证规则
每个目标都会使用以下所有规则进行验证:type必须是可识别的目标类型。path必须是非空的点分路径。pathSegments可以省略。如果提供,它必须规范化为与path完全相同的路径。- 禁止的片段会被拒绝:
__proto__、prototype、constructor。 - 规范化后的路径必须匹配目标类型注册的路径形状。
- 如果设置了
providerId或accountId,它必须与路径中编码的 id 匹配。 auth-profiles.json目标需要agentId。- 创建新的
auth-profiles.json映射时,请包含authProfileProvider。
失败行为
如果目标验证失败,apply 会退出并显示类似以下错误:Exec 提供商同意行为
- 默认情况下,
--dry-run会跳过 exec SecretRef 检查。 - 包含 exec SecretRef/提供商的计划在写入模式下会被拒绝,除非设置了
--allow-exec。 - 验证/应用包含 exec 的计划时,请在 dry-run 和写入命令中都传入
--allow-exec。
运行时和审计范围说明
- 仅引用的
auth-profiles.json条目(keyRef/tokenRef)会包含在运行时凭证解析和审计覆盖范围内。 secrets apply会写入受支持的openclaw.json目标、受支持的auth-profiles.json目标,以及三个默认启用的可选清理过程:scrubEnv(从.env中移除已迁移的明文值)、scrubAuthProfilesForProviderTargets(清除计划刚迁移的提供商在auth-profiles.json中留下的明文/未使用引用残留)和scrubLegacyAuthJson(从旧版auth.json存储中删除已迁移的api_key条目)。在计划中将options.scrubEnv、options.scrubAuthProfilesForProviderTargets、options.scrubLegacyAuthJson中任意一项设为false,即可跳过对应过程。
操作员检查
openclaw secrets configure 重新生成计划,或将目标路径修正为上面支持的形状。