Spaces:
Runtime error
Runtime error
| """ | |
| AI API routes. | |
| Provides endpoints for AI-powered todo features. | |
| """ | |
| from typing import List | |
| from fastapi import APIRouter, HTTPException, status, Depends | |
| from pydantic import BaseModel | |
| from src.api.deps import get_current_user_id, get_db | |
| from src.services.ai_service import ai_service | |
| from sqlmodel import Session, select | |
| from src.models.todo import Todo | |
| from uuid import UUID | |
| class AIGenerateRequest(BaseModel): | |
| """Request schema for AI todo generation.""" | |
| goal: str | |
| class AIGenerateResponse(BaseModel): | |
| """Response schema for AI todo generation.""" | |
| todos: List[dict] | |
| message: str | |
| class AISummarizeResponse(BaseModel): | |
| """Response schema for AI todo summarization.""" | |
| summary: str | |
| breakdown: dict | |
| urgent_todos: List[str] | |
| class AIPrioritizeResponse(BaseModel): | |
| """Response schema for AI todo prioritization.""" | |
| prioritized_todos: List[dict] | |
| message: str | |
| router = APIRouter() | |
| async def generate_todos( | |
| request: AIGenerateRequest, | |
| current_user_id: str = Depends(get_current_user_id), | |
| ): | |
| """Generate todos from a goal using AI.""" | |
| try: | |
| result = ai_service.generate_todos(request.goal) | |
| return AIGenerateResponse(**result) | |
| except ValueError as e: | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=str(e), | |
| ) | |
| except Exception as e: | |
| raise HTTPException( | |
| status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, | |
| detail=f"AI service error: {str(e)}", | |
| ) | |
| async def summarize_todos( | |
| current_user_id: str = Depends(get_current_user_id), | |
| db: Session = Depends(get_db), | |
| ): | |
| """Summarize todos using AI.""" | |
| try: | |
| # Get user's todos | |
| query = select(Todo).where(Todo.user_id == UUID(current_user_id)) | |
| todos = db.exec(query).all() | |
| # Convert to dict format | |
| todos_dict = [ | |
| { | |
| "title": t.title, | |
| "description": t.description, | |
| "priority": t.priority.value, | |
| "due_date": t.due_date.isoformat() if t.due_date else None, | |
| } | |
| for t in todos | |
| ] | |
| result = ai_service.summarize_todos(todos_dict) | |
| return AISummarizeResponse(**result) | |
| except ValueError as e: | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=str(e), | |
| ) | |
| except Exception as e: | |
| raise HTTPException( | |
| status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, | |
| detail=f"AI service error: {str(e)}", | |
| ) | |
| async def prioritize_todos( | |
| current_user_id: str = Depends(get_current_user_id), | |
| db: Session = Depends(get_db), | |
| ): | |
| """Prioritize todos using AI.""" | |
| try: | |
| # Get user's todos | |
| query = select(Todo).where(Todo.user_id == UUID(current_user_id)) | |
| todos = db.exec(query).all() | |
| # Convert to dict format with IDs | |
| todos_dict = [ | |
| { | |
| "id": str(t.id), | |
| "title": t.title, | |
| "description": t.description, | |
| "priority": t.priority.value, | |
| "due_date": t.due_date.isoformat() if t.due_date else None, | |
| } | |
| for t in todos | |
| ] | |
| result = ai_service.prioritize_todos(todos_dict) | |
| return AIPrioritizeResponse(**result) | |
| except ValueError as e: | |
| raise HTTPException( | |
| status_code=status.HTTP_400_BAD_REQUEST, | |
| detail=str(e), | |
| ) | |
| except Exception as e: | |
| raise HTTPException( | |
| status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, | |
| detail=f"AI service error: {str(e)}", | |
| ) | |
| __all__ = ['router'] | |