""" Configuration management for DeepDrone terminal application. """ import os import json from pathlib import Path from typing import Dict, Optional, List from pydantic import BaseModel, Field from pydantic_settings import BaseSettings class ModelConfig(BaseModel): """Configuration for a specific model.""" name: str provider: str # 'openai', 'anthropic', 'ollama', 'huggingface', etc. api_key: Optional[str] = None base_url: Optional[str] = None model_id: str max_tokens: int = 2048 temperature: float = 0.7 class DroneConfig(BaseModel): """Configuration for drone connection.""" default_connection_string: str = "udp:127.0.0.1:14550" timeout: int = 30 default_altitude: float = 30.0 max_altitude: float = 100.0 class AppSettings(BaseSettings): """Main application settings.""" # File paths config_dir: Path = Field(default_factory=lambda: Path.home() / ".deepdrone") models_file: Path = Field(default_factory=lambda: Path.home() / ".deepdrone" / "models.json") # Default model default_model: str = "gpt-3.5-turbo" # Drone settings drone: DroneConfig = Field(default_factory=DroneConfig) # Terminal settings show_thinking: bool = True auto_save_chat: bool = True chat_history_limit: int = 100 class Config: env_prefix = "DEEPDRONE_" env_file = ".env" extra = "ignore" # Ignore extra environment variables class ConfigManager: """Manages application configuration and model settings.""" def __init__(self): self.settings = AppSettings() self.models: Dict[str, ModelConfig] = {} self._ensure_config_dir() self._load_models() def _ensure_config_dir(self): """Ensure configuration directory exists.""" self.settings.config_dir.mkdir(exist_ok=True) def _load_models(self): """Load model configurations from file.""" if self.settings.models_file.exists(): try: with open(self.settings.models_file, 'r') as f: models_data = json.load(f) self.models = { name: ModelConfig(**config) for name, config in models_data.items() } except Exception as e: print(f"Error loading models config: {e}") self.models = {} else: # Create default models self._create_default_models() def _create_default_models(self): """Create default model configurations.""" self.models = { "gpt-3.5-turbo": ModelConfig( name="gpt-3.5-turbo", provider="openai", model_id="gpt-3.5-turbo", max_tokens=2048, temperature=0.7 ), "gpt-4": ModelConfig( name="gpt-4", provider="openai", model_id="gpt-4", max_tokens=2048, temperature=0.7 ), "claude-3-sonnet": ModelConfig( name="claude-3-sonnet", provider="anthropic", model_id="claude-3-sonnet-20240229", max_tokens=2048, temperature=0.7 ), "llama3.1": ModelConfig( name="llama3.1", provider="ollama", model_id="llama3.1:latest", base_url="http://localhost:11434", max_tokens=2048, temperature=0.7 ), "codestral": ModelConfig( name="codestral", provider="ollama", model_id="codestral:latest", base_url="http://localhost:11434", max_tokens=2048, temperature=0.7 ) } self.save_models() def save_models(self): """Save model configurations to file.""" try: models_data = { name: config.model_dump() for name, config in self.models.items() } with open(self.settings.models_file, 'w') as f: json.dump(models_data, f, indent=2) except Exception as e: print(f"Error saving models config: {e}") def add_model(self, config: ModelConfig): """Add a new model configuration.""" self.models[config.name] = config self.save_models() def remove_model(self, name: str) -> bool: """Remove a model configuration.""" if name in self.models: del self.models[name] self.save_models() return True return False def get_model(self, name: str) -> Optional[ModelConfig]: """Get a model configuration by name.""" return self.models.get(name) def list_models(self) -> List[str]: """List all available model names.""" return list(self.models.keys()) def set_api_key(self, model_name: str, api_key: str) -> bool: """Set API key for a model.""" if model_name in self.models: self.models[model_name].api_key = api_key self.save_models() return True return False def get_ollama_models(self) -> List[str]: """Get list of available Ollama models.""" ollama_models = [] for name, config in self.models.items(): if config.provider == "ollama": ollama_models.append(name) return ollama_models def get_api_models(self) -> List[str]: """Get list of models that require API keys.""" api_models = [] for name, config in self.models.items(): if config.provider in ["openai", "anthropic", "huggingface"]: api_models.append(name) return api_models # Global config manager instance config_manager = ConfigManager()