from dataclasses import dataclass from dotenv import load_dotenv from pathlib import Path from typing import Dict import argparse import os import tomllib @dataclass class Config: def __init__(self): load_dotenv() parser = argparse.ArgumentParser(description='SIA - Self Improving Agent') # Core configuration parser.add_argument( '--system-prompt', type=Path, default=os.getenv('SIA_SYSTEM_PROMPT', '/root/sia/system_prompt.md'), help='Path to the system prompt file (default: /root/sia/system_prompt.md, env: SIA_SYSTEM_PROMPT)' ) parser.add_argument( '--action-schema', type=Path, default=os.getenv('SIA_ACTION_SCHEMA', '/root/sia/action_schema.xsd'), help='Path to the action schema file (default: /root/sia/action_schema.xsd, env: SIA_ACTION_SCHEMA)' ) parser.add_argument( '--iterations-dir', type=Path, default=os.getenv('SIA_ITERATIONS_DIR', '/root/data/iterations'), help='Path to the directory for storing iterations (default: /root/data/iterations, env: SIA_ITERATIONS_DIR)' ) parser.add_argument( '--work-dir', type=Path, default=os.getenv('SIA_WORK_DIR', '/root/desktop'), help='Path to the working directory (default: /root/desktop, env: SIA_WORK_DIR)' ) # Web server configuration parser.add_argument( '--server', action='store_true', default=self._parse_bool_env('SIA_SERVER_ENABLED', False), help='Enable web server for debugging and human feedback (env: SIA_SERVER_ENABLED)' ) parser.add_argument( '--host', type=str, default=os.getenv('SIA_SERVER_HOST', '0.0.0.0'), help='Web server host (default: 0.0.0.0, env: SIA_SERVER_HOST)' ) parser.add_argument( '--port', type=int, default=int(os.getenv('SIA_SERVER_PORT', '8080')), help='Web server port (default: 8080, env: SIA_SERVER_PORT)' ) parser.add_argument( '--static-files', type=Path, default=os.getenv('SIA_STATIC_FILES', '/root/static/'), help='Path to static web files (default: /root/static/, env: SIA_STATIC_FILES)' ) # LLM configuration parser.add_argument( '--llm-config', type=Path, default=os.getenv('SIA_LLM_CONFIG', '/root/sia/llm_config.toml'), help='Path to TOML configuration file for LLMs (default: /root/sia/llm_config.toml, env: SIA_LLM_CONFIG)' ) self.args = parser.parse_args() with open(self.llm_config, "rb") as f: self._llm_configs = tomllib.load(f) def _parse_bool_env(self, env_var: str, default: bool) -> bool: val = os.getenv(env_var) if val is None: return default return val.lower() in ('true', '1', 'yes', 'on') # Core properties @property def system_prompt(self) -> Path: return self.args.system_prompt @property def action_schema(self) -> Path: return self.args.action_schema @property def iterations_dir(self) -> Path: return self.args.iterations_dir @property def work_dir(self) -> Path: return self.args.work_dir # Server properties @property def server(self) -> bool: return self.args.server @property def host(self) -> str: return self.args.host @property def port(self) -> int: return self.args.port @property def static_files(self) -> Path: return self.args.static_files # LLM properties @property def llm_config(self) -> Path: return self.args.llm_config @property def llms(self) -> Dict[str, str]: """Get only the enabled LLM configurations.""" return self._llm_configs