Spaces:
Running
Running
Update modules/database.py
Browse files- 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 210 |
);
|
| 211 |
''')
|
| 212 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 213 |
conn.commit()
|
| 214 |
|
| 215 |
def _ensure_all_columns_and_indexes(self):
|
| 216 |
-
"""Garante que TODAS as colunas existam + cria índices
|
| 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
|
| 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 |
}
|