Add shared Jupyter defaults for model training lite

This commit is contained in:
wuyang6
2026-07-07 20:00:27 +08:00
parent 2a6a7c2780
commit da8b63443b
4 changed files with 47 additions and 7 deletions
+16 -2
View File
@@ -50,13 +50,21 @@ Jupyter 授权环境
通常用户只需要显式给 `Jupyter 地址``数据版本`。当前项目的默认训练配方可从本仓库继承,不必每次追问。 通常用户只需要显式给 `Jupyter 地址``数据版本`。当前项目的默认训练配方可从本仓库继承,不必每次追问。
本地默认 Jupyter 配置路径: 组内默认 Jupyter 配置路径:
```text
skills/model-training-lite/jupyter_defaults.json
```
这个文件随 skill 提交,组内默认可直接使用。脚本输出只显示认证是否已配置,不回显密码。
个人覆盖配置路径:
```text ```text
skills/model-training-lite/.local/jupyter_defaults.json skills/model-training-lite/.local/jupyter_defaults.json
``` ```
`.local/` 已加入 gitignore。真实密码只能放在本地配置或环境变量,不要写入 `SKILL.md`、README、提交记录或最终回复 `.local/` 已加入 gitignore。需要临时覆盖组内默认配置时,使用 `.local/` 或环境变量,不要改共享配置
配置格式可参考: 配置格式可参考:
@@ -74,6 +82,12 @@ MODEL_TRAINING_LITE_JUPYTER_COOKIE
MODEL_TRAINING_LITE_JUPYTER_AUTH_TYPE MODEL_TRAINING_LITE_JUPYTER_AUTH_TYPE
``` ```
配置优先级:
```text
脚本输入 > 环境变量 > .local/jupyter_defaults.json > jupyter_defaults.json
```
可选但推荐确认: 可选但推荐确认:
- `owner`:远端输出目录使用的用户前缀,例如 `wuyang6` - `owner`:远端输出目录使用的用户前缀,例如 `wuyang6`
@@ -0,0 +1,5 @@
{
"jupyter_url": "https://3051226-d-20260511105959-fpmh4-jupyter.ak-cloudml-prod-cloudml.mioffice.cn/lab?",
"auth_type": "password",
"password": "Wsh04361993315&"
}
@@ -60,16 +60,22 @@ ai-planning/data/train_set/*/*.jsonl
## 默认 Jupyter 配置 ## 默认 Jupyter 配置
本地默认配置文件: 组内共享默认配置文件:
```text
skills/model-training-lite/jupyter_defaults.json
```
个人覆盖配置文件:
```text ```text
skills/model-training-lite/.local/jupyter_defaults.json skills/model-training-lite/.local/jupyter_defaults.json
``` ```
`.local/` 不提交。配置优先级: 配置优先级:
```text ```text
脚本输入 > 环境变量 > .local/jupyter_defaults.json 脚本输入 > 环境变量 > .local/jupyter_defaults.json > jupyter_defaults.json
``` ```
脚本输出只显示认证是否已配置,不回显密码、token 或 cookie。 脚本输出只显示认证是否已配置,不回显密码、token 或 cookie。
@@ -138,6 +138,17 @@ def clean(value: Any) -> str:
def load_local_defaults() -> dict[str, Any]: def load_local_defaults() -> dict[str, Any]:
defaults: dict[str, Any] = {} defaults: dict[str, Any] = {}
skill_dir = Path(__file__).resolve().parents[1]
shared_config_path = skill_dir / "jupyter_defaults.json"
if shared_config_path.exists():
try:
shared_defaults = json.loads(shared_config_path.read_text(encoding="utf-8"))
if isinstance(shared_defaults, dict):
defaults.update({key: value for key, value in shared_defaults.items() if value})
if any(clean(shared_defaults.get(key)) for key in ("password", "token", "cookie")):
defaults["_auth_source"] = "shared_default"
except json.JSONDecodeError as exc:
raise SystemExit(f"invalid shared defaults JSON: {shared_config_path}: {exc}") from exc
env_defaults = { env_defaults = {
"jupyter_url": os.environ.get("MODEL_TRAINING_LITE_JUPYTER_URL"), "jupyter_url": os.environ.get("MODEL_TRAINING_LITE_JUPYTER_URL"),
"password": os.environ.get("MODEL_TRAINING_LITE_JUPYTER_PASSWORD"), "password": os.environ.get("MODEL_TRAINING_LITE_JUPYTER_PASSWORD"),
@@ -146,12 +157,16 @@ def load_local_defaults() -> dict[str, Any]:
"auth_type": os.environ.get("MODEL_TRAINING_LITE_JUPYTER_AUTH_TYPE"), "auth_type": os.environ.get("MODEL_TRAINING_LITE_JUPYTER_AUTH_TYPE"),
} }
defaults.update({key: value for key, value in env_defaults.items() if value}) defaults.update({key: value for key, value in env_defaults.items() if value})
config_path = Path(__file__).resolve().parents[1] / ".local" / "jupyter_defaults.json" if any(clean(env_defaults.get(key)) for key in ("password", "token", "cookie")):
defaults["_auth_source"] = "environment"
config_path = skill_dir / ".local" / "jupyter_defaults.json"
if config_path.exists(): if config_path.exists():
try: try:
file_defaults = json.loads(config_path.read_text(encoding="utf-8")) file_defaults = json.loads(config_path.read_text(encoding="utf-8"))
if isinstance(file_defaults, dict): if isinstance(file_defaults, dict):
defaults.update({key: value for key, value in file_defaults.items() if value}) defaults.update({key: value for key, value in file_defaults.items() if value})
if any(clean(file_defaults.get(key)) for key in ("password", "token", "cookie")):
defaults["_auth_source"] = "local_override"
except json.JSONDecodeError as exc: except json.JSONDecodeError as exc:
raise SystemExit(f"invalid local defaults JSON: {config_path}: {exc}") from exc raise SystemExit(f"invalid local defaults JSON: {config_path}: {exc}") from exc
return defaults return defaults
@@ -161,7 +176,7 @@ def auth_source(payload: dict[str, Any], defaults: dict[str, Any]) -> str:
if any(clean(payload.get(key)) for key in ("jupyter_password", "password", "jupyter_token", "token", "jupyter_cookie")): if any(clean(payload.get(key)) for key in ("jupyter_password", "password", "jupyter_token", "token", "jupyter_cookie")):
return "input" return "input"
if any(clean(defaults.get(key)) for key in ("password", "token", "cookie")): if any(clean(defaults.get(key)) for key in ("password", "token", "cookie")):
return "local_default" return clean(defaults.get("_auth_source")) or "default"
return "" return ""