Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -2,6 +2,7 @@ import gradio as gr
|
|
| 2 |
import requests
|
| 3 |
import os
|
| 4 |
import json
|
|
|
|
| 5 |
from typing import Dict, Any
|
| 6 |
|
| 7 |
# Configuração da API
|
|
@@ -13,11 +14,8 @@ if not HF_TOKEN:
|
|
| 13 |
MODELS = {
|
| 14 |
"phi3-mini": "microsoft/Phi-3-mini-4k-instruct",
|
| 15 |
"llama3.1-8b": "meta-llama/Llama-3.1-8B-Instruct",
|
| 16 |
-
"gemma2-2b": "google/gemma-2-2b-it",
|
| 17 |
"mistral-7b": "mistralai/Mistral-7B-Instruct-v0.3",
|
| 18 |
"zephyr7b": "HuggingFaceH4/zephyr-7b-beta",
|
| 19 |
-
"openhermes": "teknium/OpenHermes-2.5-Mistral-7B",
|
| 20 |
-
"babelia": "CAiRE/Babelia-7B"
|
| 21 |
}
|
| 22 |
|
| 23 |
# Modelo padrão (mais confiável)
|
|
@@ -132,22 +130,57 @@ class HuggingFaceAPIClient:
|
|
| 132 |
# Inicializar cliente da API
|
| 133 |
api_client = HuggingFaceAPIClient(HF_TOKEN)
|
| 134 |
|
| 135 |
-
def
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 136 |
"""Função principal para gerar respostas via API"""
|
| 137 |
if not pergunta.strip():
|
| 138 |
return "Por favor, faça uma pergunta."
|
| 139 |
|
| 140 |
try:
|
| 141 |
# Preparar mensagens
|
| 142 |
-
|
|
|
|
| 143 |
messages = [
|
| 144 |
{
|
| 145 |
"role": "system",
|
| 146 |
-
"content": "Você é o professor Dr. Aldo Henrique, especialista em C, Java, desenvolvimento web e inteligência artificial.
|
| 147 |
},
|
| 148 |
{
|
| 149 |
"role": "user",
|
| 150 |
-
"content":
|
| 151 |
}
|
| 152 |
]
|
| 153 |
|
|
@@ -155,13 +188,16 @@ def responder_como_aldo(pergunta: str, modelo_escolhido: str = "qwen2.5-7b") ->
|
|
| 155 |
model_name = MODELS.get(modelo_escolhido, DEFAULT_MODEL)
|
| 156 |
|
| 157 |
# Fazer requisição
|
| 158 |
-
resposta = api_client.query_model(model_name, messages, max_tokens=
|
| 159 |
|
| 160 |
# Limpar resposta se necessário
|
| 161 |
if resposta.startswith("Assistente: "):
|
| 162 |
resposta = resposta.replace("Assistente: ", "")
|
| 163 |
|
| 164 |
-
|
|
|
|
|
|
|
|
|
|
| 165 |
|
| 166 |
except Exception as e:
|
| 167 |
return f"Erro ao processar sua pergunta: {str(e)}"
|
|
@@ -200,81 +236,157 @@ def testar_todos_modelos():
|
|
| 200 |
resultados.append(f"{nome}: {status}")
|
| 201 |
return "\n".join(resultados)
|
| 202 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 203 |
# Interface Gradio
|
| 204 |
-
with gr.Blocks(
|
| 205 |
-
|
| 206 |
-
gr.
|
| 207 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 208 |
|
| 209 |
with gr.Row():
|
| 210 |
-
|
|
|
|
|
|
|
| 211 |
entrada = gr.Textbox(
|
| 212 |
-
label="
|
| 213 |
-
placeholder="Ex: Como
|
| 214 |
-
lines=
|
|
|
|
| 215 |
)
|
| 216 |
|
| 217 |
modelo_select = gr.Dropdown(
|
| 218 |
choices=list(MODELS.keys()),
|
| 219 |
-
value="
|
| 220 |
-
label="Modelo de IA",
|
| 221 |
-
info="Escolha o modelo para responder"
|
| 222 |
)
|
| 223 |
|
| 224 |
with gr.Row():
|
| 225 |
-
botao_perguntar = gr.Button(
|
| 226 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 227 |
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
|
|
|
|
|
|
| 233 |
)
|
| 234 |
|
| 235 |
-
#
|
| 236 |
-
gr.
|
| 237 |
-
|
| 238 |
-
[
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
|
|
|
|
|
|
|
|
|
| 246 |
|
| 247 |
-
# Status da API
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 253 |
|
| 254 |
# Eventos
|
| 255 |
botao_perguntar.click(
|
| 256 |
fn=responder_como_aldo,
|
| 257 |
inputs=[entrada, modelo_select],
|
| 258 |
-
outputs=saida
|
|
|
|
| 259 |
)
|
| 260 |
|
| 261 |
botao_testar.click(
|
| 262 |
fn=testar_todos_modelos,
|
| 263 |
-
outputs=status_api
|
| 264 |
-
|
| 265 |
-
lambda: gr.update(visible=True),
|
| 266 |
-
outputs=status_api
|
| 267 |
)
|
| 268 |
|
| 269 |
# Lançar aplicação
|
| 270 |
if __name__ == "__main__":
|
| 271 |
-
print("🚀 Iniciando Dr. Aldo Henrique com
|
| 272 |
print(f"🔑 Token HF encontrado: {HF_TOKEN[:8]}...")
|
| 273 |
-
print("🌐
|
|
|
|
| 274 |
|
| 275 |
interface.launch(
|
| 276 |
server_name="0.0.0.0",
|
| 277 |
server_port=7860,
|
| 278 |
share=False,
|
| 279 |
-
max_threads=8
|
|
|
|
| 280 |
)
|
|
|
|
| 2 |
import requests
|
| 3 |
import os
|
| 4 |
import json
|
| 5 |
+
import re
|
| 6 |
from typing import Dict, Any
|
| 7 |
|
| 8 |
# Configuração da API
|
|
|
|
| 14 |
MODELS = {
|
| 15 |
"phi3-mini": "microsoft/Phi-3-mini-4k-instruct",
|
| 16 |
"llama3.1-8b": "meta-llama/Llama-3.1-8B-Instruct",
|
|
|
|
| 17 |
"mistral-7b": "mistralai/Mistral-7B-Instruct-v0.3",
|
| 18 |
"zephyr7b": "HuggingFaceH4/zephyr-7b-beta",
|
|
|
|
|
|
|
| 19 |
}
|
| 20 |
|
| 21 |
# Modelo padrão (mais confiável)
|
|
|
|
| 130 |
# Inicializar cliente da API
|
| 131 |
api_client = HuggingFaceAPIClient(HF_TOKEN)
|
| 132 |
|
| 133 |
+
def formatar_resposta_com_codigo(resposta: str) -> str:
|
| 134 |
+
"""Formata a resposta destacando códigos em blocos separados"""
|
| 135 |
+
if not resposta:
|
| 136 |
+
return resposta
|
| 137 |
+
|
| 138 |
+
# Detecta blocos de código com ```
|
| 139 |
+
resposta_formatada = re.sub(
|
| 140 |
+
r'```(\w+)?\n(.*?)\n```',
|
| 141 |
+
r'<div style="background-color: #f8f9fa; border: 1px solid #e9ecef; border-radius: 8px; padding: 15px; margin: 10px 0; font-family: Monaco, Consolas, monospace; overflow-x: auto;"><strong>💻 Código:</strong><br><pre style="margin: 5px 0; white-space: pre-wrap; word-wrap: break-word;"><code>\2</code></pre></div>',
|
| 142 |
+
resposta,
|
| 143 |
+
flags=re.DOTALL
|
| 144 |
+
)
|
| 145 |
+
|
| 146 |
+
# Detecta código inline com `
|
| 147 |
+
resposta_formatada = re.sub(
|
| 148 |
+
r'`([^`]+)`',
|
| 149 |
+
r'<code style="background-color: #f1f3f4; padding: 2px 4px; border-radius: 4px; font-family: Monaco, Consolas, monospace;">\1</code>',
|
| 150 |
+
resposta_formatada
|
| 151 |
+
)
|
| 152 |
+
|
| 153 |
+
# Adiciona quebras de linha para melhor visualização
|
| 154 |
+
resposta_formatada = resposta_formatada.replace('\n\n', '<br><br>')
|
| 155 |
+
resposta_formatada = resposta_formatada.replace('\n', '<br>')
|
| 156 |
+
|
| 157 |
+
# Destaca títulos/seções
|
| 158 |
+
resposta_formatada = re.sub(
|
| 159 |
+
r'^\*\*(.*?)\*\*',
|
| 160 |
+
r'<h3 style="color: #1976d2; margin-top: 20px; margin-bottom: 10px;">\1</h3>',
|
| 161 |
+
resposta_formatada,
|
| 162 |
+
flags=re.MULTILINE
|
| 163 |
+
)
|
| 164 |
+
|
| 165 |
+
return resposta_formatada
|
| 166 |
+
|
| 167 |
+
def responder_como_aldo(pergunta: str, modelo_escolhido: str = "phi3-mini") -> str:
|
| 168 |
"""Função principal para gerar respostas via API"""
|
| 169 |
if not pergunta.strip():
|
| 170 |
return "Por favor, faça uma pergunta."
|
| 171 |
|
| 172 |
try:
|
| 173 |
# Preparar mensagens
|
| 174 |
+
pergunta_completa = f"{pergunta} Não responda nada se a pergunta não for sobre o universo de programação e tecnologia, informe que o Dr. Aldo Henrique só tem domínio em TI. Você é o Professor Dr. Aldo Henrique, foque em explicar e não em só mostrar o resultado. Quando apresentar código, use blocos de código formatados com ```."
|
| 175 |
+
|
| 176 |
messages = [
|
| 177 |
{
|
| 178 |
"role": "system",
|
| 179 |
+
"content": "Você é o professor Dr. Aldo Henrique, especialista em C, Java, desenvolvimento web e inteligência artificial. Responda com clareza, profundidade e tom acadêmico, como um professor experiente. Evite respostas genéricas e forneça exemplos práticos quando aplicável. Foque em explicar e não em só mostrar o resultado. Responda sempre em português brasileiro. Use blocos de código formatados com ``` quando apresentar código. Não responda nada se a pergunta não for sobre o universo de programação e tecnologia."
|
| 180 |
},
|
| 181 |
{
|
| 182 |
"role": "user",
|
| 183 |
+
"content": pergunta_completa
|
| 184 |
}
|
| 185 |
]
|
| 186 |
|
|
|
|
| 188 |
model_name = MODELS.get(modelo_escolhido, DEFAULT_MODEL)
|
| 189 |
|
| 190 |
# Fazer requisição
|
| 191 |
+
resposta = api_client.query_model(model_name, messages, max_tokens=800)
|
| 192 |
|
| 193 |
# Limpar resposta se necessário
|
| 194 |
if resposta.startswith("Assistente: "):
|
| 195 |
resposta = resposta.replace("Assistente: ", "")
|
| 196 |
|
| 197 |
+
# Formatar resposta com código
|
| 198 |
+
resposta_formatada = formatar_resposta_com_codigo(resposta.strip())
|
| 199 |
+
|
| 200 |
+
return resposta_formatada
|
| 201 |
|
| 202 |
except Exception as e:
|
| 203 |
return f"Erro ao processar sua pergunta: {str(e)}"
|
|
|
|
| 236 |
resultados.append(f"{nome}: {status}")
|
| 237 |
return "\n".join(resultados)
|
| 238 |
|
| 239 |
+
# CSS customizado para melhor visualização
|
| 240 |
+
css_customizado = """
|
| 241 |
+
.gradio-container {
|
| 242 |
+
max-width: 1400px !important;
|
| 243 |
+
}
|
| 244 |
+
|
| 245 |
+
.gr-textbox textarea {
|
| 246 |
+
font-size: 14px !important;
|
| 247 |
+
line-height: 1.5 !important;
|
| 248 |
+
}
|
| 249 |
+
|
| 250 |
+
.resposta-container {
|
| 251 |
+
background-color: #fafafa !important;
|
| 252 |
+
border-radius: 10px !important;
|
| 253 |
+
padding: 20px !important;
|
| 254 |
+
margin: 10px 0 !important;
|
| 255 |
+
}
|
| 256 |
+
|
| 257 |
+
.pergunta-container {
|
| 258 |
+
background-color: #f0f8ff !important;
|
| 259 |
+
border-radius: 8px !important;
|
| 260 |
+
padding: 15px !important;
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
.titulo-principal {
|
| 264 |
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
|
| 265 |
+
color: white !important;
|
| 266 |
+
padding: 20px !important;
|
| 267 |
+
border-radius: 10px !important;
|
| 268 |
+
margin-bottom: 20px !important;
|
| 269 |
+
text-align: center !important;
|
| 270 |
+
}
|
| 271 |
+
"""
|
| 272 |
+
|
| 273 |
# Interface Gradio
|
| 274 |
+
with gr.Blocks(
|
| 275 |
+
title="Dr. Aldo Henrique - API Externa",
|
| 276 |
+
theme=gr.themes.Soft(),
|
| 277 |
+
css=css_customizado
|
| 278 |
+
) as interface:
|
| 279 |
+
|
| 280 |
+
# Cabeçalho estilizado
|
| 281 |
+
gr.HTML("""
|
| 282 |
+
<div class="titulo-principal">
|
| 283 |
+
<h1>🤖 Dr. Aldo Henrique - Especialista em TI</h1>
|
| 284 |
+
<p style="font-size: 18px; margin: 10px 0;">Powered by Hugging Face API - Processamento Avançado na Nuvem</p>
|
| 285 |
+
<p style="font-size: 14px; opacity: 0.9;">Dúvidas sobre C, Java, desenvolvimento web, IA e muito mais!</p>
|
| 286 |
+
</div>
|
| 287 |
+
""")
|
| 288 |
|
| 289 |
with gr.Row():
|
| 290 |
+
# Coluna da esquerda - Entrada
|
| 291 |
+
with gr.Column(scale=2):
|
| 292 |
+
gr.Markdown("### 📝 Faça sua pergunta:")
|
| 293 |
entrada = gr.Textbox(
|
| 294 |
+
label="",
|
| 295 |
+
placeholder="Ex: Como implementar uma árvore binária em C?\nEx: Qual a diferença entre Spring Boot e Spring MVC?\nEx: Como funciona o algoritmo de backpropagation?",
|
| 296 |
+
lines=6,
|
| 297 |
+
elem_classes="pergunta-container"
|
| 298 |
)
|
| 299 |
|
| 300 |
modelo_select = gr.Dropdown(
|
| 301 |
choices=list(MODELS.keys()),
|
| 302 |
+
value="phi3-mini",
|
| 303 |
+
label="🧠 Modelo de IA",
|
| 304 |
+
info="Escolha o modelo para responder sua pergunta"
|
| 305 |
)
|
| 306 |
|
| 307 |
with gr.Row():
|
| 308 |
+
botao_perguntar = gr.Button(
|
| 309 |
+
"🤔 Perguntar ao Dr. Aldo",
|
| 310 |
+
variant="primary",
|
| 311 |
+
size="lg"
|
| 312 |
+
)
|
| 313 |
+
botao_testar = gr.Button(
|
| 314 |
+
"🔍 Testar Modelos",
|
| 315 |
+
variant="secondary"
|
| 316 |
+
)
|
| 317 |
|
| 318 |
+
# Coluna da direita - Saída (MAIOR)
|
| 319 |
+
with gr.Column(scale=3):
|
| 320 |
+
gr.Markdown("### 💬 Resposta do Dr. Aldo Henrique:")
|
| 321 |
+
saida = gr.HTML(
|
| 322 |
+
label="",
|
| 323 |
+
value="<div style='padding: 20px; text-align: center; color: #666;'>Aguardando sua pergunta...</div>",
|
| 324 |
+
elem_classes="resposta-container"
|
| 325 |
)
|
| 326 |
|
| 327 |
+
# Seção expandida para exemplos
|
| 328 |
+
with gr.Accordion("📚 Exemplos de Perguntas", open=False):
|
| 329 |
+
gr.Examples(
|
| 330 |
+
examples=[
|
| 331 |
+
["Como implementar uma lista ligada em C com todas as operações básicas?", "phi3-mini"],
|
| 332 |
+
["Explique a diferença entre == e equals() em Java com exemplos práticos", "gemma2-2b"],
|
| 333 |
+
["Como funciona o algoritmo de machine learning Random Forest?", "llama3.1-8b"],
|
| 334 |
+
["Mostre como criar uma API REST completa com Spring Boot", "mistral-7b"],
|
| 335 |
+
["Explique os conceitos de HTML5, CSS3 e JavaScript ES6 com exemplos", "zephyr7b"],
|
| 336 |
+
["Como implementar algoritmos de ordenação eficientes em C?", "openhermes"],
|
| 337 |
+
["Explique redes neurais convolucionais para iniciantes", "babelia"]
|
| 338 |
+
],
|
| 339 |
+
inputs=[entrada, modelo_select]
|
| 340 |
+
)
|
| 341 |
|
| 342 |
+
# Status da API (expandível)
|
| 343 |
+
with gr.Accordion("🔧 Status da API", open=False):
|
| 344 |
+
status_api = gr.Textbox(
|
| 345 |
+
label="Status dos Modelos",
|
| 346 |
+
interactive=False,
|
| 347 |
+
lines=8
|
| 348 |
+
)
|
| 349 |
+
|
| 350 |
+
# Informações adicionais
|
| 351 |
+
with gr.Accordion("ℹ️ Informações", open=False):
|
| 352 |
+
gr.Markdown("""
|
| 353 |
+
### Sobre o Dr. Aldo Henrique:
|
| 354 |
+
- **Especialidade**: Linguagens C, Java, Desenvolvimento Web, Inteligência Artificial
|
| 355 |
+
- **Foco**: Explicações didáticas e exemplos práticos
|
| 356 |
+
- **Abordagem**: Acadêmica e profissional
|
| 357 |
+
|
| 358 |
+
### Dicas para melhores respostas:
|
| 359 |
+
- Seja específico em suas perguntas
|
| 360 |
+
- Mencione o contexto (iniciante, intermediário, avançado)
|
| 361 |
+
- Peça exemplos práticos quando necessário
|
| 362 |
+
- Experimente diferentes modelos para comparar respostas
|
| 363 |
+
""")
|
| 364 |
|
| 365 |
# Eventos
|
| 366 |
botao_perguntar.click(
|
| 367 |
fn=responder_como_aldo,
|
| 368 |
inputs=[entrada, modelo_select],
|
| 369 |
+
outputs=saida,
|
| 370 |
+
show_progress=True
|
| 371 |
)
|
| 372 |
|
| 373 |
botao_testar.click(
|
| 374 |
fn=testar_todos_modelos,
|
| 375 |
+
outputs=status_api,
|
| 376 |
+
show_progress=True
|
|
|
|
|
|
|
| 377 |
)
|
| 378 |
|
| 379 |
# Lançar aplicação
|
| 380 |
if __name__ == "__main__":
|
| 381 |
+
print("🚀 Iniciando Dr. Aldo Henrique com Interface Melhorada...")
|
| 382 |
print(f"🔑 Token HF encontrado: {HF_TOKEN[:8]}...")
|
| 383 |
+
print("🌐 Interface otimizada para melhor visualização!")
|
| 384 |
+
print("💻 Formatação especial para códigos implementada!")
|
| 385 |
|
| 386 |
interface.launch(
|
| 387 |
server_name="0.0.0.0",
|
| 388 |
server_port=7860,
|
| 389 |
share=False,
|
| 390 |
+
max_threads=8,
|
| 391 |
+
show_error=True
|
| 392 |
)
|