配置系统

iamai 使用 TOML 配置,并在启动前做结构化校验。配置系统的目标不是替代部署平台, 而是把“消息运行时必须知道的边界”写成可审计、可检查、可文档化的输入。

基本结构

[runtime]
command_prefixes = ["/"]
adapters = ["terminal"]
plugins = ["src/my_runtime/plugins/hello.py:HelloPlugin"]
superusers = ["10000"]

[adapter.terminal]
prompt = "iamai> "

[plugin.hello]
greeting = "hello"

[state]
backend = "json"
path = "var/state.json"

[runtime] 定义运行时骨架,[adapter.*] 定义协议入口,[plugin.*] 交给插件模型验证, [state] 定义持久化后端。

可安装扩展

插件和适配器可以作为 Python 包发布。使用者通过 uv add 安装后,有两种启用方式。

显式启用:

[runtime]
plugins = ["echo"]
adapters = ["telegram"]

echo 和 telegram 可以是内置名、entry point 名或 module:Class 导入路径。

自动发现:

[runtime]
auto_discover_plugins = true
auto_discover_adapters = true

自动发现会加载当前环境中所有 iamai.plugins 和 iamai.adapters entry points。生产环境建议 显式列出扩展;自动发现更适合开发、示例和受控私有运行环境。发布规范见 插件与适配器发布参考。

配置检查命令

uv run python -m iamai --config config.toml config-check

这个命令不仅验证语法和类型,也会输出高风险运行时告警,例如:

  • 非 loopback 监听却没有 access_token;

  • 管理命令打开但没有 superusers;

  • allow_query_token = true;

  • runtime.allow_external_paths = true;

  • webhook 对公网开放却没有 signature_secret。

路径解析

plugin_dirs 和 python_paths 默认被限制在配置根目录内。只有显式设置 runtime.allow_external_paths = true 才允许引用根目录外的路径。

这条约束是为了让开发、CI 和部署的行为一致。共享示例时可以使用相对路径;生产环境应避免让 配置文件指向不受版本控制的外部 Python 文件。

敏感字段

配置展示和管理命令输出会自动脱敏 token、secret、password、api_key 等字段。 不要把脱敏当作密钥管理。真实密钥仍应通过部署系统、环境变量或受控 secret store 管理。

配置 Schema

Runtime、适配器和插件配置可以导出为一份版本化的 JSON Schema:

uv run python -m iamai --config config.toml config-schema
uv run python -m iamai --config config.toml config-schema greeting

无插件参数时,命令输出 Draft 2020-12 根 Schema,固定包含 runtime、logging、 state、adapter 和 plugin 五个表。第二种写法保留为兼容入口,只输出指定插件的 配置 Schema。

根 payload 使用稳定 $id 和 x-iamai-contract-version。适配器或插件声明 Pydantic 模型或 dataclass config_model 后,其字段、默认值和显式约束会进入对应子 Schema;没有 模型的扩展仍以开放对象出现。凭据字段由模型显式标注 writeOnly: true,生成器只读取类元数据, 不会读取或导出当前配置中的 secret 值。

这份合同适合用于文档、CI、编辑器提示和内部平台表单生成。启用 management_api 插件时, 认证后的 GET /schema 返回与无参 CLI 相同的根 payload。

推荐实践

  • 把 config-check 放进 CI。

  • 生产配置显式列出 runtime.superusers。

  • 网络适配器同时考虑入站鉴权和出站回调限制。

  • 示例配置可以宽松,生产配置应保守。