CoolFace
Apppublic

Nour83/contract_analysis

sourceHugging Faceupdated 7mo agoView on Hugging Face
0likes
app.py145 linesDownload Raw Back to root
1import streamlit as st2import os3import docx4import shutil5from langchain_community.document_loaders import PyPDFLoader6from langchain_huggingface import HuggingFaceEmbeddings7from langchain_chroma import Chroma8from langchain_groq import ChatGroq9from langchain_text_splitters import RecursiveCharacterTextSplitter10from langchain_core.documents import Document11from dotenv import load_dotenv12 13# 1. إعدادات الصفحة14st.set_page_config(page_title="AI Legal Auditor", layout="wide")15load_dotenv()16 17# تحسين شكل الواجهة18st.markdown("""19    <style>20    .stApp { background-color: #f8f9fa; }21    h1, h2, h3 { color: #1e3d59; font-family: 'Arial'; }22    .stButton>button { width: 100%; border-radius: 8px; background-color: #1e3d59; color: white; height: 3em; font-weight: bold; }23    .stButton>button:hover { background-color: #ffc107; color: #1e3d59; border: 1px solid #1e3d59; }24    .stAlert { border-radius: 10px; }25    </style>26    """, unsafe_allow_html=True)27 28# دالة قراءة الوورد29def read_docx(file_path):30    doc = docx.Document(file_path)31    text = "\n".join([para.text for para in doc.paragraphs if para.text.strip()])32    return [Document(page_content=text, metadata={"source": "uploaded_docx"})]33 34@st.cache_resource35def load_models():36    embeddings = HuggingFaceEmbeddings(model_name="./my_model")37    llm = ChatGroq(38        temperature=0, 39        api_key=os.getenv("GROQ_API_KEY"), 40        model_name="llama-3.3-70b-versatile"41    )42    return embeddings, llm43 44embeddings, llm = load_models()45 46st.title("⚖️ منصة تدقيق العقود الذكية")47st.write("حلل عقودك بدقة قانونية، اكتشف الثغرات، واضمن حقوقك بميزان القانون المصري.")48 49uploaded_file = st.file_uploader("ارفع العقد (PDF أو DOCX)", type=["pdf", "docx"])50 51if uploaded_file:52    file_ext = uploaded_file.name.split('.')[-1].lower()53    temp_path = f"temp_ui.{file_ext}"54    55    with open(temp_path, "wb") as f:56        f.write(uploaded_file.getbuffer())57 58    try:59        # معالجة الملف60        with st.spinner("جاري قراءة وتحليل المستند..."):61            if file_ext == "pdf":62                loader = PyPDFLoader(temp_path)63                docs = loader.load()64            else:65                docs = read_docx(temp_path)66 67        full_content = " ".join([d.page_content for d in docs])68        69        # --- فحص صحة العقد (Validation) ---70        legal_keywords = ["عقد", "بند", "طرف", "التزام", "اتفاق", "قانون", "صلاحية", "اختصاص", "contract", "agreement"]71        is_legal = any(word in full_content.lower() for word in legal_keywords)72 73        if not is_legal or len(full_content.strip()) < 150:74            st.error("⚠️ المستند المرفق لا يبدو عقداً قانونياً معتمداً. يرجى رفع ملف يحتوي على بنود قانونية واضحة.")75            st.stop()76        77        # تقسيم النص وإنشاء المستودع الرقمي78        text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)79        splits = text_splitter.split_documents(docs)80        vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)81        82        # زيادة k لـ 6 لضمان تحليل شامل للمخاطر83        retriever = vectorstore.as_retriever(search_kwargs={"k": 6})84 85        # دالة المهام الذكية86        def run_legal_task(task_instruction, use_table=False):87            relevant_docs = retriever.invoke(task_instruction)88            context = "\n\n".join([doc.page_content for doc in relevant_docs])89            90            table_info = "برجاء عرض النتائج في شكل جدول Markdown منظم." if use_table else ""91 92            # الـ Prompt التحليلي المطور93            full_prompt = f"""أنت مستشار قانوني مصري خبير وشديد الذكاء. 94            مهمتك: تحليل النص المرفق والإجابة على سؤال المستخدم بدقة وقوة قانونية.95 96            قواعد العمل:97            1. استخدم السياق المرفق لتحليل المخاطر، الثغرات، والالتزامات.98            2. في حالة الأسئلة التحليلية (مثل المخاطر)، قم باستنتاج التبعات القانونية بناءً على نصوص العقد والقانون المصري.99            3. إذا وجدت بنداً غامضاً أو معلومة ناقصة (مثل غياب تاريخ الانتهاء أو شروط الفسخ)، وضح ذلك فوراً كخطر محتمل.100            4. الإجابة بالعربية الفصحى فقط، وبأسلوب قانوني رصين.101            5. ممنوع استخدام أي لغة غير العربية في الإجابة.102 103            السياق المستخرج:104            {context}105 106            المهمة المطلوبة: {task_instruction}107            {table_info}108 109            الإجابة التحليلية:"""110            111            with st.spinner("جاري الفحص القانوني..."):112                response = llm.invoke(full_prompt)113                return response.content114 115        # عرض الواجهة116        st.success("✅ تم التعرف على المستند بنجاح. يمكنك الآن البدء بالتدقيق.")117        118        col1, col2, col3 = st.columns(3)119        with col1:120            if st.button("📝 ملخص العقد"):121                res = run_legal_task("لخص أهم بنود العقد (الأطراف، القيمة، المدة، وطبيعة العمل).", True)122                st.markdown(res)123        with col2:124            if st.button("🚨 كشف المخاطر"):125                res = run_legal_task("استخرج أي ثغرات قانونية أو مخاطر محتملة في هذا العقد بناءً على بنود الفسخ والتعويضات.")126                st.warning(res)127        with col3:128            if st.button("💰 الالتزامات"):129                res = run_legal_task("ما هي الالتزامات المالية، طرق الدفع، والجزاءات المذكورة؟", True)130                st.info(res)131 132        st.divider()133        st.subheader("💬 اسأل المستشار القانوني")134        user_query = st.text_input("اسأل عن أي بند محدد (مثلاً: ما هو موقف الطرف الثاني في حالة القوة القاهرة؟)")135        if user_query:136            answer = run_legal_task(user_query)137            st.chat_message("assistant").write(answer)138 139    except Exception as e:140        st.error(f"حدث خطأ أثناء المعالجة: {e}")141    finally:142        if os.path.exists(temp_path):143            os.remove(temp_path)144else:145    st.info("💡 **نصيحة:** ارفع عقداً واضحاً بصيغة PDF أو Word للحصول على أدق تحليل قانوني.")