Benjamin / app.py
ceadibc's picture
Update app.py
97b2894 verified
raw
history blame
4.63 kB
import gradio as gr
from huggingface_hub import InferenceClient
import os
import sys
# --- Verificações de versão para depuração ---
print(f"Versão do Python: {sys.version}")
print(f"Versão do Gradio: {gr.__version__}")
# -------------------------------------------
# Configuração do Cliente de Inferência do Hugging Face
# Modelo: google/gemma-7b-it
# Você pode precisar de um token de acesso do Hugging Face (HUGGING_FACE_HUB_TOKEN)
# para evitar limites de taxa mais baixos ou se o modelo tiver restrições de acesso.
# Obtenha um token em: https://huggingface.co/settings/tokens
# Recomenda-se armazenar o token como uma variável de ambiente:
# Ex: export HUGGING_FACE_HUB_TOKEN="hf_SUA_CHAVE_AQUI"
HUGGING_FACE_TOKEN = os.getenv("HUGGING_FACE_HUB_TOKEN")
client = InferenceClient(
model="google/gemma-7b-it",
token=HUGGING_FACE_TOKEN # Será None se a variável de ambiente não estiver definida
)
# Função para processar a conversa com o modelo Gemma
def responder_gemma(mensagem, historico):
mensagens = []
if historico is None:
historico = []
# Constrói o histórico da conversa no formato esperado pela API de chat do Hugging Face
for item in historico:
if isinstance(item, list) and len(item) == 2:
user_msg, bot_msg = item
mensagens.append({"role": "user", "content": user_msg})
if bot_msg: # Adiciona a resposta do bot apenas se não for vazia
mensagens.append({"role": "assistant", "content": bot_msg})
# Adiciona a mensagem atual do usuário
mensagens.append({"role": "user", "content": mensagem})
resposta = "" # Variável para acumular a resposta do modelo
try:
# Chama a API de chat_completion do Hugging Face com o modelo Gemma
# O stream=True permite que a resposta seja construída e exibida em tempo real
for mensagem_chunk in client.chat_completion(
messages=mensagens, # O parâmetro é 'messages'
max_tokens=300, # Limite de tokens na resposta do modelo
stream=True, # Ativa o streaming da resposta
temperature=0.7, # Controla a aleatoriedade da resposta (0.0 a 1.0)
top_p=0.9, # Controla a diversidade da resposta (0.0 a 1.0)
):
# Verifica se o chunk da mensagem é válido
if not mensagem_chunk or not isinstance(mensagem_chunk, dict):
continue
try:
# Extrai o conteúdo da resposta do chunk
conteudo = mensagem_chunk["choices"][0]["delta"].get("content", "")
if conteudo.strip(): # Se houver conteúdo válido
resposta += conteudo
yield resposta # Envia a resposta parcial para a interface do Gradio
except (AttributeError, IndexError, KeyError) as e:
# Captura erros ao processar um chunk específico (ex: formato inesperado)
print(f"Erro ao processar mensagem do chunk: {e}")
continue # Continua para o próximo chunk
except Exception as e:
# Captura erros gerais na chamada da API (ex: problema de conexão, token inválido)
print(f"Erro inesperado ao chamar a API do Hugging Face com Gemma: {e}")
yield "Ocorreu um erro ao gerar a resposta. Por favor, tente novamente mais tarde."
# Mensagem de fallback se nenhuma resposta for gerada
if not resposta.strip():
yield "Nenhuma resposta gerada. Por favor, tente novamente."
# Definição da interface do chat com Gradio
demo = gr.ChatInterface(
responder_gemma, # A função que processa as mensagens do chat
title="Benjamin – Assistente Virtual da CEaD - IBC (Gemma-7B-IT)", # Título da interface
textbox=gr.Textbox(placeholder="Digite uma mensagem e depois tecle Enter", container=False, scale=7), # Configurações da caixa de texto
examples=[ # Exemplos de perguntas para facilitar o teste
"O que é o IBC?",
"Qual a missão da CEaD?",
"Quem foi Louis Braille?",
"Qual a importância da educação inclusiva?"
],
theme="soft", # Tema visual da interface
fill_height=True, # Preenche a altura disponível
retry_btn="Tentar novamente", # Botão para tentar a última pergunta novamente
undo_btn="Desfazer", # Botão para desfazer a última interação
clear_btn="Limpar conversa" # Botão para limpar todo o histórico da conversa
)
# Lança a interface do Gradio quando o script é executado
if __name__ == "__main__":
demo.launch()