41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
import argbind
|
|
import yaml
|
|
from pathlib import Path
|
|
from typing import Dict, Any
|
|
|
|
|
|
def load_yaml_config(path: str | Path) -> Dict[str, Any]:
|
|
"""
|
|
Load a YAML configuration file into a dictionary suitable for argbind.
|
|
"""
|
|
path = Path(path)
|
|
with path.open("r", encoding="utf-8") as f:
|
|
data = yaml.safe_load(f)
|
|
if not isinstance(data, dict):
|
|
raise ValueError(f"Configuration file {path} must contain a top-level mapping.")
|
|
return data
|
|
|
|
|
|
def parse_args_with_config(config_path: str | Path | None = None):
|
|
"""
|
|
Helper to unify CLI arguments and YAML configuration.
|
|
|
|
Usage mirrors minicpm-audio:
|
|
args = parse_args_with_config("conf/voxcpm/finetune.yml")
|
|
with argbind.scope(args):
|
|
...
|
|
"""
|
|
cli_args = argbind.parse_args()
|
|
if config_path is None:
|
|
return cli_args
|
|
|
|
yaml_args = load_yaml_config(config_path)
|
|
with argbind.scope(cli_args):
|
|
yaml_args = argbind.parse_args(yaml_args=yaml_args, argv=[])
|
|
cli_args.update(yaml_args)
|
|
return cli_args
|
|
|
|
|