File size: 3,228 Bytes
244d22f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Aplicação Local para LLMs voltados para Agentes
Roda modelos GGUF localmente usando llama-cpp-python
"""

from llama_cpp import Llama
import os
import sys

# Força encoding UTF-8
if sys.stdout.encoding != 'utf-8':
    sys.stdout.reconfigure(encoding='utf-8')
if sys.stdin.encoding != 'utf-8':
    sys.stdin.reconfigure(encoding='utf-8')

class LocalLLMAgent:
    def __init__(self, n_ctx: int = 2048):
        """
        Inicializa o agente LLM local
        
        Args:
            n_ctx: Tamanho do contexto (tokens)
        """
        #llama-2-7b.Q2_K.gguf
        model_path = "./models/llama-2-7b-chat.Q4_K_M.gguf"
        print(f"Carregando modelo: {model_path}")
        self.llm = Llama(
            model_path=model_path,
            chat_format="llama-2",
            verbose=False
        )
        print("Modelo carregado com sucesso!")
        # Inicializa com prompt do sistema em português
        self.messages = [
            {"role": "system", "content": "Responda sempre em português brasileiro de forma natural e conversacional."}
        ]
    
    def chat(self, user_message: str, max_tokens: int = 100, temperature: float = 0.7) -> str:
        """
        Gera resposta usando o formato de chat nativo
        
        Args:
            user_message: Mensagem do usuário
            max_tokens: Máximo de tokens na resposta
            temperature: Controle de criatividade (0.0 a 1.0)
            
        Returns:
            Resposta do modelo
        """
        # Adiciona mensagem do usuário
        self.messages.append({"role": "user", "content": user_message})
        
        # Gera resposta usando create_chat_completion conforme documentação
        response = self.llm.create_chat_completion(
            messages=self.messages,
            max_tokens=max_tokens,
            temperature=0.75
        )
        
        assistant_message = response['choices'][0]['message']['content']
        
        # Adiciona resposta do assistente ao histórico
        self.messages.append({"role": "assistant", "content": assistant_message})
        
        return assistant_message

def main():
    """Função principal - interface de terminal"""
    
    print("🧠 Aplicação Local para LLMs Agentes")
    print("=" * 40)
    
    try:
        agent = LocalLLMAgent()
        
        print("\n🧠 Agente LLM Local iniciado!")
        print("Digite 'sair' para encerrar\n")
        
        while True:
            try:
                user_input = input("Você: ").strip()
            except UnicodeDecodeError:
                user_input = input("Voce: ").strip()
            
            if user_input.lower() in ['sair', 'exit', 'quit']:
                print("Encerrando...")
                break
            
            if not user_input:
                continue
            
            print("Agente: ", end="", flush=True)
            response = agent.chat(user_input)
            print(response)
            print()
            
    except Exception as e:
        import traceback
        print(f"Erro: {e}")
        print("Detalhes do erro:")
        traceback.print_exc()

if __name__ == "__main__":
    main()