Привет не поддерживается тут роль систем еще давай сделаем чтобы в первом сообщении пользователя этот промпт был и напиши весь код мне import gradio as gr
import requests
import json
import configparser
import os
import sys
import time
from datetime import datetime
import uuid  # Для генерации уникальных session_id

def load_config(config_path='config.ini'):
    """
    Загрузка конфигурации из указанного ini-файла.
    """
    config = configparser.ConfigParser()
    
    if not os.path.exists(config_path):
        sys.exit(f"Ошибка: Файл конфигурации '{config_path}' не найден.")
    
    config.read(config_path)
    
    try:
        api_key = config['openai']['api_key']
        return api_key
    except KeyError:
        sys.exit("Ошибка: 'api_key' не найден в секции [openai] файла config.ini.")

def load_system_prompt(prompt_path='system_prompt.txt'):
    """
    Загрузка системного промпта из текстового файла.
    """
    if not os.path.exists(prompt_path):
        # Если файл не найден, возвращаем пустую строку или значение по умолчанию
        return ""
    with open(prompt_path, 'r', encoding='utf-8') as f:
        return f.read()

# Загрузка API-ключа
API_KEY = load_config()
API_URL = 'https://api.openai.com/v1/chat/completions'

headers = {
    'Content-Type': 'application/json',
    'Authorization': f'Bearer {API_KEY}',
}

# Тарифы за 1000 токенов для разных моделей (укажите актуальные цены)
MODEL_PRICES = {
    "o1-preview": 0.015,
    "o1-mini": 0.003,
    "gpt-4o": 0.0025,
}

def chat_with_gpt(model_name, messages):
    """
    Отправка сообщений модели GPT и получение ответа.
    """
    # Загружаем системный промпт
    system_prompt = load_system_prompt()

    formatted_messages = []
    # Если системный промпт не пустой, добавляем его в сообщения
    if system_prompt:
        formatted_messages.append({"role": "system", "content": system_prompt})

    for user_msg, assistant_msg in messages:
        if user_msg:
            formatted_messages.append({"role": "user", "content": user_msg})
        if assistant_msg:
            formatted_messages.append({"role": "assistant", "content": assistant_msg})

    data = {
        "model": model_name,
        "messages": formatted_messages,
    }

    try:
        start_time = time.time()  # Время начала запроса
        response = requests.post(API_URL, headers=headers, data=json.dumps(data))
        response.raise_for_status()
        end_time = time.time()  # Время окончания запроса

        response_json = response.json()
        reply_content = response_json['choices'][0]['message']['content']

        # Получаем информацию об использовании токенов
        total_tokens = response_json['usage']['total_tokens']
        # Рассчитываем стоимость
        price_per_1000_tokens = MODEL_PRICES.get(model_name, 0)
        cost = (total_tokens / 1000) * price_per_1000_tokens

        # Формируем дополнительную информацию
        processing_time = end_time - start_time

        return reply_content, total_tokens, cost, processing_time

    except requests.exceptions.HTTPError as http_err:
        error_message = f"HTTP ошибка {response.status_code}: {response.text}"
        return error_message, 0, 0, 0
    except Exception as err:
        error_message = f"Произошла ошибка: {err}"
        return error_message, 0, 0, 0

def save_chat_history(session_id, user_input, assistant_reply, model_name, tokens_used, cost, processing_time):
    """
    Сохраняет историю чата в файл в папке data.
    """
    # Создаем папку data, если ее нет
    if not os.path.exists("data"):
        os.makedirs("data")
    
    # Формируем имя файла на основе session_id
    filename = f"data/chat_{session_id}.txt"

    with open(filename, "a", encoding="utf-8") as f:
        f.write(f"Время: {datetime.now()}\n")
        f.write(f"Модель: {model_name}\n")
        f.write(f"Сообщение пользователя: {user_input}\n")
        f.write(f"Ответ ассистента: {assistant_reply}\n")
        f.write(f"Использовано токенов за сообщение: {tokens_used}\n")
        f.write(f"Стоимость сообщения: ${cost:.6f}\n")
        f.write(f"Время обработки сообщения: {processing_time:.2f} сек\n")
        f.write("-" * 50 + "\n")

def respond(user_input, history, model_name, session_id, total_tokens, total_cost):
    """
    Обработка пользовательского ввода и обновление истории чата.
    """
    history = history or []
    
    if not user_input.strip():
        return history, history, session_id, total_tokens, total_cost

    # Добавляем новое сообщение пользователя
    history.append((user_input, ""))

    # Получаем ответ от GPT
    reply, tokens_used, cost, processing_time = chat_with_gpt(model_name, history)

    # Обновляем последний кортеж с ответом от ассистента
    history[-1] = (user_input, reply)

    # Обновляем общие значения
    total_tokens += tokens_used
    total_cost += cost

    # Добавляем дополнительные сведения к ответу (не передаем их обратно модели)
    assistant_reply = reply + f"\n\n_Время обработки сообщения: {processing_time:.2f} сек_\n"
    assistant_reply += f"_Использовано токенов за сообщение: {tokens_used}_\n"
    assistant_reply += f"_Стоимость сообщения: ${cost:.6f}_\n"
    assistant_reply += f"_Общее количество токенов: {total_tokens}_\n"
    assistant_reply += f"_Общая стоимость: ${total_cost:.6f}_"

    # Обновляем ответ ассистента в истории
    history[-1] = (user_input, assistant_reply)

    # Сохраняем историю и информацию в файл
    save_chat_history(session_id, user_input, reply, model_name, tokens_used, cost, processing_time)

    return history, history, session_id, total_tokens, total_cost

with gr.Blocks() as demo:
    gr.Markdown("# Чат с GPT-моделью")

    # Создаем уникальный session_id для каждой сессии
    session_id = gr.State(str(uuid.uuid4()))
    total_tokens = gr.State(0)  # Состояние для общего количества токенов
    total_cost = gr.State(0.0)  # Состояние для общей стоимости

    # Добавляем elem_id к Chatbot для доступа из JavaScript
    chatbot = gr.Chatbot(elem_id="chatbot")

    with gr.Row():
        msg = gr.Textbox(label="Ваше сообщение:", placeholder="Введите сообщение и нажмите Enter или кнопку Отправить...")
        send_btn = gr.Button("Отправить")

    with gr.Row():
        model_selector = gr.Dropdown(
            choices=["o1-preview", "o1-mini", "gpt-4o"],
            value="o1-preview",
            label="Выберите модель GPT"
        )
        clear_btn = gr.Button("Очистить историю чата")

    # Обработка отправки сообщения
    def on_submit(user_input, history, model_name, session_id, total_tokens, total_cost):
        msg.value = ""  # Очищаем поле ввода после отправки
        return respond(user_input, history, model_name, session_id, total_tokens, total_cost)

    msg.submit(
        on_submit,
        [msg, chatbot, model_selector, session_id, total_tokens, total_cost],
        [chatbot, chatbot, session_id, total_tokens, total_cost]
    )
    send_btn.click(
        on_submit,
        [msg, chatbot, model_selector, session_id, total_tokens, total_cost],
        [chatbot, chatbot, session_id, total_tokens, total_cost]
    )

    # Обработка кнопки очистки истории
    def on_clear(session_id):
        # При очистке истории генерируем новый session_id и сбрасываем счетчики
        session_id = str(uuid.uuid4())
        return [], [], session_id, 0, 0.0

    clear_btn.click(on_clear, [session_id], [chatbot, chatbot, session_id, total_tokens, total_cost])


if __name__ == "__main__":
    demo.launch(share=True)