{"repo": "ajirohack/catalyst", "files": {"backend/.env.template": {"800be8664fb93885ea5515143dfbb03973c18e08": {"t": 1785746745.7273316, "n": 1346, "h": "2300cf292d1afcb1", "c": "# AI Provider Configuration Template\n# Generated by Catalyst Configuration Validator\n\n# OpenAI Configuration\nOPENAI_API_KEY=your-api-key-here\nOPENAI_MODEL=gpt-4-turbo-preview\n# OPENAI_BASE_URL=https://api.openai.com/v1\n\n# Anthropic Configuration\nANTHROPIC_API_KEY=your-api-key-here\nANTHROPIC_MODEL=claude-3-sonnet-20240229\n# ANTHROPIC_BASE_URL=https://api.anthropic.com\n\n# Mistral Configuration\nMISTRAL_API_KEY=your-api-key-here\nMISTRAL_MODEL=mistral-medium-latest\n# MISTRAL_BASE_URL=https://api.mistral.ai/v1\n\n# Groq Configuration\nGROQ_API_KEY=your-api-key-here\nGROQ_MODEL=mixtral-8x7b-32768\n# GROQ_BASE_URL=https://api.groq.com/openai/v1\n\n# HuggingFace Configuration\nHUGGINGFACE_API_KEY=your-api-key-here\nHUGGINGFACE_MODEL=google/gemma-7b-it\n# HUGGINGFACE_BASE_URL=https://api-inference.huggingface.co\n\n# Google Gemini Configuration\nGOOGLE_AI_API_KEY=your-api-key-here\nGOOGLE_AI_MODEL=gemini-pro\n# GOOGLE_AI_BASE_URL=https://generativelanguage.googleapis.com/v1beta\n\n# OpenRouter Configuration\nOPENROUTER_API_KEY=your-api-key-here\nOPENROUTER_MODEL=openai/gpt-3.5-turbo\n# OPENROUTER_BASE_URL=https://openrouter.ai/api/v1\n\n# Deepseek Configuration\nDEEPSEEK_API_KEY=your-api-key-here\nDEEPSEEK_MODEL=deepseek-chat\n# DEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# Ollama Configuration\nOLLAMA_MODEL=llama2\n# OLLAMA_BASE_URL=http://localhost:11434\n\n"}, "4883a30a02bc6859594347ffa3f01858b97c0eb5": {"t": 1785767446.825755, "n": 1346, "h": "2300cf292d1afcb1", "c": "# AI Provider Configuration Template\n# Generated by Catalyst Configuration Validator\n\n# OpenAI Configuration\nOPENAI_API_KEY=your-api-key-here\nOPENAI_MODEL=gpt-4-turbo-preview\n# OPENAI_BASE_URL=https://api.openai.com/v1\n\n# Anthropic Configuration\nANTHROPIC_API_KEY=your-api-key-here\nANTHROPIC_MODEL=claude-3-sonnet-20240229\n# ANTHROPIC_BASE_URL=https://api.anthropic.com\n\n# Mistral Configuration\nMISTRAL_API_KEY=your-api-key-here\nMISTRAL_MODEL=mistral-medium-latest\n# MISTRAL_BASE_URL=https://api.mistral.ai/v1\n\n# Groq Configuration\nGROQ_API_KEY=your-api-key-here\nGROQ_MODEL=mixtral-8x7b-32768\n# GROQ_BASE_URL=https://api.groq.com/openai/v1\n\n# HuggingFace Configuration\nHUGGINGFACE_API_KEY=your-api-key-here\nHUGGINGFACE_MODEL=google/gemma-7b-it\n# HUGGINGFACE_BASE_URL=https://api-inference.huggingface.co\n\n# Google Gemini Configuration\nGOOGLE_AI_API_KEY=your-api-key-here\nGOOGLE_AI_MODEL=gemini-pro\n# GOOGLE_AI_BASE_URL=https://generativelanguage.googleapis.com/v1beta\n\n# OpenRouter Configuration\nOPENROUTER_API_KEY=your-api-key-here\nOPENROUTER_MODEL=openai/gpt-3.5-turbo\n# OPENROUTER_BASE_URL=https://openrouter.ai/api/v1\n\n# Deepseek Configuration\nDEEPSEEK_API_KEY=your-api-key-here\nDEEPSEEK_MODEL=deepseek-chat\n# DEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# Ollama Configuration\nOLLAMA_MODEL=llama2\n# OLLAMA_BASE_URL=http://localhost:11434\n\n"}}, "backend/validate_provider_config.py": {"800be8664fb93885ea5515143dfbb03973c18e08": {"t": 1785746900.2900887, "n": 10582, "h": "a5bce0f59bbb6fa1", "c": "#!/usr/bin/env python3\n\"\"\"\nConfiguration Validation Script for Catalyst AI Providers\nValidates and aligns provider configurations with documentation\n\"\"\"\n\nimport os\nimport sys\nfrom typing import Dict, List, Optional, Tuple\n\ntry:\n from dotenv import load_dotenv\n # Load .env file from the current directory\n load_dotenv(dotenv_path='.env', override=True)\n print(\"āœ… Loaded .env file successfully\")\nexcept ImportError:\n print(\"Warning: python-dotenv not installed. Environment variables must be set manually.\")\nexcept Exception as e:\n print(f\"Warning: Could not load .env file: {e}\")\n\n\nclass ProviderConfigValidator:\n \"\"\"Validates AI provider configurations\"\"\"\n \n def __init__(self):\n self.required_configs = {\n \"OpenAI\": {\n \"api_key\": \"OPENAI_API_KEY\",\n \"model\": \"OPENAI_MODEL\",\n \"base_url\": \"OPENAI_BASE_URL\",\n \"recommended_model\": \"gpt-4-turbo-preview\",\n \"default_base_url\": \"https://api.openai.com/v1\"\n },\n \"Anthropic\": {\n \"api_key\": \"ANTHROPIC_API_KEY\", \n \"model\": \"ANTHROPIC_MODEL\",\n \"base_url\": \"ANTHROPIC_BASE_URL\",\n \"recommended_model\": \"claude-3-sonnet-20240229\",\n \"default_base_url\": \"https://api.anthropic.com\"\n },\n \"Mistral\": {\n \"api_key\": \"MISTRAL_API_KEY\",\n \"model\": \"MISTRAL_MODEL\", \n \"base_url\": \"MISTRAL_BASE_URL\",\n \"recommended_model\": \"mistral-medium-latest\",\n \"default_base_url\": \"https://api.mistral.ai/v1\"\n },\n \"Groq\": {\n \"api_key\": \"GROQ_API_KEY\",\n \"model\": \"GROQ_MODEL\",\n \"base_url\": \"GROQ_BASE_URL\", \n \"recommended_model\": \"mixtral-8x7b-32768\",\n \"default_base_url\": \"https://api.groq.com/openai/v1\"\n },\n \"HuggingFace\": {\n \"api_key\": \"HUGGINGFACE_API_KEY\",\n \"model\": \"HUGGINGFACE_MODEL\",\n \"base_url\": \"HUGGINGFACE_BASE_URL\",\n \"recommended_model\": \"google/gemma-7b-it\", \n \"default_base_url\": \"https://api-inference.huggingface.co\"\n },\n \"Google Gemini\": {\n \"api_key\": \"GOOGLE_AI_API_KEY\",\n \"model\": \"GOOGLE_AI_MODEL\",\n \"base_url\": \"GOOGLE_AI_BASE_URL\",\n \"recommended_model\": \"gemini-pro\",\n \"default_base_url\": \"https://generativelanguage.googleapis.com/v1beta\"\n },\n \"OpenRouter\": {\n \"api_key\": \"OPENROUTER_API_KEY\",\n \"model\": \"OPENROUTER_MODEL\",\n \"base_url\": \"OPENROUTER_BASE_URL\",\n \"recommended_model\": \"openai/gpt-3.5-turbo\",\n \"default_base_url\": \"https://openrouter.ai/api/v1\"\n },\n \"Deepseek\": {\n \"api_key\": \"DEEPSEEK_API_KEY\",\n \"model\": \"DEEPSEEK_MODEL\",\n \"base_url\": \"DEEPSEEK_BASE_URL\",\n \"recommended_model\": \"deepseek-chat\",\n \"default_base_url\": \"https://api.deepseek.com/v1\"\n },\n \"Ollama\": {\n \"api_key\": None, # Ollama doesn't need API key\n \"model\": \"OLLAMA_MODEL\", \n \"base_url\": \"OLLAMA_BASE_URL\",\n \"recommended_model\": \"llama2\",\n \"default_base_url\": \"http://localhost:11434\"\n }\n }\n \n self.issues = []\n self.suggestions = []\n \n def validate_all_providers(self) -> Tuple[List[str], List[str]]:\n \"\"\"Validate all provider configurations\"\"\"\n print(\"šŸ” Validating AI Provider Configurations...\\n\")\n \n for provider_name, config in self.required_configs.items():\n self._validate_provider(provider_name, config)\n \n return self.issues, self.suggestions\n \n def _validate_provider(self, provider_name: str, config: Dict[str, str]):\n \"\"\"Validate a single provider configuration\"\"\"\n print(f\"šŸ“‹ Checking {provider_name}...\")\n \n # Check API Key\n api_key_var = config.get(\"api_key\")\n if api_key_var:\n api_key = os.getenv(api_key_var)\n placeholder_patterns = ['your-api-key-here', 'your-mistral-api-key-here', 'test-key', 'sk-test-key', 'sk-ant-test-key']\n \n if not api_key or any(pattern in api_key for pattern in placeholder_patterns):\n self.issues.append(f\"āŒ {provider_name}: Missing {api_key_var}\")\n self.suggestions.append(f\" Set {api_key_var}=your-api-key-here\")\n else:\n print(f\" āœ… API Key: {api_key_var} is set\")\n else:\n print(f\" ā„¹ļø No API key required for {provider_name}\")\n \n # Check Model Configuration\n model_var = config.get(\"model\")\n if model_var:\n current_model = os.getenv(model_var)\n recommended_model = config.get(\"recommended_model\")\n \n if not current_model:\n self.suggestions.append(f\" šŸ’” {provider_name}: Set {model_var}={recommended_model}\")\n print(f\" āš ļø Model: {model_var} not set (will use default)\")\n elif current_model != recommended_model:\n self.suggestions.append(f\" šŸ’” {provider_name}: Consider updating {model_var}={recommended_model} (currently: {current_model})\")\n print(f\" āš ļø Model: {current_model} (recommended: {recommended_model})\")\n else:\n print(f\" āœ… Model: {current_model}\")\n \n # Check Base URL\n base_url_var = config.get(\"base_url\")\n if base_url_var:\n current_url = os.getenv(base_url_var)\n default_url = config.get(\"default_base_url\")\n \n if not current_url:\n print(f\" ā„¹ļø Base URL: Using default ({default_url})\")\n else:\n print(f\" āœ… Base URL: {current_url}\")\n \n print()\n \n def generate_env_template(self) -> str:\n \"\"\"Generate a .env template with all recommended configurations\"\"\"\n template = \"# AI Provider Configuration Template\\n\"\n template += \"# Generated by Catalyst Configuration Validator\\n\\n\"\n \n for provider_name, config in self.required_configs.items():\n template += f\"# {provider_name} Configuration\\n\"\n \n if config.get(\"api_key\"):\n template += f\"{config['api_key']}=your-api-key-here\\n\"\n \n if config.get(\"model\"):\n template += f\"{config['model']}={config['recommended_model']}\\n\"\n \n if config.get(\"base_url\"):\n template += f\"# {config['base_url']}={config['default_base_url']}\\n\"\n \n template += \"\\n\"\n \n return template\n \n def create_migration_guide(self) -> str:\n \"\"\"Create a migration guide for updating existing configurations\"\"\"\n guide = \"# Configuration Migration Guide\\n\\n\"\n guide += \"## Environment Variable Changes\\n\\n\"\n \n # Old vs New variable names\n migrations = {\n \"OPENAI_DEFAULT_MODEL\": \"OPENAI_MODEL\",\n \"ANTHROPIC_DEFAULT_MODEL\": \"ANTHROPIC_MODEL\", \n \"MISTRAL_DEFAULT_MODEL\": \"MISTRAL_MODEL\",\n \"GROQ_DEFAULT_MODEL\": \"GROQ_MODEL\",\n \"HUGGINGFACE_DEFAULT_MODEL\": \"HUGGINGFACE_MODEL\",\n \"OLLAMA_DEFAULT_MODEL\": \"OLLAMA_MODEL\",\n \"GOOGLE_API_KEY\": \"GOOGLE_AI_API_KEY\",\n \"GOOGLE_MODEL\": \"GOOGLE_AI_MODEL\"\n }\n \n guide += \"### Variable Name Updates\\n\\n\"\n for old_var, new_var in migrations.items():\n old_value = os.getenv(old_var)\n if old_value:\n guide += f\"- `{old_var}` → `{new_var}` (current value: {old_value})\\n\"\n else:\n guide += f\"- `{old_var}` → `{new_var}`\\n\"\n \n guide += \"\\n### Recommended Model Updates\\n\\n\"\n model_updates = {\n \"OPENAI_MODEL\": (\"gpt-3.5-turbo\", \"gpt-4-turbo-preview\"),\n \"GROQ_MODEL\": (\"llama2-70b-4096\", \"mixtral-8x7b-32768\"),\n \"HUGGINGFACE_MODEL\": (\"microsoft/DialoGPT-large\", \"google/gemma-7b-it\"),\n \"OPENROUTER_MODEL\": (\"anthropic/claude-3-opus\", \"openai/gpt-3.5-turbo\")\n }\n \n for var, (old_model, new_model) in model_updates.items():\n current = os.getenv(var) or os.getenv(var.replace(\"_MODEL\", \"_DEFAULT_MODEL\"))\n if current == old_model:\n guide += f\"- `{var}`: {old_model} → {new_model} āš ļø Update recommended\\n\"\n else:\n guide += f\"- `{var}`: {old_model} → {new_model}\\n\"\n \n return guide\n\n\ndef main():\n \"\"\"Main validation function\"\"\"\n print(\"šŸš€ Catalyst AI Provider Configuration Validator\\n\")\n \n validator = ProviderConfigValidator()\n issues, suggestions = validator.validate_all_providers()\n \n # Print Summary\n print(\"šŸ“Š Validation Summary:\")\n print(f\" Issues found: {len(issues)}\")\n print(f\" Suggestions: {len(suggestions)}\\n\")\n \n if issues:\n print(\"āŒ Issues that need attention:\")\n for issue in issues:\n print(issue)\n print()\n \n if suggestions:\n print(\"šŸ’” Suggestions for optimization:\")\n for suggestion in suggestions:\n print(suggestion)\n print()\n \n # Generate templates\n print(\"šŸ“ Generating configuration templates...\\n\")\n \n # Write .env template\n env_template = validator.generate_env_template()\n with open(\".env.template\", \"w\") as f:\n f.write(env_template)\n print(\"āœ… Generated .env.template\")\n \n # Write migration guide\n migration_guide = validator.create_migration_guide()\n with open(\"CONFIGURATION_MIGRATION.md\", \"w\") as f:\n f.write(migration_guide)\n print(\"āœ… Generated CONFIGURATION_MIGRATION.md\")\n \n # Final recommendations\n print(\"\\nšŸŽÆ Next Steps:\")\n print(\"1. Review and fix any issues listed above\")\n print(\"2. Check .env.template for complete configuration\")\n print(\"3. Review CONFIGURATION_MIGRATION.md for upgrade path\")\n print(\"4. Test provider connections after updates\")\n \n if issues:\n print(\"\\nāš ļø Some providers may not work until issues are resolved!\")\n sys.exit(1)\n else:\n print(\"\\nāœ… All provider configurations look good!\")\n sys.exit(0)\n\n\nif __name__ == \"__main__\":\n main()\n"}, "4883a30a02bc6859594347ffa3f01858b97c0eb5": {"t": 1785767447.5091116, "n": 10582, "h": "a5bce0f59bbb6fa1", "c": "#!/usr/bin/env python3\n\"\"\"\nConfiguration Validation Script for Catalyst AI Providers\nValidates and aligns provider configurations with documentation\n\"\"\"\n\nimport os\nimport sys\nfrom typing import Dict, List, Optional, Tuple\n\ntry:\n from dotenv import load_dotenv\n # Load .env file from the current directory\n load_dotenv(dotenv_path='.env', override=True)\n print(\"āœ… Loaded .env file successfully\")\nexcept ImportError:\n print(\"Warning: python-dotenv not installed. Environment variables must be set manually.\")\nexcept Exception as e:\n print(f\"Warning: Could not load .env file: {e}\")\n\n\nclass ProviderConfigValidator:\n \"\"\"Validates AI provider configurations\"\"\"\n \n def __init__(self):\n self.required_configs = {\n \"OpenAI\": {\n \"api_key\": \"OPENAI_API_KEY\",\n \"model\": \"OPENAI_MODEL\",\n \"base_url\": \"OPENAI_BASE_URL\",\n \"recommended_model\": \"gpt-4-turbo-preview\",\n \"default_base_url\": \"https://api.openai.com/v1\"\n },\n \"Anthropic\": {\n \"api_key\": \"ANTHROPIC_API_KEY\", \n \"model\": \"ANTHROPIC_MODEL\",\n \"base_url\": \"ANTHROPIC_BASE_URL\",\n \"recommended_model\": \"claude-3-sonnet-20240229\",\n \"default_base_url\": \"https://api.anthropic.com\"\n },\n \"Mistral\": {\n \"api_key\": \"MISTRAL_API_KEY\",\n \"model\": \"MISTRAL_MODEL\", \n \"base_url\": \"MISTRAL_BASE_URL\",\n \"recommended_model\": \"mistral-medium-latest\",\n \"default_base_url\": \"https://api.mistral.ai/v1\"\n },\n \"Groq\": {\n \"api_key\": \"GROQ_API_KEY\",\n \"model\": \"GROQ_MODEL\",\n \"base_url\": \"GROQ_BASE_URL\", \n \"recommended_model\": \"mixtral-8x7b-32768\",\n \"default_base_url\": \"https://api.groq.com/openai/v1\"\n },\n \"HuggingFace\": {\n \"api_key\": \"HUGGINGFACE_API_KEY\",\n \"model\": \"HUGGINGFACE_MODEL\",\n \"base_url\": \"HUGGINGFACE_BASE_URL\",\n \"recommended_model\": \"google/gemma-7b-it\", \n \"default_base_url\": \"https://api-inference.huggingface.co\"\n },\n \"Google Gemini\": {\n \"api_key\": \"GOOGLE_AI_API_KEY\",\n \"model\": \"GOOGLE_AI_MODEL\",\n \"base_url\": \"GOOGLE_AI_BASE_URL\",\n \"recommended_model\": \"gemini-pro\",\n \"default_base_url\": \"https://generativelanguage.googleapis.com/v1beta\"\n },\n \"OpenRouter\": {\n \"api_key\": \"OPENROUTER_API_KEY\",\n \"model\": \"OPENROUTER_MODEL\",\n \"base_url\": \"OPENROUTER_BASE_URL\",\n \"recommended_model\": \"openai/gpt-3.5-turbo\",\n \"default_base_url\": \"https://openrouter.ai/api/v1\"\n },\n \"Deepseek\": {\n \"api_key\": \"DEEPSEEK_API_KEY\",\n \"model\": \"DEEPSEEK_MODEL\",\n \"base_url\": \"DEEPSEEK_BASE_URL\",\n \"recommended_model\": \"deepseek-chat\",\n \"default_base_url\": \"https://api.deepseek.com/v1\"\n },\n \"Ollama\": {\n \"api_key\": None, # Ollama doesn't need API key\n \"model\": \"OLLAMA_MODEL\", \n \"base_url\": \"OLLAMA_BASE_URL\",\n \"recommended_model\": \"llama2\",\n \"default_base_url\": \"http://localhost:11434\"\n }\n }\n \n self.issues = []\n self.suggestions = []\n \n def validate_all_providers(self) -> Tuple[List[str], List[str]]:\n \"\"\"Validate all provider configurations\"\"\"\n print(\"šŸ” Validating AI Provider Configurations...\\n\")\n \n for provider_name, config in self.required_configs.items():\n self._validate_provider(provider_name, config)\n \n return self.issues, self.suggestions\n \n def _validate_provider(self, provider_name: str, config: Dict[str, str]):\n \"\"\"Validate a single provider configuration\"\"\"\n print(f\"šŸ“‹ Checking {provider_name}...\")\n \n # Check API Key\n api_key_var = config.get(\"api_key\")\n if api_key_var:\n api_key = os.getenv(api_key_var)\n placeholder_patterns = ['your-api-key-here', 'your-mistral-api-key-here', 'test-key', 'sk-test-key', 'sk-ant-test-key']\n \n if not api_key or any(pattern in api_key for pattern in placeholder_patterns):\n self.issues.append(f\"āŒ {provider_name}: Missing {api_key_var}\")\n self.suggestions.append(f\" Set {api_key_var}=your-api-key-here\")\n else:\n print(f\" āœ… API Key: {api_key_var} is set\")\n else:\n print(f\" ā„¹ļø No API key required for {provider_name}\")\n \n # Check Model Configuration\n model_var = config.get(\"model\")\n if model_var:\n current_model = os.getenv(model_var)\n recommended_model = config.get(\"recommended_model\")\n \n if not current_model:\n self.suggestions.append(f\" šŸ’” {provider_name}: Set {model_var}={recommended_model}\")\n print(f\" āš ļø Model: {model_var} not set (will use default)\")\n elif current_model != recommended_model:\n self.suggestions.append(f\" šŸ’” {provider_name}: Consider updating {model_var}={recommended_model} (currently: {current_model})\")\n print(f\" āš ļø Model: {current_model} (recommended: {recommended_model})\")\n else:\n print(f\" āœ… Model: {current_model}\")\n \n # Check Base URL\n base_url_var = config.get(\"base_url\")\n if base_url_var:\n current_url = os.getenv(base_url_var)\n default_url = config.get(\"default_base_url\")\n \n if not current_url:\n print(f\" ā„¹ļø Base URL: Using default ({default_url})\")\n else:\n print(f\" āœ… Base URL: {current_url}\")\n \n print()\n \n def generate_env_template(self) -> str:\n \"\"\"Generate a .env template with all recommended configurations\"\"\"\n template = \"# AI Provider Configuration Template\\n\"\n template += \"# Generated by Catalyst Configuration Validator\\n\\n\"\n \n for provider_name, config in self.required_configs.items():\n template += f\"# {provider_name} Configuration\\n\"\n \n if config.get(\"api_key\"):\n template += f\"{config['api_key']}=your-api-key-here\\n\"\n \n if config.get(\"model\"):\n template += f\"{config['model']}={config['recommended_model']}\\n\"\n \n if config.get(\"base_url\"):\n template += f\"# {config['base_url']}={config['default_base_url']}\\n\"\n \n template += \"\\n\"\n \n return template\n \n def create_migration_guide(self) -> str:\n \"\"\"Create a migration guide for updating existing configurations\"\"\"\n guide = \"# Configuration Migration Guide\\n\\n\"\n guide += \"## Environment Variable Changes\\n\\n\"\n \n # Old vs New variable names\n migrations = {\n \"OPENAI_DEFAULT_MODEL\": \"OPENAI_MODEL\",\n \"ANTHROPIC_DEFAULT_MODEL\": \"ANTHROPIC_MODEL\", \n \"MISTRAL_DEFAULT_MODEL\": \"MISTRAL_MODEL\",\n \"GROQ_DEFAULT_MODEL\": \"GROQ_MODEL\",\n \"HUGGINGFACE_DEFAULT_MODEL\": \"HUGGINGFACE_MODEL\",\n \"OLLAMA_DEFAULT_MODEL\": \"OLLAMA_MODEL\",\n \"GOOGLE_API_KEY\": \"GOOGLE_AI_API_KEY\",\n \"GOOGLE_MODEL\": \"GOOGLE_AI_MODEL\"\n }\n \n guide += \"### Variable Name Updates\\n\\n\"\n for old_var, new_var in migrations.items():\n old_value = os.getenv(old_var)\n if old_value:\n guide += f\"- `{old_var}` → `{new_var}` (current value: {old_value})\\n\"\n else:\n guide += f\"- `{old_var}` → `{new_var}`\\n\"\n \n guide += \"\\n### Recommended Model Updates\\n\\n\"\n model_updates = {\n \"OPENAI_MODEL\": (\"gpt-3.5-turbo\", \"gpt-4-turbo-preview\"),\n \"GROQ_MODEL\": (\"llama2-70b-4096\", \"mixtral-8x7b-32768\"),\n \"HUGGINGFACE_MODEL\": (\"microsoft/DialoGPT-large\", \"google/gemma-7b-it\"),\n \"OPENROUTER_MODEL\": (\"anthropic/claude-3-opus\", \"openai/gpt-3.5-turbo\")\n }\n \n for var, (old_model, new_model) in model_updates.items():\n current = os.getenv(var) or os.getenv(var.replace(\"_MODEL\", \"_DEFAULT_MODEL\"))\n if current == old_model:\n guide += f\"- `{var}`: {old_model} → {new_model} āš ļø Update recommended\\n\"\n else:\n guide += f\"- `{var}`: {old_model} → {new_model}\\n\"\n \n return guide\n\n\ndef main():\n \"\"\"Main validation function\"\"\"\n print(\"šŸš€ Catalyst AI Provider Configuration Validator\\n\")\n \n validator = ProviderConfigValidator()\n issues, suggestions = validator.validate_all_providers()\n \n # Print Summary\n print(\"šŸ“Š Validation Summary:\")\n print(f\" Issues found: {len(issues)}\")\n print(f\" Suggestions: {len(suggestions)}\\n\")\n \n if issues:\n print(\"āŒ Issues that need attention:\")\n for issue in issues:\n print(issue)\n print()\n \n if suggestions:\n print(\"šŸ’” Suggestions for optimization:\")\n for suggestion in suggestions:\n print(suggestion)\n print()\n \n # Generate templates\n print(\"šŸ“ Generating configuration templates...\\n\")\n \n # Write .env template\n env_template = validator.generate_env_template()\n with open(\".env.template\", \"w\") as f:\n f.write(env_template)\n print(\"āœ… Generated .env.template\")\n \n # Write migration guide\n migration_guide = validator.create_migration_guide()\n with open(\"CONFIGURATION_MIGRATION.md\", \"w\") as f:\n f.write(migration_guide)\n print(\"āœ… Generated CONFIGURATION_MIGRATION.md\")\n \n # Final recommendations\n print(\"\\nšŸŽÆ Next Steps:\")\n print(\"1. Review and fix any issues listed above\")\n print(\"2. Check .env.template for complete configuration\")\n print(\"3. Review CONFIGURATION_MIGRATION.md for upgrade path\")\n print(\"4. Test provider connections after updates\")\n \n if issues:\n print(\"\\nāš ļø Some providers may not work until issues are resolved!\")\n sys.exit(1)\n else:\n print(\"\\nāœ… All provider configurations look good!\")\n sys.exit(0)\n\n\nif __name__ == \"__main__\":\n main()\n"}}}}