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)