File size: 2,953 Bytes
db2dab2
 
 
2ef074a
6376b16
db2dab2
 
 
 
 
 
 
 
 
 
2ef074a
 
6376b16
db2dab2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2ef074a
db2dab2
 
 
 
 
 
 
 
 
 
6376b16
db2dab2
 
 
 
 
 
c2e041e
db2dab2
 
 
 
6376b16
db2dab2
 
 
 
 
 
 
 
 
a727452
db2dab2
 
 
 
 
 
 
 
 
 
 
 
 
2effd16
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import logging
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

# ------------------------------
# Logging setup
# ------------------------------
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger(__name__)
logger.info("🚀 Starting Privacy Audit AI Backend...")

# ------------------------------
# Load model and tokenizer
# ------------------------------
tokenizer = AutoTokenizer.from_pretrained("google/flan-t5-small")
model = AutoModelForSeq2SeqLM.from_pretrained("google/flan-t5-small")

# ------------------------------
# FastAPI app
# ------------------------------
app = FastAPI(title="Privacy Audit AI", version="1.0.0")

# ------------------------------
# Request model
# ------------------------------
class AnalyzeInput(BaseModel):
    os_apps: list[str] = []
    browser_extensions: list[str] = []
    account_apps: list[str] = []

# ------------------------------
# Utility functions
# ------------------------------
def generate_plain_text(input_text: str):
    """Generate plain-language explanation using the model."""
    logger.info(f"Generating explanation for input: {input_text[:60]}...")
    inputs = tokenizer(f"Explain privacy risks in plain language:\n{input_text}", return_tensors="pt")
    outputs = model.generate(**inputs, max_new_tokens=150)
    explanation = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return explanation

def explain_risks(os_apps, browser_exts, account_apps):
    summary_text = (
        f"OS Apps: {', '.join(os_apps[:10])}, "
        f"Browser Extensions: {', '.join(browser_exts[:5])}, "
        f"Connected Apps: {', '.join(account_apps)}"
    )
    return generate_plain_text(summary_text)

# ------------------------------
# Endpoints
# ------------------------------
@app.get("/ping")
def ping():
    return {"status": "ok", "message": "Backend is alive!"}

@app.post("/analyze")
def analyze(data: AnalyzeInput):
    explanation = explain_risks(data.os_apps, data.browser_extensions, data.account_apps)
    return {"plain_language": explanation}

@app.get("/audit")
def audit_mvp():
    findings = "App X has camera access, App Y has location access, Chrome has 5 extensions"
    explanation = generate_plain_text(findings)
    return {
        "findings": findings,
        "plain_language": explanation,
        "risk_level": "Medium"
    }

@app.post("/audit")
def audit_mvp_post(data: AnalyzeInput):
    findings_text = (
        f"Detected {len(data.os_apps)} installed apps, "
        f"{len(data.browser_extensions)} browser extensions, and "
        f"{len(data.account_apps)} connected account apps."
    )
    explanation = generate_plain_text(findings_text)
    return {
        "findings": findings_text,
        "plain_language": explanation,
        "risk_level": "Medium"
    }


uvicorn app:app --host 0.0.0.0 --port 7860