|
|
|
import streamlit as st |
|
from hazm import Normalizer, SentenceTokenizer |
|
import os |
|
import docx |
|
from langchain.chat_models import ChatOpenAI |
|
from langchain.schema import SystemMessage, HumanMessage |
|
from rapidfuzz import fuzz |
|
import concurrent.futures |
|
import time |
|
|
|
import numpy as np |
|
from hazm import * |
|
import re |
|
import nltk |
|
nltk.download('punkt') |
|
|
|
st.markdown(""" |
|
<style> |
|
/* استایل برای هدر */ |
|
.stAppHeader.st-emotion-cache-12fmjuu.e4hpqof0 { |
|
background-color: rgba(46,59,46, 0.8) !important; /* سبز متمایل به خاکی */ |
|
color: #2e3b2e !important; /* رنگ متن روشن */ |
|
font-family: 'Vazirmatn', Tahoma, sans-serif !important; |
|
padding: 20px !important; /* فضای داخلی بیشتر */ |
|
border-radius: 10px !important; /* گوشههای گرد */ |
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3) !important; /* سایه برای برجسته شدن */ |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
st.markdown(""" |
|
<style> |
|
/* بارگذاری فونت Roboto */ |
|
@font-face { |
|
font-family: 'Roboto'; |
|
src: url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap') format('woff2'); |
|
font-weight: 400; |
|
font-style: normal; |
|
} |
|
/* تنظیم فونت برای کل سایت */ |
|
html, body, [class*="css"] { |
|
font-family: 'Roboto', Tahoma, sans-serif !important; |
|
font-weight: 400 !important; |
|
direction: rtl; |
|
text-align: right; |
|
ظ color: #ffffff; |
|
} |
|
/* طراحی برای بخش استایل اپ */ |
|
.stApp { |
|
background: linear-gradient(to left, #4b5e40, #2e3b2e); |
|
color: #ffffff; |
|
} |
|
/* استایل برای سایدبار */ |
|
[data-testid="stSidebar"] { |
|
width: 260px !important; |
|
background-color: #1a2b1e; |
|
border: none !important; |
|
padding-top: 20px; |
|
} |
|
/* استایل برای آیتمهای منو */ |
|
.menu-item { |
|
display: flex; |
|
align-items: center; |
|
gap: 12px; |
|
padding: 12px 20px; |
|
font-size: 16px; |
|
font-weight: 600; |
|
color: #d4d4d4; |
|
cursor: pointer; |
|
transition: background-color 0.3s ease; |
|
} |
|
/* استایل برای آیتمهای منو هنگام هاور */ |
|
.menu-item:hover { |
|
background-color: #2e3b2e; |
|
color: #b8860b; |
|
} |
|
/* استایل برای آیکونها در منو */ |
|
.menu-item img { |
|
width: 25px; |
|
height: 25px; |
|
} |
|
/* استایل برای دکمهها */ |
|
.stButton>button { |
|
background-color: #b8860b !important; |
|
color: #1a2b1e !important; |
|
font-family: 'Roboto', Tahoma, sans-serif; |
|
font-weight: 700 !important; |
|
border-radius: 10px; |
|
padding: 12px 24px; |
|
border: none; |
|
transition: all 0.3s ease; |
|
font-size: 16px; |
|
width: 100%; |
|
margin: 10px 0; |
|
} |
|
/* استایل برای دکمهها هنگام هاور */ |
|
.stButton>button:hover { |
|
background-color: #8b6508 !important; |
|
transform: translateY(-2px); |
|
box-shadow: 0 4px 8px rgba(0,0,0,0.3); |
|
} |
|
/* استایل برای متن هدر */ |
|
.header-text { |
|
text-align: center; |
|
margin: 20px 0; |
|
background-color: rgba(26, 43, 30, 0.9); |
|
padding: 25px; |
|
border-radius: 15px; |
|
box-shadow: 0 6px 12px rgba(0,0,0,0.4); |
|
font-family: 'Roboto', Tahoma, sans-serif; /* اضافه شد */ |
|
} |
|
/* استایل برای زیرنویس */ |
|
.subtitle { |
|
font-size: 18px; |
|
color: #d4d4d4; |
|
font-weight: 600; |
|
margin-top: 10px; |
|
} |
|
/* استایل برای پیامهای چت */ |
|
.chat-message { |
|
flex-wrap: wrap; |
|
background-color: rgba(26, 43, 30, 0.95); |
|
border: 2px solid #b8860b; |
|
border-radius: 15px; |
|
padding: 20px; |
|
margin: 15px 0; |
|
box-shadow: 0 6px 12px rgba(0,0,0,0.3); |
|
animation: fadeIn 0.6s ease; |
|
font-size: 18px; |
|
color: #d4d4d4; |
|
font-weight: 600; |
|
display: flex; |
|
flex-wrap: wrap; |
|
align-items: center; |
|
gap: 15px; |
|
} |
|
/* انیمیشن برای ورود پیام چت */ |
|
@keyframes fadeIn { |
|
from { opacity: 0; transform: translateY(10px); } |
|
to { opacity: 1; transform: translateY(0); } |
|
} |
|
/* استایل برای ورودی متن */ |
|
.stTextInput>div>input, .stTextArea textarea { |
|
background-color: rgba(26, 43, 30, 0.95) !important; |
|
border-radius: 10px !important; |
|
border: 1px solid #b8860b !important; |
|
padding: 12px !important; |
|
font-family: 'Roboto', Tahoma; |
|
font-weight: 500; |
|
font-size: 16px; |
|
color: #d4d4d4 !important; |
|
} |
|
/* استایل برای خط افقی */ |
|
hr { |
|
border: 1px solid #b8860b; |
|
margin: 15px 0; |
|
} |
|
/* حذف مرز از قسمت سایدبار */ |
|
[data-testid="stSidebar"] > div { |
|
border: none !important; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
|
|
if "authenticated" not in st.session_state: |
|
st.session_state.authenticated = False |
|
|
|
if not st.session_state.authenticated: |
|
st.markdown('<style>.stTextInput > div[data-baseweb="input"] + div, .stTextInput div:has(div[role="alert"]) { display: none !important; }</style>', unsafe_allow_html=True) |
|
st.markdown(""" |
|
<style> |
|
input { |
|
background-color: #2e3b2e; |
|
color: gold; |
|
border: 1px solid gold; |
|
border-radius: 10px; |
|
padding: 10px; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
st.markdown(""" |
|
<style> |
|
/* فونت عمومی */ |
|
html, body, [class*="css"] { |
|
font-family: 'Vazir', sans-serif; |
|
} |
|
/* استایل برای برچسب فیلدهای ورودی */ |
|
label { |
|
font-size: 20px !important; |
|
color: #ffffff !important; |
|
font-weight: 800 !important; |
|
margin-bottom: 10px !important; |
|
display: block; |
|
} |
|
/* استایل برای ورودیها در تمام حالتها */ |
|
input[type="text"], |
|
input[type="password"], |
|
input[type="text"]:focus, |
|
input[type="password"]:focus, |
|
input[type="text"]:hover, |
|
input[type="password"]:hover { |
|
background-color: #ffffff !important; |
|
color: #000000 !important; |
|
font-size: 18px !important; |
|
font-family: 'Vazir', sans-serif !important; |
|
} |
|
/* Placeholder style */ |
|
::placeholder { |
|
color: #bbbbbb !important; |
|
opacity: 0.8 !important; |
|
font-size: 16px; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
username = st.text_input("نام کاربری:", placeholder="شناسه خود را وارد کنید", |
|
label_visibility="visible") |
|
|
|
password = st.text_input("رمز عبور:", placeholder="رمز عبور ", type="password", |
|
label_visibility="visible") |
|
st.markdown(""" |
|
<style> |
|
div.stButton > button { |
|
background-image: url("https://upload.wikimedia.org/wikipedia/commons/5/59/US_Army_Universal_Camouflage_Pattern.jpg"); |
|
background-size: cover; |
|
background-repeat: no-repeat; |
|
background-position: center; |
|
color: #f5deb3; |
|
font-family: 'Vazir', sans-serif; |
|
font-size: 20px; |
|
font-weight: bold; |
|
padding: 14px 35px; |
|
border: 2px solid #d4af37; |
|
border-radius: 14px; |
|
box-shadow: 0 0 18px rgba(0,0,0,0.6); |
|
transition: all 0.3s ease-in-out; |
|
} |
|
div.stButton > button:hover { |
|
filter: brightness(1.2); |
|
box-shadow: 0 0 22px #b8860b; |
|
transform: scale(1.03); |
|
} |
|
div.stButton > button:active { |
|
transform: scale(0.97); |
|
box-shadow: 0 0 12px #000; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
if st.button("ورود"): |
|
if username == "admin" and password == "123": |
|
st.session_state.authenticated = True |
|
st.rerun() |
|
else: |
|
st.markdown(""" |
|
<div style="background-color: rgba(241, 196, 15, 0.6); color: #2e3b2e; padding: 10px; border-radius: 10px; border: 2px solid #2e3b2e; margin-top: 20px; text-align: center; backdrop-filter: blur(5px);"> |
|
نام کاربری یا رمز عبور اشتباه است. |
|
</div> |
|
""", unsafe_allow_html=True) |
|
st.stop() |
|
|
|
|
|
with st.sidebar: |
|
st.image("log.png", use_container_width=True) |
|
|
|
menu_items = [ |
|
("گزارش عملیاتی", "https://cdn-icons-png.flaticon.com/512/3596/3596165.png", "https://m17idd-reporting.hf.space"), |
|
("تاریخچه ماموریتها", "https://cdn-icons-png.flaticon.com/512/709/709496.png", None), |
|
("تحلیل دادههای نظامی", "https://cdn-icons-png.flaticon.com/512/1828/1828932.png", "https://m17idd-test.hf.space"), |
|
("مدیریت منابع", "https://cdn-icons-png.flaticon.com/512/681/681494.png", None), |
|
("دستیار فرماندهی", "https://cdn-icons-png.flaticon.com/512/3601/3601646.png", None), |
|
("تنظیمات امنیتی", "https://cdn-icons-png.flaticon.com/512/2099/2099058.png", None), |
|
("پشتیبانی فنی", "https://cdn-icons-png.flaticon.com/512/597/597177.png", None), |
|
] |
|
|
|
st.markdown(""" |
|
<link href="https://cdn.jsdelivr.net/gh/rastikerdar/[email protected]/dist/font-face.css" rel="stylesheet" type="text/css" /> |
|
""", unsafe_allow_html=True) |
|
|
|
for idx, (text, icon, link) in enumerate(menu_items): |
|
content = f""" |
|
<div class="menu-item" style="display: flex; align-items: center; margin-bottom: 10px;"> |
|
<img src="{icon}" width="20" height="20" style="margin-left: 10px;" /> |
|
<span style="color: white; font-family: 'Vazir', sans-serif; font-weight: bold;">{text}</span> |
|
</div> |
|
""" |
|
|
|
if link: |
|
content = f'<a href="{link}" target="_blank" style="text-decoration: none;">{content}</a>' |
|
|
|
st.markdown(content, unsafe_allow_html=True) |
|
|
|
if idx in [1, 3, 5]: |
|
st.markdown("<hr style='border-top: 1px solid #555;'/>", unsafe_allow_html=True) |
|
|
|
st.markdown(""" |
|
<style> |
|
/* استایل برای متن هدر */ |
|
.header-text { |
|
text-align: center; |
|
margin: 50px 0; |
|
background: #2e3b2e; /* سبز زیتونی تیره جدید */ |
|
padding: 60px 30px; |
|
border-radius: 25px; |
|
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.8); /* سایه بیشتر */ |
|
animation: slideIn 2s ease-in-out, fadeIn 3s ease-in-out; |
|
background-size: cover; |
|
background-position: center; |
|
position: relative; |
|
} |
|
/* انیمیشن ورودی */ |
|
@keyframes fadeIn { |
|
0% { opacity: 0; transform: translateY(30px); } |
|
100% { opacity: 1; transform: translateY(0); } |
|
} |
|
@keyframes slideIn { |
|
0% { transform: translateX(-50%); opacity: 0; } |
|
100% { transform: translateX(0); opacity: 1; } |
|
} |
|
/* تغییر فونت برای h1 */ |
|
.header-text h1 { |
|
font-family: 'Vazir', sans-serif; |
|
font-size: 62px; |
|
color: #d89b00; /* طلایی تیرهتر */ |
|
margin: 0; |
|
font-weight: 900; |
|
letter-spacing: 4px; |
|
text-shadow: 4px 4px 15px rgba(0, 0, 0, 0.9); /* سایه سیاه بیشتر */ |
|
transform: scale(1.08); /* کمی بزرگتر شدن */ |
|
animation: glow 2s ease-in-out infinite alternate; |
|
} |
|
/* تغییر استایل زیرعنوان */ |
|
.subtitle { |
|
font-family: 'Vazir', sans-serif; |
|
font-size: 24px; |
|
color: #f8f8f8; |
|
font-weight: 700; |
|
margin-top: 15px; |
|
letter-spacing: 2px; |
|
text-shadow: 3px 3px 10px rgba(0,0,0,0.8); /* سایه بیشتر برای زیرعنوان */ |
|
animation: fadeInSubtitle 2s ease-in-out; |
|
} |
|
/* انیمیشن زیرعنوان */ |
|
@keyframes fadeInSubtitle { |
|
0% { opacity: 0; transform: translateY(20px); } |
|
100% { opacity: 1; transform: translateY(0); } |
|
} |
|
/* استایل برای دکمهها */ |
|
.stButton>button { |
|
background-color: #e67e22 !important; /* رنگ دکمه تغییر کرده */ |
|
color: #4b5320 !important; |
|
font-family: 'Vazir', sans-serif; |
|
font-weight: 700 !important; |
|
border-radius: 20px; |
|
padding: 15px 30px; |
|
border: none; |
|
transition: all 0.3s ease; |
|
font-size: 18px; |
|
width: 100%; |
|
margin: 20px 0; |
|
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); |
|
} |
|
.stButton>button:hover { |
|
background-color: #f39c12 !important; |
|
transform: translateY(-4px); |
|
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.6); |
|
} |
|
/* استایل برای استایل کلی صفحه */ |
|
.stApp { |
|
background: #2e3b2e; /* سبز زیتونی تیره جدید */ |
|
color: white; |
|
font-family: 'Vazir', sans-serif; |
|
} |
|
</style> |
|
<div class="header-text"> |
|
<h1>رزمیارارتش</h1> |
|
<div class="subtitle">دستیارهوشمند ارتش جمهوری اسلامی ایران</div> |
|
</div> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
llm = ChatOpenAI( |
|
base_url="https://api.together.xyz/v1", |
|
api_key='0291f33aee03412a47fa5d8e562e515182dcc5d9aac5a7fb5eefdd1759005979', |
|
model="deepseek-ai/DeepSeek-R1-Distill-Llama-70B-free", |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
st.markdown(""" |
|
<style> |
|
/* استایل برای کلاس خاص st-emotion-cache-128upt6 eht7o1d3 */ |
|
.st-emotion-cache-128upt6.eht7o1d3 { |
|
background-color: rgba(46,59,46, 0.8) !important; /* سبز تیره (44533f) */ |
|
border-radius: 10px !important; /* گوشههای گرد */ |
|
color: #d4d4d4 !important; /* رنگ متن روشن */ |
|
font-family: 'Vazirmatn', Tahoma, sans-serif !important; |
|
padding: 15px !important; /* فضای داخلی بیشتر */ |
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3) !important; /* سایه برای برجسته شدن */ |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
st.markdown(""" |
|
<style> |
|
.st-af.st-ah.st-bb.st-ar.st-as.st-ax.st-ay.st-az.st-b0.st-b1.st-b2.st-bc.st-b7 { |
|
background-color: #3a5338 !important; |
|
color: #d4d4d4 !important; |
|
border: 1px solid #c8a200 !important; |
|
border-radius: 10px; |
|
padding: 15px; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
st.markdown(""" |
|
<style> |
|
/* استایل برای کلاس st-emotion-cache-yd4u6l e1togvvn1 */ |
|
.st-emotion-cache-yd4u6l.e1togvvn1 { |
|
background-color: rgba(106, 127, 83, 0.8) !important; /* سبز خاکی مایل به زرد (#6a7f53) */ |
|
border-radius: 10px !important; /* گوشههای گرد */ |
|
color: #d4d4d4 !important; /* رنگ متن روشن */ |
|
font-family: 'Vazirmatn', Tahoma, sans-serif !important; |
|
padding: 15px !important; /* فضای داخلی بیشتر */ |
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3) !important; /* سایه برای برجسته شدن */ |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
st.markdown(""" |
|
<style> |
|
/* استایل برای هدر */ |
|
.stAppHeader.st-emotion-cache-12fmjuu.e4hpqof0 { |
|
background-color: rgba(42, 55, 39, 0.9) !important; /* سبز تیرهتر */ |
|
color: #d4d4d4 !important; /* رنگ متن روشن */ |
|
font-family: 'Vazirmatn', Tahoma, sans-serif !important; |
|
padding: 20px !important; /* فضای داخلی بیشتر */ |
|
border-radius: 10px !important; /* گوشههای گرد */ |
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3) !important; /* سایه برای برجسته شدن */ |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
st.markdown(""" |
|
<style> |
|
/* تغییر رنگ متن placeholder به خاکستری */ |
|
textarea::placeholder { |
|
color: #ffffff !important; /* خاکستری */ |
|
opacity: 1 !important; /* برای اینکه مرورگرها بهش بیتوجه نباشن */ |
|
} |
|
/* تغییر رنگ متن داخل چت اینپوت به خاکستری */ |
|
textarea { |
|
color: #ffffff !important; /* خاکستری */ |
|
border-radius: 10px !important; |
|
padding: 10px !important; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
|
|
st.markdown(""" |
|
<style> |
|
.thinking-message { |
|
display: flex; |
|
align-items: center; |
|
font-size: 18px; |
|
color: #ffffff; |
|
} |
|
.thinking-message p { |
|
margin-right: 10px; |
|
} |
|
.spinner { |
|
border: 4px solid #f3f3f3; |
|
border-top: 4px solid #4b6d3d; /* رنگ سبز تیره */ |
|
border-radius: 50%; |
|
width: 20px; |
|
height: 20px; |
|
animation: spin 2s linear infinite; |
|
} |
|
@keyframes spin { |
|
0% { transform: rotate(0deg); } |
|
100% { transform: rotate(360deg); } |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
import os |
|
import re |
|
import docx |
|
import streamlit as st |
|
import concurrent.futures |
|
from hazm import Normalizer |
|
from rapidfuzz import fuzz |
|
from langchain.schema import SystemMessage, HumanMessage |
|
from langchain.chat_models import ChatOpenAI |
|
|
|
|
|
folder_path = '46' |
|
normalizer = Normalizer() |
|
|
|
|
|
if "chat_history" not in st.session_state: |
|
st.session_state.chat_history = [] |
|
|
|
|
|
@st.cache_data(show_spinner="در حال بارگذاری اسناد...") |
|
def load_and_process_documents(path): |
|
def process_docx(filename): |
|
try: |
|
full_path = os.path.join(path, filename) |
|
doc = docx.Document(full_path) |
|
text = "\n".join([para.text for para in doc.paragraphs]) |
|
normalized = normalizer.normalize(text) |
|
return filename, normalized |
|
except Exception as e: |
|
return filename, "" |
|
|
|
filenames = [f for f in os.listdir(path) if f.endswith(".docx")] |
|
doc_texts = {} |
|
with concurrent.futures.ThreadPoolExecutor() as executor: |
|
for filename, content in executor.map(process_docx, filenames): |
|
doc_texts[filename] = content |
|
|
|
return doc_texts |
|
|
|
doc_texts = load_and_process_documents(folder_path) |
|
|
|
|
|
stop_words = [ |
|
"است", "و", "با", "که", "در", "از", "برای", "به", "بر", "تا", "این", "آن", "یک", "کدام", "کجا", "هم", "همه", |
|
"یا", "همچنین", "می", "باید", "شود", "شد", "گفت", "گویا", "داشت", "داشتن", "کنند", "کنیم", |
|
"کرد", "کردن", "نیز", "اگر", "ای", "اینکه", "نه", "باشید", "باشم", "باشی", "در حالی که", "مگر", "چرا" |
|
] |
|
|
|
|
|
def remove_stop_words(text, stop_words): |
|
words = text.split() |
|
return " ".join([word for word in words if word not in stop_words]) |
|
|
|
def extract_keywords_from_text(text, query_words): |
|
matched_lines = [] |
|
lines = text.split("\n") |
|
for line in lines: |
|
if any(query_word in line for query_word in query_words): |
|
matched_lines.append(line) |
|
return matched_lines |
|
|
|
def clean_text(text): |
|
return re.sub(r'[^آ-ی۰-۹0-9،.؟!؛+\-* ]+', '', text) |
|
|
|
def find_closest_lines(query, doc_texts, stop_words, top_n=10): |
|
cleaned_query = remove_stop_words(query, stop_words) |
|
query_words = cleaned_query.split() |
|
all_matched_lines = [] |
|
|
|
for filename, text in doc_texts.items(): |
|
matched_lines = extract_keywords_from_text(text, query_words) |
|
for line in matched_lines: |
|
similarity = fuzz.partial_ratio(query, line) |
|
all_matched_lines.append((line, similarity)) |
|
|
|
all_matched_lines.sort(key=lambda x: x[1], reverse=True) |
|
return [line for line, _ in all_matched_lines[:top_n]] |
|
|
|
def remove_stop_words_from_lines(lines, stop_words): |
|
cleaned_lines = [] |
|
for line in lines: |
|
words = line.split() |
|
cleaned_words = [word for word in words if word not in stop_words] |
|
cleaned_lines.append(" ".join(cleaned_words)) |
|
return cleaned_lines |
|
|
|
|
|
query = st.chat_input("چطور میتونم کمک کنم؟") |
|
|
|
if query: |
|
|
|
thinking = st.empty() |
|
thinking.markdown(""" |
|
<div style="background-color:#0d4d31;padding:10px;border-radius:10px;"> |
|
⏳ در حال فکر کردن... |
|
</div> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
closest_lines = find_closest_lines(query, doc_texts, stop_words, top_n=3) |
|
cleaned_closest_lines = remove_stop_words_from_lines(closest_lines, stop_words) |
|
|
|
if cleaned_closest_lines: |
|
prompt = f""" |
|
لطفاً با توجه به سؤال زیر و محتوای خطوط مرتبط، یک پاسخ نهایی حرفهای، دقیق و روان تولید کن. فقط از متن خطوط مرتبط استفاده کن. اگر اطلاعات کافی در متن وجود ندارد، صادقانه اعلام کن. |
|
سوال: |
|
{query} |
|
خطوط مرتبط: |
|
{cleaned_closest_lines} |
|
پاسخ نهایی: |
|
""" |
|
|
|
response = llm([ |
|
SystemMessage(content="You are a helpful assistant."), |
|
HumanMessage(content=prompt) |
|
]) |
|
final_answer = clean_text(response.content.strip()) |
|
else: |
|
final_answer = "❗ هیچ خط مرتبطی با سؤال پیدا نشد." |
|
|
|
|
|
thinking.empty() |
|
|
|
|
|
st.session_state.chat_history.append(("🧑", query)) |
|
st.session_state.chat_history.append(("🤖", final_answer)) |
|
|
|
st.markdown(""" |
|
<style> |
|
@import url('https://cdn.fontcdn.ir/Font/Persian/Vazir/Vazir.css'); |
|
|
|
div.chat-message { |
|
font-family: 'Vazir', sans-serif; |
|
font-size: 16px; |
|
color: white; |
|
background-color: #0d4d31; |
|
padding: 10px; |
|
border-radius: 10px; |
|
margin-bottom: 5px; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
|
|
st.markdown("---") |
|
for sender, message in st.session_state.chat_history: |
|
st.markdown(f'<div class="chat-message"><strong>{sender}</strong>: {message}</div>', unsafe_allow_html=True) |