fruitpicker01's picture
Update app.py
70ae20f verified
import gradio as gr
import requests
import os
import json
import pandas as pd
import time
from langchain.schema import SystemMessage
from langchain_community.chat_models.gigachat import GigaChat
from openpyxl import load_workbook
import base64
from together import Together
from mistralai import Mistral
# Установка ключа API для OpenAI, GigaChat и Mistral
openai_api_key = os.getenv('GPT_KEY')
gc_key = os.getenv('GC_KEY')
token = os.getenv('GITHUB_TOKEN')
TOGETHER_API_KEY = os.getenv('TOGETHER_API_KEY')
# Инициализация клиента для Together
client = Together(api_key=TOGETHER_API_KEY)
# Авторизация в сервисе GigaChat
chat_pro = GigaChat(credentials=gc_key, model='GigaChat-Pro', max_tokens=68, temperature=1, verify_ssl_certs=False)
chat_lite = GigaChat(credentials=gc_key, model='GigaChat', max_tokens=68, temperature=1, verify_ssl_certs=False)
chat_plus = GigaChat(credentials=gc_key, model='GigaChat-Plus', max_tokens=68, temperature=1, 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:
if sheet_name == "Пол Поколение Психотип":
# Создаем словарь, где ключи — это кортежи (Пол, Поколение, Психотип), а значения — инструкции
features[sheet_name] = df.set_index(['Пол', 'Поколение', 'Психотип'])['Инструкция'].to_dict()
else:
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] = {}
current_request_index = -1 # Изначально указывает на последний запрос
def save_user_request_to_github(description, advantages, key_message, approach, personalization_params):
global current_request_index # Используем глобальную переменную
current_request_index = -1 # Сбрасываем позицию к последнему запросу
# Собираем все данные в один словарь
data_to_save = {
"description": description,
"advantages": advantages,
"key_message": key_message,
"approach": approach,
"personalization_params": personalization_params,
"timestamp": time.time()
}
# Преобразуем контент в JSON-строку и кодируем в base64
file_content_encoded = base64.b64encode(json.dumps(data_to_save).encode()).decode()
# Параметры для GitHub API
repo = "fruitpicker01/Storage_dev"
path = f"user_request_{int(time.time())}.json"
url = f"https://api.github.com/repos/{repo}/contents/{path}"
headers = {
"Authorization": f"token {token}",
"Content-Type": "application/json"
}
data = {
"message": f"Добавлен новый файл {path}",
"content": file_content_encoded
}
# Отправка POST-запроса на GitHub API для создания файла в репозитории
response = requests.put(url, headers=headers, data=json.dumps(data))
if response.status_code == 201:
print("Данные успешно сохранены на GitHub")
else:
print(f"Ошибка при сохранении данных на GitHub: {response.status_code} {response.text}")
def load_previous_user_request_from_github():
global current_request_index # Используем глобальную переменную
repo = "fruitpicker01/Storage_dev"
url = f"https://api.github.com/repos/{repo}/contents"
headers = {
"Authorization": f"token {token}",
"Content-Type": "application/json"
}
# Получаем список файлов в репозитории
response = requests.get(url, headers=headers)
if response.status_code == 200:
files = response.json()
json_files = [file for file in files if file['name'].startswith("user_request_")]
if not json_files:
print("Нет сохраненных запросов.")
return "", "", "", "", "", "", "", "", "", "", None, None, None, None, None, None
# Определяем новый индекс для загрузки предыдущего файла
current_request_index -= 1
# Если достигли начала списка, остаёмся на первой записи
if abs(current_request_index) > len(json_files):
current_request_index = -len(json_files)
# Находим файл с нужным индексом
target_file = json_files[current_request_index]
file_url = target_file['download_url']
# Загружаем и декодируем содержимое файла
file_response = requests.get(file_url)
if file_response.status_code == 200:
data = json.loads(file_response.text)
description = data.get('description', "")
advantages = data.get('advantages', "")
key_message = data.get('key_message', "") # Load key message
approach = data.get('approach', "") # Load approach
personalization_params = data.get('personalization_params', [None] * 6) # Убедитесь, что размер списка соответствует количеству полей
# Возвращаем данные по отдельности для каждого компонента Gradio
return description, advantages, key_message, approach, *personalization_params
else:
print(f"Ошибка при загрузке файла: {file_response.status_code}")
return "", "", "", "", "", "", "", "", "", "", None, None, None, None, None, None
else:
print(f"Ошибка при обращении к GitHub: {response.status_code}")
return "", "", "", "", "", "", "", "", "", "", None, None, None, None, None, None
# Функция для генерации стандартного промпта
def generate_standard_prompt(description, advantages, key_message, approach, *selected_values):
if approach == "Призыв к действию":
prompt = "Сгенерируй смс-сообщение для клиента. Начни сообщение с призыва к действию с продуктом.\n"
elif approach == "Указание на пользу":
prompt = "Сгенерируй смс-сообщение для клиента. Начни сообщение с указания на пользу продукта. Используй глагол в побудительном наклонении.\n"
elif approach == "Вопрос":
prompt = "Сгенерируй смс-сообщение для клиента. Начни сообщение с вопроса, который указывает на пользу продукта для клиента.\n"
prompt += (
f"Описание предложения: {description}\n"
f"Преимущества: {advantages}\n"
"В тексте смс запрещено использование:\n"
"- Запрещенные слова: № один, номер один, № 1, вкусный, дешёвый, продукт, спам, доступный, банкротство, долги, займ, срочно, сейчас, лучший, главный, номер 1, гарантия, успех, лидер;\n"
"- Обращение к клиенту;\n"
"- Приветствие клиента;\n"
"- Обещания и гарантии;\n"
"- Использовать составные конструкции из двух глаголов;\n"
"- Причастия и причастные обороты;\n"
"- Деепричастия и деепричастные обороты;\n"
"- Превосходная степень прилагательных;\n"
"- Страдательный залог;\n"
"- Порядковые числительные от 10 прописью;\n"
"- Цепочки с придаточными предложениями;\n"
"- Разделительные повторяющиеся союзы;\n"
"- Вводные конструкции;\n"
"- Усилители;\n"
"- Паразиты времени;\n"
"- Несколько существительных подряд, в том числе отглагольных;\n"
"- Производные предлоги;\n"
"- Сложные предложения, в которых нет связи между частями;\n"
"- Сложноподчинённые предложения;\n"
"- Даты прописью;\n"
"- Близкие по смыслу однородные члены предложения;\n"
"- Шокирующие, экстравагантные, кликбейтные фразы;\n"
"- Абстрактные заявления без поддержки фактами и отсутствие доказательства пользы для клиента;\n"
"- Гарантирующие фразы;\n"
"- Узкоспециализированные термины;\n"
"- Фразы, способные создать двойственное ощущение, обидеть;\n"
"- Речевые клише, рекламные штампы, канцеляризмы;\n"
"Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
)
if approach == "Призыв к действию":
prompt += "Убедись, что готовый текст начинается с призыва к действию с продуктом.\n"
elif approach == "Указание на пользу":
prompt += "Убедись, что готовый текст начинается с указания на пользу продукта и использования глагола в побудительном наклонении.\n"
elif approach == "Вопрос":
prompt += "Убедись, что готовый текст начинается с вопроса, который указывает на пользу продукта для клиента.\n"
if key_message.strip():
prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
return prompt
# Функции для генерации сообщений
def generate_message_gpt4o(prompt):
try:
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {openai_api_key}"
}
data = {
"model": "chatgpt-4o-latest",
"messages": [{"role": "system", "content": prompt}],
"max_tokens": 101,
"temperature": 1.1
}
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"Ошибка при обращении к ChatGPT-4o-Latest: {e}"
def clean_message(message):
# Если сообщение не заканчивается на точку, восклицательный знак или вопросительный знак, обрезаем его до последнего такого знака
if not message.endswith(('.', '!', '?')):
last_period = max(message.rfind('.'), message.rfind('!'), message.rfind('?'))
if last_period != -1:
message = message[:last_period + 1]
return message
# Обновленные функции генерации сообщений с учетом обрезки незаконченных предложений
def generate_message_gigachat_pro(prompt):
try:
messages = [SystemMessage(content=prompt)]
res = chat_pro(messages)
cleaned_message = clean_message(res.content.strip())
return cleaned_message
except Exception as e:
return f"Ошибка при обращении к GigaChat-Pro: {e}"
def generate_message_gigachat_lite(prompt):
try:
time.sleep(2)
messages = [SystemMessage(content=prompt)]
res = chat_lite(messages)
cleaned_message = clean_message(res.content.strip())
return cleaned_message
except Exception as e:
return f"Ошибка при обращении к GigaChat-Lite: {e}"
def generate_message_gigachat_plus(prompt):
try:
time.sleep(2)
messages = [SystemMessage(content=prompt)]
res = chat_plus(messages)
cleaned_message = clean_message(res.content.strip())
return cleaned_message
except Exception as e:
return f"Ошибка при обращении к GigaChat-Plus: {e}"
def generate_message_meta_llama_3_1_405b(prompt):
try:
response = client.chat.completions.create(
model="meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo",
messages=[{"role": "user", "content": prompt}],
max_tokens=74,
temperature=0.8
)
cleaned_message = clean_message(response.choices[0].message.content.strip())
return cleaned_message
except Exception as e:
return f"Ошибка при обращении к Meta-Llama-3.1-405B: {e}"
def generate_message_meta_llama_3_1_70b(prompt):
try:
response = client.chat.completions.create(
model="meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
messages=[{"role": "user", "content": prompt}],
max_tokens=74,
temperature=0.8
)
cleaned_message = clean_message(response.choices[0].message.content.strip())
return cleaned_message
except Exception as e:
return f"Ошибка при обращении к Meta-Llama-3.1-70B: {e}"
def generate_message_meta_llama_3_1_8b(prompt):
try:
response = client.chat.completions.create(
model="meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
messages=[{"role": "user", "content": prompt}],
max_tokens=74,
temperature=0.8
)
cleaned_message = clean_message(response.choices[0].message.content.strip())
return cleaned_message
except Exception as e:
return f"Ошибка при обращении к Meta-Llama-3.1-8B: {e}"
def generate_message_gpt4o_with_retry(prompt):
for _ in range(10): # Максимум 10 попыток
message = generate_message_gpt4o(prompt)
if len(message) <= 250:
return message
return message # Возвращаем последнее сгенерированное сообщение, если все попытки не удались
def generate_message_gigachat_pro_with_retry(prompt):
for _ in range(10):
message = generate_message_gigachat_pro(prompt)
if len(message) <= 250:
return message
return message
def generate_message_gigachat_lite_with_retry(prompt):
for _ in range(10):
message = generate_message_gigachat_lite(prompt)
if len(message) <= 250:
return message
return message
def generate_message_gigachat_plus_with_retry(prompt):
for _ in range(10):
message = generate_message_gigachat_plus(prompt)
if len(message) <= 250:
return message
return message
def generate_message_meta_llama_3_1_405b_with_retry(prompt):
for _ in range(10):
message = generate_message_meta_llama_3_1_405b(prompt)
if len(message) <= 250:
return message
return message
def generate_messages(description, advantages, key_message, approach, *selected_values):
save_user_request_to_github(description, advantages, key_message, approach, selected_values)
standard_prompt = generate_standard_prompt(description, advantages, key_message, approach, *selected_values)
results = {
"prompt": standard_prompt,
"gigachat_pro": None,
"gigachat_lite": None,
"gigachat_plus": None,
"gpt4o": None,
"meta_llama_3_1_405b": None
}
yield results["prompt"], "", "", "", "", ""
# Generating messages using existing models (as before)
results["gigachat_pro"] = generate_message_gigachat_pro_with_retry(standard_prompt)
gigachat_pro_length = len(results["gigachat_pro"])
gigachat_pro_display = f"{results['gigachat_pro']}\n\n------\nКоличество знаков: {gigachat_pro_length}"
yield results["prompt"], gigachat_pro_display, "", "", "", ""
results["gigachat_lite"] = generate_message_gigachat_lite_with_retry(standard_prompt)
gigachat_lite_length = len(results["gigachat_lite"])
gigachat_lite_display = f"{results['gigachat_lite']}\n\n------\nКоличество знаков: {gigachat_lite_length}"
yield results["prompt"], gigachat_pro_display, gigachat_lite_display, "", "", ""
time.sleep(2)
results["gigachat_plus"] = generate_message_gigachat_plus_with_retry(standard_prompt)
gigachat_plus_length = len(results["gigachat_plus"])
gigachat_plus_display = f"{results['gigachat_plus']}\n\n------\nКоличество знаков: {gigachat_plus_length}"
yield results["prompt"], gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "", ""
time.sleep(2)
results["gpt4o"] = generate_message_gpt4o_with_retry(standard_prompt)
gpt4o_length = len(results["gpt4o"])
gpt4o_display = f"{results['gpt4o']}\n\n------\nКоличество знаков: {gpt4o_length}"
yield results["prompt"], gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, gpt4o_display, ""
time.sleep(2)
results["meta_llama_3_1_405b"] = generate_message_meta_llama_3_1_405b_with_retry(standard_prompt)
meta_llama_405b_length = len(results["meta_llama_3_1_405b"])
meta_llama_405b_display = f"{results['meta_llama_3_1_405b']}\n\n------\nКоличество знаков: {meta_llama_405b_length}"
yield results["prompt"], gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, gpt4o_display, meta_llama_405b_display
time.sleep(2)
return results
# Функция для генерации персонализированного промпта
def generate_personalization_prompt(key_message, approach, *selected_values):
prompt = "Адаптируй, не превышая длину сообщения в 250 знаков с пробелами, текст с учетом следующих особенностей:\n"
gender, generation, psychotype = selected_values[0], selected_values[1], selected_values[2]
combined_instruction = ""
additional_instructions = ""
print(f"Выбранные значения: Пол={gender}, Поколение={generation}, Психотип={psychotype}")
# Проверяем, выбраны ли все три параметра: Пол, Поколение, Психотип
if gender and generation and psychotype:
# Получаем данные с листа "Пол Поколение Психотип"
sheet = features.get("Пол Поколение Психотип", {})
# Ищем ключ, соответствующий комбинации "Пол", "Поколение", "Психотип"
key = (gender, generation, psychotype)
if key in sheet:
combined_instruction = sheet[key]
print(f"Найдена комбинированная инструкция: {combined_instruction}")
else:
print(f"Комбинированная инструкция для ключа {key} не найдена.")
# Если не найдена комбинированная инструкция, добавляем индивидуальные инструкции
if not combined_instruction:
print("Добавляем индивидуальные инструкции для Пол, Поколение, Психотип.")
for i, feature in enumerate(["Пол", "Поколение", "Психотип"]):
if selected_values[i]:
try:
instruction = features[feature][selected_values[i]]
additional_instructions += f"{instruction}\n"
print(f"Добавлена инструкция из {feature}: {instruction}")
except KeyError:
return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
# Добавляем инструкции для остальных параметров (например, Отрасль)
for i, feature in enumerate(features.keys()):
if feature not in ["Пол", "Поколение", "Психотип", "Пол Поколение Психотип"]:
if i < len(selected_values) and selected_values[i]:
try:
instruction = features[feature][selected_values[i]]
additional_instructions += f"{instruction}\n"
print(f"Добавлена инструкция из {feature}: {instruction}")
except KeyError:
return f"Ошибка: выбранное значение {selected_values[i]} не найдено в данных."
# Формируем итоговый промпт
if combined_instruction:
prompt += combined_instruction # Добавляем комбинированную инструкцию, если она есть
if additional_instructions:
prompt += additional_instructions # Добавляем остальные инструкции
prompt += "Убедись, что в готовом тексте до 250 знаков с пробелами.\n"
if approach == "Призыв к действию":
prompt += "Убедись, что готовый текст начинается с призыва к действию с продуктом.\n"
elif approach == "Указание на пользу":
prompt += "Убедись, что готовый текст начинается с указания на пользу продукта и использования глагола в побудительном наклонении.\n"
elif approach == "Вопрос":
prompt += "Убедись, что готовый текст начинается с вопроса, который указывает на пользу продукта для клиента.\n"
prompt += f"Убедись, что в готовом тексте есть следующая ключевая информация: {key_message.strip()}"
return prompt.strip()
# Функция для выполнения персонализации на основе сгенерированного промпта и сообщения
def perform_personalization(standard_message, personalization_prompt):
full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
return generate_message_gpt4o_with_retry(full_prompt)
# Также обновляем функции персонализации
def perform_personalization_gigachat(standard_message, personalization_prompt, model):
full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
if model == "gigachat_pro":
result = generate_message_gigachat_pro_with_retry(full_prompt)
elif model == "gigachat_lite":
result = generate_message_gigachat_lite_with_retry(full_prompt)
elif model == "gigachat_plus":
result = generate_message_gigachat_plus_with_retry(full_prompt)
return clean_message(result)
def perform_personalization_meta_llama_405b(standard_message, personalization_prompt):
full_prompt = f"{personalization_prompt}\n\nТекст для адаптации:\n{standard_message}"
return generate_message_meta_llama_3_1_405b_with_retry(full_prompt)
# Updated function to include additional models in personalization
def personalize_messages_with_yield(
gigachat_pro_message,
gigachat_lite_message,
gigachat_plus_message,
gpt4o_message,
meta_llama_405b_message,
key_message,
approach,
*selected_values
):
personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
yield personalization_prompt, "", "", "", "", ""
personalized_message_gigachat_pro = perform_personalization_gigachat(gigachat_pro_message, personalization_prompt, "gigachat_pro")
gigachat_pro_length = len(personalized_message_gigachat_pro)
gigachat_pro_display = f"{personalized_message_gigachat_pro}\n\n------\nКоличество знаков: {gigachat_pro_length}"
yield personalization_prompt, gigachat_pro_display, "", "", "", ""
personalized_message_gigachat_lite = perform_personalization_gigachat(gigachat_lite_message, personalization_prompt, "gigachat_lite")
gigachat_lite_length = len(personalized_message_gigachat_lite)
gigachat_lite_display = f"{personalized_message_gigachat_lite}\n\n------\nКоличество знаков: {gigachat_lite_length}"
yield personalization_prompt, gigachat_pro_display, gigachat_lite_display, "", "", ""
personalized_message_gigachat_plus = perform_personalization_gigachat(gigachat_plus_message, personalization_prompt, "gigachat_plus")
gigachat_plus_length = len(personalized_message_gigachat_plus)
gigachat_plus_display = f"{personalized_message_gigachat_plus}\n\n------\nКоличество знаков: {gigachat_lite_length}"
yield personalization_prompt, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, "", ""
personalized_message_gpt4o = perform_personalization(gpt4o_message, personalization_prompt)
gpt4o_length = len(personalized_message_gpt4o)
gpt4o_display = f"{personalized_message_gpt4o}\n\n------\nКоличество знаков: {gpt4o_length}"
yield personalization_prompt, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, gpt4o_display, ""
personalized_message_meta_llama_405b = perform_personalization_meta_llama_405b(meta_llama_405b_message, personalization_prompt)
meta_llama_405b_length = len(personalized_message_meta_llama_405b)
meta_llama_405b_display = f"{personalized_message_meta_llama_405b}\n\n------\nКоличество знаков: {meta_llama_405b_length}"
yield personalization_prompt, gigachat_pro_display, gigachat_lite_display, gigachat_plus_display, gpt4o_display, meta_llama_405b_display
# Функция для генерации промпта проверки текста
def generate_error_check_prompt():
prompt = (
"Проверь текст SMS-сообщения на соответствие установленным правилам и ограничениям, касающимся его формирования. На основе выявленных несоответствий предоставь рекомендации по исправлению текста. "
"Особое внимание удели проверке: количества символов в тексте SMS-сообщения, орфографическим и пунктуационным ошибкам, определению частей речи (причастия, деепричастия, причастный оборот, деепричастный оборот). "
"Анализируй только текст SMS-сообщения, ничего не придумывай и не добавляй лишнего. "
"Правила и ограничения, которым должен соответствовать текст SMS-сообщения:\n"
"1. Количество символов в SMS-сообщении должно быть до 250 знаков с учетом пробелов.\n"
"2. В тексте должен быть призыв к действию с использованием глагола в повелительном наклонении (например: оформите, получите, разместите, размещайте, откройте, подключите, подайте заявку).\n"
"3. Должно соблюдаться соответствие фактов о продукте.\n"
"4. В генерациях смс запрещено использовать обещания и гарантии.\n"
"5. В генерациях смс запрещено использовать составные конструкции из двух глаголов.\n"
"6. В генерациях смс запрещено использовать причастия и причастные обороты.\n"
"7. В генерациях смс запрещено использовать деепричастия и деепричастные обороты.\n"
"8. В генерациях смс запрещено использовать превосходную степень прилагательных.\n"
"9. В генерациях смс запрещено использовать страдательный залог.\n"
"10. В генерациях смс запрещено использовать порядковые числительные от 10 прописью.\n"
"11. В генерациях смс запрещено использовать цепочки с придаточными предложениями.\n"
"12. В генерациях смс запрещено использовать разделительные повторяющиеся союзы.\n"
"13. В генерациях смс запрещено использовать вводные конструкции.\n"
"14. В генерациях смс запрещено использовать усилители.\n"
"15. В генерациях смс запрещено использовать паразиты времени.\n"
"16. В генерациях смс запрещено использовать несколько существительных подряд, в том числе отглагольных.\n"
"17. В генерациях смс запрещено использовать производные предлоги.\n"
"18. В генерациях смс запрещено использовать сложные предложения, в которых нет связи между частями.\n"
"19. В генерациях смс запрещено использовать сложноподчинённые предложения.\n"
"20. В генерациях смс запрещено использовать даты прописью.\n"
"21. В генерациях смс запрещено использовать близкие по смыслу однородные члены.\n"
"22. В генерациях смс запрещено использовать шокирующие, экстравагантные, кликбейтные фразы.\n"
"23. В генерациях смс запрещено использовать абстрактные заявления без поддержки фактами и отсутствие доказательства пользы для клиента.\n"
"24. В генерациях смс запрещено использовать гарантирующие фразы.\n"
"25. В генерациях смс запрещено использовать узкоспециализированные термины.\n"
"26. В генерациях смс запрещено использовать фразы, способные создать двойственное ощущение, обидеть.\n"
"27. В генерациях смс запрещено использовать речевые клише, рекламные штампы, канцеляризмы.\n"
"28. В генерациях смс запрещено использовать запрещенные слова: № один, номер один, № 1, вкусный, дешёвый, продукт, спам, банкротство, долги, займ, срочно, лучший, главный, номер 1, успех, лидер.\n"
"29. Сообщение должно быть написано без орфографических и грамматических ошибок.\n"
"30. Запрещены повторы слов.\n"
"31. В тексте должны использоваться правильные знаки препинания.\n"
"32. Если в тексте используются кавычки, они должны быть в форме «кавычки-ёлочки».\n"
"33. В тексте SMS сообщения должны обязательно присутствовать: название продукта, условия использования продукта / Преимущества продукта / Шаги для подключения или начала использования / Условия акции (если предложение по продукту акционное).\n"
"Форма ответа: [Ответ должен быть кратким, должен содержать только рекомендации по устранению найденных несоответствий, соответствия каждому пункту правил описывать категорически запрещено]."
)
return prompt
def save_to_github(personalized_message, model_name, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach):
# Собираем все данные в один словарь
data_to_save = {
"Модель": model_name,
"Персонализированное сообщение": personalized_message,
"Комментарий": comment,
"Откорректированное сообщение": corrected_message,
"Описание предложения": description,
"Преимущества": advantages,
"Ключевое сообщение": key_message, # Save key message
"Подход": approach, # Save approach
"Неперсонализированный промпт": non_personalized_prompt,
"Неперсонализированное сообщение": non_personalized_message,
"Персонализированный промпт": personalization_prompt, # Добавляем персонализированный промпт
"Пол": gender,
"Поколение": generation,
"Психотип": psychotype,
"Стадия бизнеса": business_stage,
"Отрасль": industry,
"ОПФ": legal_form
}
# Преобразуем контент в JSON-строку и кодируем в base64
file_content_encoded = base64.b64encode(json.dumps(data_to_save).encode()).decode()
# Параметры для GitHub API
repo = "fruitpicker01/Storage_dev"
path = f"file_{int(time.time())}.json"
url = f"https://api.github.com/repos/{repo}/contents/{path}"
headers = {
"Authorization": f"token {token}",
"Content-Type": "application/json"
}
data = {
"message": f"Добавлен новый файл {path}",
"content": file_content_encoded
}
# Отправка POST-запроса на GitHub API для создания файла в репозитории
response = requests.put(url, headers=headers, data=json.dumps(data))
def personalize_and_save(
gigachat_pro_message,
gigachat_lite_message,
gigachat_plus_message,
gpt4o_message,
meta_llama_405b_message,
description,
advantages,
key_message, # Обратите внимание, что key_message здесь не передается в selected_values
approach, # Подход тоже не должен передаваться в selected_values
*selected_values
):
# Персонализация с использованием yield для последовательного вывода
personalization_generator = personalize_messages_with_yield(
gigachat_pro_message,
gigachat_lite_message,
gigachat_plus_message,
gpt4o_message,
meta_llama_405b_message,
key_message,
approach,
*selected_values # Только признаки для персонализации
)
# Перебираем генератор, чтобы получить все значения и сохранить последний результат
last_personalization_result = None
for personalization_result in personalization_generator:
last_personalization_result = personalization_result
yield personalization_result # Отображаем результаты по мере их появления
# После завершения персонализации, сохраняем результаты
if last_personalization_result:
save_user_request_to_github(description, advantages, key_message, approach, selected_values)
def clear_fields():
return (
"", "", "", "", "", # personalized outputs and prompts
"", "", "", "", "", # comment fields
"", "", "", "", "", # corrected message fields
""
)
def clear_personalization_fields():
return (
"", "", "", "", "", # personalized outputs
"", "", "", "", "", # comment fields
"", "", "", "", "", # corrected message fields
""
)
def prepare_button_text():
return gr.update(value="Сохраняется...", visible=True)
def update_button_text():
return gr.update(value="Сохранено!", visible=True)
def reset_button_text():
time.sleep(2) # Задержка в 2 секунды
return gr.update(value="Сохранить в базу", visible=True)
def clear_unnecessary_fields():
return (
"", "", "", "", "", # personalized outputs and prompts
"", "", "", "", "", # comment fields
"", "", "", "", "", # corrected message fields
"", "", "", "", "", # оставшиеся поля
"", "" # Дополнительное пустое значение
)
def regen_message_gpt4o(description, advantages, key_message, approach, *selected_values):
standard_prompt = generate_standard_prompt(description, advantages, key_message, approach, *selected_values)
gpt4o_message = generate_message_gpt4o_with_retry(standard_prompt)
gpt4o_length = len(gpt4o_message)
return f"{gpt4o_message}\n\n------\nКоличество знаков: {gpt4o_length}"
def regen_message_gigachat_pro(description, advantages, key_message, approach, *selected_values):
standard_prompt = generate_standard_prompt(description, advantages, key_message, approach, *selected_values)
gigachat_pro_message = generate_message_gigachat_pro_with_retry(standard_prompt)
gigachat_pro_length = len(gigachat_pro_message)
return f"{gigachat_pro_message}\n\n------\nКоличество знаков: {gigachat_pro_length}"
def regen_message_gigachat_lite(description, advantages, key_message, approach, *selected_values):
standard_prompt = generate_standard_prompt(description, advantages, key_message, approach, *selected_values)
gigachat_lite_message = generate_message_gigachat_lite_with_retry(standard_prompt)
gigachat_lite_length = len(gigachat_lite_message)
return f"{gigachat_lite_message}\n\n------\nКоличество знаков: {gigachat_lite_length}"
def regen_message_gigachat_plus(description, advantages, key_message, approach, *selected_values):
standard_prompt = generate_standard_prompt(description, advantages, key_message, approach, *selected_values)
gigachat_plus_message = generate_message_gigachat_plus_with_retry(standard_prompt)
gigachat_plus_length = len(gigachat_plus_message)
return f"{gigachat_plus_message}\n\n------\nКоличество знаков: {gigachat_plus_length}"
def regen_message_meta_llama_405b(description, advantages, key_message, approach, *selected_values):
standard_prompt = generate_standard_prompt(description, advantages, key_message, approach, *selected_values)
meta_llama_405b_message = generate_message_meta_llama_3_1_405b_with_retry(standard_prompt)
meta_llama_405b_length = len(meta_llama_405b_message)
return f"{meta_llama_405b_message}\n\n------\nКоличество знаков: {meta_llama_405b_length}"
def personalize_message_gpt4o(gpt4o_message, key_message, approach, *selected_values):
personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
personalized_message = perform_personalization(gpt4o_message, personalization_prompt)
gpt4o_length = len(personalized_message)
return f"{personalized_message}\n\n------\nКоличество знаков: {gpt4o_length}"
def personalize_message_gigachat_pro(gigachat_pro_message, key_message, approach, *selected_values):
personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
personalized_message = perform_personalization_gigachat(gigachat_pro_message, personalization_prompt, "gigachat_pro")
gigachat_pro_length = len(personalized_message)
return f"{personalized_message}\n\n------\nКоличество знаков: {gigachat_pro_length}"
def personalize_message_gigachat_lite(gigachat_lite_message, key_message, approach, *selected_values):
personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
personalized_message = perform_personalization_gigachat(gigachat_lite_message, personalization_prompt, "gigachat_lite")
gigachat_lite_length = len(personalized_message)
return f"{personalized_message}\n\n------\nКоличество знаков: {gigachat_lite_length}"
def personalize_message_gigachat_plus(gigachat_plus_message, key_message, approach, *selected_values):
personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
personalized_message = perform_personalization_gigachat(gigachat_plus_message, personalization_prompt, "gigachat_plus")
gigachat_plus_length = len(personalized_message)
return f"{personalized_message}\n\n------\nКоличество знаков: {gigachat_plus_length}"
def personalize_message_meta_llama_405b(meta_llama_405b_message, key_message, approach, *selected_values):
personalization_prompt = generate_personalization_prompt(key_message, approach, *selected_values)
personalized_message = perform_personalization_meta_llama_405b(meta_llama_405b_message, personalization_prompt)
meta_llama_405b_length = len(personalized_message)
return f"{personalized_message}\n\n------\nКоличество знаков: {meta_llama_405b_length}"
# Создание интерфейса Gradio
with gr.Blocks() as demo:
gr.Markdown("# Генерация SMS-сообщений по заданным признакам")
with gr.Row():
with gr.Column(scale=1):
description_input = gr.Textbox(
label="Описание предложения (предзаполненный пример можно поменять на свой)",
lines=13,
value=(
"Необходимо предложить клиенту оформить дебетовую премиальную бизнес-карту Mastercard Preffered. "
"Обслуживание карты стоит 700 рублей в месяц, но клиент может пользоваться ей бесплатно. "
"Что необходимо сделать, чтобы воспользоваться предложением:\n"
"1. Оформить премиальную бизнес-карту в офисе банка или онлайн в интернет-банке СберБизнес.\n"
"2. Забрать карту.\n"
"3. В течение календарного месяца совершить по ней покупки на сумму от 100 000 рублей.\n"
"4. В течение следующего месяца пользоваться ей бесплатно."
)
)
advantages_input = gr.Textbox(
label="Преимущества (предзаполненный пример можно поменять на свой)",
lines=6,
value=(
"Предложение по бесплатному обслуживанию — бессрочное.\n"
"Оплата покупок без отчётов и платёжных поручений.\n"
"Платёжные документы без комиссии.\n"
"Лимиты на расходы сотрудников.\n"
"Мгновенные переводы на карты любых банков."
)
)
key_message_input = gr.Textbox(
label="Ключевое сообщение (предзаполненный пример можно поменять на свой)",
lines=3,
value="Бесплатное обслуживание при покупках от 100 000 рублей в месяц."
)
approach_input = gr.Dropdown(
label="Подход",
choices=["Призыв к действию", "Указание на пользу", "Вопрос"],
value="Призыв к действию" # Default value
)
selections = []
gr.Markdown("**Персонализация**")
for feature in features.keys():
if feature not in ["Пол Поколение Психотип"]: # Исключаем этот лист из выбора
selections.append(gr.Dropdown(choices=[None] + list(features[feature].keys()), label=f"Выберите {feature}"))
with gr.Column(scale=2):
prompt_display = gr.Textbox(label="Неперсонализированный промпт", lines=41, interactive=False)
personalization_prompt = gr.Textbox(label="Персонализированный промпт", lines=23, interactive=False)
with gr.Row():
submit_btn = gr.Button("1. Создать неперсонализированное сообщение")
personalize_btn = gr.Button("2. Выполнить персонализацию (нажимать только после кнопки 1)", elem_id="personalize_button")
load_btn = gr.Button("Вернуть параметры предыдущего запроса")
gr.Markdown("---") # Добавляет горизонтальную линию
# Ряд кнопок "Перегенерировать"
with gr.Row():
regen_gigachat_pro_btn = gr.Button("Перегенерировать")
regen_gigachat_lite_btn = gr.Button("Перегенерировать")
regen_gigachat_plus_btn = gr.Button("Перегенерировать")
regen_gpt4o_btn = gr.Button("Перегенерировать")
regen_meta_llama_405b_btn = gr.Button("Перегенерировать")
# Первый ряд: неперсонализированные сообщения
with gr.Row():
output_text_gigachat_pro = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
output_text_gigachat_lite = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
output_text_gigachat_plus = gr.Textbox(label="Неперсонализированное сообщение GigaChat-Lite+", lines=3, interactive=False)
output_text_gpt4o = gr.Textbox(label="Неперсонализированное сообщение ChatGPT-4o", lines=3, interactive=False)
output_text_meta_llama_405b = gr.Textbox(label="Неперсонализированное сообщение Llama-405B", lines=3, interactive=False)
# Ряд кнопок "Персонализировать"
with gr.Row():
personalize_gigachat_pro_btn = gr.Button("Персонализировать")
personalize_gigachat_lite_btn = gr.Button("Персонализировать")
personalize_gigachat_plus_btn = gr.Button("Персонализировать")
personalize_gpt4o_btn = gr.Button("Персонализировать")
personalize_meta_llama_405b_btn = gr.Button("Персонализировать")
# Второй ряд: персонализированные сообщения
with gr.Row():
personalized_output_text_gigachat_pro = gr.Textbox(label="Персонализированное сообщение GigaChat-Pro", lines=3, interactive=False)
personalized_output_text_gigachat_lite = gr.Textbox(label="Персонализированное сообщение GigaChat-Lite", lines=3, interactive=False)
personalized_output_text_gigachat_plus = gr.Textbox(label="Персонализированное сообщение GigaChat-Lite+", lines=3, interactive=False)
personalized_output_text_gpt4o = gr.Textbox(label="Персонализированное сообщение ChatGPT-4o", lines=3, interactive=False)
personalized_output_text_meta_llama_405b = gr.Textbox(label="Персонализированное сообщение Llama-405B", lines=3, interactive=False)
# Третий ряд: комментарии
with gr.Row():
comment_gigachat_pro = gr.Textbox(label="Комментарий к сообщению GigaChat-Pro", lines=3)
comment_gigachat_lite = gr.Textbox(label="Комментарий к сообщению GigaChat-Lite", lines=3)
comment_gigachat_plus = gr.Textbox(label="Комментарий к сообщению GigaChat-Lite+", lines=3)
comment_gpt4o = gr.Textbox(label="Комментарий к сообщению ChatGPT-4o", lines=3)
comment_meta_llama_405b = gr.Textbox(label="Комментарий к сообщению Llama-405B", lines=3)
# Четвертый ряд: откорректированные сообщения
with gr.Row():
corrected_gigachat_pro = gr.Textbox(label="Откорректированное сообщение GigaChat-Pro", lines=3)
corrected_gigachat_lite = gr.Textbox(label="Откорректированное сообщение GigaChat-Lite", lines=3)
corrected_gigachat_plus = gr.Textbox(label="Откорректированное сообщение GigaChat-Lite+", lines=3)
corrected_gpt4o = gr.Textbox(label="Откорректированное сообщение ChatGPT-4o", lines=3)
corrected_meta_llama_405b = gr.Textbox(label="Откорректированное сообщение Llama-405B", lines=3)
# Пятый ряд: кнопки сохранения
with gr.Row():
save_gigachat_pro_btn = gr.Button("Сохранить в базу")
save_gigachat_lite_btn = gr.Button("Сохранить в базу")
save_gigachat_plus_btn = gr.Button("Сохранить в базу")
save_gpt4o_btn = gr.Button("Сохранить в базу")
save_meta_llama_405b_btn = gr.Button("Сохранить в базу")
# Добавление функционала для кнопок
submit_btn.click(
clear_fields,
inputs=[],
outputs=[
personalization_prompt,
personalized_output_text_gigachat_pro,
personalized_output_text_gigachat_lite,
personalized_output_text_gigachat_plus,
personalized_output_text_gpt4o,
personalized_output_text_meta_llama_405b,
comment_gigachat_pro,
corrected_gigachat_pro,
comment_gigachat_lite,
corrected_gigachat_lite,
comment_gigachat_plus,
corrected_gigachat_plus,
comment_gpt4o,
corrected_gpt4o,
comment_meta_llama_405b,
corrected_meta_llama_405b
]
)
submit_btn.click(
generate_messages,
inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
outputs=[
prompt_display,
output_text_gigachat_pro,
output_text_gigachat_lite,
output_text_gigachat_plus,
output_text_gpt4o,
output_text_meta_llama_405b
]
)
personalize_btn.click(
fn=clear_personalization_fields,
inputs=[],
outputs=[
personalized_output_text_gigachat_pro,
personalized_output_text_gigachat_lite,
personalized_output_text_gigachat_plus,
personalized_output_text_gpt4o,
personalized_output_text_meta_llama_405b,
comment_gigachat_pro,
corrected_gigachat_pro,
comment_gigachat_lite,
corrected_gigachat_lite,
comment_gigachat_plus,
corrected_gigachat_plus,
comment_gpt4o,
corrected_gpt4o,
comment_meta_llama_405b,
corrected_meta_llama_405b
]
)
personalize_btn.click(
fn=personalize_and_save,
inputs=[
output_text_gigachat_pro,
output_text_gigachat_lite,
output_text_gigachat_plus,
output_text_gpt4o,
output_text_meta_llama_405b,
description_input,
advantages_input,
key_message_input, # Add key_message_input
approach_input, # Add approach_input
] + selections,
outputs=[
personalization_prompt,
personalized_output_text_gigachat_pro,
personalized_output_text_gigachat_lite,
personalized_output_text_gigachat_plus,
personalized_output_text_gpt4o,
personalized_output_text_meta_llama_405b
]
)
# Обработка клика по кнопке восстановления
load_btn.click(
fn=lambda: load_previous_user_request_from_github(),
inputs=[],
outputs=[
description_input, # Описание предложения
advantages_input, # Преимущества
key_message_input, # Ключевое сообщение
approach_input, # Подход
*selections, # Параметры персонализации (Пол, Поколение и т.д.)
]
).then(
fn=clear_unnecessary_fields,
inputs=[],
outputs=[
prompt_display,
personalization_prompt, # Очищаем personalization_prompt
output_text_gigachat_pro,
output_text_gigachat_lite,
output_text_gigachat_plus,
output_text_gpt4o,
output_text_meta_llama_405b,
personalized_output_text_gigachat_pro,
personalized_output_text_gigachat_lite,
personalized_output_text_gigachat_plus,
personalized_output_text_gpt4o,
personalized_output_text_meta_llama_405b,
comment_gigachat_pro,
corrected_gigachat_pro,
comment_gigachat_lite,
corrected_gigachat_lite,
comment_gigachat_plus,
corrected_gigachat_plus,
comment_gpt4o,
corrected_gpt4o,
comment_meta_llama_405b,
corrected_meta_llama_405b
]
)
regen_gigachat_pro_btn.click(
regen_message_gigachat_pro,
inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
outputs=output_text_gigachat_pro
)
regen_gigachat_lite_btn.click(
regen_message_gigachat_lite,
inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
outputs=output_text_gigachat_lite
)
regen_gigachat_plus_btn.click(
regen_message_gigachat_plus,
inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
outputs=output_text_gigachat_plus
)
regen_gpt4o_btn.click(
regen_message_gpt4o,
inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
outputs=output_text_gpt4o
)
regen_meta_llama_405b_btn.click(
regen_message_meta_llama_405b,
inputs=[description_input, advantages_input, key_message_input, approach_input] + selections,
outputs=output_text_meta_llama_405b
)
personalize_gigachat_pro_btn.click(
personalize_message_gigachat_pro,
inputs=[output_text_gigachat_pro, key_message_input, approach_input] + selections,
outputs=personalized_output_text_gigachat_pro
)
personalize_gigachat_lite_btn.click(
personalize_message_gigachat_lite,
inputs=[output_text_gigachat_lite, key_message_input, approach_input] + selections,
outputs=personalized_output_text_gigachat_lite
)
personalize_gigachat_plus_btn.click(
personalize_message_gigachat_plus,
inputs=[output_text_gigachat_plus, key_message_input, approach_input] + selections,
outputs=personalized_output_text_gigachat_plus
)
personalize_gpt4o_btn.click(
personalize_message_gpt4o,
inputs=[output_text_gpt4o, key_message_input, approach_input] + selections,
outputs=personalized_output_text_gpt4o
)
personalize_meta_llama_405b_btn.click(
personalize_message_meta_llama_405b,
inputs=[output_text_meta_llama_405b, key_message_input, approach_input] + selections,
outputs=personalized_output_text_meta_llama_405b
)
# Привязка кнопок к функциям сохранения
save_gigachat_pro_btn.click(
fn=prepare_button_text,
inputs=[],
outputs=[save_gigachat_pro_btn]
).then(
fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach:
save_to_github(personalized_message, "GigaChat-Pro", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach),
inputs=[
personalized_output_text_gigachat_pro,
comment_gigachat_pro,
corrected_gigachat_pro,
description_input,
advantages_input,
prompt_display,
output_text_gigachat_pro,
personalization_prompt,
selections[0], # Пол
selections[1], # Поколение
selections[2], # Психотип
selections[3], # Стадия бизнеса
selections[4], # Отрасль
selections[5], # ОПФ
key_message_input, # Ключевое сообщение
approach_input # Подход
],
outputs=None
).then(
fn=update_button_text,
outputs=[save_gigachat_pro_btn]
).then(
fn=reset_button_text,
outputs=[save_gigachat_pro_btn]
)
# Повторяем аналогично для других кнопок:
save_gigachat_lite_btn.click(
fn=prepare_button_text,
inputs=[],
outputs=[save_gigachat_lite_btn]
).then(
fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach:
save_to_github(personalized_message, "GigaChat-Lite", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach),
inputs=[
personalized_output_text_gigachat_lite,
comment_gigachat_lite,
corrected_gigachat_lite,
description_input,
advantages_input,
prompt_display,
output_text_gigachat_lite,
personalization_prompt,
selections[0], # Пол
selections[1], # Поколение
selections[2], # Психотип
selections[3], # Стадия бизнеса
selections[4], # Отрасль
selections[5], # ОПФ
key_message_input, # Ключевое сообщение
approach_input # Подход
],
outputs=None
).then(
fn=update_button_text,
outputs=[save_gigachat_lite_btn]
).then(
fn=reset_button_text,
outputs=[save_gigachat_lite_btn]
)
save_gigachat_plus_btn.click(
fn=prepare_button_text,
inputs=[],
outputs=[save_gigachat_plus_btn]
).then(
fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach:
save_to_github(personalized_message, "GigaChat-Lite+", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach),
inputs=[
personalized_output_text_gigachat_plus,
comment_gigachat_plus,
corrected_gigachat_plus,
description_input,
advantages_input,
prompt_display,
output_text_gigachat_plus,
personalization_prompt,
selections[0], # Пол
selections[1], # Поколение
selections[2], # Психотип
selections[3], # Стадия бизнеса
selections[4], # Отрасль
selections[5], # ОПФ
key_message_input, # Ключевое сообщение
approach_input # Подход
],
outputs=None
).then(
fn=update_button_text,
outputs=[save_gigachat_plus_btn]
).then(
fn=reset_button_text,
outputs=[save_gigachat_plus_btn]
)
save_gpt4o_btn.click(
fn=prepare_button_text, # Сначала меняем текст на "Сохраняется..."
inputs=[],
outputs=[save_gpt4o_btn]
).then(
fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach:
save_to_github(personalized_message, "GPT-4o", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach),
inputs=[
personalized_output_text_gpt4o,
comment_gpt4o,
corrected_gpt4o,
description_input,
advantages_input,
prompt_display,
output_text_gpt4o,
personalization_prompt,
selections[0], # Пол
selections[1], # Поколение
selections[2], # Психотип
selections[3], # Стадия бизнеса
selections[4], # Отрасль
selections[5], # ОПФ
key_message_input, # Ключевое сообщение
approach_input # Подход
],
outputs=None
).then(
fn=update_button_text, # Обновляем текст на "Сохранено!" после сохранения
outputs=[save_gpt4o_btn]
).then(
fn=reset_button_text, # Возвращаем текст на кнопке обратно через 3 секунды
outputs=[save_gpt4o_btn]
)
save_meta_llama_405b_btn.click(
fn=prepare_button_text,
inputs=[],
outputs=[save_meta_llama_405b_btn]
).then(
fn=lambda personalized_message, comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach:
save_to_github(personalized_message, "Meta-Llama-3.1-405B", comment, corrected_message, description, advantages, non_personalized_prompt, non_personalized_message, personalization_prompt, gender, generation, psychotype, business_stage, industry, legal_form, key_message, approach),
inputs=[
personalized_output_text_meta_llama_405b,
comment_meta_llama_405b,
corrected_meta_llama_405b,
description_input,
advantages_input,
prompt_display,
output_text_meta_llama_405b,
personalization_prompt,
selections[0], # Пол
selections[1], # Поколение
selections[2], # Психотип
selections[3], # Стадия бизнеса
selections[4], # Отрасль
selections[5], # ОПФ
key_message_input, # Ключевое сообщение
approach_input # Подход
],
outputs=None
).then(
fn=update_button_text,
outputs=[save_meta_llama_405b_btn]
).then(
fn=reset_button_text,
outputs=[save_meta_llama_405b_btn]
)
demo.launch()