scam / scripts /test_full_conversation.py
Gankit12's picture
Upload 129 files
31f0e50 verified
Raw
History Blame Contribute Delete
10.7 kB
"""
Full Conversation Flow Test for ScamShield AI
This script simulates a complete multi-turn conversation between
a scammer and the honeypot agent to test the full flow.
Run: python scripts/test_full_conversation.py
"""
import sys
import io
import requests
import json
import time
from typing import Optional
# Fix Windows encoding
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
# API Configuration
BASE_URL = "http://127.0.0.1:8080"
API_URL = f"{BASE_URL}/api/v1/honeypot/engage"
# Simulated scammer messages (multi-turn conversation)
SCAMMER_MESSAGES = [
# Turn 1: Initial scam message
"Congratulations! You have won 10 lakh rupees in our lucky draw! Reply to claim your prize!",
# Turn 2: Scammer responds to agent's interest
"Yes sir, you are the lucky winner! Just pay Rs 500 processing fee and the money will be transferred to your account immediately!",
# Turn 3: Scammer provides payment details
"Please pay to my UPI ID: scammer@paytm. You can also use fraudster@ybl as alternative.",
# Turn 4: Scammer provides more details
"If you want to pay via bank transfer, use account number 1234567890123, IFSC code SBIN0001234. Call me at +919876543210 for help.",
# Turn 5: Scammer tries to create urgency
"Hurry up sir! This offer expires in 1 hour. Pay now or you will lose your 10 lakh prize money!",
# Turn 6: Scammer provides phishing link
"You can also verify your prize at http://fake-lottery-winner.tk/claim?user=12345. Just enter your details there.",
]
def print_header():
"""Print test header"""
print("=" * 80)
print("🔒 ScamShield AI - Full Conversation Flow Test")
print("=" * 80)
print()
def print_message(turn: int, sender: str, message: str, is_scammer: bool = True):
"""Pretty print a message"""
emoji = "🦹" if is_scammer else "🤖"
color_name = "SCAMMER" if is_scammer else "AGENT"
print(f"\n{'─' * 60}")
print(f"Turn {turn} | {emoji} {color_name}:")
print(f"{'─' * 60}")
print(f"{message}")
def print_intelligence(intel: dict):
"""Print extracted intelligence"""
print(f"\n{'═' * 60}")
print("📊 EXTRACTED INTELLIGENCE:")
print(f"{'═' * 60}")
if intel.get("upi_ids"):
print(f" 💳 UPI IDs: {', '.join(intel['upi_ids'])}")
if intel.get("bank_accounts"):
print(f" 🏦 Bank Accounts: {', '.join(intel['bank_accounts'])}")
if intel.get("ifsc_codes"):
print(f" 🔢 IFSC Codes: {', '.join(intel['ifsc_codes'])}")
if intel.get("phone_numbers"):
print(f" 📱 Phone Numbers: {', '.join(intel['phone_numbers'])}")
if intel.get("phishing_links"):
print(f" 🔗 Phishing Links: {', '.join(intel['phishing_links'])}")
conf = intel.get("extraction_confidence", 0)
print(f" 📈 Extraction Confidence: {conf:.0%}")
def test_health():
"""Test API health before starting"""
try:
response = requests.get(f"{BASE_URL}/api/v1/health", timeout=5)
data = response.json()
print(f"✅ API Status: {data['status']}")
print(f" Models Loaded: {data['dependencies']['models_loaded']}")
return True
except Exception as e:
print(f"❌ API not available: {e}")
print(f" Make sure the server is running: uvicorn app.main:app --port 8080")
return False
def run_conversation():
"""Run full multi-turn conversation test"""
print_header()
# Check API health
print("🔍 Checking API health...")
if not test_health():
return
print("\n" + "=" * 80)
print("🎭 STARTING SIMULATED SCAM CONVERSATION")
print("=" * 80)
session_id: Optional[str] = None
all_intelligence = {
"upi_ids": set(),
"bank_accounts": set(),
"ifsc_codes": set(),
"phone_numbers": set(),
"phishing_links": set(),
}
for turn_num, scammer_message in enumerate(SCAMMER_MESSAGES, 1):
# Print scammer message
print_message(turn_num, "SCAMMER", scammer_message, is_scammer=True)
# Send to API
payload = {
"message": scammer_message,
"language": "auto",
}
if session_id:
payload["session_id"] = session_id
try:
response = requests.post(
API_URL,
json=payload,
headers={"Content-Type": "application/json"},
timeout=60,
)
data = response.json()
# Get session ID for continuation
if not session_id:
session_id = data.get("session_id")
print(f"\n📋 Session ID: {session_id}")
# Print detection result
scam_detected = data.get("scam_detected", False)
confidence = data.get("confidence", 0)
print(f"\n🎯 Scam Detected: {'YES ✓' if scam_detected else 'NO'} (Confidence: {confidence:.0%})")
# Print agent response
if data.get("engagement"):
agent_response = data["engagement"].get("agent_response", "")
strategy = data["engagement"].get("strategy", "")
persona = data["engagement"].get("persona", "")
current_turn = data["engagement"].get("turn_count", turn_num)
print_message(current_turn, "AGENT", agent_response, is_scammer=False)
print(f"\n 📝 Strategy: {strategy} | Persona: {persona}")
# Accumulate intelligence
if data.get("extracted_intelligence"):
intel = data["extracted_intelligence"]
all_intelligence["upi_ids"].update(intel.get("upi_ids", []))
all_intelligence["bank_accounts"].update(intel.get("bank_accounts", []))
all_intelligence["ifsc_codes"].update(intel.get("ifsc_codes", []))
all_intelligence["phone_numbers"].update(intel.get("phone_numbers", []))
all_intelligence["phishing_links"].update(intel.get("phishing_links", []))
# Small delay between turns
time.sleep(1)
except requests.exceptions.Timeout:
print(f"\n⚠️ Request timed out for turn {turn_num}")
except Exception as e:
print(f"\n❌ Error on turn {turn_num}: {e}")
# Print final summary
print("\n" + "=" * 80)
print("📋 CONVERSATION SUMMARY")
print("=" * 80)
print(f"Total Turns: {len(SCAMMER_MESSAGES)}")
print(f"Session ID: {session_id}")
# Convert sets to lists for printing
final_intel = {
"upi_ids": list(all_intelligence["upi_ids"]),
"bank_accounts": list(all_intelligence["bank_accounts"]),
"ifsc_codes": list(all_intelligence["ifsc_codes"]),
"phone_numbers": list(all_intelligence["phone_numbers"]),
"phishing_links": list(all_intelligence["phishing_links"]),
"extraction_confidence": 0.9 if any(all_intelligence.values()) else 0.0,
}
print_intelligence(final_intel)
# Retrieve full session
if session_id:
print("\n" + "=" * 80)
print("📜 RETRIEVING FULL CONVERSATION FROM SESSION")
print("=" * 80)
try:
session_response = requests.get(
f"{BASE_URL}/api/v1/honeypot/session/{session_id}",
timeout=10,
)
session_data = session_response.json()
print(f"\nSession Details:")
print(f" Language: {session_data.get('language')}")
print(f" Persona: {session_data.get('persona')}")
print(f" Turn Count: {session_data.get('turn_count')}")
print(f" Scam Confidence: {session_data.get('scam_confidence', 0):.0%}")
print(f"\nConversation History ({len(session_data.get('conversation_history', []))} messages):")
for msg in session_data.get("conversation_history", []):
sender = "🦹 SCAMMER" if msg["sender"] == "scammer" else "🤖 AGENT"
print(f" [{msg['turn']}] {sender}: {msg['message'][:80]}...")
except Exception as e:
print(f"❌ Could not retrieve session: {e}")
print("\n" + "=" * 80)
print("✅ TEST COMPLETE!")
print("=" * 80)
def run_hindi_conversation():
"""Run Hindi scam conversation test"""
print("\n" + "=" * 80)
print("🎭 HINDI SCAM CONVERSATION TEST")
print("=" * 80)
hindi_messages = [
"बधाई हो! आपने 10 लाख रुपये जीते हैं! इनाम पाने के लिए जवाब दें!",
"हाँ जी, आप विजेता हैं! बस 500 रुपये प्रोसेसिंग फीस भेजें और पैसे आपके खाते में आ जाएंगे!",
"मेरे UPI पर भेजें: scammer@paytm। फोन करें +919876543210",
]
session_id = None
for turn, message in enumerate(hindi_messages, 1):
print_message(turn, "SCAMMER", message, is_scammer=True)
payload = {"message": message, "language": "hi"}
if session_id:
payload["session_id"] = session_id
try:
response = requests.post(API_URL, json=payload, timeout=60)
data = response.json()
if not session_id:
session_id = data.get("session_id")
if data.get("engagement"):
print_message(turn, "AGENT", data["engagement"]["agent_response"], is_scammer=False)
if data.get("extracted_intelligence"):
intel = data["extracted_intelligence"]
if any([intel.get("upi_ids"), intel.get("phone_numbers")]):
print_intelligence(intel)
time.sleep(1)
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
# Run main English conversation test
run_conversation()
# Optionally run Hindi test
print("\n\nWould you like to run Hindi conversation test? (This is automatic)")
# run_hindi_conversation()