A drop-in replacement for tyro.cli with TOML/YAML/JSON config file support.
# Instead of:
from tyro import cli
# Use:
from pydantic_config import cliBuilt on top of tyro for type-safe CLI parsing and Pydantic for validation.
pip install git+https://github.com/samsja/pydantic_configFor TOML support (recommended):
pip install "pydantic_config[toml] @ git+https://github.com/samsja/pydantic_config"from pydantic_config import cli, BaseConfig
class TrainConfig(BaseConfig):
lr: float = 1e-4
batch_size: int = 32
class ModelConfig(BaseConfig):
hidden_size: int = 256
num_layers: int = 4
class Config(BaseConfig):
train: TrainConfig = TrainConfig()
model: ModelConfig = ModelConfig()
hello: int
if __name__ == "__main__":
config = cli(Config)python train.py --helppython train.pypython train.py --train @ train_config.tomlpython train.py @ nonexistent.tomlLoad config from TOML/YAML/JSON files using the @ syntax:
# Load config file
python train.py @ config.toml
# Override values from CLI
python train.py @ config.toml --train.lr 0.001
# Load nested configs from separate files
python train.py --model @ model.toml --train @ train.tomlExample config.toml:
[train]
lr = 0.0003
batch_size = 64
[model]
hidden_size = 512CLI arguments always override config file values.
uv sync --extra all
uv run pytest