Files
dela 071dfaf42c Sanitize SwanLab env before login so 0.9 nested project does not crash
OpenBayes sets SWANLAB_PROJECT as a string; swanlab>=0.9 parses that as
ProjectSettings and raises QuoteAwareEnvSettingsSource. Drop it, keep
SWANLAB_PROJ_NAME, and share run-id extraction with train_k3.
2026-08-26 10:00:06 +08:00

42 lines
1.3 KiB
Python

"""Sanitize SwanLab env before import/init.
swanlab>=0.9 ``Settings.project`` is a nested model. A string
``SWANLAB_PROJECT`` (OpenBayes and older docs) makes pydantic raise
``error parsing value for field "project" from source
_QuoteAwareEnvSettingsSource``. Project name belongs in
``SWANLAB_PROJ_NAME`` / ``init(project=...)``.
"""
from __future__ import annotations
import os
def prepare_swanlab_env(default_project: str = "kda") -> str:
"""Drop nested ``SWANLAB_PROJECT``, keep a plain project name.
Must run before ``import swanlab`` / ``swanlab.login`` / ``init``.
"""
raw = os.environ.pop("SWANLAB_PROJECT", None)
name = os.environ.get("SWANLAB_PROJ_NAME") or raw or default_project
name = str(name).strip().strip("\"'")
if not name or name[0] in "{[":
name = default_project
os.environ.pop("SWANLAB_PROJECT", None)
os.environ["SWANLAB_PROJ_NAME"] = name
return name
def swanlab_run_id(run) -> str | None:
for attr in ("id", "run_id"):
val = getattr(run, attr, None)
if isinstance(val, str) and val:
return val
public = getattr(run, "public", None)
if public is not None:
for attr in ("cloud_run_id", "run_id", "id"):
val = getattr(public, attr, None)
if isinstance(val, str) and val:
return val
return None