File size: 3,221 Bytes
b6185eb 3462c0f 0611243 5cc7e19 206b8e2 5cc7e19 0611243 5cc7e19 b6185eb 5cc7e19 206b8e2 5cc7e19 206b8e2 5cc7e19 0611243 4df42a0 0611243 b6185eb 5cc7e19 b6185eb 0611243 b6185eb 0611243 4df42a0 206b8e2 4df42a0 0611243 4df42a0 b6185eb 0611243 b6185eb 206b8e2 5cc7e19 b6185eb 5cc7e19 206b8e2 5cc7e19 206b8e2 4df42a0 206b8e2 5cc7e19 206b8e2 5cc7e19 b6185eb |
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 |
# app.py
import gradio as gr
import asyncio
from itertools import cycle
from core.utils import generate_first_question
from core.mbti_analyzer import analyze_mbti
from core.interviewer import generate_question, session_state
async def async_loader(progress_fn):
"""Асинхронный loader-аниматор (вращающиеся точки)."""
frames = cycle(["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"])
for _ in range(10):
await asyncio.sleep(0.2)
progress_fn(next(frames))
def analyze_and_ask(user_text, prev_count, progress=gr.Progress(track_tqdm=True)):
if not user_text.strip():
yield "⚠️ Please enter your answer.", "", prev_count
return
user_id = "default_user"
try:
n = int(prev_count.split("/")[0]) + 1
except Exception:
n = 1
counter = f"{n}/8"
# 1️⃣ Первое сообщение — мгновенно
yield "⏳ Analyzing personality...", "💭 Interviewer is thinking... ⠋", counter
# 2️⃣ Анимация лоадера в фоне
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.create_task(async_loader(lambda f: None))
# 3️⃣ Анализ MBTI
mbti_gen = analyze_mbti(user_text)
mbti_text = ""
for chunk in mbti_gen:
mbti_text = chunk
yield mbti_text, "💭 Interviewer is thinking... ⠙", counter
# 4️⃣ Генерация вопроса
question = generate_question(user_id)
if question.startswith("✅ All"):
yield f"{mbti_text}\n\nSession complete.", "🎯 All MBTI axes covered.", "8/8"
return
# 5️⃣ Финальный вывод
yield mbti_text, question, counter
# --------------------------------------------------------------
# UI
# --------------------------------------------------------------
with gr.Blocks(theme=gr.themes.Soft(), title="MBTI Personality Interviewer") as demo:
gr.Markdown(
"## 🧠 MBTI Personality Interviewer\n"
"Определи личностный тип и получи вопросы из разных категорий MBTI."
)
with gr.Row():
with gr.Column(scale=1):
inp = gr.Textbox(
label="Ваш ответ",
placeholder="Например: I enjoy working with people and organizing events.",
lines=4
)
btn = gr.Button("Анализировать и задать новый вопрос", variant="primary")
with gr.Column(scale=1):
mbti_out = gr.Textbox(label="📊 Анализ MBTI", lines=4)
interviewer_out = gr.Textbox(label="💬 Следующий вопрос", lines=3)
progress = gr.Textbox(label="⏳ Прогресс", value="0/8")
btn.click(
analyze_and_ask,
inputs=[inp, progress],
outputs=[mbti_out, interviewer_out, progress],
show_progress=True
)
demo.load(
lambda: ("", generate_first_question(), "0/8"),
inputs=None,
outputs=[mbti_out, interviewer_out, progress]
)
demo.queue(max_size=20).launch(server_name="0.0.0.0", server_port=7860)
|