"""AI providers setup component.""" import streamlit as st from loguru import logger from typing import Dict, Any 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.""" if not key: return False # 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 = { 'current_step': 1, 'total_steps': 6, 'progress': 0, 'completed_steps': set(), 'last_updated': datetime.now() } logger.info("[render_ai_providers] Initialized wizard state") # Store API key manager in session state for update_progress st.session_state['api_key_manager'] = api_key_manager # Main content st.markdown("""
Access Claude for advanced content generation
Use Mistral's efficient language models