Upload 12 files
Browse files- app.py +20 -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 |
-
|
|
|
|
|
|
|
| 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 |
-
#
|
| 41 |
-
self.
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 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 |
-
|
| 110 |
-
|
| 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
|