rosolsharairh commited on
Commit
74b416d
Β·
verified Β·
1 Parent(s): 21a6ce8

original app

Browse files
Files changed (1) hide show
  1. app (2).py +143 -0
app (2).py ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import uuid
3
+ import logging
4
+ import requests
5
+ import gradio as gr
6
+
7
+ from langdetect import detect
8
+ from multilingual_pdf2text.pdf2text import PDF2Text
9
+ from multilingual_pdf2text.models.document_model.document import Document
10
+
11
+ import pdfplumber
12
+ import docx2txt
13
+ import shutil
14
+ import subprocess
15
+
16
+ print("πŸ” Checking if Tesseract OCR is installed...")
17
+
18
+ tess_path = shutil.which("tesseract")
19
+ if tess_path:
20
+ print(f"βœ… Tesseract found at: {tess_path}")
21
+ try:
22
+ version = subprocess.check_output(["tesseract", "--version"]).decode()
23
+ print(f"🧠 Tesseract version:\n{version}")
24
+ except Exception as e:
25
+ print(f"⚠️ Tesseract found but failed to run: {e}")
26
+ else:
27
+ print("❌ Tesseract not found. Arabic PDF extraction will likely fail.")
28
+
29
+
30
+ # --- Config ---
31
+ FLOWISE_URL = "https://siraflowappl.happywave-0e1819cd.uaenorth.azurecontainerapps.io/api/v1/prediction/5f2aa074-ae2e-4b06-a4a2-6f8dccbe59bb"
32
+ COUNTRIES = ["USA", "Germany", "UAE", "Turkey", "Jordan"]
33
+ LANGUAGES = ["English", "Arabic"]
34
+
35
+ logging.basicConfig(level=logging.INFO)
36
+
37
+ # --- File Text Extraction ---
38
+ def extract_text_from_file(file_path: str) -> str:
39
+ ext = os.path.splitext(file_path)[1].lower()
40
+
41
+ try:
42
+ if ext == ".pdf":
43
+ with pdfplumber.open(file_path) as pdf:
44
+ extracted = "\n".join(
45
+ page.extract_text() for page in pdf.pages if page.extract_text()
46
+ )
47
+
48
+ sample = extracted[:1000].strip()
49
+ lang = detect(sample) if sample else "unknown"
50
+
51
+ if lang == "ar" or not sample:
52
+ arabic_doc = Document(document_path=file_path, language="ara")
53
+ pdf2text = PDF2Text(document=arabic_doc)
54
+ extracted = pdf2text.extract()
55
+
56
+ if isinstance(extracted, list):
57
+ if isinstance(extracted[0], dict):
58
+ return "\n".join(item.get("text", "") for item in extracted)
59
+ elif isinstance(extracted[0], str):
60
+ return "\n".join(extracted)
61
+ else:
62
+ return "[Error: Unexpected Arabic extractor format.]"
63
+ elif isinstance(extracted, str):
64
+ return extracted
65
+ else:
66
+ return "[Error: Unrecognized Arabic extraction output.]"
67
+
68
+ return extracted or "[Warning: No readable text found in PDF.]"
69
+
70
+ elif ext == ".docx":
71
+ return docx2txt.process(file_path)
72
+
73
+ elif ext == ".txt":
74
+ with open(file_path, "r", encoding="utf-8", errors="ignore") as f:
75
+ return f.read()
76
+
77
+ else:
78
+ return "[Unsupported file format.]"
79
+
80
+ except Exception as e:
81
+ logging.exception("Failed to extract text.")
82
+ return f"[Error reading file: {e}]"
83
+
84
+ # --- Flowise Query ---
85
+ def send_to_flowise(file, country: str, language: str) -> str:
86
+ if not file or not country or not language:
87
+ return "❗ Please upload a contract, select a country, and choose a response language."
88
+
89
+ try:
90
+ contract_text = extract_text_from_file(file.name).strip()
91
+ if not contract_text:
92
+ return "⚠️ No content extracted from the uploaded file."
93
+
94
+ prompt = f"""Please audit the following employment contract in light of {country} labor law.
95
+ Only refer to the provided law document (do not use external knowledge).
96
+ Is the contract compliant? Provide reasoning and highlight any issues, and suggest improvements.
97
+ Be precise and don't miss any details in the contract.
98
+ Please respond in {language}.
99
+ <CONTRACT START>
100
+ {contract_text}
101
+ <CONTRACT END>"""
102
+
103
+ payload = {
104
+ "question": prompt,
105
+ "chatId": str(uuid.uuid4())
106
+ }
107
+
108
+ res = requests.post(FLOWISE_URL, json=payload, timeout=300)
109
+ logging.info("πŸ” Flowise response: %s", res.text)
110
+
111
+ if res.status_code != 200:
112
+ return f"❌ Flowise error {res.status_code}: {res.text}"
113
+
114
+ return res.json().get("text", "⚠️ Flowise returned no text.")
115
+
116
+ except Exception as e:
117
+ logging.exception("Flowise request failed.")
118
+ return f"❌ Connection error: {e}"
119
+
120
+ # --- Gradio UI ---
121
+ with gr.Blocks(title="Contract Auditor") as demo:
122
+ gr.Markdown("## πŸ“‘ Contract Auditor")
123
+
124
+ with gr.Row():
125
+ country_dropdown = gr.Dropdown(choices=COUNTRIES, label="🌍 Select Country", interactive=True)
126
+ language_dropdown = gr.Dropdown(choices=LANGUAGES, label="πŸ—£οΈ Select Response Language", interactive=True)
127
+
128
+ file_input = gr.File(
129
+ label="πŸ“Ž Upload a contract file",
130
+ file_types=[".pdf", ".docx", ".txt"],
131
+ type="filepath"
132
+ )
133
+
134
+ submit_btn = gr.Button("πŸ“€ Audit Contract")
135
+ output = gr.Textbox(label="🧠 Audit Result", lines=12)
136
+
137
+ submit_btn.click(
138
+ fn=send_to_flowise,
139
+ inputs=[file_input, country_dropdown, language_dropdown],
140
+ outputs=output
141
+ )
142
+
143
+ demo.launch(share=True)