Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

配置生命周期

配置既是操作界面,也是运行时契约。将其视为具有明确所有者的状态,而不是复制到任何需要它们的子系统中的松散设置。

规范来源是 zeroclaw_config::schema::Config,从 config.toml 加载。面向用户的配置界面、生成的配置参考、网关配置编辑器、环境变量覆盖、zeroclaw config setzeroclaw config patch、快速开始以及 RPC 配置方法都通过同一个类型化 schema 路由。

有关将类型化 schema 转换为配置参考的构建顺序、追踪输出规则和漂移检查,请参阅生成文档管道

谁拥有什么

Surface所有者持久化边界运行时应用边界
配置模式crates/zeroclaw-config/src/schema.rs 以及 Configurable 派生代码,而不是生成的文档新的二进制构建
已生成的参考cargo mdbook refs / markdown-schemadocs/book/src/reference/config.md 在构建时仅文档说明
引导位置ZEROCLAW_CONFIG_DIR, ZEROCLAW_DATA_DIR, deprecated ZEROCLAW_WORKSPACE仅限环境Config 存在之前
Schema-mirror 覆盖项ZEROCLAW_<lowercase_path> 使用 __ 表示点号仅内存中每个 Config::load_or_init()
CLI 配置写入zeroclaw config set, config patch, 别名,模型辅助函数save_dirty()config.toml下一次加载/重新加载,除非当前命令使用新的内存值
RPC 和 TUI 配置写入config/* RPC 方法由 zerocode 使用save_dirty()config.tomlRPC 上下文立即更新;守护进程拥有的子系统需要重新加载
快速开始应用共享 web、CLI 和 zerocode 应用路径save_dirty()config.tomlWeb 和 RPC 可以触发 daemon 重载;独立 CLI 会在下次 load/reload 时应用
Gateway 配置写入配置 API 处理程序和 persist_and_swap()save_dirty()config.toml网关可见的状态更新会立即生效;守护进程子系统会在重载后应用
守护进程重新加载/admin/reload、RPC config/reload 或进程内重载通道重新读取 config.toml在同一 PID 中重新创建守护进程子系统

不要手动编辑生成的 config reference。如果那里有字段、枚举、alias section、secret marker 或描述错误,请修正 schema 或生成器并重新生成 reference。

加载顺序

Config 加载有几个不同的阶段:

  1. 从 bootstrap 环境变量解析安装根目录。这发生在任何 Config 存在之前,因此 bootstrap 名称保持其大写形式,并且不使用 schema-mirror 语法。
  2. 读取 config.toml,在内存中运行 schema 迁移,解密已配置的密钥,并将任何格式错误的安全关键部分记录为降级安全。
  3. 将 schema-mirror 覆盖应用到内存配置中。在环境变量中,__ 映射为 .,因此 ZEROCLAW_providers__models__openai__api_key 指向 providers.models.openai.api_key
  4. 在不将操作员锁定在网关编辑器外的情况下进行验证并发出警告。

在全新安装时,默认值会在应用环境覆盖之前保存。这样可以避免将通过环境注入的密钥和本地 CI 值写入新文件。

环境覆盖项不会被保存

Schema-mirror env vars 是运行时注入。它们在加载时进入内存中的 Config,并在 env_overridden_paths 中被跟踪,因此 CLI、dashboard 和 quickstart 可以显示覆盖标记。

保存时,必须将这些路径在加密前还原为其覆盖前的磁盘值或默认值。对于机密信息,这一点尤为重要:如果操作员在磁盘上有一个已加密的 API 密钥,并且临时为同一路径通过环境变量覆盖启动,那么一次无关的配置保存绝不能用环境变量值或掩码显示字符串替换真实凭据。

在牢记此不变式的前提下审查配置更改:

  • ZEROCLAW_* schema-mirror 值在加载后会影响运行中的进程。
  • 它们不会变成持久配置。
  • 保存路径必须保留加密密钥和外部密钥引用,除非同一路径被有意编辑。

凭据输入保持类型化

凭据类运行时值仍然属于配置值。API 密钥、OAuth 令牌、端点 URL 以及其他提供商/渠道凭据,在运行时构造函数获取它们之前,应通过类型化配置模式、配置机密处理机制或与模式镜像同步的 ZEROCLAW_* 覆盖项传递。

请勿在 provider、channel、tool、transcription、TTS、memory 或 gateway 构造函数内部添加临时的 std::env::var("PROVIDER_API_KEY") 读取。这会在 Config 之外创建第二个凭据来源,绕过 env-override 可见性,并可能导致 CLI、gateway、RPC/TUI、quickstart 和 reload 行为不一致。

如果 ZeroClaw 有意为某个集成系列提供原生环境桥接,请在集成边界处记录该桥接,并在构造前将其映射到相同的类型化配置值中。否则,诸如 ANTHROPIC_API_KEYOPENROUTER_API_KEYQDRANT_URL 等生态系统默认的 shell 名称应由操作员桥接到对应的 ZEROCLAW_* 架构镜像变量;参见 Environment variables

脏路径和增量写入

大多数编辑界面使用 Config::mark_dirty() 加上 save_dirty(),而不是完整重写。save_dirty() 只写入已更改的点路径,尽可能保留未标记为脏的条目和注释,写入当前的 schema_version,并通过原子性的临时文件替换进行写入。

该路径也负责 map-key 区段。创建别名,例如模型提供方、MCP server、skill bundle 或 knowledge bundle,必须将正确的区段标记为已修改,这样别名才能在保存和重新加载后保留下来。只更新内存中的 dashboard 状态的配置编辑是不完整的。

在审查 config 写入时,请检查:

  • 在持久化之前,编辑后的路径会被标记为脏状态;
  • map-key 会创建、重命名和删除,使父部分或自然键变为脏状态;
  • secret 和 env-overridden 路径保持它们的保存掩码行为;
  • schema_version 在增量写入后仍保持为最新;
  • 更改后的值会在 save_dirty() 后再重新加载时保留。

已保存 vs 已应用

成功保存表示文件已更改。但这并不总意味着每个运行时组件都已采用了该更改。

守护进程拥有长期运行的子系统图:gateway、channel listeners、scheduler、MQTT listener、session wiring、memory backend、provider factories 和 cost wiring。POST /admin/reload 会向守护进程循环发送信号,守护进程重新读取 config.toml,并在同一进程中重新实例化这些子系统。PID 保持不变,但 listeners 会短暂重新绑定。

Gateway 配置写入会调用 persist_and_swap():先保存到磁盘,然后替换网关可见的内存中的配置并设置 pending_reload。这使配置编辑器能够立即反映写入,而重新加载横幅则会告知操作员,通道、提供程序、调度器或其他守护进程拥有的组件可能仍在从先前的子系统实例运行。

独立的 zeroclaw gateway start 没有守护进程监督器。它的重载端点会返回需要重启的响应,因为没有外层守护进程循环可以发出信号。

重新加载访问

允许从回环地址进行本地重载。远程重载需要同时满足以下条件:

  1. gateway.allow_remote_admin = true
  2. 已启用配对并拥有有效的配对持有者令牌

在配对已禁用时选择启用远程管理会被拒绝,而不会被视为匿名远程重新加载访问。

安全关键的格式错误配置段仅在操作员明确选择启用降级服务时才允许降级。否则,进程会拒绝提供服务,因为重置为默认的安全态势可能比文件原本意图更弱。

回滚并修复

配置写入使用原子性的临时文件替换和仅所有者可读写权限。替换现有文件时,写入器会在替换过程中在同一目录创建 config.toml.bak,并在成功写入后将其移除。网关写入还会快照写入前的文件,并在持久化在内存状态切换之前失败时尽力恢复它。

对于已保存并应用的有效但不期望的配置更改,没有通用的事务性回滚。请从备份中恢复之前的 config.toml,然后通过 CLI 或仪表板将该字段改回,接着根据上面的运行时边界重新加载或重启。

Config-visible 并不总是运行时支持的

在每个运行时路径使用它之前,一个字段可以先对 schema 可见。只有当文档和审查说明明确说明这一点时,这才是可以接受的。

例如,knowledge_bundles 在 schema 中可见,并出现在配置节 API 中。添加或更改此类表面的 PR 必须明确说明它仅存储配置、连接运行时行为,还是两者都完成。

在审查一个涉及 schema 可见但尚未被运行时消费的字段的 PR 时,要求 PR 描述说明运行时接线是延后、超出范围,还是由同一项更改完成。

审阅者清单

对于 config-schema、env-var、default 或 reload 的更改,请询问:

  • 新值的权威来源是什么?
  • 这是在创建重复状态,还是在使用时从 Config 解析?
  • 生成的参考文档是否来自代码,而不是人工维护的说明文字?
  • 环境覆盖仅在加载时生效并在保存时被屏蔽吗?
  • CLI、gateway、RPC/TUI 和 quickstart 各界面在带点路径上是否一致?
  • 凭据是否通过类型化配置或有文档记录的 schema-mirror 桥接来解析,而非临时的 provider 原生环境变量读取?
  • 保存能否在进程重新加载后仍然保留,而不仅仅是立即的内存中渲染?
  • PR 里有没有说明用户是否需要重新加载、重启、迁移或手动回滚?
  • 如果该字段仅在配置中可见,PR 是否避免声称运行时支持?

源指针

  • 配置模式和持久化:crates/zeroclaw-config/src/schema.rs
  • 环境覆盖语法:crates/zeroclaw-config/src/env_overrides.rs
  • Config CLI 命令:src/main.rs
  • RPC 和 TUI 配置方法:crates/zeroclaw-runtime/src/rpc/dispatch.rs
  • 共享快速入门应用路径:crates/zeroclaw-runtime/src/quickstart/mod.rs
  • Web 快速入门重载信号:crates/zeroclaw-gateway/src/api_quickstart.rs
  • Gateway 配置 API 和重新加载横幅:crates/zeroclaw-gateway/src/api_config.rs
  • 重新加载端点和访问闸门:crates/zeroclaw-gateway/src/lib.rs
  • Gateway bearer auth helper: crates/zeroclaw-gateway/src/api.rs
  • 生成的引用流水线:xtask/src/cmd/mdbook/refs.rs