Files

1 line
25 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}