Add shared Jupyter defaults for model training lite
This commit is contained in:
@@ -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 ""
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user