Spaces:
Sleeping
Sleeping
File size: 7,791 Bytes
de63014 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 |
#!/usr/bin/env python3
"""
HOLOKIA-AVATAR - Point d'entrée pour Hugging Face Spaces
Avatar 3D interactif avec IA conversationnelle
"""
import os
import sys
import subprocess
import time
import logging
from pathlib import Path
# Configuration du logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger("HOLOKIA-AVATAR")
def check_requirements():
"""Vérifie que toutes les dépendances sont installées."""
try:
import fastapi
import uvicorn
import gtts
import faster_whisper
import langchain_groq
logger.info("✅ Toutes les dépendances sont installées")
return True
except ImportError as e:
logger.error(f"❌ Dépendance manquante: {e}")
return False
def check_environment():
"""Vérifie les variables d'environnement requises."""
groq_key = os.getenv("GROQ_API_KEY")
if not groq_key:
logger.warning("⚠️ GROQ_API_KEY n'est pas définie")
logger.info("💡 Ajoutez votre clé API Groq dans les secrets du Space")
# Ne pas arrêter l'application, juste avertir
return True
logger.info("✅ Variables d'environnement configurées")
return True
def check_frontend():
"""Vérifie que le frontend est disponible."""
nginx_html = Path("/usr/share/nginx/html")
if nginx_html.exists() and any(nginx_html.iterdir()):
logger.info("✅ Frontend disponible (construit dans le Dockerfile)")
return True
else:
logger.error("❌ Frontend non disponible")
return False
def test_services():
"""Teste que tous les services backend sont accessibles."""
logger.info("🔍 Test des services backend...")
import requests
services = [
("TTS", "http://localhost:5000/health"),
("STT", "http://localhost:5001/health"),
("LLM", "http://localhost:5002/health"),
("Live Stream", "http://localhost:5003/health"),
]
all_ok = True
for name, url in services:
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
logger.info(f"✅ {name}: OK")
else:
logger.error(f"❌ {name}: Erreur (status {response.status_code})")
all_ok = False
except Exception as e:
logger.error(f"❌ {name}: Erreur de connexion - {e}")
all_ok = False
return all_ok
def start_services():
"""Démarre tous les services backend."""
logger.info("🚀 Démarrage des services backend...")
try:
# Vérifier que le script existe
start_script = Path("start_services.py")
if not start_script.exists():
logger.error(f"❌ Script de démarrage non trouvé: {start_script}")
return False
# Démarrer les services en arrière-plan
logger.info("⏳ Démarrage des services en arrière-plan...")
process = subprocess.Popen([
sys.executable, str(start_script)
], cwd=os.getcwd(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# Attendre un peu pour que les services démarrent
time.sleep(15)
# Vérifier que le processus est toujours en vie
if process.poll() is not None:
logger.error("❌ Les services backend se sont arrêtés prématurément")
stdout, stderr = process.communicate()
logger.error(f"STDOUT: {stdout.decode()}")
logger.error(f"STDERR: {stderr.decode()}")
return False
# Tester que les services sont accessibles
if not test_services():
logger.error("❌ Certains services ne sont pas accessibles")
return False
# Test détaillé des services
logger.info("🔍 Test détaillé des services...")
try:
result = subprocess.run([sys.executable, "debug_websocket.py"],
capture_output=True, text=True, timeout=30)
if result.stdout:
logger.info(f"Résultats des tests WebSocket:\n{result.stdout}")
if result.stderr:
logger.error(f"Erreurs des tests WebSocket:\n{result.stderr}")
except Exception as e:
logger.warning(f"Impossible d'exécuter les tests WebSocket: {e}")
# Test détaillé des services
logger.info("🔍 Test détaillé des services...")
try:
result = subprocess.run([sys.executable, "test_services_detailed.py"],
capture_output=True, text=True, timeout=120)
if result.stdout:
logger.info(f"Résultats des tests détaillés:\n{result.stdout}")
if result.stderr:
logger.error(f"Erreurs des tests détaillés:\n{result.stderr}")
except Exception as e:
logger.warning(f"Impossible d'exécuter les tests détaillés: {e}")
logger.info("✅ Services backend démarrés et testés")
return True
except Exception as e:
logger.error(f"❌ Erreur lors du démarrage des services: {e}")
return False
def start_nginx():
"""Démarre Nginx."""
logger.info("🌐 Démarrage de Nginx...")
try:
# Vérifier la configuration Nginx
result = subprocess.run(["nginx", "-t"], capture_output=True, text=True)
if result.returncode != 0:
logger.error(f"❌ Configuration Nginx invalide: {result.stderr}")
return False
logger.info("✅ Configuration Nginx valide")
# Démarrer Nginx en mode daemon
subprocess.run(["nginx"], check=True)
logger.info("✅ Nginx démarré")
return True
except subprocess.CalledProcessError as e:
logger.error(f"❌ Erreur Nginx: {e}")
return False
except Exception as e:
logger.error(f"❌ Erreur inattendue avec Nginx: {e}")
return False
def main():
"""Point d'entrée principal."""
logger.info("🤖 HOLOKIA-AVATAR - Démarrage sur Hugging Face Spaces (v2.2)")
logger.info(f"📁 Répertoire de travail: {os.getcwd()}")
logger.info(f"🐍 Version Python: {sys.version}")
try:
# Vérifications préliminaires
if not check_requirements():
logger.error("❌ Vérification des dépendances échouée")
sys.exit(1)
if not check_environment():
logger.warning("⚠️ Vérification de l'environnement échouée, mais on continue")
if not check_frontend():
logger.error("❌ Vérification du frontend échouée")
sys.exit(1)
# Démarrage des services
if not start_services():
logger.error("❌ Impossible de démarrer les services backend")
# Ne pas arrêter, essayer de continuer avec Nginx seulement
# Démarrage de Nginx
if not start_nginx():
logger.error("❌ Impossible de démarrer Nginx")
sys.exit(1)
logger.info("🎉 Application démarrée avec succès!")
logger.info("🌐 Serveur web accessible sur le port 7860")
# Garder l'application en vie
try:
while True:
time.sleep(60)
logger.info("💓 Application en vie...")
except KeyboardInterrupt:
logger.info("🛑 Arrêt de l'application")
except Exception as e:
logger.error(f"❌ Erreur critique: {e}")
sys.exit(1)
if __name__ == "__main__":
main() |