Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -5,7 +5,7 @@ from dataclasses import dataclass
|
|
| 5 |
|
| 6 |
import gradio as gr
|
| 7 |
import torch
|
| 8 |
-
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 9 |
|
| 10 |
# ---------------- Language detection ----------------
|
| 11 |
ARABIC_RE = re.compile(r"[\u0600-\u06FF]")
|
|
@@ -141,6 +141,57 @@ def diversify_if_similar(prev: str, current: str, user_msg: str, lang: str) -> s
|
|
| 141 |
return alt if alt else current
|
| 142 |
return current
|
| 143 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
# ---------------- Base checklist + Go-Bag ----------------
|
| 145 |
def base_checklist_and_bag(user_msg: str, lang: str) -> Tuple[str, List[str]]:
|
| 146 |
low = user_msg.lower()
|
|
@@ -150,11 +201,11 @@ def base_checklist_and_bag(user_msg: str, lang: str) -> Tuple[str, List[str]]:
|
|
| 150 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 151 |
"- جھک جائیں/Stay low — دھواں اوپر جاتا ہے\n"
|
| 152 |
"- ناک/منہ پر گیلا کپڑا رکھیں\n"
|
| 153 |
-
"- اگر
|
| 154 |
"- گرم دروازہ مت کھولیں؛ دوسرا راستہ لیں\n"
|
| 155 |
"- سیڑھیاں استعمال کریں — لفٹ نہیں\n"
|
| 156 |
"- بچوں/بزرگوں کو ساتھ رکھیں\n"
|
| 157 |
-
"🕊️ گھبرائیں نہیں —
|
| 158 |
) if lang=="ur" else (
|
| 159 |
"✅ Do this now:\n"
|
| 160 |
"- Stay low — smoke rises\n"
|
|
@@ -173,9 +224,9 @@ def base_checklist_and_bag(user_msg: str, lang: str) -> Tuple[str, List[str]]:
|
|
| 173 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 174 |
"- Drop, Cover, Hold — جھکیں، ڈھکیں، پکڑیں\n"
|
| 175 |
"- کھڑکیوں/بھاری اشیاء سے دور رہیں\n"
|
| 176 |
-
"- جھٹکے رکنے پر سیڑھیوں سے باہر نکلیں (لفٹ
|
| 177 |
"- کھلی جگہ میں رکیں\n"
|
| 178 |
-
"🕊️ حوصلہ رکھیں —
|
| 179 |
) if lang=="ur" else (
|
| 180 |
"✅ Do this now:\n"
|
| 181 |
"- Drop, Cover, Hold On\n"
|
|
@@ -190,11 +241,11 @@ def base_checklist_and_bag(user_msg: str, lang: str) -> Tuple[str, List[str]]:
|
|
| 190 |
elif any(k in low for k in ["سیلاب","flood","overflow","water entering","طوفان","storm","آندھی"]):
|
| 191 |
evac = True
|
| 192 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 193 |
-
"- اگر
|
| 194 |
-
"- اونچی
|
| 195 |
"- پانی میں گاڑی نہ چلائیں\n"
|
| 196 |
"- بچوں/بزرگوں کو پہلے نکالیں\n"
|
| 197 |
-
"🕊️ گھبرائیں نہیں —
|
| 198 |
) if lang=="ur" else (
|
| 199 |
"✅ Do this now:\n"
|
| 200 |
"- Turn off main power if safe\n"
|
|
@@ -209,10 +260,10 @@ def base_checklist_and_bag(user_msg: str, lang: str) -> Tuple[str, List[str]]:
|
|
| 209 |
elif any(k in low for k in ["gas","گیس","leak","smell gas","بو"]):
|
| 210 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 211 |
"- کوئی چنگاری/سوئچ/لائٹر استعمال نہ کریں\n"
|
| 212 |
-
"- کھڑکیاں/دروازے کھول کر ہوا
|
| 213 |
"- گیس مین والو بند کریں\n"
|
| 214 |
"- محفوظ فاصلے پر چلے جائیں\n"
|
| 215 |
-
"🕊️ پرسکون رہیں —
|
| 216 |
) if lang=="ur" else (
|
| 217 |
"✅ Do this now:\n"
|
| 218 |
"- No sparks (no switches/lighters/flash)\n"
|
|
@@ -226,7 +277,7 @@ def base_checklist_and_bag(user_msg: str, lang: str) -> Tuple[str, List[str]]:
|
|
| 226 |
["Mask/wet cloth","IDs","Phone+power bank","Water","Medicines"])
|
| 227 |
elif any(k in low for k in ["injury","زخمی","bleeding","cut","fracture","burn"]):
|
| 228 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 229 |
-
"- خون ہو تو
|
| 230 |
"- زخم صاف پانی سے دھوئیں\n"
|
| 231 |
"- گہرا زخم/زیادہ خون ہو تو فوری مدد لیں\n"
|
| 232 |
"- گردن/کمر چوٹ میں مریض کو نہ ہلائیں\n"
|
|
@@ -303,6 +354,15 @@ def chat_fn(user_msg: str, chat_messages: List[Dict[str,str]], sim_state: dict):
|
|
| 303 |
{"role":"assistant","content":msg}
|
| 304 |
], sim_state
|
| 305 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 306 |
# Base checklist + Go-Bag
|
| 307 |
base, _ = base_checklist_and_bag(user_msg, lang)
|
| 308 |
|
|
|
|
| 5 |
|
| 6 |
import gradio as gr
|
| 7 |
import torch
|
| 8 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM
|
| 9 |
|
| 10 |
# ---------------- Language detection ----------------
|
| 11 |
ARABIC_RE = re.compile(r"[\u0600-\u06FF]")
|
|
|
|
| 141 |
return alt if alt else current
|
| 142 |
return current
|
| 143 |
|
| 144 |
+
# ---------------- Prebaked Urdu FAQs (exact templates you provided) ----------------
|
| 145 |
+
# ہم regex-based ہلکا میچ استعمال کر رہے ہیں تاکہ اردو عبارت کے عام انداز پکڑ سکیں
|
| 146 |
+
PREBAKED_UR: List[Dict[str,str]] = [
|
| 147 |
+
{
|
| 148 |
+
"q_re": r"(سیلاب).*(گھر).*(ہوں|ہو)", # سیلاب آ گیا! میں گھر میں ہوں
|
| 149 |
+
"answer": "🚨 فوری اقدامات:\n- فوراً اونچی جگہ (2+ فلور) کی طرف ہٹیں۔\n- گہرے گھاٹ، ندیوں کے کنارے، یا چھوٹے دریاؤں کے قریب نہ رہیں۔\n- اگر گاڑی میں ہیں، تو فوراً گاڑی چھوڑ کر ہٹیں — گاڑی بہہ سکتی ہے۔\n\n📌 اگلے اقدامات:\n- 1122 یا 1500 پر فون کریں۔\n- اپنے فون کو ہائی ہولڈ رکھیں — پانی میں بھیگنے سے بچائیں ۔\n\n💡 کلیدی نکات:\n- پانی میں ہاتھ پاؤں نہ ڈالیں — گہرائی یا تیز دھارا کا خطرہ ہے۔\n- سیلاب کے بعد گھر میں داخل نہ ہوں جب تک کہ پانی نہ روکا گیا ہو۔"
|
| 150 |
+
},
|
| 151 |
+
{
|
| 152 |
+
"q_re": r"(زلزلہ).*(آ).*(رہا|رہی|گیا|گئی)|(جھٹک|ہل رہا)",
|
| 153 |
+
"answer": "🚨 فوری اقدامات:\n- 'ڈاون ڈاؤن' (Drop, Cover, Hold On):\n - گریں (Drop)\n - ٹیبل یا مضبوط دیوار کے نیچے چھپیں (Cover)\n - سر کو ہاتھوں سے چھپائیں (Hold On)\n- کھڑے ہو کر دروازے یا کھڑکیوں کی طرف نہ بھاگیں — شیشے ٹوٹ سکتے ہیں۔\n\n📌 اگلے اقدامات:\n- زلزلہ ختم ہونے کے بعد فوراً گھر سے باہر نکلیں — گری سے گری ہوئی عمارت گر سکتی ہے۔\n- بجلی، گیس، پانی کے پائپ بند کریں (اگر گیس کی بو آ رہی ہو)۔\n\n💡 کلیدی نکات:\n- زلزلہ کے دوران کسی چیز کو ہلائیں یا چھوڑیں — ہلاکت خیز ہو سکتا ہے۔\n- گاڑی میں ہوں تو گاڑی کے اندر بیٹھیں — باہر نہ نکلیں۔"
|
| 154 |
+
},
|
| 155 |
+
{
|
| 156 |
+
"q_re": r"(آگ|جل).*(لگ|گئی|گیا)",
|
| 157 |
+
"answer": "🚨 فوری اقدامات:\n- فوراً گھر سے باہر نکلیں — دھواں سانس کے لیے خطرہ ہے۔\n- ہاتھ سے چہرہ ڈھانپیں اور زمین پر چلتے رہیں (دھواں اوپر ہوتا ہے)۔\n- کوئی بجلی، فون، یا شمع نہ چلائیں — چمک آتشباری کر سکتی ہے۔\n\n📌 اگلے اقدامات:\n- 1122 پر فون کریں — آگ کے بارے میں مطلع کریں۔\n- رشتہ داروں کو مطلع کریں کہ آپ کہاں ہیں۔\n\n💡 کلیدی نکات:\n- زندگی کو بچانا آگ کو بچانے سے زیادہ اہم ہے۔\n- آگ کے بعد گھر میں داخل نہ ہوں جب تک کہ ٹیم کا اجازت نہ ہو۔"
|
| 158 |
+
},
|
| 159 |
+
{
|
| 160 |
+
"q_re": r"(گیس).*(لیک|بو|رس|smell)",
|
| 161 |
+
"answer": "🚨 فوری اقدامات:\n- گیس کا سوئچ بند کریں (اسٹو کے بالکل نیچے)۔\n- کوئی بجلی، فون، یا شمع نہ چلائیں — چمک آتشباری کر سکتی ہے۔\n- فوراً گھر سے باہر نکلیں — گیس ہلکی سی بھی ہو سکتی ہے۔\n\n📌 اگلے اقدامات:\n- 1122 یا 1500 پر فون کریں — گیس کمپنی کو مطلع کریں۔\n- گھر میں داخل نہ ہوں جب تک کہ گیس چیک نہ ہو جائے۔\n\n💡 کلیدی نکات:\n- گیس لیک کا خطرہ ہر وقت موجود ہے — ہر ماہ چیک کروائیں۔\n- گیس ڈیٹیکٹر لگائیں — اگر ہے، تو اسے فوراً چالو کریں۔"
|
| 162 |
+
},
|
| 163 |
+
{
|
| 164 |
+
"q_re": r"(کلاؤڈ\s*برسٹ|cloud\s*burst)",
|
| 165 |
+
"answer": "🚨 فوری اقدامات:\n- فوراً اونچی جگہ (پہاڑی، چوٹی) کی طرف ہٹیں۔\n- گہرے گھاٹ، ندیوں کے کنارے، یا چھوٹے دریاؤں کے قریب نہ رہیں۔\n- اگر گاڑی میں ہیں، تو فوراً گاڑی چھوڑ کر ہٹیں — گاڑی بہہ سکتی ہے۔\n\n📌 اگلے اقدامات:\n- 1122 پر فون کریں — ہیلپ مانگیں۔\n- اپنے فون کو ہائی ہولڈ رکھیں — پانی میں نہ ڈالیں۔\n\n💡 کلیدی نکات:\n- کلاؤڈ برسٹ کے بعد سیلاب فوری ہوتا ہے — اس لیے وقت ضائع نہ کریں۔\n- اگر زمین ہل رہی ہو، تو یہ سیلاب کا اشارہ ہے — فوراً ہٹیں۔"
|
| 166 |
+
},
|
| 167 |
+
{
|
| 168 |
+
"q_re": r"(بجلی).*(گر|گری|گر گئی|گرگئی)|lightning|electr",
|
| 169 |
+
"answer": "🚨 فوری اقدامات:\n- فوراً بجلی کے سوئچ بند کریں (اگر ممکن ہو)۔\n- کوئی بجلی کا آلہ نہ چلائیں — شرارت یا چوٹ لگ سکتی ہے۔\n- ہاتھ پاؤں نہ ڈالیں بلکہ ہلکی روشنی (ٹارچ) استعمال کریں۔\n\n📌 اگلے اقدامات:\n- 1122 پر فون کریں — بجلی کمپنی کو مطلع کریں۔\n- ایمرجنسی ٹارچ یا فون کی روشنی استعمال کریں۔\n\n💡 کلیدی نکات:\n- بجلی گرنے کے بعد کسی بھی الیکٹریکل آلے کو چلانے سے گریز کریں۔\n- ہر 6 ماہ بجلی کے سوئچ اور کیبلز چیک کروائیں۔"
|
| 170 |
+
},
|
| 171 |
+
{
|
| 172 |
+
"q_re": r"(^|\s)SOS(\s|!|۔)|مدد\s*کرو",
|
| 173 |
+
"answer": "🚨 SOS فائر ہو گیا!\n- فوراً 1122 پر فون کریں — ہیلپ ڈیسک آپ کو مدد کرے گی۔\n- اگر فون کنکشن ہو، تو میں فوراً 1122 پر فون کرتا ہوں...\n- اپنے آپ کو ٹھیک رکھیں — آپ کے ساتھ ہے۔\n\n💡 کلیدی نکات:\n- SOS کا وقت ہے — فوراً 1122 پر فون کریں۔\n- ہر ہفتے ایمرجنسی بیگ چیک کریں: پانی، فوڈ، ٹارچ، فون چارجر، فارمیسی۔"
|
| 174 |
+
},
|
| 175 |
+
{
|
| 176 |
+
"q_re": r"(سیلاب).*(بعد|ختم|اتر)",
|
| 177 |
+
"answer": "🚨 ایمرجنسی کے بعد:\n- گھر میں داخل نہ ہوں جب تک کہ پانی نہ روکا گیا ہو۔\n- گیس، بجلی، پانی کے پائپ چیک کروائیں — خطرہ ہو سکتا ہے۔\n- اپنے فون کو چارج کریں — ہیلپ ڈیسک سے رابطہ کریں۔\n\n📌 اگلے اقدامات:\n- 1122 پر فون کریں — اپنی حالت بتائیں۔\n- رشتہ داروں کو مطلع کریں کہ آپ کہاں ہیں۔\n\n💡 کلیدی نکات:\n- پانی کے بعد گرد و غبار، کیمیکل، یا بیکٹیریا ہو سکتے ہیں — کپڑے بدلیں۔\n- ایمرجنسی بیگ میں پانی، فوڈ، فارمیسی، ٹارچ وغیرہ رکھیں"
|
| 178 |
+
},
|
| 179 |
+
]
|
| 180 |
+
|
| 181 |
+
def match_prebaked_ur(user_msg: str) -> str:
|
| 182 |
+
"""اگر یوزر میسج اردو میں ہو اور کسی پری باکڈ ٹیمپلیٹ سے میچ کرے تو وہی جواب لوٹائیں۔"""
|
| 183 |
+
if detect_lang(user_msg) != "ur":
|
| 184 |
+
return ""
|
| 185 |
+
text = user_msg.strip()
|
| 186 |
+
for item in PREBAKED_UR:
|
| 187 |
+
pattern = item.get("q_re")
|
| 188 |
+
try:
|
| 189 |
+
if re.search(pattern, text, flags=re.IGNORECASE):
|
| 190 |
+
return item.get("answer","").strip()
|
| 191 |
+
except re.error:
|
| 192 |
+
continue
|
| 193 |
+
return ""
|
| 194 |
+
|
| 195 |
# ---------------- Base checklist + Go-Bag ----------------
|
| 196 |
def base_checklist_and_bag(user_msg: str, lang: str) -> Tuple[str, List[str]]:
|
| 197 |
low = user_msg.lower()
|
|
|
|
| 201 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 202 |
"- جھک جائیں/Stay low — دھواں اوپر جاتا ہے\n"
|
| 203 |
"- ناک/منہ پر گیلا کپڑا رکھیں\n"
|
| 204 |
+
"- اگر محفوظ ہو تو بجلی/گیس مین بند کریں\n"
|
| 205 |
"- گرم دروازہ مت کھولیں؛ دوسرا راستہ لیں\n"
|
| 206 |
"- سیڑھیاں استعمال کریں — لفٹ نہیں\n"
|
| 207 |
"- بچوں/بزرگوں کو ساتھ رکھیں\n"
|
| 208 |
+
"🕊️ گھبرائیں نہیں — میں آپ کے ساتھ ہوں۔"
|
| 209 |
) if lang=="ur" else (
|
| 210 |
"✅ Do this now:\n"
|
| 211 |
"- Stay low — smoke rises\n"
|
|
|
|
| 224 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 225 |
"- Drop, Cover, Hold — جھکیں، ڈھکیں، پکڑیں\n"
|
| 226 |
"- کھڑکیوں/بھاری اشیاء سے دور رہیں\n"
|
| 227 |
+
"- جھٹکے رکنے پر سیڑھیوں سے باہر نکلیں (لفٹ نہیں)\n"
|
| 228 |
"- کھلی جگہ میں رکیں\n"
|
| 229 |
+
"🕊️ حوصلہ رکھیں — میں آپ کے ساتھ ہوں۔"
|
| 230 |
) if lang=="ur" else (
|
| 231 |
"✅ Do this now:\n"
|
| 232 |
"- Drop, Cover, Hold On\n"
|
|
|
|
| 241 |
elif any(k in low for k in ["سیلاب","flood","overflow","water entering","طوفان","storm","آندھی"]):
|
| 242 |
evac = True
|
| 243 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 244 |
+
"- اگر محفوظ ہو تو بجلی مین سوئچ بند کریں\n"
|
| 245 |
+
"- اونچی جگہ/چھت پر منتقل ہوں\n"
|
| 246 |
"- پانی میں گاڑی نہ چلائیں\n"
|
| 247 |
"- بچوں/بزرگوں کو پہلے نکالیں\n"
|
| 248 |
+
"🕊️ گھبرائیں نہیں — آپ محفوظ نکل سکتے ہیں۔"
|
| 249 |
) if lang=="ur" else (
|
| 250 |
"✅ Do this now:\n"
|
| 251 |
"- Turn off main power if safe\n"
|
|
|
|
| 260 |
elif any(k in low for k in ["gas","گیس","leak","smell gas","بو"]):
|
| 261 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 262 |
"- کوئی چنگاری/سوئچ/لائٹر استعمال نہ کریں\n"
|
| 263 |
+
"- کھڑکیاں/دروازے کھول کر ہوا دار کریں\n"
|
| 264 |
"- گیس مین والو بند کریں\n"
|
| 265 |
"- محفوظ فاصلے پر چلے جائیں\n"
|
| 266 |
+
"🕊️ پرسکون رہیں — میں رہنمائی کر رہا/رہی ہوں۔"
|
| 267 |
) if lang=="ur" else (
|
| 268 |
"✅ Do this now:\n"
|
| 269 |
"- No sparks (no switches/lighters/flash)\n"
|
|
|
|
| 277 |
["Mask/wet cloth","IDs","Phone+power bank","Water","Medicines"])
|
| 278 |
elif any(k in low for k in ["injury","زخمی","bleeding","cut","fracture","burn"]):
|
| 279 |
checklist = ("✅ ابھی یہ کریں:\n"
|
| 280 |
+
"- خون ہو تو مضبوط دباؤ دیں (صاف کپڑا)\n"
|
| 281 |
"- زخم صاف پانی سے دھوئیں\n"
|
| 282 |
"- گہرا زخم/زیادہ خون ہو تو فوری مدد لیں\n"
|
| 283 |
"- گردن/کمر چوٹ میں مریض کو نہ ہلائیں\n"
|
|
|
|
| 354 |
{"role":"assistant","content":msg}
|
| 355 |
], sim_state
|
| 356 |
|
| 357 |
+
# ✅ NEW: Prebaked Urdu templates first
|
| 358 |
+
pre_ur = match_prebaked_ur(user_msg)
|
| 359 |
+
if pre_ur:
|
| 360 |
+
final = pre_ur + "\n\n" + helplines_block("ur")
|
| 361 |
+
return chat_messages + [
|
| 362 |
+
{"role":"user","content":user_msg},
|
| 363 |
+
{"role":"assistant","content":final}
|
| 364 |
+
], sim_state
|
| 365 |
+
|
| 366 |
# Base checklist + Go-Bag
|
| 367 |
base, _ = base_checklist_and_bag(user_msg, lang)
|
| 368 |
|