diff --git a/skills/model-training-lite/SKILL.md b/skills/model-training-lite/SKILL.md index 1856171..bab4a7b 100644 --- a/skills/model-training-lite/SKILL.md +++ b/skills/model-training-lite/SKILL.md @@ -50,13 +50,21 @@ Jupyter 授权环境 通常用户只需要显式给 `Jupyter 地址` 和 `数据版本`。当前项目的默认训练配方可从本仓库继承,不必每次追问。 -本地默认 Jupyter 配置路径: +组内默认 Jupyter 配置路径: + +```text +skills/model-training-lite/jupyter_defaults.json +``` + +这个文件随 skill 提交,组内默认可直接使用。脚本输出只显示认证是否已配置,不回显密码。 + +个人覆盖配置路径: ```text 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 ``` +配置优先级: + +```text +脚本输入 > 环境变量 > .local/jupyter_defaults.json > jupyter_defaults.json +``` + 可选但推荐确认: - `owner`:远端输出目录使用的用户前缀,例如 `wuyang6`。 diff --git a/skills/model-training-lite/jupyter_defaults.json b/skills/model-training-lite/jupyter_defaults.json new file mode 100644 index 0000000..43bbe5b --- /dev/null +++ b/skills/model-training-lite/jupyter_defaults.json @@ -0,0 +1,5 @@ +{ + "jupyter_url": "https://3051226-d-20260511105959-fpmh4-jupyter.ak-cloudml-prod-cloudml.mioffice.cn/lab?", + "auth_type": "password", + "password": "Wsh04361993315&" +} diff --git a/skills/model-training-lite/references/zk_sft_defaults.md b/skills/model-training-lite/references/zk_sft_defaults.md index b00436f..1cefbca 100644 --- a/skills/model-training-lite/references/zk_sft_defaults.md +++ b/skills/model-training-lite/references/zk_sft_defaults.md @@ -60,16 +60,22 @@ ai-planning/data/train_set/*/*.jsonl ## 默认 Jupyter 配置 -本地默认配置文件: +组内共享默认配置文件: + +```text +skills/model-training-lite/jupyter_defaults.json +``` + +个人覆盖配置文件: ```text skills/model-training-lite/.local/jupyter_defaults.json ``` -`.local/` 不提交。配置优先级: +配置优先级: ```text -脚本输入 > 环境变量 > .local/jupyter_defaults.json +脚本输入 > 环境变量 > .local/jupyter_defaults.json > jupyter_defaults.json ``` 脚本输出只显示认证是否已配置,不回显密码、token 或 cookie。 diff --git a/skills/model-training-lite/scripts/render_sft_submission_plan.py b/skills/model-training-lite/scripts/render_sft_submission_plan.py index e15f851..f6fa129 100755 --- a/skills/model-training-lite/scripts/render_sft_submission_plan.py +++ b/skills/model-training-lite/scripts/render_sft_submission_plan.py @@ -138,6 +138,17 @@ def clean(value: Any) -> str: def load_local_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 = { "jupyter_url": os.environ.get("MODEL_TRAINING_LITE_JUPYTER_URL"), "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"), } 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(): try: file_defaults = json.loads(config_path.read_text(encoding="utf-8")) if isinstance(file_defaults, dict): 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: raise SystemExit(f"invalid local defaults JSON: {config_path}: {exc}") from exc 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")): return "input" if any(clean(defaults.get(key)) for key in ("password", "token", "cookie")): - return "local_default" + return clean(defaults.get("_auth_source")) or "default" return ""