Сделай интерфейс интереснее, понятнее, приятнее и т.д
Сделай в поле для ввода запроса подсчет символов и токенов, 1 токен - 4 символа.
Оптимизируй код.
```python
import sys
import requests
from PyQt5.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QHBoxLayout, QTextEdit,
    QLineEdit, QPushButton, QLabel, QFileDialog, QMessageBox, QInputDialog
)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont, QTextCursor
from gradio_client import Client
import markdown
from pygments import highlight
from pygments.lexers import PythonLexer, JavascriptLexer, JsonLexer
from pygments.formatters import HtmlFormatter

# Инициализация клиента для API
client = Client("yuntian-deng/o1mini")

# Функция для подсветки кода
def highlight_code(text):
    if isinstance(text, str):
        if text.startswith("```python"):
            code = text.replace("```python", "").replace("```", "")
            lexer = PythonLexer()
        elif text.startswith("```javascript"):
            code = text.replace("```javascript", "").replace("```", "")
            lexer = JavascriptLexer()
        elif text.startswith("```json"):
            code = text.replace("```json", "").replace("```", "")
            lexer = JsonLexer()
        else:
            return markdown.markdown(text)
    
        formatter = HtmlFormatter(style="colorful")
        highlighted = highlight(code, lexer, formatter)
        return highlighted
    else:
        # Если text не строка, конвертируем его в строку
        return str(text)

class ChatBot(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Чат-бот на основе API `yuntian-deng/o1mini`")
        self.setGeometry(100, 100, 800, 600)

        self.chat_history = []
        self.chat_counter = 0

        self.init_ui()

    def init_ui(self):
        main_layout = QVBoxLayout()

        # Заголовок
        title = QLabel("Чат-бот на основе API `yuntian-deng/o1mini`")
        title.setFont(QFont("Arial", 16))
        title.setAlignment(Qt.AlignCenter)
        main_layout.addWidget(title)

        # Область чата
        self.chat_area = QTextEdit()
        self.chat_area.setReadOnly(True)
        self.chat_area.setFont(QFont("Arial", 12))
        main_layout.addWidget(self.chat_area)

        # Поле ввода сообщения
        input_layout = QHBoxLayout()
        self.input_field = QLineEdit()
        self.input_field.setPlaceholderText("Введите сообщение и нажмите Enter")
        self.input_field.returnPressed.connect(self.send_message)
        input_layout.addWidget(self.input_field)

        self.send_button = QPushButton("Отправить")
        self.send_button.clicked.connect(self.send_message)
        input_layout.addWidget(self.send_button)

        main_layout.addLayout(input_layout)

        # Кнопки дополнительных функций
        func_layout = QHBoxLayout()

        self.reset_btn = QPushButton("Сбросить чат")
        self.reset_btn.clicked.connect(self.reset_chat)
        func_layout.addWidget(self.reset_btn)

        self.export_btn = QPushButton("Экспортировать чат")
        self.export_btn.clicked.connect(self.export_chat)
        func_layout.addWidget(self.export_btn)

        self.fact_btn = QPushButton("Случайный факт")
        self.fact_btn.clicked.connect(self.get_random_fact)
        func_layout.addWidget(self.fact_btn)

        main_layout.addLayout(func_layout)

        # Информация о ошибках
        self.info_label = QLabel("")
        self.info_label.setStyleSheet("color: red;")
        main_layout.addWidget(self.info_label)

        self.setLayout(main_layout)

    def append_chat(self, sender, message):
        if sender == "Вы":
            self.chat_area.append(f"<b>Вы:</b> {message}")
        else:
            formatted_message = highlight_code(message)
            self.chat_area.append(f"<b>Бот:</b> {formatted_message}")

        self.chat_area.moveCursor(QTextCursor.End)

    def send_message(self):
        user_message = self.input_field.text().strip()
        if not user_message:
            return

        self.append_chat("Вы", user_message)
        # Обновляем локальную историю чата
        self.chat_history.append((user_message, ""))
        self.input_field.clear()

        # Отправка сообщения к API
        try:
            result = client.predict(
                inputs=user_message,
                top_p=1,
                temperature=1,
                chat_counter=self.chat_counter,
                chatbot=self.chat_history,
                api_name="/predict"
            )
            # Для отладки: распечатайте результат
            # print(result)

            if len(result) < 4:
                raise ValueError("Некорректный формат ответа от API.")

            chatbot_history, new_chat_counter, status_code, reset_text = result

            # Проверяем, что chatbot_history - это список или кортеж
            if not isinstance(chatbot_history, (list, tuple)):
                raise TypeError("chatbot_history должно быть списком или кортежем.")

            # Извлекаем последний ответ бота
            if len(chatbot_history) == 0:
                chatbot_response = "Нет ответа от бота."
            else:
                latest_entry = chatbot_history[-1]
                if isinstance(latest_entry, (list, tuple)) and len(latest_entry) == 2:
                    chatbot_response = latest_entry[1]
                else:
                    chatbot_response = "Не удалось получить ответ бота."

            self.chat_counter = new_chat_counter

            # Обновление истории чата
            self.chat_history[-1] = (user_message, chatbot_response)
            self.append_chat("Бот", chatbot_response)
        except Exception as e:
            QMessageBox.critical(self, "Ошибка", f"Не удалось отправить сообщение:\n{e}")

    def reset_chat(self):
        self.chat_history = []
        self.chat_counter = 0
        self.chat_area.clear()
        QMessageBox.information(self, "Чат сброшен", "История чата была сброшена.")

    def export_chat(self):
        if not self.chat_history:
            QMessageBox.warning(self, "Экспорт", "Нет истории чата для экспорта.")
            return

        options = QFileDialog.Options()
        file_path, _ = QFileDialog.getSaveFileName(self, "Сохранить чат", "", "Текстовые файлы (*.txt)", options=options)
        if file_path:
            try:
                with open(file_path, "w", encoding="utf-8") as file:
                    for user_msg, bot_msg in self.chat_history:
                        file.write(f"Вы: {user_msg}\nБот: {bot_msg}\n\n")
                QMessageBox.information(self, "Экспорт", f"Чат успешно сохранен в {file_path}")
            except Exception as e:
                QMessageBox.critical(self, "Ошибка", f"Не удалось сохранить чат:\n{e}")

    def get_random_fact(self):
        try:
            response = requests.get("https://uselessfacts.jsph.pl/random.json?language=ru")
            if response.status_code == 200:
                fact = response.json().get("text", "Не удалось получить факт.")
            else:
                fact = "Ошибка при получении факта."
        except Exception as e:
            fact = f"Ошибка при получении факта: {e}"

        self.append_chat("Бот", fact)

def main():
    app = QApplication(sys.argv)
    chatbot = ChatBot()
    chatbot.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()
```