TestTesting123's picture
Upload app.py
3774104 verified
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()