Skip to content

fix: tolerate invalid env vars in settings, with SWANLAB_STRICT_ENV toggle - #1720

Closed
SAKURA-CAT wants to merge 3 commits into
mainfrom
fix/pydantic
Closed

SAKURA-CAT wants to merge 3 commits into
mainfrom
fix/pydantic

Conversation

@SAKURA-CAT

@SAKURA-CAT SAKURA-CAT commented Jul 30, 2026 •

Copy link
Copy Markdown
Member

Summary

修复当环境变量直接映射到某个字段(嵌套模型或简单字段)但值无法解析时,pydantic-settings 抛出 SettingsError、导致整个 import swanlab 崩溃的问题。同时提供 SWANLAB_STRICT_ENV 开关,便于调试时切换为严格模式。

背景

Settings 中的 run / project / experiment / terminal / integration / core / probe 均为嵌套子模型(complex 字段)。当环境变量直接命中字段名本身时,pydantic-settings 会尝试 json.loads() 解析整个子模型,非 JSON 值即崩溃。简单字段(如 bool)的非法值则在模型构造阶段抛出 ValidationError。

Changes

swanlab/sdk/internal/settings/__init__.py

  • 新增模块级常量 STRICT_ENV(读取 SWANLAB_STRICT_ENV,与 SECRETS_DIR/CONFIG_DIR 风格一致)
  • 新增 _TolerantEnvSettingsSource(EnvSettingsSource):
    • 复杂字段:JSON 解析失败时,lenient 模式跳过并告警,strict 模式直接抛出
    • 简单字段:lenient 模式通过 TypeAdapter 预校验类型,非法值跳过并告警;strict 模式交给模型校验(保留 before-validator 行为)
  • 在 settings_customise_sources 中用该子类替换默认的 env_settings

tests/unit/sdk/internal/settings/test_settings.py

  • 嵌套模型字段非法值忽略(7 个字段参数化)
  • 合法 JSON 解析、子字段不受影响
  • 简单字段非法值忽略、mode=cloud 历史别名兼容
  • TestStrictEnv:strict 模式下复杂/简单字段抛出、mode=cloud 仍正常

行为对照

场景 lenient(默认) strict(SWANLAB_STRICT_ENV=1)
SWANLAB_RUN=hello(复杂字段非法 JSON) ✅ 跳过 + warning ❌ 抛出 SettingsError
SWANLAB_INTERACTIVE=notabool(简单字段非法值) ✅ 跳过 + warning ❌ 抛出 ValidationError
SWANLAB_RUN={"id":"x"}(合法 JSON) ✅ 正常解析 ✅ 正常解析
SWANLAB_RUN_ID=xxx(嵌套子字段) ✅ 不受影响 ✅ 不受影响
SWANLAB_MODE=cloud(历史别名) ✅ 回退默认 online ✅ before-validator 转 online

范围说明

  • 仅环境变量源受开关控制;YAML / .env 文件、init 参数(代码传参)的错误始终抛出
  • STRICT_ENV 为模块级常量,import 后不变(与 SECRETS_DIR/CONFIG_DIR 一致);测试通过 monkeypatch.setattr 控制
  • mode=cloud 在 lenient 模式下被 TypeAdapter 拒绝(不在 Literal 中),但回退到默认值 online,与 before-validator 转换结果一致

Testing

  • uv run pytest tests/unit/sdk/internal/settings/ → 78 passed
  • uv run ruff check / uv run basedpyright → 通过
  • uv run pytest tests/unit/sdk/internal tests/unit/sdk/cmd/init/test_init_e2e.py → 1335 passed(需 SWANLAB_RUN_ID 未设置)

Notes

  • tests/unit/conftest.py 的 autouse fixture 未清理 SWANLAB_RUN_ID 等环境变量,属于既有的测试隔离缺陷,与本 PR 无关,后续可单独修复

@SAKURA-CAT SAKURA-CAT added the 🐛 bug Something isn't working label Jul 30, 2026
@SAKURA-CAT SAKURA-CAT self-assigned this Jul 30, 2026
@SAKURA-CAT SAKURA-CAT changed the title fix: tolerate invalid JSON env vars for nested settings fields fix: tolerate invalid env vars in settings, with SWANLAB_STRICT_ENV toggle Jul 30, 2026
Nexisato

This comment was marked as spam.

@SAKURA-CAT

Copy link
Copy Markdown
Member Author

写的有点问题,算了,重写一个:我们收束一下设计,import swanlab时别报错就行,静默跳过不安全

@SAKURA-CAT SAKURA-CAT closed this Jul 30, 2026
@SAKURA-CAT
SAKURA-CAT deleted the fix/pydantic branch July 30, 2026 07:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐛 bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants