Nuzwa commited on
Commit
dbcdb64
·
verified ·
1 Parent(s): b86365f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -41
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
- "خون بہہ رہا ہو تو دباؤ ڈال کر روکیں (clean cloth).",
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 door heat with back of hand; use alternate exit if hot.",
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 stall/float cars.",
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
- "Stay calm, breathe slowly — conserve energy.",
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("🕊️ Stay calm — I’m with you.")
264
  return "\n".join(lines)
265
 
266
  # ----------------------------
267
- # Helplines formatter (always added for SOFT/BLOCK)
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: There is a room fire and smoke is rising. What is your FIRST action?"
315
  if scen == "flood":
316
  return "Drill: Water is rapidly entering the house. What is your FIRST action?"
317
- return "Drill: You feel earthquake shaking. What is your FIRST action?"
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 you/your family safe?"
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 step flow
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 = "ڈرل مکمل — شاباش! آپ نے بہتر فیصلہ سازی دیکھی۔ محفوظ رہیں۔" if lang == "ur" else "Drill complete — well done. Stay safe."
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 emergency routing (no questions)
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
- # Compose with system prompt for any extra refinement (short)
397
  prompt = build_prompt(user_msg, lang)
398
- model_tail = llm_reply(prompt, max_new_tokens=80, temperature=0.5)
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 # keep concise; tail is optional if needed
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__":