配置系统

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"]

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

自动发现:

[runtime]
auto_discover_plugins = true
auto_discover_adapters = true

自动发现会加载当前环境中所有 iamai.pluginsiamai.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_dirspython_paths 默认被限制在配置根目录内。只有显式设置 runtime.allow_external_paths = true 才允许引用根目录外的路径。

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

敏感字段

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

配置 Schema

插件声明 config_model 后,可以导出 JSON Schema:

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

这适合放进文档、CI 或内部平台表单生成流程。

推荐实践

  • config-check 放进 CI。

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

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

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