Abhay Kushwaha
feat: content moderation system complete setup
ddd8598
Raw
History Blame Contribute Delete
7.11 kB
"""
Pydantic models for API request/response validation
"""
from pydantic import BaseModel, Field
from typing import Optional, List, Dict, Any
from datetime import datetime
# ============================================
# REQUEST MODELS
# ============================================
class SubmissionRequest(BaseModel):
"""Text moderation request"""
text: str = Field(..., min_length=1, max_length=5000, description="Text to moderate")
class Config:
json_schema_extra = {
"example": {
"text": "This is content to be moderated"
}
}
class BatchRequest(BaseModel):
"""Batch moderation request"""
submissions: List[str] = Field(..., min_items=1, max_items=100, description="List of texts to moderate")
class Config:
json_schema_extra = {
"example": {
"submissions": [
"Content 1",
"Content 2",
"Content 3"
]
}
}
class ManualReviewRequest(BaseModel):
"""Manual review request"""
submission_id: str = Field(..., description="Submission ID to review")
review_decision: str = Field(..., description="APPROVE, REJECT, or FLAG")
review_notes: Optional[str] = Field(None, description="Reviewer notes")
confidence_override: Optional[float] = Field(None, ge=0, le=1, description="Override confidence score")
class Config:
json_schema_extra = {
"example": {
"submission_id": "sub_123456",
"review_decision": "APPROVE",
"review_notes": "Content is safe",
"confidence_override": 0.95
}
}
# ============================================
# RESPONSE MODELS
# ============================================
class ClassifierScores(BaseModel):
"""Individual classifier scores"""
hate_speech: float = Field(0.0, ge=0, le=1, description="Hate speech score (0-1)")
violence: float = Field(0.0, ge=0, le=1, description="Violence score (0-1)")
adult_content: float = Field(0.0, ge=0, le=1, description="Adult content score (0-1)")
self_harm: float = Field(0.0, ge=0, le=1, description="Self-harm score (0-1)")
misinformation: float = Field(0.0, ge=0, le=1, description="Misinformation score (0-1)")
child_safety: float = Field(0.0, ge=0, le=1, description="Child safety risk score (0-1)")
class ModerationResponse(BaseModel):
"""Moderation response"""
submission_id: str = Field(..., description="Unique submission ID")
content_type: str = Field(..., description="Type of content (text/image/video)")
results: Dict[str, Any] = Field(..., description="Moderation results from all classifiers")
timestamp: datetime = Field(default_factory=datetime.now, description="Response timestamp")
class Config:
json_schema_extra = {
"example": {
"submission_id": "sub_123456",
"content_type": "text",
"results": {
"hate_speech": 0.15,
"violence": 0.08,
"adult_content": 0.12,
"self_harm": 0.05,
"misinformation": 0.20,
"child_safety": 0.03,
"risk_level": "LOW",
"overall_score": 0.20
},
"timestamp": "2026-05-18T00:15:00"
}
}
class BatchModerationResponse(BaseModel):
"""Batch moderation response"""
total_submissions: int = Field(..., description="Total submissions in batch")
processed: int = Field(..., description="Number successfully processed")
results: List[Dict[str, Any]] = Field(..., description="Results for each submission")
timestamp: str = Field(..., description="Response timestamp")
class Config:
json_schema_extra = {
"example": {
"total_submissions": 3,
"processed": 3,
"results": [
{
"submission_id": "sub_001",
"text": "Content 1",
"results": {
"hate_speech": 0.1,
"violence": 0.05,
"risk_level": "LOW"
}
}
],
"timestamp": "2026-05-18T00:15:00"
}
}
class StatisticsResponse(BaseModel):
"""Statistics response"""
total_submissions: int = Field(..., description="Total submissions processed")
average_scores: Dict[str, float] = Field(..., description="Average scores per classifier")
high_risk_count: int = Field(..., description="Number of high-risk submissions")
timestamp: str = Field(..., description="Response timestamp")
class Config:
json_schema_extra = {
"example": {
"total_submissions": 100,
"average_scores": {
"hate_speech": 0.15,
"violence": 0.12,
"adult_content": 0.18,
"self_harm": 0.05,
"misinformation": 0.22,
"child_safety": 0.08
},
"high_risk_count": 12,
"timestamp": "2026-05-18T00:15:00"
}
}
class HealthResponse(BaseModel):
"""Health check response"""
status: str = Field(..., description="Status message")
version: str = Field(..., description="API version")
timestamp: str = Field(..., description="Response timestamp")
class ErrorResponse(BaseModel):
"""Error response"""
error: str = Field(..., description="Error message")
detail: Optional[str] = Field(None, description="Error details")
timestamp: str = Field(..., description="Error timestamp")
class Config:
json_schema_extra = {
"example": {
"error": "Invalid request",
"detail": "Text cannot be empty",
"timestamp": "2026-05-18T00:15:00"
}
}
# ============================================
# UTILITY MODELS
# ============================================
class ContentItem(BaseModel):
"""Individual content item"""
submission_id: str
content_type: str
created_at: datetime
class Config:
from_attributes = True
class ModificationResult(BaseModel):
"""Moderation result detail"""
submission_id: str
violence_score: float
adult_content_score: float
hate_speech_score: float
self_harm_score: float
misinformation_score: float
child_safety_score: float
overall_risk_level: str
created_at: datetime
class Config:
from_attributes = True
class ReviewItem(BaseModel):
"""Manual review item"""
submission_id: str
reviewer_id: Optional[str]
review_decision: str
review_notes: Optional[str]
created_at: datetime
class Config:
from_attributes = True