update
This commit is contained in:
@@ -45,6 +45,8 @@ def _title_bar(*, show_logout: bool):
|
||||
|
||||
def _logout():
|
||||
st.session_state.token = None
|
||||
st.session_state.chat_messages = []
|
||||
st.session_state.chat_hydrated = False
|
||||
st.rerun()
|
||||
|
||||
st.button(
|
||||
@@ -155,6 +157,8 @@ def _show_account():
|
||||
st.error(f"Ошибка входа: {_detail_or_text(r)}")
|
||||
else:
|
||||
st.session_state.token = r.json().get("access_token")
|
||||
st.session_state.chat_messages = []
|
||||
st.session_state.chat_hydrated = False
|
||||
st.success("Успешный вход.")
|
||||
st.rerun()
|
||||
except Exception as e:
|
||||
@@ -180,13 +184,28 @@ if not st.session_state.token:
|
||||
_show_account()
|
||||
st.stop()
|
||||
|
||||
# Подтянуть историю чата из Postgres (один раз после входа / смены пользователя)
|
||||
if not st.session_state.get("chat_hydrated"):
|
||||
try:
|
||||
hr = requests.get(
|
||||
f"{backend_base_url}/chat/history",
|
||||
headers=_auth_headers(),
|
||||
params={"limit": 500},
|
||||
timeout=30,
|
||||
)
|
||||
if hr.ok:
|
||||
st.session_state.chat_messages = hr.json().get("messages", [])
|
||||
except Exception:
|
||||
pass
|
||||
st.session_state.chat_hydrated = True
|
||||
|
||||
# После входа — тот же заголовок + вкладки
|
||||
_title_bar(show_logout=True)
|
||||
st.caption("Портал с данными и инструментами для АС/ФП.")
|
||||
|
||||
tab_chat, tab_info, tab_autonomous, tab_infra, tab_tools, tab_news = st.tabs(
|
||||
[
|
||||
"Чат с ИИ",
|
||||
"AI",
|
||||
"Сведения об АС/ФП",
|
||||
"Автономные внедрения",
|
||||
"Инфраструктура АС/ФП",
|
||||
@@ -196,54 +215,57 @@ tab_chat, tab_info, tab_autonomous, tab_infra, tab_tools, tab_news = st.tabs(
|
||||
)
|
||||
|
||||
with tab_chat:
|
||||
st.subheader("Чат с ИИ")
|
||||
st.subheader("AI")
|
||||
st.caption(
|
||||
f"Запросы идут на backend `{backend_base_url}/chat`, а оттуда — в Ollama (`/api/chat`). "
|
||||
f"Модель: **{model}**."
|
||||
f"Диалог через `{backend_base_url}/chat` → Ollama. Модель: **{model}**. "
|
||||
"Переписка сохраняется в базе для вашего пользователя."
|
||||
)
|
||||
head_a, head_b = st.columns([4, 1])
|
||||
_, head_b = st.columns([4, 1])
|
||||
with head_b:
|
||||
|
||||
def _clear_chat():
|
||||
try:
|
||||
requests.delete(
|
||||
f"{backend_base_url}/chat/history",
|
||||
headers=_auth_headers(),
|
||||
timeout=30,
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
st.session_state.chat_messages = []
|
||||
st.rerun()
|
||||
|
||||
st.button("Очистить чат", on_click=_clear_chat, use_container_width=True, key="btn_clear_chat")
|
||||
|
||||
# Только лента сообщений внутри рамки; st.chat_input — снаружи, чтобы строка была внизу экрана
|
||||
with st.container(border=True):
|
||||
for m in st.session_state.chat_messages:
|
||||
with st.chat_message(m["role"]):
|
||||
st.markdown(m["content"].replace("$", r"\$"))
|
||||
|
||||
user_text = st.chat_input("Напишите сообщение…", key="chat_input_portal")
|
||||
if user_text:
|
||||
st.session_state.chat_messages.append({"role": "user", "content": user_text})
|
||||
with st.chat_message("user"):
|
||||
st.markdown(user_text.replace("$", r"\$"))
|
||||
|
||||
reply = ""
|
||||
with st.chat_message("assistant"):
|
||||
with st.spinner("Ollama отвечает…"):
|
||||
try:
|
||||
r = requests.post(
|
||||
f"{backend_base_url}/chat",
|
||||
json={
|
||||
"model": model,
|
||||
"messages": st.session_state.chat_messages,
|
||||
},
|
||||
headers=_auth_headers(),
|
||||
timeout=120,
|
||||
)
|
||||
if r.status_code >= 400:
|
||||
reply = f"**Ошибка:** {_detail_or_text(r)}"
|
||||
st.error(_detail_or_text(r))
|
||||
else:
|
||||
data = r.json()
|
||||
reply = data.get("content") or ""
|
||||
st.markdown(reply.replace("$", r"\$"))
|
||||
except Exception as e:
|
||||
reply = f"**Ошибка сети:** {e}"
|
||||
st.error(str(e))
|
||||
st.session_state.chat_messages.append({"role": "assistant", "content": reply})
|
||||
user_text = st.chat_input("Напишите сообщение…", key="chat_input_portal")
|
||||
if user_text:
|
||||
st.session_state.chat_messages.append({"role": "user", "content": user_text})
|
||||
reply = ""
|
||||
with st.spinner("Ollama отвечает…"):
|
||||
try:
|
||||
r = requests.post(
|
||||
f"{backend_base_url}/chat",
|
||||
json={
|
||||
"model": model,
|
||||
"messages": st.session_state.chat_messages,
|
||||
},
|
||||
headers=_auth_headers(),
|
||||
timeout=120,
|
||||
)
|
||||
if r.status_code >= 400:
|
||||
reply = f"**Ошибка:** {_detail_or_text(r)}"
|
||||
else:
|
||||
reply = r.json().get("content") or ""
|
||||
except Exception as e:
|
||||
reply = f"**Ошибка сети:** {e}"
|
||||
st.session_state.chat_messages.append({"role": "assistant", "content": reply})
|
||||
st.rerun()
|
||||
|
||||
with tab_info:
|
||||
st.subheader("Сведения об АС/ФП")
|
||||
|
||||
Reference in New Issue
Block a user