| # Hugging Face Lazy Initialization Fix | |
| ## Problem | |
| Aplikacja na Hugging Face Spaces nie uruchamiała się, ponieważ czas inicjalizacji bazy danych i agenta przekraczał timeout HF (zazwyczaj ~60 sekund). | |
| ## Rozwiązanie | |
| Zaimplementowano **leniwą inicjalizację** (lazy loading): | |
| ### 1. **Gradio uruchamia się NATYCHMIAST** ⚡ | |
| - Aplikacja Gradio startuje w <1 sekundę | |
| - HF Spaces widzi działającą aplikację i nie pokazuje timeoutu | |
| ### 2. **Agent inicjalizuje się W TLE** 🔄 | |
| - Tworzenie agenta i połączenie z bazą danych następuje w osobnym wątku | |
| - Użytkownik widzi status inicjalizacji na żywo | |
| ### 3. **Pierwsze zapytania czekają na gotowość** ⏳ | |
| - Jeśli użytkownik spróbuje zadać pytanie przed gotowością agenta | |
| - Aplikacja pokazuje komunikat "Agent is initializing, please wait..." | |
| - Po gotowości agenta odpowiedź jest generowana normalnie | |
| ## Zmiany w kodzie | |
| ### `app.py` - Główne zmiany: | |
| ```python | |
| # Zmienne stanu agenta | |
| agent_instance: A11yExpertAgent = None | |
| agent_ready = False | |
| agent_error = None | |
| # Inicjalizacja w osobnym wątku | |
| def initialize_agent_background(): | |
| """Initialize the agent in background thread.""" | |
| global agent_instance, agent_ready, agent_error, loop | |
| try: | |
| logger.info("🔄 Starting agent initialization in background...") | |
| loop = asyncio.new_event_loop() | |
| asyncio.set_event_loop(loop) | |
| agent_instance = loop.run_until_complete(create_agent()) | |
| agent_ready = True | |
| logger.success("✅ A11y Expert Agent is ready!") | |
| except Exception as e: | |
| logger.error(f"❌ Failed to initialize agent: {e}") | |
| agent_error = str(e) | |
| agent_instance = None | |
| # Start w tle przy uruchomieniu | |
| if __name__ == "__main__": | |
| init_thread = threading.Thread(target=initialize_agent_background, daemon=True) | |
| init_thread.start() | |
| demo.launch(...) | |
| ``` | |
| ### Wskaźnik statusu w UI: | |
| ```python | |
| # Status indicator pokazujący czy agent jest gotowy | |
| status_box = gr.Markdown("⏳ **Status:** Agent is initializing in background...") | |
| def check_status(): | |
| if agent_ready: | |
| return "✅ **Status:** Agent ready!" | |
| elif agent_error: | |
| return f"❌ **Status:** Agent failed - {agent_error}" | |
| else: | |
| return "⏳ **Status:** Agent is initializing in background..." | |
| # Auto-update co 2 sekundy | |
| demo.load(lambda: None, None, None).then( | |
| check_status, outputs=status_box, every=2 | |
| ) | |
| ``` | |
| ### Oczekiwanie na gotowość w `respond()`: | |
| ```python | |
| async def respond(message: str, history: list[list[str]]): | |
| # Czekaj aż agent będzie gotowy | |
| if not agent_ready: | |
| if agent_error: | |
| yield f"❌ Agent initialization failed: {agent_error}" | |
| return | |
| yield "⏳ Agent is initializing, please wait..." | |
| # Czekaj do 120 sekund | |
| for i in range(120): | |
| await asyncio.sleep(1) | |
| if agent_ready: | |
| break | |
| if agent_error: | |
| yield f"❌ Agent initialization failed: {agent_error}" | |
| return | |
| if not agent_ready: | |
| yield "❌ Agent initialization timeout. Please refresh and try again." | |
| return | |
| # Normalna generacja odpowiedzi | |
| async for chunk in agent_instance.ask(message): | |
| full_response += chunk | |
| yield full_response | |
| ``` | |
| ## Korzyści | |
| ✅ **Błyskawiczny start** - Gradio uruchamia się w <1s | |
| ✅ **Brak timeoutu na HF** - HF widzi działającą aplikację | |
| ✅ **Przejrzystość** - Użytkownik widzi status inicjalizacji | |
| ✅ **Graceful handling** - Obsługa błędów inicjalizacji | |
| ✅ **Zachowanie funkcjonalności** - Po gotowości działa normalnie | |
| ## Deployment na Hugging Face | |
| 1. Push zmian do repo | |
| 2. HF Space automatycznie zbuduje i uruchomi aplikację | |
| 3. Aplikacja wystartuje natychmiast (bez timeoutu!) | |
| 4. Agent załaduje się w tle w ciągu ~30-60 sekund | |
| 5. Status będzie aktualizowany na żywo w UI | |
| ## Testowanie lokalne | |
| ```bash | |
| python app.py | |
| ``` | |
| Powinieneś zobaczyć: | |
| ``` | |
| 🚀 Starting Gradio app with lazy agent initialization... | |
| Launching Gradio interface... | |
| 🔄 Starting agent initialization in background... | |
| Running on local URL: http://127.0.0.1:7860 | |
| ✅ A11y Expert Agent is ready! | |
| ``` | |
| ## Backup | |
| Stary plik zapisany jako: `app_old.py` | |