Spaces:
Running
Running
Update interface.py
Browse files- interface.py +73 -108
interface.py
CHANGED
|
@@ -1,136 +1,101 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
-
from ai_logic import
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
MODELS,
|
| 6 |
-
DEFAULT_MODEL
|
| 7 |
-
)
|
| 8 |
-
import time # Importe 'time' para simular a espera, se necessário para testes
|
| 9 |
-
|
| 10 |
-
# --- CSS (sem alterações) ---
|
| 11 |
css_customizado = """
|
| 12 |
.gradio-container { max-width: 1400px !important; margin: 0 auto; width: 99%; }
|
| 13 |
-
|
| 14 |
-
.
|
| 15 |
-
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
|
| 16 |
-
color: white !important; padding: 20px !important;
|
| 17 |
-
border-radius: 10px !important; margin-bottom: 20px !important;
|
| 18 |
-
text-align: center !important;
|
| 19 |
-
}
|
| 20 |
"""
|
| 21 |
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
"""
|
| 25 |
-
Gerencia a interação no chat com um indicador de "digitando...".
|
| 26 |
-
"""
|
| 27 |
-
# Define a mensagem de "digitando..." que será exibida.
|
| 28 |
-
# Usamos um pouco de HTML para estilizar a mensagem.
|
| 29 |
-
mensagem_digitando = """
|
| 30 |
-
<div style='color: #888; font-style: italic;'>
|
| 31 |
-
Dr. Aldo Henrique está digitando... ✍️
|
| 32 |
-
</div>
|
| 33 |
-
"""
|
| 34 |
-
|
| 35 |
-
# 1. Adiciona a pergunta do usuário e a mensagem "digitando..." ao histórico.
|
| 36 |
-
historico_chat.append((pergunta, mensagem_digitando))
|
| 37 |
-
|
| 38 |
-
# 2. Atualiza a interface: exibe a pergunta e o indicador "digitando...",
|
| 39 |
-
# enquanto limpa e desativa a caixa de entrada.
|
| 40 |
-
yield historico_chat, gr.update(value="", interactive=False)
|
| 41 |
-
|
| 42 |
-
# 3. Chama a lógica da IA para obter a resposta (esta é a parte demorada).
|
| 43 |
-
# Para simular a demora, você pode usar: time.sleep(3)
|
| 44 |
-
resposta_ia = responder_como_aldo(pergunta, modelo_selecionado)
|
| 45 |
-
|
| 46 |
-
# 4. Substitui a mensagem "digitando..." pela resposta final da IA.
|
| 47 |
-
historico_chat[-1] = (pergunta, resposta_ia)
|
| 48 |
-
|
| 49 |
-
# 5. Atualiza a interface com a resposta final e reativa a caixa de entrada.
|
| 50 |
-
yield historico_chat, gr.update(interactive=True)
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
def criar_interface_chat():
|
| 54 |
-
"""Cria e retorna a nova interface Gradio no estilo chat (função completa para referência)"""
|
| 55 |
|
| 56 |
-
with gr.Blocks(title="Dr. Aldo Henrique -
|
|
|
|
| 57 |
gr.HTML("""
|
| 58 |
-
<div class="titulo-principal">
|
| 59 |
-
<h1>🤖 Dr. Aldo Henrique - Foco em TI com diferentes modelos de IA
|
| 60 |
<p style="font-size: 14px; opacity: 0.9;">Conhecimento enriquecido com o conteúdo do <a href="https://aldohenrique.com.br/" style="color: white; text-decoration: underline;">Blog do Prof. Dr. Aldo Henrique</a></p>
|
| 61 |
</div>
|
| 62 |
""")
|
| 63 |
|
| 64 |
-
|
| 65 |
-
label="Conversa",
|
| 66 |
-
elem_id="chatbot",
|
| 67 |
-
bubble_full_width=False,
|
| 68 |
-
)
|
| 69 |
|
| 70 |
-
with gr.Row(
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
show_label=False,
|
| 74 |
-
|
| 75 |
-
container=False,
|
| 76 |
)
|
| 77 |
modelo_select = gr.Dropdown(
|
| 78 |
choices=list(MODELS.keys()),
|
| 79 |
value=DEFAULT_MODEL,
|
| 80 |
-
label="Modelo de IA",
|
| 81 |
-
|
|
|
|
| 82 |
)
|
| 83 |
-
botao_enviar = gr.Button("Enviar", variant="primary", scale=1, min_width=100)
|
| 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 |
-
# As conexões de eventos continuam as mesmas, pois a assinatura da função não mudou.
|
| 111 |
-
entrada_msg.submit(
|
| 112 |
-
fn=chat_responder,
|
| 113 |
-
inputs=[entrada_msg, chatbot, modelo_select],
|
| 114 |
-
outputs=[chatbot, entrada_msg],
|
| 115 |
-
)
|
| 116 |
-
botao_enviar.click(
|
| 117 |
-
fn=chat_responder,
|
| 118 |
-
inputs=[entrada_msg, chatbot, modelo_select],
|
| 119 |
-
outputs=[chatbot, entrada_msg],
|
| 120 |
-
api_name="enviar_mensagem"
|
| 121 |
-
)
|
| 122 |
botao_retreinar.click(
|
| 123 |
fn=build_and_save_vector_store,
|
| 124 |
outputs=[status_rag, download_faiss_file, download_urls_file],
|
| 125 |
show_progress=True
|
| 126 |
)
|
| 127 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
return interface
|
| 129 |
|
| 130 |
def configurar_interface():
|
| 131 |
"""Configura e retorna a interface pronta para lançamento"""
|
| 132 |
-
return
|
| 133 |
-
|
| 134 |
-
# if __name__ == "__main__":
|
| 135 |
-
# minha_interface = configurar_interface()
|
| 136 |
-
# minha_interface.launch()
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
+
from ai_logic import responder_como_aldo, build_and_save_vector_store, testar_todos_modelos, MODELS, DEFAULT_MODEL
|
| 3 |
+
|
| 4 |
+
# CSS personalizado
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
css_customizado = """
|
| 6 |
.gradio-container { max-width: 1400px !important; margin: 0 auto; width: 99%; }
|
| 7 |
+
.gr-textbox textarea { font-size: 14px !important; line-height: 1.5 !important; }
|
| 8 |
+
.modelo-dropdown { margin-bottom: 15px !important; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
"""
|
| 10 |
|
| 11 |
+
def criar_interface():
|
| 12 |
+
"""Cria e retorna a interface Gradio em formato de chat"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
|
| 14 |
+
with gr.Blocks(title="Dr. Aldo Henrique - Chat IA", theme=gr.themes.Soft(), css=css_customizado) as interface:
|
| 15 |
+
# Cabeçalho
|
| 16 |
gr.HTML("""
|
| 17 |
+
<div class="titulo-principal" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 20px; border-radius: 10px; margin-bottom: 20px; text-align: center;">
|
| 18 |
+
<h1>🤖 Dr. Aldo Henrique - Foco em TI com diferentes modelos de IA</h1>
|
| 19 |
<p style="font-size: 14px; opacity: 0.9;">Conhecimento enriquecido com o conteúdo do <a href="https://aldohenrique.com.br/" style="color: white; text-decoration: underline;">Blog do Prof. Dr. Aldo Henrique</a></p>
|
| 20 |
</div>
|
| 21 |
""")
|
| 22 |
|
| 23 |
+
chat = gr.Chatbot(label="💬 Conversa com Dr. Aldo Henrique", show_label=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
+
with gr.Row():
|
| 26 |
+
entrada = gr.Textbox(
|
| 27 |
+
placeholder="Digite sua pergunta aqui e pressione Enter...",
|
| 28 |
+
show_label=False,
|
| 29 |
+
lines=3
|
|
|
|
| 30 |
)
|
| 31 |
modelo_select = gr.Dropdown(
|
| 32 |
choices=list(MODELS.keys()),
|
| 33 |
value=DEFAULT_MODEL,
|
| 34 |
+
label="🧠 Selecione o Modelo de IA",
|
| 35 |
+
info="Escolha o modelo para responder",
|
| 36 |
+
elem_classes="modelo-dropdown"
|
| 37 |
)
|
|
|
|
| 38 |
|
| 39 |
+
estado_chat = gr.State([]) # Para armazenar a conversa
|
| 40 |
+
|
| 41 |
+
def responder_mensagem(mensagem_usuario, modelo_escolhido, historico):
|
| 42 |
+
historico = historico or []
|
| 43 |
+
historico.append((mensagem_usuario, "🕒 Dr. Aldo Henrique está digitando..."))
|
| 44 |
+
yield gr.update(value=historico), historico
|
| 45 |
+
|
| 46 |
+
resposta = responder_como_aldo(mensagem_usuario, modelo_escolhido)
|
| 47 |
+
historico[-1] = (mensagem_usuario, resposta)
|
| 48 |
+
yield gr.update(value=historico), historico
|
| 49 |
+
|
| 50 |
+
entrada.submit(
|
| 51 |
+
responder_mensagem,
|
| 52 |
+
inputs=[entrada, modelo_select, estado_chat],
|
| 53 |
+
outputs=[chat, estado_chat],
|
| 54 |
+
show_progress=True
|
| 55 |
+
).then(lambda: "", None, entrada) # Limpa o campo de entrada após enviar
|
| 56 |
+
|
| 57 |
+
# --- SEÇÃO PARA CONTROLE DO RAG ---
|
| 58 |
+
with gr.Accordion("⚙️ Controle do Conhecimento (RAG)", open=False):
|
| 59 |
+
status_rag = gr.Textbox(label="Status do Retreino", interactive=False)
|
| 60 |
+
botao_retreinar = gr.Button("🔄 Atualizar Conhecimento do Blog", variant="stop")
|
| 61 |
+
download_faiss_file = gr.File(label="Download do Índice FAISS", interactive=False, file_count="single", file_types=[".pkl"])
|
| 62 |
+
download_urls_file = gr.File(label="Download das URLs Processadas", interactive=False, file_count="single", file_types=[".pkl"])
|
| 63 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
botao_retreinar.click(
|
| 65 |
fn=build_and_save_vector_store,
|
| 66 |
outputs=[status_rag, download_faiss_file, download_urls_file],
|
| 67 |
show_progress=True
|
| 68 |
)
|
| 69 |
|
| 70 |
+
# Exemplos
|
| 71 |
+
with gr.Accordion("📚 Exemplos de Perguntas", open=False):
|
| 72 |
+
gr.Examples(
|
| 73 |
+
examples=[
|
| 74 |
+
["Como implementar uma lista ligada em C com todas as operações básicas?", DEFAULT_MODEL],
|
| 75 |
+
["Qual a sua opinião sobre o uso de ponteiros em C++ moderno, baseada no seu blog?", "Mistral 7B"],
|
| 76 |
+
["Resuma o que você escreveu sobre machine learning no seu blog.", "Zephyr 7B"],
|
| 77 |
+
],
|
| 78 |
+
inputs=[entrada, modelo_select]
|
| 79 |
+
)
|
| 80 |
+
|
| 81 |
+
# Status da API
|
| 82 |
+
with gr.Accordion("🔧 Status da API", open=False):
|
| 83 |
+
status_api = gr.Textbox(label="Status dos Modelos", interactive=False, lines=8)
|
| 84 |
+
|
| 85 |
+
# Informações
|
| 86 |
+
with gr.Accordion("ℹ️ Informações", open=False):
|
| 87 |
+
gr.Markdown("""
|
| 88 |
+
### Sobre o Dr. Aldo Henrique:
|
| 89 |
+
- **Especialidade**: Linguagens C, Java, Desenvolvimento Web, Inteligência Artificial
|
| 90 |
+
- **Conhecimento Adicional**: Conteúdo do blog aldohenrique.com.br
|
| 91 |
+
|
| 92 |
+
### Dicas para melhores respostas:
|
| 93 |
+
- Faça perguntas específicas sobre o conteúdo do blog para ver o RAG em ação!
|
| 94 |
+
- Peça resumos ou opiniões sobre temas que o professor aborda.
|
| 95 |
+
""")
|
| 96 |
+
|
| 97 |
return interface
|
| 98 |
|
| 99 |
def configurar_interface():
|
| 100 |
"""Configura e retorna a interface pronta para lançamento"""
|
| 101 |
+
return criar_interface()
|
|
|
|
|
|
|
|
|
|
|
|