@classmethod
def load(cls, config_path: Optional[str] = None) -> 'GlobalConfig':
"""Load configuration from file and CLI arguments."""
config = configparser.ConfigParser()
# Load default config file if exists
default_config = os.path.expanduser("~/.config/azad/config.ini")
if os.path.exists(default_config):
config.read(default_config)
# Load specified config file if provided
if config_path and os.path.exists(config_path):
config.read(config_path)
# Create instance with defaults from class
instance = cls(_config=config)
# Override with config file values if present
instance.interface = cls.get_value(config, "daemon", "interface", instance.interface)
instance.port = int(cls.get_value(config, "daemon", "port", str(instance.port)))
# Handle protocol with validation
protocol_str = cls.get_value(config, "daemon", "protocol", instance.protocol.value)
if protocol_str:
try:
instance.protocol = NetworkProtocol(protocol_str.lower())
except ValueError:
pass # Keep default if invalid
# Override logging settings
instance.log_level = cls.get_value(config, "logging", "level", instance.log_level)
instance.log_directory = cls.get_value(config, "logging", "directory", instance.log_directory)
# Handle API key with precedence rules
instance.default_model_api_key = (
os.environ.get('ANTHROPIC_API_KEY') or
cls.get_value(config, "AI", "api_key", "") or
cls.get_value(config, "defaults", "model_api_key", instance.default_model_api_key)
)
# Override other defaults
instance.default_model_endpoint_url = cls.get_value(config, "defaults", "model_endpoint_url", instance.default_model_endpoint_url)
instance.default_model_name = cls.get_value(config, "defaults", "model_name", instance.default_model_name)
instance.default_dialect_name = cls.get_value(config, "defaults", "dialect_name", instance.default_dialect_name)
# Handle dialect options
instance.default_dialect_options = cls._get_dialect_options(
config,
instance.default_dialect_name,
cls.get_value(config, "defaults", "dialect_options", str(instance.default_dialect_options))
)
return instance