Logo Lanfrica

ondinookello96/app.py

Domain:

socioeconomic

Record type:

software
Creator:
ond
Host:
A microfinance loan for detecting bias in Kenya and Uganda import streamlit as st import re import json # --- PAGE CONFIG --- st.set_page_config(page_title="Ujima Agent Pride", page_icon="🦁", layout="wide") st.title("🦁 Ujima Agent Pride: Live Orchestration Prototype") st.markdown("Simulate the synchronized ambush of the Scout, Guardian, and Hunter agents.") # --- TOOLS & GUARD RAILS --- class DignityFilter: BANNED_WORDS = ["unreliable", "risky", "poor", "bad credit", "irresponsible"] @classmethod def check(cls, message): for word in cls.BANNED_WORDS: if re.search(rf'\b{word}\b', message, re.IGNORECASE): return False return True # --- UI INPUTS --- st.sidebar.header("📝 Loan Application Data") name = st.sidebar.text_input("Applicant Name", "Grace") age = st.sidebar.slider("Age", 18, 80, 42) amount = st.sidebar.slider("Loan Amount (KES)", 1000, 100000, 28000, 1000) children_under_5 = st.sidebar.slider("Children Under 5", 0, 5, 1) occupation = st.sidebar.selectbox("Occupation", ["Maize Farmer", "Market Vendor", "Formal Employee", "Shea Butter Trader"]) sms_message = st.sidebar.text_area("Member SMS/Status", "I have no money for school fees next month.") # --- AGENT LOGIC --- if st.sidebar.button("🚀 Run Agent Pride Simulation", type="primary"): col1, col2, col3 = st.columns(3) # 1. SCOUT AGENT with col1: st.subheader("🦁 Scout Agent") stress_keywords = ["school fees", "loan shark", "shylock", "no money", "desperate"] is_stressed = any(kw in sms_message.lower() for kw in stress_keywords) if is_stressed: st.warning("⚠️ Stress Signal Detected!") st.info("Action: HUNT Trigger -> Pass to Guardian") else: st.success("No distress. Continuing literacy loop.") # 2. GUARDIAN AGENT with col2: st.subheader("🛡️ Guardian Agent") risk_flags = [] if occupation in ["Market Vendor", "Shea Butter Trader"]: risk_flags.append("informal_sector") # Historical bias flag # PRIDE LOOP PAUSE POINT if amount > 15000 or children_under_5 >= 2: st.error(f"🛑 PRIDE PAUSE POINT TRIGGERED") st.write(f"Reason: Amount > 15k OR Vulnerable Profile.") decision …