File size: 3,538 Bytes
a73f817
 
50f7f91
 
 
a73f817
50f7f91
 
 
a73f817
50f7f91
 
 
 
 
 
 
a73f817
 
50f7f91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a73f817
50f7f91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a73f817
 
50f7f91
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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
111
112
113
114
115
116
117
118
119
120
import gradio as gr
from huggingface_hub import InferenceClient
import os
from typing import List, Tuple
import time

# Configuração do cliente
HF_TOKEN = os.getenv("HF_TOKEN")  # Token deve ser configurado como variável de ambiente
MODEL_ID = "meta-llama/Llama-3.2-1B"

try:
    client = InferenceClient(
        MODEL_ID,
        token=HF_TOKEN
    )
except Exception as e:
    print(f"Erro ao inicializar o cliente: {str(e)}")

def respond(
    mensagem: str,
    historico: List[Tuple[str, str]],
    mensagem_sistema: str,
    max_tokens: int,
    temperatura: float,
    top_p: float,
) -> str:
    """
    Processa a mensagem do usuário e gera uma resposta.
    """
    try:
        # Formata as mensagens no formato correto
        messages = [{"role": "system", "content": mensagem_sistema}]
        
        for usuario, assistente in historico:
            if usuario:
                messages.append({"role": "user", "content": usuario})
            if assistente:
                messages.append({"role": "assistant", "content": assistente})
        
        messages.append({"role": "user", "content": mensagem})
        
        response = ""
        
        # Stream da resposta
        for chunk in client.chat_completion(
            messages,
            max_tokens=max_tokens,
            stream=True,
            temperature=temperatura,
            top_p=top_p,
        ):
            if hasattr(chunk.choices[0].delta, 'content'):
                token = chunk.choices[0].delta.content
                if token:
                    response += token
                    yield response
            
    except Exception as e:
        yield f"Desculpe, ocorreu um erro: {str(e)}\nPor favor, verifique sua conexão e configurações."

# Configuração da interface
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("""
    # 🤖 Chat com Llama em Português
    
    Este é um chatbot baseado no modelo Llama. Para usar:
    1. Configure seu token HF como variável de ambiente
    2. Ajuste os parâmetros conforme necessário
    3. Digite sua mensagem e pressione Enter
    """)
    
    chatbot = gr.ChatInterface(
        respond,
        additional_inputs=[
            gr.Textbox(
                value="Você é um assistente amigável e prestativo que responde em português.",
                label="Mensagem do Sistema"
            ),
            gr.Slider(
                minimum=1,
                maximum=2048,
                value=512,
                step=1,
                label="Máximo de Tokens"
            ),
            gr.Slider(
                minimum=0.1,
                maximum=4.0,
                value=0.7,
                step=0.1,
                label="Temperatura"
            ),
            gr.Slider(
                minimum=0.1,
                maximum=1.0,
                value=0.95,
                step=0.05,
                label="Top-p (Amostragem Nucleus)"
            ),
        ],
        title="Chat com Llama",
        description="Um chatbot interativo usando o modelo Llama.",
        examples=[
            ["Olá! Como você está?"],
            ["Pode me explicar o que é inteligência artificial?"],
            ["Qual é a capital do Brasil?"]
        ]
    )
    
    gr.Markdown("""
    ### ℹ️ Informações
    - Modelo: Llama
    - Idioma: Português
    - Stream: Ativado
    
    Para melhor desempenho, ajuste os parâmetros de acordo com suas necessidades.
    """)

if __name__ == "__main__":
    demo.launch(share=False)