| import sqlite3 |
| import threading |
| from datetime import datetime |
| import json |
| from .config import SQLITE_DB_PATH |
|
|
| class TrainingBuffer: |
| def __init__(self): |
| self.db_path = SQLITE_DB_PATH |
| self.lock = threading.Lock() |
| self._init_db() |
|
|
| def _init_db(self): |
| with self.lock: |
| conn = sqlite3.connect(self.db_path) |
| cursor = conn.cursor() |
| cursor.execute(''' |
| CREATE TABLE IF NOT EXISTS utterances ( |
| id INTEGER PRIMARY KEY AUTOINCREMENT, |
| timestamp TEXT NOT NULL, |
| pictogram_seq TEXT NOT NULL, |
| confirmed_sentence TEXT NOT NULL, |
| persona_id TEXT NOT NULL, |
| context TEXT, |
| was_first_alternative INTEGER DEFAULT 1, |
| session_id TEXT |
| ) |
| ''') |
| conn.commit() |
| conn.close() |
|
|
| def log(self, pictogram_seq, confirmed_sentence, persona_id, context=None, was_first_alternative=True, session_id=None): |
| with self.lock: |
| conn = sqlite3.connect(self.db_path) |
| cursor = conn.cursor() |
| timestamp = datetime.now().isoformat() |
| pictogram_seq_str = json.dumps(pictogram_seq) |
| cursor.execute(''' |
| INSERT INTO utterances (timestamp, pictogram_seq, confirmed_sentence, persona_id, context, was_first_alternative, session_id) |
| VALUES (?, ?, ?, ?, ?, ?, ?) |
| ''', (timestamp, pictogram_seq_str, confirmed_sentence, persona_id, context, 1 if was_first_alternative else 0, session_id)) |
| conn.commit() |
| conn.close() |
|
|
| def get_for_persona(self, persona_id): |
| with self.lock: |
| conn = sqlite3.connect(self.db_path) |
| conn.row_factory = sqlite3.Row |
| cursor = conn.cursor() |
| cursor.execute('SELECT * FROM utterances WHERE persona_id = ?', (persona_id,)) |
| rows = cursor.fetchall() |
| conn.close() |
| return [dict(row) for row in rows] |
|
|
| def count(self, persona_id=None): |
| with self.lock: |
| conn = sqlite3.connect(self.db_path) |
| cursor = conn.cursor() |
| if persona_id: |
| cursor.execute('SELECT COUNT(*) FROM utterances WHERE persona_id = ?', (persona_id,)) |
| else: |
| cursor.execute('SELECT COUNT(*) FROM utterances') |
| count = cursor.fetchone()[0] |
| conn.close() |
| return count |
|
|
| def export_jsonl(self, persona_id): |
| utterances = self.get_for_persona(persona_id) |
| return "\n".join([json.dumps(u) for u in utterances]) |
|
|
| def clear(self, persona_id): |
| with self.lock: |
| conn = sqlite3.connect(self.db_path) |
| cursor = conn.cursor() |
| cursor.execute('DELETE FROM utterances WHERE persona_id = ?', (persona_id,)) |
| conn.commit() |
| count = conn.total_changes |
| conn.close() |
| return count |
|
|
| def get_stats(self): |
| with self.lock: |
| conn = sqlite3.connect(self.db_path) |
| cursor = conn.cursor() |
| cursor.execute('SELECT persona_id, COUNT(*) FROM utterances GROUP BY persona_id') |
| stats = dict(cursor.fetchall()) |
| conn.close() |
| return stats |
|
|
| training_buffer = TrainingBuffer() |
|
|