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