ai-textbook-backend / api /personalization.py
Naveedtechlab's picture
Add full AI Native Textbook project source code
db7c1e8
from fastapi import APIRouter, HTTPException, Depends
from pydantic import BaseModel
from typing import Optional, Dict, Any
import os
import logging
from services.personalization_service import PersonalizationService
from services.content_adaptation import ContentAdaptationService
logger = logging.getLogger(__name__)
router = APIRouter()
class PersonalizationRequest(BaseModel):
content: str
user_profile: Dict[str, Any]
chapter_id: str
class PersonalizationResponse(BaseModel):
personalized_content: str
adaptation_details: Dict[str, Any]
@router.post("/personalization/adapt", response_model=PersonalizationResponse)
async def adapt_content(request: PersonalizationRequest):
"""Adapt content based on user profile and background"""
try:
# Initialize content adaptation service
content_adaptation_service = ContentAdaptationService(
gemini_api_key=os.getenv("GEMINI_API_KEY", "your-gemini-key-here")
)
# Initialize personalization service with content adaptation service
personalization_service = PersonalizationService(content_adaptation_service)
# Adapt the content based on user profile
adapted_content = personalization_service.get_personalized_content(
content=request.content,
user_profile=request.user_profile,
chapter_id=request.chapter_id
)
# Prepare adaptation details
adaptation_details = {
"status": "success",
"user_software_background": request.user_profile.get('software_background', 'General'),
"user_hardware_background": request.user_profile.get('hardware_background', 'General'),
"user_experience_level": request.user_profile.get('experience_level', 'Intermediate'),
"chapter_id": request.chapter_id,
"adaptation_method": "AI-driven personalization"
}
return PersonalizationResponse(
personalized_content=adapted_content,
adaptation_details=adaptation_details
)
except Exception as e:
logger.error(f"Error adapting content: {str(e)}")
# Return original content if personalization fails, but still provide a response
return PersonalizationResponse(
personalized_content=request.content,
adaptation_details={
"status": "fallback",
"message": "Content personalization is temporarily unavailable. Showing original content.",
"original_chapter_id": request.chapter_id
}
)
@router.get("/personalization/health")
async def personalization_health():
"""Health check for personalization service"""
return {"status": "personalization service is running"}