Who-are-you / app.py
ytkoa's picture
Update app.py
860c291 verified
import gradio as gr
import asyncio
import time
from g4f.client import Client
# Асинхронная обертка для синхронной функции с обработкой таймаута и повтором запроса
async def ask(question, retries=3, timeout=20):
client = Client()
for attempt in range(retries):
try:
# Время начала запроса
start_time = time.time()
# Пытаемся выполнить запрос
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "user",
"content": question,
}],
)
# Если запрос был успешным, проверяем, не превышен ли таймаут
elapsed_time = time.time() - start_time
if elapsed_time < timeout:
return response.choices[0].message.content
else:
print("Timeout reached, retrying...")
except Exception as e:
print(f"Error on attempt {attempt + 1}: {e}")
# Ждем немного перед повторной попыткой
await asyncio.sleep(1)
return "Sorry, there was an error or timeout while processing your request."
# Список вопросов
questions = [
"На каком языке вы хотите получить результат теста?/What language do you want the test result?",
"Какой вы школьный предмет?/What school subject are you?",
"Если бы вы были растением, то каким?/If you were a plant, what would you be?",
"Какой вы инструмент из коробки с инструментами?/What tool from the toolbox are you?",
"Что вкуснее: круг или квадрат?/What tastes better: a circle or a square?",
"Если бы вы были кнопкой, что бы вы включали?/If you were a button, what would you turn on?",
"Ваше любимое число?/What is your favorite number?",
"Чем вы хотите быть в следующей жизни?/What do you want to be in your next life?",
"Какой вы вид отдыха?/What type of relaxation are you?",
"Какой вы звук?/What sound are you?",
"Если бы вы были игрушкой, то какой?/If you were a toy, what would you be?",
]
# Асинхронная функция обработки данных
async def analyze_test(*args):
# Создаем словарь ответов
answers = {question: answer for question, answer in zip(questions, args)}
# Формируем запрос для анализа
prompt = (
"You have completed a unique test that reveals your inner essence. "
"Generate your response in the user's language: "
"if the answers are mostly in English, respond in English; if they are in Russian, respond in Russian. "
"Do not propose new questions or answers; focus solely on analyzing the provided data. "
"Imagine that I am your guide in this exploration, and together we are trying to uncover who you truly are. "
"Analyze the test results, combining them into a cohesive narrative to create a portrait of the user's personality. "
"Describe the user's character as if unveiling their hidden archetype, avoiding simple or banal conclusions. "
"Do not mention specific answers but draw inspiration from them to craft a compelling narrative about the user. "
"The response should be short, engaging, and feel like a vivid character sketch in two to three sentences. "
f"Here are the test data: {str(answers)}"
)
result = await ask(prompt) # Асинхронный вызов функции ask с повтором в случае таймаута
return result.replace("```", "")
# Создаем интерфейс
def gradio_interface(*args):
return asyncio.run(analyze_test(*args)) # Теперь асинхронная функция вызывается внутри синхронной функции Gradio
inputs = [gr.Textbox(label=question, placeholder="Введите ваш ответ.../Enter your answer...") for question in questions]
interface = gr.Interface(
fn=gradio_interface, # Используем новый синхронный вызов для Gradio
inputs=inputs,
outputs="text",
title="Тест: Кто вы?/Test: Who are you?",
description=(
"Отвечайте на вопросы развернуто, чтобы получить более точный результат/Answer the questions in detail to get a more accurate result"
)
)
# Запуск интерфейса
if __name__ == "__main__":
interface.launch()