Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -2,6 +2,7 @@
|
|
| 2 |
# AdaptLearn Enhanced - Hugging Face Spaces Deployment
|
| 3 |
# Next-Generation Adaptive Education System
|
| 4 |
# Gemma 3 Hackathon Submission - GEMMA 3 COMO MODELO PRINCIPAL
|
|
|
|
| 5 |
# ==============================================================================
|
| 6 |
|
| 7 |
import os
|
|
@@ -62,39 +63,108 @@ class Gemma3AIManager:
|
|
| 62 |
"gpt2", # Fallback final
|
| 63 |
]
|
| 64 |
|
| 65 |
-
# Configurar token HF
|
| 66 |
self._setup_hf_token()
|
| 67 |
|
| 68 |
def _setup_hf_token(self):
|
| 69 |
-
"""Configurar token do Hugging Face para Gemma 3"""
|
| 70 |
|
| 71 |
-
|
|
|
|
|
|
|
| 72 |
token_sources = [
|
| 73 |
-
os.getenv("
|
| 74 |
-
os.getenv("
|
| 75 |
-
os.getenv("HUGGING_FACE_TOKEN"), #
|
|
|
|
| 76 |
]
|
| 77 |
|
| 78 |
-
for token in token_sources:
|
| 79 |
-
if token and token.strip():
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
|
| 84 |
if not self.hf_token:
|
| 85 |
-
print("
|
| 86 |
-
print("
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
|
| 88 |
# Fazer login automático se token disponível
|
| 89 |
if self.hf_token:
|
| 90 |
try:
|
| 91 |
from huggingface_hub import login
|
| 92 |
-
login(token=self.hf_token)
|
| 93 |
print("🎉 Login HF realizado com sucesso!")
|
|
|
|
|
|
|
| 94 |
except Exception as e:
|
| 95 |
print(f"⚠️ Erro no login HF: {e}")
|
|
|
|
| 96 |
self.hf_token = None
|
|
|
|
| 97 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
def load_model(self):
|
| 99 |
"""Carregar Gemma 3 como prioridade principal"""
|
| 100 |
|
|
@@ -114,6 +184,7 @@ class Gemma3AIManager:
|
|
| 114 |
|
| 115 |
if not self.hf_token:
|
| 116 |
print(f"⚠️ Token HF necessário para {model_name} - pulando")
|
|
|
|
| 117 |
continue
|
| 118 |
|
| 119 |
try:
|
|
@@ -298,7 +369,10 @@ class Gemma3AIManager:
|
|
| 298 |
continue
|
| 299 |
|
| 300 |
print("❌ Nenhum modelo pôde ser carregado - usando modo template")
|
| 301 |
-
print("💡 Para usar Gemma 3:
|
|
|
|
|
|
|
|
|
|
| 302 |
return False
|
| 303 |
|
| 304 |
def generate_text(self, prompt, max_new_tokens=80, task_complexity="medium", image=None):
|
|
@@ -1276,6 +1350,8 @@ def create_gradio_interface():
|
|
| 1276 |
|
| 1277 |
# Status do sistema com foco no Gemma 3
|
| 1278 |
ai_status = system.ai_manager.get_status()
|
|
|
|
|
|
|
| 1279 |
tech_status = f"""
|
| 1280 |
### 🔧 **STATUS DO SISTEMA**
|
| 1281 |
|
|
@@ -1288,6 +1364,10 @@ def create_gradio_interface():
|
|
| 1288 |
**Multimodal:** {'✅ ATIVO' if ai_status.get('multimodal', False) else '🔄 Apenas Texto'}
|
| 1289 |
**Token HF Configurado:** {'✅ SIM' if ai_status.get('hf_token_configured', False) else '❌ NÃO'}
|
| 1290 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1291 |
**📊 Performance:**
|
| 1292 |
**Taxa de Sucesso:** {ai_status['success_rate']:.1%}
|
| 1293 |
**Total de Gerações:** {ai_status['total_generations']}
|
|
@@ -1300,6 +1380,21 @@ def create_gradio_interface():
|
|
| 1300 |
{'✅ Templates de Chat Avançados' if ai_status.get('features', {}).get('chat_template', False) else '❌ Templates Básicos'}
|
| 1301 |
|
| 1302 |
**🚀 {'GEMMA 3 ONLINE - MÁXIMO PODER AI!' if ai_status.get('gemma3_active', False) else 'MODO FALLBACK - AINDA TOTALMENTE FUNCIONAL!'}**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1303 |
"""
|
| 1304 |
|
| 1305 |
return adapted_content, analysis, tech_status
|
|
@@ -1329,6 +1424,7 @@ Este conteúdo foi adaptado para seu estilo de aprendizagem.
|
|
| 1329 |
"""Testar funcionalidade do sistema com prioridade Gemma 3"""
|
| 1330 |
try:
|
| 1331 |
ai_status = system.ai_manager.get_status()
|
|
|
|
| 1332 |
|
| 1333 |
# Teste de análise
|
| 1334 |
test_state = system.analyze_learning_state("Tenho TDAH e preciso de ajuda para focar", None, None)
|
|
@@ -1351,7 +1447,7 @@ Este conteúdo foi adaptado para seu estilo de aprendizagem.
|
|
| 1351 |
|
| 1352 |
ai_type = "Gemma 3 Aprimorado" if ai_status.get('gemma3_active', False) else "AI Padrão/Fallback"
|
| 1353 |
|
| 1354 |
-
|
| 1355 |
### 🧪 **TESTE ABRANGENTE DO SISTEMA**
|
| 1356 |
|
| 1357 |
**🧠 Status AI:** {gemma_status}
|
|
@@ -1359,11 +1455,24 @@ Este conteúdo foi adaptado para seu estilo de aprendizagem.
|
|
| 1359 |
**📡 Modelo:** {ai_status['model']}
|
| 1360 |
**⚡ Capacidades:** {ai_capabilities}
|
| 1361 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1362 |
**🔍 Teste de Recursos Gemma 3:**
|
| 1363 |
**Multimodal:** {'✅ FUNCIONANDO' if ai_status.get('multimodal', False) else '❌ Não Disponível'}
|
| 1364 |
**Contexto 128K:** {'✅ ATIVO' if ai_status.get('features', {}).get('long_context', False) else '❌ Contexto Padrão'}
|
| 1365 |
-
**Atenção Deslizante:** {'✅ HABILITADO' if ai_status.get('features', {}).get('sliding_window', False) else '❌ Atenção Padrão'}
|
| 1366 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1367 |
|
| 1368 |
**🔍 Testes de Componentes:**
|
| 1369 |
**Detecção de Perfil:** ✅ Funcionando - Detectado: {test_state['profile']}
|
|
@@ -1384,13 +1493,34 @@ Este conteúdo foi adaptado para seu estilo de aprendizagem.
|
|
| 1384 |
• Taxa de Sucesso: {ai_status['success_rate']:.1%}
|
| 1385 |
|
| 1386 |
**🚀 {'GEMMA 3 - O FUTURO DA EDUCAÇÃO AI!' if ai_status.get('gemma3_active', False) else 'FALLBACKS INTELIGENTES GARANTEM FUNCIONALIDADE COMPLETA!'}**
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1387 |
|
| 1388 |
-
**
|
| 1389 |
-
Para ativar o Gemma 3:
|
| 1390 |
-
1. Obtenha um token do Hugging Face em: https://huggingface.co/settings/tokens
|
| 1391 |
-
2. Adicione o token nas secrets do Space como HUGGINGFACE_HUB_TOKEN
|
| 1392 |
-
3. Reinicie o Space para carregar o Gemma 3
|
| 1393 |
"""
|
|
|
|
|
|
|
|
|
|
| 1394 |
except Exception as e:
|
| 1395 |
return f"❌ Teste falhou: {e}"
|
| 1396 |
|
|
@@ -1426,6 +1556,7 @@ Para ativar o Gemma 3:
|
|
| 1426 |
gr.Markdown("""
|
| 1427 |
# 🎓 AdaptLearn Enhanced - Gemma 3 Edition
|
| 1428 |
### Sistema de Educação Adaptativa de Nova Geração - Powered by Gemma 3
|
|
|
|
| 1429 |
|
| 1430 |
**🚀 RECURSOS GEMMA 3 PRINCIPAIS:**
|
| 1431 |
• 🧠 **Motor Gemma 3 Autêntico** - Modelo multimodal de última geração do Google
|
|
@@ -1437,7 +1568,7 @@ Para ativar o Gemma 3:
|
|
| 1437 |
• 🌐 **Acesso Cloud 24/7** - Poder AI confiável disponível em qualquer lugar
|
| 1438 |
• 📱 **Compatibilidade Universal** - Experiência completa em todos os dispositivos
|
| 1439 |
|
| 1440 |
-
**
|
| 1441 |
""", elem_classes=["gemma3-box"])
|
| 1442 |
|
| 1443 |
with gr.Row():
|
|
@@ -1448,7 +1579,7 @@ Para ativar o Gemma 3:
|
|
| 1448 |
label="👤 Descreva Seu Perfil de Aprendizagem",
|
| 1449 |
placeholder="ex: Tenho dislexia e preciso de explicações simples, ou Tenho TDAH e me distraio facilmente...",
|
| 1450 |
value="Tenho TDAH e preciso de conteúdo interativo e envolvente com pausas frequentes",
|
| 1451 |
-
info="🧠 O Gemma 3 analisará
|
| 1452 |
)
|
| 1453 |
|
| 1454 |
gr.Markdown("---")
|
|
@@ -1459,7 +1590,7 @@ Para ativar o Gemma 3:
|
|
| 1459 |
lines=4,
|
| 1460 |
placeholder="Digite qualquer conteúdo educacional que deseja adaptar...",
|
| 1461 |
value="A fotossíntese é o processo pelo qual as plantas convertem luz solar, água e dióxido de carbono em glicose e oxigênio usando clorofila.",
|
| 1462 |
-
info="🎯 O Gemma 3 adaptará inteligentemente este conteúdo com compreensão multimodal"
|
| 1463 |
)
|
| 1464 |
|
| 1465 |
profile_input = gr.Textbox(
|
|
@@ -1676,16 +1807,30 @@ Para ativar o Gemma 3:
|
|
| 1676 |
|
| 1677 |
---
|
| 1678 |
|
| 1679 |
-
###
|
|
|
|
|
|
|
| 1680 |
|
| 1681 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1682 |
|
| 1683 |
-
|
| 1684 |
-
|
| 1685 |
-
|
| 1686 |
-
|
|
|
|
|
|
|
| 1687 |
|
| 1688 |
-
**💡
|
|
|
|
|
|
|
| 1689 |
""")
|
| 1690 |
|
| 1691 |
return demo
|
|
@@ -1702,10 +1847,12 @@ def main():
|
|
| 1702 |
║ ADAPTLEARN ENHANCED ║
|
| 1703 |
║ Powered by Gemma 3 Multimodal AI ║
|
| 1704 |
║ Hugging Face Spaces Edition ║
|
|
|
|
| 1705 |
╚══════════════════════════════════════════════════════════════╝
|
| 1706 |
""")
|
| 1707 |
|
| 1708 |
-
print("🚀 AdaptLearn Enhanced - Deployment Gemma 3:")
|
|
|
|
| 1709 |
print(" 🧠 Primário: Gemma 3 Multimodal para compreensão visão + linguagem")
|
| 1710 |
print(" 🎯 Secundário: Gemma 3 Text-only para processamento avançado de linguagem")
|
| 1711 |
print(" 🔄 Fallbacks: Gemma 2 e outros modelos para confiabilidade")
|
|
@@ -1713,6 +1860,7 @@ def main():
|
|
| 1713 |
print(" 🎯 Geração de conteúdo adaptativo multimodal em tempo real")
|
| 1714 |
print(" 🌐 Disponibilidade cloud 24/7 no Hugging Face Spaces")
|
| 1715 |
print(" 📱 Interface otimizada para mobile e desktop")
|
|
|
|
| 1716 |
print("")
|
| 1717 |
|
| 1718 |
try:
|
|
@@ -1754,8 +1902,9 @@ def get_system_capabilities():
|
|
| 1754 |
"""Obter capacidades do sistema para documentação"""
|
| 1755 |
return {
|
| 1756 |
'name': 'AdaptLearn Enhanced',
|
| 1757 |
-
'version': '3.0 - Gemma 3 Edition',
|
| 1758 |
-
'deployment': 'Cloud-otimizado para Hugging Face Spaces',
|
|
|
|
| 1759 |
'primary_ai_models': ['google/gemma-3-4b-it', 'google/gemma-3-2b-it', 'google/gemma-3-1b-pt'],
|
| 1760 |
'fallback_models': ['google/gemma-2-2b-it', 'microsoft/DialoGPT-medium', 'distilgpt2', 'gpt2'],
|
| 1761 |
'learning_profiles': ['Neurotípico', 'Dislexia', 'TDAH', 'Autismo', 'Deficiência Auditiva'],
|
|
@@ -1769,6 +1918,13 @@ def get_system_capabilities():
|
|
| 1769 |
'Templates de chat avançados',
|
| 1770 |
'Adaptação educacional AI'
|
| 1771 |
],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1772 |
'features': [
|
| 1773 |
'Análise multimodal em tempo real',
|
| 1774 |
'Adaptação de conteúdo powered by AI',
|
|
@@ -1776,9 +1932,10 @@ def get_system_capabilities():
|
|
| 1776 |
'Gamificação adaptativa',
|
| 1777 |
'Deploy cloud pronto',
|
| 1778 |
'Otimizado para mobile',
|
| 1779 |
-
'Sistemas de fallback',
|
| 1780 |
'Disponibilidade 24/7',
|
| 1781 |
-
'Suporte Gemma 3 autêntico'
|
|
|
|
| 1782 |
],
|
| 1783 |
'accessibility': {
|
| 1784 |
'dyslexia_support': True,
|
|
@@ -1794,18 +1951,143 @@ def get_system_capabilities():
|
|
| 1794 |
'audio_analysis': 'Algoritmos customizados',
|
| 1795 |
'visual_analysis': 'OpenCV + custom',
|
| 1796 |
'deployment': 'Hugging Face Spaces',
|
|
|
|
| 1797 |
'fallback_systems': 'Adaptação baseada em template + Gemma 2'
|
| 1798 |
}
|
| 1799 |
}
|
| 1800 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1801 |
# Exportar componentes principais
|
| 1802 |
__all__ = [
|
| 1803 |
'AdaptiveEducationSystem',
|
| 1804 |
'Gemma3AIManager',
|
| 1805 |
'create_gradio_interface',
|
| 1806 |
-
'get_system_capabilities'
|
|
|
|
|
|
|
|
|
|
| 1807 |
]
|
| 1808 |
|
| 1809 |
-
print("🎓 AdaptLearn Enhanced - Gemma 3 Multimodal Edition
|
|
|
|
| 1810 |
print("🧠 Prioriza Gemma 3 multimodal AI com sistemas de fallback inteligentes")
|
| 1811 |
print("🚀 Execute main() para lançar a aplicação aprimorada com Gemma 3")
|
|
|
|
|
|
| 2 |
# AdaptLearn Enhanced - Hugging Face Spaces Deployment
|
| 3 |
# Next-Generation Adaptive Education System
|
| 4 |
# Gemma 3 Hackathon Submission - GEMMA 3 COMO MODELO PRINCIPAL
|
| 5 |
+
# CONFIGURAÇÃO SEGURA COM SECRETS
|
| 6 |
# ==============================================================================
|
| 7 |
|
| 8 |
import os
|
|
|
|
| 63 |
"gpt2", # Fallback final
|
| 64 |
]
|
| 65 |
|
| 66 |
+
# Configurar token HF de forma segura
|
| 67 |
self._setup_hf_token()
|
| 68 |
|
| 69 |
def _setup_hf_token(self):
|
| 70 |
+
"""Configurar token do Hugging Face para Gemma 3 usando SECRETS SEGUROS"""
|
| 71 |
|
| 72 |
+
print("🔐 Configurando autenticação Hugging Face...")
|
| 73 |
+
|
| 74 |
+
# Tentar obter token APENAS de secrets seguros do Hugging Face Spaces
|
| 75 |
token_sources = [
|
| 76 |
+
os.getenv("HF_TOKEN"), # SECRET PRINCIPAL do Space
|
| 77 |
+
os.getenv("HUGGINGFACE_HUB_TOKEN"), # SECRET alternativo
|
| 78 |
+
os.getenv("HUGGING_FACE_TOKEN"), # SECRET alternativo
|
| 79 |
+
os.getenv("HF_AUTH_TOKEN"), # SECRET alternativo
|
| 80 |
]
|
| 81 |
|
| 82 |
+
for i, token in enumerate(token_sources):
|
| 83 |
+
if token and token.strip() and len(token.strip()) > 10:
|
| 84 |
+
# Validar formato básico do token HF
|
| 85 |
+
token_clean = token.strip()
|
| 86 |
+
if token_clean.startswith('hf_') and len(token_clean) > 30:
|
| 87 |
+
self.hf_token = token_clean
|
| 88 |
+
print(f"✅ Token HF válido encontrado via SECRET #{i+1}")
|
| 89 |
+
print(f"🔐 Token formato: {token_clean[:8]}...{token_clean[-4:]}")
|
| 90 |
+
print("🎉 GEMMA 3 SERÁ DESBLOQUEADO!")
|
| 91 |
+
break
|
| 92 |
+
else:
|
| 93 |
+
print(f"⚠️ Token encontrado mas formato inválido na fonte #{i+1}")
|
| 94 |
|
| 95 |
if not self.hf_token:
|
| 96 |
+
print("❌ NENHUM TOKEN HF VÁLIDO ENCONTRADO")
|
| 97 |
+
print("🔐 Para ativar Gemma 3, configure um secret no Space:")
|
| 98 |
+
print(" 1. Vá em Settings → Variables and secrets")
|
| 99 |
+
print(" 2. Adicione um novo secret:")
|
| 100 |
+
print(" Name: HF_TOKEN")
|
| 101 |
+
print(" Value: seu_token_do_hugging_face")
|
| 102 |
+
print(" 3. Reinicie o Space")
|
| 103 |
+
print("📖 Obtenha seu token em: https://huggingface.co/settings/tokens")
|
| 104 |
+
print("🔄 Usando modo fallback até token ser configurado")
|
| 105 |
|
| 106 |
# Fazer login automático se token disponível
|
| 107 |
if self.hf_token:
|
| 108 |
try:
|
| 109 |
from huggingface_hub import login
|
| 110 |
+
login(token=self.hf_token, add_to_git_credential=False)
|
| 111 |
print("🎉 Login HF realizado com sucesso!")
|
| 112 |
+
print("🧠 Gemma 3 agora está disponível!")
|
| 113 |
+
return True
|
| 114 |
except Exception as e:
|
| 115 |
print(f"⚠️ Erro no login HF: {e}")
|
| 116 |
+
print("🔄 Token pode estar inválido - usando fallbacks")
|
| 117 |
self.hf_token = None
|
| 118 |
+
return False
|
| 119 |
|
| 120 |
+
return False
|
| 121 |
+
|
| 122 |
+
def get_token_status(self):
|
| 123 |
+
"""Obter status detalhado do token para debugging"""
|
| 124 |
+
status = {
|
| 125 |
+
'token_configured': self.hf_token is not None,
|
| 126 |
+
'token_format_valid': False,
|
| 127 |
+
'login_successful': False,
|
| 128 |
+
'sources_checked': []
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
# Verificar todas as fontes de token
|
| 132 |
+
token_sources = {
|
| 133 |
+
'HF_TOKEN': os.getenv("HF_TOKEN"),
|
| 134 |
+
'HUGGINGFACE_HUB_TOKEN': os.getenv("HUGGINGFACE_HUB_TOKEN"),
|
| 135 |
+
'HUGGING_FACE_TOKEN': os.getenv("HUGGING_FACE_TOKEN"),
|
| 136 |
+
'HF_AUTH_TOKEN': os.getenv("HF_AUTH_TOKEN")
|
| 137 |
+
}
|
| 138 |
+
|
| 139 |
+
for name, value in token_sources.items():
|
| 140 |
+
source_status = {
|
| 141 |
+
'name': name,
|
| 142 |
+
'found': value is not None,
|
| 143 |
+
'length': len(value) if value else 0,
|
| 144 |
+
'valid_format': False
|
| 145 |
+
}
|
| 146 |
+
|
| 147 |
+
if value and value.strip():
|
| 148 |
+
clean_token = value.strip()
|
| 149 |
+
source_status['valid_format'] = (
|
| 150 |
+
clean_token.startswith('hf_') and
|
| 151 |
+
len(clean_token) > 30
|
| 152 |
+
)
|
| 153 |
+
|
| 154 |
+
status['sources_checked'].append(source_status)
|
| 155 |
+
|
| 156 |
+
if self.hf_token:
|
| 157 |
+
status['token_format_valid'] = True
|
| 158 |
+
# Testar se login funcionou
|
| 159 |
+
try:
|
| 160 |
+
from huggingface_hub import whoami
|
| 161 |
+
whoami(token=self.hf_token)
|
| 162 |
+
status['login_successful'] = True
|
| 163 |
+
except:
|
| 164 |
+
status['login_successful'] = False
|
| 165 |
+
|
| 166 |
+
return status
|
| 167 |
+
|
| 168 |
def load_model(self):
|
| 169 |
"""Carregar Gemma 3 como prioridade principal"""
|
| 170 |
|
|
|
|
| 184 |
|
| 185 |
if not self.hf_token:
|
| 186 |
print(f"⚠️ Token HF necessário para {model_name} - pulando")
|
| 187 |
+
print("💡 Configure HF_TOKEN nas secrets do Space para usar Gemma 3")
|
| 188 |
continue
|
| 189 |
|
| 190 |
try:
|
|
|
|
| 369 |
continue
|
| 370 |
|
| 371 |
print("❌ Nenhum modelo pôde ser carregado - usando modo template")
|
| 372 |
+
print("💡 Para usar Gemma 3:")
|
| 373 |
+
print(" 1. Obtenha token em: https://huggingface.co/settings/tokens")
|
| 374 |
+
print(" 2. Adicione como secret HF_TOKEN no Space")
|
| 375 |
+
print(" 3. Reinicie o Space")
|
| 376 |
return False
|
| 377 |
|
| 378 |
def generate_text(self, prompt, max_new_tokens=80, task_complexity="medium", image=None):
|
|
|
|
| 1350 |
|
| 1351 |
# Status do sistema com foco no Gemma 3
|
| 1352 |
ai_status = system.ai_manager.get_status()
|
| 1353 |
+
token_status = system.ai_manager.get_token_status()
|
| 1354 |
+
|
| 1355 |
tech_status = f"""
|
| 1356 |
### 🔧 **STATUS DO SISTEMA**
|
| 1357 |
|
|
|
|
| 1364 |
**Multimodal:** {'✅ ATIVO' if ai_status.get('multimodal', False) else '🔄 Apenas Texto'}
|
| 1365 |
**Token HF Configurado:** {'✅ SIM' if ai_status.get('hf_token_configured', False) else '❌ NÃO'}
|
| 1366 |
|
| 1367 |
+
**🔐 Detalhes do Token:**
|
| 1368 |
+
**Login Bem-sucedido:** {'✅ SIM' if token_status['login_successful'] else '❌ NÃO'}
|
| 1369 |
+
**Formato Válido:** {'✅ SIM' if token_status['token_format_valid'] else '❌ NÃO'}
|
| 1370 |
+
|
| 1371 |
**📊 Performance:**
|
| 1372 |
**Taxa de Sucesso:** {ai_status['success_rate']:.1%}
|
| 1373 |
**Total de Gerações:** {ai_status['total_generations']}
|
|
|
|
| 1380 |
{'✅ Templates de Chat Avançados' if ai_status.get('features', {}).get('chat_template', False) else '❌ Templates Básicos'}
|
| 1381 |
|
| 1382 |
**🚀 {'GEMMA 3 ONLINE - MÁXIMO PODER AI!' if ai_status.get('gemma3_active', False) else 'MODO FALLBACK - AINDA TOTALMENTE FUNCIONAL!'}**
|
| 1383 |
+
|
| 1384 |
+
**🔐 Status dos Secrets Verificados:**
|
| 1385 |
+
"""
|
| 1386 |
+
|
| 1387 |
+
for source in token_status['sources_checked']:
|
| 1388 |
+
status_icon = "✅" if source['valid_format'] else "❌" if source['found'] else "⚪"
|
| 1389 |
+
tech_status += f"**{source['name']}:** {status_icon} {'Válido' if source['valid_format'] else 'Encontrado mas inválido' if source['found'] else 'Não encontrado'}\n"
|
| 1390 |
+
|
| 1391 |
+
if not ai_status.get('hf_token_configured', False):
|
| 1392 |
+
tech_status += """
|
| 1393 |
+
**💡 Para Ativar Gemma 3:**
|
| 1394 |
+
1. Vá em Settings → Variables and secrets
|
| 1395 |
+
2. Adicione secret: Name=`HF_TOKEN`, Value=`seu_token_hf`
|
| 1396 |
+
3. Reinicie o Space
|
| 1397 |
+
4. Obtenha token em: https://huggingface.co/settings/tokens
|
| 1398 |
"""
|
| 1399 |
|
| 1400 |
return adapted_content, analysis, tech_status
|
|
|
|
| 1424 |
"""Testar funcionalidade do sistema com prioridade Gemma 3"""
|
| 1425 |
try:
|
| 1426 |
ai_status = system.ai_manager.get_status()
|
| 1427 |
+
token_status = system.ai_manager.get_token_status()
|
| 1428 |
|
| 1429 |
# Teste de análise
|
| 1430 |
test_state = system.analyze_learning_state("Tenho TDAH e preciso de ajuda para focar", None, None)
|
|
|
|
| 1447 |
|
| 1448 |
ai_type = "Gemma 3 Aprimorado" if ai_status.get('gemma3_active', False) else "AI Padrão/Fallback"
|
| 1449 |
|
| 1450 |
+
test_result = f"""
|
| 1451 |
### 🧪 **TESTE ABRANGENTE DO SISTEMA**
|
| 1452 |
|
| 1453 |
**🧠 Status AI:** {gemma_status}
|
|
|
|
| 1455 |
**📡 Modelo:** {ai_status['model']}
|
| 1456 |
**⚡ Capacidades:** {ai_capabilities}
|
| 1457 |
|
| 1458 |
+
**🔐 Verificação de Autenticação:**
|
| 1459 |
+
**Login HF Realizado:** {'✅ SIM' if token_status['login_successful'] else '❌ NÃO'}
|
| 1460 |
+
**Token Configurado:** {'✅ SIM' if token_status['token_configured'] else '❌ NÃO'}
|
| 1461 |
+
**Formato Válido:** {'✅ SIM' if token_status['token_format_valid'] else '❌ NÃO'}
|
| 1462 |
+
|
| 1463 |
**🔍 Teste de Recursos Gemma 3:**
|
| 1464 |
**Multimodal:** {'✅ FUNCIONANDO' if ai_status.get('multimodal', False) else '❌ Não Disponível'}
|
| 1465 |
**Contexto 128K:** {'✅ ATIVO' if ai_status.get('features', {}).get('long_context', False) else '❌ Contexto Padrão'}
|
| 1466 |
+
**Atenção Deslizante:** {'✅ HABILITADO' if ai_status.get('features', {}).get('sliding_window', False) else '❌ Atenção Padrão'}
|
| 1467 |
+
|
| 1468 |
+
**🔍 Status dos Secrets:**
|
| 1469 |
+
"""
|
| 1470 |
+
|
| 1471 |
+
for source in token_status['sources_checked']:
|
| 1472 |
+
status = "✅ Válido" if source['valid_format'] else "⚠️ Inválido" if source['found'] else "❌ Ausente"
|
| 1473 |
+
test_result += f"**{source['name']}:** {status} ({source['length']} chars)\n"
|
| 1474 |
+
|
| 1475 |
+
test_result += f"""
|
| 1476 |
|
| 1477 |
**🔍 Testes de Componentes:**
|
| 1478 |
**Detecção de Perfil:** ✅ Funcionando - Detectado: {test_state['profile']}
|
|
|
|
| 1493 |
• Taxa de Sucesso: {ai_status['success_rate']:.1%}
|
| 1494 |
|
| 1495 |
**🚀 {'GEMMA 3 - O FUTURO DA EDUCAÇÃO AI!' if ai_status.get('gemma3_active', False) else 'FALLBACKS INTELIGENTES GARANTEM FUNCIONALIDADE COMPLETA!'}**
|
| 1496 |
+
"""
|
| 1497 |
+
|
| 1498 |
+
if not token_status['token_configured']:
|
| 1499 |
+
test_result += """
|
| 1500 |
+
|
| 1501 |
+
**💡 INSTRUÇÕES PARA ATIVAR GEMMA 3:**
|
| 1502 |
+
|
| 1503 |
+
**🔐 Configuração Segura dos Secrets:**
|
| 1504 |
+
1. **Obtenha seu token:** https://huggingface.co/settings/tokens
|
| 1505 |
+
2. **Vá nas configurações do Space:** Settings → Variables and secrets
|
| 1506 |
+
3. **Adicione um novo secret:**
|
| 1507 |
+
- **Name:** `HF_TOKEN`
|
| 1508 |
+
- **Value:** `hf_xxxxxxxxxxxxx` (seu token)
|
| 1509 |
+
4. **Clique "Add secret"**
|
| 1510 |
+
5. **Reinicie o Space:** Factory reboot
|
| 1511 |
+
6. **Aguarde o carregamento** e teste novamente
|
| 1512 |
+
|
| 1513 |
+
**✅ Vantagens dos Secrets:**
|
| 1514 |
+
• Token permanece privado e seguro
|
| 1515 |
+
• Não exposto no código público
|
| 1516 |
+
• Acesso automático ao Gemma 3
|
| 1517 |
+
• Conformidade com políticas do HF
|
| 1518 |
|
| 1519 |
+
**🎯 Após configuração:** Sistema automaticamente detectará e usará Gemma 3!
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1520 |
"""
|
| 1521 |
+
|
| 1522 |
+
return test_result
|
| 1523 |
+
|
| 1524 |
except Exception as e:
|
| 1525 |
return f"❌ Teste falhou: {e}"
|
| 1526 |
|
|
|
|
| 1556 |
gr.Markdown("""
|
| 1557 |
# 🎓 AdaptLearn Enhanced - Gemma 3 Edition
|
| 1558 |
### Sistema de Educação Adaptativa de Nova Geração - Powered by Gemma 3
|
| 1559 |
+
### 🔐 **SISTEMA SEGURO COM SECRETS** 🔐
|
| 1560 |
|
| 1561 |
**🚀 RECURSOS GEMMA 3 PRINCIPAIS:**
|
| 1562 |
• 🧠 **Motor Gemma 3 Autêntico** - Modelo multimodal de última geração do Google
|
|
|
|
| 1568 |
• 🌐 **Acesso Cloud 24/7** - Poder AI confiável disponível em qualquer lugar
|
| 1569 |
• 📱 **Compatibilidade Universal** - Experiência completa em todos os dispositivos
|
| 1570 |
|
| 1571 |
+
**🔐 Segurança:** Tokens são gerenciados via secrets seguros do Hugging Face Spaces
|
| 1572 |
""", elem_classes=["gemma3-box"])
|
| 1573 |
|
| 1574 |
with gr.Row():
|
|
|
|
| 1579 |
label="👤 Descreva Seu Perfil de Aprendizagem",
|
| 1580 |
placeholder="ex: Tenho dislexia e preciso de explicações simples, ou Tenho TDAH e me distraio facilmente...",
|
| 1581 |
value="Tenho TDAH e preciso de conteúdo interativo e envolvente com pausas frequentes",
|
| 1582 |
+
info="🧠 O Gemma 3 analisará suas necessidades específicas com inteligência multimodal (requer token nas secrets)"
|
| 1583 |
)
|
| 1584 |
|
| 1585 |
gr.Markdown("---")
|
|
|
|
| 1590 |
lines=4,
|
| 1591 |
placeholder="Digite qualquer conteúdo educacional que deseja adaptar...",
|
| 1592 |
value="A fotossíntese é o processo pelo qual as plantas convertem luz solar, água e dióxido de carbono em glicose e oxigênio usando clorofila.",
|
| 1593 |
+
info="🎯 O Gemma 3 adaptará inteligentemente este conteúdo com compreensão multimodal (requer token nas secrets)"
|
| 1594 |
)
|
| 1595 |
|
| 1596 |
profile_input = gr.Textbox(
|
|
|
|
| 1807 |
|
| 1808 |
---
|
| 1809 |
|
| 1810 |
+
### 🔐 **Configuração Segura do Token Gemma 3**
|
| 1811 |
+
|
| 1812 |
+
**Para ativar o Gemma 3 com segurança:**
|
| 1813 |
|
| 1814 |
+
1. **🎫 Obtenha seu token:** Vá em https://huggingface.co/settings/tokens
|
| 1815 |
+
2. **⚙️ Abra Settings do Space:** Clique em "Settings" no topo da página
|
| 1816 |
+
3. **🔒 Vá para Secrets:** Clique em "Variables and secrets"
|
| 1817 |
+
4. **➕ Adicione novo secret:**
|
| 1818 |
+
- **Name**: `HF_TOKEN`
|
| 1819 |
+
- **Value**: `hf_xxxxxxxxxx` (seu token HF)
|
| 1820 |
+
5. **💾 Salve o secret:** Clique em "Add secret"
|
| 1821 |
+
6. **🔄 Reinicie o Space:** Clique em "Factory reboot"
|
| 1822 |
+
7. **⏱️ Aguarde o carregamento** e teste o sistema
|
| 1823 |
|
| 1824 |
+
**🔐 Vantagens dos Secrets:**
|
| 1825 |
+
- ✅ Token permanece privado e seguro
|
| 1826 |
+
- ✅ Não exposto no código público
|
| 1827 |
+
- ✅ Acesso automático ao Gemma 3
|
| 1828 |
+
- ✅ Conformidade com políticas do HF
|
| 1829 |
+
- ✅ Carregamento automático na inicialização
|
| 1830 |
|
| 1831 |
+
**💡 Status atual**: Sistema funcionará com fallbacks inteligentes até token ser configurado nas secrets
|
| 1832 |
+
|
| 1833 |
+
**🎯 Após configuração**: Reinicie o Space e o Gemma 3 será carregado automaticamente!
|
| 1834 |
""")
|
| 1835 |
|
| 1836 |
return demo
|
|
|
|
| 1847 |
║ ADAPTLEARN ENHANCED ║
|
| 1848 |
║ Powered by Gemma 3 Multimodal AI ║
|
| 1849 |
║ Hugging Face Spaces Edition ║
|
| 1850 |
+
║ CONFIGURAÇÃO SEGURA ║
|
| 1851 |
╚══════════════════════════════════════════════════════════════╝
|
| 1852 |
""")
|
| 1853 |
|
| 1854 |
+
print("🚀 AdaptLearn Enhanced - Deployment Seguro Gemma 3:")
|
| 1855 |
+
print(" 🔐 Autenticação: Somente via secrets seguros do HF Spaces")
|
| 1856 |
print(" 🧠 Primário: Gemma 3 Multimodal para compreensão visão + linguagem")
|
| 1857 |
print(" 🎯 Secundário: Gemma 3 Text-only para processamento avançado de linguagem")
|
| 1858 |
print(" 🔄 Fallbacks: Gemma 2 e outros modelos para confiabilidade")
|
|
|
|
| 1860 |
print(" 🎯 Geração de conteúdo adaptativo multimodal em tempo real")
|
| 1861 |
print(" 🌐 Disponibilidade cloud 24/7 no Hugging Face Spaces")
|
| 1862 |
print(" 📱 Interface otimizada para mobile e desktop")
|
| 1863 |
+
print(" 🔐 Zero hardcoded tokens - máxima segurança")
|
| 1864 |
print("")
|
| 1865 |
|
| 1866 |
try:
|
|
|
|
| 1902 |
"""Obter capacidades do sistema para documentação"""
|
| 1903 |
return {
|
| 1904 |
'name': 'AdaptLearn Enhanced',
|
| 1905 |
+
'version': '3.0 - Gemma 3 Edition (Secure)',
|
| 1906 |
+
'deployment': 'Cloud-otimizado para Hugging Face Spaces com configuração segura',
|
| 1907 |
+
'security': 'Autenticação via secrets seguros - zero hardcoded tokens',
|
| 1908 |
'primary_ai_models': ['google/gemma-3-4b-it', 'google/gemma-3-2b-it', 'google/gemma-3-1b-pt'],
|
| 1909 |
'fallback_models': ['google/gemma-2-2b-it', 'microsoft/DialoGPT-medium', 'distilgpt2', 'gpt2'],
|
| 1910 |
'learning_profiles': ['Neurotípico', 'Dislexia', 'TDAH', 'Autismo', 'Deficiência Auditiva'],
|
|
|
|
| 1918 |
'Templates de chat avançados',
|
| 1919 |
'Adaptação educacional AI'
|
| 1920 |
],
|
| 1921 |
+
'security_features': [
|
| 1922 |
+
'Gestão segura de tokens via HF Secrets',
|
| 1923 |
+
'Zero exposição de credenciais no código',
|
| 1924 |
+
'Validação automática de formato de token',
|
| 1925 |
+
'Login seguro com fallback inteligente',
|
| 1926 |
+
'Monitoramento de status de autenticação'
|
| 1927 |
+
],
|
| 1928 |
'features': [
|
| 1929 |
'Análise multimodal em tempo real',
|
| 1930 |
'Adaptação de conteúdo powered by AI',
|
|
|
|
| 1932 |
'Gamificação adaptativa',
|
| 1933 |
'Deploy cloud pronto',
|
| 1934 |
'Otimizado para mobile',
|
| 1935 |
+
'Sistemas de fallback robustos',
|
| 1936 |
'Disponibilidade 24/7',
|
| 1937 |
+
'Suporte Gemma 3 autêntico',
|
| 1938 |
+
'Configuração segura via secrets'
|
| 1939 |
],
|
| 1940 |
'accessibility': {
|
| 1941 |
'dyslexia_support': True,
|
|
|
|
| 1951 |
'audio_analysis': 'Algoritmos customizados',
|
| 1952 |
'visual_analysis': 'OpenCV + custom',
|
| 1953 |
'deployment': 'Hugging Face Spaces',
|
| 1954 |
+
'security': 'HF Secrets Management',
|
| 1955 |
'fallback_systems': 'Adaptação baseada em template + Gemma 2'
|
| 1956 |
}
|
| 1957 |
}
|
| 1958 |
|
| 1959 |
+
def validate_hf_token_format(token):
|
| 1960 |
+
"""Validar formato do token Hugging Face"""
|
| 1961 |
+
if not token or not isinstance(token, str):
|
| 1962 |
+
return False, "Token deve ser uma string"
|
| 1963 |
+
|
| 1964 |
+
token = token.strip()
|
| 1965 |
+
|
| 1966 |
+
if not token.startswith('hf_'):
|
| 1967 |
+
return False, "Token deve começar com 'hf_'"
|
| 1968 |
+
|
| 1969 |
+
if len(token) < 35:
|
| 1970 |
+
return False, "Token muito curto (mínimo 35 caracteres)"
|
| 1971 |
+
|
| 1972 |
+
if len(token) > 50:
|
| 1973 |
+
return False, "Token muito longo (máximo 50 caracteres)"
|
| 1974 |
+
|
| 1975 |
+
# Verificar caracteres válidos (alphanumeric + underscore)
|
| 1976 |
+
valid_chars = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_')
|
| 1977 |
+
if not all(c in valid_chars for c in token):
|
| 1978 |
+
return False, "Token contém caracteres inválidos"
|
| 1979 |
+
|
| 1980 |
+
return True, "Token com formato válido"
|
| 1981 |
+
|
| 1982 |
+
def get_token_setup_instructions():
|
| 1983 |
+
"""Obter instruções detalhadas para configuração do token"""
|
| 1984 |
+
return {
|
| 1985 |
+
'steps': [
|
| 1986 |
+
{
|
| 1987 |
+
'step': 1,
|
| 1988 |
+
'title': 'Obter Token HF',
|
| 1989 |
+
'description': 'Vá para https://huggingface.co/settings/tokens',
|
| 1990 |
+
'details': 'Crie um token com permissões de leitura de repositórios'
|
| 1991 |
+
},
|
| 1992 |
+
{
|
| 1993 |
+
'step': 2,
|
| 1994 |
+
'title': 'Acessar Settings do Space',
|
| 1995 |
+
'description': 'Clique em "Settings" no topo da página do Space',
|
| 1996 |
+
'details': 'Procure pelo ícone de engrenagem ao lado do nome do Space'
|
| 1997 |
+
},
|
| 1998 |
+
{
|
| 1999 |
+
'step': 3,
|
| 2000 |
+
'title': 'Ir para Secrets',
|
| 2001 |
+
'description': 'Clique em "Variables and secrets"',
|
| 2002 |
+
'details': 'Esta seção permite configurar variáveis privadas'
|
| 2003 |
+
},
|
| 2004 |
+
{
|
| 2005 |
+
'step': 4,
|
| 2006 |
+
'title': 'Adicionar Secret',
|
| 2007 |
+
'description': 'Clique em "New secret"',
|
| 2008 |
+
'details': 'Configure: Name = HF_TOKEN, Value = seu_token_hf'
|
| 2009 |
+
},
|
| 2010 |
+
{
|
| 2011 |
+
'step': 5,
|
| 2012 |
+
'title': 'Salvar e Reiniciar',
|
| 2013 |
+
'description': 'Salve o secret e reinicie o Space',
|
| 2014 |
+
'details': 'Use "Factory reboot" para garantir carregamento completo'
|
| 2015 |
+
}
|
| 2016 |
+
],
|
| 2017 |
+
'tips': [
|
| 2018 |
+
'O token deve começar com "hf_"',
|
| 2019 |
+
'Mantenha o token privado e seguro',
|
| 2020 |
+
'Não compartilhe o token em código público',
|
| 2021 |
+
'O sistema detectará automaticamente o token configurado',
|
| 2022 |
+
'Após configuração, o Gemma 3 será carregado automaticamente'
|
| 2023 |
+
],
|
| 2024 |
+
'troubleshooting': {
|
| 2025 |
+
'token_not_detected': 'Verifique se o nome do secret é exatamente "HF_TOKEN"',
|
| 2026 |
+
'invalid_format': 'Token deve começar com "hf_" e ter 35-50 caracteres',
|
| 2027 |
+
'login_failed': 'Verifique se o token tem permissões adequadas',
|
| 2028 |
+
'model_not_loading': 'Tente fazer "Factory reboot" do Space'
|
| 2029 |
+
}
|
| 2030 |
+
}
|
| 2031 |
+
|
| 2032 |
+
def generate_status_report():
|
| 2033 |
+
"""Gerar relatório de status do sistema"""
|
| 2034 |
+
try:
|
| 2035 |
+
# Verificar disponibilidade de bibliotecas
|
| 2036 |
+
libs_status = {
|
| 2037 |
+
'transformers': TRANSFORMERS_AVAILABLE,
|
| 2038 |
+
'opencv': OPENCV_AVAILABLE,
|
| 2039 |
+
'torch': True, # Assumindo que está disponível se transformers funciona
|
| 2040 |
+
'gradio': True, # Necessário para interface
|
| 2041 |
+
'numpy': True # Dependência básica
|
| 2042 |
+
}
|
| 2043 |
+
|
| 2044 |
+
# Verificar tokens disponíveis
|
| 2045 |
+
token_sources = {
|
| 2046 |
+
'HF_TOKEN': os.getenv("HF_TOKEN") is not None,
|
| 2047 |
+
'HUGGINGFACE_HUB_TOKEN': os.getenv("HUGGINGFACE_HUB_TOKEN") is not None,
|
| 2048 |
+
'HUGGING_FACE_TOKEN': os.getenv("HUGGING_FACE_TOKEN") is not None,
|
| 2049 |
+
'HF_AUTH_TOKEN': os.getenv("HF_AUTH_TOKEN") is not None
|
| 2050 |
+
}
|
| 2051 |
+
|
| 2052 |
+
# Verificar se algum token válido está disponível
|
| 2053 |
+
valid_token_found = False
|
| 2054 |
+
for token_name, token_value in token_sources.items():
|
| 2055 |
+
if token_value:
|
| 2056 |
+
token = os.getenv(token_name)
|
| 2057 |
+
if token and validate_hf_token_format(token)[0]:
|
| 2058 |
+
valid_token_found = True
|
| 2059 |
+
break
|
| 2060 |
+
|
| 2061 |
+
return {
|
| 2062 |
+
'timestamp': datetime.now().isoformat(),
|
| 2063 |
+
'libraries': libs_status,
|
| 2064 |
+
'tokens': token_sources,
|
| 2065 |
+
'valid_token_available': valid_token_found,
|
| 2066 |
+
'gemma3_ready': TRANSFORMERS_AVAILABLE and valid_token_found,
|
| 2067 |
+
'fallback_available': TRANSFORMERS_AVAILABLE,
|
| 2068 |
+
'system_ready': True # Sistema sempre funciona com fallbacks
|
| 2069 |
+
}
|
| 2070 |
+
|
| 2071 |
+
except Exception as e:
|
| 2072 |
+
return {
|
| 2073 |
+
'timestamp': datetime.now().isoformat(),
|
| 2074 |
+
'error': str(e),
|
| 2075 |
+
'system_ready': True # Sistema sempre funciona com templates
|
| 2076 |
+
}
|
| 2077 |
+
|
| 2078 |
# Exportar componentes principais
|
| 2079 |
__all__ = [
|
| 2080 |
'AdaptiveEducationSystem',
|
| 2081 |
'Gemma3AIManager',
|
| 2082 |
'create_gradio_interface',
|
| 2083 |
+
'get_system_capabilities',
|
| 2084 |
+
'validate_hf_token_format',
|
| 2085 |
+
'get_token_setup_instructions',
|
| 2086 |
+
'generate_status_report'
|
| 2087 |
]
|
| 2088 |
|
| 2089 |
+
print("🎓 AdaptLearn Enhanced - Gemma 3 Multimodal Edition Seguro!")
|
| 2090 |
+
print("🔐 Configuração segura com secrets - zero tokens hardcoded")
|
| 2091 |
print("🧠 Prioriza Gemma 3 multimodal AI com sistemas de fallback inteligentes")
|
| 2092 |
print("🚀 Execute main() para lançar a aplicação aprimorada com Gemma 3")
|
| 2093 |
+
print("💡 Configure HF_TOKEN nas secrets do Space para ativar Gemma 3!")
|