import gradio as gr from typing import List, Dict from gradio_client import Client def create_chat_app(): TRANSLATIONS = { "en": { "title": "🤖 Chat with Llama 3.3 70B", "description": """ This is a chatbot based on the Llama 3.3 70B model. To use: 1. Type your message in the field below 2. Adjust parameters as needed 3. Click Send or press Enter """, "system_message": "You are a helpful and friendly assistant based on the Llama 3.3 70B model.", "system_message_label": "System Message", "max_tokens_label": "Maximum Tokens", "temperature_label": "Temperature", "top_p_label": "Top-p (Nucleus Sampling)", "message_placeholder": "Type your message here...", "send_button": "Send", "clear_button": "Clear Chat", "info_section": """ ### ℹ️ Information - Model: Llama 3.3 70B Instruct - Language: English/Portuguese - Hosting: Hugging Face Spaces """, "error_message": "Sorry, an error occurred: {}\nPlease check your connection and settings.", "examples": [ "Hello! How are you?", "Can you explain what artificial intelligence is?", "What is the capital of Brazil?", "Help me write a Python code to calculate Fibonacci." ] }, "pt": { "title": "🤖 Chat com Llama 3.3 70B em Português", "description": """ Este é um chatbot baseado no modelo Llama 3.3 70B. Para usar: 1. Digite sua mensagem no campo abaixo 2. Ajuste os parâmetros conforme necessário 3. Clique em Enviar ou pressione Enter """, "system_message": "Você é um assistente amigável e prestativo que responde em português. Você é baseado no modelo Llama 3.3 70B.", "system_message_label": "Mensagem do Sistema", "max_tokens_label": "Máximo de Tokens", "temperature_label": "Temperatura", "top_p_label": "Top-p (Amostragem Nucleus)", "message_placeholder": "Digite sua mensagem aqui...", "send_button": "Enviar", "clear_button": "Limpar Chat", "info_section": """ ### ℹ️ Informações - Modelo: Llama 3.3 70B Instruct - Idioma: Português/Inglês - Hospedagem: Hugging Face Spaces """, "error_message": "Desculpe, ocorreu um erro: {}\nPor favor, verifique sua conexão e configurações.", "examples": [ "Olá! Como você está?", "Pode me explicar o que é inteligência artificial?", "Qual é a capital do Brasil?", "Me ajude a escrever um código em Python para calcular fibonacci." ] } } def respond( message: str, chat_history: List[Dict], system_message: str, max_tokens: int, temperature: float, top_p: float, language: str, ): if not message.strip(): # Não processa mensagens vazias return chat_history, "" try: client = Client("aifeifei798/feifei-chat") formatted_message = f"{system_message}\n\nConversation history:\n" for msg in chat_history: formatted_message += f"{msg['role']}: {msg['content']}\n" formatted_message += f"User: {message}" message_payload = { "text": formatted_message, "files": [] } response = client.predict( message=message_payload, feifei_select=True, additional_dropdown="meta-llama/Llama-3.3-70B-Instruct", image_mod="pixtral", api_name="/chat" ) chat_history.extend([ {"role": "user", "content": message}, {"role": "assistant", "content": response} ]) return chat_history, "" except Exception as e: error_msg = TRANSLATIONS[language]["error_message"].format(str(e)) chat_history.append({"role": "assistant", "content": error_msg}) return chat_history, "" with gr.Blocks(theme=gr.themes.Soft()) as demo: current_language = gr.State("en") gr.Markdown(TRANSLATIONS["en"]["title"]) gr.Markdown(TRANSLATIONS["en"]["description"]) with gr.Group(): chatbot = gr.Chatbot( value=[], height=400, type="messages" ) with gr.Row(): message = gr.Textbox( placeholder=TRANSLATIONS["en"]["message_placeholder"], lines=3, scale=9 # Ocupa 90% do espaço ) send_btn = gr.Button( TRANSLATIONS["en"]["send_button"], variant="primary", scale=1 # Ocupa 10% do espaço ) with gr.Accordion("Settings/Configurações", open=False): system_message = gr.Textbox( value=TRANSLATIONS["en"]["system_message"], label=TRANSLATIONS["en"]["system_message_label"] ) with gr.Row(): max_tokens = gr.Slider( minimum=1, maximum=4096, value=2048, step=1, label=TRANSLATIONS["en"]["max_tokens_label"] ) temperature = gr.Slider( minimum=0.1, maximum=2.0, value=0.7, step=0.1, label=TRANSLATIONS["en"]["temperature_label"] ) top_p = gr.Slider( minimum=0.1, maximum=1.0, value=0.95, step=0.05, label=TRANSLATIONS["en"]["top_p_label"] ) with gr.Row(): language_selector = gr.Radio( choices=["en", "pt"], value="en", label="Language/Idioma", interactive=True ) clear_btn = gr.Button(TRANSLATIONS["en"]["clear_button"]) gr.Markdown(TRANSLATIONS["en"]["info_section"]) gr.Examples( examples=TRANSLATIONS["en"]["examples"], inputs=message ) # Event handlers send_btn.click( respond, [message, chatbot, system_message, max_tokens, temperature, top_p, language_selector], [chatbot, message] ) message.submit( # Permite também enviar com Enter respond, [message, chatbot, system_message, max_tokens, temperature, top_p, language_selector], [chatbot, message] ) clear_btn.click(lambda: ([], ""), outputs=[chatbot, message]) def update_language(lang): trans = TRANSLATIONS[lang] return ( trans["message_placeholder"], trans["system_message"], trans["system_message_label"], trans["max_tokens_label"], trans["temperature_label"], trans["top_p_label"], trans["send_button"], trans["clear_button"] ) language_selector.change( update_language, inputs=[language_selector], outputs=[ message, system_message, system_message, max_tokens, temperature, top_p, send_btn, clear_btn ] ) return demo if __name__ == "__main__": demo = create_chat_app() demo.launch(share=False)