akra35567 commited on
Commit
3376d4e
·
1 Parent(s): e97f201

Update modules/database.py

Browse files
Files changed (1) hide show
  1. modules/database.py +70 -2
modules/database.py CHANGED
@@ -6,13 +6,16 @@ Banco de dados SQLite para Akira IA.
6
  - Suporte a pronomes por tom (formal, rude, casual)
7
  - WAL + retry para concorrência
8
  - MÉTODOS: recuperar_mensagens, recuperar_aprendizado_detalhado, analisar_emocoes_mensagem
 
9
  """
10
  import sqlite3
11
  import time
12
  import os
 
13
  from typing import Optional, List, Dict, Any, Tuple
14
  from loguru import logger
15
 
 
16
  class Database:
17
  def __init__(self, db_path: str):
18
  self.db_path = db_path
@@ -202,6 +205,15 @@ class Database:
202
  tom TEXT PRIMARY KEY,
203
  pronomes TEXT NOT NULL
204
  );
 
 
 
 
 
 
 
 
 
205
  ''')
206
  # Insere pronomes padrão
207
  c.executescript('''
@@ -236,6 +248,13 @@ class Database:
236
  'tom_usuario': [
237
  ("intensidade", "REAL DEFAULT 0.5"),
238
  ("contexto", "TEXT")
 
 
 
 
 
 
 
239
  ]
240
  }
241
  for table, cols in migrations.items():
@@ -256,7 +275,8 @@ class Database:
256
  "CREATE INDEX IF NOT EXISTS idx_tom_usuario ON tom_usuario(numero_usuario);",
257
  "CREATE INDEX IF NOT EXISTS idx_aprendizados_usuario ON aprendizados(numero_usuario);",
258
  "CREATE INDEX IF NOT EXISTS idx_embeddings_texto ON embeddings(texto);",
259
- "CREATE INDEX IF NOT EXISTS idx_pronomes_tom ON pronomes_por_tom(tom);"
 
260
  ]
261
  for idx in indexes:
262
  try:
@@ -268,7 +288,55 @@ class Database:
268
  logger.error(f"Erro na migração/índices: {e}")
269
 
270
  # ================================================================
271
- # MÉTODOS PRINCIPAIS
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
272
  # ================================================================
273
  def salvar_mensagem(self, usuario, mensagem, resposta, numero=None, is_reply=False, mensagem_original=None):
274
  try:
 
6
  - Suporte a pronomes por tom (formal, rude, casual)
7
  - WAL + retry para concorrência
8
  - MÉTODOS: recuperar_mensagens, recuperar_aprendizado_detalhado, analisar_emocoes_mensagem
9
+ - ADICIONADO: carregar_contexto, salvar_contexto, listar_girias_aprendidas
10
  """
11
  import sqlite3
12
  import time
13
  import os
14
+ import json
15
  from typing import Optional, List, Dict, Any, Tuple
16
  from loguru import logger
17
 
18
+
19
  class Database:
20
  def __init__(self, db_path: str):
21
  self.db_path = db_path
 
205
  tom TEXT PRIMARY KEY,
206
  pronomes TEXT NOT NULL
207
  );
208
+ -- CONTEXTO POR USUÁRIO (NOVO!)
209
+ CREATE TABLE IF NOT EXISTS contexto (
210
+ user_key TEXT PRIMARY KEY,
211
+ historico TEXT,
212
+ emocao_atual TEXT,
213
+ termos TEXT,
214
+ girias TEXT,
215
+ tom TEXT
216
+ );
217
  ''')
218
  # Insere pronomes padrão
219
  c.executescript('''
 
248
  'tom_usuario': [
249
  ("intensidade", "REAL DEFAULT 0.5"),
250
  ("contexto", "TEXT")
251
+ ],
252
+ 'contexto': [
253
+ ("historico", "TEXT"),
254
+ ("emocao_atual", "TEXT"),
255
+ ("termos", "TEXT"),
256
+ ("girias", "TEXT"),
257
+ ("tom", "TEXT")
258
  ]
259
  }
260
  for table, cols in migrations.items():
 
275
  "CREATE INDEX IF NOT EXISTS idx_tom_usuario ON tom_usuario(numero_usuario);",
276
  "CREATE INDEX IF NOT EXISTS idx_aprendizados_usuario ON aprendizados(numero_usuario);",
277
  "CREATE INDEX IF NOT EXISTS idx_embeddings_texto ON embeddings(texto);",
278
+ "CREATE INDEX IF NOT EXISTS idx_pronomes_tom ON pronomes_por_tom(tom);",
279
+ "CREATE INDEX IF NOT EXISTS idx_contexto_user ON contexto(user_key);"
280
  ]
281
  for idx in indexes:
282
  try:
 
288
  logger.error(f"Erro na migração/índices: {e}")
289
 
290
  # ================================================================
291
+ # MÉTODOS OBRIGATÓRIOS (ADICIONADOS!)
292
+ # ================================================================
293
+
294
+ def carregar_contexto(self, user_key: str) -> Dict[str, Any]:
295
+ """Carrega contexto do usuário (para Contexto class)"""
296
+ try:
297
+ result = self._execute_with_retry(
298
+ "SELECT historico, emocao_atual, termos, girias, tom FROM contexto WHERE user_key = ?",
299
+ (user_key,), fetch=True
300
+ )
301
+ if result:
302
+ row = result[0]
303
+ return {
304
+ "historico": row[0] or "[]",
305
+ "emocao_atual": row[1] or "neutra",
306
+ "termos": row[2] or "[]",
307
+ "girias": row[3] or "[]",
308
+ "tom": row[4] or "neutro"
309
+ }
310
+ return {}
311
+ except Exception as e:
312
+ logger.warning(f"Erro ao carregar contexto: {e}")
313
+ return {}
314
+
315
+ def salvar_contexto(self, user_key: str, historico: str, emocao_atual: str,
316
+ termos: str, girias: str, tom: str):
317
+ """Salva contexto do usuário"""
318
+ try:
319
+ self._execute_with_retry("""
320
+ INSERT OR REPLACE INTO contexto (user_key, historico, emocao_atual, termos, girias, tom)
321
+ VALUES (?, ?, ?, ?, ?, ?)
322
+ """, (user_key, historico, emocao_atual, termos, girias, tom), commit=True)
323
+ except Exception as e:
324
+ logger.error(f"Erro ao salvar contexto: {e}")
325
+
326
+ def listar_girias_aprendidas(self, user_key: str) -> List[Tuple[str, str]]:
327
+ """Retorna lista de (giria, significado)"""
328
+ try:
329
+ result = self._execute_with_retry(
330
+ "SELECT giria, significado FROM girias_aprendidas WHERE numero_usuario = ? ORDER BY frequencia DESC, updated_at DESC LIMIT 10",
331
+ (user_key,), fetch=True
332
+ )
333
+ return result or []
334
+ except Exception as e:
335
+ logger.warning(f"Erro ao listar gírias: {e}")
336
+ return []
337
+
338
+ # ================================================================
339
+ # MÉTODOS PRINCIPAIS (JÁ EXISTENTES)
340
  # ================================================================
341
  def salvar_mensagem(self, usuario, mensagem, resposta, numero=None, is_reply=False, mensagem_original=None):
342
  try: