Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
@@ -206,41 +206,64 @@ def analyze_single_message(text):
|
|
206 |
}
|
207 |
|
208 |
# βββ Composite Analysis & UI βββ
|
209 |
-
def analyze_composite(m1,d1,m2,d2,m3,d3
|
210 |
-
|
|
|
211 |
if none_sel:
|
212 |
-
esc_score=None
|
|
|
213 |
else:
|
214 |
-
esc_score=sum(w for (_,w),a in zip(ESCALATION_QUESTIONS,answers[:-1]) if a)
|
215 |
-
risk_level=
|
216 |
-
|
217 |
-
|
|
|
|
|
|
|
218 |
if not active:
|
219 |
return "Please enter at least one message."
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
|
|
235 |
if esc_score is None:
|
236 |
-
out+="Escalation Potential: Unknown (Checklist not completed)\n"
|
237 |
else:
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
244 |
return out, img
|
245 |
|
246 |
# βββ Gradio Interface βββ
|
|
|
206 |
}
|
207 |
|
208 |
# βββ Composite Analysis & UI βββ
|
209 |
+
def analyze_composite(m1, d1, m2, d2, m3, d3, *answers):
|
210 |
+
# determine if βNone of the aboveβ was the only checked box
|
211 |
+
none_sel = answers[-1] and not any(answers[:-1])
|
212 |
if none_sel:
|
213 |
+
esc_score = None
|
214 |
+
risk_level = "unknown"
|
215 |
else:
|
216 |
+
esc_score = sum(w for (_, w), a in zip(ESCALATION_QUESTIONS, answers[:-1]) if a)
|
217 |
+
risk_level = "High" if esc_score >= 16 else "Moderate" if esc_score >= 8 else "Low"
|
218 |
+
|
219 |
+
# collect only non-empty messages
|
220 |
+
msgs = [m1, m2, m3]
|
221 |
+
dates = [d1, d2, d3]
|
222 |
+
active = [(m, d) for m, d in zip(msgs, dates) if m.strip()]
|
223 |
if not active:
|
224 |
return "Please enter at least one message."
|
225 |
+
|
226 |
+
# analyze each message
|
227 |
+
results = [(analyze_single_message(m), d) for m, d in active]
|
228 |
+
|
229 |
+
# pull out scores and labels
|
230 |
+
abuse_scores = [res["abuse_score"] for res, _ in results]
|
231 |
+
top_labels = [res["top_patterns"][0][0] if res["top_patterns"] else "None" for res, _ in results]
|
232 |
+
dates_used = [d or "Undated" for _, d in results]
|
233 |
+
stages = [res["stage"] for res, _ in results]
|
234 |
+
|
235 |
+
# overall risk stage & composite abuse
|
236 |
+
most_common_stage = max(set(stages), key=stages.count)
|
237 |
+
composite_abuse = int(round(sum(abuse_scores) / len(abuse_scores)))
|
238 |
+
|
239 |
+
# build the basic output text
|
240 |
+
out = f"Abuse Intensity: {composite_abuse}%\n"
|
241 |
if esc_score is None:
|
242 |
+
out += "Escalation Potential: Unknown (Checklist not completed)\n"
|
243 |
else:
|
244 |
+
total_possible = sum(w for _, w in ESCALATION_QUESTIONS)
|
245 |
+
out += f"Escalation Potential: {risk_level} ({esc_score}/{total_possible})\n"
|
246 |
+
|
247 |
+
# if zero abuse, skip risk snippet & DARVO
|
248 |
+
img = generate_abuse_score_chart(dates_used, abuse_scores, top_labels)
|
249 |
+
if composite_abuse == 0:
|
250 |
+
return out, img
|
251 |
+
|
252 |
+
# compute DARVO summary
|
253 |
+
darvos = [res["darvo_score"] for res, _ in results]
|
254 |
+
avg_darvo = round(sum(darvos) / len(darvos), 3)
|
255 |
+
darvo_blurb = (
|
256 |
+
f"\nπ DARVO Score: {avg_darvo} ({'high' if avg_darvo >= 0.65 else 'moderate'})"
|
257 |
+
if avg_darvo > 0.25 else ""
|
258 |
+
)
|
259 |
+
|
260 |
+
# risk snippet (uses your generate_risk_snippet helper)
|
261 |
+
first_pattern = top_labels[0]
|
262 |
+
first_score = int(results[0][0]["top_patterns"][0][1] * 100) if results[0][0]["top_patterns"] else 0
|
263 |
+
pattern_score = f"{first_pattern} β {first_score}%"
|
264 |
+
out += generate_risk_snippet(composite_abuse, pattern_score, esc_score or 0, most_common_stage)
|
265 |
+
out += darvo_blurb
|
266 |
+
|
267 |
return out, img
|
268 |
|
269 |
# βββ Gradio Interface βββ
|