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.
42 lines
1.3 KiB
Python
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
|