Skip to content

azad.config Module

azad.config

Classes

NetworkProtocol

Bases: Enum

Network protocol options for CNC connections.

GlobalConfig

Bases: BaseModel

Global configuration for the system.

Attributes
interface class-attribute instance-attribute
interface: str = Field(default='')
port class-attribute instance-attribute
port: int = Field(default=8765)
log_level class-attribute instance-attribute
log_level: str = Field(default='INFO')
log_directory class-attribute instance-attribute
log_directory: str = Field(default='~/.local/share/azad/logs')
default_model_endpoint_url class-attribute instance-attribute
default_model_endpoint_url: str = Field(default='')
default_model_api_key class-attribute instance-attribute
default_model_api_key: str = Field(default='')
default_model_name class-attribute instance-attribute
default_model_name: str = Field(default='claude-3-5-sonnet-latest')
default_dialect_name class-attribute instance-attribute
default_dialect_name: str = Field(default='xml')
default_dialect_options class-attribute instance-attribute
default_dialect_options: Dict[str, Any] = Field(default_factory=lambda: {'use_cdata': True})
model_config class-attribute instance-attribute
model_config = ConfigDict(arbitrary_types_allowed=True)
Functions
load classmethod
load(config_path: Optional[str] = None) -> GlobalConfig

Load configuration from file and CLI arguments.

Source code in azad/config.py
@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
get_value staticmethod
get_value(config: ConfigParser, section: str, key: str, default: str) -> str

Get a value from config with CLI override support.

Source code in azad/config.py
@staticmethod
def get_value(config: configparser.ConfigParser, section: str, key: str, default: str) -> str:
    """Get a value from config with CLI override support."""
    if not config.has_section(section):
        return default
    return config.get(section, key, fallback=default)
create_task_config
create_task_config(**overrides) -> TaskConfig

Create a task-specific configuration.

Source code in azad/config.py
def create_task_config(self, **overrides) -> TaskConfig:
    """Create a task-specific configuration."""
    task_config = TaskConfig(
        model_api_key=overrides.get('model_api_key', self.default_model_api_key),
        cache_dialect=overrides.get('cache_dialect', None),
        dynamic_environment_details_block=overrides.get('dynamic_environment_details_block', None),
        template_keys=overrides.get('template_keys', None),
        auto_approve=overrides.get('auto_approve', False),
        enable_explicit_caching=overrides.get('enable_explicit_caching', False),
    )
    return task_config
add_cli_arguments staticmethod
add_cli_arguments(parser: ArgumentParser) -> None

Add CLI arguments to the parser.

Source code in azad/config.py
@staticmethod
def add_cli_arguments(parser: argparse.ArgumentParser) -> None:
    """Add CLI arguments to the parser."""
    parser.add_argument(
        '--config',
        help='Path to config file',
        default=None
    )
    parser.add_argument(
        '--interface',
        help='Interface to listen on',
        default=""
    )
    parser.add_argument(
        '--port',
        help='Port to listen on (default: 8765)',
        type=int,
        default=8765
    )
    parser.add_argument(
        '--api-key',
        help='API key (can also be set via ANTHROPIC_API_KEY env var)',
        default=None
    )
set_cli_args
set_cli_args(args: Namespace) -> None

Set CLI arguments for config override.

Source code in azad/config.py
def set_cli_args(self, args: argparse.Namespace) -> None:
    """Set CLI arguments for config override."""
    self._cli_args = args
    if args.interface:
        self.interface = args.interface
    if args.port:
        self.port = args.port
    if args.api_key:
        self.default_model_api_key = args.api_key