resolveAuthProfileOrder(配置文件排序)resolveApiKeyForProfile(运行时凭据解析)openclaw models status --probeopenclaw doctorauth 检查(doctor-auth)
稳定的探测原因码
探测结果包含一个status 桶(ok、auth、rate_limit、billing、timeout、format、unknown、no_model),以及在探测未到达模型调用时使用的稳定 reasonCode:
资格检查会将可用凭据的原因码报告为
ok。
Token 凭据
Token 凭据(type: "token")支持内联 token 和/或 tokenRef。
资格规则
- 当
token和tokenRef都缺失时,Token 配置文件不符合资格(missing_credential)。 expires是可选项。存在时,它必须是一个有限的 Unix epoch 毫秒数,且大于0,并且不大于 JavaScriptDate的最大时间戳(8640000000000000)。- 如果
expires无效(类型错误、NaN、0、负数、非有限值,或超过该最大值),则该配置文件不符合资格,错误为invalid_expires。 - 如果
expires已经过期,则该配置文件不符合资格,错误为expired。 tokenRef不会绕过expires校验。
解析规则
- 解析器语义与
expires的资格语义一致。 - 对于符合资格的配置文件,token 材料可以从内联值或
tokenRef中解析。 - 无法解析的引用会在
models status --probe输出中产生unresolved_ref。
Agent 复制可移植性
Agent auth 继承采用读透式。当某个 agent 没有本地配置文件时,它会在运行时从默认/主 agent 存储中解析配置文件,而不会将密钥材料复制到自身的凭据存储中(agents/<agentId>/agent/openclaw-agent.sqlite)。
显式复制流程(例如 openclaw agents add)使用此可移植性策略:
api_key和token配置文件是可移植的,除非copyToAgents: false。oauth配置文件默认不可移植,因为刷新令牌可能是一次性的或对轮换敏感。- 仅当已知跨 agent 复制刷新材料是安全的时候,Provider 拥有的 OAuth 流程才可以通过
copyToAgents: true选择启用;该显式启用仅在配置文件携带内联的访问/刷新材料时生效。
仅配置的 auth 路由
auth.profiles 中 mode: "aws-sdk" 的条目是路由元数据,不是存储的凭据。它们在目标提供方使用 models.providers.<id>.auth: "aws-sdk" 时有效,这是插件拥有的 Amazon Bedrock 配置所写入的路由。这些 profile id 可能会出现在 auth.order 和会话覆盖中,即使凭据存储中没有匹配的条目。
不要在凭据存储中写入 type: "aws-sdk";存储的凭据只能是 api_key、token 或 oauth。如果旧版 auth-profiles.json 中有这样的标记,openclaw doctor --fix 会将其移到 auth.profiles,并从存储中移除该标记。
显式 auth 顺序过滤
- 当为某个提供方设置了
auth.order.<provider>或 auth-store 顺序覆盖时,models status --probe只会探测该提供方解析后的 auth 顺序中仍保留的配置文件 id。已存储的覆盖优先于auth.order配置。 - 该提供方已存储但未包含在显式顺序中的配置文件不会在之后被静默尝试。探测输出会以
reasonCode: excluded_by_auth_order报告该配置文件,详细信息为Excluded by auth.order for this provider. - 有效的会话用户固定配置是一个明确的每会话例外:即使该配置文件未包含在提供方顺序中,OpenClaw 也会先尝试该配置文件,然后使用按顺序排列的同提供方配置文件作为重试候选项。冷却或禁用窗口只适用于受影响的配置文件;不会抑制其符合资格的同级配置文件。
探测目标解析
- 探测目标可以来自认证配置文件、环境凭据或
models.json(结果source:profile、env、models.json)。 - 如果某个提供方有凭据,但 OpenClaw 无法为其解析出可探测的模型候选项,则
models status --probe会报告status: no_model,并带有reasonCode: no_model。
外部 CLI 凭据发现
- 仅在提供方、运行时或 auth 配置文件处于当前操作的作用域内,或者该外部来源对应的本地已存储配置文件已存在时,才会发现由外部 CLI 持有的仅运行时凭据(
claude-cli对应 Claude CLI,openai对应 Codex CLI,minimax-portal对应 MiniMax CLI)。 - Auth-store 调用方会选择明确的外部 CLI 发现模式:
none表示仅使用持久化/插件认证,existing表示刷新已存储的外部 CLI 配置文件,或scoped表示针对具体的提供方/配置文件集合。 - 只读/状态路径传递
allowKeychainPrompt: false;它们仅使用基于文件的外部 CLI 凭据,不读取或重用 macOS Keychain 的结果。
OAuth SecretRef 策略保护
SecretRef 输入仅用于静态凭据。OAuth 凭据是在运行时可变的(刷新流程会持久化轮换后的令牌),因此由 SecretRef 支持的 OAuth 材料会将可变状态分散到不同的存储中。- 如果某个 profile 凭据的
type为"oauth",则该 profile 上任何凭据材料字段都将拒绝使用 SecretRef 对象。 - 如果
auth.profiles.<id>.mode为"oauth",则该 profile 的 SecretRef 支持的keyRef/tokenRef输入将被拒绝。 - 违规将导致硬失败(抛出错误),发生在启动/重新加载密钥准备和 profile 解析路径中。
向后兼容消息
为兼容脚本,探测错误保持第一行不变:Auth profile credentials are missing or expired.
人类可读的详细信息和稳定的原因代码会在后续行中以 ↳ Auth reason [code]: ... 的形式给出。