aldohenrique commited on
Commit
721a95b
·
verified ·
1 Parent(s): 5461f60

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +164 -52
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 responder_como_aldo(pergunta: str, modelo_escolhido: str = "qwen2.5-7b") -> str:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- 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. "+pergunta
 
143
  messages = [
144
  {
145
  "role": "system",
146
- "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. Não responda nada se a pergunta não for sobre o universo de programação e tecnologia"
147
  },
148
  {
149
  "role": "user",
150
- "content": pergunta
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=500)
159
 
160
  # Limpar resposta se necessário
161
  if resposta.startswith("Assistente: "):
162
  resposta = resposta.replace("Assistente: ", "")
163
 
164
- return resposta.strip()
 
 
 
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(title="Dr. Aldo Henrique - API Externa", theme=gr.themes.Soft()) as interface:
205
- gr.Markdown("# 🤖 Pergunte ao Dr. Aldo Henrique")
206
- gr.Markdown("### Powered by Hugging Face API - Processamento na nuvem!")
207
- gr.Markdown("Dúvidas sobre C, Java, desenvolvimento web ou IA? O Dr. Aldo responde com clareza e profundidade.")
 
 
 
 
 
 
 
 
 
 
208
 
209
  with gr.Row():
210
- with gr.Column(scale=3):
 
 
211
  entrada = gr.Textbox(
212
- label="Sua Pergunta",
213
- placeholder="Ex: Como usar ponteiros em C?",
214
- lines=4
 
215
  )
216
 
217
  modelo_select = gr.Dropdown(
218
  choices=list(MODELS.keys()),
219
- value="qwen2.5-7b",
220
- label="Modelo de IA",
221
- info="Escolha o modelo para responder"
222
  )
223
 
224
  with gr.Row():
225
- botao_perguntar = gr.Button("🤔 Perguntar", variant="primary")
226
- botao_testar = gr.Button("🔍 Testar Modelos", variant="secondary")
 
 
 
 
 
 
 
227
 
228
- with gr.Column(scale=4):
229
- saida = gr.Textbox(
230
- label="Resposta do Dr. Aldo",
231
- lines=12,
232
- interactive=False
 
 
233
  )
234
 
235
- # Exemplos
236
- gr.Examples(
237
- examples=[
238
- ["Como implementar uma lista ligada em C?", "qwen2.5-3b"],
239
- ["Qual a diferença entre == e equals() em Java?", "phi3-mini"],
240
- ["Como funciona o machine learning?", "llama3.2-3b"],
241
- ["Explique os conceitos de HTML, CSS e JavaScript", "mistral-7b"],
242
- ["O que são algoritmos de ordenação e qual é mais eficiente?", "gemma2-2b"]
243
- ],
244
- inputs=[entrada, modelo_select]
245
- )
 
 
 
246
 
247
- # Status da API
248
- status_api = gr.Textbox(
249
- label="Status da API",
250
- interactive=False,
251
- visible=False
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
- ).then(
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 API Externa...")
272
  print(f"🔑 Token HF encontrado: {HF_TOKEN[:8]}...")
273
- print("🌐 Teste a conexão antes de usar!")
 
274
 
275
  interface.launch(
276
  server_name="0.0.0.0",
277
  server_port=7860,
278
  share=False,
279
- max_threads=8 # Pode aumentar já que não há processamento local pesado
 
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
  )