Spaces:
Sleeping
Sleeping
| # ----------------------------------------------------- | |
| # 1) MUST be the FIRST command | |
| # ----------------------------------------------------- | |
| import streamlit as st | |
| st.set_page_config(page_title="ClauseWise", layout="wide") | |
| # ----------------------------------------------------- | |
| # 2) All other imports AFTER set_page_config | |
| # ----------------------------------------------------- | |
| from pypdf import PdfReader | |
| from docx import Document | |
| import re | |
| from multilingual import UI_TEXT, translate_text | |
| from backup_features import ( | |
| extract_entities, | |
| extract_clauses, | |
| get_risks, | |
| fairness_score, | |
| alternative_clauses | |
| ) | |
| from transformers import T5Tokenizer, T5ForConditionalGeneration | |
| # ----------------------------------------------------- | |
| # 3) Load model | |
| # ----------------------------------------------------- | |
| def load_chat_model(): | |
| tokenizer = T5Tokenizer.from_pretrained("t5-small") | |
| model = T5ForConditionalGeneration.from_pretrained("t5-small") | |
| return tokenizer, model | |
| tokenizer, chat_model = load_chat_model() | |
| # ----------------------------------------------------- | |
| # 4) Chat response function | |
| # ----------------------------------------------------- | |
| def chat_response(user_msg, lang): | |
| msg = user_msg.lower() | |
| # Store conversation | |
| if "history" not in st.session_state: | |
| st.session_state["history"] = [] | |
| # Basic rule-based NDA responses | |
| if "nda" in msg: | |
| reply = "This NDA helps protect confidential information between parties." | |
| elif "duration" in msg or "how long" in msg: | |
| reply = "NDAs commonly last 1β5 years depending on the agreement." | |
| elif "penalty" in msg or "violate" in msg: | |
| reply = "Penalties depend on governing law and agreement provisions." | |
| elif "can i work" in msg or "competition" in msg: | |
| reply = "NDAs do NOT restrict employment. That is a Non-Compete Agreement." | |
| elif "termination" in msg: | |
| reply = "Termination clauses define when the NDA ends and obligations after that." | |
| else: | |
| reply = "I can help with NDA clauses, risks, obligations, confidentiality." | |
| reply += "\n\nβ οΈ Educational only, not legal advice." | |
| return translate_text(reply, lang) | |
| # ------------------------------- | |
| # Utility Functions | |
| # ------------------------------- | |
| def is_nda(text): | |
| return "nda" in text.lower() or "non-disclosure" in text.lower() | |
| def read_pdf(file): | |
| reader = PdfReader(file) | |
| return "\n".join(page.extract_text() for page in reader.pages) | |
| def read_docx(file): | |
| doc = Document(file) | |
| return "\n".join(p.text for p in doc.paragraphs) | |
| def read_txt(file): | |
| return file.read().decode("utf-8") | |
| # ------------------------------- | |
| # Streamlit UI | |
| # ------------------------------- | |
| st.set_page_config(page_title="ClauseWise", layout="wide") | |
| # Language Selector | |
| lang = st.sidebar.selectbox("π Language", ["en", "hi", "ta", "te", "kn"]) | |
| # Title | |
| st.title("π ClauseWise β Multilingual NDA Analyzer") | |
| uploaded = st.file_uploader(UI_TEXT["upload_title"][lang], type=["pdf", "txt", "docx"]) | |
| if uploaded: | |
| ext = uploaded.name.split(".")[-1] | |
| if ext == "pdf": | |
| text = read_pdf(uploaded) | |
| elif ext == "txt": | |
| text = read_txt(uploaded) | |
| elif ext == "docx": | |
| text = read_docx(uploaded) | |
| else: | |
| st.error(UI_TEXT["error_not_nda"][lang]) | |
| st.stop() | |
| if not is_nda(text): | |
| st.error(UI_TEXT["error_not_nda"][lang]) | |
| st.stop() | |
| st.success(UI_TEXT["success_nda"][lang]) | |
| tabs = st.tabs([ | |
| UI_TEXT["tab_clauses"][lang], | |
| UI_TEXT["tab_risks"][lang], | |
| UI_TEXT["tab_fairness"][lang], | |
| UI_TEXT["tab_entities"][lang], | |
| UI_TEXT["tab_alternatives"][lang], | |
| UI_TEXT["tab_chat"][lang] | |
| ]) | |
| # ----------------------------- | |
| # TAB 1 β CLAUSE SIMPLIFICATION | |
| # ----------------------------- | |
| with tabs[0]: | |
| st.header(UI_TEXT["clause_simplify"][lang]) | |
| clauses = extract_clauses(text) | |
| mode = st.radio(UI_TEXT["choose_mode"][lang], | |
| [UI_TEXT["eli5"][lang], | |
| UI_TEXT["simple"][lang], | |
| UI_TEXT["pro"][lang]]) | |
| for c in clauses: | |
| st.subheader(c["title"]) | |
| if mode == UI_TEXT["eli5"][lang]: | |
| st.write(translate_text(c["eli5"], lang)) | |
| elif mode == UI_TEXT["simple"][lang]: | |
| st.write(translate_text(c["simple"], lang)) | |
| else: | |
| # β FIXED SYNTAX ERROR HERE | |
| st.write(translate_text(c["pro"], lang)) | |
| # ----------------------------- | |
| # TAB 2 β RISKS | |
| # ----------------------------- | |
| with tabs[1]: | |
| st.header(UI_TEXT["risk_title"][lang]) | |
| risks = get_risks(text) | |
| for r in risks: | |
| st.error("β οΈ " + translate_text(r, lang)) | |
| # ----------------------------- | |
| # TAB 3 β FAIRNESS | |
| # ----------------------------- | |
| with tabs[2]: | |
| st.header(UI_TEXT["fairness_title"][lang]) | |
| score = fairness_score(text) | |
| st.write(f"**{UI_TEXT['your_position'][lang]}:** {score['user']}%") | |
| st.write(f"**{UI_TEXT['company_position'][lang]}:** {score['company']}%") | |
| st.progress(score["user"] / 100) | |
| # ----------------------------- | |
| # TAB 4 β ENTITIES | |
| # ----------------------------- | |
| with tabs[3]: | |
| st.header(UI_TEXT["entities_title"][lang]) | |
| ents = extract_entities(text) | |
| st.write("**Parties:**", ents["parties"]) | |
| st.write("**Dates:**", ents["dates"]) | |
| st.write("**Amounts:**", ents["money"]) | |
| # ----------------------------- | |
| # TAB 5 β ALTERNATIVES | |
| # ----------------------------- | |
| with tabs[4]: | |
| st.header(UI_TEXT["alt_title"][lang]) | |
| alts = alternative_clauses(text) | |
| for a in alts: | |
| st.info(translate_text(a, lang)) | |
| # ----------------------------- | |
| # TAB 6 β LEGAL CHAT | |
| # ----------------------------- | |
| with tabs[5]: | |
| st.header(UI_TEXT["chat_title"][lang]) | |
| if "chat_history" not in st.session_state: | |
| st.session_state.chat_history = [] | |
| for msg in st.session_state.chat_history: | |
| st.chat_message(msg["role"]).write(msg["text"]) | |
| user_msg = st.chat_input(UI_TEXT["chat_placeholder"][lang]) | |
| if user_msg: | |
| st.session_state.chat_history.append({"role": "user", "text": user_msg}) | |
| st.chat_message("user").write(user_msg) | |
| bot_reply = chat_response(user_msg, lang) | |
| st.session_state.chat_history.append({"role": "assistant", "text": bot_reply}) | |
| st.chat_message("assistant").write(bot_reply) | |
| # Footer Disclaimer | |
| st.info("β οΈ ClauseWise provides **educational legal insights only** β this is **NOT legal advice**.") | |