#app.py
import json
import gradio as gr
from context.db_loader import SQLiteContextLoader
from models.gpt4o import ModelClient

class NeuroRavenApp:
def init(self):
self.system_prompt = None
self.current_theme = None
self.client = ModelClient()
self.context_loader = SQLiteContextLoader()


    self.conversation_themes = self.get_conversation_themes()
    if "Без контекста" not in self.conversation_themes:
        self.conversation_themes.append("Без контекста")

@staticmethod
def get_conversation_themes(json_path='conversation_themes.json'):
    try:
        with open(json_path, 'r', encoding='utf-8') as file:
            themes = json.load(file)
            if isinstance(themes, list):
                return themes
            else:
                print("Файл JSON не содержит списка.")
                return []
    except (FileNotFoundError, json.JSONDecodeError) as e:
        print(f"Ошибка при загрузке тем беседы из {json_path}: {e}")
        return []

def handle_query(self, message, history, context_theme, should_save):

    # Сохранение сообщения в базу данных, если чекбокс активирован
    if should_save and isinstance(self.context_loader, SQLiteContextLoader):
        if context_theme == "Без контекста":
            return "Невозможно сохранить сообщение для текущей темы..."

        self.context_loader.save_message(context_theme, message)
        self.current_theme = None
        return "Сообщение сохранено в контекст!"

    if context_theme != self.current_theme:
        context = self.context_loader.load_context(context_theme)
        if context:
            self.system_prompt = f"Отвечай на вопросы беря информацию из контекста: \n{context}"
        else:
            self.system_prompt = "You are a helpful assistant."

        self.current_theme = context_theme

    response = self.client.get_response(
        message=message,
        history=history,
        sys_prompt=self.system_prompt
    )

    return response

def launch_app(self):
    gr.ChatInterface(
        self.handle_query,
        chatbot=gr.Chatbot(height=500),
        textbox=gr.Textbox(placeholder="Напиши свой вопрос", container=False, scale=7),
        title="NeuroRaven",
        theme="soft",
        retry_btn=None,
        clear_btn="Clear",
        additional_inputs=[
            gr.Dropdown(self.conversation_themes, label="Выбери тему контекста", value="Без контекста"),
            gr.Checkbox(label="Сохранить сообщение", value=False)
        ],
        css="footer{display:none !important}"
    ).launch(server_name="192.168.0.105", server_port=7846)
if name == "main":
app = NeuroRavenApp()
app.launch_app()

#db_loader.py
import sqlite3
from context.base_loader import ContextLoader

class SQLiteContextLoader(ContextLoader):
def init(self, db_path="context.db"):
self.db_path = db_path
self._initialize_database()


def _initialize_database(self):
    """Создает таблицу в базе данных, если она не существует"""
    conn = sqlite3.connect(self.db_path)
    cursor = conn.cursor()
    # Создаем таблицу contexts, если она еще не существует
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS contexts (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            theme TEXT NOT NULL,
            date_added DATE DEFAULT (date('now')),
            text TEXT NOT NULL
        )
    ''')
    conn.commit()
    conn.close()

def load_context(self, context_theme):
    if context_theme == "Без контекста":
        return ""

    conn = sqlite3.connect(self.db_path)
    cursor = conn.cursor()

    query = "SELECT text FROM contexts WHERE theme = ?"
    cursor.execute(query, (context_theme,))
    rows = cursor.fetchall()

    all_text = "\n".join(row[0] for row in rows)
    conn.close()

    return all_text

def save_message(self, context_theme, message):
    conn = sqlite3.connect(self.db_path)
    cursor = conn.cursor()

    query = "INSERT INTO contexts (theme, text) VALUES (?, ?)"
    cursor.execute(query, (context_theme, message))
    conn.commit()
    conn.close()
Вынеси пожалуйста все что нужно в константы и хэлпер, можешь так же вынести информационные сообщения и текст ошибок