Если ИИ дает мне код. То он отображается красиво, но все в одну длинную строчку. Почему-то нет никаких переносов. Вот так это выглядит: package mainimport "fmt"func main() { fmt.Println("Привет, мир!")}.


Вот app.py: [from flask import Flask, render_template, request, jsonify
from gradio_client import Client
import bleach
import markdown

app = Flask(__name__)

# Инициализируем клиента Gradio
client = Client("yuntian-deng/o1")

# Разрешенные теги и атрибуты для bleach
allowed_tags = bleach.sanitizer.ALLOWED_TAGS.union({'br', 'pre', 'code'})
allowed_attrs = {'code': ['class'], 'pre': ['class']}


@app.route('/', methods=['GET'])
def index():
    return render_template('index.html')


@app.route('/chat', methods=['POST'])
def chat():
    data = request.get_json()
    user_input = data.get('message')
    chat_counter = data.get('chat_counter', 0)
    chatbot = data.get('chatbot', [])

    # Отправляем сообщение ИИ
    result = client.predict(
        inputs=user_input,
        top_p=1,
        temperature=1,
        chat_counter=chat_counter,
        chatbot=chatbot,
        api_name="/predict"
    )

    # Извлекаем ответ ИИ
    ai_response = result[0][-1][1]

    # Обрабатываем markdown в HTML
    ai_response_html = markdown.markdown(ai_response, extras=["fenced-code-blocks"])
    
    # Очищаем HTML от потенциально опасных тегов и атрибутов
    ai_response_clean = bleach.clean(
        ai_response_html,
        tags=allowed_tags,
        attributes=allowed_attrs
    )

    # Обновляем chatbot и chat_counter
    updated_chatbot = result[0]
    updated_chat_counter = chat_counter + 1

    # Возвращаем ответ в формате JSON
    return jsonify({
        'response': ai_response_clean,
        'chatbot': updated_chatbot,
        'chat_counter': updated_chat_counter
    })


@app.route('/reset', methods=['POST'])
def reset():
    # Сбрасываем состояние ИИ
    client.predict(api_name="/reset_textbox")
    return jsonify({'status': 'reset'})


if __name__ == '__main__':
    app.run(debug=True)
]


index.html: [<!doctype html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>Чат с ИИ</title>
    <style>
        .chat-container {
            width: 600px;
            margin: 20px auto;
            font-family: Arial, sans-serif;
        }

        .message {
            padding: 10px;
            margin-bottom: 5px;
            border-radius: 5px;
            max-width: 80%;
        }

        .user {
            background-color: #DCF8C6;
            text-align: right;
            margin-left: auto;
        }

        .ai {
            background-color: #ECE5DD;
            text-align: left;
            margin-right: auto;
        }

        .chat-form {
            display: flex;
            margin-top: 20px;
        }

        .chat-form input[type="text"] {
            flex: 1;
            padding: 10px;
            font-size: 16px;
            border: 1px solid #ccc;
            border-radius: 5px;
        }

        .chat-form input[type="submit"] {
            padding: 10px 20px;
            font-size: 16px;
            margin-left: 10px;
            border: none;
            background-color: #4CAF50;
            color: #fff;
            cursor: pointer;
            border-radius: 5px;
        }

        .chat-form input[type="submit"]:hover {
            background-color: #45a049;
        }

        .reset-button {
            margin-top: 10px;
            text-align: center;
        }

        .reset-button button {
            padding: 10px 20px;
            font-size: 16px;
            border: none;
            background-color: #f44336;
            color: #fff;
            cursor: pointer;
            border-radius: 5px;
        }

        .reset-button button:hover {
            background-color: #da190b;
        }

        pre {
            background-color: #f5f5f5;
            padding: 10px;
            border-radius: 5px;
            overflow-x: auto;
        }

        code {
            font-family: Consolas, monospace;
        }
    </style>
    <!-- Подключаем CSS для подсветки -->
    <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.0/styles/default.min.css">
    <!-- Подключаем библиотеку Highlight.js -->
    <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/11.5.0/highlight.min.js"></script>
</head>
<body>
<div class="chat-container">
    <h1>Чат с ИИ</h1>
    <div id="chat">
        <!-- Здесь будут отображаться сообщения -->
    </div>
    <form class="chat-form" id="chat-form">
        <input type="text" id="message-input" placeholder="Введите сообщение" autofocus required/>
        <input type="submit" value="Отправить"/>
    </form>
    <div class="reset-button">
        <button type="button" id="reset-btn">Очистить чат</button>
    </div>
</div>
<script>
    let chatCounter = 0;
    let chatbot = [];

    const chatContainer = document.getElementById('chat');

    // Загрузка истории чата из localStorage
    if (localStorage.getItem('chatHistory')) {
        chatContainer.innerHTML = localStorage.getItem('chatHistory');
        chatCounter = parseInt(localStorage.getItem('chatCounter')) || 0;
        chatbot = JSON.parse(localStorage.getItem('chatbot')) || [];
        // Инициализируем подсветку в загруженных сообщениях
        hljs.highlightAll();
    }

    document.getElementById('chat-form').addEventListener('submit', function(event) {
        event.preventDefault();
        const messageInput = document.getElementById('message-input');
        const userMessage = messageInput.value.trim();
        if (userMessage === '') return;

        // Отображаем сообщение пользователя
        addMessage('user', userMessage);
        messageInput.value = '';

        // Отправляем сообщение на сервер
        fetch('/chat', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                message: userMessage,
                chat_counter: chatCounter,
                chatbot: chatbot
            }),
        })
        .then(response => response.json())
        .then(data => {
            // Отображаем ответ ИИ
            addMessage('ai', data.response);

            // Обновляем chatCounter и chatbot
            chatCounter = data.chat_counter;
            chatbot = data.chatbot;

            // Сохраняем историю чата и состояние в localStorage
            localStorage.setItem('chatHistory', chatContainer.innerHTML);
            localStorage.setItem('chatCounter', chatCounter);
            localStorage.setItem('chatbot', JSON.stringify(chatbot));

            // Инициализируем подсветку в новых сообщениях
            hljs.highlightAll();
        })
        .catch((error) => {
            console.error('Ошибка:', error);
        });
    });

    document.getElementById('reset-btn').addEventListener('click', function() {
        // Отправляем запрос на сброс состояния на сервер
        fetch('/reset', {
            method: 'POST',
        })
        .then(response => response.json())
        .then(data => {
            // Очищаем историю чата и состояние
            chatContainer.innerHTML = '';
            chatCounter = 0;
            chatbot = [];

            // Удаляем данные из localStorage
            localStorage.removeItem('chatHistory');
            localStorage.removeItem('chatCounter');
            localStorage.removeItem('chatbot');
        })
        .catch((error) => {
            console.error('Ошибка:', error);
        });
    });

    function addMessage(sender, text) {
        const messageDiv = document.createElement('div');
        messageDiv.classList.add('message', sender);

        const p = document.createElement('p');
        p.innerHTML = text;

        messageDiv.appendChild(p);
        chatContainer.appendChild(messageDiv);

        // Прокручиваем чат вниз
        chatContainer.scrollTop = chatContainer.scrollHeight;

        // Сохраняем историю чата в localStorage
        localStorage.setItem('chatHistory', chatContainer.innerHTML);
    }
</script>
</body>
</html>
]