Yassine Mhirsi
feat: Add analysis endpoints and service for processing arguments, extracting topics, and predicting stance
430b54f
| """Pydantic models for analysis endpoints""" | |
| from pydantic import BaseModel, Field, ConfigDict | |
| from typing import List, Optional | |
| class AnalysisRequest(BaseModel): | |
| """Request model for analysis with arguments""" | |
| model_config = ConfigDict( | |
| json_schema_extra={ | |
| "example": { | |
| "arguments": [ | |
| "Social media companies must NOT be allowed to track people across websites.", | |
| "I don't think universal basic income is a good idea — it'll disincentivize work.", | |
| "We must invest in renewable energy to combat climate change." | |
| ] | |
| } | |
| } | |
| ) | |
| arguments: List[str] = Field( | |
| ..., min_length=1, max_length=100, | |
| description="List of argument texts to analyze (max 100)" | |
| ) | |
| class AnalysisResult(BaseModel): | |
| """Model for a single analysis result""" | |
| model_config = ConfigDict( | |
| json_schema_extra={ | |
| "example": { | |
| "id": "123e4567-e89b-12d3-a456-426614174000", | |
| "user_id": "123e4567-e89b-12d3-a456-426614174000", | |
| "argument": "Social media companies must NOT be allowed to track people across websites.", | |
| "topic": "social media tracking and cross-website user privacy", | |
| "predicted_stance": "CON", | |
| "confidence": 0.9234, | |
| "probability_con": 0.9234, | |
| "probability_pro": 0.0766, | |
| "created_at": "2024-01-01T12:00:00Z", | |
| "updated_at": "2024-01-01T12:00:00Z" | |
| } | |
| } | |
| ) | |
| id: str = Field(..., description="Analysis result UUID") | |
| user_id: str = Field(..., description="User UUID") | |
| argument: str = Field(..., description="The argument text") | |
| topic: str = Field(..., description="Extracted topic") | |
| predicted_stance: str = Field(..., description="PRO or CON") | |
| confidence: float = Field(..., ge=0.0, le=1.0, description="Confidence score") | |
| probability_con: float = Field(..., ge=0.0, le=1.0, description="Probability of CON") | |
| probability_pro: float = Field(..., ge=0.0, le=1.0, description="Probability of PRO") | |
| created_at: str = Field(..., description="Creation timestamp") | |
| updated_at: str = Field(..., description="Last update timestamp") | |
| class AnalysisResponse(BaseModel): | |
| """Response model for analysis endpoint""" | |
| model_config = ConfigDict( | |
| json_schema_extra={ | |
| "example": { | |
| "results": [ | |
| { | |
| "id": "123e4567-e89b-12d3-a456-426614174000", | |
| "user_id": "123e4567-e89b-12d3-a456-426614174000", | |
| "argument": "Social media companies must NOT be allowed to track people across websites.", | |
| "topic": "social media tracking and cross-website user privacy", | |
| "predicted_stance": "CON", | |
| "confidence": 0.9234, | |
| "probability_con": 0.9234, | |
| "probability_pro": 0.0766, | |
| "created_at": "2024-01-01T12:00:00Z", | |
| "updated_at": "2024-01-01T12:00:00Z" | |
| } | |
| ], | |
| "total_processed": 1, | |
| "timestamp": "2024-01-01T12:00:00Z" | |
| } | |
| } | |
| ) | |
| results: List[AnalysisResult] = Field(..., description="List of analysis results") | |
| total_processed: int = Field(..., description="Number of arguments processed") | |
| timestamp: str = Field(..., description="Analysis timestamp") | |
| class GetAnalysisRequest(BaseModel): | |
| """Request model for getting user's analysis results""" | |
| limit: Optional[int] = Field(100, ge=1, le=1000, description="Maximum number of results") | |
| offset: Optional[int] = Field(0, ge=0, description="Number of results to skip") | |
| class GetAnalysisResponse(BaseModel): | |
| """Response model for getting analysis results""" | |
| results: List[AnalysisResult] = Field(..., description="List of analysis results") | |
| total: int = Field(..., description="Total number of results") | |
| limit: int = Field(..., description="Limit used") | |
| offset: int = Field(..., description="Offset used") | |