File size: 4,531 Bytes
67219c7 b63c0d3 67219c7 b63c0d3 67219c7 b63c0d3 67219c7 b63c0d3 67219c7 b63c0d3 2d90305 b63c0d3 2d90305 b63c0d3 |
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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
import streamlit as st
from openai import OpenAI
# Настройки страницы (тёмная тема, "wide" разметка)
st.set_page_config(page_title="Чат с deepseek-reasoner", layout="wide")
# Глобальная стилизация через CSS
st.markdown(
"""
<style>
/* Убираем верхний хедер и хамбёргер-меню Streamlit (по желанию) */
#MainMenu, header, footer {visibility: hidden;}
/* Тёмный фон всего приложения */
body {
background-color: #181818;
color: #FFFFFF;
}
/* Контейнер для всего чата */
.chat-container {
background-color: #222222;
padding: 20px;
border-radius: 10px;
max-height: 70vh; /* Высота окна для переписки */
overflow-y: auto; /* Скролл при переполнении */
margin-bottom: 20px;
}
/* «Пузырёк» для сообщений пользователя (справа) */
.user-bubble {
background-color: #005f73;
color: #ffffff;
padding: 10px 15px;
border-radius: 10px;
margin: 10px;
max-width: 60%;
text-align: left;
margin-left: auto; /* прижимает пузырёк к правому краю */
}
/* «Пузырёк» для сообщений ассистента (слева) */
.assistant-bubble {
background-color: #333333;
color: #ffffff;
padding: 10px 15px;
border-radius: 10px;
margin: 10px;
max-width: 60%;
text-align: left;
margin-right: auto; /* прижимает пузырёк к левому краю */
}
</style>
""",
unsafe_allow_html=True
)
# Инициализация клиента для DeepSeek (замените ключ на свой)
client = OpenAI(
api_key="sk-a02694cf3c8640c9ae60428ee2c5a62e",
base_url="https://api.deepseek.com"
)
# Заголовок
st.title("Чат с deepseek-reasoner")
# Инициализируем историю сообщений в сессии
if "messages" not in st.session_state:
st.session_state["messages"] = []
# Функция для отрисовки всей истории чата
def render_chat():
st.markdown("<div class='chat-container'>", unsafe_allow_html=True)
# Проходим по всем сообщениям
for msg in st.session_state["messages"]:
if msg["role"] == "user":
bubble_class = "user-bubble"
else:
bubble_class = "assistant-bubble"
st.markdown(
f"<div class='{bubble_class}'>{msg['content']}</div>",
unsafe_allow_html=True
)
st.markdown("</div>", unsafe_allow_html=True)
# Сразу выводим чат-окно, чтобы было сверху
render_chat()
# Внизу располагаем поле ввода (многострочное) и кнопку «Отправить»
with st.container():
user_input = st.text_area("Напишите сообщение и нажмите Enter или кнопку «Отправить»:",
value="", height=80)
if st.button("Отправить"):
content = user_input.strip()
if content:
# Добавляем реплику пользователя в историю
st.session_state["messages"].append({"role": "user", "content": content})
# Пытаемся получить ответ от модели
try:
response = client.chat.completions.create(
model="deepseek-reasoner",
messages=st.session_state["messages"]
)
# Содержимое ответа
assistant_content = response.choices[0].message.content
# Добавляем ответ ассистента в историю
st.session_state["messages"].append(
{"role": "assistant", "content": assistant_content}
)
except Exception as e:
st.error(f"Ошибка при обращении к API: {e}")
# Очищаем поле ввода после отправки (перезагрузка скрипта сделает это)
st.experimental_rerun()
|