A newer version of the Gradio SDK is available:
6.4.0
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:
# 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:
# 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():
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
- Push zmian do repo
- HF Space automatycznie zbuduje i uruchomi aplikację
- Aplikacja wystartuje natychmiast (bez timeoutu!)
- Agent załaduje się w tle w ciągu ~30-60 sekund
- Status będzie aktualizowany na żywo w UI
Testowanie lokalne
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