Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -54,7 +54,7 @@ def check_if_pro(token):
|
|
| 54 |
# === ГЕНЕРАЦИЯ ОТВЕТА ===
|
| 55 |
def generate_response(message, history, username, current_chat_id):
|
| 56 |
if not username:
|
| 57 |
-
gr.Warning("Сначала введите имя пользователя
|
| 58 |
return history, gr.update(), current_chat_id
|
| 59 |
|
| 60 |
if not message.strip():
|
|
@@ -185,25 +185,18 @@ CUSTOM_CSS = """
|
|
| 185 |
font-size: 0.95em;
|
| 186 |
box-shadow: 0 2px 8px rgba(16, 185, 129, 0.3);
|
| 187 |
}
|
| 188 |
-
.privacy-banner .icon {
|
| 189 |
-
|
| 190 |
-
}
|
| 191 |
-
.privacy-banner strong {
|
| 192 |
-
display: block;
|
| 193 |
-
font-size: 1.1em;
|
| 194 |
-
margin-bottom: 4px;
|
| 195 |
-
}
|
| 196 |
"""
|
| 197 |
|
| 198 |
-
# === БАННЕР ПРИВАТНОСТИ (HTML) ===
|
| 199 |
PRIVACY_BANNER = """
|
| 200 |
<div class="privacy-banner">
|
| 201 |
<div class="icon">🔒</div>
|
| 202 |
<div>
|
| 203 |
<strong>Ваши данные в безопасности</strong>
|
| 204 |
-
Все сообщения обрабатываются локально
|
| 205 |
-
<b>Данные НЕ передаются в OpenRussianAI</b>
|
| 206 |
-
История
|
| 207 |
</div>
|
| 208 |
</div>
|
| 209 |
"""
|
|
@@ -215,14 +208,7 @@ with gr.Blocks(title="OpenAirAI-X Chat") as demo:
|
|
| 215 |
current_chat_id_state = gr.State(None)
|
| 216 |
|
| 217 |
with gr.Column(visible=False) as main_interface:
|
| 218 |
-
gr.HTML(""
|
| 219 |
-
<div class="main-header">
|
| 220 |
-
<h1>🤖 OpenAirAI-X Chat</h1>
|
| 221 |
-
<p>Русскоязычный AI-ассистент</p>
|
| 222 |
-
</div>
|
| 223 |
-
""")
|
| 224 |
-
|
| 225 |
-
# Баннер приватности в главном интерфейсе
|
| 226 |
gr.HTML(PRIVACY_BANNER)
|
| 227 |
|
| 228 |
with gr.Row():
|
|
@@ -231,7 +217,8 @@ with gr.Blocks(title="OpenAirAI-X Chat") as demo:
|
|
| 231 |
pro_badge = gr.HTML('<div class="pro-badge">👑 PRO</div>', visible=False)
|
| 232 |
new_chat_btn = gr.Button("➕ Новый чат", variant="primary")
|
| 233 |
gr.Markdown("### 📚 История чатов")
|
| 234 |
-
|
|
|
|
| 235 |
delete_chat_btn = gr.Button("🗑️ Удалить выбранный чат", variant="stop", size="sm")
|
| 236 |
logout_btn = gr.Button("🚪 Выйти", size="sm")
|
| 237 |
|
|
@@ -241,27 +228,13 @@ with gr.Blocks(title="OpenAirAI-X Chat") as demo:
|
|
| 241 |
msg_input = gr.Textbox(placeholder="Напишите сообщение...", lines=2, scale=5, show_label=False)
|
| 242 |
send_btn = gr.Button("📤 Отправить", variant="primary", scale=1)
|
| 243 |
|
| 244 |
-
# Экран входа
|
| 245 |
with gr.Column(visible=True) as login_screen:
|
| 246 |
-
gr.HTML(""
|
| 247 |
-
<div class="main-header">
|
| 248 |
-
<h1>🤖 OpenAirAI-X Chat</h1>
|
| 249 |
-
<p>Введите данные для входа</p>
|
| 250 |
-
</div>
|
| 251 |
-
""")
|
| 252 |
-
|
| 253 |
-
# Баннер приватности на экране входа
|
| 254 |
gr.HTML(PRIVACY_BANNER)
|
| 255 |
-
|
| 256 |
-
gr.Markdown("""
|
| 257 |
-
### 🔐 Вход в систему
|
| 258 |
-
|
| 259 |
-
Введите ваше имя пользователя. История чатов будет привязана к этому имени и сохранена **только внутри этого Space**.
|
| 260 |
-
""")
|
| 261 |
username_input = gr.Textbox(label="Имя пользователя (HF Username)", placeholder="Например: RootLinux21")
|
| 262 |
-
token_input = gr.Textbox(label="HF Token (необязательно,
|
| 263 |
login_btn = gr.Button("🔑 Войти", variant="primary")
|
| 264 |
-
gr.Markdown("*Если у вас есть PRO-подписка, вставьте ваш токен (Settings -> Access Tokens), чтобы увидеть значок 👑*")
|
| 265 |
|
| 266 |
# === ОБРАБОТЧИКИ ===
|
| 267 |
|
|
@@ -362,5 +335,4 @@ with gr.Blocks(title="OpenAirAI-X Chat") as demo:
|
|
| 362 |
outputs=[main_interface, login_screen, user_info, username_state, history_state, current_chat_id_state, chat_list, pro_badge]
|
| 363 |
)
|
| 364 |
|
| 365 |
-
# Запуск с CSS в launch() (как требует Gradio 6.0)
|
| 366 |
demo.launch(server_name="0.0.0.0", server_port=7860, css=CUSTOM_CSS)
|
|
|
|
| 54 |
# === ГЕНЕРАЦИЯ ОТВЕТА ===
|
| 55 |
def generate_response(message, history, username, current_chat_id):
|
| 56 |
if not username:
|
| 57 |
+
gr.Warning("Сначала введите имя пользователя!")
|
| 58 |
return history, gr.update(), current_chat_id
|
| 59 |
|
| 60 |
if not message.strip():
|
|
|
|
| 185 |
font-size: 0.95em;
|
| 186 |
box-shadow: 0 2px 8px rgba(16, 185, 129, 0.3);
|
| 187 |
}
|
| 188 |
+
.privacy-banner .icon { font-size: 1.8em; }
|
| 189 |
+
.privacy-banner strong { display: block; font-size: 1.1em; margin-bottom: 4px; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
"""
|
| 191 |
|
|
|
|
| 192 |
PRIVACY_BANNER = """
|
| 193 |
<div class="privacy-banner">
|
| 194 |
<div class="icon">🔒</div>
|
| 195 |
<div>
|
| 196 |
<strong>Ваши данные в безопасности</strong>
|
| 197 |
+
Все сообщения обрабатываются локально.
|
| 198 |
+
<b>Данные НЕ передаются в OpenRussianAI</b>.
|
| 199 |
+
История хранится только внутри контейнера.
|
| 200 |
</div>
|
| 201 |
</div>
|
| 202 |
"""
|
|
|
|
| 208 |
current_chat_id_state = gr.State(None)
|
| 209 |
|
| 210 |
with gr.Column(visible=False) as main_interface:
|
| 211 |
+
gr.HTML("<div class='main-header'><h1>🤖 OpenAirAI-X Chat</h1><p>Русскоязычный AI-ассистент</p></div>")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 212 |
gr.HTML(PRIVACY_BANNER)
|
| 213 |
|
| 214 |
with gr.Row():
|
|
|
|
| 217 |
pro_badge = gr.HTML('<div class="pro-badge">👑 PRO</div>', visible=False)
|
| 218 |
new_chat_btn = gr.Button("➕ Новый чат", variant="primary")
|
| 219 |
gr.Markdown("### 📚 История чатов")
|
| 220 |
+
# Инициализируем Radio с пустыми choices и value=None
|
| 221 |
+
chat_list = gr.Radio(choices=[], label="Ваши чаты", interactive=True, value=None)
|
| 222 |
delete_chat_btn = gr.Button("🗑️ Удалить выбранный чат", variant="stop", size="sm")
|
| 223 |
logout_btn = gr.Button("🚪 Выйти", size="sm")
|
| 224 |
|
|
|
|
| 228 |
msg_input = gr.Textbox(placeholder="Напишите сообщение...", lines=2, scale=5, show_label=False)
|
| 229 |
send_btn = gr.Button("📤 Отправить", variant="primary", scale=1)
|
| 230 |
|
|
|
|
| 231 |
with gr.Column(visible=True) as login_screen:
|
| 232 |
+
gr.HTML("<div class='main-header'><h1>🤖 OpenAirAI-X Chat</h1><p>Введите данные для входа</p></div>")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 233 |
gr.HTML(PRIVACY_BANNER)
|
| 234 |
+
gr.Markdown("### 🔐 Вход в систему\nВведите ваше имя пользователя. История чатов будет привязана к этому имени.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 235 |
username_input = gr.Textbox(label="Имя пользователя (HF Username)", placeholder="Например: RootLinux21")
|
| 236 |
+
token_input = gr.Textbox(label="HF Token (необязательно, для PRO)", placeholder="hf_...")
|
| 237 |
login_btn = gr.Button("🔑 Войти", variant="primary")
|
|
|
|
| 238 |
|
| 239 |
# === ОБРАБОТЧИКИ ===
|
| 240 |
|
|
|
|
| 335 |
outputs=[main_interface, login_screen, user_info, username_state, history_state, current_chat_id_state, chat_list, pro_badge]
|
| 336 |
)
|
| 337 |
|
|
|
|
| 338 |
demo.launch(server_name="0.0.0.0", server_port=7860, css=CUSTOM_CSS)
|