Madras1 commited on
Commit
ad7d6b4
·
verified ·
1 Parent(s): 645a97d

Upload 12 files

Browse files
Files changed (2) hide show
  1. app.py +20 -2
  2. jade/core.py +13 -8
app.py CHANGED
@@ -18,13 +18,26 @@ app.add_middleware(
18
  allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"],
19
  )
20
 
 
 
 
21
  class UserRequest(BaseModel):
22
  user_input: str
23
  image_base64: str | None = None
 
24
 
25
  @app.post("/chat")
26
  def handle_chat(request: UserRequest):
27
  try:
 
 
 
 
 
 
 
 
 
28
  vision_context = None
29
  if request.image_base64:
30
  try:
@@ -38,11 +51,16 @@ def handle_chat(request: UserRequest):
38
 
39
  final_user_input = request.user_input if request.user_input else "Descreva a imagem em detalhes."
40
 
41
- bot_response_text, audio_path = agent.respond(
42
- user_input=final_user_input,
 
 
43
  vision_context=vision_context
44
  )
45
 
 
 
 
46
  # LÓGICA DO ÁUDIO: Converte o arquivo MP3 gerado para Base64
47
  audio_base64 = None
48
  if audio_path and os.path.exists(audio_path):
 
18
  allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"],
19
  )
20
 
21
+ # Dicionário global para armazenar sessões de usuários
22
+ user_sessions = {}
23
+
24
  class UserRequest(BaseModel):
25
  user_input: str
26
  image_base64: str | None = None
27
+ user_id: str | None = None
28
 
29
  @app.post("/chat")
30
  def handle_chat(request: UserRequest):
31
  try:
32
+ # Gerenciamento de sessão
33
+ user_id = request.user_id if request.user_id else "default_user"
34
+ if user_id not in user_sessions:
35
+ print(f"Nova sessão criada para: {user_id}")
36
+ # Inicializa com o prompt do sistema do agente
37
+ user_sessions[user_id] = [agent.system_prompt]
38
+
39
+ current_history = user_sessions[user_id]
40
+
41
  vision_context = None
42
  if request.image_base64:
43
  try:
 
51
 
52
  final_user_input = request.user_input if request.user_input else "Descreva a imagem em detalhes."
53
 
54
+ bot_response_text, audio_path, updated_history = agent.respond(
55
+ history=current_history,
56
+ user_input=final_user_input,
57
+ user_id=user_id,
58
  vision_context=vision_context
59
  )
60
 
61
+ # Atualiza o histórico da sessão
62
+ user_sessions[user_id] = updated_history
63
+
64
  # LÓGICA DO ÁUDIO: Converte o arquivo MP3 gerado para Base64
65
  audio_base64 = None
66
  if audio_path and os.path.exists(audio_path):
jade/core.py CHANGED
@@ -37,8 +37,8 @@ class JadeAgent:
37
  self.client = Groq(api_key=self.api_key)
38
  self.model_name = self.cfg.get("groq_model", "moonshotai/kimi-k2-instruct-0905")
39
 
40
- # Histórico base
41
- self.history = [{"role": "system", "content": "Você é J.A.D.E., uma IA multimodal calma e inteligente. Seja direta. Responda de forma concisa e natural. NÃO explique seu processo de pensamento. Apenas responda à pergunta."}]
42
 
43
  # --- Inicialização dos Módulos ---
44
  logging.info("Carregando módulos de percepção e memória...")
@@ -49,6 +49,7 @@ class JadeAgent:
49
 
50
  # 1. Memória ShoreStone (Persistente)
51
  self.memory = ShoreStoneMemory()
 
52
  self.memory.load_or_create_session("sessao_padrao_gabriel")
53
 
54
  # 2. Curador Heurístico (Manutenção Automática)
@@ -82,10 +83,14 @@ class JadeAgent:
82
  logging.error(f"Erro na comunicação com a Groq: {e}")
83
  return "Desculpe, tive um problema ao me conectar com meu cérebro na nuvem."
84
 
85
- def respond(self, user_input, vision_context=None):
86
  """Processo principal de raciocínio: Lembrar -> Ver -> Responder -> Memorizar -> Manter."""
87
 
88
- messages = self.history[:]
 
 
 
 
89
 
90
  # 1. Lembrar (Recuperação de Contexto)
91
  memories = self.memory.remember(user_input)
@@ -99,15 +104,15 @@ class JadeAgent:
99
  messages.append({"role": "system", "content": f"Contexto visual da imagem que o usuário enviou: {vision_context}"})
100
 
101
  # Adiciona a pergunta atual ao histórico temporário e ao prompt
102
- self.history.append({"role": "user", "content": user_input})
103
  messages.append({"role": "user", "content": user_input})
104
 
105
  # 3. Responder (Geração)
106
  resposta = self._chat(messages)
107
 
108
  # Atualiza histórico
109
- self.history.append({"role": "assistant", "content": resposta})
110
- self.history = slim_history(self.history, keep=self.cfg.get("max_context", 12))
111
 
112
  # 4. Memorizar (Armazenamento Persistente)
113
  self.memory.memorize(user_input, resposta)
@@ -131,4 +136,4 @@ class JadeAgent:
131
  except Exception as e:
132
  logging.error(f"Erro no Curador de Memória: {e}")
133
 
134
- return resposta, audio_path
 
37
  self.client = Groq(api_key=self.api_key)
38
  self.model_name = self.cfg.get("groq_model", "moonshotai/kimi-k2-instruct-0905")
39
 
40
+ # System Prompt Base
41
+ self.system_prompt = {"role": "system", "content": "Você é J.A.D.E., uma IA multimodal calma e inteligente. Seja direta. Responda de forma concisa e natural. NÃO explique seu processo de pensamento. Apenas responda à pergunta."}
42
 
43
  # --- Inicialização dos Módulos ---
44
  logging.info("Carregando módulos de percepção e memória...")
 
49
 
50
  # 1. Memória ShoreStone (Persistente)
51
  self.memory = ShoreStoneMemory()
52
+ # Inicializa com sessão padrão, mas será trocada dinamicamente no respond()
53
  self.memory.load_or_create_session("sessao_padrao_gabriel")
54
 
55
  # 2. Curador Heurístico (Manutenção Automática)
 
83
  logging.error(f"Erro na comunicação com a Groq: {e}")
84
  return "Desculpe, tive um problema ao me conectar com meu cérebro na nuvem."
85
 
86
+ def respond(self, history, user_input, user_id="default", vision_context=None):
87
  """Processo principal de raciocínio: Lembrar -> Ver -> Responder -> Memorizar -> Manter."""
88
 
89
+ # TROCA A SESSÃO DA MEMÓRIA PARA O USUÁRIO ATUAL
90
+ session_name = f"user_{user_id}"
91
+ self.memory.load_or_create_session(session_name)
92
+
93
+ messages = history[:]
94
 
95
  # 1. Lembrar (Recuperação de Contexto)
96
  memories = self.memory.remember(user_input)
 
104
  messages.append({"role": "system", "content": f"Contexto visual da imagem que o usuário enviou: {vision_context}"})
105
 
106
  # Adiciona a pergunta atual ao histórico temporário e ao prompt
107
+ history.append({"role": "user", "content": user_input})
108
  messages.append({"role": "user", "content": user_input})
109
 
110
  # 3. Responder (Geração)
111
  resposta = self._chat(messages)
112
 
113
  # Atualiza histórico
114
+ history.append({"role": "assistant", "content": resposta})
115
+ history = slim_history(history, keep=self.cfg.get("max_context", 12))
116
 
117
  # 4. Memorizar (Armazenamento Persistente)
118
  self.memory.memorize(user_input, resposta)
 
136
  except Exception as e:
137
  logging.error(f"Erro no Curador de Memória: {e}")
138
 
139
+ return resposta, audio_path, history