from flask import Flask, request, jsonify, render_template
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch
import requests
import os

app = Flask(__name__)

# Загрузка модели GPT-2 и токенизатора
model_name = 'gpt2'  # Можно выбрать более мощную модель, например, 'gpt2-medium'
tokenizer = GPT2Tokenizer.from_pretrained(model_name)
model = GPT2LMHeadModel.from_pretrained(model_name)
model.eval()  # Устанавливаем модель в режим оценки

# Если доступно GPU, используем его
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

# Главная страница
@app.route('/')
def index():
    return render_template('index.html')

# Маршрут для обработки сообщений чата
@app.route('/chat', methods=['POST'])
def chat():
    user_input = request.json.get('message')
    if not user_input:
        return jsonify({'response': 'Пожалуйста, введите сообщение.'})

    # Подготовка входных данных для модели
    input_ids = tokenizer.encode(user_input + tokenizer.eos_token, return_tensors='pt').to(device)

    # Генерация ответа
    with torch.no_grad():
        output_ids = model.generate(
            input_ids,
            max_length=100,  # Максимальная длина ответа
            pad_token_id=tokenizer.eos_token_id,
            no_repeat_ngram_size=2,
            do_sample=True,
            top_k=50,
            top_p=0.95,
            temperature=0.7
        )

    # Декодирование сгенерированного текста
    response = tokenizer.decode(output_ids[0], skip_special_tokens=True)
    
    # Удаление пользовательского ввода из ответа модели
    response = response[len(user_input):].strip()

    return jsonify({'response': response})

# Маршрут для поиска модов на Modrinth
@app.route('/search_mods', methods=['POST'])
def search_mods():
    query = request.json.get('query')
    url = f"https://api.modrinth.com/v2/search?query={query}&limit=10"
    response = requests.get(url)
    if response.status_code == 200:
        mods = response.json()
        return jsonify(mods)
    else:
        return jsonify({'status': 'error', 'message': 'Не удалось выполнить поиск модов.'}), 500

# Маршрут для скачивания модов
@app.route('/download_mod', methods=['POST'])
def download_mod():
    mod_id = request.json.get('mod_id')
    if not mod_id:
        return jsonify({'status': 'error', 'message': 'ID мода не предоставлен.'}), 400

    # Получение информации о моде
    mod_info_url = f"https://api.modrinth.com/v2/project/{mod_id}/version"
    response = requests.get(mod_info_url)
    
    if response.status_code == 200:
        versions = response.json()
        if versions:
            # Предположим, что берем первую версию и первый файл
            download_url = versions[0]['files'][0]['url']
            file_name = versions[0]['files'][0]['filename']
            download_response = requests.get(download_url)
            
            if download_response.status_code == 200:
                # Сохранение файла
                save_dir = 'downloads'
                os.makedirs(save_dir, exist_ok=True)
                save_path = os.path.join(save_dir, file_name)
                with open(save_path, 'wb') as f:
                    f.write(download_response.content)
                
                return jsonify({'status': 'success', 'file_path': save_path})
            else:
                return jsonify({'status': 'error', 'message': 'Не удалось скачать файл мода.'}), 500
        else:
            return jsonify({'status': 'error', 'message': 'Версии мода не найдены.'}), 404
    else:
        return jsonify({'status': 'error', 'message': 'Мод не найден.'}), 404

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

добавь команду обучение