diff --git a/lib/utils/api_key_manager/components/__init__.py b/lib/utils/api_key_manager/components/__init__.py index 858f76b6..15a369fa 100644 --- a/lib/utils/api_key_manager/components/__init__.py +++ b/lib/utils/api_key_manager/components/__init__.py @@ -1,6 +1,7 @@ """API key manager components package.""" from .ai_research_setup import render_ai_research_setup +from .ai_research import render_ai_research from .ai_providers import render_ai_providers from .final_setup import render_final_setup from .personalization_setup import render_personalization_setup @@ -10,6 +11,7 @@ from .website_setup import render_website_setup __all__ = [ 'render_ai_research_setup', + 'render_ai_research', 'render_ai_providers', 'render_final_setup', 'render_personalization_setup', diff --git a/lib/utils/api_key_manager/components/ai_providers.py b/lib/utils/api_key_manager/components/ai_providers.py index 441ef2f5..8fbae979 100644 --- a/lib/utils/api_key_manager/components/ai_providers.py +++ b/lib/utils/api_key_manager/components/ai_providers.py @@ -7,6 +7,8 @@ from ..manager import APIKeyManager from .base import render_navigation_buttons, render_step_indicator, render_tab_style from ..wizard_state import next_step, update_progress from datetime import datetime +import os +from dotenv import load_dotenv def validate_api_key(key: str) -> bool: """Validate if an API key is properly formatted.""" @@ -15,10 +17,53 @@ def validate_api_key(key: str) -> bool: # Basic validation - check if key is not empty and has minimum length return len(key.strip()) > 0 +def save_to_env_file(key_name: str, key_value: str) -> bool: + """Save API key to .env file.""" + try: + env_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))), '.env') + + # Read existing .env file + env_contents = [] + if os.path.exists(env_path): + with open(env_path, 'r') as f: + env_contents = f.readlines() + + # Check if key already exists + key_exists = False + for i, line in enumerate(env_contents): + if line.startswith(f"{key_name}="): + env_contents[i] = f"{key_name}={key_value}\n" + key_exists = True + break + + # Add new key if it doesn't exist + if not key_exists: + env_contents.append(f"{key_name}={key_value}\n") + + # Write back to .env file + with open(env_path, 'w') as f: + f.writelines(env_contents) + + # Reload environment variables to ensure consistency + load_dotenv(override=True) + + logger.info(f"[save_to_env_file] Successfully saved {key_name} to .env file") + return True + except Exception as e: + logger.error(f"[save_to_env_file] Error saving to .env file: {str(e)}") + return False + def render_ai_providers(api_key_manager: APIKeyManager) -> Dict[str, Any]: """Render the AI providers setup step.""" logger.info("[render_ai_providers] Starting AI providers setup") try: + # Load environment variables + load_dotenv(override=True) + + # Get existing API keys from .env + openai_key = os.getenv('OPENAI_API_KEY', '') + gemini_key = os.getenv('GEMINI_API_KEY', '') + # Initialize wizard state if not already initialized if 'wizard_state' not in st.session_state: st.session_state.wizard_state = { @@ -35,10 +80,7 @@ def render_ai_providers(api_key_manager: APIKeyManager) -> Dict[str, Any]: # Main content st.markdown(""" -
Configure your AI service providers for content generation
-Power your content with GPT-4 and GPT-3.5 models
-Leverage Google's powerful Gemini models
-Configure your AI research providers for content analysis and research
-Microsoft's powerful search API with web, news, and image search capabilities.
- -Google's programmable search engine with customizable search parameters.
- -These integrations are under development and will be available soon!
-