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.
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user