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