File size: 4,969 Bytes
860c291
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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()