Agentic-Space / app /engine /tools.py
Rachit-Tw's picture
Upload 35 files
947995c verified
Raw
History Blame Contribute Delete
4.55 kB
import re
import os
from datetime import datetime
from fpdf import FPDF
from app.models.schemas import ExtractedIntel
from app.core.config import settings
import httpx
import logging
logger = logging.getLogger(__name__)
async def send_guvi_callback(session_id: str, scam_detected: bool, turn_count: int, intel: ExtractedIntel, agent_notes: str = None, duration: int = 0):
"""
Sends the mandatory final result callback to the GUVI evaluation endpoint.
Async version for integration into LangGraph.
"""
url = "https://hackathon.guvi.in/api/updateHoneyPotFinalResult"
payload = {
"sessionId": session_id,
"scamDetected": scam_detected,
"totalMessagesExchanged": turn_count,
"engagementDurationSeconds": duration if 'duration' in locals() else 0,
"extractedIntelligence": {
"phoneNumbers": intel.phone_numbers,
"bankAccounts": intel.bank_details,
"upiIds": intel.upi_ids,
"phishingLinks": intel.phishing_links,
"emailAddresses": intel.emails,
"caseIds": intel.case_ids,
"policyNumbers": intel.policy_numbers,
"orderNumbers": intel.order_numbers
},
"agentNotes": agent_notes or intel.agent_notes or "Scam engagement in progress."
}
headers = {
"Content-Type": "application/json",
"User-Agent": "Helware-Forensic-Platform/2.0"
}
try:
async with httpx.AsyncClient() as client:
response = await client.post(url, json=payload, headers=headers, timeout=10.0)
if response.status_code == 200:
logger.info(f" Mandatory GUVI callback successful for session {session_id}")
else:
logger.error(f" GUVI callback failed: {response.status_code} - {response.text}")
except Exception as e:
logger.error(f" Critical error during GUVI callback: {e}")
def generate_scam_report(session_id: str, intel: ExtractedIntel, persona_name: str) -> str:
"""
Generates a PDF report for the National Cyber Crime Reporting Portal.
Returns the path to the generated PDF.
"""
pdf = FPDF()
pdf.add_page()
# Title
pdf.set_font("Arial", "B", 16)
pdf.cell(0, 10, "Cyber Crime Incident Report", ln=True, align="C")
pdf.set_font("Arial", "I", 10)
pdf.cell(0, 10, f"Generated on: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", ln=True, align="C")
pdf.ln(10)
# Incident Details
pdf.set_font("Arial", "B", 12)
pdf.cell(0, 10, "1. Incident Overview", ln=True)
pdf.set_font("Arial", "", 10)
pdf.multi_cell(0, 10, f"Session ID: {session_id}\nAssigned Persona: {persona_name}\nStatus: Intelligence Gathered")
pdf.ln(5)
# Extracted Intelligence
pdf.set_font("Arial", "B", 12)
pdf.cell(0, 10, "2. Extracted Intelligence (Forensics)", ln=True)
pdf.set_font("Arial", "", 10)
if intel.upi_ids:
pdf.set_font("Arial", "B", 10)
pdf.cell(0, 8, "UPI IDs Identified:", ln=True)
pdf.set_font("Arial", "", 10)
for upi in intel.upi_ids:
pdf.cell(0, 8, f"- {upi}", ln=True)
if intel.bank_details:
pdf.set_font("Arial", "B", 10)
pdf.cell(0, 8, "Bank Account Details:", ln=True)
pdf.set_font("Arial", "", 10)
for bank in intel.bank_details:
pdf.cell(0, 8, f"- {bank}", ln=True)
if intel.phishing_links:
pdf.set_font("Arial", "B", 10)
pdf.cell(0, 8, "Suspicious/Phishing Links:", ln=True)
pdf.set_font("Arial", "", 10)
for link in intel.phishing_links:
pdf.cell(0, 8, f"- {link}", ln=True)
if not any([intel.upi_ids, intel.bank_details, intel.phishing_links]):
pdf.cell(0, 8, "No financial or malicious markers identified in this session yet.", ln=True)
pdf.ln(10)
# Footer/Legal Disclaimer
pdf.set_font("Arial", "I", 8)
pdf.multi_cell(0, 5, "This report is generated by the Agentic Honeypot System for submission to the National Cyber Crime Reporting Portal (cybercrime.gov.in). The data contained herein is for investigative purposes only.")
# Save PDF
reports_dir = settings.REPORTS_DIR
filename = f"report_{session_id}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf"
file_path = os.path.join(reports_dir, filename)
pdf.output(file_path)
return filename