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()