Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -140,7 +140,6 @@ def module_response(user_msg: str, lang: str) -> str:
|
|
| 140 |
calm_en = "Don't worry — take a deep breath; I'm with you."
|
| 141 |
|
| 142 |
if lang == "ur":
|
| 143 |
-
# Fire
|
| 144 |
if has_kw(user_msg, "fire"):
|
| 145 |
bullets += [
|
| 146 |
"فوراً جھک جائیں، دھواں اوپر جاتا ہے۔",
|
|
@@ -150,7 +149,6 @@ def module_response(user_msg: str, lang: str) -> str:
|
|
| 150 |
"سیڑھیاں استعمال کریں؛ لفٹ ہرگز نہیں۔",
|
| 151 |
"بچوں/بزرگوں کو ساتھ رکھیں، حساب رکھیں۔",
|
| 152 |
]
|
| 153 |
-
# Gas Leak
|
| 154 |
elif has_kw(user_msg, "gas"):
|
| 155 |
bullets += [
|
| 156 |
"کسی بھی قسم کی چنگاری نہ بنائیں (سوئچ/لائٹر/فون فلیش نہیں).",
|
|
@@ -158,7 +156,6 @@ def module_response(user_msg: str, lang: str) -> str:
|
|
| 158 |
"گیس مین والو بند کریں۔",
|
| 159 |
"عمارت خالی کریں، محفوظ فاصلے پر جائیں۔",
|
| 160 |
]
|
| 161 |
-
# Earthquake
|
| 162 |
elif has_kw(user_msg, "earthquake"):
|
| 163 |
bullets += [
|
| 164 |
"جھکیں، ڈھکیں، اور پکڑیں (Drop, Cover, Hold).",
|
|
@@ -166,7 +163,6 @@ def module_response(user_msg: str, lang: str) -> str:
|
|
| 166 |
"زلزلہ رکتے ہی عمارت کا محفوظ راستہ دیکھ کر باہر جائیں۔",
|
| 167 |
"سیڑھیاں استعمال کریں؛ لفٹ نہیں۔",
|
| 168 |
]
|
| 169 |
-
# Flood / Storm
|
| 170 |
elif has_kw(user_msg, "flood") or has_kw(user_msg, "storm"):
|
| 171 |
bullets += [
|
| 172 |
"بجلی مین سوئچ بند کریں (اگر محفوظ ہو تو).",
|
|
@@ -174,35 +170,32 @@ def module_response(user_msg: str, lang: str) -> str:
|
|
| 174 |
"گاڑی کو پانی سے نہ گزاریں؛ 12 انچ پانی بھی خطرناک ہے۔",
|
| 175 |
"گو-بیگ، شناختی دستاویزات، دوائیں ساتھ رکھیں۔",
|
| 176 |
]
|
| 177 |
-
# Injury / bleeding
|
| 178 |
elif has_kw(user_msg, "injury"):
|
| 179 |
bullets += [
|
| 180 |
-
"خون بہہ رہا ہو تو دباؤ ڈال کر روکیں (
|
| 181 |
"زخم کو صاف پانی سے دھوئیں؛ گہرا ہو تو فوری مدد لیں۔",
|
| 182 |
"سر/گردن/کمر چوٹ میں مریض کو نہ ہلائیں (spinal risk).",
|
| 183 |
]
|
| 184 |
-
# Explosion / conflict
|
| 185 |
elif has_kw(user_msg, "explosion") or has_kw(user_msg, "conflict"):
|
| 186 |
bullets += [
|
| 187 |
"زمین پر لیٹ جائیں، کور لیں، کھڑکیوں سے دور رہیں۔",
|
| 188 |
"فائرنگ کی سمت کے مخالف کور ڈھونڈیں (دیوار/پکی رکاوٹ).",
|
| 189 |
"فوراً محفوظ راستہ دیکھ کر نکلیں — رش اور شور سے بچیں۔",
|
| 190 |
]
|
| 191 |
-
# Trapped / child crying
|
| 192 |
elif has_kw(user_msg, "trapped") or has_kw(user_msg, "child"):
|
| 193 |
bullets += [
|
| 194 |
-
"
|
| 195 |
-
"
|
| 196 |
-
"
|
| 197 |
]
|
| 198 |
else:
|
| 199 |
bullets += [
|
| 200 |
-
"فوراً
|
| 201 |
"محفوظ جگہ/کور لیں، بچوں/بزرگوں کو ساتھ رکھیں۔",
|
| 202 |
"ایگزٹ راستہ ذہن میں رکھیں، لفٹ سے پرہیز کریں۔",
|
| 203 |
]
|
| 204 |
lines = ["✅ یہاں آپ کیا کریں:"] + [f"- {b}" for b in bullets]
|
| 205 |
-
lines.append(
|
| 206 |
return "\n".join(lines)
|
| 207 |
else:
|
| 208 |
if has_kw(user_msg, "fire"):
|
|
@@ -210,7 +203,7 @@ def module_response(user_msg: str, lang: str) -> str:
|
|
| 210 |
"Stay low — smoke rises.",
|
| 211 |
"Cover nose/mouth with a wet cloth.",
|
| 212 |
"Turn off electricity/gas if safe.",
|
| 213 |
-
"Check
|
| 214 |
"Use stairs, never elevators.",
|
| 215 |
"Keep children/elderly with you; headcount.",
|
| 216 |
]
|
|
@@ -225,14 +218,14 @@ def module_response(user_msg: str, lang: str) -> str:
|
|
| 225 |
bullets += [
|
| 226 |
"Drop, Cover, and Hold On.",
|
| 227 |
"Stay away from windows/heavy furniture.",
|
| 228 |
-
"After shaking stops, exit via safe route.",
|
| 229 |
"Use stairs; avoid elevators.",
|
| 230 |
]
|
| 231 |
elif has_kw(user_msg, "flood") or has_kw(user_msg, "storm"):
|
| 232 |
bullets += [
|
| 233 |
"Turn off main power (if safe).",
|
| 234 |
"Move to higher ground.",
|
| 235 |
-
"Do not drive through water; 12 inches can
|
| 236 |
"Grab go-bag, IDs, medicines.",
|
| 237 |
]
|
| 238 |
elif has_kw(user_msg, "injury"):
|
|
@@ -249,7 +242,7 @@ def module_response(user_msg: str, lang: str) -> str:
|
|
| 249 |
]
|
| 250 |
elif has_kw(user_msg, "trapped") or has_kw(user_msg, "child"):
|
| 251 |
bullets += [
|
| 252 |
-
"
|
| 253 |
"Signal only when rescuers are near.",
|
| 254 |
"Stay low if smoke; move toward fresh air/light.",
|
| 255 |
]
|
|
@@ -260,11 +253,11 @@ def module_response(user_msg: str, lang: str) -> str:
|
|
| 260 |
"Know exits; avoid elevators.",
|
| 261 |
]
|
| 262 |
lines = ["✅ Do this now:"] + [f"- {b}" for b in bullets]
|
| 263 |
-
lines.append(
|
| 264 |
return "\n".join(lines)
|
| 265 |
|
| 266 |
# ----------------------------
|
| 267 |
-
# Helplines formatter
|
| 268 |
# ----------------------------
|
| 269 |
def helplines_block(lang: str) -> str:
|
| 270 |
if not GUARD.helplines:
|
|
@@ -284,7 +277,6 @@ def helplines_block(lang: str) -> str:
|
|
| 284 |
SIM_TRIGGER = re.compile(r"(practice with me|drill mode|drill|پریکٹس|ڈرل)", re.I)
|
| 285 |
|
| 286 |
def start_sim_scenario(user_msg: str) -> Dict:
|
| 287 |
-
# pick scenario by keyword; default to earthquake
|
| 288 |
if has_kw(user_msg, "fire"):
|
| 289 |
scen = "fire"
|
| 290 |
elif has_kw(user_msg, "flood"):
|
|
@@ -300,31 +292,31 @@ def sim_prompt(state: Dict, lang: str) -> str:
|
|
| 300 |
if lang == "ur":
|
| 301 |
if state["step"] == 1:
|
| 302 |
if scen == "fire":
|
| 303 |
-
return "
|
| 304 |
if scen == "flood":
|
| 305 |
-
return "
|
| 306 |
-
return "
|
| 307 |
elif state["step"] == 2:
|
| 308 |
-
return "اچھا—اب دوسرا قدم کیا ہوگا؟ (
|
| 309 |
else:
|
| 310 |
-
return "آخری قدم کیا
|
| 311 |
else:
|
| 312 |
if state["step"] == 1:
|
| 313 |
if scen == "fire":
|
| 314 |
-
return "Drill:
|
| 315 |
if scen == "flood":
|
| 316 |
return "Drill: Water is rapidly entering the house. What is your FIRST action?"
|
| 317 |
-
return "Drill:
|
| 318 |
elif state["step"] == 2:
|
| 319 |
return "Good — what is your SECOND step? (one short line)"
|
| 320 |
else:
|
| 321 |
-
return "What is the FINAL step to keep
|
| 322 |
|
| 323 |
def sim_feedback(state: Dict, user_msg: str, lang: str) -> str:
|
| 324 |
scen = state.get("scenario", "earthquake")
|
| 325 |
tips_ur = {
|
| 326 |
-
"fire": ["جھک جائیں، دھوئیں سے نیچے رہیں", "گیلا کپڑا ناک/منہ پر", "لفٹ
|
| 327 |
-
"flood": ["بجلی مین سوئچ بند", "اونچی جگہ/چھت پر جانا", "
|
| 328 |
"earthquake": ["Drop, Cover, Hold", "کھڑکیوں/بھاری اشیاء سے دور", "جھٹکے رکنے پر سیڑھیوں سے باہر", "لفٹ نہیں"],
|
| 329 |
}
|
| 330 |
tips_en = {
|
|
@@ -333,7 +325,6 @@ def sim_feedback(state: Dict, user_msg: str, lang: str) -> str:
|
|
| 333 |
"earthquake": ["Drop, Cover, Hold", "Stay away from windows/heavy objects", "Exit via stairs after shaking", "No elevators"],
|
| 334 |
}
|
| 335 |
good = tips_ur if lang == "ur" else tips_en
|
| 336 |
-
# very light scoring by keyword overlap
|
| 337 |
score = 0
|
| 338 |
low = user_msg.lower()
|
| 339 |
for hint in good[scen]:
|
|
@@ -342,7 +333,7 @@ def sim_feedback(state: Dict, user_msg: str, lang: str) -> str:
|
|
| 342 |
score += 1
|
| 343 |
break
|
| 344 |
if lang == "ur":
|
| 345 |
-
fb = "درست سمت میں ہیں۔ " if score >= 1 else "
|
| 346 |
checklist = "\n- " + "\n- ".join(good[scen])
|
| 347 |
return fb + "محفوظ قدم یہ ہیں:" + checklist
|
| 348 |
else:
|
|
@@ -369,20 +360,19 @@ def chat_fn(user_msg: str, chat_history: List[Tuple[str, str]], sim_state: Dict)
|
|
| 369 |
reply = sim_prompt(sim_state, lang)
|
| 370 |
return chat_history + [(user_msg, reply)], sim_state
|
| 371 |
|
| 372 |
-
# Simulation
|
| 373 |
if sim_state.get("active"):
|
| 374 |
-
# give feedback and advance
|
| 375 |
feedback = sim_feedback(sim_state, user_msg, lang)
|
| 376 |
sim_state["step"] += 1
|
| 377 |
if sim_state["step"] > 3:
|
| 378 |
sim_state = {"active": False, "step": 0, "scenario": None}
|
| 379 |
-
end_line = "ڈرل مکمل — شاباش!
|
| 380 |
return chat_history + [(user_msg, feedback + "\n\n" + end_line)], sim_state
|
| 381 |
else:
|
| 382 |
prompt_q = sim_prompt(sim_state, lang)
|
| 383 |
return chat_history + [(user_msg, feedback + "\n\n" + prompt_q)], sim_state
|
| 384 |
|
| 385 |
-
# Normal
|
| 386 |
if status == "BLOCK":
|
| 387 |
msg = GUARD.refusal_msg_ur if lang == "ur" else GUARD.refusal_msg_en
|
| 388 |
helpb = helplines_block(lang)
|
|
@@ -390,14 +380,12 @@ def chat_fn(user_msg: str, chat_history: List[Tuple[str, str]], sim_state: Dict)
|
|
| 390 |
msg += "\n\n" + helpb
|
| 391 |
return chat_history + [(user_msg, msg)], sim_state
|
| 392 |
|
| 393 |
-
# Immediate checklist from modules
|
| 394 |
checklist = module_response(user_msg, lang)
|
| 395 |
|
| 396 |
-
#
|
| 397 |
prompt = build_prompt(user_msg, lang)
|
| 398 |
-
|
| 399 |
|
| 400 |
-
# Soft case: prepend a gentle note + add helplines
|
| 401 |
if status == "SOFT":
|
| 402 |
note = "احتیاط: یہ حساس موضوع ہے۔\n\n" if lang == "ur" else "Note: This is a sensitive topic.\n\n"
|
| 403 |
checklist = note + checklist
|
|
@@ -405,7 +393,7 @@ def chat_fn(user_msg: str, chat_history: List[Tuple[str, str]], sim_state: Dict)
|
|
| 405 |
if helpb:
|
| 406 |
checklist += "\n\n" + helpb
|
| 407 |
|
| 408 |
-
final = checklist
|
| 409 |
return chat_history + [(user_msg, final)], sim_state
|
| 410 |
|
| 411 |
# ----------------------------
|
|
@@ -418,6 +406,7 @@ with gr.Blocks(title="SafePak – 1122 Guide") as demo:
|
|
| 418 |
|
| 419 |
chat = gr.Chatbot(height=480)
|
| 420 |
msg = gr.Textbox(label="Message / پیغام", placeholder="Type here… / یہاں لکھیں…", lines=2)
|
|
|
|
| 421 |
clear = gr.Button("Clear")
|
| 422 |
|
| 423 |
def on_submit(u, h, s):
|
|
@@ -425,6 +414,7 @@ with gr.Blocks(title="SafePak – 1122 Guide") as demo:
|
|
| 425 |
return new_h, "", new_s
|
| 426 |
|
| 427 |
msg.submit(on_submit, [msg, chat, state], [chat, msg, state])
|
|
|
|
| 428 |
clear.click(lambda: ([], {"active": False, "step": 0, "scenario": None}), [], [chat, state])
|
| 429 |
|
| 430 |
if __name__ == "__main__":
|
|
|
|
| 140 |
calm_en = "Don't worry — take a deep breath; I'm with you."
|
| 141 |
|
| 142 |
if lang == "ur":
|
|
|
|
| 143 |
if has_kw(user_msg, "fire"):
|
| 144 |
bullets += [
|
| 145 |
"فوراً جھک جائیں، دھواں اوپر جاتا ہے۔",
|
|
|
|
| 149 |
"سیڑھیاں استعمال کریں؛ لفٹ ہرگز نہیں۔",
|
| 150 |
"بچوں/بزرگوں کو ساتھ رکھیں، حساب رکھیں۔",
|
| 151 |
]
|
|
|
|
| 152 |
elif has_kw(user_msg, "gas"):
|
| 153 |
bullets += [
|
| 154 |
"کسی بھی قسم کی چنگاری نہ بنائیں (سوئچ/لائٹر/فون فلیش نہیں).",
|
|
|
|
| 156 |
"گیس مین والو بند کریں۔",
|
| 157 |
"عمارت خالی کریں، محفوظ فاصلے پر جائیں۔",
|
| 158 |
]
|
|
|
|
| 159 |
elif has_kw(user_msg, "earthquake"):
|
| 160 |
bullets += [
|
| 161 |
"جھکیں، ڈھکیں، اور پکڑیں (Drop, Cover, Hold).",
|
|
|
|
| 163 |
"زلزلہ رکتے ہی عمارت کا محفوظ راستہ دیکھ کر باہر جائیں۔",
|
| 164 |
"سیڑھیاں استعمال کریں؛ لفٹ نہیں۔",
|
| 165 |
]
|
|
|
|
| 166 |
elif has_kw(user_msg, "flood") or has_kw(user_msg, "storm"):
|
| 167 |
bullets += [
|
| 168 |
"بجلی مین سوئچ بند کریں (اگر محفوظ ہو تو).",
|
|
|
|
| 170 |
"گاڑی کو پانی سے نہ گزاریں؛ 12 انچ پانی بھی خطرناک ہے۔",
|
| 171 |
"گو-بیگ، شناختی دستاویزات، دوائیں ساتھ رکھیں۔",
|
| 172 |
]
|
|
|
|
| 173 |
elif has_kw(user_msg, "injury"):
|
| 174 |
bullets += [
|
| 175 |
+
"خون بہہ رہا ہو تو دباؤ ڈال کر روکیں (صاف کپڑا).",
|
| 176 |
"زخم کو صاف پانی سے دھوئیں؛ گہرا ہو تو فوری مدد لیں۔",
|
| 177 |
"سر/گردن/کمر چوٹ میں مریض کو نہ ہلائیں (spinal risk).",
|
| 178 |
]
|
|
|
|
| 179 |
elif has_kw(user_msg, "explosion") or has_kw(user_msg, "conflict"):
|
| 180 |
bullets += [
|
| 181 |
"زمین پر لیٹ جائیں، کور لیں، کھڑکیوں سے دور رہیں۔",
|
| 182 |
"فائرنگ کی سمت کے مخالف کور ڈھونڈیں (دیوار/پکی رکاوٹ).",
|
| 183 |
"فوراً محفوظ راستہ دیکھ کر نکلیں — رش اور شور سے بچیں۔",
|
| 184 |
]
|
|
|
|
| 185 |
elif has_kw(user_msg, "trapped") or has_kw(user_msg, "child"):
|
| 186 |
bullets += [
|
| 187 |
+
"آہستہ سانس، توانائی بچائیں۔",
|
| 188 |
+
"صرف جب مدد قریب لگے تب آواز دیں/اشارہ کریں۔",
|
| 189 |
+
"دھواں ہو تو نیچے رہیں؛ تازہ ہوا/روشنی کی سمت بڑھیں۔",
|
| 190 |
]
|
| 191 |
else:
|
| 192 |
bullets += [
|
| 193 |
+
"فوراً اردگرد کے خطرات پہچانیں (بجلی، گیس، دھواں، پانی).",
|
| 194 |
"محفوظ جگہ/کور لیں، بچوں/بزرگوں کو ساتھ رکھیں۔",
|
| 195 |
"ایگزٹ راستہ ذہن میں رکھیں، لفٹ سے پرہیز کریں۔",
|
| 196 |
]
|
| 197 |
lines = ["✅ یہاں آپ کیا کریں:"] + [f"- {b}" for b in bullets]
|
| 198 |
+
lines.append(calm_ur)
|
| 199 |
return "\n".join(lines)
|
| 200 |
else:
|
| 201 |
if has_kw(user_msg, "fire"):
|
|
|
|
| 203 |
"Stay low — smoke rises.",
|
| 204 |
"Cover nose/mouth with a wet cloth.",
|
| 205 |
"Turn off electricity/gas if safe.",
|
| 206 |
+
"Check doors for heat; use alternate exit if hot.",
|
| 207 |
"Use stairs, never elevators.",
|
| 208 |
"Keep children/elderly with you; headcount.",
|
| 209 |
]
|
|
|
|
| 218 |
bullets += [
|
| 219 |
"Drop, Cover, and Hold On.",
|
| 220 |
"Stay away from windows/heavy furniture.",
|
| 221 |
+
"After shaking stops, exit via a safe route.",
|
| 222 |
"Use stairs; avoid elevators.",
|
| 223 |
]
|
| 224 |
elif has_kw(user_msg, "flood") or has_kw(user_msg, "storm"):
|
| 225 |
bullets += [
|
| 226 |
"Turn off main power (if safe).",
|
| 227 |
"Move to higher ground.",
|
| 228 |
+
"Do not drive through water; ~12 inches can float cars.",
|
| 229 |
"Grab go-bag, IDs, medicines.",
|
| 230 |
]
|
| 231 |
elif has_kw(user_msg, "injury"):
|
|
|
|
| 242 |
]
|
| 243 |
elif has_kw(user_msg, "trapped") or has_kw(user_msg, "child"):
|
| 244 |
bullets += [
|
| 245 |
+
"Breathe slowly — conserve energy.",
|
| 246 |
"Signal only when rescuers are near.",
|
| 247 |
"Stay low if smoke; move toward fresh air/light.",
|
| 248 |
]
|
|
|
|
| 253 |
"Know exits; avoid elevators.",
|
| 254 |
]
|
| 255 |
lines = ["✅ Do this now:"] + [f"- {b}" for b in bullets]
|
| 256 |
+
lines.append(calm_en)
|
| 257 |
return "\n".join(lines)
|
| 258 |
|
| 259 |
# ----------------------------
|
| 260 |
+
# Helplines formatter
|
| 261 |
# ----------------------------
|
| 262 |
def helplines_block(lang: str) -> str:
|
| 263 |
if not GUARD.helplines:
|
|
|
|
| 277 |
SIM_TRIGGER = re.compile(r"(practice with me|drill mode|drill|پریکٹس|ڈرل)", re.I)
|
| 278 |
|
| 279 |
def start_sim_scenario(user_msg: str) -> Dict:
|
|
|
|
| 280 |
if has_kw(user_msg, "fire"):
|
| 281 |
scen = "fire"
|
| 282 |
elif has_kw(user_msg, "flood"):
|
|
|
|
| 292 |
if lang == "ur":
|
| 293 |
if state["step"] == 1:
|
| 294 |
if scen == "fire":
|
| 295 |
+
return "ڈرل: کمرے میں آگ لگی ہے اور دھواں بڑھ رہا ہے۔ سب سے پہلا قدم کیا ہوگا؟"
|
| 296 |
if scen == "flood":
|
| 297 |
+
return "ڈرل: پانی تیزی سے گھر میں داخل ہو رہا ہے۔ سب سے پہلا قدم کیا ہوگا؟"
|
| 298 |
+
return "ڈرل: زلزلے کے جھٹکے محسوس ہو رہے ہیں۔ سب سے پہلا قدم کیا ہوگا؟"
|
| 299 |
elif state["step"] == 2:
|
| 300 |
+
return "اچھا—اب دوسرا قدم کیا ہوگا؟ (ایک لائن میں)"
|
| 301 |
else:
|
| 302 |
+
return "آخری حفاظتی قدم کیا ہوگا؟"
|
| 303 |
else:
|
| 304 |
if state["step"] == 1:
|
| 305 |
if scen == "fire":
|
| 306 |
+
return "Drill: Room fire with rising smoke. What is your FIRST action?"
|
| 307 |
if scen == "flood":
|
| 308 |
return "Drill: Water is rapidly entering the house. What is your FIRST action?"
|
| 309 |
+
return "Drill: Earthquake shaking. What is your FIRST action?"
|
| 310 |
elif state["step"] == 2:
|
| 311 |
return "Good — what is your SECOND step? (one short line)"
|
| 312 |
else:
|
| 313 |
+
return "What is the FINAL step to keep everyone safe?"
|
| 314 |
|
| 315 |
def sim_feedback(state: Dict, user_msg: str, lang: str) -> str:
|
| 316 |
scen = state.get("scenario", "earthquake")
|
| 317 |
tips_ur = {
|
| 318 |
+
"fire": ["جھک جائیں، دھوئیں سے نیچے رہیں", "گیلا کپڑا ناک/منہ پر", "لفٹ نہیں — سیڑھیاں", "گرم دروازہ مت کھولیں"],
|
| 319 |
+
"flood": ["بجلی مین سوئچ بند", "اونچی جگہ/چھت پر جانا", "پانی میں گاڑی نہ چلائیں", "گو-بیگ/شناختی دستاویزات ساتھ"],
|
| 320 |
"earthquake": ["Drop, Cover, Hold", "کھڑکیوں/بھاری اشیاء سے دور", "جھٹکے رکنے پر سیڑھیوں سے باہر", "لفٹ نہیں"],
|
| 321 |
}
|
| 322 |
tips_en = {
|
|
|
|
| 325 |
"earthquake": ["Drop, Cover, Hold", "Stay away from windows/heavy objects", "Exit via stairs after shaking", "No elevators"],
|
| 326 |
}
|
| 327 |
good = tips_ur if lang == "ur" else tips_en
|
|
|
|
| 328 |
score = 0
|
| 329 |
low = user_msg.lower()
|
| 330 |
for hint in good[scen]:
|
|
|
|
| 333 |
score += 1
|
| 334 |
break
|
| 335 |
if lang == "ur":
|
| 336 |
+
fb = "درست سمت میں ہیں۔ " if score >= 1 else "بہتری کی ضرورت: "
|
| 337 |
checklist = "\n- " + "\n- ".join(good[scen])
|
| 338 |
return fb + "محفوظ قدم یہ ہیں:" + checklist
|
| 339 |
else:
|
|
|
|
| 360 |
reply = sim_prompt(sim_state, lang)
|
| 361 |
return chat_history + [(user_msg, reply)], sim_state
|
| 362 |
|
| 363 |
+
# Simulation flow
|
| 364 |
if sim_state.get("active"):
|
|
|
|
| 365 |
feedback = sim_feedback(sim_state, user_msg, lang)
|
| 366 |
sim_state["step"] += 1
|
| 367 |
if sim_state["step"] > 3:
|
| 368 |
sim_state = {"active": False, "step": 0, "scenario": None}
|
| 369 |
+
end_line = "ڈرل مکمل — شاباش! محفوظ رہیں۔" if lang == "ur" else "Drill complete — well done. Stay safe."
|
| 370 |
return chat_history + [(user_msg, feedback + "\n\n" + end_line)], sim_state
|
| 371 |
else:
|
| 372 |
prompt_q = sim_prompt(sim_state, lang)
|
| 373 |
return chat_history + [(user_msg, feedback + "\n\n" + prompt_q)], sim_state
|
| 374 |
|
| 375 |
+
# Normal routing (no clarifying questions)
|
| 376 |
if status == "BLOCK":
|
| 377 |
msg = GUARD.refusal_msg_ur if lang == "ur" else GUARD.refusal_msg_en
|
| 378 |
helpb = helplines_block(lang)
|
|
|
|
| 380 |
msg += "\n\n" + helpb
|
| 381 |
return chat_history + [(user_msg, msg)], sim_state
|
| 382 |
|
|
|
|
| 383 |
checklist = module_response(user_msg, lang)
|
| 384 |
|
| 385 |
+
# Optional short LLM tail (kept small for CPU)
|
| 386 |
prompt = build_prompt(user_msg, lang)
|
| 387 |
+
_ = llm_reply(prompt, max_new_tokens=80, temperature=0.5) # computed but not appended to keep replies concise
|
| 388 |
|
|
|
|
| 389 |
if status == "SOFT":
|
| 390 |
note = "احتیاط: یہ حساس موضوع ہے۔\n\n" if lang == "ur" else "Note: This is a sensitive topic.\n\n"
|
| 391 |
checklist = note + checklist
|
|
|
|
| 393 |
if helpb:
|
| 394 |
checklist += "\n\n" + helpb
|
| 395 |
|
| 396 |
+
final = checklist
|
| 397 |
return chat_history + [(user_msg, final)], sim_state
|
| 398 |
|
| 399 |
# ----------------------------
|
|
|
|
| 406 |
|
| 407 |
chat = gr.Chatbot(height=480)
|
| 408 |
msg = gr.Textbox(label="Message / پیغام", placeholder="Type here… / یہاں لکھیں…", lines=2)
|
| 409 |
+
send = gr.Button("Send / بھیجیں")
|
| 410 |
clear = gr.Button("Clear")
|
| 411 |
|
| 412 |
def on_submit(u, h, s):
|
|
|
|
| 414 |
return new_h, "", new_s
|
| 415 |
|
| 416 |
msg.submit(on_submit, [msg, chat, state], [chat, msg, state])
|
| 417 |
+
send.click(on_submit, [msg, chat, state], [chat, msg, state])
|
| 418 |
clear.click(lambda: ([], {"active": False, "step": 0, "scenario": None}), [], [chat, state])
|
| 419 |
|
| 420 |
if __name__ == "__main__":
|