96 lines
2.7 KiB
Python
96 lines
2.7 KiB
Python
"""Safety/Bias Checks Router"""
|
|
from fastapi import APIRouter, UploadFile, File
|
|
from pydantic import BaseModel
|
|
from typing import Optional
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
class BiasMetrics(BaseModel):
|
|
demographic_parity: float
|
|
equalized_odds: float
|
|
calibration_error: float
|
|
disparate_impact: float
|
|
|
|
|
|
class FairnessReport(BaseModel):
|
|
protected_attribute: str
|
|
groups: list[str]
|
|
metrics: BiasMetrics
|
|
is_fair: bool
|
|
violations: list[str]
|
|
recommendations: list[str]
|
|
|
|
|
|
class ComplianceChecklist(BaseModel):
|
|
regulation: str # GDPR, CCPA, AI Act, etc.
|
|
checks: list[dict]
|
|
passed: int
|
|
failed: int
|
|
overall_status: str
|
|
|
|
|
|
@router.post("/analyze", response_model=FairnessReport)
|
|
async def analyze_bias(
|
|
file: UploadFile = File(...),
|
|
target_column: str = None,
|
|
protected_attribute: str = None,
|
|
favorable_outcome: str = None
|
|
):
|
|
"""Analyze model predictions for bias"""
|
|
# TODO: Implement bias analysis with Fairlearn
|
|
return FairnessReport(
|
|
protected_attribute=protected_attribute or "unknown",
|
|
groups=[],
|
|
metrics=BiasMetrics(
|
|
demographic_parity=0.0,
|
|
equalized_odds=0.0,
|
|
calibration_error=0.0,
|
|
disparate_impact=0.0
|
|
),
|
|
is_fair=True,
|
|
violations=[],
|
|
recommendations=[]
|
|
)
|
|
|
|
|
|
@router.post("/compliance-check", response_model=ComplianceChecklist)
|
|
async def check_compliance(
|
|
regulation: str = "gdpr",
|
|
model_info: dict = None
|
|
):
|
|
"""Run compliance checklist for a regulation"""
|
|
# TODO: Implement compliance checking
|
|
return ComplianceChecklist(
|
|
regulation=regulation,
|
|
checks=[],
|
|
passed=0,
|
|
failed=0,
|
|
overall_status="unknown"
|
|
)
|
|
|
|
|
|
@router.get("/regulations")
|
|
async def list_regulations():
|
|
"""List supported regulations and frameworks"""
|
|
return {
|
|
"regulations": [
|
|
{"code": "gdpr", "name": "EU GDPR", "checks": 15},
|
|
{"code": "ccpa", "name": "California CCPA", "checks": 10},
|
|
{"code": "ai_act", "name": "EU AI Act", "checks": 20},
|
|
{"code": "nist", "name": "NIST AI RMF", "checks": 25},
|
|
]
|
|
}
|
|
|
|
|
|
@router.get("/metrics")
|
|
async def list_fairness_metrics():
|
|
"""List available fairness metrics with explanations"""
|
|
return {
|
|
"metrics": [
|
|
{"name": "demographic_parity", "description": "Equal positive prediction rates across groups"},
|
|
{"name": "equalized_odds", "description": "Equal TPR and FPR across groups"},
|
|
{"name": "calibration", "description": "Predicted probabilities match actual outcomes"},
|
|
{"name": "disparate_impact", "description": "Ratio of positive rates (80% rule)"},
|
|
]
|
|
}
|