The SALF project adopts a dual-layer configuration system that balances flexibility and ease of use:
- Python Configuration Layer (
config/settings.py) - Provides defaults, suitable for quick development - Environment Variable Layer (
config.sh) - Overrides defaults, suitable for batch processing
- During development, want to run quickly without setting environment variables every time
- In production, want centralized configuration management to avoid hardcoding
Two configuration layers, each serving its purpose:
Development Scenario: Python script → Directly uses config/settings.py defaults
Production Scenario: Bash script → Loads config.sh → Overrides defaults
| Scenario | Recommended Method | Reason |
|---|---|---|
| Quick test of single script | Python config | No need to set environment variables |
| Batch processing large data | Bash config | Centralized management, bash scripts auto-load |
| Development debugging | Python config | Easy to modify, takes effect immediately |
| Production environment | Bash config | Unified configuration, easy to maintain |
| Temporarily use different model | Command-line args | Flexible override |
# Don't set any environment variables
python run_generation.py --input_file data/sample.json --output_file results/gen.json
# Uses defaults from config/settings.py:
# - DEFAULT_LLM_MODEL = "gpt-4o-mini-2024-07-18"
# - MAX_ITERATIONS = 3# Load config.sh
source config.sh
# Run script
python run_generation.py --input_file data/sample.json --output_file results/gen.json
# Uses environment variables from config.sh (overrides Python defaults):
# - DEFAULT_LLM_MODEL = environment variable value
# - MAX_ITERATIONS = environment variable value# Temporarily use different model
python run_generation.py \
--input_file data/sample.json \
--output_file results/gen.json \
--llm_model deepseek-chat \
--max_iterations 5
# Command-line arguments have highest priority, override all configurations- Modify
config/settings.pyto set your API key - Run Python scripts directly for testing
- Rapid iteration development
# Edit configuration
vim config/settings.py
# Run directly
python run_generation.py --input_file data/sample.json --output_file results/gen.json --max_samples 1- Create
config.sh(or copy template) - Set production environment configuration
- Use bash scripts for batch processing
# Edit production configuration
vim config.sh
# Run batch processing
bash scripts/run_full_pipeline.shCreate different configuration files:
# Test environment
cp config.sh config_test.sh
vim config_test.sh # Set test API key and parameters
# Production environment
cp config.sh config_prod.sh
vim config_prod.sh # Set production API key and parameters
# Use different environments
source config_test.sh && bash scripts/run_test.sh
source config_prod.sh && bash scripts/run_full_pipeline.shA: To accommodate different use cases:
config/settings.py: Python defaults, suitable for quick developmentconfig.sh: Environment variable configuration, suitable for batch processing
A:
- If only occasionally running Python scripts → Modify
config/settings.py - If batch processing or using bash scripts → Use
config.sh
A: No. Environment variables (config.sh) have higher priority and will override Python defaults.
A: Yes, but you'll lose flexibility:
- Only Python config → Bash scripts need to manually set environment variables
- Only Bash config → Python scripts need to source config.sh every time
Advantages of the dual-layer configuration system:
✅ Flexibility: Three-tier priority, adapts to different scenarios ✅ Ease of Use: No need to set environment variables during development ✅ Maintainability: Centralized configuration management in production ✅ Backward Compatibility: Doesn't break existing usage patterns
This design allows you to:
- Run directly during quick development
- Unified configuration for batch processing
- Flexible override for temporary adjustments