StrictEnforcer / app.py
Govams's picture
Create app.py
df9c4ac verified
import streamlit as st
from deepface import DeepFace
import easyocr
from PIL import Image
import io
import pandas as pd
import sqlite3
import requests
import random # for simulate QTE
conn = sqlite3.connect('kyc_logs.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS verifications
(id INTEGER PRIMARY KEY, name TEXT, phone TEXT, address TEXT, trs REAL, status TEXT, qte_details TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)''')
conn.commit()
reader = easyocr.Reader(['en'], gpu=False)
st.set_page_config(page_title="Bright KYC AI", layout="wide")
st.title("๐Ÿ”’ Bright KYC AI โ€“ Strict Enforcer with Quantum Trust Echo ๐Ÿš€")
st.write("Ghana-Focused | No Shortcuts | Founder: Gov")
tab1, tab2 = st.tabs(["Customer Onboarding", "Admin Dashboard"])
with tab1:
st.header("Strict Verification Flow")
full_name = st.text_input("Full Name")
phone = st.text_input("Phone Number (+233...)")
gps_address = st.text_input("GhanaPost Digital Address (e.g., GA-123-4567)")
col1, col2 = st.columns(2)
with col1: id_file = st.file_uploader("Upload ID (Ghana Card/Passport/Voterโ€™s ID)", type=['jpg', 'jpeg', 'png'])
with col2: selfie_file = st.file_uploader("Upload Live Selfie", type=['jpg', 'jpeg', 'png'])
if st.button("Run Strict Verification") and all([full_name, phone, gps_address, id_file, selfie_file]):
with st.spinner("Enforcing + Quantum Trust Echo... ๐Ÿ”"):
id_bytes = id_file.read()
selfie_bytes = selfie_file.read()
id_img = Image.open(io.BytesIO(id_bytes))
selfie_img = Image.open(io.BytesIO(selfie_bytes))
col1, col2 = st.columns(2)
with col1: st.image(id_img, caption="ID")
with col2: st.image(selfie_img, caption="Selfie")
# Step 2: ID Verification (OCR) - Simple extract for name match
extracted = reader.readtext(id_bytes)
full_text = " ".join([text for _, text, _ in extracted]).lower()
if full_name.lower() not in full_text:
st.warning("Name no match ID text! Flag โš ๏ธ")
# Step 3: Address Confirmation
try:
resp = requests.get(f"https://ghanapostgps.sperixlabs.org/get-address/{gps_address}")
address_valid = resp.status_code == 200 and resp.json().get("status")
address_score = 20 if address_valid else 0
st.success("Address Valid โœ…") if address_valid else st.warning("Invalid Address โš ๏ธ")
except:
address_score = 10
st.info("Address check skipped")
# Step 4: Biometric Capture
try:
live_result = DeepFace.extract_faces(img_path=selfie_bytes, anti_spoofing=True)
is_live = live_result[0]['is_real']
live_score = live_result[0]['antispoof_score']
if not is_live:
st.error("SPOOF DETECTED โ†’ BLOCKED ๐Ÿšซ")
status = "BLOCKED"
trs = 0
else:
verify = DeepFace.verify(img1_path=id_bytes, img2_path=selfie_bytes)
confidence = (1 - verify["distance"]) * 100
except Exception as e:
confidence = 0
live_score = 0
status = "ERROR"
st.error(f"Biometric error: {e}")
# Step 5: Quantum Trust Echo (QTE) Simulation - Your Brilliant Feature!
# Temporal Consistency: Check duplicate in DB (identity exist before?)
c.execute("SELECT COUNT(*) FROM verifications WHERE name=? OR phone=?", (full_name, phone))
duplicate_count = c.fetchone()[0]
temporal_score = 30 if duplicate_count == 0 else -20 # New good, duplicate bad
# Digital Gravity: How many systems know am? (Simulate with phone check + random)
gravity_score = 25 if phone.startswith("+233") and len(phone) == 13 else -10
gravity_score += random.randint(-5, 5) # Simulate other systems
# Echo Stability: Consistency across devices/locations (Simulate with address + name)
stability_score = 20 if len(gps_address) > 5 and address_score > 0 else -15
qte_details = f"Temporal: {temporal_score} | Gravity: {gravity_score} | Stability: {stability_score}"
# Final TRS with QTE + Biometric
biometric_base = confidence * 0.5 if 'confidence' in locals() else 0
trs = biometric_base + address_score + (live_score * 100 * 0.2) + temporal_score + gravity_score + stability_score
if trs >= 70:
status = "AUTO-APPROVED โœ…"
elif trs >= 40:
status = "MANUAL REVIEW โš ๏ธ"
else:
status = "BLOCKED ๐Ÿšซ"
# Step 6: Risk Scoring (Simple, add more later)
risk_flag = duplicate_count > 0 or confidence < 50
if risk_flag:
status = "FLAGGED FOR REVIEW โš ๏ธ" if "APPROVED" in status else status
trs -= 10
st.write(f"**Trust Resonance Score (TRS): {trs:.2f}/100**")
st.write(f"QTE Breakdown: {qte_details}")
st.write(f"Final Decision: {status}")
# Save to DB
c.execute("INSERT INTO verifications (name, phone, address, trs, status, qte_details) VALUES (?, ?, ?, ?, ?, ?)",
(full_name, phone, gps_address, trs, status, qte_details))
conn.commit()
with tab2:
st.header("Admin & Compliance Dashboard")
df = pd.read_sql_query("SELECT * FROM verifications ORDER BY timestamp DESC", conn)
st.dataframe(df, use_container_width=True)
st.subheader("Manual Override")
selected_id = st.number_input("Enter Verification ID to Override", min_value=1, step=1)
new_status = st.selectbox("New Status", ["APPROVED โœ…", "MANUAL REVIEW โš ๏ธ", "BLOCKED ๐Ÿšซ"])
if st.button("Apply Override"):
if selected_id:
c.execute("UPDATE verifications SET status=? WHERE id=?", (new_status, selected_id))
conn.commit()
st.success(f"ID {selected_id} updated to {new_status}")
st.experimental_rerun() # Refresh table
else:
st.warning("Enter valid ID")
st.write(f"Total Verifications: {len(df)} | Flagged/Blocked: {len(df[df['status'].str.contains('REVIEW|BLOCKED|ERROR')])}")