fruitpicker01's picture
Create app.py
7934a24 verified
raw
history blame
5.68 kB
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") # Оранжевая кнопка