Что это за код? import logging
import asyncio
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.constants import ChatAction
from telegram.ext import (
    ApplicationBuilder, ContextTypes,
    CommandHandler, MessageHandler, CallbackQueryHandler, filters
)
from gradio_client import Client
import os
from bs4 import BeautifulSoup  # Новый импорт для обработки HTML
import re  # Новый импорт для обработки регулярных выражений

# Включаем логирование
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)

MAX_MESSAGE_LENGTH = 4096  # Максимальная длина сообщения в Telegram

def parse_codeblock_and_format(text):
    """
    Преобразует текст с тройными кавычками и markdown-форматированием (жирный текст) в HTML-разметку для Telegram.
    """
    # Обработка блоков кода
    lines = text.split("\n")
    in_code_block = False
    processed_lines = []
    
    for line in lines:
        if line.strip().startswith("```"):
            if not in_code_block:
                # Начало блока кода
                language = line.strip()[3:].strip()
                if language:
                    processed_lines.append(f'<pre><code class="{language}">')
                else:
                    processed_lines.append('<pre><code>')
                in_code_block = True
            else:
                # Конец блока кода
                processed_lines.append('</code></pre>')
                in_code_block = False
        else:
            if in_code_block:
                # Внутри блока кода
                escaped_line = line.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
                processed_lines.append(escaped_line)
            else:
                # Вне блока кода
                escaped_line = line.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
                processed_lines.append(escaped_line)
    
    text_with_code = "\n".join(processed_lines)
    
    # Теперь обрабатываем жирный текст
    # Используем регулярные выражения для замены текста на <b>текста</b>
    # Предполагаем, что внутри блоков кода уже нет таких символов, так как они экранированы
    def replace_bold(match):
        return f"<b>{match.group(1)}</b>"

    bold_pattern = re.compile(r'\*\*(.*?)\*\*')
    formatted_text = bold_pattern.sub(replace_bold, text_with_code)

    return formatted_text

def split_message(message, max_length=MAX_MESSAGE_LENGTH):
    """
    Разбивает длинное сообщение на несколько сообщений, каждое из которых не превышает max_length.
    """
    return [message[i:i+max_length] for i in range(0, len(message), max_length)]

def get_clear_context_keyboard():
    """Создает клавиатуру с кнопкой 'Очистить контекст'."""
    keyboard = [[InlineKeyboardButton("Очистить контекст", callback_data='reset_context')]]
    return InlineKeyboardMarkup(keyboard)

def get_choose_model_keyboard():
    """Создает клавиатуру для выбора модели."""
    keyboard = [
        [
            InlineKeyboardButton("o1", callback_data='o1'),
            InlineKeyboardButton("o1-mini", callback_data='o1-mini')
        ],
        [
            InlineKeyboardButton("Отмена", callback_data='cancel_mode')
        ]
    ]
    return InlineKeyboardMarkup(keyboard)

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Обработчик команды /start с добавлением кнопки 'Выбрать модель'."""
    keyboard = [[InlineKeyboardButton("Выбрать модель", callback_data='choose_mode')]]
    reply_markup = InlineKeyboardMarkup(keyboard)
    await update.message.reply_text(
        'Привет! Я бот. Задавайте ваши вопросы. Вы можете выбрать модель с помощью команды /mode или использовать кнопку ниже.',
        reply_markup=reply_markup
    )