This project uses pydantic-settings for configuration management, providing automatic validation and type checking.
common/
├── global_config.yaml # Base configuration values (checked into git)
├── config_models.py # Pydantic models defining config structure
├── global_config.py # Config class and singleton instance
└── production_config.yaml # Production overrides (saas branch only)
.env # Environment variables/secrets (git-ignored)
.global_config.yaml # Local YAML overrides (git-ignored)
from common import global_config
# Access nested YAML config values
global_config.example_parent.example_child
global_config.llm_config.retry.max_attempts
# Access environment variables from .env
global_config.OPENAI_API_KEY
global_config.DEV_ENVThe config system merges values from multiple sources. Higher priority sources override lower ones:
- Environment variables (highest priority)
.envfile (or.prod.envwhenDEV_ENV=prod)- YAML files (merged in order):
.global_config.yaml(local overrides, git-ignored)production_config.yaml(whenDEV_ENV=prod)global_config.yaml(base config)
Add your values to common/global_config.yaml:
my_feature:
enabled: true
threshold: 0.5Define the structure in common/config_models.py:
class MyFeatureConfig(BaseModel):
enabled: bool
threshold: floatAdd the field to common/global_config.py:
from .config_models import MyFeatureConfig
class Config(BaseSettings):
# ... existing fields ...
my_feature: MyFeatureConfigfrom common import global_config
if global_config.my_feature.enabled:
do_something(global_config.my_feature.threshold)MY_API_KEY=sk-...Add the field to common/global_config.py:
class Config(BaseSettings):
# ... existing fields ...
MY_API_KEY: strTo override config values locally without modifying tracked files, create .global_config.yaml in the project root:
# .global_config.yaml (git-ignored)
llm_config:
cache_enabled: true
logging:
verbose: falseWhen DEV_ENV=prod is set:
.prod.envis loaded instead of.envproduction_config.yamlvalues overrideglobal_config.yaml
Pydantic automatically validates all config values at startup. If a required field is missing or has the wrong type, you'll get a clear error:
pydantic_core._pydantic_core.ValidationError: 1 validation error for Config
OPENAI_API_KEY
Field required [type=missing, input_value={...}, input_type=dict]