File size: 2,655 Bytes
3774104
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import gradio as gr
from openai import OpenAI

# Проверка ключа
api_key = os.getenv("OPENROUTER_API_KEY")
if not api_key:
    raise ValueError("OPENROUTER_API_KEY не найден в Secrets!")

# Клиент OpenRouter
client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=api_key
)

# Функция обработки сообщений
def ask_ai(user_input, role, history=[]):
    if not user_input.strip():
        return history, "Введите сообщение!"
    try:
        # Системный промпт в зависимости от выбранной роли
        system_prompt = f"Ты бот-собеседователь. Роль: {role}. Задавай вопросы и оценивай ответы."
        messages = [{"role": "system", "content": system_prompt}]
        
        # Берем последние 6 сообщений (экономим токены)
        for h in history[-12:]:
            if isinstance(h, dict) and 'role' in h and 'content' in h:
                messages.append(h)
                
        # Добавляем текущее сообщение пользователя
        messages.append({"role": "user", "content": str(user_input)})

        # Вызов LLM с ограничением токенов
        response = client.chat.completions.create(
            model="anthropic/claude-3.5-sonnet",
            messages=messages,
            max_tokens=1000
        )

        answer = response.choices[0].message.content

        # Сохраняем историю как словари
        history.append({"role": "user", "content": user_input})
        history.append({"role": "assistant", "content": answer})

        return history, ""
    except Exception as e:
        return history, f"Ошибка при вызове AI: {e}"

# Gradio интерфейс
with gr.Blocks() as demo:
    gr.Markdown("### 🟢 HR / Tech Interview Chatbot")
    
    with gr.Row():
        role_selector = gr.Dropdown(
            choices=["HR", "Frontend", "Backend"], 
            value="HR", 
            label="Выберите роль собеседования"
        )
        clear_btn = gr.Button("Очистить чат")
    
    chat = gr.Chatbot()
    msg = gr.Textbox(placeholder="Напишите сообщение...")
    state = gr.State([])  # история чата

    # Кнопка Clear Chat
    clear_btn.click(lambda: ([], ""), [], [chat, msg])

    # Отправка сообщения
    msg.submit(ask_ai, inputs=[msg, role_selector, state], outputs=[chat, msg])

# Запуск
demo.launch()