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
# from sentence_transformers import SentenceTransformer
import numpy as np
from hazm import *
import re
import nltk
nltk.download('punkt')
st.set_page_config(
page_title="رزم یار",
page_icon="⚔️",
layout="wide"
)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
if "authenticated" not in st.session_state:
st.session_state.authenticated = False
if not st.session_state.authenticated:
st.markdown('', unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
username = st.text_input("نام کاربری:", placeholder="شناسه خود را وارد کنید",
label_visibility="visible")
password = st.text_input("رمز عبور:", placeholder="رمز عبور ", type="password",
label_visibility="visible")
st.markdown("""
""", unsafe_allow_html=True)
if st.button("ورود"):
if username == "admin" and password == "123":
st.session_state.authenticated = True
st.rerun()
else:
st.markdown("""
نام کاربری یا رمز عبور اشتباه است.
""", 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("""
""", unsafe_allow_html=True)
for idx, (text, icon, link) in enumerate(menu_items):
content = f"""
"""
if link:
content = f'{content}'
st.markdown(content, unsafe_allow_html=True)
if idx in [1, 3, 5]:
st.markdown("
", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
llm = ChatOpenAI(
base_url="https://api.together.xyz/v1",
api_key='333ac33f5be91819cb7ade101134d73f5e63d299a964ae290850eeac5d82a8d5',
model="Qwen/Qwen2-VL-72B-Instruct",
)
# from transformers import pipeline
# hf_api_key = os.getenv("tavana55")
# model_name = "Qwen/Qwen3-0.6B"
# llm = pipeline("text-generation", model=model_name)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
st.markdown("""
""", unsafe_allow_html=True)
import json
import requests
import streamlit as st
import numpy as np
from langchain.schema import SystemMessage, HumanMessage
from langchain.chat_models import ChatOpenAI
from sklearn.metrics.pairwise import cosine_similarity
EMBEDDING_FILE = "embeddings.json"
EMBEDDING_MODEL = "intfloat/multilingual-e5-large-instruct"
TOGETHER_API_KEY = "333ac33f5be91819cb7ade101134d73f5e63d299a964ae290850eeac5d82a8d5"
@st.cache_data
def load_embeddings(file_path):
with open(file_path, "r", encoding="utf-8") as f:
return json.load(f)
def get_query_embedding_together(query):
url = "https://api.together.xyz/v1/embeddings"
headers = {
"Authorization": f"Bearer {TOGETHER_API_KEY}",
"accept": "application/json",
"content-type": "application/json"
}
payload = {
"model": EMBEDDING_MODEL,
"input": query
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
return response.json()["data"][0]["embedding"]
def find_most_similar_chunks(query_embedding, data, top_n=3):
query_vec = np.array(query_embedding).reshape(1, -1)
similarities = []
for item in data:
chunk_vec = np.array(item["embedding"]).reshape(1, -1)
sim = cosine_similarity(query_vec, chunk_vec)[0][0]
similarities.append((item["chunk"], sim))
similarities.sort(key=lambda x: x[1], reverse=True)
return [chunk for chunk, _ in similarities[:top_n]]
def clean_text(text):
import re
return re.sub(r'[^آ-یa-zA-Z0-9۰-۹,.،؟!؛\s]+', '', text)
query = st.text_input("سؤال خود را وارد کنید:")
if "chat_history" not in st.session_state:
st.session_state.chat_history = []
if query:
thinking = st.empty()
thinking.markdown("⏳ در حال پردازش...")
try:
query_embedding = get_query_embedding_together(query)
data = load_embeddings(EMBEDDING_FILE)
top_chunks = find_most_similar_chunks(query_embedding, data, top_n=3)
context = "\n".join(top_chunks)
prompt = f"""
فقط و فقط با استفاده از محتوای زیر به سؤال پاسخ بده.
اگر اطلاعات کافی نبود، واضح بگو اطلاعات کافی وجود ندارد، سپس با دانش عمومی پاسخ بده.
سؤال:
{query}
محتوا:
{context}
پاسخ نهایی:
"""
response = llm([
SystemMessage(
content="تو یک دستیار دقیق هستی که فقط با اطلاعات موجود در متن پاسخ میدهی. اگر اطلاعات نبود، آن را اعلام میکنی و بعد از دانش خودت استفاده میکنی."
),
HumanMessage(content=prompt)
])
final_answer = clean_text(response.content.strip())
except Exception as e:
final_answer = f"❗ خطا: {str(e)}"
thinking.empty()
st.session_state.chat_history.append(("🧑", query))
st.session_state.chat_history.append(("🤖", final_answer))
# نمایش چت
st.markdown("---")
for sender, message in st.session_state.chat_history:
st.markdown(f'{sender}: {message}
', unsafe_allow_html=True)