File size: 5,683 Bytes
7934a24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import gradio as gr
import requests
import os
import pandas as pd
import time
from langchain.schema import SystemMessage
from langchain.chat_models.gigachat import GigaChat
from PIL import Image, ImageDraw, ImageFont

# Установка ключа API для OpenAI и GigaChat
openai_api_key = os.getenv('GPT_KEY')
gc_key = os.getenv('GC_KEY')

# Авторизация в сервисе GigaChat
chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', verify_ssl_certs=False)
chat_lite = GigaChat(credentials=gc_key, model='GigaChat', verify_ssl_certs=False)

# Загрузка данных из Excel-файла
try:
    data = pd.read_excel('Признаки.xlsx', sheet_name=None)
except Exception as e:
    print(f"Ошибка при загрузке Excel-файла: {e}")
    data = {}

# Создание списка признаков и их значений
features = {}
for sheet_name, df in data.items():
    try:
        features[sheet_name] = df.set_index(df.columns[0]).to_dict()[df.columns[1]]
    except Exception as e:
        print(f"Ошибка при обработке данных листа {sheet_name}: {e}")
        features[sheet_name] = {}

# Функция для генерации промпта
def generate_prompt(*selected_values):
    prompt = "Напиши типичное рекламное SMS-сообщение от ПАО Сбербанк, но с учетом следующих правил (длина сообщения не должна превышать 250 знаков с учетом пробелов):\n"
    for i, feature in enumerate(features.keys()):
        if selected_values[i]:
            try:
                prompt += f"{features[feature][selected_values[i]]}\n"
            except KeyError:
                return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
    return prompt.strip()

# Функция для генерации сообщения с помощью GPT-4o
def generate_message_gpt4o(prompt):
    try:
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {openai_api_key}"
        }
        data = {
            "model": "gpt-4o",
            "messages": [{"role": "system", "content": prompt}],
            "max_tokens": 700
        }
        response = requests.post("https://api.openai.com/v1/chat/completions", json=data, headers=headers)
        response_data = response.json()
        return response_data["choices"][0]["message"]["content"].strip()
    except Exception as e:
        return f"Ошибка при обращении к GPT-4o: {e}"

# Функция для генерации сообщения с помощью GigaChat-Pro
def generate_message_gigachat_pro(prompt):
    try:
        messages = [SystemMessage(content=prompt)]
        res = chat_pro(messages)
        return res.content.strip()
    except Exception as e:
        return f"Ошибка при обращении к GigaChat-Pro: {e}"

# Функция для генерации сообщения с помощью GigaChat
def generate_message_gigachat_lite(prompt):
    try:
        time.sleep(2)  # Задержка 2 секунды перед запросом к GigaChat
        messages = [SystemMessage(content=prompt)]
        res = chat_lite(messages)
        return res.content.strip()
    except Exception as e:
        return f"Ошибка при обращении к GigaChat-Lite: {e}"

# Функция для добавления текста на изображение
def add_text_to_image(image_path, prompt, gpt4o_message, gigachat_pro_message, gigachat_lite_message):
    img = Image.open(image_path)
    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype("arial.ttf", 20)
    
    # Определите позиции, где будут отображаться ваши сообщения
    prompt_position = (50, 50)
    gpt4o_position = (50, 150)
    gigachat_pro_position = (50, 250)
    gigachat_lite_position = (50, 350)
    
    draw.text(prompt_position, prompt, font=font, fill="black")
    draw.text(gpt4o_position, gpt4o_message, font=font, fill="black")
    draw.text(gigachat_pro_position, gigachat_pro_message, font=font, fill="black")
    draw.text(gigachat_lite_position, gigachat_lite_message, font=font, fill="black")
    
    img.save("output_pipeline.png")
    return "output_pipeline.png"

# Функция для обработки нажатия кнопки Submit
def generate_messages(*selected_values):
    prompt = generate_prompt(*selected_values)
    if "Ошибка" in prompt:
        return prompt, "", "", "", None
    message_gpt4o = generate_message_gpt4o(prompt)
    message_gigachat_pro = generate_message_gigachat_pro(prompt)
    message_gigachat_lite = generate_message_gigachat_lite(prompt)
    
    # Добавление текста на изображение
    image_path = add_text_to_image('pipeline.png', prompt, message_gpt4o, message_gigachat_pro, message_gigachat_lite)
    
    return prompt, message_gpt4o, message_gigachat_pro, message_gigachat_lite, image_path

# Создание интерфейса Gradio
with gr.Blocks() as demo:
    gr.Markdown("# Генерация SMS-сообщений по заданным признакам")
    
    with gr.Row():
        with gr.Column(scale=1):
            selections = []
            for feature in features.keys():
                selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))

            submit_btn = gr.Button("Submit")  # Оранжевая кнопка