Spaces:
Runtime error
Runtime error
| 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 | |
| # ------------------------------ | |
| def ping(): | |
| return {"status": "ok", "message": "Backend is alive!"} | |
| def analyze(data: AnalyzeInput): | |
| explanation = explain_risks(data.os_apps, data.browser_extensions, data.account_apps) | |
| return {"plain_language": explanation} | |
| 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" | |
| } | |
| 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 | |