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") # Оранжевая кнопка