import warnings import os import sys # Force UTF-8 for console output (Windows fix) sys.stdout.reconfigure(encoding='utf-8') from huggingface_hub import HfApi, login import gradio as gr # Filter warnings immediately warnings.filterwarnings("ignore", category=SyntaxWarning, module="pydub") warnings.filterwarnings( "ignore", message=r".*HTTP_422_UNPROCESSABLE_ENTITY.*HTTP_422_UNPROCESSABLE_CONTENT.*", category=Warning, module=r"gradio\.routes", ) # --- INTERNAL IMPORTS --- from config import AppConfig from src.utils import create_warning_beep # Import your refactored classes from src.managers import GeminiManager, HFManager, GroqManager from src.input_agent import AgentInput from src.brain_agent import AgentInterpretation from src.trust_agent import AgentTrust from src.ux_agent import AgentUX from src.acoustic_agent import AgentAcoustic # 1. Add the import for your recovery script import recover_chain # (or 'from src import recover_chain' depending on where the file is) # 2. Add this block before ui.launch() print("🔄 Initiating Blockchain Recovery Sequence...") try: # Assuming your recover_chain.py has a main() or run() function recover_chain.main() print("✅ Recovery Complete!") except Exception as e: print(f"❌ Recovery Failed: {e}") # ========================================== # MAIN APPLICATION LOGIC # ========================================== ACOUSTIC_AGENT = None UX_AGENT = None def create_app(): global ACOUSTIC_AGENT, UX_AGENT print("🚀 Initializing PureVersation...") # 1. Setup Configuration & Directories AppConfig.setup_directories() # 🟢 NEW: The Silver Bullet - Global Hugging Face Login # This must happen BEFORE HFManager tries to pull datasets if AppConfig.HF_TOKEN: login(token=AppConfig.HF_TOKEN) print("✅ Hugging Face Global Login Successful.") else: print("🚨 WARNING: HF_TOKEN is missing in AppConfig! Downloads will fail.") # 2. Initialize Managers (Inject Config) # We pass AppConfig to HFManager so it knows where to download files hf_manager = HFManager(AppConfig) hf_manager.pull_datasets() # Initialize Groq (New Brain Stem) groq_manager = GroqManager(AppConfig.GROQ_API_KEY) if AppConfig.GROQ_API_KEY else None # Initialize Gemini (Brain Stem) #gemini_manager = GeminiManager(AppConfig.GOOGLE_API_KEY) if AppConfig.GOOGLE_API_KEY else None # 3. Initialize Agents (Dependency Injection) # Agent 1: Input (Whisper) agent1 = AgentInput() # Agent 2: Brain (Interpretation) # We pass AppConfig so it knows where PROFILES_DIR is # agent2 = AgentInterpretation(AppConfig, gemini_manager_instance=gemini_manager) # Inject groq_manager instead of gemini_manager agent2 = AgentInterpretation(AppConfig, gemini_manager_instance=groq_manager) # Agent 4: Trust (Blockchain/IPFS) # We pass AppConfig so it has keys for Web3 and Pinata agent4 = AgentTrust(AppConfig) # Inject hf_manager into Trust so it can save audio files to HF agent4.hf_manager_ref = hf_manager # Agent 5: Acoustic (shared ASR/TTS/phonetic policy) agent5 = AgentAcoustic(groq_manager, input_agent=agent1) agent4.acoustic_agent = agent5 ACOUSTIC_AGENT = agent5 # Agent 3: UX (Interface) agent3 = AgentUX(agent1, agent2, agent4, acoustic_agent=agent5) UX_AGENT = agent3 # 4. Launch print("✅ System Assembled. Launching Interface...") # Pass the warning beep path agent3.alert_sound = create_warning_beep() # 1. Generate the UI blocks app = agent3.create_ui() # 🟢 FIX: Enable the Gradio Queue here to prevent async loop collisions! app.queue(default_concurrency_limit=10) return app # Expose 'demo' at the module level for Gradio Hot Reload demo = create_app() from api import app as api_app app = gr.mount_gradio_app( api_app, demo, path="/", ssr_mode=False, theme=gr.themes.Soft(primary_hue="blue"), ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=int(os.getenv("PORT", "7860")))