akra35567 commited on
Commit
71eef32
·
1 Parent(s): e8afb10

Update modules/database.py

Browse files
Files changed (1) hide show
  1. modules/database.py +37 -21
modules/database.py CHANGED
@@ -1,3 +1,13 @@
 
 
 
 
 
 
 
 
 
 
1
  import sqlite3
2
  import json
3
  import time
@@ -74,7 +84,6 @@ class Database:
74
  dado TEXT,
75
  valor TEXT
76
  );
77
-
78
  -- exemplos
79
  CREATE TABLE IF NOT EXISTS exemplos (
80
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -82,31 +91,26 @@ class Database:
82
  entrada TEXT NOT NULL,
83
  resposta TEXT NOT NULL
84
  );
85
-
86
  -- info_geral
87
  CREATE TABLE IF NOT EXISTS info_geral (
88
  chave TEXT PRIMARY KEY,
89
  valor TEXT NOT NULL
90
  );
91
-
92
  -- estilos
93
  CREATE TABLE IF NOT EXISTS estilos (
94
  numero_usuario TEXT PRIMARY KEY,
95
  estilo TEXT NOT NULL
96
  );
97
-
98
  -- preferencias_tom
99
  CREATE TABLE IF NOT EXISTS preferencias_tom (
100
  numero_usuario TEXT PRIMARY KEY,
101
  tom TEXT NOT NULL
102
  );
103
-
104
  -- afinidades
105
  CREATE TABLE IF NOT EXISTS afinidades (
106
  numero_usuario TEXT PRIMARY KEY,
107
  afinidade REAL NOT NULL
108
  );
109
-
110
  -- termos
111
  CREATE TABLE IF NOT EXISTS termos (
112
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -114,7 +118,6 @@ class Database:
114
  termo TEXT NOT NULL,
115
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
116
  );
117
-
118
  -- aprendizados (detalhado)
119
  CREATE TABLE IF NOT EXISTS aprendizados (
120
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -123,7 +126,6 @@ class Database:
123
  valor TEXT NOT NULL,
124
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
125
  );
126
-
127
  -- vocabulário patenteado
128
  CREATE TABLE IF NOT EXISTS vocabulario_patenteado (
129
  termo TEXT PRIMARY KEY,
@@ -131,13 +133,11 @@ class Database:
131
  uso TEXT NOT NULL,
132
  exemplo TEXT NOT NULL
133
  );
134
-
135
  -- usuarios privilegiados
136
  CREATE TABLE IF NOT EXISTS usuarios_privilegiados (
137
  numero_usuario TEXT PRIMARY KEY,
138
  nome TEXT NOT NULL
139
  );
140
-
141
  -- whatsapp_ids
142
  CREATE TABLE IF NOT EXISTS whatsapp_ids (
143
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -145,14 +145,12 @@ class Database:
145
  sender_number TEXT NOT NULL,
146
  UNIQUE (whatsapp_id, sender_number)
147
  );
148
-
149
  -- embeddings
150
  CREATE TABLE IF NOT EXISTS embeddings (
151
  id INTEGER PRIMARY KEY AUTOINCREMENT,
152
  texto TEXT NOT NULL,
153
  embedding BLOB NOT NULL
154
  );
155
-
156
  -- mensagens
157
  CREATE TABLE IF NOT EXISTS mensagens (
158
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -165,7 +163,6 @@ class Database:
165
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
166
  data TIMESTAMP DEFAULT CURRENT_TIMESTAMP
167
  );
168
-
169
  -- emocao_exemplos
170
  CREATE TABLE IF NOT EXISTS emocao_exemplos (
171
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -175,7 +172,6 @@ class Database:
175
  tom TEXT NOT NULL,
176
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
177
  );
178
-
179
  -- girias_aprendidas
180
  CREATE TABLE IF NOT EXISTS girias_aprendidas (
181
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -187,7 +183,6 @@ class Database:
187
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
188
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
189
  );
190
-
191
  -- tom_usuario
192
  CREATE TABLE IF NOT EXISTS tom_usuario (
193
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -197,7 +192,6 @@ class Database:
197
  contexto TEXT,
198
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
199
  );
200
-
201
  -- adaptacao_dinamica
202
  CREATE TABLE IF NOT EXISTS adaptacao_dinamica (
203
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -206,14 +200,28 @@ class Database:
206
  valor_anterior TEXT,
207
  valor_novo TEXT,
208
  razao TEXT,
209
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
 
 
 
 
 
210
  );
211
  ''')
212
 
 
 
 
 
 
 
 
 
 
213
  conn.commit()
214
 
215
  def _ensure_all_columns_and_indexes(self):
216
- """Garante que TODAS as colunas existam + cria índices para performance"""
217
  with self._get_connection() as conn:
218
  c = conn.cursor()
219
 
@@ -256,7 +264,8 @@ class Database:
256
  "CREATE INDEX IF NOT EXISTS idx_girias_giria ON girias_aprendidas(giria);",
257
  "CREATE INDEX IF NOT EXISTS idx_tom_usuario ON tom_usuario(numero_usuario);",
258
  "CREATE INDEX IF NOT EXISTS idx_aprendizados_usuario ON aprendizados(numero_usuario);",
259
- "CREATE INDEX IF NOT EXISTS idx_embeddings_texto ON embeddings(texto);"
 
260
  ]
261
 
262
  for idx in indexes:
@@ -268,7 +277,7 @@ class Database:
268
  conn.commit()
269
 
270
  # ================================================================
271
- # MÉTODOS PRINCIPAIS (mantidos e otimizados)
272
  # ================================================================
273
 
274
  # --- EXEMPLOS ---
@@ -461,6 +470,12 @@ class Database:
461
  "palavras_chave_encontradas": max_count
462
  }
463
 
 
 
 
 
 
 
464
  # --- CONTEXTO COMPLETO ---
465
  def obter_contexto_aprendizado(self, numero_usuario: str) -> Dict[str, Any]:
466
  return {
@@ -470,5 +485,6 @@ class Database:
470
  "preferencia_tom": self.recuperar_preferencia_tom(numero_usuario),
471
  "afinidade": self.recuperar_afinidade(numero_usuario),
472
  "adaptacoes_recentes": self.obter_adaptacoes_usuario(numero_usuario)[-5:],
473
- "aprendizados_detalhados": dict(self.recuperar_aprendizado_detalhado(numero_usuario) or [])
 
474
  }
 
1
+ # modules/database.py
2
+ """
3
+ Banco de dados SQLite para Akira IA.
4
+ - Tabelas: mensagens, girias, tom, pronomes, embeddings, etc.
5
+ - Migração automática de colunas
6
+ - Índices para performance
7
+ - Suporte a pronomes por tom (formal, rude, casual)
8
+ - WAL + retry para concorrência
9
+ """
10
+
11
  import sqlite3
12
  import json
13
  import time
 
84
  dado TEXT,
85
  valor TEXT
86
  );
 
87
  -- exemplos
88
  CREATE TABLE IF NOT EXISTS exemplos (
89
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
91
  entrada TEXT NOT NULL,
92
  resposta TEXT NOT NULL
93
  );
 
94
  -- info_geral
95
  CREATE TABLE IF NOT EXISTS info_geral (
96
  chave TEXT PRIMARY KEY,
97
  valor TEXT NOT NULL
98
  );
 
99
  -- estilos
100
  CREATE TABLE IF NOT EXISTS estilos (
101
  numero_usuario TEXT PRIMARY KEY,
102
  estilo TEXT NOT NULL
103
  );
 
104
  -- preferencias_tom
105
  CREATE TABLE IF NOT EXISTS preferencias_tom (
106
  numero_usuario TEXT PRIMARY KEY,
107
  tom TEXT NOT NULL
108
  );
 
109
  -- afinidades
110
  CREATE TABLE IF NOT EXISTS afinidades (
111
  numero_usuario TEXT PRIMARY KEY,
112
  afinidade REAL NOT NULL
113
  );
 
114
  -- termos
115
  CREATE TABLE IF NOT EXISTS termos (
116
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
118
  termo TEXT NOT NULL,
119
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
120
  );
 
121
  -- aprendizados (detalhado)
122
  CREATE TABLE IF NOT EXISTS aprendizados (
123
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
126
  valor TEXT NOT NULL,
127
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
128
  );
 
129
  -- vocabulário patenteado
130
  CREATE TABLE IF NOT EXISTS vocabulario_patenteado (
131
  termo TEXT PRIMARY KEY,
 
133
  uso TEXT NOT NULL,
134
  exemplo TEXT NOT NULL
135
  );
 
136
  -- usuarios privilegiados
137
  CREATE TABLE IF NOT EXISTS usuarios_privilegiados (
138
  numero_usuario TEXT PRIMARY KEY,
139
  nome TEXT NOT NULL
140
  );
 
141
  -- whatsapp_ids
142
  CREATE TABLE IF NOT EXISTS whatsapp_ids (
143
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
145
  sender_number TEXT NOT NULL,
146
  UNIQUE (whatsapp_id, sender_number)
147
  );
 
148
  -- embeddings
149
  CREATE TABLE IF NOT EXISTS embeddings (
150
  id INTEGER PRIMARY KEY AUTOINCREMENT,
151
  texto TEXT NOT NULL,
152
  embedding BLOB NOT NULL
153
  );
 
154
  -- mensagens
155
  CREATE TABLE IF NOT EXISTS mensagens (
156
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
163
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
164
  data TIMESTAMP DEFAULT CURRENT_TIMESTAMP
165
  );
 
166
  -- emocao_exemplos
167
  CREATE TABLE IF NOT EXISTS emocao_exemplos (
168
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
172
  tom TEXT NOT NULL,
173
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
174
  );
 
175
  -- girias_aprendidas
176
  CREATE TABLE IF NOT EXISTS girias_aprendidas (
177
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
183
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
184
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
185
  );
 
186
  -- tom_usuario
187
  CREATE TABLE IF NOT EXISTS tom_usuario (
188
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
192
  contexto TEXT,
193
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
194
  );
 
195
  -- adaptacao_dinamica
196
  CREATE TABLE IF NOT EXISTS adaptacao_dinamica (
197
  id INTEGER PRIMARY KEY AUTOINCREMENT,
 
200
  valor_anterior TEXT,
201
  valor_novo TEXT,
202
  razao TEXT,
203
+ created_at TIMESTAMP DEFAULT CURRENT TIMESTAMP
204
+ );
205
+ -- NOVA TABELA: PRONOMES POR TOM
206
+ CREATE TABLE IF NOT EXISTS pronomes_por_tom (
207
+ tom TEXT PRIMARY KEY,
208
+ pronomes TEXT NOT NULL
209
  );
210
  ''')
211
 
212
+ # Insere pronomes padrão (só na primeira vez)
213
+ c.executescript('''
214
+ INSERT OR IGNORE INTO pronomes_por_tom (tom, pronomes) VALUES
215
+ ('formal', 'Sr., ilustre, boss, maior, homem'),
216
+ ('rude', 'parvo, estúpido, burro, analfabeto, desperdício de esperma'),
217
+ ('casual', 'mano, puto, cota, mwangolé, kota'),
218
+ ('neutro', 'amigo, parceiro, camarada');
219
+ ''')
220
+
221
  conn.commit()
222
 
223
  def _ensure_all_columns_and_indexes(self):
224
+ """Garante que TODAS as colunas existam + cria índices"""
225
  with self._get_connection() as conn:
226
  c = conn.cursor()
227
 
 
264
  "CREATE INDEX IF NOT EXISTS idx_girias_giria ON girias_aprendidas(giria);",
265
  "CREATE INDEX IF NOT EXISTS idx_tom_usuario ON tom_usuario(numero_usuario);",
266
  "CREATE INDEX IF NOT EXISTS idx_aprendizados_usuario ON aprendizados(numero_usuario);",
267
+ "CREATE INDEX IF NOT EXISTS idx_embeddings_texto ON embeddings(texto);",
268
+ "CREATE INDEX IF NOT EXISTS idx_pronomes_tom ON pronomes_por_tom(tom);"
269
  ]
270
 
271
  for idx in indexes:
 
277
  conn.commit()
278
 
279
  # ================================================================
280
+ # MÉTODOS PRINCIPAIS
281
  # ================================================================
282
 
283
  # --- EXEMPLOS ---
 
470
  "palavras_chave_encontradas": max_count
471
  }
472
 
473
+ # --- PRONOMES POR TOM (NOVA FUNÇÃO) ---
474
+ def obter_pronomes_por_tom(self, tom: str) -> str:
475
+ """Retorna string com pronomes para o tom (ex: 'Sr., boss')"""
476
+ result = self._execute_with_retry("SELECT pronomes FROM pronomes_por_tom WHERE tom=?", (tom.lower(),))
477
+ return result[0][0] if result else ""
478
+
479
  # --- CONTEXTO COMPLETO ---
480
  def obter_contexto_aprendizado(self, numero_usuario: str) -> Dict[str, Any]:
481
  return {
 
485
  "preferencia_tom": self.recuperar_preferencia_tom(numero_usuario),
486
  "afinidade": self.recuperar_afinidade(numero_usuario),
487
  "adaptacoes_recentes": self.obter_adaptacoes_usuario(numero_usuario)[-5:],
488
+ "aprendizados_detalhados": dict(self.recuperar_aprendizado_detalhado(numero_usuario) or []),
489
+ "pronomes_tom": self.obter_pronomes_por_tom(self.obter_tom_predominante(numero_usuario) or "neutro")
490
  }